FILTER_RECEIVE_NET_BUFFER_LISTS Rückruffunktion (ndis.h)

NDIS ruft die FilterReceiveNetBufferLists-Funktion auf, um einen Filtertreiber zum Verarbeiten einer Empfangsanzeige anzufordern.

Hinweis Sie müssen die Funktion mithilfe des typs FILTER_RECEIVE_NET_BUFFER_LISTS deklarieren. Weitere Informationen finden Sie im folgenden Abschnitt Beispiele.
 

Syntax

FILTER_RECEIVE_NET_BUFFER_LISTS FilterReceiveNetBufferLists;

void FilterReceiveNetBufferLists(
  [in] NDIS_HANDLE FilterModuleContext,
  [in] PNET_BUFFER_LIST NetBufferLists,
  [in] NDIS_PORT_NUMBER PortNumber,
  [in] ULONG NumberOfNetBufferLists,
  [in] ULONG ReceiveFlags
)
{...}

Parameter

[in] FilterModuleContext

Ein Handle für den Kontextbereich für das Filtermodul. Der Filtertreiber hat diesen Kontextbereich in der FilterAttach-Funktion erstellt und initialisiert.

[in] NetBufferLists

Eine verknüpfte Liste von NET_BUFFER_LIST Strukturen, die von zugrunde liegenden Treibern zugeordnet wurden. Jede NET_BUFFER_LIST-Struktur enthält eine NET_BUFFER-Struktur .

[in] PortNumber

Eine Portnummer, die einen Miniportadapterport angibt. Portnummern des Miniport-Adapters werden durch Aufrufen der NdisMAllocatePort-Funktion zugewiesen. Ein Nullwert gibt den Standardport eines Miniportadapters an.

[in] NumberOfNetBufferLists

Die Anzahl der NET_BUFFER_LIST Strukturen, die sich in der verknüpften Liste der Strukturen unter NetBufferLists befinden .

[in] ReceiveFlags

Flags, die Attribute für die Empfangsanzeige definieren. Die Flags können mit einem OR-Vorgang kombiniert werden. Um alle Flags zu löschen, legen Sie dieses Element auf 0 (null) fest. Diese Funktion unterstützt die folgenden Flags:

NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL

Gibt an, dass die aktuelle IRQL DISPATCH_LEVEL ist. Weitere Informationen zu diesem Flag finden Sie unter Dispatch IRQL Tracking.For more information about this flag, see Dispatch IRQL Tracking.

NDIS_RECEIVE_FLAGS_RESOURCES

Gibt an, dass NDIS unmittelbar nach der Rückgabe des Aufrufs von FilterReceiveNetBufferLists den Besitz der NET_BUFFER_LIST-Strukturen und aller angefügten NET_BUFFER-Strukturen zurückgibt.

NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE

Gibt an, dass alle NET_BUFFER_LIST-Strukturen in der Liste unter NetBufferLists über denselben Protokolltyp (EtherType) verfügen.

NDIS_RECEIVE_FLAGS_SINGLE_VLAN

Gibt an, dass alle NET_BUFFER_LIST-Strukturen in der Liste unter NetBufferLists zum gleichen VLAN gehören.

NDIS_RECEIVE_FLAGS_PERFECT_FILTERED

Gibt an, dass alle NET_BUFFER_LIST-Strukturen in der Liste unter NetBufferLists nur Daten enthalten, die mit dem Paketfilter und der Multicastadressenliste übereinstimmen, die dem Miniportadapter zugewiesen sind.

NDIS_RECEIVE_FLAGS_SINGLE_QUEUE

Gibt an, dass alle NET_BUFFER_LIST-Strukturen in der Liste unter NetBufferLists derselben VM-Warteschlange angehören. Ein Miniporttreiber muss dieses Flag für alle Empfangsanzeigen in einer Warteschlange festlegen, wenn das NDIS_RECEIVE_QUEUE_PARAMETERS_PER_QUEUE_RECEIVE_INDICATION-Flag im Flags-Element des NDIS_RECEIVE_QUEUE_PARAMETERS Struktur, wenn diese Warteschlange zugeordnet wurde.

NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID

Gibt an, dass alle NET_BUFFER_LIST-Strukturen in der Liste unter NetBufferLists gültige freigegebene Speicherinformationen enthalten. Wenn dieses Flag für eine empfangene NET_BUFFER_LIST festgelegt ist, behandelt NDIS die Informationen des freigegebenen Speichers als gültig. Wenn dieses Flag nicht festgelegt ist, ignorieren NDIS und Treiber die Freigegebenen Speicherinformationen. Beispielsweise können Zwischentreiber, die Paketdaten ändern, dieses Flag verwenden, um zu bestimmen, ob Daten kopiert werden sollen. Miniporttreiber können das Flag verwenden, um zu bestimmen, wie der Speicher freigegeben werden soll, der einer VM-Warteschlange zugeordnet ist, wenn eine Warteschlange gelöscht wird.

