上犹电脑信息网我们一直在努力
您的位置:上犹电脑信息网 > 文件问题 > C++文件系统过滤驱动流程与要点开发与实现(代码)-文件系统fat32

C++文件系统过滤驱动流程与要点开发与实现(代码)-文件系统fat32

作者:上犹日期:

返回目录:文件问题

前段时间一直自己闷着头学驱动,也时常做总结。本篇文章是最先发在我的博客上的,但无奈看的人比较少,无法讨论,也不知道自己的理解是否有错误,所以就想发到吾爱上。第一次发帖,如果有格式不正确、错误或者不严谨的地方请各位大佬帮忙指出或补充,谢谢~

C++文件系统过滤驱动流程与要点开发与实现(代码)

一、前言

过滤驱动的原理大致都相同,关键就是如何绑到目标设备上。文件系统过滤驱动比起之前的串口过滤驱动有些复杂,复杂点主要就在设备绑定上。私信小编:“01”获取听课权限与资料!

C++文件系统过滤驱动流程与要点开发与实现(代码)

下面菜鸟就总结下整个流程和要点,方便大家理解,有错误的话欢迎大家指出~

二、基本概念

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

C++文件系统过滤驱动流程与要点开发与实现(代码)

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

四、注意要点

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

C++文件系统过滤驱动流程与要点开发与实现(代码)

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

C++文件系统过滤驱动流程与要点开发与实现(代码)

六、完整工程

可能中间还有没有调试出来的bug,请小心食用.......

相关阅读

关键词不能为空
极力推荐

电脑蓝屏_电脑怎么了_win7问题_win10问题_设置问题_文件问题_上犹电脑信息网

关于我们