Partager via


Ajout d’un appareil PnP à un système en cours d’exécution

Cette section décrit la séquence d’événements qui se produisent lorsque le système configure un appareil PnP qu’un utilisateur a ajouté à un ordinateur en cours d’exécution. Cette discussion met en évidence les rôles du gestionnaire PnP, des pilotes de bus et des pilotes de fonction et de filtre dans l’énumération et la configuration d’un nouvel appareil.

La plupart de cette discussion concerne également la configuration d’un appareil PnP présent au démarrage de l’ordinateur. Plus précisément, les appareils dont les pilotes sont marqués SERVICE_DEMAND_START dans un fichier INF sont configurés essentiellement de la même façon, que l’appareil soit ajouté dynamiquement ou présent au moment du démarrage.

La figure suivante illustre les premières étapes de configuration de l’appareil, à partir du moment où l’utilisateur branche le matériel sur l’ordinateur.

diagramme illustrant l’énumération et la création de rapports sur un appareil plug-and-play.

Les notes suivantes correspondent aux nombres cerclé dans la figure précédente :

  1. Un utilisateur branche un appareil PnP dans un emplacement libre sur un bus PnP.

    Dans cet exemple, l’utilisateur branche une manette USB PnP au hub d’un contrôleur hôte USB. Le hub USB est un périphérique de bus PnP, car les appareils enfants peuvent y être attachés.

  2. Le pilote de fonction pour le périphérique de bus détermine qu’un nouvel appareil se trouve sur son bus.

    La façon dont le pilote détermine cela dépend de l’architecture du bus. Pour certains bus, le pilote de fonction bus reçoit une notification de prise à chaud des nouveaux appareils. Si le bus ne prend pas en charge la notification hot-plug, l’utilisateur doit prendre les mesures appropriées dans Panneau de configuration pour énumérer le bus.

    Dans cet exemple, le bus USB prend en charge la notification à chaud afin que le pilote de fonction pour le bus USB soit averti que ses enfants ont changé.

  3. Le pilote de fonction pour le périphérique de bus avertit le gestionnaire PnP que son ensemble d’appareils enfants a changé.

    Le pilote de fonction avertit le gestionnaire PnP en appelant IoInvalidateDeviceRelations avec un typede BusRelations.

  4. Le gestionnaire PnP interroge les pilotes du bus pour obtenir la liste actuelle des appareils sur le bus.

    Le gestionnaire PnP envoie une requête IRP_MN_QUERY_DEVICE_RELATIONS à la pile d’appareils pour le bus. La valeur Parameters.QueryDeviceRelations.Type est BusRelations, ce qui indique que le gestionnaire PnP demande la liste actuelle des appareils présents sur le bus (relations de bus).

    Le gestionnaire PnP envoie l’IRP au pilote supérieur de la pile de périphériques pour le bus. Selon les règles applicables aux runtimes d’intégration PnP, chaque pilote de la pile gère l’IRP, le cas échéant, et transmet l’IRP au pilote suivant.

  5. Le pilote de fonction pour le périphérique de bus gère l’IRP.

    Consultez la page de référence pour IRP_MN_QUERY_DEVICE_RELATIONS pour obtenir des informations détaillées sur la gestion de ce IRP.

    Dans cet exemple, le pilote de hub USB gère cette IRP pour le FDO du hub. Le pilote hub crée une AOP pour le périphérique de manette de jeu et inclut un pointeur référencé vers l’AOP du joystick dans sa liste d’appareils enfants retournés avec l’IRP.

    Lorsque le pilote de bus parent du hub USB (la paire de pilotes de classe de contrôleur hôte USB/miniclasse) termine l’IRP, l’IRP remonte la pile de périphériques au moyen de toutes les routines IoCompletion inscrites par les pilotes hub.

Notez que le pilote de fonction bus signale une modification dans sa liste d’enfants en demandant au gestionnaire PnP d’interroger sa liste d’appareils enfants. La demande de IRP_MN_QUERY_DEVICE_RELATIONS résultante est vue par tous les pilotes de l’appareil de bus. En règle générale, le pilote de fonction de bus est le seul pilote à gérer les IRP et à signaler les enfants. Dans certaines piles d’appareils, un pilote de filtre de bus est présent et participe à la construction de la liste des relations de bus. Un exemple est ACPI, qui s’attache en tant que pilote de filtre de bus pour les appareils ACPI. Dans certaines piles de périphériques, les pilotes de filtre non-bus gèrent la demande de IRP_MN_QUERY_DEVICE_RELATIONS , mais ce n’est pas courant.

