Supporto delle richieste di Mount Manager in un driver di classe di archiviazione

Il gestore di montaggio fornito dal sistema è responsabile della gestione dei nomi dei volumi. Per ogni volume, archivia un nome univoco e identificato in modo permanente con il volume, anche dopo la rimozione del volume dal sistema. Gestisce anche nomi meno permanenti, ad esempio lettere di unità, che vengono mantenuti tra riavvii, ma le cui assegnazioni possono cambiare man mano che i volumi vengono aggiunti o rimossi dal sistema.

Gestione montaggio fornisce un'interfaccia univoca per ogni volume del sistema creando un collegamento simbolico all'oggetto dispositivo del volume. Poiché i collegamenti simbolici stessi e gli oggetti dispositivo di destinazione non vengono mantenuti al riavvio del sistema, il gestore di montaggio mantiene il nome del collegamento simbolico in un database dei nomi permanenti nel Registro di sistema.

Questo nome di collegamento simbolico è denominato nome di volume univoco. Come un'etichetta di volume tradizionale, viene mantenuta al riavvio del sistema. Come una lettera di unità e a differenza di un'etichetta di volume, questo nome è univoco. Il formato per i nomi di volume univoci segue, dove GUID è un identificatore univoco globale che identifica il volume.

"\?? \Volume{GUID}\

Il database dei nomi permanenti di Mount Manager si trova nella chiave del Registro di sistema MountedDevices dell'hive SYSTEM (HKLM/SYSTEM/MountedDevices) del Registro di sistema. Oltre ai nomi di volume univoci, gestione montaggio archivia anche i nomi dei punti di montaggio nel database dei nomi permanenti. I nomi dei punti di montaggio possono essere ulteriormente suddivisi in due categorie: nomi di percorso in stile Win32 che fungono da directory radice del file system del volume montato e lettere di unità.

Ogni nome di collegamento simbolico permanente nel database viene visualizzato come nome di un valore del Registro di sistema nella chiave MountedDevices accompagnato da un ID univoco. L'ID univoco è un altro identificatore univoco di un volume (diverso dal nome del volume univoco). Consente di identificare quale dei nomi di collegamento simbolici persistenti potenzialmente numerosi fanno riferimento allo stesso volume.

Ad esempio, un singolo volume con un nome di volume univoco **"\?\Volume{**7603f260-142a-11d4-ac67-806d6172696f }\" potrebbe avere una lettera di unità "\DosDevices\D:" e due punti di montaggio "\DosDevices\C:\mymount" e "\DosDevices\E:\FilesysD\mnt". Questa combinazione produce quattro voci nel database dei nomi di collegamento simbolici permanenti di Mount Manager: uno per il nome del volume univoco, uno per la lettera di unità e due per i due nomi dei punti di montaggio. Tutte e quattro le voci condividono lo stesso ID univoco. Di conseguenza, un utente che visualizza la chiave del Registro di sistema MountedDevices potrebbe rilevare che tutti e quattro i nomi permanenti puntano allo stesso volume.

Lo screenshot seguente illustra come vengono visualizzati i nomi permanenti nella chiave del Registro di sistema MountedDevices .

screenshot che illustra come vengono visualizzati i nomi persistenti nella chiave del Registro di sistema mounteddevices.

Il gestore di montaggio si basa sul meccanismo di notifica dell'interfaccia del dispositivo Plug and Play per avvisarlo dell'arrivo e della rimozione del volume. Ogni client, ovvero ogni driver del volume, in genere un driver di classe, deve creare un'interfaccia nella classe di interfaccia MOUNTDEV_MOUNTED_DEVICE_GUID chiamando IoRegisterDeviceInterface per notificare al gestore di montaggio l'arrivo nel sistema gestito dal volume gestito. Il GUID della classe di interfaccia MOUNTDEV_MOUNTED_DEVICE_GUID è definito in mountmgr.h.

Dopo aver ricevuto una notifica Plug and Play dell'arrivo di un'interfaccia del volume, gestione montaggio invia i tre IRP del controllo del dispositivo client:

In risposta a questi tre IOCTLs, il client deve restituire il nome dell'oggetto dispositivo non persistente del volume (o il nome di destinazione) che si trova nella directory Device dell'albero degli oggetti di sistema (ad esempio: "\Device\HarddiskVolume1"), l'ID del volume univoco e un nome di collegamento simbolico persistente suggerito per il volume. Anche se i client possono scegliere di ignorare IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME, devono fornire un ID volume univoco al momento della ricezione di IOCTL_MOUNTDEV_QUERY_DEVICE_NAME o IOCTL_MOUNTDEV_QUERY_UNIQUE_ID. Il gestore di montaggio si basa interamente sul client per fornire l'ID del volume univoco. Se il client non lo fornisce, il gestore di montaggio non è in grado di assegnare punti di montaggio, ad esempio lettere di unità, al volume.

Se un client avvisa il gestore di montaggio dell'arrivo del volume ma non fornisce un ID univoco per il volume quando viene eseguita una query, il volume viene inserito in un elenco di dispositivi montati inattivo. Quando si verifica questa situazione, i client possono inviare un IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES IOCTL al gestore di montaggio per richiedere che il gestore di montaggio ripeti l'analisi dell'elenco dei dispositivi montati inattivi e fare un altro tentativo di eseguire una query sui client nell'elenco per gli ID univoci dei rispettivi volumi.

Dopo che il gestore di montaggio riceve un ID di volume univoco per un volume appena introdotto:

  • Cerca nel database tutti i nomi permanenti assegnati a tale ID univoco.
  • Crea collegamenti simbolici al volume per ogni nome di collegamento simbolico permanente.

Quando il gestore di montaggio rileva che un volume è uscito dalla riga, elimina i collegamenti simbolici che puntano all'oggetto dispositivo senza eliminare i nomi di collegamento simbolici corrispondenti nel database del gestore di montaggio.

Per informazioni su come i client di Gestione montaggio creano nomi simbolici permanenti, vedere IOCTL_MOUNTMGR_CREATE_POINT.

Codici di controllo di I/O inviati dai client di Mount Manager

Gestione montaggio pubblica un'interfaccia che consente ai client del gestore di montaggio di impostare, eseguire query ed eliminare nomi permanenti per i volumi. Per accedere a questa interfaccia, i client possono ottenere un puntatore all'oggetto dispositivo del gestore di montaggio usando il nome dell'oggetto MOUNTMGR_DEVICE_NAME, definito in Mountmgr.h. Ad esempio:

    // 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 sequenza di chiamata in questo esempio di pseudocodice è semplificata per motivi di brevità. Per un esempio di pseudocodice più completo, vedere IOCTL_MOUNTMGR_CREATE_POINT.

I client di Gestione montaggio possono inviare uno qualsiasi dei codici di controllo IOCTL_MOUNTMGR_XXX documentati al gestore di montaggio, ad esempioIOCTL_MOUNTMGR_CREATE_POINT.

Codici di controllo I/O inviati da Mount Manager

Il gestore di montaggio può inviare ai client uno qualsiasi dei codici di controllo IOCTL_MOUNTDEV_XXX documentati, ad esempio IOCTL_MOUNTDEV_QUERY_DEVICE_NAME.