Freigeben über


IOCTL_MOUNTMGR_CREATE_POINT IOCTL (mountmgr.h)

Die Mount-Manager-Clients können diese IOCTL verwenden, um anzufordern, dass der Bereitstellungs-Manager einen dauerhaften symbolischen Linknamen für das angegebene Volume erstellt.

Hauptcode

IRP_MJ_DEVICE_CONTROL

Eingabepuffer

Der Bereitstellungspunkt-Manager platziert eine MOUNTMGR_CREATE_POINT_INPUT Struktur am Anfang des Puffers an Irp->AssociatedIrp.SystemBuffer. Der Bereitstellungs-Manager fügt den neu zugewiesenen dauerhaften symbolischen Verknüpfungsnamen an der Adresse ein, auf die vom SymbolicLinkNameOffset Member dieser Struktur verwiesen wird, und fügt den nichtpersistenten Gerätenamen an der Adresse ein, auf die vom DeviceNameOffset Member dieser Struktur verwiesen wird.

Eingabepufferlänge

Parameters.DeviceIoControl.InputBufferLength in der I/O-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

Nichts.

Länge des Ausgabepuffers

Nichts.

Eingabe-/Ausgabepuffer

N/A

Länge des Eingabe-/Ausgabepuffers

N/A

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 feld Status auf STATUS_INVALID_PARAMETER festgelegt.

Bemerkungen

Die Eingabe für diese Anforderung ist der permanente symbolische Verknüpfungsname, der erstellt werden soll, und ein Name, der bereits gültig ist, um das Volume zu identifizieren. Der Name, der zum Identifizieren des Volumes angegeben wird, kann beliebiger Typ sein: ein eindeutiger Volumename, ein symbolischer Linkname oder ein nichtpersistent 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 beständigen Namen enthält, aber das Volume, das diesen Namen besitzt, nicht im System vorhanden ist, überschreibt dieser Aufruf den Besitz des angegebenen persistenten Namens.

Der Bereitstellungs-Manager ermöglicht die Erstellung eines neuen persistenten symbolischen Verknüpfungsnamens, auch wenn er noch nicht über das angegebene Volume in der MOUNTDEV_MOUNTED_DEVICE_GUID Geräteschnittstellenbenachrichtigung benachrichtigt wurde. In diesem Fall erstellt der Bereitstellungs-Manager einfach die symbolische Verknüpfung und aktualisiert die Bereitstellungs-Manager-Datenbank.

Der Bereitstellungs-Manager erzwingt eine Richtlinie mit höchstens einem dauerhaften 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 Laufwerkbuchstaben zugewiesen ist, es sei denn, der Bereitstellungs-Manager wurde über die MOUNTDEV_MOUNTED_DEVICE_GUID Geräteschnittstellenbenachrichtigung noch nicht über das Volume 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 Laufwerkbuchstaben 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_POINTSabgefragt hat.

In diesem Pseudocodebeispiel verwendet ein Bereitstellungs-Manager-Client IOCTL_MOUNTMGR_CREATE_POINT, um dem Bereitstellungs-Manager einen Geräteobjektnamen und dessen entsprechende symbolische Verknüpfung 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ützen von Mount Manager-Anforderungen in einem Speicherklassentreiber.

Anforderungen

Anforderung Wert
Header- mountmgr.h (include Mountmgr.h)

Siehe auch

MOUNTMGR_CREATE_POINT_INPUT