【C++】文件系统过滤驱动流程与要点
本帖最后由 菜就一个字 于 2019-2-17 14:24 编辑前段时间一直自己闷着头学驱动,也时常做总结。本篇文章是最先发在我的博客上的,但无奈看的人比较少,无法讨论,也不知道自己的理解是否有错误,所以就想发到吾爱上。第一次发帖,如果有格式不正确、错误或者不严谨的地方请各位大佬帮忙指出或补充,谢谢~
一、前言
过滤驱动的原理大致都相同,关键就是如何绑到目标设备上。文件系统过滤驱动比起之前的串口过滤驱动有些复杂,复杂点主要就在设备绑定上。
下面菜鸟就总结下整个流程和要点,方便大家理解,有错误的话欢迎大家指出~
二、基本概念
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的卷设备,而且我们的驱动程序也已经在正常运行中了。
另外,该图仅表现出新卷挂载的情况。对于已经挂载的卷设备,在文件系统变动回调的最后,遍历已挂载卷设备然后绑定
四、注意要点
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文件系统控制设备上的过滤设备。
这是过滤驱动运行时的输出(只简单输出了下请求长度的信息,由于现在关注的是驱动的处理流程,所以复杂的过滤处理就放在后面单独拿出来写)
关闭过滤驱动
六、完整工程
可能中间还有没有调试出来的bug,请小心食用.......
(不知道放链接算不算违规,如果违规的话我会马上删除的)GitHub:https://github.com/JokerRound/FlieSystemFilter 不违规,感谢分享源码{:1_893:} 感谢楼主,C++还是很历害的,下载下来好好学习一下。 9152pojie 发表于 2019-3-3 19:35
不违规,感谢分享源码
感谢大佬解惑与评分{:1_893:} superkn 发表于 2019-3-3 20:08
感谢楼主,C++还是很历害的,下载下来好好学习一下。
互相学习{:1_893:}
页:
[1]