Nœuds d’appareil et piles d’appareils

Dans Windows, les appareils sont représentés par des nœuds d’appareil dans l’arborescence d’appareils Plug-and-Play (PnP). En règle générale, lorsqu’une demande d’E/S est envoyée à un appareil, plusieurs pilotes aident à gérer la demande. Chacun de ces pilotes est associé à un objet d’appareil et les objets d’appareil sont organisés dans une pile. La séquence d’objets d’appareil ainsi que leurs pilotes associés est appelée pile d’appareils. Chaque nœud d’appareil a sa propre pile d’appareils.

Nœuds d’appareil et arborescence d’appareils Plug-and-Play

Windows organise les appareils dans une arborescence appelée arborescence Plug-and-Play’arborescence de l’appareil, ou simplement l’arborescence de l’appareil. En règle générale, un nœud dans l’arborescence de l’appareil représente un appareil ou une fonction individuelle sur un appareil composite. Toutefois, certains nœuds représentent des composants logiciels qui n’ont aucune association avec les appareils physiques.

Un nœud dans l’arborescence de l’appareil est appelé nœud d’appareil. Le nœud racine de l’arborescence de l’appareil est appelé nœud d’appareil racine. Par convention, le nœud d’appareil racine est dessiné en bas de l’arborescence de l’appareil, comme illustré dans le diagramme suivant.

diagramme de l’arborescence de l’appareil, montrant les nœuds d’appareil.

L’arborescence de l’appareil illustre les relations parent/enfant inhérentes à l’environnement PnP. Plusieurs nœuds de l’arborescence d’appareils représentent des bus auxquels les appareils enfants sont connectés. Par exemple, le nœud PCI Bus représente le bus PCI physique sur la carte mère. Au démarrage, le gestionnaire PnP demande au pilote de bus PCI d’énumérer les appareils connectés au bus PCI. Ces appareils sont représentés par des nœuds enfants du nœud PCI Bus. Dans le diagramme précédent, le nœud PCI Bus a des nœuds enfants pour plusieurs appareils connectés au bus PCI, y compris les contrôleurs hôtes USB, un contrôleur audio et un port PCI Express.

Certains des appareils connectés au bus PCI sont eux-mêmes des bus. Le gestionnaire PnP demande à chacun de ces bus d’énumérer les appareils qui y sont connectés. Dans le diagramme précédent, nous pouvons voir que le contrôleur audio est un bus qui a un périphérique audio connecté à celui-ci. Nous pouvons voir que le port PCI Express est un bus qui a une carte d’affichage connectée à celui-ci, et que l’adaptateur d’affichage est un bus qui a un moniteur connecté à celui-ci.

Que vous considériez un nœud comme représentant un appareil ou un bus dépend de votre point de vue. Par exemple, vous pouvez considérer l’adaptateur d’affichage comme un appareil qui joue un rôle clé dans la préparation des images qui apparaissent à l’écran. Toutefois, vous pouvez également considérer l’adaptateur d’affichage comme un bus capable de détecter et d’énumérer des moniteurs connectés.

Objets d’appareil et piles d’appareils

Un objet d’appareil est une instance d’une structure DEVICE_OBJECT. Chaque nœud d’appareil de l’arborescence d’appareils PnP contient une liste ordonnée d’objets d’appareil, et chacun de ces objets d’appareil est associé à un pilote. La liste ordonnée des objets d’appareil, ainsi que leurs pilotes associés, est appelée pile d’appareils pour le nœud d’appareil.

Vous pouvez considérer une pile d’appareils de plusieurs façons. Dans le sens le plus formel, une pile d’appareils est une liste ordonnée de paires (objet d’appareil, pilote). Toutefois, dans certains contextes, il peut être utile de considérer la pile d’appareils comme une liste ordonnée d’objets d’appareil. Dans d’autres contextes, il peut être utile de considérer la pile d’appareils comme une liste ordonnée de pilotes.

Par convention, une pile d’appareils a un haut et un bas. Le premier objet d’appareil à créer dans la pile d’appareils se trouve en bas, et le dernier objet d’appareil à créer et attaché à la pile d’appareils se trouve en haut.

Dans le diagramme suivant, le nœud d’appareil Proseware Gizmo a une pile d’appareils qui contient trois paires (objet de périphérique, pilote). L’objet périphérique supérieur est associé au pilote AfterThought.sys, l’objet de périphérique intermédiaire est associé au pilote Proseware.sys et l’objet périphérique inférieur est associé au pilote Pci.sys. Le nœud PCI Bus au centre du diagramme a une pile d’appareils qui contient deux paires (objet d’appareil, pilote), un objet d’appareil associé à Pci.sys et un objet d’appareil associé à Acpi.sys.

diagramme montrant les objets d’appareil ordonnés dans les piles d’appareils dans les nœuds de gizmo et pci device proseware.

Comment une pile d’appareils est-elle construite ?

Au démarrage, le gestionnaire PnP demande au pilote de chaque bus d’énumérer les appareils enfants connectés au bus. Par exemple, le gestionnaire PnP demande au pilote de bus PCI (Pci.sys) d’énumérer les appareils connectés au bus PCI. En réponse à cette demande, Pci.sys crée un objet d’appareil pour chaque appareil connecté au bus PCI. Chacun de ces objets d’appareil est appelé objet d’appareil physique (PDO). Peu de temps après Pci.sys crée l’ensemble des PDP, l’arborescence de l’appareil ressemble à celle illustrée dans le diagramme suivant.

