应用程序(CreateFile,ReadFile)

I/O子系统(向FS发送I/O请求)

文件系统设备栈

  • 文件过滤 驱动管理器 FltMgr.sys
  • 文件系统(在原始卷上强加上文件结构)NTFS

卷管理设备栈

  • 卷快照 (管理软件快照) vbp volsnap.sys
  • 卷管理器 (FtDisk.sys 总线型驱动程序,负责列举基本的磁盘,以便检测基本卷的存在情况,并且将他们报告给PnP管理器,当它确定了分区和卷的对应关系并且该卷的所有分区都存在时,就会创建一个卷设备对象)向用户提供卷的语义(c: d:),支持基本的和动态的磁盘(RAID) 在win7下是volmgr.sys

磁盘管理设备栈

  • 分区管理器(PartMgr.sys)管理磁盘分区,帮FtDisk.sys确定磁盘的基本分区
  • 类 (类驱动,比如磁盘过滤驱动,管理着一种特定的设备类型,比如磁盘、磁带)(disk.sys)
  • 端口|小端口 (端口:管理一种特定的传输设备SCSI,RAID。小端口:实现具体细节,如硬件I/O)例如ScsiPort.sys和Atapi.sys ,这两个为端口驱动。 而这些端口驱动只实现了对硬件设备操作的公用代码并对硬件设备的差异提供公用接口,也就是小端口驱动来填充这个接口
  • 总线过滤驱动程序 acpi.sys
  • 磁盘总线驱动程序 bus
  • 磁盘子系统 (最底层了)

一个场景的阐述

磁盘设备名:\Device\HarddiskX\DRX (X为数字) 符号连接:\.\ PhysicalDriveX (X为数字)
卷设备名:\Device\HarddiskVolumeX (X为数字) 符号连接:\.\HarddiskVolumeX (X为数字)或 \.\D:

每一个卷设备对应一个磁盘分区,但并不是说\Device\HarddiskVolume1就是代表C盘,\Device\HarddiskVolume2就代表D盘。没有这种对应关系。卷的编号都是从1开始的

一个应用程序打开类似D:\Temp\Test.txt这样的文件,windows子系统在调用内核文件打开例程NtCreateFile之前,会将名字转换为\Global??\D:\Temp\Test.txt这样的。NtCreateFile会调用对象管理器来解析该名称,对象管理器解析\Global??\D:为\Device\HarddiskVolume2,此时\Temp\Test.txt并未被解析,这时,I/O管理器会检查这个磁盘卷设备的vpb信息,查看其是否引用了一个文件系统,如果没有,管理器就会提示挂载,挂在完后会填充vbp结构,该卷第一个扇区中记录了文件系统的格式。如果有,管理器会将\Temp\Test.txt交给文件系统进行定位,完成相关请求。

卷的识别过程是由“一个文件系统声称对于某个分区具有所有权”构成的。首先系统会产生一个CTL_VOLUME_ONLINE的irp使卷处于上线状态,如果此时卷没挂载,当系统或者应用程序第一次打开一个卷的时候(只有online后,才能对卷进行读写操作,boot和系统卷除外,见msdn),windows 挂载管理器执行一个mount操作,然后当用户第一次访问卷上的文件的时候,执行卷识别,在这个过程中,文件系统也挂载上了。

疑点:在卷online的时候,文件系统还没有挂载上,所以在boot回调中进行文件系统级别的操作,经过测试,boot回调在online前面,纠结了

更多请参见《windows内核原理与实践》 卷相关章节,详细说明了层次关系和磁盘枚举

0
赞赏

微信赞赏支付宝赞赏