Windows卷挂载流程
学习Windows文件系统过滤的前置知识。
两种卷设备
1. 存储卷设备(Storage Volume Device)
- 创建者:由存储驱动栈(如 Disk.sys、FtDisk.sys 等)创建,代表一个逻辑存储单元(分区)。
- 设备名示例:\\Device\\HarddiskVolume1。
- 作用:这是物理磁盘分区在系统内核中的直接表示,负责处理底层的块读写请求。
2. 文件系统卷设备(File System Volume Device Object, VDO)
- 创建者:文件系统驱动。
- 设备名:通常没有名字(匿名设备对象)。
- 作用:这是文件系统驱动为管理特定卷上的文件、目录等逻辑结构而创建的实例对象。它构成了文件系统设备栈的底部,所有发往该卷的文件I/O请求最终都会到达这里。
完整的卷挂载流程
对文件过滤驱动的意义
这正是为什么在文件过滤驱动中,需要监听卷挂载通知并为其创建过滤设备。附加的目标正是文件系统驱动为每个卷创建的VDO,而不是存储驱动创建的 \\Device\\HarddiskVolumeX。理解这两层设备的区别,是掌握Windows存储栈和文件过滤机制的关键。
IO请求如何从文件系统卷设备到存储卷设备
文件系统卷设备(VDO)接收到的文件I/O请求,最终是通过I/O请求包(IRP)在设备栈中层层向下传递,到达存储卷设备的。具体过程如下:
关键桥梁:卷参数块(VPB)
文件系统驱动在挂载卷时,会创建一个卷参数块(Volume Parameter Block, VPB)。这个数据结构将文件系统卷设备对象(VDO) 与底层的存储卷设备对象(如 \\Device\\HarddiskVolume1)关联起来。VPB是两者连接的纽带。
请求传递流程
- 创建新的IRP:构建一个全新的IRP(IRP_MJ_READ 或 IRP_MJ_WRITE),其参数包含计算出的起始LBA和扇区数量。
- 或重用/转发IRP:在某些情况下,也可能修改原始IRP的参数后转发。
- 调用 IoCallDriver 函数,将这个新的(或修改后的)IRP发送给存储卷设备对象。
设备栈的完整视图
从高层到低层,一个文件读请求的典型路径是:
用户态API → I/O管理器 → 文件系统过滤驱动栈 → 文件系统驱动(VDO) → 存储卷过滤驱动栈 → 存储卷设备 → 磁盘驱动 → 硬件




