IOCTL_MOUNTMGR_CREATE_POINT IOCTL (mountmgr.h)
Die Bereitstellungs-Manager-Clients können diese IOCTL verwenden, um anzufordern, dass der Bereitstellungs-Manager einen dauerhaften symbolischen Linknamen für das angegebene Volume erstellt.
Hauptcode
Eingabepuffer
Der Bereitstellungspunkt-Manager platziert eine MOUNTMGR_CREATE_POINT_INPUT-Struktur am Anfang des Puffers unter Irp-AssociatedIrp.SystemBuffer>. Der Bereitstellungs-Manager fügt den neu zugewiesenen Namen für persistenten symbolischen Link an der Adresse ein, auf die das SymbolLinkNameOffset-Element dieser Struktur verweist, und fügt den nichtpersistenten Gerätenamen an der Adresse ein, auf die das DeviceNameOffset-Element dieser Struktur verweist.
Eingabepufferlänge
Parameters.DeviceIoControl.InputBufferLength in der E/A-Stapelposition des IRP gibt die Größe des Eingabepuffers in Bytes an, die größer oder gleich sizeof(MOUNTMGR_CREATE_POINT_INPUT)
sein muss.
Ausgabepuffer
Keine.
Länge des Ausgabepuffers
Keine.
Eingabe-/Ausgabepuffer
–
Länge des Eingabe-/Ausgabepuffers
–
Statusblock
Wenn der Vorgang erfolgreich ist, wird das Feld Status auf STATUS_SUCCESS festgelegt.
Wenn InputBufferLength kleiner als sizeof(MOUNTMGR_CREATE_POINT_INPUT)
ist, wird das Statusfeld auf STATUS_INVALID_PARAMETER festgelegt.
Hinweise
Die Eingabe für diese Anforderung ist der name des zu erstellenden persistenten symbolischen Links und ein Name, der bereits zum Identifizieren des Volumes gültig ist. Der zur Identifizierung des Volumes angegebene Name kann von einem beliebigen Typ sein: ein eindeutiger Volumename, ein symbolischer Linkname oder ein nichtpersistenter Gerätename. Wenn der neue persistente Name noch nicht verwendet wird, wird der Aufruf erfolgreich ausgeführt, und die Bereitstellungs-Manager-Datenbank wird so geändert, dass der neue persistente Name zum Volume gehört. Wenn die Bereitstellungs-Manager-Datenbank bereits den neuen persistenten Namen enthält, aber das Volume, das diesen Namen besitzt, nicht im System ist, überschreibt dieser Aufruf den Besitz des angegebenen persistenten Namens.
Der Bereitstellungs-Manager ermöglicht das Erstellen eines neuen namenhaften symbolischen Links, auch wenn er noch nicht über das angegebene Volume in der MOUNTDEV_MOUNTED_DEVICE_GUID Geräteschnittstellenbenachrichtigung benachrichtigt wurde. In einem solchen Fall erstellt der Bereitstellungs-Manager einfach den symbolischen Link und aktualisiert die Datenbank des Bereitstellungs-Managers.
Der Bereitstellungs-Manager erzwingt eine Richtlinie von höchstens einem permanenten Laufwerkbuchstaben pro Volume. Wenn eine IOCTL_MOUNTMGR_CREATE_POINT Anforderung mit einem Laufwerkbuchstaben gesendet wird, schlägt die Anforderung fehl, wenn dem Volume bereits ein Laufwerkbuchstabe zugewiesen ist, es sei denn, der Bereitstellungs-Manager wurde noch nicht über das Volume per MOUNTDEV_MOUNTED_DEVICE_GUID Geräteschnittstellenbenachrichtigung benachrichtigt. Im letzteren Fall ist der Aufruf erfolgreich, und der Bereitstellungs-Manager löscht die Bereitstellungs-Manager-Datenbank aller anderen Laufwerkbuchstaben, die zuvor dem Volume zugewiesen wurden.
Wenn IOCTL_MOUNTMGR_CREATE_POINT einen Laufwerkbuchstaben angibt, muss der Laufwerkbuchstabe Großbuchstaben sein.
Beachten Sie, dass ein Client ermitteln kann, ob der Bereitstellungs-Manager die MOUNTDEV_MOUNTED_DEVICE_GUID Geräteschnittstellenbenachrichtigung für sein Volume erhalten hat, indem er den Bereitstellungs-Manager mit IOCTL_MOUNTMGR_QUERY_POINTS abgefragt.
In diesem Pseudocodebeispiel verwendet ein Bereitstellungs-Manager-Client IOCTL_MOUNTMGR_CREATE_POINT, um dem Bereitstellungs-Manager einen Geräteobjektnamen und den entsprechenden symbolischen Link zu senden:
// The persistent symbolic link is a drive letter in
// this case:
wsprintf(dosBuffer, L"\\DosDevices\\%C:", DriveLetter);
RtlInitUnicodeString(&dosName, dosBuffer);
// The nonpersistent volume (device) object name is
// formed using the volume number as a suffix
wsprintf(ntBuffer, L"\\Device\\HarddiskVolume%D",
Extension->VolumeNumber);
RtlInitUnicodeString(&ntName, ntBuffer);
createPointSize = sizeof(MOUNTMGR_CREATE_POINT_INPUT) +
dosName.Length + ntName.Length;
// Allocate a header with length and offset information
createPoint = (PMOUNTMGR_CREATE_POINT_INPUT)
ExAllocatePool(PagedPool,
createPointSize);
createPoint->SymbolicLinkNameOffset =
sizeof(MOUNTMGR_CREATE_POINT_INPUT);
createPoint->SymbolicLinkNameLength = dosName.Length;
createPoint->DeviceNameOffset =
createPoint -> SymbolicLinkNameOffset +
createPoint -> SymbolicLinkNameLength;
createPoint->DeviceNameLength = ntName.Length;
RtlCopyMemory((PCHAR) createPoint +
createPoint -> SymbolicLinkNameOffset,
dosName.Buffer, dosName.Length);
RtlCopyMemory((PCHAR) createPoint +
createPoint->DeviceNameOffset,
ntName.Buffer, ntName.Length);
// Use the name of the mount manager device object
// defined in mountmgr.h (MOUNTMGR_DEVICE_NAME) to
// obtain a pointer to the mount manager.
RtlInitUnicodeString(&name, MOUNTMGR_DEVICE_NAME);
status = IoGetDeviceObjectPointer(&name,
FILE_READ_ATTRIBUTES,
&fileObject, &deviceObject);
KeInitializeEvent(&event, NotificationEvent, FALSE);
irp = IoBuildDeviceIoControlRequest(
IOCTL_MOUNTMGR_CREATE_POINT,
deviceObject, createPoint, createPointSize,
NULL, 0, FALSE, &event, &ioStatus);
// Send the irp to the mount manager requesting
// that a new mount point (persistent symbolic link)
// be created for the indicated volume.
status = IoCallDriver(deviceObject, irp);
Weitere Informationen finden Sie unter Unterstützung von Bereitstellungs-Manager-Anforderungen in einem Speicherklassentreiber.
Anforderungen
Anforderung | Wert |
---|---|
Header | mountmgr.h (einschließlich Mountmgr.h) |