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 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 ces discussions concernent également la configuration d’un appareil PnP présent lorsque l’ordinateur est démarré. Plus précisément, les périphériques dont les pilotes sont marqués SERVICE_DEMAND_START dans un fichier INF sont configurés de la même façon que l’appareil soit ajouté dynamiquement ou présent au moment du démarrage.

La figure suivante montre les premières étapes de configuration de l’appareil, à partir du moment où l’utilisateur connecte le matériel à la machine.

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

Les notes suivantes correspondent aux nombres encerclés à la figure précédente :

  1. Un utilisateur connecte un appareil PnP à un emplacement libre sur un bus PnP.

    Dans cet exemple, l’utilisateur branche un joystick USB PnP dans le hub sur un contrôleur hôte USB. Le hub USB est un périphérique de bus PnP, car les appareils enfants peuvent être attachés à celui-ci.

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

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

    Dans cet exemple, le bus USB prend en charge la notification de hot-plug, donc le pilote de fonction du bus USB est notifié que ses enfants ont changé.

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

    Le pilote de fonction notifie le gestionnaire PnP en appelant IoInvalidateDeviceRelations avec un Type de 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 demande IRP_MN_QUERY_DEVICE_RELATIONS à la pile de périphériques pour le bus. La valeur Parameters.QueryDeviceRelations.Type est BusRelations, indiquant 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 dans la pile d’appareils du bus. Selon les règles pour les IRP PnP, chaque driver de la pile gère l'IRP, le cas échéant, et transmet l'IRP au driver 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 cet IRP.

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

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

Notez que le pilote de fonction bus signale une modification dans sa liste d’enfants en demandant que le gestionnaire PnP interroge sa liste de périphériques enfants. La demande résultante IRP_MN_QUERY_DEVICE_RELATIONS est vue par tous les pilotes pour le périphérique de bus. En règle générale, le pilote de fonction bus est le seul pilote à gérer l’IRP et à signaler les enfants. Dans certaines piles de dispositifs, 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 IRP_MN_QUERY_DEVICE_RELATIONS, mais ce n’est pas typique.

À ce stade, le gestionnaire PnP contient la liste actuelle des appareils sur le bus. Le gestionnaire PnP détermine ensuite si des appareils sont récemment 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 numéros encerclés de la figure précédente :

  1. Le gestionnaire PnP crée des devnodes pour tout nouvel appareil enfant sur le bus.

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

    Dans cet exemple, il existe un nouvel appareil (un joystick), donc le gestionnaire PnP crée un devnode pour le joystick. À ce stade, le seul pilote configuré pour le joystick est le pilote de bus du hub USB parent, qui a créé le PDO du joystick. Tous les pilotes de filtre de bus facultatifs sont également présents dans la pile d’appareils, 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 devnode du joystick est un enfant du devnode du concentrateur 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 du PDO créé par le pilote de bus parent de l’appareil et des DO de filtre pour tous les pilotes de filtre de bus optionnels. Par conséquent, le pilote de bus et les pilotes de filtre de bus sont les seuls pilotes qui répondent à ces IRPs. Dans cet exemple, le seul pilote de la pile de périphériques joystick est le pilote de bus parent, le pilote du hub USB.

    Le gestionnaire PnP collecte des informations sur un nouvel appareil en envoyant des IRP à la pile de périphériques. Ces IRP incluent les éléments suivants :

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

    Le gestionnaire PnP vérifie le Registre pour déterminer si l’appareil a été installé sur cet ordinateur précédemment. Le gestionnaire PnP vérifie la présence d’une sous-clé <enumerator>\<deviceID> pour le périphérique 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 à une utilisation par les composants du système d’exploitation et sa disposition est susceptible de changer. Les rédacteurs de pilotes doivent utiliser les routines système pour extraire les informations liées aux pilotes. Ne pas accéder directement à la branche Enum depuis un pilote. Les informations suivantes Enum sont listées uniquement à des fins de débogage.

    • 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\<énumérateur>\<deviceID>. Il crée la sous-clé d’é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 pilote 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 que ACPI.

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

      Si Capabilities.UniqueID est retourné comme TRUE pour IRP_MN_QUERY_CAPABILITIES, l’ID unique de l’appareil est unique sur 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\<énumérateur>\<deviceID>\<instanceID>.

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

      Le gestionnaire PnP stocke des informations, notamment les suivantes, si elle a été fournie pour l’appareil :

      DeviceDesc — depuis IRP_MN_QUERY_DEVICE_TEXT

      Location — depuis IRP_MN_QUERY_DEVICE_TEXT

      Capabilities — les indicateurs de IRP_MN_QUERY_CAPABILITIES

      UINumber — depuis IRP_MN_QUERY_CAPABILITIES

      HardwareID — depuis IRP_MN_QUERY_ID

      CompatibleIDs — depuis IRP_MN_QUERY_ID

      ContainerID — depuis IRP_MN_QUERY_ID

      LogConf\BootConfig — depuis IRP_MN_QUERY_RESOURCES

      LogConf\BasicConfigVector — depuis IRP_MN_QUERY_RESOURCE_REQUIREMENTS

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

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

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

  1. Le gestionnaire PnP en mode noyau 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 effectuent la recherche de pilotes. Consultez la vue d’ensemble de l’installation de l’appareil Pour plus d’informations sur les composants d’installation et leur rôle dans 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 font appel au mode noyau pour que les pilotes soient chargés, ce qui entraîne l’appel de leurs routines AddDevice.

