Partager via


FwpsConstructIpHeaderForTransportPacket0, fonction (fwpsk.h)

La fonction FwpsConstructIpHeaderForTransportPacket0 est appelée par une légende pour construire un nouvel en-tête IP ou pour reconstruire un en-tête de paquet IP préexistant pour un seul tampon net.

RemarqueFwpsConstructIpHeaderForTransportPacket0 est une version spécifique de FwpsConstructIpHeaderForTransportPacket. Pour plus d’informations , consultez WFP Version-Independent Names and Targeting Specific Versions of Windows .
 

Syntaxe

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
);

Paramètres

[in, out] netBufferList

Pointeur vers une structure de NET_BUFFER_LIST qui décrit les données de paquets de couche de transport clonées pour lesquelles un nouvel en-tête IP doit être construit ou reconstruit. Pour construire un nouvel en-tête IP, recherchez le décalage de la structure NET_BUFFER_LIST cloné au début de l’en-tête de transport. Pour reconstruire un en-tête de paquet IP préexistant, recherchez le décalage au début de l’en-tête IP.

headerIncludeHeaderLength

Si la structure NET_BUFFER_LIST pointée par NetBufferList contient déjà un en-tête IP, indique la taille totale, en octets, de l’en-tête IP existant (s’il existe). Si NetBufferList ne contient pas d’en-tête IP, headerIncludeHeaderSize est égal à zéro. Sinon, la valeur de ce paramètre est égale au membre ipHeaderSize du FWPS_INCOMING_METADATA_VALUES0 structure passée à la fonction de légende classifyFn du pilote de légende. Notez que les en-têtes d’extension d’un en-tête IPv6 existant sont supprimés lorsque cette fonction est appelée, bien que les options IPv4 soient conservées. Pour plus d'informations, consultez la section Notes.

[in] addressFamily

L’une des familles d’adresses suivantes :

AF_INET

Famille d’adresses IPv4.

AF_INET6

Famille d’adresses IPv6.

[in] sourceAddress

Pointeur vers l’adresse IP source qui fera partie de l’en-tête IP à construire. Pour IPv4, l’adresse est de 4 octets. Pour IPv6, l’adresse est de 16 octets. Les octets d’adresse source sont toujours dans l’ordre d’octet du réseau.

[in] remoteAddress

Pointeur vers une mémoire tampon qui spécifie l’adresse IP distante qui fera partie de l’en-tête IP à construire.

La mémoire tampon peut contenir une adresse IPv4 (4 octets) ou une adresse IPv6 (16 octets), et l’adresse doit être spécifiée dans l’ordre d’octet réseau. La version IP doit correspondre au paramètre addressFamily .

[in] nextProtocol

Spécifie le type de protocole IPPROTO du nouvel en-tête IP à construire. Pour plus d’informations sur l’énumération IPPROTO, consultez AF_INET ou AF_INET6.

[in, optional] endpointHandle

Handle facultatif qui indique le point de terminaison de transport de la pile dans le chemin d’envoi des données dans lequel le paquet doit être injecté. Ce handle de point de terminaison est fourni à une légende par le biais du membre transportEndpointHandle du FWPS_INCOMING_METADATA_VALUES0 structure passée à la fonction de légende classifyFn du pilote de légende.

[in, optional] controlData

Pointeur facultatif vers une mémoire tampon qui contient les données de contrôle de socket spécifiées par la fonction WSASendMsg, qui est décrite dans la documentation Microsoft Windows SDK. Pour plus d’informations sur le type WSACMSGHDR, consultez CMSGHDR.

Le cas échéant, les données de contrôle de socket sont fournies à une légende avec le membre controlData du FWPS_INCOMING_METADATA_VALUES0 structure passée à la fonction de légende classifyFn du pilote de légende.

Si les données de contrôle de socket n’ont pas la valeur NULL, elles doivent être copiées en profondeur dans l’implémentation du pilote de légende de la fonction classifyFn , et la mémoire tampon controlData doit être conservée valide jusqu’à ce que la fonction d’achèvement de l’injection soit appelée.

[in] controlDataLength

Longueur, en octets, du paramètre controlData .

[in] flags

Indicateurs qui spécifient si le NBL est destiné au chemin d’envoi ou de réception. Le paramètre flags peut avoir les valeurs suivantes :

Valeur Signification
FWPS_CONSTRUCT_IPHEADER_FOR_SEND Lorsqu’il est défini, cet indicateur spécifie que le NBL est destiné au chemin d’envoi.
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE Lorsqu’il est défini, cet indicateur spécifie que le NBL est destiné au chemin de réception.

Pour les pilotes de légende qui prennent en charge USO ou URO, il est obligatoire de définir ce paramètre sur l’une de ces valeurs. D’autres pilotes de légende peuvent définir ce paramètre sur zéro. Ces indicateurs sont uniquement pris en charge sur Windows Server 2022 23H2 et versions ultérieures. Dans les versions antérieures de Windows, les pilotes de légende doivent toujours définir ce paramètre sur zéro.

reserved

Réservé. Les pilotes de légende doivent définir ce paramètre sur NULL.

[in, optional] interfaceIndex

Index de l’interface sur laquelle les données du paquet d’origine ont été reçues. Un pilote de légende doit utiliser la valeur de l’index d’interface qui est passé comme l’une des valeurs de données entrantes à sa fonction de légende classifyFn pour ce paramètre. Ce paramètre est facultatif et peut être égal à zéro.

