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.
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 |
---|---|
|
Ein neuer IP-Header wurde erfolgreich erstellt. |
|
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:
- Klonen Sie die Netzpufferliste, indem Sie die FwpsAllocateCloneNetBufferList0-Funktion .
- 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.
- 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.
- Rufen Sie fwpsConstructIpHeaderForTransportPacket0 auf, bei dem der NetBufferList-Parameter auf die geklonte Netzpufferliste und der headerIncludeHeaderSize-Parameter auf den Wert von headerIncludeHeaderLength festgelegt ist.
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 |