FwpsInjectTransportSendAsync0, fonction (fwpsk.h)

La fonction FwpsInjectTransportSendAsync0 injecte des données de paquets à partir des couches d’erreur ICMP de transport, de données de datagramme ou d’ICMP dans le chemin d’accès aux données d’envoi.

RemarqueFwpsInjectTransportSendAsync0 est la version spécifique de FwpsInjectTransportSendAsync utilisée dans Windows Vista et versions ultérieures. Pour plus d’informations, voir PAM Version-Independent noms et ciblage des versions spécifiques de Windows . Pour Windows 7, FwpsInjectTransportSendAsync1 est disponible.
 

Syntaxe

NTSTATUS FwpsInjectTransportSendAsync0(
  [in]           HANDLE                      injectionHandle,
  [in, optional] HANDLE                      injectionContext,
  [in]           UINT64                      endpointHandle,
  [in]           UINT32                      flags,
  [in, optional] FWPS_TRANSPORT_SEND_PARAMS0 *sendArgs,
  [in]           ADDRESS_FAMILY              addressFamily,
  [in]           COMPARTMENT_ID              compartmentId,
  [in, out]      NET_BUFFER_LIST             *netBufferList,
  [in]           FWPS_INJECT_COMPLETE0       completionFn,
  [in, optional] HANDLE                      completionContext
);

Paramètres

[in] injectionHandle

Handle d’injection qui a été créé précédemment par un appel au Fonction FwpsInjectionHandleCreate0 .

[in, optional] injectionContext

Handle facultatif pour le contexte d’injection. Si elle est spécifiée, elle peut être obtenue en appelant la fonction FwpsQueryPacketInjectionState0 lorsque l’état d’injection de paquets FWPS_PACKET_INJECTION_STATE est FWPS_PACKET_INJECTED_BY_SELF ou FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.

[in] endpointHandle

Handle qui indique le point de terminaison de transport de pile dans le chemin d’accès aux données d’envoi dans lequel le paquet doit être injecté. Ce handle de point de terminaison est fourni à un légende via le membre transportEndpointHandle du FWPS_INCOMING_METADATA_VALUES0 structure passée à la fonction de légende classifiable du pilote classifieFn . Les pilotes de légende doivent utiliser le handle fourni pour injecter des paquets clonés dans le chemin de données dès que possible, avant que le socket associé au point de terminaison de pile soit fermé et que le handle ne soit plus valide.

[in] flags

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

[in, optional] sendArgs

Pointeur vers un FWPS_TRANSPORT_SEND_PARAMS0 structure qui spécifie les propriétés du paquet sortant actuel. Peut être NULL uniquement si la liste de mémoires tampons net à injecter contient un en-tête IP (par exemple, si le paquet est envoyé via un socket brut).

[in] addressFamily

L’une des familles d’adresses suivantes :

AF_INET

Famille d’adresses IPv4.

AF_INET6

Famille d’adresses IPv6.

[in] compartmentId

Identificateur du compartiment de routage dans lequel les données de paquets sont injectées, spécifiée en tant que type COMPARTMENT_ID . Cet identificateur est fourni à une légende par le biais du membre compartimentId du FWPS_INCOMING_METADATA_VALUES0 structure passée à la fonction de légende classifiable du pilote classifieFn . Si le membre compartimentId est disponible pour les légendes, FWPS_METADATA_FIELD_COMPARTMENT_ID est défini dans le membre currentMetadataValues . Sinon, définissez ce paramètre sur UNSPECIFIED_COMPARTMENT_ID.

[in, out] netBufferList

Pointeur vers une structure NET_BUFFER_LIST qui décrit les données de paquet en cours d’injection. Un pilote de légende alloue une structure de NET_BUFFER_LIST à utiliser pour injecter des données de paquets en appelant l’un ou l’autre FwpsAllocateCloneNetBufferList0 , fonction ou FwpsAllocateNetBufferAndNetBufferList0 , fonction.

[in] completionFn

Pointeur vers une fonction de légende d’achèvementFn fournie par le pilote de légende. Le moteur de filtre appelle cette fonction après les données de paquets, décrites par le paramètre netBufferList , a été injectée dans la pile réseau.

[in, optional] completionContext

Pointeur vers un contexte fourni par le pilote de légende transmis à la fonction de légende pointée par le paramètre completionFn . Ce paramètre est facultatif et peut être NULL.

Valeur de retour

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

