支援記憶體類別驅動程式中的掛接管理員要求
系統提供的掛接管理員負責管理磁碟區名稱。 對於每個磁碟區,它都會儲存一個名稱,該名稱是唯一且永久識別的磁碟區,即使磁碟區已從系統移除也一般。 它也會管理較不永久的名稱,例如驅動器號,這些名稱會在重新啟動時保存,但指派可能會隨著磁碟區新增或從系統移除而變更。
裝載管理員藉由建立磁碟區裝置物件的符號連結,為系統中的每個磁碟區提供唯一的介面。 由於符號連結本身及其目標裝置對象在系統重新啟動時不會保存,所以掛接管理員會在登錄的永續性名稱資料庫中保留符號連結的名稱。
這個符號連結名稱稱為唯一的 磁碟區名稱。 如同傳統的磁碟區標籤,它會在系統重新啟動時保存。 與驅動器號和磁碟區標籤不同,此名稱是唯一的。 唯一磁碟區名稱的格式如下,其中 GUID 是識別磁碟區的全域唯一標識碼。
“\??\Volume{GUID}\
掛接管理員的永續性名稱資料庫位於登錄區 (HKLM/SYSTEM/MountedDevices) 的 MountedDevices 登錄機碼中。 除了唯一的磁碟區名稱,掛接管理員也會將其永續性名稱資料庫中儲存 裝入點 名稱。 裝入點名稱可以進一步細分為兩個類別:Win32 樣式的路徑名稱,做為掛接磁碟區文件系統的根目錄,以及驅動器號。
資料庫中的每一個持續性符號連結名稱都會以掛接式標識符隨附的 MountedDevices 機碼下的登錄值名稱出現。 唯一標識碼是磁碟區的另一個唯一標識元(不同於唯一的磁碟區名稱)。 它有助於識別哪些潛在的許多持續性符號連結名稱參考相同的磁碟區。
例如,單一磁碟區名稱為 **“\\?\Volume{**7603f260-142a-11d4-ac67-806d6172696f }的單一磁碟區\” 可能有隨附的驅動器號 “\DosDevices\D:” 和兩個裝入點 “\DosDevices\C:\mymount” 和 “\DosDevices\E:\FilesysD\mnt”。 這個組合會在掛接管理員的永續性符號連結名稱資料庫中產生四個專案:一個用於唯一磁碟區名稱,一個用於驅動器號,另一個用於兩個裝入點名稱。 這四個項目都會共用相同的唯一標識符。 因此, 檢視 MountedDevices 登錄機碼的人能夠偵測到這四個永續性名稱都指向相同的磁碟區。
下列螢幕快照說明 MountedDevices 登錄機碼中出現持續性名稱的方式。
掛接管理員依賴 隨插即用 裝置介面通知機制來警示其磁碟區抵達和移除。 因此,每個用戶端(也就是每個磁碟區驅動程式,通常是類別驅動程式)都必須呼叫 IoRegisterDeviceInterface ,在MOUNTDEV_MOUNTED_DEVICE_GUID介面類別中建立介面,以通知掛接管理員其管理的磁碟區抵達系統。 MOUNTDEV_MOUNTED_DEVICE_GUID介面類別 GUID 定義於 mountmgr.h 中。
收到磁碟區介面抵達的 隨插即用 通知后,掛接管理員會傳送用戶端三個裝置控制 IRP:
- IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
- IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
- IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME
為了回應這三個 IOCTLs,用戶端應該分別傳回位於系統物件樹狀目錄的磁碟區非持續性裝置物件名稱(或目標名稱),也就是:“\Device\HarddiskVolume1”、“唯一的磁碟區標識符,以及磁碟區的建議永續性符號連結名稱。 雖然用戶端可以選擇忽略IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME,但必須在接收IOCTL_MOUNTDEV_QUERY_DEVICE_NAME或IOCTL_MOUNTDEV_QUERY_UNIQUE_ID時提供唯一的磁碟區標識符。 裝載管理員完全依賴用戶端來提供唯一的磁碟區標識碼。 如果用戶端未提供,則掛接管理員無法將裝入點,例如驅動器號指派給磁碟區。
如果用戶端向掛接管理員警示其磁碟區的抵達,但在查詢時無法提供磁碟區的唯一 標識符,磁碟區會放在已掛接的 裝置清單上。 當這種情況發生時,用戶端可以將IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES IOCTL 傳送給掛接管理員,要求掛接管理員重新掃描其已掛接的裝置清單,並再次嘗試查詢清單上的用戶端,以取得其個別磁碟區的唯一標識符。
在掛接管理員收到新引進磁碟區的唯一磁碟區標識符之後:
- 它會搜尋其資料庫,尋找指派給該唯一標識碼的所有持續性名稱。
- 它會為每個永續性符號連結名稱建立磁碟區的符號連結。
當掛接管理員偵測到磁碟區已離線時,它會刪除指向裝置物件的符號連結,而不刪除掛接管理員資料庫中對應的符號連結名稱。
如需掛接管理員用戶端如何建立持續性符號名稱的資訊,請參閱 IOCTL_MOUNTMGR_CREATE_POINT。
掛接管理員客戶端傳送的 I/O 控制代碼
掛接管理員會發佈介面,允許掛接管理員的用戶端設定、查詢和刪除磁碟區的永續性名稱。 若要存取這個介面,用戶端可以使用Mountmgr.h中定義的物件名稱MOUNTMGR_DEVICE_NAME,取得掛接管理員裝置物件的指標。 例如:
// Obtain a pointer to the mount manager device object &
// use it to send any of the I/O Control codes in this
// section to the mount manager.
RtlInitUnicodeString(&name, MOUNTMGR_DEVICE_NAME);
status = IoGetDeviceObjectPointer(&name,
FILE_READ_ATTRIBUTES,
&fileObject, &deviceObject);
irp = IoBuildDeviceIoControlRequest(
IOCTL_MOUNTMGR_CREATE_POINT,
deviceObject, createPoint, createPointSize,
NULL, 0, FALSE, &event, &ioStatus);
status = IoCallDriver(deviceObject, irp);
為了簡潔起見,此虛擬程式碼範例中的呼叫順序會簡化。 如需更完整的虛擬程式碼範例,請參閱 IOCTL_MOUNTMGR_CREATE_POINT。
掛接管理員用戶端可以將任何記載 的 IOCTL_MOUNTMGR_XXX 控制程式代碼傳送至掛接管理員,例如IOCTL_MOUNTMGR_CREATE_POINT。
掛接管理員傳送的 I/O 控制代碼
掛接管理員可以將任何記載 的 IOCTL_MOUNTDEV_XXX 控制程式代碼傳送給用戶端,例如 IOCTL_MOUNTDEV_QUERY_DEVICE_NAME。