Partager via


Prise en charge des requêtes Mount Manager dans un pilote de classe de stockage

Le gestionnaire de montage fourni par le système est responsable de la gestion des noms de volumes. Pour chaque volume, il stocke un nom unique et définitivement identifié avec le volume, même après la suppression du volume du système. Il gère également des noms moins permanents, tels que des lettres de lecteur, qui persistent entre les redémarrages, mais dont les affectations peuvent changer à mesure que les volumes sont ajoutés ou supprimés du système.

Le gestionnaire de montage fournit une interface unique pour chaque volume du système en créant un lien symbolique vers l’objet d’appareil du volume. Étant donné que les liens symboliques eux-mêmes et les objets d’appareil qu’ils ciblent ne persistent pas lorsque le système redémarre, le gestionnaire de montage conserve le nom du lien symbolique dans une base de données de noms persistante dans le Registre.

Ce nom de lien symbolique est appelé nom de volume unique. À l’instar d’une étiquette de volume traditionnelle, elle persiste lorsque le système redémarre. Comme une lettre de lecteur et contrairement à une étiquette de volume, ce nom est unique. Le format des noms de volumes uniques suit, où GUID est un identificateur global unique qui identifie le volume.

"\ ?? \Volume{GUID}\

La base de données de nom persistant du gestionnaire de montage se trouve dans la clé de Registre MountedDevices de la ruche SYSTEM (HKLM/SYSTEM/MountedDevices) du registre. En plus des noms de volumes uniques, le gestionnaire de montage stocke également les noms de point de montage dans sa base de données de noms persistante. Les noms de point de montage peuvent être subdivisés en deux catégories : les noms de chemin d’accès de style Win32 qui servent de répertoire racine du système de fichiers du volume monté et de lettres de lecteur.

Chaque nom de lien symbolique persistant dans la base de données apparaît sous le nom d’une valeur de Registre sous la clé MountedDevices accompagnée d’un ID unique. L’ID unique est un autre identificateur unique d’un volume (différent du nom du volume unique). Il permet d’identifier les noms de liens symboliques persistants potentiellement nombreux qui font référence au même volume.

Par exemple, un seul volume avec un nom de volume unique **"\\ ?\Volume{**7603f260-142a-11d4-ac67-806d6172696f }\ » peut avoir une lettre de lecteur associée « \DosDevices\D : » et deux points de montage « \DosDevices\C :\mymount » et « \DosDevices\E :\FilesysD\mnt ». Cette combinaison produit quatre entrées dans la base de données de nom de lien symbolique persistant du gestionnaire de montage : une pour le nom de volume unique, une pour la lettre de lecteur et deux pour les deux noms de point de montage. Les quatre entrées partagent le même ID unique. Par conséquent, quelqu’un qui consulte la clé de Registre MountedDevices peut détecter que les quatre noms persistants pointent vers le même volume.

La capture d’écran suivante montre comment les noms persistants apparaissent dans la clé de Registre MountedDevices .

capture d’écran illustrant la façon dont les noms persistants apparaissent dans la clé de Registre montédevices.

Le gestionnaire de montage s’appuie sur le mécanisme de notification de l’interface de l’appareil Plug-and-Play pour l’avertir de l’arrivée et de la suppression du volume. Par conséquent, chaque client (autrement dit, chaque pilote de volume, généralement un pilote de classe) doit créer une interface dans la classe d’interface MOUNTDEV_MOUNTED_DEVICE_GUID en appelant IoRegisterDeviceInterface pour avertir le gestionnaire de montage de l’arrivée dans le système qu’il gère. Le GUID de la classe d’interface MOUNTDEV_MOUNTED_DEVICE_GUID est défini dans mountmgr.h.

Lors de la réception d’une notification de Plug-and-Play de l’arrivée d’une interface de volume, le gestionnaire de montage envoie les trois irps de contrôle d’appareil client :

En réponse à ces trois IOCTLs, le client doit retourner le nom d’objet d’appareil non persistant du volume (ou nom cible) situé dans le répertoire de l’appareil de l’arborescence d’objets système (par exemple : « \Device\HarddiskVolume1 »), l’ID de volume unique et un nom de lien symbolique persistant suggéré pour le volume, respectivement. Bien que les clients puissent choisir d’ignorer IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME, ils doivent fournir un ID de volume unique lors de la réception de IOCTL_MOUNTDEV_QUERY_DEVICE_NAME ou de IOCTL_MOUNTDEV_QUERY_UNIQUE_ID. Le gestionnaire de montage s’appuie entièrement sur le client pour fournir l’ID de volume unique. Si le client ne le fournit pas, le gestionnaire de montage n’est pas en mesure d’affecter des points de montage, tels que des lettres de lecteur, au volume.

Si un client avertit le gestionnaire de montage de l’arrivée de son volume mais ne parvient pas à fournir un ID unique pour le volume lors de l’interrogation, le volume est placé sur une liste d’appareils montés mort. Lorsque cette situation se produit, les clients peuvent envoyer une IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES IOCTL au gestionnaire de montage pour demander que le gestionnaire de montage réanalyse sa liste d’appareils montés morts et effectue une autre tentative d’interroger les clients sur la liste pour les ID uniques de leurs volumes respectifs.

Une fois que le gestionnaire de montage reçoit un ID de volume unique pour un volume nouvellement introduit :

  • Il recherche dans sa base de données tous les noms persistants affectés à cet ID unique.
  • Il crée des liens symboliques vers le volume pour chaque nom de lien symbolique persistant.

Lorsque le gestionnaire de montage détecte qu’un volume est hors ligne, il supprime les liens symboliques pointant vers l’objet de l’appareil sans supprimer les noms de liens symboliques correspondants dans la base de données du gestionnaire de montage.

Pour plus d’informations sur la façon dont les clients mount manager créent des noms symboliques persistants, consultez IOCTL_MOUNTMGR_CREATE_POINT.

Codes de contrôle d’E/S envoyés par les clients Mount Manager

Le gestionnaire de montage publie une interface qui permet aux clients du gestionnaire de montage de définir, interroger et supprimer des noms persistants pour les volumes. Pour accéder à cette interface, les clients peuvent obtenir un pointeur vers l’objet d’appareil du gestionnaire de montage à l’aide du nom de l’objet MOUNTMGR_DEVICE_NAME, défini dans Mountmgr.h. Exemple :

    // 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 séquence d’appels dans cet exemple pseudocode est simplifiée par souci de concision. Pour obtenir un exemple de pseudocode plus complet, consultez IOCTL_MOUNTMGR_CREATE_POINT.

Les clients du gestionnaire de montage peuvent envoyer l’un des codes de contrôle IOCTL_MOUNTMGR_XXX documentés au gestionnaire de montage, tels queIOCTL_MOUNTMGR_CREATE_POINT.

Codes de contrôle d’E/S envoyés par Mount Manager

Le gestionnaire de montage peut envoyer l’un des codes de contrôle IOCTL_MOUNTDEV_XXX documentés à ses clients, tels que IOCTL_MOUNTDEV_QUERY_DEVICE_NAME.