Storage Management

Windows storage managment 架構如下:

---------------------------------------------------------------------------------
Application
---------------------------------------------------------------------------------
I/O subsystem (I/O manager)
File system driver
Volume snapshot
Volume manager (Ftdisk.sys or Dmio.sys)
Partition manager (Partmgr.sys)
---------------------------------------------------------------------------------
Class driver (disk.sys)
Port driver (atapi.sys) | miniport driver (pciide.sys)
---------------------------------------------------------------------------------
Disk subsystem
---------------------------------------------------------------------------------

基本磁碟的 volume manager


\Windows\system32\Driver\Ftdisk.sys 負責在基本磁碟上建立 volume device object。它實際上應該算是一個 bus driver,因為它負責 enumerate 基本磁碟,偵測 volume 並通知 PnP manager。Ftdisk 透過 partition manager 來確認目前存在的基本磁碟分割區。由於 partition manager 有跟 PnP manager 註冊通知,因此當 partition 被更動時,它在收到通知後會通知 Ftdisk(在基本磁碟上,由於不支援 multipartition volume,因此一個 partition 等於一個 volume)。

在動態磁碟上,同等於 Ftdisk.sys 的角色是 Dmio.sys。

Mount Manager

Mount manager 負責指定 drive letter 給 volume。當 Ftdisk or Dmio 產生一個新 volume 時,mount manager 會收到通知(因為它跟 PnP manager 註冊)。這時 mount manager 會先找出新 volume 的 GUID or disk signature,然後跟自己內部的 database 做比較,看有沒有符合的資料(這個 database 就是 \HKLM\SYSTEM\MountedDevices 內的資料)。假如沒有符合,它會跟 Ftdisk or Dmio(看是誰建立 volume 的)要一個建議的 drive letter 然後更新回內部的 database。假如都沒有建議值,那它會選一個未被 assign 的 drive letter,並在 \HKLM\SYSTEM\MountedDevices 內建立一個 symbolic link(例如:\Global??\D:)。如果沒有適合的 drive letter(比如 A-Z 都用光了),它會以 GUID 來建立 symbolic link,意即 \Global??\Volume{GUID}。

Volume Mounting

Volume parameter block (VPB) 為 volume device object 與 mounted file system device object 中間的連結。當 I/O manager 需要知道一個 volume 是何種 file system driver 時,就會來找 VPB 裡頭的資料。如果有 file open request 到某一個 volume,但該 volume 未被 mount 時(VPB 中沒有指到一個 file system device object),I/O manager 就會向每一個有跟它註冊的 file system driver 一個一個下 mount request。如果有相對應的 file system driver,則 I/O manager 會在 VPB 中填資料,並且以後對這個 volume 的 request 都會 forward 至這個 file system driver。

File system driver 是怎麼知道該 volume 它可以處理呢?基本上就是 parse 存在第一個磁區的 boot record,裡頭有 file format 的 type 與 name。

如果 I/O manager 找不到 file system driver 對應到 volume 的話,此時在 Ntoskrnl.exe 中的 raw file system driver 就會 claim 能夠處理,此時所有 file request 都會失敗。

我們可以利用 windbg 來看 VPB 的內容。
Symbol path:srv*c:\windows\symbols*http://msdl.microsoft.com/download/symbols

假設我的硬碟使用基本磁碟,可以知道 ftdisk.sys 這隻 driver 是 volume manager。透過下 !drvobj ftdisk 來取得 ftdisk.sys 的 driver object 內容。

lkd> !drvobj ftdisk
Driver object (89b57f38) is for:
 \Driver\Ftdisk
Driver Extension List: (id , addr)

Device Object list:
89b4a9e0  89b6ce30  89b54a78 

這兒列出三個 device object。其中第一個被產生的是 ftdisk.sys 的 programming interface,其餘二個是 volume1 跟 volume2。由於是 list,因此列在後面的是最後產生的。

我們來看看第二個 volume device object 的內容。

lkd> !devobj 89b4a9e0
Device object (89b4a9e0) is for:
 HarddiskVolume2 \Driver\Ftdisk DriverObject 89b57f38
Current Irp 00000000 RefCount 655 Type 00000007 Flags 00001050
Vpb 89b2dae8 Dacl e14979c0 DevExt 89b4aa98 DevObjExt 89b4ab80 Dope 89ace250 DevNode 89b4eb20
ExtensionFlags (0000000000) 
AttachedDevice (Upper) 89b49d80 \Driver\VolSnap
Device queue is not busy.

這邊可以看到 volume device object 指出 VPB 的位置。再來看看 VPB 的內容。

lkd> !vpb 89b2dae8
Vpb at 0x89b2dae8
Flags: 0x1 mounted
DeviceObject: 0x897fa110
RealDevice:   0x89b4a9e0
RefCount: 655
Volume Label:     Data

其中 DeviceObject 為 file system reference。RealDevice 指回 volume device object。再來看看這個 volume 的 file system reference 指向哪個 driver。

lkd> !devobj 897fa110
Device object (897fa110) is for:
  \FileSystem\Ntfs DriverObject 89bc1a18
Current Irp 00000000 RefCount 0 Type 00000008 Flags 00000000
DevExt 897fa1c8 DevObjExt 897fa970
ExtensionFlags (0000000000) 
AttachedDevice (Upper) 897d3020 \FileSystem\sr
Device queue is not busy.

上面可以看出它指向 NTFS file system driver。Driver object 位置為 89bc1a18。

留言

  1. 這篇不錯,蠻受用的,
    不過有程式能直接設定Mount某裝置至固定的磁碟代號碼?

    回覆刪除

張貼留言

熱門文章