À ce stade, le gestionnaire PnP a la liste actuelle des appareils sur le bus. Le gestionnaire PnP détermine ensuite si des appareils sont nouvellement arrivés ou ont été supprimés. Dans cet exemple, il existe un nouvel appareil. La figure suivante montre le gestionnaire PnP qui crée un devnode pour le nouvel appareil et commence à configurer l’appareil.

diagramme illustrant la création d’un devnode pour un nouvel appareil plug-and-play.

Les notes suivantes correspondent aux nombres cerclé dans la figure précédente :

  1. Le gestionnaire PnP crée des devnodes pour tous les nouveaux appareils enfants sur le bus.

    Le gestionnaire PnP compare la liste des relations de bus retournées dans l’IRP IRP_MN_QUERY_DEVICE_RELATIONS à la liste des enfants du bus actuellement enregistré dans l’arborescence d’appareils PnP. Le gestionnaire PnP crée un devnode pour chaque nouvel appareil et lance le traitement de la suppression pour tous les appareils qui ont été supprimés.

    Dans cet exemple, il y a un nouvel appareil (un joystick), de sorte que le gestionnaire PnP crée un devnode pour le joystick. À ce stade, le seul pilote configuré pour la manette de jeu est le pilote de bus hub USB parent, qui a créé l’AOP du joystick. Tous les pilotes de filtre de bus facultatifs sont également présents dans la pile de périphériques, mais l’exemple omet les pilotes de filtre de bus par souci de simplicité.

    La flèche large entre les deux devnodes dans la figure précédente indique que le joystick devnode est un enfant du devnode du hub USB.

  2. Le gestionnaire PnP collecte des informations sur le nouvel appareil et commence à configurer l’appareil.

    Le gestionnaire PnP envoie une séquence d’irps à la pile d’appareils pour collecter des informations sur l’appareil. À ce stade, la pile de périphériques se compose uniquement de l’AOP créée par le pilote de bus parent de l’appareil et des DOS de filtre pour tous les pilotes de filtre de bus facultatifs. Par conséquent, le pilote de bus et les pilotes de filtre de bus sont les seuls pilotes qui répondent à ces IRP. Dans cet exemple, le seul pilote de la pile de périphériques de manette de jeu est le pilote de bus parent, le pilote de hub USB.

    Le gestionnaire PnP collecte des informations sur un nouvel appareil en envoyant des irps à la pile d’appareils. Ces IRP incluent les éléments suivants :

    Le gestionnaire PnP envoie les IRP répertoriés ci-dessus à ce stade de traitement d’un nouvel appareil PnP, mais pas nécessairement dans l’ordre indiqué. Vous ne devez donc pas faire d’hypothèses sur l’ordre dans lequel les IRP sont envoyés. En outre, vous ne devez pas supposer que le gestionnaire PnP envoie uniquement les IRP répertoriés ci-dessus.

    Le gestionnaire PnP vérifie le Registre pour déterminer si l’appareil a déjà été installé sur cet ordinateur. Le gestionnaire PnP recherche une < sous-clé énumérateur>\<deviceID> pour l’appareil sous la branche Enum. Dans cet exemple, l’appareil est nouveau et doit être configuré « à partir de zéro ».

  3. Le gestionnaire PnP stocke des informations sur l’appareil dans le Registre.

    La branche Enum du Registre est réservée aux composants du système d’exploitation et sa disposition est susceptible d’être modifiée. Les enregistreurs de pilotes doivent utiliser des routines système pour extraire des informations relatives aux pilotes. N’accédez pas directement à la branche Enum à partir d’un pilote. Les informations Enum suivantes sont répertoriées à des fins de débogage uniquement.

    • Le gestionnaire PnP crée une sous-clé pour l’appareil sous la clé de l’énumérateur de l’appareil.

      Le gestionnaire PnP crée une sous-clé nommée HKLM\System\CurrentControlSet\Enum\enum\<enumerator>\<deviceID>. Elle crée la < sous-clé énumérateur> si elle n’existe pas déjà.

      Un énumérateur est un composant qui découvre des appareils PnP basés sur une norme matérielle PnP. Les tâches d’un énumérateur sont effectuées par un conducteur de bus PnP en partenariat avec le responsable PnP. Un appareil est généralement énuméré par son pilote de bus parent, tel que PCI ou PCMCIA. Certains appareils sont énumérés par un pilote de filtre de bus, tel qu’ACPI.

    • Le gestionnaire PnP crée une sous-clé pour cette instance de l’appareil.

      Si Capabilities.UniqueID est retourné au format TRUE pour IRP_MN_QUERY_CAPABILITIES, l’ID unique de l’appareil est unique dans le système. Si ce n’est pas le cas, le gestionnaire PnP modifie l’ID afin qu’il soit unique à l’échelle du système.

      Le gestionnaire PnP crée une sous-clé nommée HKLM\System\CurrentControlSet\Enum\enum\enum\<enumerator\<>deviceID>\<instanceID>.

    • Le gestionnaire PnP écrit des informations sur l’appareil dans la sous-clé de l’appareil instance.

      Le gestionnaire PnP stocke les informations, notamment les suivantes, si elles ont été fournies pour l’appareil :

      DeviceDesc — à partir de IRP_MN_QUERY_DEVICE_TEXT

      Emplacement : à partir de IRP_MN_QUERY_DEVICE_TEXT

      Fonctionnalités : indicateurs de IRP_MN_QUERY_CAPABILITIES

      UINumber — à partir de IRP_MN_QUERY_CAPABILITIES

      HardwareID : à partir de IRP_MN_QUERY_ID

      CompatibleIDs : à partir de IRP_MN_QUERY_ID

      ContainerID : à partir de IRP_MN_QUERY_ID

      LogConf\BootConfig — à partir de IRP_MN_QUERY_RESOURCES

      LogConf\BasicConfigVector — à partir de IRP_MN_QUERY_RESOURCE_REQUIREMENTS

