lzw06061139
驱动牛犊
驱动牛犊
  • 注册日期2011-09-26
  • 最后登录2014-02-19
  • 粉丝0
  • 关注2
  • 积分36分
  • 威望251点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2790回复:13

windows 卷级过滤驱动 不重启监控不到IO

楼主#
更多 发布于:2013-07-29 17:35
各位大虾好;
      请教大家一个问题,先谢谢了!
问题概述:
      在编写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
  
    对于上述差异百思不得其解,还望各位大虾不吝赐教,先谢谢各位了!
 
    
    
  
 
lzw06061139
驱动牛犊
驱动牛犊
  • 注册日期2011-09-26
  • 最后登录2014-02-19
  • 粉丝0
  • 关注2
  • 积分36分
  • 威望251点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2013-07-29 17:38
问题比较急,在线等! 还望各位给点思路和建议,谢谢了!
lzw06061139
驱动牛犊
驱动牛犊
  • 注册日期2011-09-26
  • 最后登录2014-02-19
  • 粉丝0
  • 关注2
  • 积分36分
  • 威望251点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2013-07-30 08:45
有相似开发经验的朋友吗? 请指点!谢谢!
ITSailor
驱动牛犊
驱动牛犊
  • 注册日期2010-12-08
  • 最后登录2014-05-05
  • 粉丝2
  • 关注0
  • 积分29分
  • 威望291点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分1分
地板#
发布于:2013-07-30 11:43
我没开发过卷过滤驱动。如果我没猜错,磁盘驱动上层的设备,不太规范了。第一种情况不过你的驱动正常。当打开一个文件的时候,IO管理器从路径里直接打开了卷设备,从卷设备的VPB里拿到文件驱动的设备,并把打开操作发给了文件系统驱动。文件系统驱动在加载的时候,就拿到并保存了下层卷的设备,如果你不在文件系统mount到卷之前把你的设备添加到卷的栈里,那么文件系统就不会拿到你的设备,故而文件系统驱动在操作的时候,不会发IO给你。
lzw06061139
驱动牛犊
驱动牛犊
  • 注册日期2011-09-26
  • 最后登录2014-02-19
  • 粉丝0
  • 关注2
  • 积分36分
  • 威望251点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2013-07-30 15:56
回 ITSailor 的帖子
ITSailor:我没开发过卷过滤驱动。如果我没猜错,磁盘驱动上层的设备,不太规范了。第一种情况不过你的驱动正常。当打开一个文件的时候,IO管理器从路径里直接打开了卷设备,从卷设备的VPB里拿到文件驱动的设备,并把打开操作发给了文件系统驱动。文件系统驱动在加载的时候,就拿到并保存了 .. (2013-07-30 11:43)

嗯,挺有道理,之前也怀疑过: 文件系统是在mount的时候建立与下层设备栈的联系的,并且在以后的整个生命周期内都不会再更新!

看来要实现卷过滤驱动不重启情况下I/O过滤,除非能有办法通知文件系统,下层卷设备栈已经更新,不知是否有未公开接口之类的!
ITSailor
驱动牛犊
驱动牛犊
  • 注册日期2010-12-08
  • 最后登录2014-05-05
  • 粉丝2
  • 关注0
  • 积分29分
  • 威望291点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分1分
5楼#
发布于:2013-07-30 16:43
回 lzw06061139 的帖子
lzw06061139:嗯,挺有道理,之前也怀疑过: 文件系统是在mount的时候建立与下层设备栈的联系的,并且在以后的整个生命周期内都不会再更新!

看来要实现卷过滤驱动不重启情况下I/O过滤,除非能有办法通知文件系统,下层卷设备栈已经更新,不知是否有未公开接口之类的! (2013-07-30 15:56)

你可以重新MOUNT。但这就要求文件系统能卸载,对于系统盘,显然不可行。卷设备指针式存放在文件系统的VCB里的,如果你想改,你就要改这个VCB里的东西,这个东西没公开,也没看出文件系统想更新它,所以我没发现有啥接口可以修改这个值,所以想改,可能不太不容易啊。

如果你非要不重启生效,那估计你只能HOOK 卷的Read Write了。
lzw06061139
驱动牛犊
驱动牛犊
  • 注册日期2011-09-26
  • 最后登录2014-02-19
  • 粉丝0
  • 关注2
  • 积分36分
  • 威望251点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2013-07-30 21:20
回 ITSailor 的帖子
ITSailor:你可以重新MOUNT。但这就要求文件系统能卸载,对于系统盘,显然不可行。卷设备指针式存放在文件系统的VCB里的,如果你想改,你就要改这个VCB里的东西,这个东西没公开,也没看出文件系统想更新它,所以我没发现有啥接口可以修改这个值,所以想改,可能不太不容易啊。

如果你非要 .. (2013-07-30 16:43)

