Freigeben über


MINIPORT_MESSAGE_INTERRUPT_DPC Rückruffunktion (ndis.h)

Ein Miniporttreiber muss einen MiniportMessageInterruptDPC-Handler bereitstellen, wenn der Treiber die NdisMRegisterInterruptEx-Funktion aufruft , um einen Interrupt zu registrieren.

Hinweis Sie müssen die Funktion mit dem typ MINIPORT_MESSAGE_INTERRUPT_DPC deklarieren. Weitere Informationen finden Sie im folgenden Abschnitt Beispiele.
 

Syntax

MINIPORT_MESSAGE_INTERRUPT_DPC MiniportMessageInterruptDpc;

void MiniportMessageInterruptDpc(
  [in] NDIS_HANDLE MiniportInterruptContext,
  [in] ULONG MessageId,
  [in] PVOID MiniportDpcContext,
  [in] PVOID ReceiveThrottleParameters,
       PVOID NdisReserved2 PULONG NdisReserved1,
  [in] PULONG NdisReserved2
)
{...}

Parameter

[in] MiniportInterruptContext

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

[in] MessageId

Ein MSI-Nachrichtenbezeichner (Message-Signaled Interrupt). MessageId ist ein Index für eine IO_INTERRUPT_MESSAGE_INFO_ENTRY-Struktur in einem IO_INTERRUPT_MESSAGE_INFO Struktur. NDIS übergibt einen Zeiger auf die zugeordnete IO_INTERRUPT_MESSAGE_INFO-Struktur im MessageInfoTable-Member , wenn der Treiber erfolgreich für MSI mit der NdisMRegisterInterruptEx-Funktion registriert wird.

[in] MiniportDpcContext

Ein Zeiger auf einen Kontextbereich, den der Miniporttreiber beim Aufrufen der Funktion NdisMQueueDpcEx oder NdisMQueueDpc bereitgestellt hat . Wenn NDIS MiniportMessageInterruptDPC aufgerufen hat , weil der Miniporttreiber eine Bitmaske im TargetProcessors-Parameter des zurückgegeben hat MiniportMessageInterrupt-Funktion , dann MiniportDpcContext ist NULL.

[in] ReceiveThrottleParameters

Ein Zeiger auf eine NDIS_RECEIVE_THROTTLE_PARAMETERS-Struktur gibt die maximale Anzahl von NET_BUFFER_LIST Strukturen an, die ein Miniporttreiber in einem DPC angeben soll.

Hinweis In NDIS 6.1 und früher heißt dieser Parameter NdisReserved1, sein Datentyp ist PULONG und ist für NDIS reserviert.
 

NdisReserved1

Reserviert für NDIS.

[in] NdisReserved2

Reserviert für NDIS.

Hinweis In NDIS 6.1 und früher ist der Datentyp dieses Parameters PULONG.
 

Rückgabewert

Keine

Bemerkungen

Miniport-Treiber, die einen Nachrichtensignal-Interrupt bei der NdisMRegisterInterruptEx-Funktion registrieren, müssen eine MiniportMessageInterruptDPC-Funktion bereitstellen.

NDIS ruft MiniportMessageInterruptDPC auf, um die verzögerte Verarbeitung eines Interrupts abzuschließen. Der Miniporttreiber kann die Funktion NdisMQueueDpcEx oder NdisMQueueDpc aufrufen, um zusätzliche verzögerte Prozeduraufrufe (DpCs) für andere Prozessoren anzufordern.

Miniporttreiber bestimmen die Quelle jedes Interrupts und ergreifen entsprechende Maßnahmen. Wenn beispielsweise ein Interrupt den Abschluss eines Übertragungsvorgangs angibt, schließt der Miniporttreiber eine ausstehende Sendeanforderung ab. Wenn die Ursache des Interrupts eine Änderung des Linkzustands ist, gibt der Miniporttreiber die neue Verknüpfung status zu NDIS an. Wenn ausstehende Empfangspakete vorhanden sind, gibt der Miniporttreiber die Pakete an NDIS an.

Ein Miniporttreiber, der die empfangsseitige Skalierung (RSS) unterstützt und das Feature aktiviert hat, untersucht seine Empfangswarteschlangen in MiniportMessageInterruptDPC. Die NIC könnte empfangene Pakete bereits in separate Warteschlangen basierend auf Hashwerten in die Warteschlange gestellt haben, wenn die NIC solche Funktionen bereitstellt. Andernfalls kann der Miniporttreiber die Pakete in separate Warteschlangen in MiniportMessageInterruptDPC sortieren.

