MINIPORT_SYNCHRONIZE_INTERRUPT Rückruffunktion (ndis.h)

Ein Miniporttreiber muss einen MiniportSynchronizeInterrupt-Handler bereitstellen, wenn eine Treiberfunktion, die mit weniger als DIRQL ausgeführt wird, Ressourcen mit der MiniportInterrupt-Funktion gemeinsam verwendet .

Für Signalunterbrechungen von Nachrichten stellt der Miniporttreiber einen MiniportSynchronizeMessageInterrupt-Handler bereit, wenn eine Treiberfunktion, die mit weniger als DIRQL ausgeführt wird, Ressourcen für einen signalisierten Interrupt mit der Funktion MiniportMessageInterrupt gemeinsam verwendet.

Hinweis Sie müssen diese Funktion deklarieren, indem Sie entweder den typ MINIPORT_SYNCHRONIZE_INTERRUPT für Unterbrechungen ohne Nachrichtensignal oder den MINIPORT_SYNCHRONIZE_MESSAGE_INTERRUPT typ für signalisierte Interrupts von Nachrichten verwenden. Weitere Informationen finden Sie im folgenden Abschnitt Beispiele.
 

Syntax

MINIPORT_SYNCHRONIZE_INTERRUPT MiniportSynchronizeInterrupt;

BOOLEAN MiniportSynchronizeInterrupt(
  [in] NDIS_HANDLE SynchronizeContext
)
{...}

Parameter

[in] SynchronizeContext

Ein Handle für einen Kontextbereich, der bereitgestellt wird, wenn die MiniportXxx - oder interne Funktion des Miniport-Treibers die NdisMSynchronizeWithInterruptEx-Funktion .

Rückgabewert

MiniportSynchronizeInterrupt gibt einen booleschen Wert mit einer vom Treiber bestimmten Bedeutung zurück. NDIS gibt den gleichen Wert zurück, wenn NDIS von NdisMSynchronizeWithInterruptEx zurückgibt.

Hinweise

Hinweis Die Informationen in diesem Abschnitt können auch für signalisierte Interrupts von Nachrichten gelten, indem "MiniportInterrupt" durch "MiniportMessageInterrupt" und "MiniportSynchronizeInterrupt" durch "MiniportSynchronizeMessageInterrupt" ersetzt wird.
 
Wenn eine Miniporttreiberfunktion, die mit weniger als DIRQL ausgeführt wird, Ressourcen wie NIC-Registrierungen mit der MiniportInterrupt-Funktion des Treibers gemeinsam nutzen, kann dieser Treiber nicht direkt auf diese Ressourcen zugreifen. Wenn eine solche Funktion mit niedrigerer Priorität versucht, direkt auf die freigegebenen Ressourcen zuzugreifen, wird sie möglicherweise durch MiniportInterrupt vorzeitig entfernt, wodurch die Zustandsänderungen der Treiberfunktion mit niedrigerer Priorität außer Kraft gesetzt werden können.

Um den Zugriff auf freigegebene Ressourcen mit MiniportInterrupt zu synchronisieren, müssen Treiberfunktionen mit niedrigerer Priorität die NdisMSynchronizeWithInterruptEx-Funktion . Die MiniportSynchronizeInterrupt-Funktion des Treibers greift auf die freigegebenen Ressourcen unter DIRQL zu. Der Aufruf von NdisMSynchronizeWithInterruptEx verhindert Rennensbedingungen und Deadlocks in einem solchen Miniport-Fahrer.

Alle Treiberfunktionen mit niedrigerer Priorität, die Ressourcen untereinander gemeinsam nutzen (aber nicht mit einer Funktion, die bei DIRQL ausgeführt wird), sollten eine Drehsperre verwenden, um diese freigegebenen Ressourcen zu schützen.

MiniportSynchronizeInterrupt wird auf der DIRQL ausgeführt, die zugewiesen ist, wenn die MiniportInitializeEx-Funktion des Treibers die NdisMRegisterInterruptEx-Funktion . Wie jede Treiberfunktion, die bei DIRQL ausgeführt wird, sollte MiniportSynchronizeInterrupt die Steuerung so schnell wie möglich zurück an den Aufrufer zurückgeben, und es kann nur die NdisXxx-Funktionen aufrufen, die sicher in jedem IRQL aufrufen können.

Beispiele

Um eine MiniportSynchronizeInterrupt-Funktion zu definieren, müssen Sie zunächst eine Funktionsdeklaration bereitstellen, die den Typ der zu definierenden Funktion identifiziert. Windows bietet eine Reihe von Funktionstypen für Treiber. Das Deklarieren einer Funktion mithilfe der Funktionstypen 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 MiniportSynchronizeInterrupt-Funktion mit dem Namen "MySynchronizeInterrupt" zu definieren, verwenden Sie den typ MINIPORT_SYNCHRONIZE_INTERRUPT , wie in diesem Codebeispiel gezeigt:

MINIPORT_SYNCHRONIZE_INTERRUPT MySynchronizeInterrupt;

Implementieren Sie dann Ihre Funktion wie folgt:

_Use_decl_annotations_
BOOLEAN
 MySynchronizeInterrupt(
    NDIS_HANDLE  SynchronizeContext
    )
  {...}

Um eine MiniportSynchronizeMessageInterrupt-Funktion für signalisierte Interrupts von Nachrichten zu definieren, verwenden Sie den typ MINIPORT_SYNCHRONIZE_MESSAGE_INTERRUPT , wie in diesem Codebeispiel gezeigt:

MINIPORT_SYNCHRONIZE_MESSAGE_INTERRUPT MySynchronizeMessageInterrupt;

Implementieren Sie dann Ihre Funktion wie folgt:

_Use_decl_annotations_
BOOLEAN
 MySynchronizeMessageInterrupt(
    NDIS_HANDLE  SynchronizeContext
    )
  {...}

Die funktionstypen MINIPORT_SYNCHRONIZE_INTERRUPT und MINIPORT_SYNCHRONIZE_MESSAGE_INTERRUPT sind in der Ndis.h-Headerdatei definiert. Um Fehler beim Ausführen der Codeanalysetools genauer zu identifizieren, müssen Sie die Use_decl_annotations-Anmerkung zu Ihren Funktionsdefinitionen hinzufügen. Die Use_decl_annotations Anmerkung stellt sicher, dass die Anmerkungen verwendet werden, die auf den 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 NDIS-Treiber.

Informationen zu Use_decl_annotations finden Sie unter Verhalten von Funktionen mit Anmerkungen.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Unterstützt in NDIS 6.0 und höher.
Zielplattform Windows
Kopfzeile ndis.h (include Ndis.h)
IRQL Siehe Abschnitt "Hinweise"

Weitere Informationen

MiniportInetrrupt

MiniportInitializeEx

NdisAllocateSpinLock

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx