Vue d’ensemble des ID de conteneur
Dans la famille de systèmes d’exploitation Windows, les appareils sont essentiellement une collection d’instances d’appareils fonctionnels, chacune représentant un point de terminaison fonctionnel qui permet une certaine forme de communication avec l’appareil.
Le terme nœud de périphérique (devnode) fait référence à la pile de pilotes pour ce point de terminaison fonctionnel, en plus des propriétés qui décrivent le point de terminaison et son état associé. Par exemple, un appareil multifonction qui prend en charge les fonctionnalités d’imprimante, de scanneur et de télécopie peut avoir plusieurs devnodes, un pour chaque point de terminaison fonctionnel de l’appareil.
Avant Windows 7, chaque point de terminaison fonctionnel avait un devnode qui lui est associé. Les composants de plateforme Windows et les applications tierces peuvent interroger les devnodes pour obtenir des informations et des status d’appareils, et peuvent communiquer avec le matériel de l’appareil via des interfaces exposées par les points de terminaison fonctionnels.
Pour un appareil à fonction unique, un seul devnode contient toutes les informations relatives au point de terminaison fonctionnel de l’appareil. De même, un appareil multifonction a plusieurs devnodes qui sont associés à chacun des points de terminaison fonctionnels de l’appareil. Toutefois, Windows ne peut pas reconnaître qu’un groupe de devnodes provient du même appareil physique. Chaque devnode qui appartient au même appareil multifonction n’inclut pas d’informations d’identification permettant au gestionnaire Plug-and-Play (PnP) de regrouper plusieurs devnodes en tant qu’appareil unique. Par conséquent, il n’est pas possible d’avoir une vue globale de l’appareil et des fonctions qu’un seul appareil physique fournit.
À compter de Windows 7, le système d’exploitation utilise un nouvel ID (ID de conteneur) pour regrouper un ou plusieurs devnodes provenant de et appartenant à chaque instance d’un appareil physique particulier. L’ID de conteneur est une propriété de chaque devnode et est spécifié via une valeur d’identificateur global unique (GUID).
Chaque instance d’un appareil physique installé sur l’ordinateur a un ID de conteneur unique. Tous les devnodes qui représentent une fonction sur cette instance de l’appareil physique partagent le même ID de conteneur. La figure suivante montre un exemple de cette relation.
Il existe un ID de conteneur avec une signification particulière pour les pilotes de bus : NULL_GUID qui est défini comme suit : {00000000-0000-0000-0000-000000000000}.
En général, ne retournez pas NULL_GUID comme cas par défaut lors de la création d’un ID de conteneur. Au lieu de cela, ne gérez pas IRP_MN_QUERY_ID pour le cas BusQueryContainerIDs et laissez PnP appliquer sa logique par défaut.
Lors du retour d’NULL_GUID en tant qu’ID de conteneur, un pilote de bus déclare au PnP que l’appareil ne doit faire partie d’aucun conteneur, de sorte que le renvoi d’NULL_GUID ne convient que dans des cas très particuliers. Par exemple, un devnode tel qu’un périphérique de volume peut s’étendre sur plusieurs disques dans plusieurs conteneurs, mais n’appartient à aucun conteneur. Un tel appareil aura un DEVPKEY_Device_BaseContainerId égal à NULL_GUID, et il n’aura pas de DEVPKEY_Device_ContainerId du tout.
Mis à part des cas très spéciaux, un pilote de bus ne doit jamais retourner NULL_GUID lors de la signalement d’un périphérique matériel et les pilotes de bus doivent se protéger contre le matériel défectueux qui signale une valeur NULL_GUID de leur bus. Dans ce cas, le pilote de bus doit soit traiter cela comme une erreur d’appareil, soit le traiter comme si l’appareil n’avait pas déclaré de valeur.