Code de retour Description
STATUS_SUCCESS
L’injection de données de paquet a été lancée avec succès. Le moteur de filtre appelle la fonction d’achèvement une fois que le moteur de filtre a terminé d’injecter les données de paquet dans la pile réseau ou lorsqu’une erreur s’est produite ultérieurement. En cas d’erreur, le membre Status de la structure NET_BUFFER_LIST terminée indique la raison de l’échec.
STATUS_FWP_TCPIP_NOT_READY
La pile réseau TCP/IP n’est pas prête à accepter l’injection de données de paquets.
STATUS_FWP_INJECT_HANDLE_CLOSING
La poignée d’injection est fermée.
Autres codes d’état
Une erreur est survenue.

Remarques

Un pilote de légende appelle la fonction FwpsInjectNetworkSendAsync0 pour injecter des données de paquets à partir des couches d’erreur de transport, de données de datagramme ou d’ICMP dans le chemin d’accès aux données d’envoi. Dans ces couches, l’en-tête IP peut ne pas encore être formé et lorsque la stratégie IPsec est active, les données de paquets ne sont pas chiffrées ou signées. Par conséquent, cette fonction est idéale pour l’inspection des paquets dans un environnement compatible IPsec.

Cette fonction peut s’exécuter de manière asynchrone.

Si la valeur de retour n’est pas STATUS_SUCCESS, la fonction d’achèvement n’est pas appelée. Dans ce cas, la liste de mémoires tampons nettes signalée par netBufferList doit être libérée par un appel à FwpsFreeNetBufferList0 ou FwpsFreeCloneNetBufferList0.

Les pilotes de légende injectent normalement des données dans la pile réseau lorsqu’ils modifient les données de paquet. Pour plus d’informations sur la façon dont un pilote de légende peut modifier les données de paquets, consultez Opérations du pilote de légende.

En raison de la sémantique de verrouillage du protocole TCP, TCP peut uniquement être injecté hors bande à n’importe quelle couche de transport ou couche équivalente. Par conséquent, FwpsInjectTransportReceiveAsync0 et FwpsInjectTransportSendAsync0 doivent être mis en file d’attente et exécutés par un DPC.

Le paquet injecté peut être indiqué à nouveau au pilote de légende. Pour empêcher la boucle infinie, le pilote doit d’abord appeler la fonction FwpsQueryPacketInjectionState0 avant d’appeler la fonction de légende classFn et autoriser les paquets qui ont l’état d’injection FWPS_PACKET_INJECTION_STATE défini sur FWPS_PACKET_INJECTED_BY_SELF ou FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.

Paramètre endpointHandle , ainsi que les membres déclarés dans le FWPS_TRANSPORT_SEND_PARAMS0 structure pointée par le paramètre sendArgs , est fournie aux légendes des couches réseau suivantes :

FWPS_LAYER_OUTBOUND_TRANSPORT_V4
FWPS_LAYER_OUTBOUND_TRANSPORT_V6
FWPS_LAYER_DATAGRAM_DATA_V4 (lorsque la direction sortante est spécifiée avec FWP_DIRECTION_OUTBOUND)
FWPS_LAYER_DATAGRAM_DATA_V6 (lorsque la direction sortante est spécifiée avec FWP_DIRECTION_OUTBOUND)
FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4
FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6

Le datagramme appartient à un socket brut si les deux éléments suivants sont vrais :

Dans les couches réseau suivantes, si le datagramme appartient à un socket brut, la liste de mémoires tampons nettes pointée par netBufferList doit être ajustée pour commencer à l’en-tête IP (qui doit être prépendée à la liste de mémoires tampons nettes) :

  • FWPS_LAYER_DATAGRAM_DATA_V4 (lorsque la direction sortante est spécifiée avec FWP_DIRECTION_OUTBOUND)
  • FWPS_LAYER_DATAGRAM_DATA_V6 (lorsque la direction sortante est spécifiée avec FWP_DIRECTION_OUTBOUND)

Configuration requise

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

Voir aussi

FWPS_INCOMING_METADATA_VALUES0

FWPS_PACKET_INJECTION_STATE

FWPS_TRANSPORT_SEND_PARAMS0

FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0

FwpsFreeCloneNetBufferList0

FwpsFreeNetBufferList0

FwpsInjectTransportSendAsync1

FwpsInjectionHandleCreate0

FwpsInjectionHandleDestroy0

FwpsQueryPacketInjectionState0

NET_BUFFER_LIST

classFn

completionFn