NDIS_RECEIVE_FLAGS_MORE_NBLS

Reserviert.

NDIS_RECEIVE_FLAGS_SWITCH_SINGLE_SOURCE

Wenn dieses Flag festgelegt ist, stammen alle Pakete in einer verknüpften Liste von NET_BUFFER_LIST Strukturen vom gleichen erweiterbaren Hyper-V-Switch-Quellport.

Weitere Informationen finden Sie unter Hyper-V Extensible Switch Send and Receive Flags.For more information, see Hyper-V Extensible Switch Send and Receive Flags.

Hinweis Wenn jedes Paket in der verknüpften Liste der NET_BUFFER_LIST-Strukturen denselben Quellport verwendet, sollte die Erweiterung das NDIS_RETURN_FLAGS_SWITCH_SINGLE_SOURCE-Flag im ReturnFlags-Parameter von FilterReturnNetBufferLists festlegen, wenn die Empfangsanforderung abgeschlossen ist. Die Erweiterung muss dieses Flag im ReturnFlags-Parameter festlegen, wenn sie NdisFReturnNetBufferLists aufruft , um Pakete zurückzugeben, die sie nicht stammt oder geklont hat.
 

NDIS_RECEIVE_FLAGS_SWITCH_DESTINATION_GROUP

Wenn dieses Flag festgelegt ist, sollen alle Pakete in einer verknüpften Liste von NET_BUFFER_LIST Strukturen an den gleichen erweiterbaren Switchzielport weitergeleitet werden.

Weitere Informationen finden Sie unter Hyper-V Extensible Switch Send and Receive Flags.For more information, see Hyper-V Extensible Switch Send and Receive Flags.

Hinweis Wenn jedes Paket in der verknüpften Liste der NET_BUFFER_LIST-Strukturen dieselben Zielports verwendet, sollte die Erweiterung das NDIS_RECEIVE_FLAGS_SWITCH_DESTINATION_GROUP-Flag im ReturnFlags-Parameter von FilterReturnNetBufferLists festlegen, wenn die Empfangsanforderung abgeschlossen ist. Die Erweiterung muss dieses Flag im ReturnFlags-Parameter festlegen, wenn sie NdisFReturnNetBufferLists aufruft , um Pakete zurückzugeben, die sie nicht stammt oder geklont hat.
 

Rückgabewert

Keine

Bemerkungen

FilterReceiveNetBufferLists ist eine optionale Funktion. Wenn ein Filtertreiber keine Empfangsanzeigen filtert, kann er den Einstiegspunkt für diese Funktion auf NULL festlegen, wenn er die NdisFRegisterFilterDriver-Funktion .

Hinweis Ein Filtertreiber, der eine FilterReceiveNetBufferLists-Funktion bereitstellt, muss eine FilterStatus-Funktion bereitstellen.
 
Der Filtertreiber kann die NdisSetOptionalHandlers-Funktion aus der FilterSetModuleOptions-Funktion aufrufen, um eine FilterReceiveNetBufferLists-Funktion für ein Filtermodul anzugeben.

NDIS ruft FilterReceiveNetBufferLists auf, um Empfangsanzeigen zu verarbeiten, die von zugrunde liegenden Treibern initiiert werden. NDIS kann diese Funktion auch als Ergebnis von Loopback aufrufen.

Wenn der Filtertreiber keine FilterReceiveNetBufferLists-Funktion angegeben hat, ruft NDIS den nächsthöheren Filtertreiber im Stapel auf, der eine FilterReceiveNetBufferLists-Funktion angegeben hat. Wenn kein solcher Filtertreiber vorhanden ist, ruft NDIS einen überlastenden Treiber auf. ProtocolReceiveNetBufferLists-Funktion .

Wenn das NDIS_RECEIVE_FLAGS_RESOURCES-Flag im ReceiveFlags-Parameter nicht festgelegt ist, behält der Filtertreiber den Besitz der NET_BUFFER_LIST-Strukturen , bis er die NdisFReturnNetBufferLists-Funktion .

Wenn das NDIS_RECEIVE_FLAGS_RESOURCES-Flag im Parameter ReceiveFlags festgelegt ist, kann der Filtertreiber die NET_BUFFER_LIST-Struktur und die zugeordneten zugrunde liegenden Treiber zugeordneten Ressourcen nicht beibehalten. Dieses Flag kann darauf hinweisen, dass der zugrunde liegende Treiber nicht genügend Empfangsressourcen enthält. Die FilterReceiveNetBufferLists-Funktion sollte so schnell wie möglich zurückgegeben werden. Vor der Rückgabe kann die FilterReceiveNetBufferLists-Funktion die empfangenen Daten in den vom Filtertreiber zugewiesenen Speicher kopieren oder den Puffer übergeben, indem sie die NdisFIndicateReceiveNetBufferLists-Funktion .