MiniportMessageInterruptDPC ruft die auf NdisMIndicateReceiveNetBufferLists-Funktion , um die Pakete auf dem aktuellen Prozessor anzugeben. MiniportMessageInterruptDPC kann die Verarbeitung ermitteln, die für andere CPUs erforderlich ist, und NDIS anfordern, DPCs auf CPUs zu planen, bei denen ein DPC nicht aussteht.

Wenn der aktuelle DPC auf derselben CPU ausgeführt wird wie MiniportMessageInterrupt-Funktion , der Miniporttreiber sollte alle Pakete angeben, die nicht einer CPU zugeordnet werden konnten. Wenn es sich bei diesem DPC um den letzten geplanten DPC handelt und keine zusätzlichen DPCs angefordert werden, sollte MiniportMessageInterruptDPC die Unterbrechungen für die NIC für die angegebene Nachricht erneut aktivieren, bevor sie zurückgegeben wird.

Bevor NDIS MiniportMessageInterruptDPC aufruft, wurden Unterbrechungen für die angegebene Nachricht in der NIC in der Regel deaktiviert. MiniportMessageInterrupt-Funktion . Bevor die Steuerung zurückgegeben wird, kann MiniportMessageInterruptDPC Interrupts wieder aktivieren. Wenn der Miniporttreiber zusätzliche DPCs in die Warteschlange gestellt hat, während Interrupts deaktiviert wurden, sollte der Treiber die Interrupts aktivieren, nachdem der letzte DPC ausgeführt wurde.

Hinweis Um die Leistung zu verbessern, sollten Miniporttreiber nur Interrupts für bestimmte Nachrichten deaktivieren. Sie sollten nicht alle Nachrichtensignalunterbrechungen deaktivieren.
 
Miniporttreiber sollten die Anzahl der Empfangspuffer begrenzen, die sie angeben, während sie einen Interrupt-DPC-Batch verarbeiten, um innerhalb des erforderlichen Zeitlimits abzuschließen. Ein Interrupt-DPC-Batch ist die Sammlung aller DPCs, die nach der ISR und vor dem erneuten Aktivieren der Interrupts ausgeführt werden.

Ein Miniporttreiber kann NdisMDeregisterInterruptEx über seine MiniportInitializeEx - oder MiniportHaltEx-Funktion aufrufen, um Ressourcen freizugeben, die er mit NdisMRegisterInterruptEx zugeordnet hat. Nachdem NdisMDeregisterInterruptEx zurückgegeben wurde , ruft NDIS die MiniportMessageInterrupt - oder MiniportMessageInterruptDPC-Funktion eines Miniporttreibers nicht auf.

NDIS ruft MiniportMessageInterruptDPC unter IRQL = DISPATCH_LEVEL auf.

Beispiele

Um eine MiniportMessageInterruptDPC-Funktion zu definieren, müssen Sie zunächst eine Funktionsdeklaration bereitstellen, die den Typ der Funktion identifiziert, die Sie definieren. 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 MiniportMessageInterruptDPC-Funktion mit dem Namen "MyMessageInterruptDPC" zu definieren, verwenden Sie den typ MINIPORT_MESSAGE_INTERRUPT_DPC , wie in diesem Codebeispiel gezeigt:

MINIPORT_MESSAGE_INTERRUPT_DPC MyMessageInterruptDPC;

Implementieren Sie dann Ihre Funktion wie folgt:

_Use_decl_annotations_
VOID
 MyMessageInterruptDPC(
    NDIS_HANDLE  MiniportInterruptContext,
    ULONG  MessageId,
    PVOID  MiniportDpcContext,
    PVOID  ReceiveThrottleParameters,
    PVOID  NdisReserved2
    )
  {...}

Der MINIPORT_MESSAGE_INTERRUPT_DPC Funktionstyp ist in der Headerdatei Ndis.h definiert. Um Fehler beim Ausführen der Codeanalysetools genauer zu identifizieren, müssen Sie der Funktionsdefinition die anmerkung Use_decl_annotations hinzufügen. Die Use_decl_annotations-Anmerkung stellt sicher, dass die Anmerkungen verwendet werden, die auf den MINIPORT_MESSAGE_INTERRUPT_DPC 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 DISPATCH_LEVEL

Weitere Informationen

IO_INTERRUPT_MESSAGE_INFO

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterrupt

NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS NDIS_RECEIVE_THROTTLE_PARAMETERS

NET_BUFFER_LIST

NdisMDeregisterInterruptEx

NdisMIndicateReceiveNetBufferLists

NdisMQueueDpc

NdisMQueueDpcEx

NdisMRegisterInterruptEx

Empfangsseitige Skalierung (RSS)