Partager via


Spécification de l’ordre de chargement du pilote

Pour la plupart des systèmes, la hiérarchie physique des appareils sur un ordinateur détermine l’ordre de chargement des pilotes Windows et du gestionnaire PnP. Windows et le gestionnaire PnP configurent les appareils en commençant par l’appareil racine du système, puis ils configurent les appareils enfants de l’appareil racine (par exemple, un adaptateur PCI), les enfants de ces appareils, etc. Le gestionnaire PnP charge les pilotes pour chaque appareil au fur et à mesure que l’appareil est configuré, si les pilotes n’ont pas été précédemment chargés pour un autre appareil.

Les paramètres du fichier INF peuvent influencer l’ordre de chargement du pilote. Cette rubrique décrit les valeurs pertinentes que les fournisseurs doivent spécifier dans la section d’installation de service référencée par la directive AddService INF d’un pilote. Plus précisément, cette rubrique traite des entrées StartType, BootFlags, LoadOrderGroup et Dependencies .

Les pilotes doivent suivre ces règles pour spécifier StartType :

  • Pilote PnP non nécessaire au début du démarrage

    Un pilote PnP doit avoir un type de démarrage de SERVICE_DEMAND_START (0x3), spécifiant que le gestionnaire PnP peut charger le pilote lorsque le gestionnaire PnP trouve un périphérique que le pilote dessert.

  • Pilote pour un périphérique requis pour démarrer l’ordinateur

    Si un appareil est requis pour démarrer l’ordinateur, les pilotes du périphérique doivent avoir un type de démarrage de SERVICE_BOOT_START (0x0).

  • Pilote sans démarrage qui détecte le ou les périphériques qui ne sont pas énumérables pnP

    Pour un appareil qui n’est pas énumérable PnP, un pilote signale l’appareil au gestionnaire PnP en appelant IoReportRootDevice ou IoReportDetectedDevice. Ce pilote doit avoir le type de démarrage SERVICE_SYSTEM_START (0x01) afin que Windows charge le pilote lors de l’initialisation du système.

    Seuls les pilotes qui signalent du matériel non PnP doivent définir ce type de démarrage. Si un pilote prend en charge les appareils PnP et non PnP, il doit définir ce type de démarrage.

  • Pilote non PnP qui doit être démarré par le gestionnaire de contrôle de service

    Un tel pilote doit avoir le type de démarrage SERVICE_AUTO_START (0x02). Les pilotes PnP ne doivent pas définir ce type de démarrage.

Un pilote PnP doit être écrit afin qu’il puisse être chargé lorsque Windows configure un appareil que le pilote dessert. À l’inverse, un pilote doit pouvoir être déchargé chaque fois que le gestionnaire PnP détermine qu’il n’y a plus d’appareils présents que le pilote services. Les seuls ordres de chargement de pilotes dont les pilotes PnP doivent dépendre sont les suivants :

  1. Les pilotes d’un appareil enfant peuvent dépendre du fait que les pilotes du périphérique parent sont chargés.

  2. Un pilote dans la pile de périphériques peut dépendre du fait que tous les pilotes en dessous sont chargés.

    Par exemple, le pilote de fonction peut être certain que tous les pilotes à filtre inférieur sont chargés.

    Toutefois, n’oubliez pas qu’un pilote dans la pile de périphériques ne peut pas dépendre d’un chargement séquentiel après les pilotes inférieurs d’un périphérique, car le pilote a peut-être été chargé précédemment lors de la configuration d’un autre appareil.

Les pilotes de filtre dans un groupe de filtres ne peuvent pas prédire leur ordre de charge. Par exemple, si un appareil a trois pilotes de filtre supérieur inscrits, ces trois pilotes sont tous chargés après le pilote de fonction, mais peuvent être chargés dans n’importe quel ordre au sein de leur groupe de filtres supérieurs.

Si un pilote a une dépendance d’ordre de charge explicite sur un autre pilote, cette dépendance doit être implémentée par le biais d’une relation parent/enfant. Un pilote pour un appareil enfant peut dépendre des pilotes du périphérique parent chargés avant le chargement des pilotes enfants.

