Mendukung permintaan Mount Manager di Driver Kelas Penyimpanan
Manajer pemasangan yang disediakan sistem bertanggung jawab untuk mengelola nama volume. Untuk setiap volume, volume menyimpan nama yang unik dan diidentifikasi secara permanen dengan volume, bahkan setelah volume dihapus dari sistem. Ini juga mengelola nama yang kurang permanen, seperti huruf drive, yang bertahan di seluruh boot ulang tetapi yang penugasannya dapat berubah saat volume ditambahkan ke atau dihapus dari sistem.
Manajer pemasangan menyediakan antarmuka unik untuk setiap volume dalam sistem dengan membuat tautan simbolis ke objek perangkat volume. Karena tautan simbolis itu sendiri dan objek perangkat yang mereka targetkan tidak bertahan ketika sistem dimulai ulang, manajer pemasangan mempertahankan nama tautan simbolis dalam database nama persisten di registri.
Nama tautan simbolis ini disebut nama volume unik. Seperti label volume tradisional, label tetap ada ketika sistem dimulai ulang. Seperti huruf drive dan tidak seperti label volume, nama ini unik. Format untuk nama volume unik mengikuti, di mana GUID adalah pengidentifikasi unik global yang mengidentifikasi volume.
"\?? \Volume{GUID}\
Database nama persisten manajer pemasangan terletak di kunci registri MountedDevices dari sarang SISTEM (HKLM/SYSTEM/MountedDevices) dari registri. Selain nama volume unik, manajer pemasangan juga menyimpan nama titik pemasangan dalam database nama persistennya. Nama titik pemasangan dapat dibagi lebih lanjut menjadi dua kategori: Nama jalur gaya Win32 yang berfungsi sebagai direktori akar sistem file volume yang dipasang, dan huruf drive.
Setiap nama tautan simbolis persisten dalam database muncul sebagai nama nilai registri di bawah kunci MountedDevices disertai dengan ID unik. ID unik adalah pengidentifikasi unik lain dari volume (berbeda dari nama volume unik). Ini membantu mengidentifikasi nama tautan simbolis yang berpotensi banyak persisten merujuk ke volume yang sama.
Misalnya, volume tunggal dengan nama volume unik **"\\?\Volume{**7603f260-142a-11d4-ac67-806d6172696f }\" mungkin memiliki huruf kandar yang menyertainya "\DosDevices\D:" dan dua titik pemasangan "\DosDevices\C:\mymount" dan "\DosDevices\E:\FilesysD\mnt". Kombinasi ini akan menghasilkan empat entri dalam database nama tautan simbolis persisten manajer pemasangan: satu untuk nama volume unik, satu untuk huruf drive, dan dua untuk dua nama titik pemasangan. Keempat entri akan berbagi ID unik yang sama. Dengan demikian seseorang yang melihat kunci registri MountedDevices akan dapat mendeteksi bahwa keempat nama persisten menunjuk ke volume yang sama.
Cuplikan layar berikut menggambarkan bagaimana nama persisten muncul di kunci registri MountedDevices .
Manajer pemasangan bergantung pada mekanisme pemberitahuan antarmuka perangkat Plug and Play untuk memperingatkannya tentang kedatangan dan penghapusan volume. Oleh karena itu setiap klien (yaitu, setiap driver volume, biasanya driver kelas) harus membuat antarmuka di kelas antarmuka MOUNTDEV_MOUNTED_DEVICE_GUID dengan memanggil IoRegisterDeviceInterface untuk memberi tahu manajer pemasangan tentang kedatangan dalam sistem volume yang dikelolanya. GUID kelas antarmuka MOUNTDEV_MOUNTED_DEVICE_GUID didefinisikan dalam mountmgr.h.
Setelah menerima pemberitahuan Plug and Play tentang kedatangan antarmuka volume, manajer pemasangan mengirim klien tiga IRP kontrol perangkat:
- IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
- IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
- IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME
Menanggapi ketiga IOCTL ini, klien harus mengembalikan nama objek perangkat non-persisten volume (atau nama target) yang terletak di direktori Perangkat dari pohon objek sistem (misalnya: "\Device\HarddiskVolume1"), ID volume unik, dan nama tautan simbolis persisten yang disarankan untuk volume, masing-masing. Meskipun klien dapat memilih untuk mengabaikan IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME, klien harus memberikan ID volume unik saat menerima IOCTL_MOUNTDEV_QUERY_DEVICE_NAME atau IOCTL_MOUNTDEV_QUERY_UNIQUE_ID. Manajer pemasangan sepenuhnya bergantung pada klien untuk memberikan ID volume unik. Jika klien tidak menyediakannya, maka manajer pemasangan tidak dapat menetapkan titik pemasangan, seperti huruf drive, ke volume.
Jika klien memperingatkan manajer pemasangan tentang kedatangan volumenya tetapi gagal memberikan ID unik untuk volume saat dikueri, volume ditempatkan pada daftar perangkat yang dipasang mati. Ketika situasi ini terjadi, klien dapat mengirim IOCTL IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES ke manajer pemasangan untuk meminta agar manajer pemasangan memulangkan kembali daftar perangkat yang dipasang mati dan melakukan upaya lain untuk mengkueri klien dalam daftar untuk ID unik dari volume masing-masing.
Setelah manajer pemasangan menerima ID volume unik untuk volume yang baru diperkenalkan:
- Ini mencari databasenya untuk semua nama persisten yang ditetapkan ke ID unik tersebut.
- Ini membuat tautan simbolis ke volume untuk setiap nama tautan simbolis persisten.
Ketika manajer pemasangan mendeteksi bahwa volume telah keluar dari baris, itu menghapus tautan simbolis yang menunjuk ke objek perangkat tanpa menghapus nama tautan simbolis yang sesuai dalam database manajer pemasangan.
Untuk informasi tentang cara klien mount manager membuat nama simbolis persisten, lihat IOCTL_MOUNTMGR_CREATE_POINT.
Kode Kontrol I/O yang dikirim oleh klien Mount Manager
Manajer pemasangan menerbitkan antarmuka yang memungkinkan klien manajer pemasangan mengatur, mengkueri, dan menghapus nama persisten untuk volume. Untuk mengakses antarmuka ini, klien dapat memperoleh penunjuk ke objek perangkat manajer pemasangan menggunakan nama objek MOUNTMGR_DEVICE_NAME, yang ditentukan dalam Mountmgr.h. Contohnya:
// 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);
Urutan panggilan dalam sampel pseudocode ini disederhanakan demi brevity. Untuk contoh pseudocode yang lebih lengkap, lihat IOCTL_MOUNTMGR_CREATE_POINT.
Klien mount manager dapat mengirim salah satu kode kontrol IOCTL_MOUNTMGR_XXXX yang didokumentasikan ke manajer pemasangan, sepertiIOCTL_MOUNTMGR_CREATE_POINT.
Kode Kontrol I/O yang dikirim oleh Mount Manager
Manajer pemasangan dapat mengirim salah satu kode kontrol IOCTL_MOUNTDEV_XXXX yang didokumentasikan ke kliennya, seperti IOCTL_MOUNTDEV_QUERY_DEVICE_NAME.