应用程序(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) |
|
磁盘子系统 (最底层了) |
------------------------------------------------------------------------------------------------------------------------------------------|
磁盘设备名:\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内核原理与实践》 卷相关章节,详细说明了层次关系和磁盘枚举