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 permanente per il volume indicato.
Codice principale
Buffer di input
Il gestore dei punti di montaggio posiziona una struttura di MOUNTMGR_CREATE_POINT_INPUT all'inizio del buffer in Irp->AssociatedIrp.SystemBuffer. Il gestore di montaggio inserisce il nome del collegamento simbolico permanente appena assegnato all'indirizzo a cui punta il SymbolicLinkNameOffset membro di questa struttura e inserisce il nome del dispositivo non permanente all'indirizzo a cui punta il DeviceNameOffset membro 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.
Buffer di input/output
N/D
Lunghezza del buffer di input/output
N/D
Blocco di 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.
Osservazioni
L'input di questa richiesta è il nome di collegamento simbolico permanente 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 di dispositivo non persistente. Se il nuovo nome permanente non è già in uso, la chiamata avrà esito positivo e il database di gestione montaggio verrà modificato in modo da riflettere che il nuovo nome permanente appartiene al volume. Se il database di gestione montaggio contiene già il nuovo nome permanente, ma il volume proprietario di tale nome non è presente nel sistema, questa chiamata sovrascriverà la proprietà del nome permanente specificato.
Gestione montaggio consente la creazione di un nuovo nome di collegamento simbolico permanente anche se non è ancora stato informato del volume specificato nella notifica dell'interfaccia del dispositivo MOUNTDEV_MOUNTED_DEVICE_GUID. In questo 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 il gestore di montaggio non abbia ancora ricevuto una notifica 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 una query sul gestore di 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 del montaggio un nome di 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 Gestione montaggio in un driver di classe di archiviazione.
Fabbisogno
Requisito | Valore |
---|---|
intestazione | mountmgr.h (include Mountmgr.h) |