[in, optional] subInterfaceIndex

Index de la sous-interface sur laquelle les données de paquet d’origine ont été reçues. Un pilote de légende doit utiliser la valeur de l’index de sous-interface qui est passée comme l’une des valeurs de données entrantes à sa fonction de légende classifyFn pour ce paramètre si le paquet doit être injecté dans la même sous-interface où le paquet d’origine a été indiqué. Ce paramètre est facultatif et peut être égal à zéro.

Valeur retournée

La fonction FwpsConstructIpHeaderForTransportPacket0 retourne l’un des codes NTSTATUS suivants.

Code de retour Description
STATUS_SUCCESS
Un nouvel en-tête IP a été correctement construit.
Autres codes status
Une erreur est survenue.

Remarques

À partir d’une liste de mémoires tampons nette clonées au niveau d’une couche de transport sortante PAM (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx), FwpsConstructIpHeaderForTransportPacket0 construit un nouvel en-tête pour chaque tampon net qui fait partie de la chaîne de liste de mémoires tampons nettes. Cette fonction peut également être utilisée pour reconstruire l’en-tête IP préexistant d’un paquet, auquel cas la liste de mémoires tampons réseau ne doit contenir qu’une seule mémoire tampon nette.

Cette fonction est utile lorsque l’en-tête IP n’a pas encore été créé, mais que l’adresse IP source ou le port source doivent être modifiés à partir de la couche de transport. Bien qu’il soit généralement possible d’attendre d’effectuer ces modifications jusqu’à ce que le paquet atteigne la couche réseau, cela ne peut pas être effectué dans un environnement IPsec dans lequel les paquets IP sont chiffrés ou signés numériquement avant d’atteindre la couche réseau.

L’adresse IP source peut être modifiée pour être une autre adresse IP définie localement ou une autre adresse qui n’existe pas sur l’ordinateur local. Les paquets ainsi modifiés peuvent ensuite être envoyés ou injectés dans le chemin des données de réception ou de transfert.

Si un paramètre endpointHandle différent de zéro est spécifié, les états de session (options de socket), le cas échéant, associés au socket seront utilisés pour construire chaque nouvel en-tête IP. De même, si des options de socket supplémentaires sont spécifiées avec les paramètres controlData et controlDataLength , ces options sont utilisées pour construire chaque nouvel en-tête IP.

Si la liste de mémoires tampons nettes d’entrée a été cloné à partir d’une couche de transport PAM entrante, ou si elle a été créée à la suite d’une opération d’envoi brute, les mémoires tampons nettes contiennent déjà un en-tête IP. Dans ce cas, lorsque cette fonction est appelée, les options IPv4 sont conservées dans le nouvel en-tête IP, mais les en-têtes AH/ESP et les en-têtes d’extension IPv6 sont supprimés. Étant donné que la pile TCP/IP conserve les en-têtes AH/ESP après le traitement IPsec, les paquets qui ont été indiqués par PAM et clonés par des légendes ne peuvent pas être injectés facilement dans le chemin des données de réception. Par conséquent, cette fonction est utile pour reconstruire les paquets traités par IPsec qui doivent être injectés dans le chemin de données de réception avec la fonction FwpsInjectTransportReceiveAsync0 .

Pour une session d’en-tête-include ; par exemple, pour filtrer le trafic GRE (Generic Routing Encapsulation) (protocole IP 47) envoyé sur un socket brut à partir des couches de transport sortantes, utilisez la procédure suivante avant d’appeler FwpsConstructIpHeaderForTransportPacket0 :

  1. Clonez la liste des mémoires tampons réseau en appelant le Fonction FwpsAllocateCloneNetBufferList0 .
  2. Si le membre headerIncludeHeaderLength de la structure FWPS_INCOMING_METADATA_VALUES0 pointée par le paramètre inMetaValues de la fonction classifyFn est supérieur à zéro, retirez la liste des mémoires tampons nettes clonées de cette quantité ; par exemple, par un appel à NdisRetreatNetBufferListDataStart.
  3. Copiez la mémoire tampon vers laquelle pointe le membre headerIncludeHeader de FWPS_INCOMING_METADATA_VALUES0 dans la région nouvellement retirée de la liste des mémoires tampons réseau clonées. La taille de la mémoire tampon doit être égale à la valeur de headerIncludeHeaderLength.
  4. Appelez FwpsConstructIpHeaderForTransportPacket0 avec le paramètre NetBufferList pointant vers la liste de mémoires tampons net clonées et le paramètre headerIncludeHeaderSize défini sur la valeur de headerIncludeHeaderLength.
FwpsConstructIpHeaderForTransportPacket0 désactive la prise en charge du déchargement d’envoi volumineux (LSO) et de la somme de contrôle pour la liste des mémoires tampons nettes résultantes. Les sommes de contrôle complètes sont calculées pour les protocoles de niveau supérieur (TCP, UDP et ICMP). La somme de contrôle IP est recalculée lorsque l’en-tête IP est reconstruit.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Disponible à partir de Windows Server 2008.
Plateforme cible Universal
En-tête fwpsk.h (include Fwpsk.h)
Bibliothèque Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

Voir aussi

AF_INET

AF_INET6

CMSGHDR

FWPS_INCOMING_METADATA_VALUES0 FwpsInjectTransportReceiveAsync0

NET_BUFFER_LIST

classifyFn