Schreiben einer Neuinitialisierungsroutine

Jeder Treiber, der sich in Phasen initialisieren muss, kann eine Reinitialisierungsroutine enthalten. Eine Neuinitialisierungsroutine wird aufgerufen, nachdem die DriverEntry-Routine die Kontrolle zurückgegeben hat und sich andere Treiber selbst initialisiert haben. In der Regel führt die Routine "Reinitialisieren " Aufgaben aus, die nach dem Starten eines anderen Treibers ausgeführt werden müssen.

Der Tastaturklassentreiber kbdclass des Systems unterstützt beispielsweise sowohl PnP- als auch Legacytastaturports. Wenn ein System einen oder mehrere Legacyports enthält, die der PnP-Manager nicht erkennen kann, muss der Tastaturklassentreiber dennoch ein Geräteobjekt für jeden Port erstellen und sich selbst über Treiber auf niedrigerer Ebene für den Port überlappen. Folglich verfügt der Klassentreiber über eine Reinitialisierungsroutine , die aufgerufen werden soll, nachdem die Routinen DriverEntry und AddDevice aufgerufen und andere Treiber geladen wurden. Die Routine "Reinitialize" erkennt den Port, erstellt ein Geräteobjekt für ihn und übergibt den Treiber über andere Treiber auf niedrigerer Ebene für das Gerät.

Die DriverEntry-Routine eines Treibers ruft IoRegisterDriverReinitialization auf, um eine Reinitialisierungsroutine für die Ausführung in die Warteschlange zu stellen. Die Reinitialisierungsroutine kann auch IoRegisterDriverReinitialization selbst aufrufen, wodurch die Routine erneut in die Warteschlange warteschlange gestellt wird. Einer der Parameter, der neu initialisiert werden soll, gibt an, wie oft er aufgerufen wurde.

Der Aufruf von IoRegisterDriverReinitialization kann einen Zeiger auf vom Treiber definierte Kontextdaten enthalten, die das System als Eingabe für die Reinitialisierung bereitstellt. Wenn die Reinitialize-Routine die Registrierung verwendet, sollten die Kontextdaten den RegistryPath-Zeiger enthalten, der an die DriverEntry-Routine übergeben wurde, da dieser Zeiger kein Eingabeparameter für die Reinitialize-Routine ist.

Die Routine "Reinitialize" wird nicht aufgerufen, wenn DriverEntry nicht STATUS_SUCCESS zurückgibt.

In der Regel ist ein Treiber mit einer Reinitialisierungsroutine ein Treiber auf höherer Ebene, der sowohl PnP als auch ältere Geräte steuert. Zusätzlich zum Erstellen von Geräteobjekten für die Geräte, die vom PnP-Manager erkannt werden (und für die der PnP-Manager die AddDevice-Routine des Treibers aufruft), muss der Treiber auch Geräteobjekte für Ältere Geräte erstellen, die der PnP-Manager nicht aufzählt. Die Routine "Reitialize" erstellt diese Geräteobjekte und übergibt den Treiber über den nächstniedrigen Treiber für das zugrunde liegende Gerät.

Wenn ein Treiber über eine Reinitialisierungsroutine verfügt, wird er in den gleichen grundlegenden Schritten initialisiert, die unter Schreiben einer DriverEntry-Routine beschrieben werden, und er hat auch die gleichen grundlegenden Anforderungen wie seine DriverEntry-Routine .