阅读:2974回复:13
windows 卷级过滤驱动 不重启监控不到IO
各位大虾好;
请教大家一个问题,先谢谢了! 问题概述: 在编写windows 卷级(挂载到Volume上)过滤驱动时,遇到:安装驱动后,不重启系统,虽然驱动挂到了Volume上,也无法监控到I/O的问题; 具体描述如下: 1. 在驱动的DriverEntry中,以设备名(格式:L"\\Device\\Harddisk%d\\Partition%d",)为参数,通过IoAttachDevice 附加驱动到系统中已存在的各个卷设备上,通过devicetree工具看到的结果是,驱动加在了volsnap之上,文件系统(ntfs/fastfat)下面; 附加驱动之后的设备栈(从上到下)是: fltmgr ->文件系统(ntfs/fastfat)-> kfence(我的驱动) -> volsnap -> ftdisk -> partmgr->disk 2. 通过hook 系统IRP_MJ_PNP消息和AddDevice接口,将驱动附加到新添加的卷设备。,通过devicetree工具看到的结果也是,驱动加在了volsnap之上,文件系统(ntfs/fastfat)下面.,设备栈也如上。 存在的问题是: 1. 在不重启的情况下, 通过1中方法附加的设备,无法监控到其I/O,irp流通路径: fltmgr ->文件系统(ntfs/fastfat)-> volsnap -> ftdisk -> partmgr->disk 就行我的驱动没有附加一样,但是,通过devicetree工具查看,kfence(我的驱动)确实是在设备栈上的。 2.在不重启的情况下,通过2中方法附加的设备,可以正常的监控到设备的I/O, 通过irptrace看到的irp流通路径是: fltmgr ->文件系统(ntfs/fastfat)-> kfence(我的驱动) -> volsnap -> ftdisk -> partmgr->disk 对于上述差异百思不得其解,还望各位大虾不吝赐教,先谢谢各位了! |
|
沙发#
发布于:2013-07-29 17:38
问题比较急,在线等! 还望各位给点思路和建议,谢谢了!
|
|
板凳#
发布于:2013-07-30 08:45
有相似开发经验的朋友吗? 请指点!谢谢!
|
|
地板#
发布于:2013-07-30 11:43
我没开发过卷过滤驱动。如果我没猜错,磁盘驱动上层的设备,不太规范了。第一种情况不过你的驱动正常。当打开一个文件的时候,IO管理器从路径里直接打开了卷设备,从卷设备的VPB里拿到文件驱动的设备,并把打开操作发给了文件系统驱动。文件系统驱动在加载的时候,就拿到并保存了下层卷的设备,如果你不在文件系统mount到卷之前把你的设备添加到卷的栈里,那么文件系统就不会拿到你的设备,故而文件系统驱动在操作的时候,不会发IO给你。
|
|
地下室#
发布于:2013-07-30 15:56
回 ITSailor 的帖子
ITSailor:我没开发过卷过滤驱动。如果我没猜错,磁盘驱动上层的设备,不太规范了。第一种情况不过你的驱动正常。当打开一个文件的时候,IO管理器从路径里直接打开了卷设备,从卷设备的VPB里拿到文件驱动的设备,并把打开操作发给了文件系统驱动。文件系统驱动在加载的时候,就拿到并保存了 .. (2013-07-30 11:43) 嗯,挺有道理,之前也怀疑过: 文件系统是在mount的时候建立与下层设备栈的联系的,并且在以后的整个生命周期内都不会再更新! 看来要实现卷过滤驱动不重启情况下I/O过滤,除非能有办法通知文件系统,下层卷设备栈已经更新,不知是否有未公开接口之类的! |
|
5楼#
发布于:2013-07-30 16:43
回 lzw06061139 的帖子
lzw06061139:嗯,挺有道理,之前也怀疑过: 文件系统是在mount的时候建立与下层设备栈的联系的,并且在以后的整个生命周期内都不会再更新! 你可以重新MOUNT。但这就要求文件系统能卸载,对于系统盘,显然不可行。卷设备指针式存放在文件系统的VCB里的,如果你想改,你就要改这个VCB里的东西,这个东西没公开,也没看出文件系统想更新它,所以我没发现有啥接口可以修改这个值,所以想改,可能不太不容易啊。 如果你非要不重启生效,那估计你只能HOOK 卷的Read Write了。 |
|
6楼#
发布于:2013-07-30 21:20
回 ITSailor 的帖子
ITSailor:你可以重新MOUNT。但这就要求文件系统能卸载,对于系统盘,显然不可行。卷设备指针式存放在文件系统的VCB里的,如果你想改,你就要改这个VCB里的东西,这个东西没公开,也没看出文件系统想更新它,所以我没发现有啥接口可以修改这个值,所以想改,可能不太不容易啊。 分析有道理,你说的第一个方法,也有尝试,用windbg调试的时候,发现文件系统ntfs、fastfat和底层的卷设备指向同一个Vpb,vcb倒是还没有发现。明天看看。 第二种方案, hook read和write不是太明白, 读写不都是IRP_MJ—READ、WRITE么?这两个IRP都有挂接例程,收不到消息。 |
|
禁止发言
|
7楼#
发布于:2013-07-30 21:50
用户被禁言,该主题自动屏蔽! |
8楼#
发布于:2013-07-30 21:58
回 lzw06061139 的帖子
lzw06061139:分析有道理,你说的第一个方法,也有尝试,用windbg调试的时候,发现文件系统ntfs、fastfat和底层的卷设备指向同一个Vpb,vcb倒是还没有发现。明天看看。 VCB是文件系统驱动内部的指针,当然看不到啦。 第二,你想想文件系统是怎么发给卷设备,Ntfs->IoCallDriver(VolumeDevice)->VolumeDevice->DriverObject->Majorfuncion[IRP_MJ_READ](DeviceObject, Irp),如果你把VolumeDevice对应的驱动对象DriverObject里的IRP_MJ_READ的例程改了,就可以接收到READ啦. |
|
9楼#
发布于:2013-07-31 22:06
回 wanghui219 的帖子
wanghui219:hook 的确可以实现,在网上试下找机器狗代码 (2013-07-30 21:50) google了下机器狗的代码,在功能实现上与我的要求不一样,不过hook的思想还是可以借鉴,是一个考虑得方向。 |
|
10楼#
发布于:2013-07-31 22:11
回 ITSailor 的帖子
ITSailor:VCB是文件系统驱动内部的指针,当然看不到啦。 说得对,既然文件系统直接将irp下发给了volsnap,那hook volsnap的IRP_MJ_WRITE就应该可以过滤写操作了,是一个可行的实践方法。 今天下午,尝试hook了volsnap的IRP_MJ_WRITE,好像是可行的,只是还有点问题(7f蓝屏)。 |
|
11楼#
发布于:2013-07-31 22:47
回 lzw06061139 的帖子
lzw06061139:说得对,既然文件系统直接将irp下发给了volsnap,那hook volsnap的IRP_MJ_WRITE就应该可以过滤写操作了,是一个可行的实践方法。 首先呢,肯定可行,虽然我没HOOK卷,可是我HOOK DISK驱动,从XP 到WIN8 从32位到64位,都是没有问题的。所以自己仔细调调,应该是自己代码不规范导致的。 |
|
12楼#
发布于:2013-08-01 14:33
问题已经解决了,办法是:hook volsnap的IRP_MJ_WRITE例程。
在此,非常感谢IT Sailor和wanghui219 的帮助和提点,谢谢! |
|
13楼#
发布于:2013-08-05 17:55
Re:windows 卷级过滤驱动 不重启监控不到IO
|
|