Hinweis Wenn das flag NDIS_RECEIVE_FLAGS_RESOURCES festgelegt ist, muss der Filtertreiber den ursprünglichen Satz von NET_BUFFER_LIST Strukturen in der verknüpften Liste beibehalten. Wenn dieses Flag beispielsweise festgelegt ist, kann der Treiber die Strukturen verarbeiten und sie einzeln im Stapel angeben, aber bevor die Funktion zurückgibt, muss sie die ursprüngliche verknüpfte Liste wiederherstellen.
 
Filtertreiber können empfangene Daten filtern, bevor sie die Daten für überlastende Treiber angeben. Für jeden Puffer, der an seine FilterReceiveNetBufferLists-Funktion übermittelt wird, kann ein Filtertreiber die folgenden Aktionen ausführen:
  • Übergeben Sie den Puffer an den nächsten übergeordneten Treiber, indem Sie den NdisFIndicateReceiveNetBufferLists-Funktion .

    Der Treiber kann den Inhalt des Puffers ändern, bevor NdisFIndicateReceiveNetBufferLists aufgerufen wird.

    Der Treiber kann die NDIS_RECEIVE_FLAGS_RESOURCES-Flageinstellung ändern, die NDIS an FilterReceiveNetBufferLists übergeben hat, oder sie einfach an NdisFIndicateReceiveNetBufferLists übergeben.

  • Verwerfen Sie den Puffer. Wenn NDIS das flag NDIS_RECEIVE_FLAGS_RESOURCES gelöscht hat, rufen Sie die NdisFReturnNetBufferLists-Funktion auf, um den Puffer zu verwerfen. Wenn NDIS das flag NDIS_RECEIVE_FLAGS_RESOURCES festgelegt hat, führen Sie keine Aktion aus, und kehren Sie von FilterReceiveNetBufferLists zurück, um den Puffer zu verwerfen.
  • Den Puffer zur späteren Verarbeitung in eine lokale Datenstruktur in die Warteschlange stellen. Wenn NDIS das NDIS_RECEIVE_FLAGS_RESOURCES-Flag von FilterReceiveNetBufferLists festgelegt hat, muss der Filtertreiber eine Kopie erstellen, bevor er von FilterReceiveNetBufferLists zurückgibt.
  • Kopieren Sie den Puffer, und erstellen Sie mit der Kopie eine Empfangsanzeige. Die Empfangsanzeige ähnelt einer vom Filtertreiber initiierten Empfangsanzeige. In diesem Fall muss der Treiber den ursprünglichen Puffer an den zugrunde liegenden Treiber zurückgeben.
Wenn der Filtertreiber NdisFIndicateReceiveNetBufferLists heißt und das NDIS_RECEIVE_FLAGS_RESOURCES-Flag nicht festgelegt hat, ruft NDIS die FilterReturnNetBufferLists-Funktion für das Filtermodul. In seiner FilterReturnNetBufferLists-Funktion macht der Filtertreiber die Vorgänge rückgängig, die er für den Puffer auf dem Empfangsanzeigepfad ausgeführt hat.

Wenn sich ein Filtermodul im Zustand Angehalten befindet, darf der Filtertreiber keine Empfangsanzeigen für dieses Filtermodul haben. Der Filtertreiber darf die erstellten Puffer nicht an NdisFIndicateReceiveNetBufferLists übergeben. Der Treiber kann jedoch eine Empfangsanzeige von einem zugrunde liegenden Treiber übergeben.

NDIS ruft FilterReceiveNetBufferLists unter IRQL <= DISPATCH_LEVEL auf.

Beispiele

Um eine FilterReceiveNetBufferLists-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 FilterReceiveNetBufferLists-Funktion mit dem Namen "MyReceiveNetBufferLists" zu definieren, verwenden Sie den typ FILTER_RECEIVE_NET_BUFFER_LISTS , wie in diesem Codebeispiel gezeigt:

FILTER_RECEIVE_NET_BUFFER_LISTS MyReceiveNetBufferLists;

Implementieren Sie dann Ihre Funktion wie folgt:

_Use_decl_annotations_
VOID
 MyReceiveNetBufferLists(
    NDIS_HANDLE  FilterModuleContext,
    PNET_BUFFER_LIST  NetBufferLists,
    NDIS_PORT_NUMBER  PortNumber,
    ULONG  NumberOfNetBufferLists,
    ULONG  ReceiveFlags
    )
  {...}

Der FILTER_RECEIVE_NET_BUFFER_LISTS 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 FILTER_RECEIVE_NET_BUFFER_LISTS 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

FilterAttach

FilterReturnNetBufferLists

FilterSetModuleOptions

NDIS_RECEIVE_QUEUE_PARAMETERS

NET_BUFFER

NET_BUFFER_LIST

NdisFIndicateReceiveNetBufferLists

NdisFRegisterFilterDriver

NdisFReturnNetBufferLists

NdisMAllocatePort

NdisSetOptionalHandlers

ProtocolReceiveNetBufferLists