Freigeben über


MINIPORT_ISR Rückruffunktion (ndis.h)

NDIS ruft die MiniportInterrupt-Funktion auf, wenn eine NIC oder ein anderes Gerät, das den Interrupt mit der NIC teilt, einen Interrupt generiert.

Hinweis Sie müssen diese Funktion mit dem MINIPORT_ISR-Typ deklarieren. Weitere Informationen finden Sie im folgenden Abschnitt Beispiele.
 

Syntax

MINIPORT_ISR MiniportIsr;

BOOLEAN MiniportIsr(
  [in]  NDIS_HANDLE MiniportInterruptContext,
  [out] PBOOLEAN QueueDefaultInterruptDpc,
  [out] PULONG TargetProcessors
)
{...}

Parameter

[in] MiniportInterruptContext

Ein Handle für einen Block von Interruptkontextinformationen. Der Miniporttreiber hat dieses Handle im MiniportInterruptContext-Parameter angegeben, den der Miniporttreiber an den übergeben hat. NdisMRegisterInterruptEx-Funktion .

[out] QueueDefaultInterruptDpc

Ein Zeiger auf eine BOOLEAN-Variable, die der Miniporttreiber festlegt, bevor er von diesem Aufruf zurückgibt. Ein Miniporttreiber legt diesen Wert auf TRUE fest, um anzugeben, dass der Treiber einen DPC für die (aktuelle) Standard-CPU erfordert. Wenn dieser Wert auf TRUE festgelegt ist, ignoriert NDIS den Wert des TargetProcessors-Parameters . Wenn sie auf FALSE festgelegt ist, verwendet NDIS den Wert des Parameters TargetProcessors , um DPCs zu planen. Wenn QueueDefaultInterruptDpcTRUE ist, plant NDIS einen DPC unabhängig vom Rückgabewert von MiniportInterrupt.

[out] TargetProcessors

Eine Bitmaske, die die Zielprozessoren angibt, für die NDIS einen DPC planen soll. Diese Bitmaske stellt die ersten 32 Prozessoren in der Prozessorgruppe 0 dar. Jedes Bit in der Bitmaske identifiziert eine CPU. Wenn der Aufrufer Bit 0 festlegt, plant NDIS einen DPC für CPU 0. Wenn der Aufrufer Bit 1 festlegt, plant NDIS einen DPC für CPU 1 usw. Wenn QueueDefaultInterruptDpc auf FALSE und TargetProcessors auf Null festgelegt ist, plant NDIS keine DPCs. Andernfalls plant NDIS DPCs unabhängig vom Rückgabewert von MiniportInterrupt.

Hinweis NDIS 6.20 und höhere Treiber sollten diesen Parameter nicht verwenden, um DPCs zu planen. Stattdessen sollten sie diesen Parameter auf 0 festlegen und die NdisMQueueDpcEx-Funktion verwenden, um DPCs zu planen.
 

Rückgabewert

MiniportInterrupt gibt einen der folgenden Werte zurück:

Rückgabecode Beschreibung
STIMMT

MiniportInterrupt hat ermittelt, dass die zugrunde liegende NIC den Interrupt generiert hat.

FALSE

MiniportInterrupt hat festgestellt, dass die zugrunde liegende NIC den Interrupt nicht generiert hat.

 
Hinweis NDIS führt DPCs basierend auf den Werten in die Warteschlange, die in den Parametern QueueDefaultInterruptDpc und TargetProcessors angegeben sind, unabhängig vom wert, den MiniportInterrupt zurückgibt. MiniportInterrupt muss jedoch weiterhin den richtigen Wert zurückgeben.
 

Hinweise

Miniporttreiber, die einen Interrupt mit der Funktion NdisMRegisterInterruptEx registrieren, müssen eine MiniportInterrupt-Funktion bereitstellen.

Ein Miniporttreiber sollte in seiner MiniportInterrupt-Funktion so wenig Wie möglich arbeiten. Es sollten E/A-Vorgänge für die Interrupts, die die NIC generiert, auf die MiniportInterruptDPC-Funktion zurückstellen.

Wenn ein Interrupt in der Interruptzeile einer NIC auftritt, ruft NDIS die MiniportInterrupt-Funktion des Miniporttreibers auf .

Alle NICs können leitungsbasierte Interrupts für andere Geräte auf dem E/A-Bus freigeben. Wenn die NIC den Interrupt nicht generiert hat, sollte MiniportInterrupt sofort FALSE zurückgeben, damit das System den Treiber des Geräts aufrufen kann, das den Interrupt generiert hat. Wenn queueDefaultInterruptDpc auf FALSE und der TargetProcessors-Parameter auf 0 festgelegt ist, plant NDIS keine DPCs. Andernfalls plant NDIS DPCs unabhängig vom Wert des erneutenMiniportInterrupt-Turnsvon MiniportInterrupt.

Wenn der Interrupt für die NIC gilt, schließt MiniportInterrupt den Interrupt auf der NIC, speichert den Zustand, den er über den Interrupt benötigen muss, und verschiebt so viel E/A-Verarbeitung wie möglich an die Funktion MiniportInterruptDPC .

