FwpsConstructIpHeaderForTransportPacket0-Funktion (fwpsk.h)

Die Funktion FwpsConstructIpHeaderForTransportPacket0 wird von einer Legende aufgerufen, um einen neuen IP-Header zu erstellen oder einen bereits vorhandenen IP-Paketheader für nur einen Nettopuffer neu zu erstellen.

HinweisFwpsConstructIpHeaderForTransportPacket0 ist eine bestimmte Version von FwpsConstructIpHeaderForTransportPacket. Weitere Informationen finden Sie unter WFP Version-Independent Namen und Zielgruppenspezifische Windows-Versionen .
 

Syntax

NTSTATUS FwpsConstructIpHeaderForTransportPacket0(
  [in, out]      NET_BUFFER_LIST  *netBufferList,
                 ULONG            headerIncludeHeaderLength,
  [in]           ADDRESS_FAMILY   addressFamily,
  [in]           const UCHAR      *sourceAddress,
  [in]           const UCHAR      *remoteAddress,
  [in]           IPPROTO          nextProtocol,
  [in, optional] UINT64           endpointHandle,
  [in, optional] const WSACMSGHDR *controlData,
  [in]           ULONG            controlDataLength,
  [in]           UINT32           flags,
                 PVOID            reserved,
  [in, optional] IF_INDEX         interfaceIndex,
  [in, optional] IF_INDEX         subInterfaceIndex
);

Parameter

[in, out] netBufferList

Ein Zeiger auf eine NET_BUFFER_LIST Struktur, die die geklonten Transportschichtpaketdaten beschreibt, für die ein neuer IP-Header erstellt oder neu erstellt werden soll. Um einen neuen IP-Header zu erstellen, suchen Sie den Offset der geklonten NET_BUFFER_LIST-Struktur am Anfang des Transportheaders. Um einen bereits vorhandenen IP-Paketheader neu zu erstellen, suchen Sie den Offset am Anfang des IP-Headers.

headerIncludeHeaderLength

Wenn die NET_BUFFER_LIST Struktur, auf die netBufferList verweist, bereits einen IP-Header enthält, gibt die Gesamtgröße des vorhandenen IP-Headers (sofern vorhanden) in Bytes an. Wenn NetBufferList keinen IP-Header enthält, ist headerIncludeHeaderSize 0. Andernfalls entspricht der Wert dieses Parameters dem ipHeaderSize-Member des FWPS_INCOMING_METADATA_VALUES0 Struktur, die an die Legendenfunktion klassifizierenFn des Legendentreibers übergeben wird. Beachten Sie, dass Erweiterungsheader für einen vorhandenen IPv6-Header entfernt werden, wenn diese Funktion aufgerufen wird, obwohl IPv4-Optionen beibehalten werden. Weitere Informationen finden Sie in den Hinweisen.

[in] addressFamily

Eine der folgenden Adressfamilien:

AF_INET

Die IPv4-Adressfamilie.

AF_INET6

Die IPv6-Adressfamilie.

[in] sourceAddress

Ein Zeiger auf die Quell-IP-Adresse, die Teil des zu erstellenden IP-Headers ist. Für IPv4 ist die Adresse 4 Bytes. Für IPv6 ist die Adresse 16 Bytes. Die Quelladressbytes befinden sich immer in Netzwerkbytereihenfolge.

[in] remoteAddress

Ein Zeiger auf einen Puffer, der die Remote-IP-Adresse angibt, die Teil des zu erstellenden IP-Headers sein wird.

Der Puffer kann eine IPv4-Adresse (4 Bytes) oder eine IPv6-Adresse (16 Bytes) enthalten, und die Adresse muss in der Reihenfolge der Netzwerkbytes angegeben werden. Die IP-Version muss mit dem addressFamily-Parameter übereinstimmen.

[in] nextProtocol

Gibt den IPPROTO-Protokolltyp des neuen IP-Headers an, der erstellt werden soll. Weitere Informationen zur IPPROTO-Enumeration finden Sie unter AF_INET oder AF_INET6.

[in, optional] endpointHandle

Ein optionaler Handle, der den Stapeltransportendpunkt im Sendedatenpfad angibt, in den das Paket eingefügt werden soll. Dieses Endpunkthandle wird einer Legende über das transportEndpointHandle-Element des FWPS_INCOMING_METADATA_VALUES0 Struktur, die an die Legendenfunktion klassifizierenFn des Legendentreibers übergeben wird.