La figure suivante montre le gestionnaire PnP chargeant les pilotes (si approprié), appelant leurs routines AddDevice et dirigeant 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 de 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 de filtre inférieur. Pour chaque pilote de 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 (DO de filtre) et l’attache à la pile de périphériques (IoAttachDeviceToDeviceStack). Une fois qu'il attache son objet de périphérique à la pile de périphériques, le pilote devient actif en tant que pilote du périphérique.

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

  2. Pilote de fonction

    Après que tous les filtres inférieurs sont 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 de périphériques.

    Dans cet exemple, le pilote de fonction pour le joystick USB est en fait une paire de pilotes : le pilote de classe HID et le pilote de miniclasse HID. Les deux pilotes travaillent ensemble pour servir de pilote de fonction. La paire de pilotes crée un seul FDO et l’attache à la pile de périphériques.

  3. Pilotes de filtre supérieur

    Après que le pilote de fonction est attaché, le gestionnaire PnP traite tous 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é la configuration matérielle requise pour l’appareil à partir du pilote de bus parent de l’appareil. Après que l’ensemble complet des pilotes est chargé pour l’appareil, le gestionnaire PnP envoie une demande IRP_MN_FILTER_RESOURCE_REQUIREMENTS à la pile de périphériques. Tous les pilotes de la pile de réseau ont la possibilité de gérer cet 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 affectations 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 d’IRPs 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, de sorte que 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 d’appareils afin d'ordonner aux pilotes de démarrer l’appareil.

    Une fois l’appareil démarré, le gestionnaire PnP envoie trois adresses IP supplémentaires aux pilotes de l’appareil :

    • IRP_MN_QUERY_CAPABILITIES

      Après que l’IRP de démarrage se termine avec succès, le gestionnaire PnP envoie un autre IRP IRP_MN_QUERY_CAPABILITIES à la pile de périphériques. Tous les pilotes de l’appareil ont la possibilité de gérer l’IRP. Le gestionnaire PnP envoie cet IRP à ce moment-là, une fois que tous les pilotes sont attachés et que l’appareil est démarré, car les pilotes de fonction ou de filtre peuvent avoir besoin d’accéder à l’appareil pour collecter des informations de capacité.

    • IRP_MN_QUERY_PNP_DEVICE_STATE

      Cet IRP donne à un pilote la possibilité, par exemple, de signaler que l’appareil ne doit pas être affiché dans les interfaces utilisateur telles que Device Manager et le programme Hotplug. Cela est utile pour les appareils qui sont présents sur un système mais 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éconnecté.

    • IRP_MN_QUERY_DEVICE_RELATIONS pour les relations de bus

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

Utilisation de l'interface de localisation GUID_PNP

L’interface GUID_PNP_LOCATION_INTERFACE fournit la propriété SPDRP_LOCATION_PATHS Plug and Play (PnP) pour un périphérique.

Pour implémenter cette interface dans votre pilote, gérez l’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 à l’appareil de la propriété SPDRP_LOCATION_PATHS du périphérique.