Wenn die zugrunde liegende NIC den angegebenen Interrupt generiert hat und der Miniporttreiber verzögerte Prozeduraufrufe (DPCs) anfordert, sollte der Miniporttreiber alle weiteren Interrupts von der NIC deaktivieren und die Interrupts erneut aktivieren, nachdem alle DPCs abgeschlossen sind.

Der Miniporttreiber sollte QueueDefaultInterruptDpc auf TRUE festlegen, um einen DPC nur für die Standard-CPU zu planen. Der Treiber könnte dies beispielsweise tun, wenn:

  • Die NIC hat den Interrupt generiert, um den Abschluss eines Sendevorgangs oder einer anderen Anforderung zu signalisieren, die nicht auf anderen CPUs ausgeführt wird.
  • Die NIC hat den Interrupt generiert, um empfangene Daten zu signalisieren, und der Miniporttreiber kann empfangene Pakete nicht in separaten DPCs verarbeiten.
  • Der Interrupt gibt an, dass empfangene Pakete empfangen werden und der Miniporttreiber empfangene Pakete in separaten DPCs verarbeiten kann, aber die empfangsseitige Skalierung (RSS) ist für den Miniporttreiber nicht aktiviert. Weitere Informationen finden Sie unter OID_GEN_RECEIVE_SCALE_CAPABILITIES und OID_GEN_RECEIVE_SCALE_PARAMETERS.
Wenn ein Miniporttreiber empfangene Pakete in separaten DPCs verarbeitet, legt der Treiber den Parameter QueueDefaultInterruptDpc auf FALSE fest. Der Miniporttreiber sollte das TargetProcessors-Bit für die CPU festlegen, die jeder nicht erlösenden Empfangswarteschlange zugeordnet ist. NDIS plant einen DPC für jede der angegebenen CPUs.
Hinweis NDIS führt DPCs basierend auf den Werten in die Warteschlange, die in den Parametern QueueDefaultInterruptDpc und TargetProcessors angegeben sind, unabhängig vom wert, den MiniportInterrupt zurückgibt. MiniportInterrupt muss jedoch weiterhin den richtigen Wert zurückgeben.
 
Wenn MiniportInterrupt Ressourcen wie NIC-Register oder Zustandsvariablen mit einer anderen MiniportXxx-Funktion teilt, die mit einer niedrigeren IRQL ausgeführt wird, muss diese MiniportXxx-Funktion die aufrufen NdisMSynchronizeWithInterruptEx-Funktion . Dadurch wird sichergestellt, dass die MiniportSynchronizeInterrupt-Funktion des Treibers synchronisiert und mit mehreren Prozessoren auf die freigegebenen Ressourcen zugreift.

Ein Miniporttreiber kann die NdisMDeregisterInterruptEx-Funktion aus der MiniportInitializeEx - oder MiniportHaltEx-Funktion , um Ressourcen freizugeben, die sie mit NdisMRegisterInterruptEx zugeordnet hat. Nachdem NdisMDeregisterInterruptEx zurückgegeben wurde , ruft NDIS die MiniportInterrupt - oder MiniportInterruptDPC-Funktion eines Miniporttreibers nicht auf.

NDIS ruft MiniportInterrupt am DIRQL des Interrupts auf, den der Miniporttreiber in einem vorherigen Aufruf von NdisMRegisterInterruptEx registriert hat. Aus diesem Grund muss MiniportInterrupt die Teilmenge der NDIS-Funktionen aufrufen, z. B. die Xxx-FunktionenNdisRawXxx oder NdisRead/WriteRegisterRegister, die bei jedem IRQL sicher aufgerufen werden können.

Beispiele

Um eine MiniportInterrupt-Funktion zu definieren, müssen Sie zunächst eine Funktionsdeklaration bereitstellen, die den Typ der zu definierenden Funktion identifiziert. Windows stellt eine Reihe von Funktionstypen für Treiber bereit. 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 Anforderung zum Schreiben von Treibern für das Windows-Betriebssystem.

Um beispielsweise eine MiniportInterrupt-Funktion mit dem Namen "MyInterrupt" zu definieren, verwenden Sie den MINIPORT_ISR-Typ , wie in diesem Codebeispiel gezeigt:

MINIPORT_ISR MyInterrupt;

Implementieren Sie dann Ihre Funktion wie folgt:

_Use_decl_annotations_
BOOLEAN
 MyInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

Der MINIPORT_ISR Funktionstyp ist in der Headerdatei Ndis.h definiert. Um Fehler beim Ausführen der Codeanalysetools genauer zu identifizieren, fügen Sie der Funktionsdefinition die Use_decl_annotations Anmerkung hinzu. Die Use_decl_annotations Anmerkung stellt sicher, dass die Anmerkungen verwendet werden, die auf den MINIPORT_ISR 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 (einschließlich Ndis.h)
IRQL Siehe Abschnitt "Hinweise"

Weitere Informationen

MiniportHaltEx

MiniportInitializeEx

MiniportInterruptDPC

MiniportSynchronizeInterrupt NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

Empfangsseitige Skalierung (RSS)