Compartir a través de


Admitir solicitudes del Administrador de montaje en un controlador de clase de almacenamiento

El administrador de montaje proporcionado por el sistema es responsable de administrar nombres de volumen. Para cada volumen, almacena un nombre que es único y se identifica permanentemente con el volumen, incluso después de quitar el volumen del sistema. También administra nombres menos permanentes, como letras de unidad, que persisten en los reinicios, pero cuyas asignaciones pueden cambiar a medida que se agregan o quitan volúmenes del sistema.

El administrador de montaje proporciona una interfaz única para cada volumen del sistema mediante la creación de un vínculo simbólico al objeto de dispositivo del volumen. Dado que los propios vínculos simbólicos y los objetos de dispositivo que tienen como destino no persisten cuando se reinicia el sistema, el administrador de montaje conserva el nombre del vínculo simbólico en una base de datos de nombres persistente en el Registro.

Este nombre de vínculo simbólico se denomina nombre de volumen único. Al igual que una etiqueta de volumen tradicional, se conserva cuando se reinicia el sistema. Al igual que una letra de unidad y a diferencia de una etiqueta de volumen, este nombre es único. El formato de los nombres de volumen únicos sigue, donde GUID es un identificador único global que identifica el volumen.

"\?? \Volume{GUID}\

La base de datos de nombres persistente del administrador de montaje se encuentra en la clave del Registro MountedDevices del subárbol SYSTEM (HKLM/SYSTEM/MountedDevices) del Registro. Además de los nombres de volumen únicos, el administrador de montaje también almacena los nombres de punto de montaje en su base de datos de nombres persistente. Los nombres de punto de montaje se pueden subdividir aún más en dos categorías: nombres de ruta de acceso de estilo Win32 que sirven como directorio raíz del sistema de archivos del volumen montado y letras de unidad.

Cada nombre de vínculo simbólico persistente de la base de datos aparece como el nombre de un valor del Registro en la clave MountedDevices acompañada de un identificador único. El identificador único es otro identificador único de un volumen (diferente del nombre de volumen único). Ayuda a identificar cuál de los nombres de vínculo simbólico persistentes potencialmente numerosos hace referencia al mismo volumen.

Por ejemplo, un único volumen con un nombre de volumen único **"\\?\Volume{**7603f260-142a-11d4-ac67-806d6172696f }\" podría tener una letra de unidad adjunta "\DosDevices\D:" y dos puntos de montaje "\DosDevices\C:\mymount" y "\DosDevices\E:\FilesysD\mnt". Esta combinación produciría cuatro entradas en la base de datos de nombres de vínculo simbólico persistente del administrador de montaje: una para el nombre de volumen único, una para la letra de unidad y dos para los dos nombres de punto de montaje. Las cuatro entradas compartirían el mismo identificador único. Por lo tanto, alguien que vea la clave del Registro MountedDevices podría detectar que los cuatro nombres persistentes apuntan al mismo volumen.

En la captura de pantalla siguiente se muestra cómo aparecen los nombres persistentes en la clave del Registro MountedDevices .

captura de pantalla que ilustra cómo aparecen los nombres persistentes en la clave del Registro mounteddevices.

El administrador de montaje se basa en el mecanismo de notificación de la interfaz del dispositivo Plug and Play para alertarlo de la llegada y eliminación del volumen. Por lo tanto, cada cliente (es decir, cada controlador de volumen, normalmente un controlador de clase) debe crear una interfaz en la clase de interfaz MOUNTDEV_MOUNTED_DEVICE_GUID llamando a IoRegisterDeviceInterface para notificar al administrador de montaje de la llegada en el sistema del volumen que administra. El GUID de la clase de interfaz MOUNTDEV_MOUNTED_DEVICE_GUID se define en mountmgr.h.

Tras recibir una notificación de Plug and Play de la llegada de una interfaz de volumen, el administrador de montaje envía al cliente tres IRP de control de dispositivos:

En respuesta a estos tres ICTLs, el cliente debe devolver el nombre de objeto de dispositivo no persistente (o nombre de destino) del volumen ubicado en el directorio Device del árbol de objetos del sistema (por ejemplo: "\Device\HarddiskVolume1"), el identificador de volumen único y un nombre de vínculo simbólico persistente sugerido para el volumen, respectivamente. Aunque los clientes pueden optar por omitir IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME, es necesario proporcionar un identificador de volumen único al recibir IOCTL_MOUNTDEV_QUERY_DEVICE_NAME o IOCTL_MOUNTDEV_QUERY_UNIQUE_ID. El administrador de montaje se basa completamente en el cliente para proporcionar el identificador de volumen único. Si el cliente no lo proporciona, el administrador de montaje no puede asignar puntos de montaje, como letras de unidad, al volumen.

Si un cliente alerta al administrador de montaje de la llegada de su volumen, pero no proporciona un identificador único para el volumen cuando se consulta, el volumen se coloca en una lista de dispositivos montados fallidos. Cuando se produce esta situación, los clientes pueden enviar un IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES IOCTL al administrador de montaje para solicitar que el administrador de montaje vuelva a examinar su lista de dispositivos montados inactivos y realice otro intento de consultar a los clientes en la lista para ver los identificadores únicos de sus respectivos volúmenes.

Después de que el administrador de montaje reciba un identificador de volumen único para un volumen recién introducido:

  • Busca en su base de datos todos los nombres persistentes asignados a ese identificador único.
  • Crea vínculos simbólicos al volumen para cada nombre de vínculo simbólico persistente.

Cuando el administrador de montaje detecta que un volumen ha quedado fuera de línea, elimina los vínculos simbólicos que apuntan al objeto de dispositivo sin eliminar los nombres de vínculo simbólico correspondientes en la base de datos del administrador de montaje.

Para obtener información sobre cómo los clientes del administrador de montaje crean nombres simbólicos persistentes, consulte IOCTL_MOUNTMGR_CREATE_POINT.

Códigos de control de E/S enviados por clientes del Administrador de montaje

El administrador de montaje publica una interfaz que permite a los clientes del administrador de montaje establecer, consultar y eliminar nombres persistentes para volúmenes. Para acceder a esta interfaz, los clientes pueden obtener un puntero al objeto de dispositivo del administrador de montaje mediante el nombre de objeto MOUNTMGR_DEVICE_NAME, definido en Mountmgr.h. Por ejemplo:

    // Obtain a pointer to the mount manager device object &
    // use it to send any of the I/O Control codes in this 
    // section to the mount manager.
    RtlInitUnicodeString(&name, MOUNTMGR_DEVICE_NAME);
    status = IoGetDeviceObjectPointer(&name,
                FILE_READ_ATTRIBUTES, 
                &fileObject, &deviceObject);
    irp = IoBuildDeviceIoControlRequest(
            IOCTL_MOUNTMGR_CREATE_POINT,
            deviceObject, createPoint, createPointSize, 
            NULL, 0, FALSE, &event, &ioStatus);
    status = IoCallDriver(deviceObject, irp);

La secuencia de llamadas de este ejemplo de pseudocódigo se simplifica por motivos de brevedad. Para obtener un ejemplo de pseudocódigo más completo, consulte IOCTL_MOUNTMGR_CREATE_POINT.

Los clientes del administrador de montaje pueden enviar cualquiera de los códigos de control IOCTL_MOUNTMGR_XXX documentados al administrador de montaje, comoIOCTL_MOUNTMGR_CREATE_POINT.

Códigos de control de E/S enviados por el Administrador de montaje

El administrador de montaje puede enviar cualquiera de los códigos de control IOCTL_MOUNTDEV_XXX documentados a sus clientes, como IOCTL_MOUNTDEV_QUERY_DEVICE_NAME.