• 抬起头,继续前进吧,去把这个不完美的故事,变成你成所期望的样子
  • 登山路上我们会放弃很多东西,但这些被我们丢掉在我们登上山顶之际,都会一一回来
  • 不论开发还是逆向,数学水平的高低直接决定了”你的饭碗里有没有肉”
  • 万丈高楼平地起,勿在浮沙筑高台

Windows驱动开发-文件系统过滤驱动流程与要点

windows 菜鸟 3个月前 (02-15) 932次浏览 已收录 0个评论
[隐藏]

一、前言

        过滤驱动的原理大致都相同,关键就是如何绑到目标设备上。文件系统过滤驱动比起之前的串口过滤驱动有些复杂,复杂点主要就在设备绑定上。
        下面菜鸟就总结下整个流程和要点,方便大家理解,有错误的话欢迎大家指出~

开发环境:Visual studio 2017
运行环境:Win7 sp1
工具:DeviceTree 2.30

二、基本概念

1. 计算机上像 C:、D:这种逻辑盘都属于卷设备
2. 卷设备由卷管理器创建
3. 当一个卷设备使用了某中文件系统(例如 NTFS 或 FAT32),则由文件系统驱动为这个卷设备生成无名的设备对象
4. 存储媒介被扫描到后,卷管理器创会建卷设备,设备会请求挂载,然后文件系统创建卷设备对象。
5. 文件系统驱动还会生成控制设备,用来修改内部配置。
6. 通常一个文件系统只会有一个控制设备。
7. 只有第一个采用了某一个文件系统的卷加载到系统中时,文件系统的驱动程序才会被加载。

三、整体流程

1. 创建过滤驱动的文件系统控制设备作为和外界的通信接口(可能现在还用不到,暂时留出)。
2. 设置 IRP 分发函数与快速 IO 分发函数
3. 注册系统变动回调函数,在其中创建过滤控制设备对象绑定到激活的文件系统控制设备上
4. 处理IRP_MJ_FILE_SYSTEM_CONTROL的子 IRP,在有卷设备挂载完成时对其绑定。
  
        以文件系统 X 为例简单画了一张图方便大家理解,假设系统中还没有采用文件系统 X 的卷设备,而且我们的驱动程序也已经在正常运行中了。
Windows 驱动开发-文件系统过滤驱动流程与要点
另外,该图仅表现出新卷挂载的情况。对于已经挂载的卷设备,在文件系统变动回调的最后,遍历已挂载卷设备然后绑定。

四、注意要点

1. 过滤驱动要绑定的是由文件系统生成的卷设备对象,而不是由卷管理器创建的卷设备
2. IRP_MJ_FILE_SYSTEM_CONTROL是发送给控制设备,而读/写操作的 IRP 是发送给卷设备。
3. 过滤驱动要先绑定控制设备,然后再绑定卷设备
4. 过滤驱动的文件系统控制设备路径为路径为”\FileSystem\Filters\”,如果没有该路径则更改为”\FileSystem\”
5. 可以根据需要决定是否对文件系统识别器也进行绑定。(第一点是根据文件名过滤掉规范的文件系统识别器,第二点是在IRP_MN_LOAD_FILE_SYSTEM中处理)
6. 卷参数块(Vpb)在 IRP 完成后可能会发生改变,需要先保存起来。
7. 访问 Vpb 的参数时记得要先获取 Vpb 锁,访问结束后释放 Vpb 锁。
8. 对于已经附加过过滤设备的卷设备,不要二次附加。
9. 安装过滤驱动时,要悬着文件系统类型

五、过滤效果

        查看下我们的设备,紫色箭头指向是我们的文件过滤驱动,可以看到它下面的控制设备和过滤设备。红色箭头就是我们附加到 ntfs 卷设备上的过滤设备,蓝色箭头指向的是我们附加到 ntfs 文件系统控制设备上的过滤设备。
Windows 驱动开发-文件系统过滤驱动流程与要点
这是过滤驱动运行时的输出(只简单输出了下请求长度的信息,由于现在关注的是驱动的处理流程,所以复杂的过滤处理就放在后面单独来讲)
Windows 驱动开发-文件系统过滤驱动流程与要点
关闭过滤驱动
Windows 驱动开发-文件系统过滤驱动流程与要点

六、完整工程

GitHub: File System Filter

七、小结

        以上就是文件系统过滤的总结,有很多都是菜鸟亲身踩过的坑。过滤驱动都可以看作 HOOK 的一种方式,原理大同小异,只不过在实际操作实现时各有不同。
        那就这样啦,如果大家有问题的话,欢迎在评论区讨论,Happy Coding~^_^


学习心得 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Windows 驱动开发-文件系统过滤驱动流程与要点
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址