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.
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 |
---|---|
|
Un nouvel en-tête IP a été correctement construit. |
|
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 :
- Clonez la liste des mémoires tampons réseau en appelant le Fonction FwpsAllocateCloneNetBufferList0 .
- 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.
- 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.
- 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.
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 |