Share via


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

Gestione montaggio (MM) è responsabile della gestione dei nomi dei volumi. Per ogni volume, archivia un nome univoco e viene identificato definitivamente con il volume, anche dopo che il volume è stato rimosso dal sistema. Gestisce anche nomi meno permanenti, ad esempio lettere di unità, che vengono mantenuti tra i riavvii, ma le cui assegnazioni possono cambiare quando i volumi vengono aggiunti o rimossi dal sistema.

La 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 quando il sistema viene riavviato, la gestione montaggio mantiene il nome del collegamento simbolico in un database di nomi persistente nel Registro di sistema.

Questo nome di collegamento simbolico viene chiamato un nome di volume univoco. Come un'etichetta di volume tradizionale, persiste quando il sistema viene riavviato, ma come una lettera di unità e, a differenza di un'etichetta del volume, è univoca. Il formato per i nomi di volume univoci è:

"\?? \Volume{GUID}\

dove GUID è un identificatore univoco globale che identifica il volume.

Il database dei nomi persistenti di Mount Manager si trova nella chiave del Registro di sistema MountDevices dell'hive SYSTEM (HKLM/SYSTEM/MountDevices) del Registro di sistema. Oltre ai nomi di volume univoci, la gestione montaggio archivia anche i nomi dei punti di montaggio nel database dei nomi persistenti. 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 persistente 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 di "\\?\Volume{7603f260-142a-11d4-ac67-806d6172696f }\ " potrebbe avere una lettera di unità associata "\DosDevices\D:" e due punti di montaggio "\DosDevices\C:\mymount" e "\DosDevices\E:\FilesysD\mnt". In questo modo vengono prodotte quattro voci nel database del nome di collegamento simbolico permanente 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. Pertanto, qualcuno che visualizza la chiave del Registro di sistema MountedDevices sarà in grado di rilevare che tutti e quattro i nomi persistenti puntano allo stesso volume.

L'immagine seguente illustra come vengono visualizzati i nomi persistenti nella chiave del Registro di sistema MountedDevices .

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

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. Pertanto 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 che gestisce. Il GUID della classe di interfaccia MOUNTDEV_MOUNTED_DEVICE_GUID è definito in mountmgr.h.

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

In risposta a questi tre IOCTLs il client deve restituire il nome dell'oggetto dispositivo nonpersistente del volume (o nome di destinazione) situato rispettivamente nella directory Device dell'albero degli oggetti di sistema (ad esempio: "\Device\HarddiskVolume1"), l'ID volume univoco e un nome di collegamento simbolico permanente suggerito per il volume. Anche se i client possono scegliere di ignorare IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME, sono necessari per 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 e, 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.

Per altre informazioni su questi IOCTLs, vedere Codici di controllo I/O inviati da Mount Manager.

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 non attivo . Quando si verifica questo problema, i client possono inviare un IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES IOCTL al gestore di montaggio per richiedere che il gestore di montaggio riscriva l'elenco dei dispositivi montati e faccia un altro tentativo di eseguire query sui client nell'elenco per gli ID univoci dei rispettivi volumi. Per altre informazioni sui IOCTL_MOUNTMGR_xxx IOCTLs, vedere Codici di controllo I/O inviati dai client di Mount Manager

Dopo che la gestione montaggio riceve un ID volume univoco per un volume appena introdotto, quindi cerca il database per tutti i nomi persistenti assegnati a tale ID univoco e crea collegamenti simbolici al volume per ogni nome simbolico persistente.

Quando la gestione montaggio rileva che un volume è andato fuori riga, elimina i collegamenti simbolici che puntano all'oggetto dispositivo senza eliminare i nomi di collegamento simbolici corrispondenti nel database di Gestione montaggio.

Per informazioni sul modo in cui i client di gestione montaggio creano nomi simbolici persistenti, vedere IOCTL_MOUNTMGR_CREATE_POINT.