IOCTL_MOUNTMGR_CREATE_POINT IOCTL (mountmgr.h)
Les clients du gestionnaire de montage peuvent utiliser cette IOCTL pour demander au gestionnaire de montage de créer un nom de lien symbolique persistant pour le volume indiqué.
Code principal
Mémoire tampon d’entrée
Le gestionnaire de points de montage place une structure MOUNTMGR_CREATE_POINT_INPUT au début de la mémoire tampon à Irp->AssociatedIrp.SystemBuffer. Le gestionnaire de montage insère le nom de lien symbolique persistant qui vient d’être attribué à l’adresse indiquée par l'SymbolLinkNameOffset membre de cette structure, et insère le nom de l’appareil nonpersistent à l’adresse indiquée par l'DeviceNameOffset membre de cette structure.
Longueur de la mémoire tampon d’entrée
Parameters.DeviceIoControl.InputBufferLength à l’emplacement de la pile d’E/S de l’IRP indique la taille, en octets, de la mémoire tampon d’entrée, qui doit être supérieure ou égale à sizeof(MOUNTMGR_CREATE_POINT_INPUT)
.
Mémoire tampon de sortie
Aucun.
Longueur de la mémoire tampon de sortie
Aucun.
Mémoire tampon d’entrée/sortie
N/A
Longueur de la mémoire tampon d’entrée/sortie
N/A
Bloc d’état
Si l’opération réussit, le champ Status est défini sur STATUS_SUCCESS.
Si InputBufferLength est inférieur à sizeof(MOUNTMGR_CREATE_POINT_INPUT)
, le champ Status est défini sur STATUS_INVALID_PARAMETER.
Remarques
L’entrée de cette demande est le nom de lien symbolique persistant à créer et un nom qui est déjà valide pour identifier le volume. Le nom donné à des fins d’identification du volume peut être de n’importe quel type : un nom de volume unique, un nom de lien symbolique ou un nom d’appareil nonpersistent. Si le nouveau nom persistant n’est pas déjà utilisé, l’appel réussit et la base de données du gestionnaire de montage sera modifiée pour refléter que le nouveau nom persistant appartient au volume. Si la base de données du gestionnaire de montage contient déjà le nouveau nom persistant, mais que le volume propriétaire de ce nom n’est pas dans le système, cet appel remplace la propriété du nom persistant donné.
Le gestionnaire de montage permet la création d’un nouveau nom de lien symbolique persistant, même s’il n’a pas encore été averti du volume donné dans la notification de l’interface de l’appareil MOUNTDEV_MOUNTED_DEVICE_GUID. Dans ce cas, le gestionnaire de montage crée simplement le lien symbolique et met à jour la base de données du gestionnaire de montage.
Le gestionnaire de montage applique une stratégie d’au plus une lettre de lecteur persistante par volume. Si une demande de IOCTL_MOUNTMGR_CREATE_POINT est envoyée avec une lettre de lecteur, la demande échoue s’il existe déjà une lettre de lecteur affectée au volume, sauf si le gestionnaire de montage n’a pas encore été averti du volume par le biais de la notification de l’interface de l’appareil MOUNTDEV_MOUNTED_DEVICE_GUID. Dans ce dernier cas, l’appel réussit et le gestionnaire de montage purge la base de données du gestionnaire de montage de toutes les autres lettres de lecteur précédemment affectées au volume.
Si IOCTL_MOUNTMGR_CREATE_POINT spécifie une lettre de lecteur, la lettre de lecteur doit être majuscule.
Notez qu’un client peut déterminer si le gestionnaire de montage a reçu la notification de l’interface de l’appareil MOUNTDEV_MOUNTED_DEVICE_GUID pour son volume en interrogeant le gestionnaire de montage avec IOCTL_MOUNTMGR_QUERY_POINTS.
Dans cet exemple pseudocode, un client de gestionnaire de montage utilise IOCTL_MOUNTMGR_CREATE_POINT pour envoyer au gestionnaire de montage un nom d’objet d’appareil et son lien symbolique correspondant :
// 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);
Pour plus d’informations, consultez prise en charge des demandes mount Manager dans un pilote de classe de stockage.
Exigences
Exigence | Valeur |
---|---|
d’en-tête | mountmgr.h (include Mountmgr.h) |