首页
社区
课程
招聘
[原创]文件系统过滤驱动流程与要点总结
2019-2-17 14:50 9130

[原创]文件系统过滤驱动流程与要点总结

2019-2-17 14:50
9130
前段时间一直自己闷着头学驱动,也时常做总结。本篇文章是最先发在我的博客上的,但无奈看的人比较少,无法讨论,也不知道自己的理解是否有错误。第一次发帖,如果有错误或者不严谨的地方请各位大佬帮忙指出或补充,谢谢~ (隔壁吾爱也发了一份)

开发环境: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的卷设备,而且我们的驱动程序也已经在正常运行中了。

另外,该图仅表现出新卷挂载的情况。对于已经挂载的卷设备,在文件系统变动回调的最后,遍历已挂载卷设备然后绑定。

四、注意要点

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文件系统控制设备上的过滤设备

这是过滤驱动运行时的输出(只简单输出了下请求长度的信息,由于现在关注的是驱动的处理流程,所以复杂的过滤处理就放在后面单独来讲)

关闭过滤驱动 

六、完整工程
https://github.com/JokerRound/FlieSystemFilter
(里面可能还有没有调试出来的Bug... 谨慎食用..)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-2-18 12:58 被菜就一个字编辑 ,原因:
收藏
点赞3
打赏
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  Editor   +1.00 2019/02/18 感谢分享~
最新回复 (7)
雪    币: 22979
活跃值: (3337)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
KevinsBobo 8 2019-2-17 22:35
2
0
感谢分享!
雪    币: 545
活跃值: (770)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
Justgoon 1 2019-2-18 09:08
3
0
感谢分享
雪    币: 19584
活跃值: (60093)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
Editor 2019-2-18 09:37
4
0
感谢分享~
雪    币: 351
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
五天 2019-2-18 10:29
5
0
雪    币: 73
活跃值: (893)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hixhi 2019-2-18 10:30
6
0
感谢分享
雪    币: 545
活跃值: (770)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
Justgoon 1 2019-2-25 13:39
7
0
感谢分享
雪    币: 0
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hpipl 2019-12-18 10:37
8
0
感谢分享
游客
登录 | 注册 方可回帖
返回