Freigeben über


Senden von Daten aus einem Filtertreiber

Filtertreiber können Sendeanforderungen initiieren oder Sendeanforderungen filtern, die von überlastenden Treibern initiiert werden. Wenn ein Protokolltreiber die NdisSendNetBufferLists-Funktion aufruft , übermittelt NDIS die angegebene NET_BUFFER_LIST Struktur an das oberste Filtermodul im Treiberstapel.

Senden von Anforderungen, die von einem Filtertreiber initiiert wurden

Die folgende Abbildung veranschaulicht einen Sendevorgang, der von einem Filtertreiber initiiert wird.

Diagramm eines Sendevorgangs, der von einem Filtertreiber mit der Funktion NdisFSendNetBufferLists initiiert wurde.

Filtertreiber rufen die NdisFSendNetBufferLists-Funktion auf, um die Netzwerkdaten zu senden, die in einer Liste mit NET_BUFFER_LIST-Strukturen definiert sind.

Ein Filtertreiber muss das SourceHandle-Element jeder NET_BUFFER_LIST Struktur, die er erstellt, auf denselben Wert festlegen, den er an den NdisFilterHandle-Parameter von NdisFSendNetBufferLists übergibt. NDIS-Treiber sollten den SourceHandle-Member nicht für NET_BUFFER_LIST Strukturen ändern, von denen der Treiber nicht stammt.

Vor dem Aufrufen von NdisFSendNetBufferLists kann ein Filtertreiber Informationen festlegen, die die Sendeanforderung mit dem makro NET_BUFFER_LIST_INFO begleiten. Die zugrunde liegenden Treiber können diese Informationen mit dem makro NET_BUFFER_LIST_INFO abrufen.

Sobald ein Filtertreiber NdisFSendNetBufferLists aufruft, gibt er den Besitz der NET_BUFFER_LIST-Strukturen und aller zugehörigen Ressourcen auf. NDIS kann die Sendeanforderung verarbeiten oder die Anforderung an zugrunde liegende Treiber übergeben.

NDIS ruft die Funktion FilterSendNetBufferListsComplete auf, um die Strukturen und Daten an den Filtertreiber zurückzugeben. NDIS kann die Strukturen und Daten aus mehreren Sendeanforderungen in einer einzigen verknüpften Liste von NET_BUFFER_LIST Strukturen sammeln, bevor die Liste an FilterSendNetBufferListsComplete übergeben wird.

Bis NDIS FilterSendNetBufferListsComplete aufruft, ist der aktuelle status einer Sendeanforderung unbekannt. Ein Filtertreiber sollte niemals versuchen, die NET_BUFFER_LIST Strukturen oder zugehörigen Daten zu untersuchen, bevor NDIS die Strukturen an FilterSendNetBufferListsComplete zurückgibt.

FilterSendNetBufferListsComplete führt alle Nachverarbeitungsvorgänge aus, die zum Abschließen eines Sendevorgangs erforderlich sind.

Wenn NDIS FilterSendNetBufferListsComplete aufruft, erhält der Filtertreiber den Besitz aller Ressourcen zurück, die dem NET_BUFFER_LIST Strukturen zugeordnet sind, die durch den NetBufferLists-Parameter angegeben werden. FilterSendNetBufferListsComplete kann diese Ressourcen entweder freigeben (z. B. durch Aufrufen der Funktionen NdisFreeNetBuffer und NdisFreeNetBufferList ) oder sie für die Wiederverwendung in einem nachfolgenden Aufruf von NdisFSendNetBufferLists vorbereiten.

NDIS übermittelt immer vom Filter bereitgestellte Netzwerkdaten an die zugrunde liegenden Treiber in der vom Filtertreiber bestimmten Reihenfolge, wie sie an NdisFSendNetBufferLists übergeben werden. Nach dem Senden der Daten in der angegebenen Reihenfolge können die zugrunde liegenden Treiber die Puffer jedoch in beliebiger Reihenfolge zurückgeben.

Ein Filtertreiber kann ein Loopback für Sendeanforderungen anfordern, die von diesem stammen. Zum Anfordern eines Loopbacks legt der Treiber das NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK-Flag im SendFlags-Parameter von NdisFSendNetBufferLists fest. NDIS gibt ein empfangenes Paket an, das die Sendedaten enthält.

Hinweis Ein Filtertreiber sollte die gesendeten Anforderungen nachverfolgen und sicherstellen, dass die Funktion NdisFSendNetBufferListsComplete nicht aufgerufen wird, wenn diese Anforderungen abgeschlossen sind.

Filtern von Sendeanforderungen

Die folgende Abbildung veranschaulicht das Filtern einer Sendeanforderung, die von einem überlastenden Treiber initiiert wird.

Abbildung des Prozesses des Filterns einer Sendeanforderung, die von einem überladenden Treiber mithilfe der FilterSendNetBufferLists-Funktion initiiert wurde.

NDIS ruft die FilterSendNetBufferLists-Funktion eines Filtertreibers auf, um die Sendeanforderung eines überlastenden Treibers zu filtern.

Der Filtertreiber darf den SourceHandle-Member nicht in den NET_BUFFER_LIST-Strukturen ändern, die er von anderen Treibern empfängt.

Der Filtertreiber kann die Daten filtern und die gefilterten Daten an zugrunde liegende Treiber senden. Für jede NET_BUFFER-Struktur, die an FilterSendNetBufferLists übermittelt wird, kann ein Filtertreiber die folgenden Aktionen ausführen:

  • Übergeben Sie den Puffer an den nächsten zugrunde liegenden Treiber, indem Sie die Funktion NdisFSendNetBufferLists aufrufen. NDIS garantiert die Verfügbarkeit von Kontextraum (siehe NET_BUFFER_LIST_CONTEXT-Struktur) für Filtertreiber. Der Filtertreiber kann den Pufferinhalt ändern, bevor NdisFSendNetBufferLists aufgerufen wird. Die Verarbeitung der gefilterten Daten erfolgt wie bei einem Sendevorgang, der von einem Filtertreiber initiiert wird.

  • Löschen Sie den Puffer, indem Sie die Funktion NdisFSendNetBufferListsComplete aufrufen.

  • Warteschlange des Puffers in einer lokalen Datenstruktur für die spätere Verarbeitung. Der Entwurf des Filtertreibers bestimmt, was dazu führt, dass der Treiber einen Puffer in der Warteschlange verarbeitet. Einige Beispiele sind die Verarbeitung nach einem Timeout oder die Verarbeitung, nachdem ein bestimmter Puffer empfangen wurde.

    Hinweis Wenn die Treiberwarteschlangen Anforderungen für die spätere Verarbeitung senden, muss dies das Senden von Abbruchanforderungen unterstützen. Weitere Informationen zum Senden von Abbruchanforderungen finden Sie unter Abbrechen von Sendeanforderungen in einem Filtertreiber.

  • Kopieren Sie den Puffer, und erstellen Sie mit der Kopie eine Sendeanforderung. Der Sendevorgang ähnelt einer vom Filtertreiber initiierten Sendeanforderung. In diesem Fall muss der Treiber den ursprünglichen Puffer an den überlastenden Treiber zurückgeben, indem er die Funktion NdisFSendNetBufferListsComplete aufruft .

Der Abschluss der Sendeanforderungen führt den Treiberstapel nach oben. Wenn der Miniporttreiber die Funktion NdisMSendNetBufferListsComplete aufruft , ruft NDIS die FilterSendNetBufferListsComplete-Funktion für das niedrigste überlastende Filtermodul auf.

Nach Abschluss des Sendevorgangs kehrt der Filtertreiber die Änderungen an den Pufferdeskriptoren des überlastenden Treibers um, die der Filtertreiber in FilterSendNetBufferLists vorgenommen hat. Der Treiber ruft die NdisFSendNetBufferListsComplete-Funktion auf, um die verknüpfte Liste der NET_BUFFER_LIST Strukturen an die übergeordneten Treiber zurückzugeben und die endgültige status der Sendeanforderung zurückzugeben.

Wenn das oberste Filtermodul NdisFSendNetBufferListsComplete aufruft, ruft NDIS die ProtocolSendNetBufferListsComplete-Funktion des Ursprungsprotokolltreibers auf.

Ein Filtertreiber, der keine FilterSendNetBufferLists-Funktion bereitstellt, kann trotzdem eine Sendeanforderung initiieren. Wenn ein solcher Treiber eine Sendeanforderung initiiert, muss er eine FilterSendNetBufferListsComplete-Funktion bereitstellen und darf das gesamte Ereignis nicht im Treiberstapel übergeben.

Ein Filtertreiber kann die Loopbackanforderung eines überlaufenden Treibers übergeben oder filtern. Wenn NDIS eine Loopbackanforderung im SendFlags-Parameter von FilterSendNetBufferLists NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK festgelegt hat, legt der Filtertreiber NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK im SendFlags-Parameter fest, wenn er NdisFSendNetBufferLists aufruft. NDIS gibt ein empfangenes Paket an, das die Sendedaten enthält.

Wenn ein Filtertreiber ein Verhalten so ändert, dass NDIS keinen Standarddienst (z. B. Loopback) bereitstellen kann, muss der Filtertreiber diesen Dienst für NDIS bereitstellen. Beispielsweise sollte ein Filtertreiber, der eine Anforderung für die Hardwareadresse ändert (siehe OID_802_3_CURRENT_ADDRESS), loopback von Puffern behandeln, die an die neue Hardwareadresse weitergeleitet werden. In diesem Fall kann NDIS den in der Regel bereitgestellten Loopbackdienst nicht bereitstellen, da der Filter die Adresse geändert hat. Wenn der Filtertreiber außerdem den promiscuous-Modus festlegt (siehe OID_GEN_CURRENT_PACKET_FILTER), sollte er die zusätzlichen Daten, die er empfängt, nicht an überlastende Treiber übergeben.