diagramme de nœuds pci et d’objets d’appareil physique pour les appareils enfants.

Le gestionnaire PnP associe un nœud d’appareil à chaque PDO nouvellement créé et recherche dans le Registre pour déterminer quels pilotes doivent faire partie de la pile d’appareils pour le nœud. La pile d’appareils doit avoir un (et un seul) pilote de fonction et peut éventuellement avoir un ou plusieurs pilotes de filtre. Le pilote de fonction est le pilote principal de la pile d’appareils et est responsable de la gestion des demandes de lecture, d’écriture et de contrôle d’appareil. Les pilotes de filtre jouent des rôles auxiliaires dans le traitement des demandes de contrôle de lecture, d’écriture et d’appareil. À mesure que chaque pilote de fonction et de filtre est chargé, il crée un objet d’appareil et se joint à la pile d’appareils. Un objet d’appareil créé par le pilote de fonction est appelé objet d’appareil fonctionnel (FDO), et un objet d’appareil créé par un pilote de filtre est appelé un objet de périphérique de filtre (Filter DO). À présent, l’arborescence de l’appareil ressemble à ce diagramme.

diagramme d’une arborescence d’appareils montrant les objets de filtre, de fonction et d’appareil physique dans le nœud d’appareil gizmo proseware.

Dans le diagramme, notez que dans un nœud, le pilote de filtre est au-dessus du pilote de fonction, et dans l’autre nœud, le pilote de filtre se trouve sous le pilote de fonction. Un pilote de filtre qui se trouve au-dessus du pilote de fonction dans une pile de périphériques est appelé pilote de filtre supérieur. Un pilote de filtre situé sous le pilote de fonction est appelé pilote de filtre inférieur.

L’objet PDO est toujours l’objet d’appareil inférieur dans une pile d’appareils. Cela résulte de la façon dont une pile d’appareils est construite. L’objet PDO est créé en premier et, lorsque des objets d’appareil supplémentaires sont attachés à la pile, ils sont attachés au sommet de la pile existante.

Notez que lorsque les pilotes d’un appareil sont installés, le programme d’installation utilise des informations dans un fichier d’informations (INF) pour déterminer quel pilote est le pilote de fonction et quels pilotes sont des filtres. En règle générale, le fichier INF est fourni par Microsoft ou par le fournisseur de matériel. Une fois les pilotes d’un appareil installés, le gestionnaire PnP peut déterminer la fonction et filtrer les pilotes de l’appareil en recherchant dans le Registre.

Pilotes de bus

Dans le diagramme précédent, vous pouvez voir que le pilote Pci.sys joue deux rôles. Tout d’abord, Pci.sys est associé au FDO dans le nœud d’appareil PCI Bus. En fait, il a créé le FDO dans le nœud d’appareil PCI Bus. Par conséquent, Pci.sys est le pilote de fonction pour le bus PCI. Deuxièmement, Pci.sys est associé à l’PDO dans chaque enfant du nœud PCI Bus. Rappelez-vous qu’il a créé les PPO pour les appareils enfants. Le pilote qui crée l’objet PDO pour un nœud d’appareil est appelé pilote de bus pour le nœud.

Si votre point de référence est le bus PCI, Pci.sys est le pilote de fonction. Mais si votre point de référence est l’appareil Proseware Gizmo, alors Pci.sys est le pilote de bus. Ce double rôle est classique dans l’arborescence d’appareils PnP. Un pilote qui sert de pilote de fonction pour un bus sert également de pilote de bus pour un périphérique enfant du bus.

Piles d’appareils en mode utilisateur

Jusqu’à présent, nous avons discuté des piles d’appareils en mode noyau. Autrement dit, les pilotes dans les piles s’exécutent en mode noyau et les objets de périphérique sont mappés dans l’espace système, qui est l’espace d’adressage disponible uniquement pour le code exécuté en mode noyau. Pour plus d’informations sur la différence entre le mode noyau et le mode utilisateur, consultez le mode utilisateur et le mode noyau.

Dans certains cas, un appareil dispose d’une pile d’appareils en mode utilisateur en plus de sa pile d’appareils en mode noyau. Les pilotes en mode utilisateur sont souvent basés sur l’infrastructure de pilotes en mode utilisateur (UMDF), qui est l’un des modèles de pilotes fournis par les frameworks WDF (Windows Driver Frameworks). Dans UMDF, les pilotes sont des DLL en mode utilisateur et les objets d’appareil sont des objets COM qui implémentent l’interface IWDFDevice. Un objet d’appareil dans une pile d’appareils UMDF est appelé objet d’appareil WDF (WDF DO).

Le diagramme suivant montre le nœud d’appareil, la pile d’appareils en mode noyau et la pile d’appareils en mode utilisateur pour un appareil USB-FX-2. Les pilotes dans les piles en mode utilisateur et en mode noyau participent à des requêtes d’E/S dirigées vers l’appareil USB-FX-2.

diagramme montrant les piles d’appareils en mode utilisateur et en mode noyau.

Concepts pour tous les développeurs de pilotes

Piles de pilotes