Share via


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’appareil 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 avec 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 l’arborescence des appareils Plug-and-Play

Windows organise les appareils dans une arborescence appelée Plug-and-Play arborescence des appareils, ou simplement l’arborescence des appareils. 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 des 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é au 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 des nœuds de l’arborescence d’appareils représentent des bus auxquels des 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, notamment des 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 auquel un périphérique audio est connecté. Nous pouvons voir que le port PCI Express est un bus auquel une carte d’affichage est connectée, et que l’adaptateur d’affichage est un bus auquel un moniteur est connecté.

Le fait de considérer 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 s’affichent à 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 un instance d’une structure DEVICE_OBJECT. Chaque nœud d’appareil de l’arborescence d’appareils PnP a 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 penser à une pile d’appareils de plusieurs manières. 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 des 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 à attacher à 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 d’appareil, pilote). L’objet périphérique supérieur est associé au pilote AfterThought.sys, l’objet périphérique central 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 de périphérique, pilote) : un objet d’appareil associé à Pci.sys et un objet d’appareil associé à Acpi.sys.

diagramme montrant les objets d’appareil classés dans les piles d’appareils dans les nœuds d’appareil gizmo et pci 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 a créé l’ensemble de PDO, l’arborescence de l’appareil ressemble à celle illustrée dans le diagramme suivant.

diagramme des objets de nœud pci et 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 les pilotes qui 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 main de la pile de périphériques 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 lecture, d’écriture et de contrôle d’appareil. Au fur et à mesure que chaque pilote de fonction et de filtre est chargé, il crée un objet d’appareil et s’attache à 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é objet d’appareil de filtre (Filter DO). Maintenant, l’arborescence de l’appareil ressemble à ce diagramme.

diagramme d’une arborescence d’appareil 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 se trouve 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’AOP est toujours l’objet d’appareil inférieur d’une pile d’appareils. Cela résulte de la façon dont une pile d’appareils est construite. Le 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.

Note Lorsque les pilotes d’un appareil sont installés, le programme d’installation utilise les informations d’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 d’autobus

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’AOP dans chaque enfant du nœud PCI Bus. Rappelez-vous qu’il a créé les PDO pour les appareils enfants. Le pilote qui crée l’AOP 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, Pci.sys est le pilote de bus. Ce double rôle est typique dans l’arborescence des 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 d’appareil sont mappés à l’espace système, qui est l’espace d’adressage disponible uniquement pour le code s’exécutant en mode noyau. Pour plus d’informations sur la différence entre le mode noyau et le mode utilisateur, consultez Mode utilisateur et mode noyau.

Dans certains cas, un appareil a 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 le User-Mode Driver Framework (UMDF), qui est l’un des modèles de pilotes fournis par les frameworks de pilotes Windows (WDF). 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 des piles en mode utilisateur et en mode noyau participent aux demandes 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