Unterstützen von Mount Manager-Anforderungen in einem Speicherklassentreiber
Der vom System bereitgestellte Mount-Manager ist für die Verwaltung von Volumenamen verantwortlich. Für jedes Volume speichert es einen Namen, der eindeutig und dauerhaft mit dem Volume identifiziert wird, auch nachdem das Volume aus dem System entfernt wurde. Außerdem werden weniger dauerhafte Namen verwaltet, z. B. Laufwerkbuchstaben, die über Neustarts hinweg beibehalten werden, deren Zuordnungen sich jedoch ändern können, wenn Volumes dem System hinzugefügt oder daraus entfernt werden.
Der Bereitstellungs-Manager stellt eine eindeutige Schnittstelle zu jedem Volume im System bereit, indem eine symbolische Verknüpfung mit dem Geräteobjekt des Volumes erstellt wird. Da die symbolischen Verknüpfungen selbst und die Geräteobjekte, auf die sie abzielen, beim Neustart des Systems nicht beibehalten werden, behält der Bereitstellungs-Manager den Namen der symbolischen Verknüpfung in einer permanenten Namensdatenbank in der Registrierung bei.
Dieser symbolische Verknüpfungsname wird als eindeutiger Volumename bezeichnet. Wie bei einer herkömmlichen Volumebezeichnung wird sie beim Neustart des Systems beibehalten. Wie ein Laufwerkbuchstaben und im Gegensatz zu einer Volumebezeichnung ist dieser Name eindeutig. Das Format für eindeutige Volumenamen folgt, wobei GUID ein global eindeutiger Bezeichner ist, der das Volume identifiziert.
"\?? \Volume{GUID}\
Die persistente Namensdatenbank des Mount-Managers befindet sich im Registrierungsschlüssel "MountedDevices " der SYSTEM-Struktur (HKLM/SYSTEM/MountedDevices) der Registrierung. Zusätzlich zu eindeutigen Volumenamen speichert der Bereitstellungs-Manager auch Bereitstellungspunktnamen in der permanenten Namensdatenbank. Mount Point-Namen können weiter in zwei Kategorien unterteilt werden: Win32-Stil-Pfadnamen, die als Stammverzeichnis des Dateisystems des bereitgestellten Volumes dienen, und Laufwerkbuchstaben.
Jeder name der dauerhaften symbolischen Verknüpfung in der Datenbank wird als Name eines Registrierungswerts unter dem MountedDevices-Schlüssel angezeigt, der von einer eindeutigen ID begleitet wird. Die eindeutige ID ist ein weiterer eindeutiger Bezeichner eines Volumes (anders als der eindeutige Volumename). Es hilft dabei zu ermitteln, welche der potenziell zahlreichen persistenten symbolischen Verknüpfungsnamen auf dasselbe Volume verweisen.
Beispiel: ein einzelnes Volume mit einem eindeutigen Volumenamen **"\\?\Volume{**7603f260-142a-11d4-ac67-806d6172696f }" \" enthält möglicherweise einen begleitenden Laufwerkbuchstaben "\DosDevices\D:" und zwei Bereitstellungspunkte "\DosDevices\C:\mymount" und "\DosDevices\E:\FilesysD\mnt". Diese Kombination würde vier Einträge in der permanenten symbolischen Verknüpfungsdatenbank des Mount Managers erzeugen: eine für den eindeutigen Volumenamen, einen für den Laufwerkbuchstaben und zwei für die beiden Bereitstellungspunktnamen. Alle vier Einträge würden dieselbe eindeutige ID gemeinsam nutzen. Daher könnte jemand, der den Registrierungsschlüssel "MountedDevices " anzeigt, erkennen, dass alle vier persistenten Namen auf dasselbe Volume verweisen.
Der folgende Screenshot veranschaulicht, wie beständige Namen im MountedDevices-Registrierungsschlüssel angezeigt werden.
Der Bereitstellungs-Manager basiert auf dem Plug & Play Geräteschnittstellen-Benachrichtigungsmechanismus, um ihn über Die Ankunft und Entfernung des Volumens zu benachrichtigen. Daher muss jeder Client (d. h. jeder Volumetreiber, in der Regel ein Klassentreiber) eine Schnittstelle in der MOUNTDEV_MOUNTED_DEVICE_GUID Schnittstellenklasse erstellen, indem IoRegisterDeviceInterface aufgerufen wird, um den Bereitstellungs-Manager über die Ankunft im System des verwalteten Volumes zu benachrichtigen. Die GUID der MOUNTDEV_MOUNTED_DEVICE_GUID Schnittstellenklasse wird in mountmgr.h definiert.
Wenn sie eine Plug & Play Benachrichtigung über die Ankunft einer Volumeschnittstelle erhalten, sendet der Bereitstellungs-Manager den Client drei Gerätesteuerungs-IRPs:
- IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
- IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
- IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME
Als Reaktion auf diese drei IOCTLs sollte der Client den nicht persistenten Geräteobjektnamen (oder Zielnamen) des Volumes im Geräteverzeichnis der Systemobjektstruktur (z. B. "\Device\HarddiskVolume1"), die eindeutige Volume-ID und einen vorgeschlagenen dauerhaften symbolischen Verknüpfungsnamen für das Volume zurückgeben. Obwohl Clients entscheiden können, IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME zu ignorieren, müssen sie beim EmpfangIOCTL_MOUNTDEV_QUERY_DEVICE_NAME oder IOCTL_MOUNTDEV_QUERY_UNIQUE_ID eine eindeutige Volume-ID bereitstellen. Der Bereitstellungs-Manager basiert vollständig auf dem Client, um die eindeutige Volume-ID bereitzustellen. Wenn der Client sie nicht bereitstellt, kann der Bereitstellungs-Manager dem Volume keine Bereitstellungspunkte zuweisen, z. B. Laufwerkbuchstaben.
Wenn ein Client den Bereitstellungs-Manager über die Ankunft des Volumes benachrichtigt, aber keine eindeutige ID für das Volume bereitstellt, wenn abgefragt wird, wird das Volume in eine Liste der nicht eingebundenen Geräte eingefügt. Wenn dies der Fall ist, können Clients eine IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES IOCTL an den Bereitstellungs-Manager senden, um anzufordern, dass der Bereitstellungs-Manager seine inaktiv eingebundene Geräteliste erneut überprüft und einen weiteren Versuch unternommen hat, die Clients in der Liste nach den eindeutigen IDs ihrer jeweiligen Volumes abzufragen.
Nachdem der Bereitstellungs-Manager eine eindeutige Volume-ID für ein neu eingeführtes Volume erhält:
- Sie durchsucht die Datenbank nach allen persistenten Namen, die dieser eindeutigen ID zugewiesen sind.
- Es erstellt symbolische Verknüpfungen mit dem Volume für jeden dauerhaften symbolischen Linknamen.
Wenn der Bereitstellungs-Manager erkennt, dass ein Volume nicht mehr an die Linie gegangen ist, löscht er die symbolischen Verknüpfungen, die auf das Geräteobjekt verweisen, ohne die entsprechenden symbolischen Verknüpfungsnamen in der Datenbank des Bereitstellungs-Managers zu löschen.
Informationen dazu, wie Mount-Manager-Clients dauerhafte symbolische Namen erstellen, finden Sie unter IOCTL_MOUNTMGR_CREATE_POINT.
E/A-Steuercodes, die von Mount Manager-Clients gesendet werden
Der Bereitstellungs-Manager veröffentlicht eine Schnittstelle, über die die Clients des Bereitstellungs-Managers dauerhafte Namen für Volumes festlegen, abfragen und löschen können. Um auf diese Schnittstelle zuzugreifen, können Clients einen Zeiger auf das Geräteobjekt des Bereitstellungs-Managers mithilfe des Objektnamens MOUNTMGR_DEVICE_NAME abrufen, der in Mountmgr.h definiert ist. Beispiel:
// 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);
Die Aufrufsequenz in diesem Pseudocodebeispiel wird aus Platzgründen vereinfacht. Ein vollständiges Pseudocodebeispiel finden Sie unter IOCTL_MOUNTMGR_CREATE_POINT.
Mount-Manager-Clients können alle dokumentierten IOCTL_MOUNTMGR_XXX-Steuercodes an den Bereitstellungs-Manager senden, z. B. IOCTL_MOUNTMGR_CREATE_POINT.
Vom Mount Manager gesendete E/A-Steuerungscodes
Der Bereitstellungs-Manager kann jeden der dokumentierten IOCTL_MOUNTDEV_XXX-Steuerelementcodes an seine Clients senden, z. B. IOCTL_MOUNTDEV_QUERY_DEVICE_NAME.