Suporte a solicitações do Mount Manager em um driver de classe de armazenamento

O MM (gerenciador de montagem) é responsável por gerenciar nomes de volume. Para cada volume, ele armazena um nome exclusivo e é permanentemente identificado com o volume, mesmo depois que o volume é removido do sistema. Ele também gerencia nomes menos permanentes, como letras de unidade, que persistem entre reinicializações, mas cujas atribuições podem ser alteradas à medida que os volumes são adicionados ou removidos do sistema.

O gerenciador de montagem fornece uma interface exclusiva para cada volume no sistema criando um link simbólico para o objeto de dispositivo do volume. Como os links simbólicos em si e os objetos de dispositivo direcionados não persistem quando o sistema é reiniciado, o gerenciador de montagem preserva o nome do link simbólico em um banco de dados de nome persistente no registro.

Esse nome de link simbólico é chamado de nome de volume exclusivo. Como um rótulo de volume tradicional, ele persiste quando o sistema é reiniciado, mas como uma letra de unidade e, ao contrário de um rótulo de volume, ele é exclusivo. O formato para nomes de volume exclusivos é:

"\?? \Volume{GUID}\

em que GUID é um identificador global exclusivo que identifica o volume.

O banco de dados de nome persistente do Mount Manager está localizado na chave do registro MountedDevices do HKLM (SYSTEM/SYSTEM/MountedDevices) do registro. Além de nomes de volume exclusivos, o gerenciador de montagem também armazena nomes de ponto de montagem em seu banco de dados de nome persistente. Os nomes de ponto de montagem podem ser subdivididos em duas categorias: nomes de caminho no estilo Win32 que servem como o diretório raiz do sistema de arquivos do volume montado e letras de unidade.

Cada nome de link simbólico persistente no banco de dados aparece como o nome de um valor do Registro sob a chave MountedDevices acompanhada de uma ID exclusiva. A ID exclusiva é outro identificador exclusivo de um volume (diferente do nome do volume exclusivo). Ele ajuda a identificar qual dos nomes de link simbólicos persistentes potencialmente numerosos se referem ao mesmo volume.

Por exemplo, um único volume com um nome de volume exclusivo de "\\?\Volume{7603f260-142a-11d4-ac67-806d6172696f }\" pode ter uma letra de unidade que acompanha "\DosDevices\D:" e dois pontos de montagem "\DosDevices\C:\mymount" e "\DosDevices\E:\FilesysD\mnt". Isso produziria quatro entradas no banco de dados de nome de link simbólico persistente do Mount Manager: uma para o nome do volume exclusivo, uma para a letra da unidade e duas para os dois nomes de ponto de montagem. Todas as quatro entradas compartilhariam a mesma ID exclusiva. Assim, alguém exibindo a chave do Registro MountedDevices seria capaz de detectar que todos os quatro nomes persistentes apontam para o mesmo volume.

A captura de acreen a seguir ilustra como os nomes persistentes aparecem na chave do Registro MountedDevices .

captura de tela ilustrando como os nomes persistentes aparecem na chave do Registro mounteddevices.

O gerenciador de montagem depende do mecanismo de notificação da interface do dispositivo Plug and Play para alertá-lo sobre a chegada e a remoção do volume. Portanto, cada cliente (ou seja, cada driver de volume, geralmente um driver de classe) deve criar uma interface na classe de interface MOUNTDEV_MOUNTED_DEVICE_GUID chamando IoRegisterDeviceInterface para notificar o gerenciador de montagem da chegada no sistema do volume que gerencia. O GUID da classe de interface MOUNTDEV_MOUNTED_DEVICE_GUID é definido em mountmgr.h.

Ao receber uma notificação Plug and Play da chegada de uma interface de volume, o gerenciador de montagem envia ao cliente três IRPs de controle de dispositivo:

Em resposta a essas três IOCTLs, o cliente deve retornar o nome do objeto de dispositivo não persistente do volume (ou nome de destino) localizado no diretório Dispositivo da árvore de objetos do sistema (por exemplo: "\Device\HarddiskVolume1"), a ID de volume exclusiva e um nome de link simbólico persistente sugerido para o volume, respectivamente. Embora os clientes possam optar por ignorar IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME, eles são obrigados a fornecer uma ID de volume exclusiva ao receber IOCTL_MOUNTDEV_QUERY_DEVICE_NAME ou IOCTL_MOUNTDEV_QUERY_UNIQUE_ID. O gerenciador de montagem depende inteiramente do cliente para fornecer a ID de volume exclusiva e, se o cliente não for fornecê-la, o gerenciador de montagem não poderá atribuir pontos de montagem, como letras de unidade, ao volume.

Para obter mais informações sobre essas IOCTLs, consulte Códigos de controle de E/S enviados pelo Mount Manager.

Se um cliente alertar o gerenciador de montagem da chegada de seu volume, mas não fornecer uma ID exclusiva para o volume quando consultado, o volume será colocado em uma lista de dispositivos montados inativos . Quando isso ocorre, os clientes podem enviar um IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES IOCTL para o gerenciador de montagem para solicitar que o gerenciador de montagem repita sua lista de dispositivos montados inativos e tente consultar os clientes na lista para obter as IDs exclusivas de seus respectivos volumes. Para obter mais informações sobre os IOCTLs IOCTL_MOUNTMGR_xxx, consulte Códigos de controle de E/S enviados por clientes do Mount Manager

Depois que o gerenciador de montagem recebe uma ID de volume exclusiva para um volume recém-introduzido, ele pesquisa em seu banco de dados todos os nomes persistentes atribuídos a essa ID exclusiva e cria links simbólicos para o volume para cada nome de link simbólico persistente.

Quando o gerenciador de montagem detecta que um volume ficou offline, ele exclui os links simbólicos que apontam para o objeto do dispositivo sem excluir os nomes de link simbólico correspondentes no banco de dados do gerenciador de montagem.

Para obter informações sobre como os clientes do Mount Manager criam nomes simbólicos persistentes, consulte IOCTL_MOUNTMGR_CREATE_POINT.