第十一章 麦洛克菲内核驱动开发第六课.ppt

第十一章 麦洛克菲内核驱动开发第六课.ppt

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
绑定 设备栈绑定的形式。驱动自己生成一个设备(过滤设备),调用系统提供的绑定API,绑定到目标设备上。并返回一个在未绑定之前目标设备所在设备栈的最顶层设备。这样发往下层的IRP或者发往上层的数据都会被过滤设备截获。 绑定API: IoAttachDevice() IoAttachDeviceToDeviceStackSafe(2000 SP4以及XP以上) IoAttachDeviceToDeviceStack() IoAttachDeviceToDeviceStack PDEVICE_OBJECT?? IoAttachDeviceToDeviceStack( ?IN?PDEVICE_OBJECT??SourceDevice, ?IN?PDEVICE_OBJECT??TargetDevice ????); AttachedDevice需要记录在DEVICE_EXTENSION中,以便调用IoCallDriver()继续下发IRP 文件系统过滤框架 Filemon Sfilter Minifilter Filespy Sfilter总体流程 创建控制设备 创建控制设备符号链接 过滤分发函数 Fastio 过滤与绑定 生成一个过滤设备 IoRegisterFsRegistrationChange( DriverObject, SfFsNotification ); (文件系统设备绑定) SfFsControl (卷设备绑定) 一个驱动,看见几个文件系统设备,看见几个卷设备,对应每一个设备就生成相应设备附载上去,然后进行相应处理。 IoRegisterFsRegistrationChange FileMon里的方法: 枚举26个盘符,打开文件,获得FileObject?DeviceObject. 然后通过自己驱动生成一个过滤设备,Attach过滤设备到DeviceObject上 无法监控类似U盘等动态加载上去的 IoRegisterFsRegistrationChange动态获得 fastio 文件系统除了处理正常的IRP之外,还要处理所谓的FastIo. FastIo是Cache Manager调用所引发的一种没有irp的请求。换句话说,除了正常的Dispatch Functions之外,你还得为DriverObject撰写另一组Fast Io Functions. 这组函数的指针在driver-FastIoDispatch Sfilter代码通读分析 DriverEntry sfCreate 再次深入理解IRP 过滤驱动与IRP处理方式 a.Pending完成例程 IoCopyCurrentIrpStackLocationToNext b.忽略直接下发 IoSkipCurrentIrpStackLocation,下层设备拿到的IO_STACKLOCATION 和当前的一样 c.结束IRP不下发 PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation (Irp); Irp-IoStatus.Status = STATUS_SUCCESS; Irp-IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); d.手动构建IRP IoAllocateIrp IoGetNextIrpStackLocation IRP注意事项 在驱动程序将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 标记为等候进一步处理。 Pending完成例程 KEVENT event; KeInitializeEvent(event, NotificationEvent, FALSE); IoCopyCurrentIrpStackLo

文档评论(0)

xiaofei2001128 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档