美文网首页程序园程序员
C++文件系统过滤驱动流程与要点开发与实现(代码)

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

作者: Python编程导师 | 来源:发表于2019-04-29 15:07 被阅读4次

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

    image

    一、前言

    过滤驱动的原理大致都相同,关键就是如何绑到目标设备上。文件系统过滤驱动比起之前的串口过滤驱动有些复杂,复杂点主要就在设备绑定上。加入小编C/C++编程学习群:825414254获取听课权限与资料!

    image

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

    二、基本概念

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

    image

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

    四、注意要点

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

    image

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

    image

    六、完整工程

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/ynvynqtx.html