À ce stade, le gestionnaire PnP est prêt à localiser le pilote de fonction et les pilotes de filtre pour l’appareil, le cas échéant. (Voir la figure suivante.)

diagramme illustrant la recherche de pilotes de fonction et de filtre.

Les notes suivantes correspondent aux cercles numérotés de la figure précédente :

  1. Le gestionnaire PnP en mode noyau se coordonne avec le gestionnaire PnP en mode utilisateur et les composants d’installation en mode utilisateur pour rechercher les pilotes de fonction et de filtre pour l’appareil, le cas échéant.

    Le gestionnaire PnP en mode noyau met en file d’attente un événement vers le gestionnaire PnP en mode utilisateur, identifiant un appareil qui doit être installé. Une fois qu’un utilisateur privilégié se connecte, les composants en mode utilisateur recherchent les pilotes. Pour plus d’informations sur les composants d’installation et leur rôle dans l’installation d’un appareil, consultez Vue d’ensemble de l’installation d’un appareil.

  2. Les composants d’installation en mode utilisateur dirigent le gestionnaire PnP en mode noyau pour charger les pilotes de fonction et de filtre.

    Les composants en mode utilisateur rappellent en mode noyau pour charger les pilotes, ce qui entraîne l’appel de leurs routines AddDevice .

L’illustration suivante montre le gestionnaire PnP qui charge les pilotes (le cas échéant), appelle leurs routines AddDevice et dirige les pilotes pour démarrer l’appareil.

diagramme illustrant l’appel de routines adddevice et le démarrage du nouvel appareil.

