Freigeben über


EXT_CALLBACK Rückruffunktion (wdm.h)

Eine ExTimerCallback-Rückrufroutine wird ausgeführt, nachdem das Zeitintervall eines EX_TIMER Timerobjekts abgelaufen ist.

Syntax

EXT_CALLBACK ExtCallback;

void ExtCallback(
  [in] PEX_TIMER Timer,
  [in] PVOID Context
)
{...}

Parameter

[in] Timer

Ein Zeiger auf eine EX_TIMER-Struktur . Diese Struktur ist ein Timerobjekt, das zuvor von der ExAllocateTimer-Routine zugeordnet wurde.

[in] Context

Der Kontextwert, den Ihr Treiber zuvor als CallbackContext-Parameter der ExAllocateTimer-Routine angegeben hat.

Rückgabewert

Keine

Bemerkungen

Optional kann Ihr Treiber einen Zeiger auf eine ExTimerCallback-Routine im Callback-Parameter bereitstellen, den Ihr Treiber an die ExAllocateTimer-Routine übergibt. Nach Ablauf des Timers ruft das Betriebssystem die ExTimerCallback-Routine auf .

Um einen Timervorgang zu starten, übergibt der Treiber das Timerobjekt als Eingabeparameter an die ExSetTimer-Routine . Nach Ablauf des Timers plant das Betriebssystem die Ausführung der ExTimerCallback-Routine .

Ein Timerobjekt ist ein wartebares Objekt. Ein Treiberthread kann eine Routine wie KeWaitForSingleObject oder KeWaitForMultipleObjects aufrufen, um auf das Ablaufen des Timers zu warten. Wenn der Timer abläuft, signalisiert das Betriebssystem das Timerobjekt.

Ein Timer wird möglicherweise abgebrochen, bevor er abläuft. Der Treiber kann die ExCancelTimer-Routine aufrufen, um einen Timer explizit abzubrechen. Wenn der Treiber die ExSetTimer-Routine aufruft, um einen neuen Timer für ein Zeitgeberobjekt zu starten, bevor ein zuvor festgelegter Timer für dieses Objekt abläuft, bricht dieser Aufruf implizit den vorherigen Timer ab und startet dann den neuen Timer.

Eine ExTimerCallback-Routine kann eine Routine wie ExSetTimer oder ExDeleteTimer aufrufen. Wenn eine ExTimerCallback-RoutineExDeleteTimer aufruft, muss der in diesem Aufruf angegebene Wait-ParameterFALSE sein. Weitere Informationen finden Sie unter Löschen eines System-Allocated Timer-Objekts.

In einem Multiprozessorsystem können ExTimerCallback-Rückrufe für zwei aufeinander folgende Ablaufvorgänge eines periodischen Timers gleichzeitig auf zwei verschiedenen Prozessoren ausgeführt werden.

Weitere Informationen finden Sie unter ExXxxTimer-Routinen und EX_TIMER-Objekte.

Beispiele

Um eine ExTimerCallback-Rückrufroutine zu definieren, müssen Sie zunächst eine Funktionsdeklaration bereitstellen, die den Typ der Rückrufroutine identifiziert, die Sie definieren. Windows bietet eine Reihe von Rückruffunktionstypen für Treiber. Das Deklarieren einer Funktion mithilfe des Rückruffunktionstyps hilft der Codeanalyse für Treiber, der statischen Treiberüberprüfung (Static Driver Verifier , SDV) und anderen Überprüfungstools, Fehler zu finden, und es ist eine Voraussetzung für das Schreiben von Treibern für das Windows-Betriebssystem.

Um beispielsweise eine ExTimerCallback-Rückrufroutine mit dem Namen MyExTimerCallbackzu definieren, verwenden Sie den Funktionstyp EXT_CALLBACK, wie in diesem Codebeispiel gezeigt:

EXT_CALLBACK  MyExTimerCallback;

Implementieren Sie dann Ihre Rückrufroutine wie folgt:

_Use_decl_annotations_
VOID
  MyExTimerCallback(
    PEX_TIMER  Timer,
    PVOID  Context
    )
  {...}

Der EXT_CALLBACK Funktionstyp ist in der Wdm.h-Headerdatei definiert. Um Fehler beim Ausführen der Codeanalysetools genauer zu identifizieren, fügen Sie die _Use_decl_annotations_ Anmerkung ihrer Funktionsdefinition hinzu. Die _Use_decl_annotations_ Anmerkung stellt sicher, dass die Anmerkungen verwendet werden, die auf den EXT_CALLBACK Funktionstyp in der Headerdatei angewendet werden. Weitere Informationen zu den Anforderungen für Funktionsdeklarationen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für WDM-Treiber. Weitere Informationen zu _Use_decl_annotations_finden Sie unter Verhalten von Funktionen mit Anmerkungen.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar ab Windows 8.1.
Zielplattform Desktop
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
IRQL Wird bei DISPATCH_LEVEL aufgerufen.

Weitere Informationen

EX_TIMER

ExAllocateTimer

ExCancelTimer

ExSetTimer

KeWaitForMultipleObjects

KeWaitForSingleObject