Pour renforcer l’importance de définir la valeur StartType correcte, la liste suivante décrit comment Windows et le gestionnaire PnP utilisent les entrées StartType dans les fichiers INF :

  1. Au démarrage du système, le chargeur de système d’exploitation charge les pilotes de type SERVICE_BOOT_START avant de transférer le contrôle au noyau. Ces pilotes sont en mémoire lorsque le noyau obtient le contrôle.

    Les pilotes de démarrage et de démarrage sont chargés avant la configuration de la plupart des appareils, de sorte que leur ordre de chargement ne peut pas être déterminé par la hiérarchie des appareils. Les pilotes de démarrage peuvent utiliser les entrées INF LoadOrderGroup pour ordonner leur chargement. Le système d’exploitation ignore les entrées des dépendances INF pour les pilotes de démarrage-démarrage.

  2. Le gestionnaire PnP appelle les routines DriverEntry des pilotes SERVICE_BOOT_START afin que les pilotes puissent traiter les périphériques de démarrage.

    Si un appareil de démarrage a des appareils enfants, ces appareils sont énumérés. Les appareils enfants sont configurés et démarrés si leurs pilotes sont également des pilotes de démarrage. Si les pilotes d’un appareil ne sont pas tous des pilotes de démarrage, le gestionnaire PnP crée un nœud de périphérique (devnode) pour l’appareil, mais ne le démarre pas encore.

  3. Une fois tous les pilotes de démarrage chargés et les périphériques de démarrage démarrés, le gestionnaire PnP configure le reste des périphériques PnP et charge leurs pilotes.

    Le gestionnaire PnP guide l’arborescence des appareils et charge les pilotes pour les devnodes qui ne sont pas encore démarrés (autrement dit, tous les devnodes non démarrés de l’étape précédente). Au démarrage de chaque appareil, le gestionnaire PnP énumère les enfants de l’appareil, le cas échéant.

    Lors de la configuration de ces appareils, le gestionnaire PnP charge les pilotes pour les appareils, quelles que soient les valeurs StartType des pilotes (sauf lorsque StartType est SERVICE_DISABLED) avant de continuer à démarrer les appareils. Bon nombre de ces conducteurs sont SERVICE_DEMAND_START conducteurs.

    Le gestionnaire PnP ignore les entrées de Registre qui ont été créées à la suite des entrées INF Dependencies et des entrées LoadOrderGroup pour les pilotes qu’il charge au cours de cette étape. L’ordre de charge est basé sur la hiérarchie des appareils physiques.

    À la fin de cette étape, tous les appareils sont configurés, à l’exception des appareils qui ne sont pas énumérables pnP et des descendants de ces appareils. (Les descendants peuvent ou non être énumérables pnP.)

  4. Le gestionnaire PnP charge les pilotes startType SERVICE_SYSTEM_START qui ne sont pas encore chargés.

    Ces pilotes détectent et signalent leurs appareils non PnP. Le gestionnaire PnP traite les entrées de Registre qui sont le résultat des entrées INF LoadOrderGroup pour ces pilotes. Il ignore les entrées de Registre qui ont été créées en raison d’entrées de dépendances INF pour ces pilotes.

  5. Le gestionnaire de contrôle de service charge les pilotes starttype SERVICE_AUTO_START qui ne sont pas encore chargés.

    Le gestionnaire de contrôle de service traite les informations de base de données de service en ce qui concerne les services DependOnGroup et DependOnServices. Ces informations proviennent des entrées Dépendances dans les entrées Inf AddService . N’oubliez pas que les informations dépendances ne sont traitées que pour les pilotes non PnP, car tous les pilotes PnP nécessaires ont été chargés lors d’une étape antérieure du démarrage du système. Le gestionnaire de contrôle de service ignore les informations INF LoadOrderGroup .

    Pour plus d’informations sur le gestionnaire de contrôle de service, consultez la documentation Microsoft Windows SDK.

Utilisation de BootFlags pour promouvoir le startType d’un pilote au démarrage en fonction du scénario de démarrage

Le système d’exploitation peut promouvoir le StartType d’un pilote en tant que pilote de démarrage en fonction de la valeur BootFlags spécifiée dans l’INF du pilote. Vous pouvez spécifier une ou plusieurs (ORed) des valeurs numériques suivantes dans le fichier INF, exprimées sous forme de valeur hexadécimale :

  • Si un pilote doit être promu comme pilote de démarrage au démarrage réseau, spécifiez 0x1 (CM_SERVICE_NETWORK_BOOT_LOAD).
  • Si un pilote doit être promu au démarrage à partir d’un disque dur virtuel, spécifiez 0x2 (CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD)
  • Si un pilote doit être promu lors du démarrage à partir d’un disque USB, spécifiez 0x4 (CM_SERVICE_USB_DISK_BOOT_LOAD).
  • Si un pilote doit être promu lors du démarrage à partir du stockage SD, spécifiez 0x8 (CM_SERVICE_SD_DISK_BOOT_LOAD)
  • Si un pilote doit être promu lors du démarrage à partir d’un disque sur un contrôleur USB 3.0, spécifiez 0x10 (CM_SERVICE_USB3_DISK_BOOT_LOAD).
  • Si un pilote doit être promu lors du démarrage avec le démarrage mesuré activé, spécifiez 0x20 (CM_SERVICE_MEASURED_BOOT_LOAD).
  • Si un pilote doit être promu lors du démarrage avec le démarrage du vérificateur activé, spécifiez 0x40 (CM_SERVICE_VERIFIER_BOOT_LOAD).
  • Si un pilote doit être promu au démarrage WinPE, spécifiez 0x80 (CM_SERVICE_WINPE_BOOT_LOAD).

Pour plus d’informations sur la promotion du StartType d’un pilote au démarrage, en fonction du scénario de démarrage, consultez Directive AddService INF.