Angeben der Treiberladereihenfolge

Bei den meisten Systemen bestimmt die physische Hierarchie der Geräte auf einem Computer die Reihenfolge, in der Windows und der PnP-Manager Treiber laden. Windows und der PnP-Manager konfigurieren Geräte, die mit dem Systemstammgerät beginnen, und dann konfigurieren sie die untergeordneten Geräte des Stammgeräts (z. B. einen PCI-Adapter), die untergeordneten Geräte dieser Geräte usw. Der PnP-Manager lädt die Treiber für jedes Gerät, wenn das Gerät konfiguriert ist, wenn die Treiber zuvor nicht für ein anderes Gerät geladen wurden.

Einstellungen in der INF-Datei können die Ladereihenfolge des Treibers beeinflussen. In diesem Thema werden die relevanten Werte beschrieben, die Anbieter im Abschnitt service-install-reference (Dienstinstallation ) angeben sollten, auf den durch die INF AddService-Direktive eines Treibers verwiesen wird. In diesem Thema werden insbesondere die Einträge StartType, BootFlags, LoadOrderGroup und Dependencies behandelt.

Treiber sollten die folgenden Regeln für die Angabe von StartType befolgen:

  • PnP-Treiber nicht zu einem frühen Start erforderlich

    Ein PnP-Treiber sollte über einen Starttyp SERVICE_DEMAND_START (0x3) verfügen, der angibt, dass der PnP-Manager den Treiber laden kann, wenn der PnP-Manager ein Gerät findet, das der Treiber verwendet.

  • Treiber für ein Gerät, das zum Starten des Computers erforderlich ist

    Wenn ein Gerät zum Starten des Computers erforderlich ist, sollten die Treiber für das Gerät über den Starttyp SERVICE_BOOT_START (0x0) verfügen.

  • Nicht startbarer Treiber , der Geräte erkennt, die nicht PnP-enumerierbar sind

    Für ein Gerät, das nicht PnP-enumerierbar ist, meldet ein Treiber das Gerät an den PnP-Manager, indem er IoReportRootDevice oder IoReportDetectedDevice aufruft. Ein solcher Treiber sollte über den Starttyp SERVICE_SYSTEM_START (0x01) verfügen, damit Windows den Treiber während der Systeminitialisierung lädt.

    Nur Treiber, die Nicht-PnP-Hardware melden, sollten diesen Starttyp festlegen. Wenn ein Treiber sowohl PnP- als auch Nicht-PnP-Geräte verwendet, sollte dieser Starttyp festgelegt werden.

  • Nicht-PnP-Treiber, der vom Dienststeuerungs-Manager gestartet werden muss

    Ein solcher Treiber sollte den Starttyp SERVICE_AUTO_START (0x02) aufweisen. PnP-Treiber dürfen diesen Starttyp nicht festlegen.

Ein PnP-Treiber sollte so geschrieben werden, dass er geladen werden kann, wenn Windows ein Gerät konfiguriert, das vom Treiber verarbeitet wird. Umgekehrt sollte ein Treiber jederzeit entladen werden können, wenn der PnP-Manager feststellt, dass keine Geräte mehr vorhanden sind, die der Treiber verwaltet. Die einzigen Treiberladereihenfolgen, von denen PnP-Treiber abhängen sollten, sind die folgenden:

  1. Die Treiber für ein untergeordnetes Gerät können davon abhängen, dass die Treiber für das übergeordnete Gerät geladen sind.

  2. Ein Treiber im Gerätestapel kann davon abhängen, dass alle Treiber darunter geladen werden.

    Beispielsweise kann der Funktionstreiber sicher sein, dass alle Treiber mit niedrigeren Filtern geladen werden.

    Beachten Sie jedoch, dass ein Treiber im Gerätestapel nicht davon abhängig sein kann, sequenziell nach den niedrigeren Treibern eines Geräts geladen zu werden, da der Treiber möglicherweise zuvor geladen wurde, als ein anderes Gerät konfiguriert wurde.

Filtertreiber in einer Filtergruppe können ihre Lastreihenfolge nicht vorhersagen. Wenn ein Gerät z. B. über drei registrierte Obere Filtertreiber verfügt, werden diese drei Treiber alle nach dem Funktionstreiber geladen, können aber in beliebiger Reihenfolge innerhalb ihrer oberen Filtergruppe geladen werden.

Wenn ein Treiber eine explizite Ladereihenfolgenabhängigkeit von einem anderen Treiber aufweist, sollte diese Abhängigkeit über eine Über-/Untergeordnete Beziehung implementiert werden. Ein Treiber für ein untergeordnetes Gerät kann davon abhängen, welche Treiber für das übergeordnete Gerät geladen werden, bevor die untergeordneten Treiber geladen werden.

