Freigeben über


Optionale Zuständigkeiten von DriverEntry

Abhängig von der Position eines bestimmten Treibers in einer Kette von mehrschichtigen Treibern, der Art des zugrunde liegenden Geräts und dem Design des Treibers kann eine DriverEntry-Routine auch für Folgendes verantwortlich sein:

  • Aufrufen von IoAllocateDriverObjectExtension zum Erstellen und Initialisieren einer Treiberobjekterweiterung, wenn der Treiber treiberweiten Speicher für Daten erfordert. Die Treiberobjekterweiterung ist eine treiberspezifische Datenstruktur. Beispielsweise kann ein Treiber seine Treiberobjekterweiterung verwenden, um einen Registrierungspfad oder andere globale Informationen zu speichern.

  • Aufrufen von PsCreateSystemThread zum Erstellen von Ausführenden Workerthreads, wenn der Treiber ein Treiber der höchsten Ebene (z. B. ein Dateisystemtreiber) ist, der solche Threads verwendet. In diesem Fall muss der Treiber auch über eine Rückrufroutine vom Typ WORKER_THREAD_ROUTINE verfügen, die einen einzelnen EINGABE-PVOID-Parameter akzeptiert.

  • Registrieren einer Neuitialisierungsroutine . (Siehe Schreiben einer Neuitialisierungsroutine.)

  • Umgang mit klassenspezifischen Initialisierungsanforderungen, die sich von den hier erläuterten unterscheiden, z. B. die, die ein gerätespezifischer Miniport- oder Miniklassentreiber hat, der mit einem Port oder Klassentreiber zusammenarbeiten kann. Weitere Informationen finden Sie in der gerätetypspezifischen Dokumentation im Windows Driver Kit (WDK).

Bereitstellen von Speicher für Systemressourcen

Gerätespezifische Objekte sollten in der AddDevice-Routine oder in der Dispatch-Routine zugeordnet werden, die die PnP-IRP_MN_START_DEVICE-Anforderung verarbeitet, und nicht in DriverEntry.

Ein Treiber muss jedoch möglicherweise zusätzlichen Systemspeicher für andere treiberweite Verwendungen zuweisen. Wenn ja, kann die DriverEntry-Routine eine (oder mehrere) der folgenden Routinen aufrufen:

Jede DriverEntry-Routine wird im Kontext eines Systemthreads unter IRQL = PASSIVE_LEVEL ausgeführt. Daher kann jeder Mit ExAllocatePoolWithTag für die ausschließliche Verwendung während der Initialisierung zugewiesener Arbeitsspeicher aus einem ausgelagerten Pool stammen, solange der Treiber das Gerät, das die Systemseitendatei enthält, nicht steuert. Der zugewiesene Arbeitsspeicher muss mit ExFreePool freigegeben werden, bevor DriverEntry die Steuerung zurückgibt. Ein Treiber, der eine Neuitialisierungsroutine festlegt, kann jedoch einen Zeiger auf diesen Speicher übergeben, wenn er IoRegisterDriverReinitialization aufruft, sodass die Reinitialisierungsroutine des Treibers für die Freigabe der Speicherbelegung verantwortlich ist.

Beanspruchen von Hardwareressourcen

Ältere Nicht-PnP-Treiber beanspruchten Ressourcen aus der Registrierung. PnP-Treiber beanspruchen dagegen weder Geräteressourcen von noch schreiben Ressourcen direkt in die Registrierung. Stattdessen melden diese Treiber Anforderungen als Reaktion auf bestimmte PnP-IRPs im Rahmen des Enumerationsprozesses des PnP-Managers. Ein PnP-Treiber empfängt die zugeordneten Ressourcen in einer PnP-IRP_MN_START_DEVICE-Anforderung .

Treiber, die nicht direkt mit dem PnP-Manager interagieren, z. B. bestimmte Miniporttreiber, haben möglicherweise unterschiedliche Berichtspflichten, die von einer Klasse oder einem Porttreiber auferlegt werden, der mit dem PnP-Manager interagiert. Solche Anforderungen sind spezifisch für die Geräteklasse. Gerätespezifische und klassenspezifische Details finden Sie in der Dokumentation zur entsprechenden Geräteklasse im Windows Driver Kit (WDK).

Mithilfe der Registrierung

Eine DriverEntry-Routine kann die Registrierung verwenden, um einige der Informationen abzurufen, die sie zum Initialisieren des Treibers benötigt, oder sie legt Informationen in der Registrierung für andere Treiber oder geschützte Subsysteme fest, die verwendet werden sollen. Die Art der Informationen hängt vom Gerätetyp ab. Treiber können mithilfe der Zw Xxx- und RtlXxx-Routinen auf die Registrierung zugreifen. Der RegistryPath-Parameter der DriverEntry-Routine verweist auf eine gezählte Unicode-Zeichenfolge, die einen Pfad zum Registrierungsschlüssel des Treibers angibt, \Registry\Machine\System\CurrentControlSet\Services\*DriverName. Die Routine sollte eine Kopie der Zeichenfolge speichern, nicht den Zeiger selbst, da der Zeiger nach der Rückgabe von *DriverEntry nicht mehr gültig ist.