KSERVICE_ROUTINE Rückruffunktion (wdm.h)
Der InterruptService Routine (ISR) serviceiert schnell eine Unterbrechung eines Geräts 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, angegeben in einem vorherigen Aufruf von IoConnectInterrupt oder IoConnectInterruptEx.
Rückgabewert
Wenn die Routine feststellt, dass der Interrupt nicht von einem der Treibergeräte stammt, muss er FALSE-zurückgeben. Andernfalls muss die Routine den Interrupt service and return TRUE.
Bemerkungen
Um einen ISR für einen bestimmten Interruptvektor und eine Prozessoraffinität zu registrieren, muss ein Treiber IoConnectInterrupt oder IoConnectInterruptEx-aufrufen.
Die InterruptService Routine (ISR) eines Treibers wird in einem Interruptkontext in einem System zugewiesenen DIRQL ausgeführt, wie durch den parameter SynchronizeIrql angegeben, um IoConnectInterrupt zu. (Andere Geräte mit höheren DIRQL-Werten können den ISR unterbrechen.)
Bevor das System einen ISR aufruft, erhält es die Drehsperre des Interrupts (der SpinLock Parameter zum IoConnectInterrupt), sodass der ISR nicht gleichzeitig auf einem anderen Prozessor ausgeführt werden kann. Nachdem der ISR zurückgegeben wurde, gibt das System die Drehsperre frei.
Ein ISR muss zunächst ermitteln, ob der Interrupt von einem der Geräte des Treibers stammt, indem kontextbezogene Informationen untersucht werden, die von Contextbereitgestellt werden. Wenn der Interrupt nicht von einem der Geräte des Treibers stammt, muss die Routine sofort FALSE- zurückgeben, damit der E/A-Manager andere Treiber aufrufen kann, die ISRs für denselben Prozessor registriert haben und den Vektor unterbrechen.
Weitere Informationen zur Implementierung von ISRs finden Sie unter Interrupt Service Routines.
Beispiele
Um eine InterruptService- Rückrufroutine zu definieren, müssen Sie zuerst eine Funktionsdeklaration bereitstellen, die den Typ der rückrufroutinen identifiziert, die Sie definieren. Windows stellt eine Reihe von Rückruffunktionstypen für Treiber bereit. Durch das Deklarieren einer Funktion mithilfe der Rückruffunktionstypen können Codeanalyse für Treiber, statische Treiberüberprüfung (SDV) und andere Überprüfungstools Fehler finden, und es ist eine Anforderung zum Schreiben von Treibern für das Windows-Betriebssystem.
Um beispielsweise eine InterruptService- Rückrufroutine zu definieren, die MyInterruptService
genannt wird, verwenden Sie den KSERVICE_ROUTINE Typ, 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 wird in der Wdm.h-Headerdatei definiert. Um Fehler genauer zu identifizieren, wenn Sie die Codeanalysetools ausführen, müssen Sie der Funktionsdefinition die _Use_decl_annotations_
Anmerkung hinzufügen. Die _Use_decl_annotations_
Anmerkung stellt sicher, dass die Anmerkungen, die auf den Funktionstyp KSERVICE_ROUTINE in der Headerdatei angewendet werden, verwendet 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 Annotating Function Behavior.
Anforderungen
Anforderung | Wert |
---|---|
Zielplattform- | Desktop |
Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL- | Aufgerufen bei DIRQL (siehe Abschnitt "Hinweise"). |