Freigeben über


Empfangen von Daten in einem Filtertreiber

Filtertreiber können Empfangsanzeigen initiieren oder Empfangsanzeigen von zugrunde liegenden Treibern filtern. Wenn ein Miniporttreiber die NdisMIndicateReceiveNetBufferLists-Funktion aufruft , übermittelt NDIS die angegebene NET_BUFFER_LIST Struktur an das niedrigste überlastende Filtermodul im Treiberstapel.

Empfangen von Hinweisen, die von einem Filtertreiber initiiert wurden

Die folgende Abbildung veranschaulicht eine Empfangsanzeige, die von einem Filtertreiber initiiert wird.

Diagramm zur Veranschaulichung einer Empfangsanzeige, die von einem Filtertreiber initiiert wurde.

Filtertreiber rufen die NdisFIndicateReceiveNetBufferLists-Funktion auf, um empfangene Daten anzugeben. Die NdisFIndicateReceiveNetBufferLists-Funktion übergibt die angegebene Liste der NET_BUFFER_LIST Strukturen im Stapel an übersteigende Treiber. Der Filtertreiber ordnet die Strukturen aus Pools zu, die er während der Initialisierung erstellt hat.

Wenn ein Filtertreiber das NDIS_RECEIVE_FLAGS_RESOURCES-Flag im ReceiveFlags-Parameter von NdisFIndicateReceiveNetBufferLists festlegt, gibt dies an, dass der Filtertreiber den Besitz der NET_BUFFER_LIST-Strukturen sofort wieder erlangen muss. In diesem Fall ruft NDIS die FilterReturnNetBufferLists-Funktion des Filtertreibers nicht auf, um die NET_BUFFER_LIST Strukturen zurückzugeben. Der Filtertreiber erhält den Besitz sofort wieder, nachdem NdisFIndicateReceiveNetBufferLists zurückgegeben wurde.

Wenn ein Filtertreiber das NDIS_RECEIVE_FLAGS_RESOURCES-Flag im ReceiveFlags-Parameter von NdisFIndicateReceiveNetBufferLists nicht festgelegt, gibt NDIS die angegebenen NET_BUFFER_LIST Strukturen an die FilterReturnNetBufferLists-Funktion des Filtertreibers zurück. In diesem Fall gibt der Filtertreiber den Besitz der angegebenen Strukturen auf, bis sie von NDIS an FilterReturnNetBufferLists zurückgegeben werden.

Hinweis Ein Filtertreiber sollte Empfangsanzeigen, die er initiiert, nachverfolgen und sicherstellen, dass die NdisFReturnNetBufferLists-Funktion nicht aufgerufen wird, wenn der Empfangsvorgang abgeschlossen ist.

Filtern von Empfangsanzeigen

Die folgende Abbildung veranschaulicht eine gefilterte Empfangsanzeige, die von einem zugrunde liegenden Treiber initiiert wird.

Diagramm zur Veranschaulichung einer gefilterten Empfangsanzeige, die von einem zugrunde liegenden Treiber initiiert wurde.

NDIS ruft die FilterReceiveNetBufferLists-Funktion eines Filtertreibers auf, um Empfangsanzeigen zu verarbeiten, die von zugrunde liegenden Treibern stammen. NDIS ruft FilterReceiveNetBufferLists auf, nachdem ein zugrunde liegender Treiber eine Empfangsanzeigefunktion aufgerufen hat (z. B. NdisMIndicateReceiveNetBufferLists), um empfangene Netzwerkdaten oder Loopbackdaten anzugeben.

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

Wenn das NDIS_RECEIVE_FLAGS_RESOURCES-Flag im ReceiveFlags-Parameter festgelegt ist, kann der Filtertreiber die NET_BUFFER_LIST Struktur und die zugeordneten zugrunde liegenden treiberseitig zugewiesenen Ressourcen nicht beibehalten. Dieses Flag kann darauf hinweisen, dass der zugrunde liegende Treiber für Empfangsressourcen knapp wird. Die FilterReceiveNetBufferLists-Funktion sollte so schnell wie möglich zurückgegeben werden.