[in, optional] controlData

Ein optionaler Zeiger auf einen Puffer, der Socketsteuerungsdaten enthält, die von der Funktion WSASendMsg angegeben werden, die in der Microsoft Windows SDK-Dokumentation beschrieben wird. Informationen zum WSACMSGHDR-Typ finden Sie unter CMSGHDR.

Falls vorhanden, werden Socketsteuerelementdaten für eine Legende mit dem controlData-Member des FWPS_INCOMING_METADATA_VALUES0 Struktur, die an die Legendenfunktion klassifizierenFn des Legendentreibers übergeben wird.

Wenn Socketsteuerungsdaten nicht NULL sind, müssen sie in der Implementierung der Funktion klassifizierenFn des Callouttreibers tief kopiert werden, und der controlData-Puffer muss gültig bleiben, bis die Einschleusungsfunktion aufgerufen wird.

[in] controlDataLength

Die Länge des controlData-Parameters in Bytes.

[in] flags

Flags, die angeben, ob die NBL für den Sende- oder Empfangspfad vorgesehen ist. Der Flags-Parameter kann die folgenden Werte aufweisen:

Wert Bedeutung
FWPS_CONSTRUCT_IPHEADER_FOR_SEND Wenn dieses Flag festgelegt ist, gibt dieses Flag an, dass die NBL für den Sendepfad vorgesehen ist.
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE Wenn dieses Flag festgelegt ist, gibt dieses Flag an, dass die NBL für den Empfangspfad vorgesehen ist.

Für Legendentreiber, die USO oder URO unterstützen, ist es obligatorisch, diesen Parameter auf einen dieser Werte festzulegen. Andere Legendentreiber können diesen Parameter auf Null festlegen. Diese Flags werden nur unter Windows Server 2022 23H2 und höher unterstützt. Bei früheren Versionen von Windows müssen Legendentreiber diesen Parameter immer auf 0 festlegen.

reserved

Reserviert. Legendentreiber müssen diesen Parameter auf NULL festlegen.

[in, optional] interfaceIndex

Der Index der Schnittstelle, auf der die ursprünglichen Paketdaten empfangen wurden. Ein Legendentreiber sollte den Wert des Schnittstellenindexes verwenden, der als einer der eingehenden Datenwerte an seine KlassifizierungFn-Legendenfunktion für diesen Parameter übergeben wird. Dieser Parameter ist optional und kann null sein.

[in, optional] subInterfaceIndex

Der Index der Unteroberfläche, auf der die ursprünglichen Paketdaten empfangen wurden. Ein Legendentreiber sollte den Wert des Unteroberflächesindex verwenden, der als einer der eingehenden Datenwerte an die KlassifizierungFn-Legendenfunktion für diesen Parameter übergeben wird, wenn das Paket in dieselbe Unteroberfläche eingefügt werden soll, in der das ursprüngliche Paket angegeben wurde. Dieser Parameter ist optional und kann null sein.

Rückgabewert

Die Funktion FwpsConstructIpHeaderForTransportPacket0 gibt einen der folgenden NTSTATUS-Codes zurück.

Rückgabecode Beschreibung
STATUS_SUCCESS
Ein neuer IP-Header wurde erfolgreich erstellt.
Andere status Codes
Ein Fehler ist aufgetreten.

Hinweise

Aus einer Netzpufferliste, die auf einer WFP-Ausgehenden Transportebene (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx) geklont wurde, erstellt FwpsConstructIpHeaderForTransportPacket0 einen neuen Header für jeden Netzpuffer, der Teil der Netzwerkpufferlistenkette ist. Diese Funktion kann auch verwendet werden, um den bereits vorhandenen IP-Header eines Pakets neu zu erstellen. In diesem Fall darf die Netzpufferliste nur einen Nettopuffer enthalten.

Diese Funktion ist nützlich, wenn der IP-Header noch nicht erstellt wurde, aber die Quell-IP-Adresse oder der Quellport von der Transportschicht aus geändert werden muss. Obwohl es normalerweise möglich wäre, mit der Durchführung solcher Änderungen zu warten, bis das Paket die Netzwerkschicht erreicht, kann dies nicht in einer IPsec-Umgebung erfolgen, in der IP-Pakete verschlüsselt oder digital signiert werden, bevor sie die Netzwerkschicht erreichen.