Les notes suivantes correspondent aux cercles numérotés de la figure précédente :

  1. Pilotes à filtre inférieur

    Avant que le pilote de fonction ne s’attache à la pile de périphériques, le gestionnaire PnP traite tous les pilotes à filtre inférieur. Pour chaque pilote à filtre inférieur, le gestionnaire PnP appelle la routine DriverEntry du pilote si le pilote n’est pas encore chargé. Ensuite, le gestionnaire PnP appelle la routine AddDevice du pilote. Dans sa routine AddDevice , le pilote de filtre crée un objet de périphérique de filtre (filter DO) et l’attache à la pile d’appareils (IoAttachDeviceToDeviceStack). Une fois qu’il a attaché son objet d’appareil à la pile de périphériques, le pilote est engagé en tant que pilote pour l’appareil.

    Dans l’exemple de joystick USB, il existe un pilote de filtre inférieur pour l’appareil.

  2. Pilote de fonction

    Une fois les filtres inférieurs attachés, le gestionnaire PnP traite le pilote de fonction. Le gestionnaire PnP appelle la routine DriverEntry du pilote de fonction si le pilote n’est pas encore chargé et appelle la routine AddDevice du pilote de fonction. Le pilote de fonction crée un objet de périphérique de fonction (FDO) et l’attache à la pile d’appareils.

    Dans cet exemple, le pilote de fonction du joystick USB est en fait une paire de pilotes : le pilote de classe HID et le pilote de la mini-classe HID. Les deux pilotes fonctionnent ensemble pour servir de pilote de fonction. La paire de pilotes crée un seul FDO et l’attache à la pile d’appareils.

  3. Pilotes de filtre supérieur

    Une fois le pilote de fonction attaché, le gestionnaire PnP traite les pilotes de filtre supérieur.

    Dans cet exemple, il existe un pilote de filtre supérieur pour l’appareil.

  4. Affectation de ressources et démarrage de l’appareil

    Le gestionnaire PnP affecte des ressources à l’appareil, si nécessaire, et émet un IRP pour démarrer l’appareil.

    • Affectation de ressources

      Plus tôt dans le processus de configuration, le gestionnaire PnP a collecté les ressources matérielles requises pour l’appareil à partir du pilote de bus parent de l’appareil. Une fois l’ensemble complet de pilotes chargé pour l’appareil, le gestionnaire PnP envoie une requête IRP_MN_FILTER_RESOURCE_REQUIREMENTS à la pile d’appareils. Tous les pilotes de la pile ont la possibilité de gérer cette IRP et de modifier la liste des besoins en ressources de l’appareil, si nécessaire.

      Le gestionnaire PnP affecte des ressources à l’appareil, si l’appareil en a besoin, en fonction des exigences de l’appareil et des ressources actuellement disponibles.

      Le gestionnaire PnP peut avoir besoin de réorganiser les attributions de ressources des appareils existants pour répondre aux besoins du nouvel appareil. Cette réaffectation des ressources est appelée « rééquilibrage ». Les pilotes des appareils existants reçoivent une séquence d’arrêt et de démarrage des IRP pendant un rééquilibrage, mais le rééquilibrage doit être transparent pour les utilisateurs.

      Dans l’exemple du joystick USB, les périphériques USB ne nécessitent pas de ressources matérielles. Le gestionnaire PnP définit la liste des ressources sur NULL.

    • Démarrage de l’appareil (IRP_MN_START_DEVICE)

      Une fois que le gestionnaire PnP affecte des ressources à l’appareil, il envoie une IRP_MN_START_DEVICE IRP à la pile de l’appareil pour diriger les pilotes pour démarrer l’appareil.

    Une fois l’appareil démarré, le gestionnaire PnP envoie trois autres IIP aux pilotes de l’appareil :

    • IRP_MN_QUERY_CAPABILITIES

      Une fois l’IRP de démarrage terminée, le gestionnaire PnP envoie un autre IRP_MN_QUERY_CAPABILITIES IRP à la pile de l’appareil. Tous les pilotes de l’appareil ont la possibilité de gérer l’IRP. Le gestionnaire PnP envoie cette IRP à ce stade, une fois que tous les pilotes sont attachés et que l’appareil a démarré, car les pilotes de fonction ou de filtre peuvent avoir besoin d’accéder à l’appareil pour collecter des informations sur la capacité.

    • IRP_MN_QUERY_PNP_DEVICE_STATE

      Cette IRP permet à un pilote, par exemple, de signaler que l’appareil ne doit pas être affiché dans les interfaces utilisateur telles que Gestionnaire de périphériques et le programme Hotplug. Cela est utile pour les appareils qui sont présents sur un système mais qui ne sont pas utilisables dans la configuration actuelle, comme un port de jeu sur un ordinateur portable qui n’est pas utilisable lorsque l’ordinateur portable est déplié.

    • IRP_MN_QUERY_DEVICE_RELATIONS pour les relations de bus

      Le gestionnaire PnP envoie cette IRP pour déterminer si l’appareil a des appareils enfants. Si c’est le cas, le gestionnaire PnP configure chaque appareil enfant.

Utilisation de GUID_PNP_LOCATION_INTERFACE

L’interface GUID_PNP_LOCATION_INTERFACE fournit la propriété d’appareil SPDRP_LOCATION_PATHS Plug-and-Play (PnP) pour un appareil.

Pour implémenter cette interface dans votre pilote, gérez le IRP_MN_QUERY_INTERFACE IRP avec InterfaceType = GUID_PNP_LOCATION_INTERFACE. Votre pilote fournit un pointeur vers une structure PNP_LOCATION_INTERFACE qui contient des pointeurs vers les routines individuelles de l’interface. La routine PnpGetLocationString fournit la partie spécifique de l’appareil de la propriété SPDRP_LOCATION_PATHS de l’appareil.