Freigeben über


KMESSAGE_SERVICE_ROUTINE Rückruffunktion (wdm.h)

Ein InterruptMessageService Routinedienste, die eine Nachricht signalisiert haben.

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 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, in der die Meldungssignalunterbrechungen des Treibers beschrieben werden.

Rückgabewert

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

Bemerkungen

Treiber verwenden IoConnectInterruptEx-, um eine InterruptMessageService Routine zu registrieren, um ihre Nachrichtensignalunterbrüche zu verarbeiten. Ein Treiber kann die Registrierung der Routine anschließend aufheben, indem IoDisconnectInterruptExaufgerufen wird. Message-signaled interrupts are supported starting with Windows Vista.

Das System kann eine InterruptMessageService- Routine aufrufen, auch wenn der Interrupt der Routine nicht aufgetreten ist. Wenn beispielsweise ein nachrichtensignalisierter Interrupt freigegeben ist, kann InterruptMessageService- aufgerufen werden, um Unterbrechungen anderer Geräte zu ermöglichen. Die Routine muss überprüfen, ob der Wert für den ServiceContext Parameter mit dem Wert übereinstimmt, der an IoConnectInterruptExübergeben wird. Wenn der Wert übereinstimmt, übernimmt InterruptMessageService den Interrupt und gibt TRUE-zurück. Andernfalls behandelt 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 Nachrichten zu unterscheiden, die vom Gerät generiert werden, da sie alle die gleiche Interruptressource (und daher dieselbe InterruptMessageService> Rückruf) gemeinsam nutzen.

Beachten Sie, dass, wenn das System mehrere identische Unterbrechungen über ein kurzes Zeitintervall empfängt, diese in einem einzigen Aufruf von InterruptMessageServicekombinieren kann. Die Routine muss geschrieben werden, um mehrere identische Unterbrechungen innerhalb eines einzelnen Anrufs zu verarbeiten.

Message-signaled interrupts are similar in behavior to edge-triggered interrupts. Das Gerät sendet eine Interruptanforderung, erhält aber keine Hardwarebestätigung, dass die Anforderung empfangen wurde.

Eine InterruptMessageService- bei einem IRQL-Wert ausgeführt, der größer oder gleich dem maximalen IRQL (DIRQL) des Geräts für jeden Interrupt der Routinehandles ist.

Beispiele

Um eine InterruptMessageService 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.

Wenn Sie beispielsweise eine InterruptMessageService- Rückrufroutine definieren möchten, die MyInterruptMessageServiceheißt, verwenden Sie den KMESSAGE_SERVICE_ROUTINE Typ, 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 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 KMESSAGE_SERVICE_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_annotationsfinden Sie unter Annotating Function Behavior.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Siehe Abschnitt "Hinweise".
Zielplattform- Desktop
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
IRQL- Siehe Abschnitt "Hinweise".

Siehe auch

Verwenden von Interrupt-Ressourcendeskriptoren

IO_INTERRUPT_MESSAGE_INFO

IoConnectInterruptEx-

IoDisconnectInterruptEx-