Verwenden eines System-Defined Rückrufobjekts
Das System definiert drei Rückrufobjekte für die Treiberverwendung:
\Callback\SetSystemTime
\Callback\PowerState
\Callback\ProcessorAdd
Treiber, die die Systemzeit verwenden (z. B. Dateisystemtreiber), können sich für das Rückrufobjekt \Callback\SetSystemTime registrieren. Dieser Rückruf ermöglicht eine Benachrichtigung, wenn sich die Systemzeit ändert.
Das Rückrufobjekt \Callback\PowerState stellt eine Benachrichtigung bereit, wenn eine der folgenden Aktionen auftritt:
Das System wechselt von Wechselstrom zu Gleichstrom oder umgekehrt.
Die Systemenergierichtlinie ändert sich als Ergebnis einer Benutzer- oder Anwendungsanforderung.
Ein Übergang zu einem Ruhezustand oder Herunterfahren des Systems steht unmittelbar bevor. Ein Treiber kann eine Benachrichtigung anfordern, damit er Code in Erwartung des Herunterfahrens im Arbeitsspeicher sperren kann. Rückrufroutinen werden benachrichtigt, bevor der Power-Manager den IRP für den Systemsatz sendet.
Der Rückruf \Callback\ProcessorAdd stellt eine Benachrichtigung bereit, wenn dem System ein neuer Prozessor hinzugefügt wird.
Um einen systemdefinierten Rückruf zu verwenden, initialisiert ein Treiber einen Attributblock, indem er InitializeObjectAttributes mit dem Namen des Rückrufs aufruft, und öffnet dann das Rückrufobjekt (ExCreateCallback), genau wie für einen vom Treiber definierten Rückruf. Der Treiber sollte nicht anfordern, dass das Rückrufobjekt erstellt wird.
Wenn das von ExCreateCallback zurückgegebene Handle zurückgegeben wird, ruft der Treiber ExRegisterCallback auf, um eine Benachrichtigungsroutine zu registrieren. Dabei wird ein Zeiger auf einen beliebigen Kontext und ein Zeiger auf seine Routine übergeben. Ein Treiber kann seine Rückrufroutine jederzeit registrieren. Wenn die angegebene Bedingung auftritt, ruft das System die registrierte Rückrufroutine unter IRQL<=DISPATCH_LEVEL auf.
Wenn der Treiber keine Benachrichtigung mehr benötigt, sollte er ExUnregisterCallback aufrufen, um seine Rückrufroutine aus der Liste der registrierten Rückrufe zu löschen und den Verweis auf das Rückrufobjekt zu entfernen.