KMESSAGE_SERVICE_ROUTINE Rückruffunktion (wdm.h)

Eine InterruptMessageService-Routine stellt einen von Nachrichten signalisierten Interrupt bereit.

Syntax

KMESSAGE_SERVICE_ROUTINE KmessageServiceRoutine;

BOOLEAN KmessageServiceRoutine(
  [in] _KINTERRUPT *Interrupt,
  [in] PVOID ServiceContext,
       ULONG MessageID
)
{...}

Parameter

[in] Interrupt

Ein Zeiger auf die KINTERRUPT-Struktur für den Interrupt. Der Treiber hat diesen Zeiger im Aufruf der IoConnectInterruptEx-Routine empfangen, die die InterruptMessageService-Routine des Treibers registriert hat.

[in] ServiceContext

Der ServiceContext-Wert , den der Treiber an IoConnectInterruptEx übergeben hat, als die InterruptMessageService-Routine registriert wurde.

MessageID

Die Nachrichten-ID für den Interrupt. Dieser Wert ist der Index für den Eintrag des Interrupts im MessageInfo-Memberarray in der IO_INTERRUPT_MESSAGE_INFO-Struktur , die die von Nachrichten signalisierten Interrupts des Treibers beschreibt.

Rückgabewert

Die InterruptMessageService-Routine gibt TRUE zurück, wenn der Interrupt einer ist, der von der InterruptMessageService-Routine behandelt wird. Andernfalls wird FALSE zurückgegeben.

Hinweise

Treiber verwenden IoConnectInterruptEx , um eine InterruptMessageService-Routine zu registrieren, um ihre von Nachrichten signalisierten Interrupts zu verarbeiten. Ein Treiber kann die Registrierung der Routine anschließend aufheben, indem er IoDisconnectInterruptEx aufruft. Nachrichtensignalgesteuerte Interrupts werden ab Windows Vista unterstützt.

Das System kann eine InterruptMessageService-Routine aufrufen, auch wenn der Interrupt der Routine nicht aufgetreten ist. Wenn beispielsweise ein von Nachrichten signalisierter Interrupt freigegeben wird, kann InterruptMessageService für Interrupts aufgerufen werden, die zu anderen Geräten gehören. Die Routine muss überprüfen, ob der Wert für den ServiceContext-Parameter mit dem an IoConnectInterruptEx übergebenen Wert übereinstimmt. Wenn der Wert übereinstimmt, verarbeitet InterruptMessageService den Interrupt und gibt TRUE zurück. Andernfalls verarbeitet InterruptMessageService den Interrupt nicht und gibt FALSE zurück.

Ein Treiber, der MSI (PCI 2.2) verwendet, muss den MessageID-Parameter untersuchen, um zwischen den verschiedenen vom Gerät generierten Nachrichten zu unterscheiden, da sie alle dieselbe Interruptressource (und daher denselben InterruptMessageService-Rückruf> ) verwenden.

Wenn das System mehrere identische Interrupts über ein kurzes Zeitintervall empfängt, kann es diese in einem einzelnen Aufruf von InterruptMessageService kombinieren. Die Routine muss geschrieben werden, um mehrere identische Interrupts innerhalb eines einzelnen Aufrufs zu behandeln.

Interrupts mit Nachrichtensignalen ähneln dem verhalten von Edge ausgelösten Interrupts. Das Gerät sendet eine Interruptanforderung, erhält jedoch keine Hardwarebestätigung, dass die Anforderung empfangen wurde.

Ein InterruptMessageService wird bei einem IRQL ausgeführt, der größer als oder gleich dem maximalen Geräte IRQL (DIRQL) für jeden Interrupt, den die Routine verarbeitet, übersteigt.

Beispiele

Um eine InterruptMessageService-Rückrufroutine zu definieren, müssen Sie zunächst eine Funktionsdeklaration bereitstellen, die den Typ der von Ihnen definierten Rückrufroutine identifiziert. 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 Anforderung zum Schreiben von Treibern für das Windows-Betriebssystem.

Um beispielsweise eine InterruptMessageService-Rückrufroutine mit dem Namen MyInterruptMessageServicezu definieren, verwenden Sie den typ KMESSAGE_SERVICE_ROUTINE, wie in diesem Codebeispiel gezeigt:

KMESSAGE_SERVICE_ROUTINE MyInterruptMessageService;

Implementieren Sie dann Ihre Rückrufroutine wie folgt:

_Use_decl_annotations_
BOOLEAN
  MyInterruptMessageService(
    struct _KINTERRUPT  *Interrupt,
    PVOID  ServiceContext,
    ULONG  MessageId 
    )
  {
      // Function body
  }

Der KMESSAGE_SERVICE_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 KMESSAGE_SERVICE_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_annotationsfinden Sie unter Annotating Function Behavior.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Weitere Informationen finden Sie im Abschnitt mit den Hinweisen.
Zielplattform Desktop
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
IRQL Weitere Informationen finden Sie im Abschnitt mit den Hinweisen.

Weitere Informationen

Verwenden von Interruptressourcendeskriptoren

IO_INTERRUPT_MESSAGE_INFO

IoConnectInterruptEx

IoDisconnectInterruptEx