Freigeben über


Paketeinfügungsfunktionen

Ein Callout-Treiber kann die folgenden WFP-Funktionen aufrufen, um pendierte oder geänderte Paketdaten in den TCP/IP-Stapel einzufügen. Die anwendbaren Ebenen, aus denen Daten zusammen mit möglichen Zielen eingefügt werden können, sind in der folgenden Tabelle aufgeführt.

Einfügungsfunktion Anwendbare Ebene Bestimmungsort

FwpsInjectForwardAsync0

Netzwerkschicht

der Weiterleitungsdatenpfad

FwpsInjectNetworkReceiveAsync0

Netzwerkschicht

den Empfangsdatenpfad

FwpsInjectNetworkSendAsync0

Netzwerkschicht

Der Pfad zum Senden von Daten

FwpsInjectTransportReceiveAsync0

Paketdaten aus den Transport-, Datagrammdaten-, ICMP-Fehler- oder ALE-Schichten

den Empfangsdatenpfad

FwpsInjectTransportSendAsync0

Paketdaten aus den Transport-, Datagrammdaten-, ICMP-Fehler- oder ALE-Schichten

Der Pfad zum Senden von Daten

FwpsStreamInjectAsync0

TCP-Datensegmente

Datenstrom

Darüber hinaus wird die FwpsQueryPacketInjectionState0-Funktion verwendet, um den Einfügungsverlauf von Paketdaten zu prüfen.

Cross-Layer Injection ist aktiviert, wenn das Callout alle erforderlichen Informationen bereitstellen kann, die von der Injektionsfunktion benötigt werden, und die Net-Puffer-Liste das von der Injektionsfunktion erwartete Format aufweist. Beispielsweise kann eine Legende ein Paket im Weiterleitungspfad erfassen, seine Zieladresse an die des lokalen Computers ändern und FwpsInjectTransportReceiveAsync0 aufrufen, um das Paket in den TCP/IP-Stapel des lokalen Computers umzuleiten.

Mit Ausnahme der Streameinfügung (TCP-Daten) werden eingefügte eingehende Pakete von der "unteren" Seite des Stapels und der WFP-Schichten wieder eingefügt, während die eingefügten ausgehenden Pakete von der "oberen" Seite des Stapels und der WFP-Schichten wieder eingefügt werden. Ein UDP-Paket, das aus der eingehenden Datagrammdatenebene eingefügt wird, tritt beispielsweise erneut in den Stapel ein und durchquert die Netzwerkschicht, die Transportschicht, die optionalen ALE-Empfangs- oder -Akzeptierschichten und kehrt dann wieder zur Datagrammdatenebene zurück. Ein weiteres UDP-Paket, das von der ausgehenden Netzwerkebene eingefügt wird, tritt erneut in den Stapel ein und durchläuft die ALE- (optional), Datagrammdaten- und Transportschicht und kehrt zur Netzwerkschicht zurück.

FwpsInjectTransportReceiveAsync0 umgeht die IPsec-Verarbeitung für das erneut eingefügte Paket automatisch, da es zuvor die IPsec-Überprüfung durchlaufen hatte.

Ein Paket, das von einem WFP-Callout-Treiber injiziert wird, wird dem Callout erneut zugeordnet, außer in den Fällen, in denen Änderungen an dem Paket dazu führen, dass es nicht mehr den ursprünglichen Filterbedingungen entspricht. WFP stellt die FwpsQueryPacketInjectionState0-Funktion für Callouts bereit, um zu prüfen, ob das Paket vom Callout eingefügt (oder bereits früher eingefügt) wurde. Um endlose Schleifen zu verhindern, sollten Callouts selbsteingefügte Pakete zulassen.

Callouts müssen die IP- oder Transportschicht-Prüfsumme, oder beides, anpassen, nachdem sie ein IP-Paket geändert haben. Ein Callout kann die Prüfsumme auf 0 für UDP über IPv4-Pakete festlegen. Um mit der Auslagerung der Transportschicht-Prüfsumme kompatibel zu sein und die Berechnungen der vollständigen Prüfsumme im Vergleich zur Pseudoprüfsumme entsprechend anzupassen, kann ein Callout die folgende Logik verwenden:

NDIS_TCP_IP_CHECKSUM_PACKET_INFO ChecksumInfo;
 ChecksumInfo.Value = 
 (ULONG) (ULONG_PTR)NET_BUFFER_LIST_INFO(
 NetBufferList,TcpIpChecksumNetBufferListInfo);

Wenn ChecksumInfo.Transmit.NdisPacketTcpChecksum TRUEist, wird der TCP-Sendevorgang ausgelagert. Wenn ChecksumInfo.Transmit.NdisPacketUdpChecksum TRUEist, wird der UDP-Sendevorgang ausgelagert.

Wenn in Windows Vista mit Service Pack 1 (SP1) und Windows Server 2008 inMetaValues->headerIncludeHeaderLength größer als 0 ist, handelt es sich bei dem ausgehenden Paket um eine RAW-Sende-Wiedereinfügung, die einen IP-Header enthält. Zum Ausführen von RAW-Sende-Wiedereinfügungen, die einen IP-Header für Windows Vista mit SP1 und Windows Server 2008 enthalten, müssen Sie das geklonte Paket um den Betrag in inMetaValues->headerIncludeHeaderLength zurückziehen und inMetaValues->headerIncludeHeader über den neu erweiterten Bereich kopieren. Verwenden Sie dann FwpsInjectTransportSendAsync0 zusammen mit der Netzpufferliste für das Paket und lassen Sie den FWPS_TRANSPORT_SEND_PARAMS0-Parameter auf NULLgesetzt. Weitere Informationen zu Operationen zum Zurückgehen bei Netzpufferlisten finden Sie unter Vorgänge zum Zurück- und Vorgehen.

Hinweis Bei unformatierten Sendevorgängen darf die Nettopufferliste nur einen einzelnen Nettopuffer enthalten. Wenn Ihre Nettopufferliste mehr als einen Nettopuffer enthält, müssen Sie die Nettopufferliste in eine Abfolge von Nettopufferlisten konvertieren, und jede in der Abfolge muss einen einzelnen Nettopuffer enthalten. Weitere Informationen zur Verwaltung von Netzpufferlisten finden Sie unter NET_BUFFER Architecture.