Die Quell-IP-Adresse kann in eine andere lokal definierte IP-Adresse oder eine andere Adresse geändert werden, die auf dem lokalen Computer nicht vorhanden ist. So geänderte Pakete können dann gesendet oder in den Empfangs- oder Weiterleitungsdatenpfad eingefügt werden.

Wenn ein nonzero endpointHandle-Parameter angegeben wird, werden sitzungszustände (Socketoptionen) (sofern vorhanden) verwendet, die dem Socket zugeordnet sind, um jeden neuen IP-Header zu erstellen. Wenn zusätzliche Socketoptionen mit den Parametern controlData und controlDataLength angegeben werden, werden diese Optionen verwendet, um jeden neuen IP-Header zu erstellen.

Wenn die Eingabenetzpufferliste von einer eingehenden WFP-Transportschicht geklont wurde oder als Ergebnis eines Unformatierten Sendevorgangs erstellt wurde, enthalten die Netzpuffer bereits einen IP-Header. In diesem Fall werden beim Aufruf dieser Funktion IPv4-Optionen im neuen IP-Header beibehalten, aber AH/ESP-Header und IPv6-Erweiterungsheader werden entfernt. Da der TCP/IP-Stapel nach der IPsec-Verarbeitung AH/ESP-Header beibehält, können Pakete, die von WFP angegeben und durch Legenden geklont wurden, nicht ohne weiteres in den Empfangsdatenpfad eingefügt werden. Daher ist diese Funktion nützlich, um IPsec-verarbeitete Pakete neu zu erstellen, die mit der Funktion FwpsInjectTransportReceiveAsync0 in den Empfangsdatenpfad eingefügt werden sollen.

Für eine Header-Include-Sitzung; Um beispielsweise GRE-Datenverkehr (Generic Routing Encapsulation) (IP-Protokoll 47) zu filtern, der auf einem rohen Socket von ausgehenden Transportebenen gesendet wird, verwenden Sie das folgende Verfahren, bevor Sie FwpsConstructIpHeaderForTransportPacket0 aufrufen:

  1. Klonen Sie die Netzpufferliste, indem Sie die FwpsAllocateCloneNetBufferList0-Funktion .
  2. Wenn das headerIncludeHeaderLength-Element der FWPS_INCOMING_METADATA_VALUES0-Struktur, auf das der inMetaValues-Parameter der klassifizierenFn-Funktion verweist, größer als 0 ist, ziehen Sie die geklonte Nettopufferliste um diesen Betrag zurück. beispielsweise durch einen Aufruf von NdisRetreatNetBufferListDataStart.
  3. Kopieren Sie den Puffer, auf den vom headerIncludeHeader-Member von FWPS_INCOMING_METADATA_VALUES0 in den neu zurückgezogenen Bereich der geklonten Netpufferliste verwiesen wird. Die Größe des Puffers muss dem Wert von headerIncludeHeaderLength entsprechen.
  4. Rufen Sie fwpsConstructIpHeaderForTransportPacket0 auf, bei dem der NetBufferList-Parameter auf die geklonte Netzpufferliste und der headerIncludeHeaderSize-Parameter auf den Wert von headerIncludeHeaderLength festgelegt ist.
FwpsConstructIpHeaderForTransportPacket0 deaktiviert die Unterstützung für die große Sendeauslagerung (Large Send Offload, LSO) und die Auslagerung von Prüfsummen für die resultierende Nettopufferliste. Vollständige Prüfsummen werden für Protokolle der oberen Ebene (TCP, UDP und ICMP) berechnet. Die IP-Prüfsumme wird neu berechnet, wenn der IP-Header rekonstruiert wird.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar ab Windows Server 2008.
Zielplattform Universell
Header fwpsk.h (include fwpsk.h)
Bibliothek Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

Weitere Informationen

AF_INET

AF_INET6

CMSGHDR

FWPS_INCOMING_METADATA_VALUES0 FwpsInjectTransportReceiveAsync0

NET_BUFFER_LIST

klassifizierenFn