Condividi tramite


IOCTL_MOUNTMGR_CREATE_POINT IOCTL (mountmgr.h)

I client di gestione montaggio possono usare questo IOCTL per richiedere che il gestore di montaggio crei un nome di collegamento simbolico persistente per il volume indicato.

Codice principale

IRP_MJ_DEVICE_CONTROL

Buffer di input

La gestione punti di montaggio inserisce una struttura MOUNTMGR_CREATE_POINT_INPUT all'inizio del buffer in Irp-AssociatedIrp.SystemBuffer>. La gestione montaggio inserisce il nome di collegamento simbolico persistente appena assegnato all'indirizzo a cui punta il membro SymbolicLinkNameOffset di questa struttura e inserisce il nome del dispositivo nonpersistent all'indirizzo a cui punta il membro DeviceNameOffset di questa struttura.

Lunghezza del buffer di input

Parameters.DeviceIoControl.InputBufferLength nella posizione dello stack I/O dell'IRP indica le dimensioni, in byte, del buffer di input, che deve essere maggiore o uguale a sizeof(MOUNTMGR_CREATE_POINT_INPUT).

Buffer di output

Nessuno.

Lunghezza del buffer di output

Nessuno.

Input/Buffer di output

N/D

Lunghezza del buffer di input/output

N/D

Blocco dello stato

Se l'operazione ha esito positivo, il campo Stato è impostato su STATUS_SUCCESS.

Se InputBufferLength è minore di sizeof(MOUNTMGR_CREATE_POINT_INPUT), il campo Stato è impostato su STATUS_INVALID_PARAMETER.

Commenti

L'input di questa richiesta è il nome di collegamento simbolico persistente da creare e un nome già valido per identificare il volume. Il nome specificato ai fini dell'identificazione del volume può essere di qualsiasi tipo: un nome di volume univoco, un nome di collegamento simbolico o un nome del dispositivo nonpersistente. Se il nuovo nome persistente non è già in uso, la chiamata avrà esito positivo e il database di gestione montaggio verrà modificato per riflettere che il nuovo nome persistente appartiene al volume. Se il database di gestione montaggio contiene già il nuovo nome persistente, ma il volume proprietario di tale nome non è nel sistema, questa chiamata sovrascriverà la proprietà del nome persistente specificato.

La gestione montaggio consente la creazione di un nuovo nome di collegamento simbolico persistente anche se non è ancora stato notificato del volume specificato nella notifica dell'interfaccia del dispositivo MOUNTDEV_MOUNTED_DEVICE_GUID. In tal caso, la gestione montaggio crea semplicemente il collegamento simbolico e aggiorna il database di gestione montaggio.

Il gestore di montaggio applica un criterio di al massimo una lettera di unità persistente per volume. Se una richiesta di IOCTL_MOUNTMGR_CREATE_POINT viene inviata con una lettera di unità, la richiesta avrà esito negativo se è già presente una lettera di unità assegnata al volume, a meno che la gestione montaggio non sia ancora stata notificata del volume tramite la notifica dell'interfaccia del dispositivo MOUNTDEV_MOUNTED_DEVICE_GUID. In quest'ultimo caso, la chiamata ha esito positivo e il gestore di montaggio elimina il database di gestione montaggio di qualsiasi altra lettera di unità precedentemente assegnata al volume.

Se IOCTL_MOUNTMGR_CREATE_POINT specifica una lettera di unità, la lettera di unità deve essere maiuscola.

Si noti che un client può scoprire se il gestore di montaggio ha ricevuto la notifica dell'interfaccia del dispositivo MOUNTDEV_MOUNTED_DEVICE_GUID per il volume eseguendo query sulla gestione montaggio con IOCTL_MOUNTMGR_QUERY_POINTS.

In questo esempio di pseudocodice un client di gestione montaggio usa IOCTL_MOUNTMGR_CREATE_POINT per inviare al gestore montaggio un nome dell'oggetto dispositivo e il relativo collegamento simbolico corrispondente:

    // 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);

Per altre informazioni, vedere Supporto delle richieste di Mount Manager in un driver di classe di archiviazione.

Requisiti

Requisito Valore
Intestazione mountmgr.h (includere Mountmgr.h)

Vedi anche

MOUNTMGR_CREATE_POINT_INPUT