分析有道理,你说的第一个方法,也有尝试,用windbg调试的时候,发现文件系统ntfs、fastfat和底层的卷设备指向同一个Vpb,vcb倒是还没有发现。明天看看。

第二种方案, hook read和write不是太明白, 读写不都是IRP_MJ—READ、WRITE么?这两个IRP都有挂接例程,收不到消息。
wanghui219
禁止发言
禁止发言
  • 注册日期2007-08-28
  • 最后登录2019-07-29
  • 粉丝4
  • 关注3
  • 积分101166分
  • 威望505351点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分4分
  • 社区居民
7楼#
发布于:2013-07-30 21:50
用户被禁言,该主题自动屏蔽!
ITSailor
驱动牛犊
驱动牛犊
  • 注册日期2010-12-08
  • 最后登录2014-05-05
  • 粉丝2
  • 关注0
  • 积分29分
  • 威望291点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分1分
8楼#
发布于:2013-07-30 21:58
回 lzw06061139 的帖子
lzw06061139:分析有道理,你说的第一个方法,也有尝试,用windbg调试的时候,发现文件系统ntfs、fastfat和底层的卷设备指向同一个Vpb,vcb倒是还没有发现。明天看看。

第二种方案, hook read和write不是太明白, 读写不都是IRP_MJ—READ、WRITE么?这两个IRP都有挂接例程,收不到消息。 (2013-07-30 21:20)

VCB是文件系统驱动内部的指针,当然看不到啦。

第二,你想想文件系统是怎么发给卷设备,Ntfs->IoCallDriver(VolumeDevice)->VolumeDevice->DriverObject->Majorfuncion[IRP_MJ_READ](DeviceObject, Irp),如果你把VolumeDevice对应的驱动对象DriverObject里的IRP_MJ_READ的例程改了,就可以接收到READ啦.
lzw06061139
驱动牛犊
驱动牛犊
  • 注册日期2011-09-26
  • 最后登录2014-02-19
  • 粉丝0
  • 关注2
  • 积分36分
  • 威望251点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2013-07-31 22:06
回 wanghui219 的帖子
wanghui219:hook 的确可以实现,在网上试下找机器狗代码 (2013-07-30 21:50)

google了下机器狗的代码,在功能实现上与我的要求不一样,不过hook的思想还是可以借鉴,是一个考虑得方向。
lzw06061139
驱动牛犊
驱动牛犊
  • 注册日期2011-09-26
  • 最后登录2014-02-19
  • 粉丝0
  • 关注2
  • 积分36分
  • 威望251点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2013-07-31 22:11
回 ITSailor 的帖子
ITSailor:VCB是文件系统驱动内部的指针,当然看不到啦。

第二,你想想文件系统是怎么发给卷设备,Ntfs->IoCallDriver(VolumeDevice)->VolumeDevice->DriverObject->Majorfuncion(DeviceObject, Irp),如果你把VolumeDevice对应的驱动对象DriverObject里的IRP_MJ_READ的例程改 .. (2013-07-30 21:58)

说得对,既然文件系统直接将irp下发给了volsnap,那hook  volsnap的IRP_MJ_WRITE就应该可以过滤写操作了,是一个可行的实践方法。

今天下午,尝试hook了volsnap的IRP_MJ_WRITE,好像是可行的,只是还有点问题(7f蓝屏)。
ITSailor
驱动牛犊
驱动牛犊
  • 注册日期2010-12-08
  • 最后登录2014-05-05
  • 粉丝2
  • 关注0
  • 积分29分
  • 威望291点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分1分
11楼#
发布于:2013-07-31 22:47
回 lzw06061139 的帖子
lzw06061139:说得对,既然文件系统直接将irp下发给了volsnap,那hook  volsnap的IRP_MJ_WRITE就应该可以过滤写操作了,是一个可行的实践方法。

今天下午,尝试hook了volsnap的IRP_MJ_WRITE,好像是可行的,只是还有点问题(7f蓝屏)。 (2013-07-31 22:11)

首先呢,肯定可行,虽然我没HOOK卷,可是我HOOK DISK驱动,从XP 到WIN8 从32位到64位,都是没有问题的。所以自己仔细调调,应该是自己代码不规范导致的。
lzw06061139
驱动牛犊
驱动牛犊
  • 注册日期2011-09-26
  • 最后登录2014-02-19
  • 粉丝0
  • 关注2
  • 积分36分
  • 威望251点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2013-08-01 14:33
问题已经解决了,办法是:hook volsnap的IRP_MJ_WRITE例程。

在此,非常感谢IT Sailor和wanghui219 的帮助和提点,谢谢!
azengkefu111
驱动牛犊
驱动牛犊
  • 注册日期2009-05-06
  • 最后登录2013-08-05
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2013-08-05 17:55
Re:windows 卷级过滤驱动 不重启监控不到IO
游客

返回顶部