IOCTL_MOUNTMGR_CREATE_POINT IOCTL (mountmgr.h)

Los clientes del administrador de montaje pueden usar este IOCTL para solicitar que el administrador de montaje cree un nombre de vínculo simbólico persistente para el volumen indicado.

Código principal

IRP_MJ_DEVICE_CONTROL

Búfer de entrada

El administrador de puntos de montaje coloca una estructura de MOUNTMGR_CREATE_POINT_INPUT al principio del búfer en Irp-AssociatedIrp.SystemBuffer>. El administrador de montaje inserta el nombre de vínculo simbólico persistente recién asignado en la dirección a la que apunta el miembro SymbolicLinkNameOffset de esta estructura y inserta el nombre del dispositivo no persistente en la dirección a la que apunta el miembro DeviceNameOffset de esta estructura.

Longitud del búfer de entrada

Parameters.DeviceIoControl.InputBufferLength en la ubicación de la pila de E/S del IRP indica el tamaño, en bytes, del búfer de entrada, que debe ser mayor o igual que sizeof(MOUNTMGR_CREATE_POINT_INPUT).

Búfer de salida

Ninguno.

Longitud del búfer de salida

Ninguno.

Búfer de entrada y salida

N/D

Longitud del búfer de entrada y salida

N/D

Bloque de estado

Si la operación se realiza correctamente, el campo Estado se establece en STATUS_SUCCESS.

Si InputBufferLength es menor que sizeof(MOUNTMGR_CREATE_POINT_INPUT), el campo Estado se establece en STATUS_INVALID_PARAMETER.

Comentarios

La entrada de esta solicitud es el nombre de vínculo simbólico persistente que se va a crear y un nombre que ya es válido para identificar el volumen. El nombre especificado para identificar el volumen puede ser de cualquier tipo: un nombre de volumen único, un nombre de vínculo simbólico o un nombre de dispositivo no persistente. Si el nuevo nombre persistente aún no está en uso, la llamada se realizará correctamente y la base de datos del administrador de montaje se modificará para reflejar que el nuevo nombre persistente pertenece al volumen. Si la base de datos del administrador de montaje ya contiene el nuevo nombre persistente, pero el volumen que posee ese nombre no está en el sistema, esta llamada sobrescribirá la propiedad del nombre persistente especificado.

El administrador de montaje permite la creación de un nuevo nombre de vínculo simbólico persistente incluso si aún no se ha notificado el volumen especificado en la notificación de interfaz de dispositivo MOUNTDEV_MOUNTED_DEVICE_GUID. En tal caso, el administrador de montaje simplemente crea el vínculo simbólico y actualiza la base de datos del administrador de montaje.

El administrador de montaje aplica una directiva de, como máximo, una letra de unidad persistente por volumen. Si se envía una solicitud de IOCTL_MOUNTMGR_CREATE_POINT con una letra de unidad, se producirá un error en la solicitud si ya hay una letra de unidad asignada al volumen, a menos que el administrador de montaje aún no se haya notificado al volumen mediante la notificación de interfaz de dispositivo de MOUNTDEV_MOUNTED_DEVICE_GUID. En este último caso, la llamada se realiza correctamente y el administrador de montaje purga la base de datos del administrador de montaje de cualquier otra letra de unidad asignada anteriormente al volumen.

Si IOCTL_MOUNTMGR_CREATE_POINT especifica una letra de unidad, la letra de unidad debe ser mayúscula.

Tenga en cuenta que un cliente puede detectar si el administrador de montaje ha recibido la notificación de interfaz de dispositivo MOUNTDEV_MOUNTED_DEVICE_GUID para su volumen consultando el administrador de montaje con IOCTL_MOUNTMGR_QUERY_POINTS.

En este ejemplo de pseudocódigo, un cliente del administrador de montaje usa IOCTL_MOUNTMGR_CREATE_POINT para enviar al administrador de montaje un nombre de objeto de dispositivo y su vínculo simbólico correspondiente:

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

Para obtener más información, vea Admitir solicitudes del Administrador de montaje en un controlador de clase de almacenamiento.

Requisitos

Requisito Valor
Header mountmgr.h (include Mountmgr.h)

Consulte también

MOUNTMGR_CREATE_POINT_INPUT