Hinweis Wenn das NDIS_RECEIVE_FLAGS_RESOURCES-Flag 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 Filtervorgänge für empfangene Daten ausführen, 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 ihn an den nächsten überlastenden Treiber, indem Sie NdisFIndicateReceiveNetBufferLists aufrufen. Der Treiber kann den Inhalt des Puffers ändern. NDIS garantiert die Verfügbarkeit von Kontextraum (siehe NET_BUFFER_LIST_CONTEXT Struktur).

    Ein Filtertreiber kann die status ändern, die NDIS an FilterReceiveNetBufferLists übergeben hat, oder einfach an NdisFIndicateReceiveNetBufferLists übergeben.

    Hinweis Ein Filtertreiber kann einen Puffer mit NdisFIndicateReceiveNetBufferLists übergeben, auch wenn NDIS das NDIS_RECEIVE_FLAGS_RESOURCES-Flag im ReceiveFlags-Parameter von FilterReceiveNetBufferLists festlegt. In diesem Fall darf der Filtertreiber nicht von FilterReceiveNetBufferLists zurückgegeben werden, bis er den Besitz des Puffers wiedererlangt.

  • Verwerfen Sie den Puffer. Wenn NDIS das NDIS_RECEIVE_FLAGS_RESOURCES-Flag im ReceiveFlags-Parameter von FilterReceiveNetBufferLists gelöscht hat, rufen Sie die Funktion NdisFReturnNetBufferLists auf, um den Puffer zu verwerfen. Wenn NDIS das flag NDIS_RECEIVE_FLAGS_RESOURCES im ReceiveFlags-Parameter von FilterReceiveNetBufferLists festgelegt hat, führen Sie keine Aktion aus, und kehren Sie von FilterReceiveNetBufferLists zurück, um den Puffer zu verwerfen.

  • Warteschlange des Puffers in einer lokalen Datenstruktur für die spätere Verarbeitung. Wenn NDIS das NDIS_RECEIVE_FLAGS_RESOURCES-Flag im ReceiveFlags-Parameter von FilterReceiveNetBufferLists festgelegt hat, muss der Filtertreiber eine Kopie erstellen, bevor von FilterReceiveNetBufferLists zurückgegeben wird.

  • 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.

Die NdisFIndicateReceiveNetBufferLists-Funktion übergibt die angegebene Liste der NET_BUFFER_LIST Strukturen, die den Treiberstapel an übersteigende Treiber aufsteigen. Der Empfangsvorgang verläuft ähnlich wie ein vom Filtertreiber initiierter Empfangsvorgang.

Wenn ein überlastender Treiber den Besitz des Puffers beibehalten hat, ruft NDIS die FilterReturnNetBufferLists-Funktion für das Filtermodul auf. In seiner FilterReturnNetBufferLists-Funktion macht der Filtertreiber die Vorgänge rückgängig, die er für den Puffer im Empfangsanzeigepfad ausgeführt hat.

Wenn das Filtermodul der niedrigsten Schicht angibt, dass es mit einem Puffer erfolgt, gibt NDIS den Puffer an den Miniporttreiber zurück. Wenn NDIS das flag NDIS_RECEIVE_FLAGS_RESOURCES im ReceiveFlags-Parameter von FilterReceiveNetBufferLists gelöscht hat, ruft der Filtertreiber NdisFReturnNetBufferLists auf, um den Puffer zurückzugeben. Wenn NDIS das NDIS_RECEIVE_FLAGS_RESOURCES-Flag im ReceiveFlags-Parameter von FilterReceiveNetBufferLists festgelegt hat, gibt das Zurückgeben von FilterReceiveNetBufferLists den Puffer zurück.