FwpsInjectTransportSendAsync1, fonction (fwpsk.h)
La fonction FwpsInjectTransportSendAsync1 injecte des données de paquets à partir des couches d’erreur de transport, de datagramme ou ICMP dans le chemin d’envoi des données. Cette fonction diffère de la version précédente (FwpsInjectTransportSendAsync0) dans laquelle elle prend une structure de paramètres mise à jour en tant qu’argument.
Syntaxe
NTSTATUS FwpsInjectTransportSendAsync1(
[in] HANDLE injectionHandle,
[in, optional] HANDLE injectionContext,
[in] UINT64 endpointHandle,
[in] UINT32 flags,
[in, optional] FWPS_TRANSPORT_SEND_PARAMS1 *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 dans le contexte d’injection. Si elle est spécifiée, elle peut être obtenue en appelant la fonction FwpsQueryPacketInjectionState 0 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 la 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 à une légende via le transportEndpointHandle membre du FWPS_INCOMING_METADATA_VALUES0 structure passée à la fonction de légende classifierFn fonction de légende du pilote de légende. 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
Ce paramètre est 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_PARAMS1 structure qui spécifie les propriétés du paquet sortant actuel. Ce paramètre peut être NULL uniquement si la liste de mémoires tampons nette à injecter contient un en-tête IP (par exemple, si le paquet est envoyé via un socket brut).
[in] addressFamily
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 compartimentId membre du FWPS_INCOMING_METADATA_VALUES0 structure passée à la fonction de légende classifierFn fonction de légende du pilote de légende. Si le compartimentId membre 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’une ou l’autre fonction FwpsAllocateCloneNetBufferList0 ou fonction FwpsAllocateNetBufferAndNetBufferList0.
[in] completionFn
Pointeur vers un completionFn fonction de légende 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 passé à 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 FwpsInjectTransportSendAsync1 retourne l’un des codes NTSTATUS suivants :
Retourner le code | Description |
---|---|
|
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 paquets dans la pile réseau, ou lorsqu’une erreur s’est produite par la suite. En cas d’erreur, l’état membre de la structure de NET_BUFFER_LIST terminée indique la raison de l’échec. |
|
La pile réseau TCP/IP n’est pas prête à accepter l’injection de données de paquets. |
|
La poignée d’injection est fermée. |
|
Une erreur s’est produite. |
Remarques
Un pilote de légende appelle la fonction FwpsInjectTransportSendAsync1 pour injecter des données de paquets à partir des couches d’erreur de transport, de datagramme ou ICMP dans le chemin d’envoi des données. À 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 façon 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 des mémoires tampons nettes pointées 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.
Le paquet injecté peut être à nouveau indiqué au pilote de légende. Pour éviter une boucle infinie, le pilote doit d’abord appeler le fonction FwpsQueryPacketInjectionState0 avant d’appeler la fonction de légende classifiezFn et autorisez les paquets dont l’état d’injection est défini sur FWPS_PACKET_INJECTION_STATEFWPS_PACKET_INJECTED_BY_SELF ou FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.
Paramètre et membres endpointHandle déclarés dans le
FWPS_TRANSPORT_SEND_PARAMS1 structure pointée par le paramètre sendArgs sont fournis 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 le sens sortant est spécifié 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 :
- Le currentMetadataValues membre de la structure FWPS_INCOMING_METADATA_VALUES0 a l’indicateur FWPS_METADATA_FIELD_IP_HEADER_SIZE défini.
- Le membre ipHeaderSize de la structure FWPS_INCOMING_METADATA_VALUES0 est supérieur à zéro.
Dans les couches réseau suivantes, si le datagramme appartient à un socket brut, vous devez copier les headerIncludeHeader et headerIncludeHeaderLength membres de la structure FWPS_INCOMING_METADATA_VALUES0 dans le membre correspondant de la structure FWPS_TRANSPORT_SEND_PARAMS1 vers laquelle le paramètre sendArgs pointe vers :
- FWPS_LAYER_DATAGRAM_DATA_V4 (lorsque la direction sortante est spécifiée avec FWP_DIRECTION_OUTBOUND)
- FWPS_LAYER_DATAGRAM_DATA_V6 (lorsque le sens sortant est spécifié avec FWP_DIRECTION_OUTBOUND)
Exigences
Exigence | Valeur |
---|---|
client minimum pris en charge | Disponible à partir de Windows 7. |
plateforme cible | Universel |
d’en-tête | fwpsk.h (include Fwpsk.h) |
bibliothèque | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |