Paketeinschleusungsfunktionen
Ein Legendentreiber 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 eingefügt werden können, sowie mögliche Ziele sind in der folgenden Tabelle aufgeführt.
Einschleusfunktion | Anwendbare Ebene | Destination |
---|---|---|
Netzwerkebene |
der Weiterleitungsdatenpfad |
|
Netzwerkebene |
der Empfangsdatenpfad |
|
Netzwerkebene |
der Sendedatenpfad |
|
Paketdaten aus der Transportschicht, Datagrammdaten, ICMP-Fehler oder ALE-Ebenen |
der Empfangsdatenpfad |
|
Paketdaten aus der Transportschicht, Datagrammdaten, ICMP-Fehler oder ALE-Ebenen |
der Sendedatenpfad |
|
TCP-Datensegmente |
einen Datenstrom |
Darüber hinaus wird die Funktion FwpsQueryPacketInjectionState0 verwendet, um den Einschleusungsverlauf von Paketdaten zu überprüfen.
Die schichtübergreifende Einschleusung ist aktiviert, wenn die Legende alle benötigten Informationen bereitstellen kann, die für die Einschleusungsfunktion erforderlich sind, und die Netzpufferliste das format aufweist, das von der Einschleusfunktion erwartet wird. Beispielsweise kann eine Legende ein Paket im Vorwärtspfad erfassen, seine Zieladresse in die des lokalen Computers ändern und FwpsInjectTransportReceiveAsync0 aufrufen, um das Paket in den TCP/IP-Stapel des lokalen Computers umzuleiten.
Mit Ausnahme der Streameinschleusung (TCP-Daten) werden eingehende Pakete vom "unteren Rand" des Stapels und der WFP-Schicht wieder eingefügt, während die eingefügten ausgehenden Pakete von der "oberen" Stapel- und WFP-Ebene wieder in den "oberen Bereich" der Stapel- und WFP-Ebene eingespeist werden. Ein UDP-Paket, das aus der eingehenden Datagrammdatenebene eingefügt wurde, tritt beispielsweise erneut in den Stapel ein und durchquert die Netzwerkschicht, die Transportschicht, die ALE-Empfangs- oder Akzeptierschicht (optional) und wieder in die Datagrammdatenebene. Ein weiteres UDP-Paket, das von der ausgehenden Netzwerkschicht eingefügt wird, wird erneut in den Stapel eingespeist, und durchläuft die ALE (optional), die Datagrammdaten und die Transportebene und zurück zur Netzwerkebene.
FwpsInjectTransportReceiveAsync0 umgeht automatisch die IPsec-Verarbeitung für das neu eingefügte Paket, da es zuvor die IPsec-Überprüfung durchlaufen hatte.
Ein Paket, das von einem WFP-Legendentreiber eingefügt wird, wird der Legende erneut angezeigt, außer in den Fällen, in denen die Änderung des Pakets dazu führt, dass die ursprünglichen Filterbedingungen verfehlt werden. WFP stellt die FwpsQueryPacketInjectionState0-Funktion für Legenden bereit, um abzufragen, ob das Paket von der Legende eingefügt (oder zuvor eingefügt wurde). Um endlose Schleifen zu verhindern, sollten Legenden selbst eingefügte Pakete zulassen.
Legenden müssen die IP- oder Transportschicht-Prüfsumme oder beides anpassen, nachdem sie ein IP-Paket geändert haben. Eine Legende kann die Prüfsumme für UDP über IPv4-Pakete auf 0 festlegen. Um mit der Abladung der Transportschicht-Prüfsumme kompatibel zu sein und die Berechnungen der vollständigen Prüfsumme im Vergleich zur Pseudoprüfsumme entsprechend anzupassen, kann eine Legende 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 true ist, wird der TCP-Sendevorgang abgeladen. Wenn ChecksumInfo.Transmit.NdisPacketUdpChecksum TRUE ist, wird der UDP-Sendevorgang ausgeladen.
Wenn in Windows Vista mit Service Pack 1 (SP1) und Windows Server 2008 inMetaValues-headerIncludeHeaderLength> größer als 0 ist, ist das ausgehende Paket eine RAW-Senderejektion, die einen IP-Header enthält. Zum Ausführen von RAW-Sendevorgängen, 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 den inMetaValues-headerIncludeHeader> über den neu erweiterten Bereich kopieren. Verwenden Sie dann FwpsInjectTransportSendAsync0 mit der Nettopufferliste für das Paket, und lassen Sie den parameter FWPS_TRANSPORT_SEND_PARAMS0 auf NULL festgelegt. Weitere Informationen zu Rückzugsvorgängen für Nettopufferlisten finden Sie unter Rückzugs- und Advance-Vorgänge.
Hinweis Bei unformatierten Sendevorgängen darf die Nettopufferliste nur einen einzelnen Nettopuffer enthalten. Wenn Ihre Nettopufferliste mehr als einen Netpuffer enthält, müssen Sie Ihre Net buffer-Liste in eine Reihe von Net buffer-Listen konvertieren, und jede in der Reihe muss einen einzelnen Netpuffer enthalten. Weitere Informationen zur Verwaltung von Netzpufferlisten finden Sie unter NET_BUFFER-Architektur.