阅读:2278回复:0
简要介绍文件系统存储栈的建立
直接从disk开始, 前面的总线枚举绕过. disk首先创建功能设备, 类似于\Device\HarddiskX\DRX, 然后获取分区信息, 建立物理设备类似于\Device\HarddiskX\DP(Y), 后面接磁盘起始结束位置, 代表各个分区设备; \Device\HarddiskX\DP(Y) 不属于\Device\HarddiskX\DRX设备栈, 但具有相同的Irp栈, 建立时保存\Device\HarddiskX\DRX的最上层设备, 发送Irp时直接调用该设备向下传递, 所以\Device\HarddiskX\DRX栈上的上层过滤驱动无法动态安装.
partmgr是disk的上层过滤驱动, 挂在功能设备\Device\HarddiskX\DRX上面; partmgr收到分区信息后会通知ftdisk, 如果磁盘具有多个分区信息, ftdisk创建类似于\Device\HarddiskVolumeX的设备; ftdisk会注册特定设备接口有mountmgr回调, 创建设备的符号连接, 比如c/d; \Device\HarddiskVolumeX不属于任何设备栈, 其Irp传递方式同\Device\HarddiskX\DP(Y) , 建立时保存磁盘功能设备的最上层过滤驱动, 发送Irp时直接调用该设备向下传递, 所以\Device\HarddiskX\DRX栈上的上层过滤驱动无法动态安装. xp上面\Device\HarddiskVolumeX有上层过滤驱动\Device\VolSnap. IO管理器在创建设备时, 如果类型是FILE_DEVICE_DISK/FILE_DEVICE_VIRTUAL_DISK等存储设备会建立VPB结构, 用于存储设备和文件系统关联; VPB->RealDevice指向存储设备, VPB->DeviceObject指向文件系统建立的设备. 当打开文件C:\123.txt时, 首先通过符号链接找到设备名称为\Device\HarddiskVolumeX或\Device\HarddiskX\DP(Y), (当磁盘只有单个分区时比如优盘, 则不会创建\Device\HarddiskVolumeX, 直接使用磁盘驱动建立的物理设备)并调用IopCheckVpbMounted分析设备是否mount, 如果没有mount调用IopMountVolume开始mount, IopMountVolume遍历所有文件系统进行mount, 直到成功或失败. mount成功建立的文件系统设备保存在VPB->DeviceObject中, 该文件设备不属于卷设备栈, 但具有相同的Irp栈, 建立时保存卷设备最上层过滤驱动到文件系统设备Vcb中, 发送Irp时直接调用该设备向下传递, 所以卷设备栈的上层过滤驱动无法动态安装, 文件系统直接使用其保存下来的最上层设备. 综上可知有3个设备栈, 包括文件系统设备栈, 到文件系统设备位置; 卷设备栈, 到卷设备位置, 可能是ftdisk创建的卷设备, 或者disk创建的分区设备; 存储设备栈. 这里除了文件系统可以动态安装过滤驱动, 其他由于各个设备栈之间以静态保存的设备来传递Irp, 所以无法动态安装上层过滤驱动. |
|