Um die Wichtigkeit des Festlegens des richtigen StartType-Werts zu verstärken, wird in der folgenden Liste beschrieben, wie Windows und der PnP-Manager die StartType-Einträge in INF-Dateien verwenden:

  1. Beim Systemstart lädt das Betriebssystemladeprogramm Treiber vom Typ SERVICE_BOOT_START, bevor er die Steuerung an den Kernel überträgt. Diese Treiber befinden sich im Arbeitsspeicher, wenn der Kernel die Kontrolle erhält.

    Starttreiber werden geladen, bevor die meisten Geräte konfiguriert sind, sodass ihre Ladereihenfolge nicht durch die Gerätehierarchie bestimmt werden kann. Starttreiber können INF LoadOrderGroup-Einträge verwenden, um deren Ladevorgang zu sortieren. Das Betriebssystem ignoriert INF Dependencies-Einträge für Starttreiber.

  2. Der PnP-Manager ruft die DriverEntry-Routinen der SERVICE_BOOT_START-Treiber auf, damit die Treiber die Startgeräte bedienen können.

    Wenn ein Startgerät über untergeordnete Geräte verfügt, werden diese Geräte aufgelistet. Die untergeordneten Geräte werden konfiguriert und gestartet, wenn ihre Treiber auch Starttreiber sind. Wenn die Treiber eines Geräts nicht alle Starttreiber sind, erstellt der PnP-Manager einen Geräteknoten (Devnode) für das Gerät, startet das Gerät jedoch noch nicht.

  3. Nachdem alle Starttreiber geladen und die Startgeräte gestartet wurden, konfiguriert der PnP-Manager die restlichen PnP-Geräte und lädt deren Treiber.

    Der PnP-Manager durchläuft die Gerätestruktur und lädt die Treiber für die noch nicht gestarteten Devnodes (d. a. alle nicht gestarteten Devnodes aus dem vorherigen Schritt). Wenn jedes Gerät gestartet wird, listet der PnP-Manager ggf. die untergeordneten Elemente des Geräts auf.

    Während der Konfiguration dieser Geräte lädt der PnP-Manager die Treiber für die Geräte, unabhängig von den StartType-Werten des Treibers (außer wenn StartType SERVICE_DISABLED ist), bevor er mit dem Starten der Geräte fortschreitet. Viele dieser Treiber sind SERVICE_DEMAND_START Treiber.

    Der PnP-Manager ignoriert Registrierungseinträge, die als Ergebnis von INF Dependencies-Einträgen und LoadOrderGroup-Einträgen für Treiber erstellt wurden, die er in diesem Schritt lädt. Die Ladereihenfolge basiert auf der Hierarchie des physischen Geräts.

    Am Ende dieses Schritts werden alle Geräte konfiguriert, mit Ausnahme von Geräten, die nicht PnP-enumerierbar sind, und die Nachfolger dieser Geräte. (Die Nachfolger sind möglicherweise PnP-enumerierbar.)

  4. Der PnP-Manager lädt Treiber von StartType SERVICE_SYSTEM_START, die noch nicht geladen wurden.

    Diese Treiber erkennen und melden ihre Nicht-PnP-Geräte. Der PnP-Manager verarbeitet Registrierungseinträge, die das Ergebnis von INF LoadOrderGroup-Einträgen für diese Treiber sind. Es ignoriert Registrierungseinträge, die aufgrund von INF-Abhängigkeitseinträgen für diese Treiber erstellt wurden.

  5. Der Dienststeuerungs-Manager lädt Treiber von StartType SERVICE_AUTO_START, die noch nicht geladen wurden.

    Der Dienststeuerungs-Manager verarbeitet die Dienstdatenbankinformationen in Bezug auf die DependOnGroup und DependOnServices der Dienste. Diese Informationen stammen aus Abhängigkeitseinträgen in INF AddService-Einträgen . Beachten Sie, dass die Abhängigkeitsinformationen nur für Nicht-PnP-Treiber verarbeitet werden, da alle erforderlichen PnP-Treiber in einem früheren Schritt des Systemstarts geladen wurden. Der Dienststeuerungs-Manager ignoriert INF LoadOrderGroup-Informationen .

    Weitere Informationen zum Dienststeuerungs-Manager finden Sie in der Microsoft Windows SDK-Dokumentation.

Verwenden von BootFlags zum Höherstufen des Starttyps eines Treibers beim Start je nach Startszenario

Das Betriebssystem kann den StartType eines Treibers je nach bootFlags-Wert , der im INF des Treibers angegeben ist, zu einem Startstarttreiber heraufstufen. Sie können einen oder mehrere (ORed) der folgenden numerischen Werte in der INF-Datei angeben, ausgedrückt als Hexadezimalwert:

  • Wenn ein Treiber beim Netzwerkstart zu einem Starttreiber heraufgestuft werden soll, geben Sie 0x1 (CM_SERVICE_NETWORK_BOOT_LOAD) an.
  • Wenn ein Treiber beim Starten von einer VHD heraufgestuft werden soll, geben Sie 0x2 (CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD) an.
  • Wenn ein Treiber beim Starten von einem USB-Datenträger heraufgestuft werden soll, geben Sie 0x4 (CM_SERVICE_USB_DISK_BOOT_LOAD) an.
  • Wenn ein Treiber beim Starten aus SD-Speicher heraufgestuft werden soll, geben Sie 0x8 (CM_SERVICE_SD_DISK_BOOT_LOAD) an.
  • Wenn ein Treiber höhergestuft werden soll, während er von einem Datenträger auf einem USB 3.0-Controller gestartet wird, geben Sie 0x10 (CM_SERVICE_USB3_DISK_BOOT_LOAD) an.
  • Wenn ein Treiber beim Starten mit aktiviertem kontrolliertem Start höher gestuft werden soll, geben Sie 0x20 (CM_SERVICE_MEASURED_BOOT_LOAD) an.
  • Wenn ein Treiber beim Starten höhergestuft werden soll, wenn der Überprüfungsstart aktiviert ist, geben Sie 0x40 (CM_SERVICE_VERIFIER_BOOT_LOAD) an.
  • Wenn ein Treiber beim WinPE-Start höhergestuft werden soll, geben Sie 0x80 (CM_SERVICE_WINPE_BOOT_LOAD) an.

Weitere Informationen zum Heraufstufen des StartType eines Treibers beim Start finden Sie je nach Startszenario unter INF AddService-Direktive.