KSERVICE_ROUTINE Rückruffunktion (wdm.h)
Die InterruptService-Routine (ISR) verarbeitet schnell einen Geräteunterbrechung und plant bei Bedarf die Verarbeitung empfangener Daten nach dem Interrupt.
Syntax
KSERVICE_ROUTINE KserviceRoutine;
BOOLEAN KserviceRoutine(
[in] _KINTERRUPT *Interrupt,
[in] PVOID ServiceContext
)
{...}
Parameter
[in] Interrupt
Vom Aufrufer bereitgestellter Zeiger auf die KINTERRUPT-Struktur für den Interrupt.
[in] ServiceContext
Vom Aufrufer bereitgestellter Zeiger auf Kontextinformationen, der in einem vorherigen Aufruf von IoConnectInterrupt oder IoConnectInterruptEx angegeben wurde.
Rückgabewert
Wenn die Routine feststellt, dass der Interrupt nicht von einem der Geräte des Treibers stammt, muss false zurückgegeben werden. Andernfalls muss die Routine den Interrupt bedienen und TRUE zurückgeben.
Hinweise
Um eine ISR für einen bestimmten Interruptvektor und eine bestimmte Prozessoraffinität zu registrieren, muss ein Treiber IoConnectInterrupt oder IoConnectInterruptEx aufrufen.
Eine InterruptService-Routine (ISR ) des Treibers wird in einem Interruptkontext an einem systemseitig zugewiesenen DIRQL ausgeführt, wie durch den SynchronizeIrql-Parameter für IoConnectInterrupt angegeben. (Andere Geräte mit höheren DIRQL-Werten können die ISR unterbrechen.)
Bevor das System eine ISR aufruft, erhält es die Spinsperre des Interrupts (der SpinLock-Parameter für IoConnectInterrupt), sodass die ISR nicht gleichzeitig auf einem anderen Prozessor ausgeführt werden kann. Nachdem die ISR zurückgegeben wurde, gibt das System die Drehsperre frei.
Eine ISR muss zunächst ermitteln, ob der Interrupt von einem der Geräte des Treibers stammt, indem er die von Context bereitgestellten Kontextinformationen untersucht. Wenn der Interrupt nicht von einem der Treibergeräte stammt, muss die Routine sofort FALSE zurückgeben, damit der E/A-Manager andere Treiber aufrufen kann, die ISRs für denselben Prozessor und Interruptvektor registriert haben.
Weitere Informationen zum Implementieren von ISRs finden Sie unter Interrupt Service Routines.For more information about implementing ISRs, see Interrupt Service Routines.
Beispiele
Um eine InterruptService-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 der Rückruffunktionstypen 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 InterruptService-Rückrufroutine mit dem Namen MyInterruptService
zu definieren, verwenden Sie den typ KSERVICE_ROUTINE, wie in diesem Codebeispiel gezeigt:
KSERVICE_ROUTINE MyInterruptService;
Implementieren Sie dann Ihre Rückrufroutine wie folgt:
_Use_decl_annotations_
BOOLEAN
MyInterruptService(
struct _KINTERRUPT *Interrupt,
PVOID ServiceContext
)
{
// Function body
}
Der KSERVICE_ROUTINE 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 KSERVICE_ROUTINE 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. Informationen zu _Use_decl_annotations_
finden Sie unter Verhalten von Funktionen mit Anmerkungen.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform | Desktop |
Header | wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Wird bei DIRQL aufgerufen (siehe Abschnitt "Hinweise"). |