电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

麦洛克菲内核驱动开发第六课VIP免费

麦洛克菲内核驱动开发第六课_第1页
1/36
麦洛克菲内核驱动开发第六课_第2页
2/36
麦洛克菲内核驱动开发第六课_第3页
3/36
麦洛克菲内核开发第五课Sfilter文件系统过滤麦洛克菲www.mallocfree.com周扬荣提纲文件系统驱动绑定与过滤Sfilter基本框架文件拦截创建删除修改重命名作业麦洛克菲www.mallocfree.com过滤CancelUserBufferMdlAddressSystemBufferIOSTATUSIRPHeadern…0头部堆栈IO_STATUS_BLOCKStatusInformationIO_STACK_LOCATIONMajorFunctionMinorFunctionunion{struct{…}Read;struct{…}Write;struct{…}DeviceControl;}Parameters;DeviceObjectFileObject文件过滤驱动设备文件卷设备磁盘设备IRP驱动设备IRP过滤:分层驱动中再加一层而不影响它的上下层,以过滤它们之间的数据,对数据或行为进行安全控制。过滤是通过设备绑定实现的。绑定设备栈绑定的形式。驱动自己生成一个设备(过滤设备),调用系统提供的绑定API,绑定到目标设备上。并返回一个在未绑定之前目标设备所在设备栈的最顶层设备。这样发往下层的IRP或者发往上层的数据都会被过滤设备截获。绑定API:IoAttachDevice()IoAttachDeviceToDeviceStackSafe(2000SP4以及XP以上)IoAttachDeviceToDeviceStack()SourceDeviceFilter2DeviceFilter1DeviceTargetDeviceSourceDeviceTargetDeviceAttachedDeviceAttachedDeviceIRPIoAttachDeviceToDeviceStackPDEVICE_OBJECTIoAttachDeviceToDeviceStack(INPDEVICE_OBJECTSourceDevice,INPDEVICE_OBJECTTargetDevice);AttachedDevice需要记录在DEVICE_EXTENSION中,以便调用IoCallDriver()继续下发IRPSourceDeviceFilter2DeviceFilter1DeviceTargetDeviceSourceDeviceTargetDeviceAttachedDeviceAttachedDeviceIRP文件系统过滤框架FilemonSfilterMinifilterFilespySfilter总体流程创建控制设备创建控制设备符号链接过滤分发函数Fastio过滤与绑定生成一个过滤设备IoRegisterFsRegistrationChange(DriverObject,SfFsNotification);(文件系统设备绑定)SfFsControl(卷设备绑定)一个驱动,看见几个文件系统设备,看见几个卷设备,对应每一个设备就生成相应设备附载上去,然后进行相应处理。IoRegisterFsRegistrationChangeFileMon里的方法:枚举26个盘符,打开文件,获得FileObjectDeviceObject.然后通过自己驱动生成一个过滤设备,Attach过滤设备到DeviceObject上无法监控类似U盘等动态加载上去的IoRegisterFsRegistrationChange动态获得fastio文件系统除了处理正常的IRP之外,还要处理所谓的FastIo.FastIo是CacheManager调用所引发的一种没有irp的请求。换句话说,除了正常的DispatchFunctions之外,你还得为DriverObject撰写另一组FastIoFunctions.这组函数的指针在driver->FastIoDispatchSfilter代码通读分析DriverEntrysfCreate再次深入理解IRP过滤驱动与IRP处理方式a.Pending完成例程IoCopyCurrentIrpStackLocationToNextb.忽略直接下发IoSkipCurrentIrpStackLocation,下层设备拿到的IO_STACKLOCATION和当前的一样c.结束IRP不下发PIO_STACK_LOCATIONirpStack=IoGetCurrentIrpStackLocation(Irp);Irp->IoStatus.Status=STATUS_SUCCESS;Irp->IoStatus.Information=0;IoCompleteRequest(Irp,IO_NO_INCREMENT);d.手动构建IRPIoAllocateIrpIoGetNextIrpStackLocationIRP注意事项在驱动程序将IRP传递个下一个驱动之后,就不再拥有这个IRP,并且不能试图再去访问它。否则会导致系统崩溃。那个IRP会被其它的驱动或者线程释放或完成。如果驱动需要访问一个已经在栈里传下去的IRP,这个驱动必须实现并设置IoCompletion例程。当I/O管理器调用IoCompletion例程时,这个驱动就能够在IoCompletion例程执行期间重新获得对这一IRP的所有权。如此,IoCompletion例程就能够访问IRP中的域。若是驱动的分发例程也还须在IRP被后面的驱动处理完成之后再处理它,这个IoCompletion例程必须返STATUS_MORE_PROCESSING_REQUIRED,以将IRP的所有权返回给分发例程。如此一来,I/O管理器会停止IRP的处理,将最终完成IRP的任务留给分发例程。分发例程能够在之后调用ICompleteRequest来完成这个IRP,或者还能将这个IRP...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

麦洛克菲内核驱动开发第六课

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部