Fonction FwpsInjectTransportReceiveAsync0 (fwpsk.h)

La fonction FwpsInjectTransportReceiveAsync0 injecte des données de paquets provenant des couches d’erreur de transport, de datagramme ou icmp dans le chemin de réception des données.

RemarqueFwpsInjectTransportReceiveAsync0 est une version spécifique de FwpsInjectTransportReceiveAsync. Pour plus d’informations , voir PAM Version-Independent noms et Ciblage de versions spécifiques de Windows .
 

Syntaxe

NTSTATUS FwpsInjectTransportReceiveAsync0(
  [in]           HANDLE                injectionHandle,
  [in, optional] HANDLE                injectionContext,
                 PVOID                 reserved,
  [in]           UINT32                flags,
  [in]           ADDRESS_FAMILY        addressFamily,
  [in]           COMPARTMENT_ID        compartmentId,
  [in]           IF_INDEX              interfaceIndex,
  [in]           IF_INDEX              subInterfaceIndex,
  [in, out]      NET_BUFFER_LIST       *netBufferList,
  [in]           FWPS_INJECT_COMPLETE0 completionFn,
  [in, optional] HANDLE                completionContext
);

Paramètres

[in] injectionHandle

Un handle d’injection qui a été créé précédemment par un appel à 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.

reserved

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

[in] flags

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

[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 paquet sont injectées, spécifié en tant que type COMPARTMENT_ID . Cet identificateur est fourni à une légende via le membre compartmentId du FWPS_INCOMING_METADATA_VALUES0 structure passée à la fonction de légende classFn du pilote de légende. Si le membre compartmentId est disponible pour les légendes, FWPS_METADATA_FIELD_COMPARTMENT_ID sera défini dans le membre currentMetadataValues . Sinon, définissez ce paramètre sur UNSPECIFIED_COMPARTMENT_ID.

[in] interfaceIndex

Index de l’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 d’interface qui est passé 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 interface où le paquet d’origine a été indiqué.

[in] 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-interprétation qui est passé 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-interprétation où le paquet d’origine a été indiqué.

[in, out] netBufferList

Pointeur vers une structure de NET_BUFFER_LIST qui décrit les données de paquet injectées. Un pilote de légende alloue une structure NET_BUFFER_LIST à utiliser pour injecter des données de paquets en appelant la fonction FwpsAllocateCloneNetBufferList0 ou la fonction FwpsAllocateNetBufferAndNetBufferList0 . La structure NET_BUFFER_LIST doit commencer par un en-tête IP.

[in] completionFn

Pointeur vers une fonction de légende completionFn fournie par le pilote de légende. Le moteur de filtre appelle cette fonction après que les données de paquet, décrites par le paramètre netBufferList , ont été injectées dans la pile réseau.

[in, optional] completionContext

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

Valeur retournée

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

Code de retour Description
STATUS_SUCCESS
L’injection de données de paquets 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 par la suite. 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 en cours de fermeture.
Autres codes status
Une erreur est survenue.

Remarques

Un pilote de légende appelle la fonction FwpsInjectTransportReceiveAsync0 pour injecter des données de paquet à partir des couches d’erreur de transport, de datagramme ou icmp dans le chemin de réception des données. Cette fonction peut s’exécuter de manière asynchrone. Les pilotes de légende injectent normalement des données dans la pile réseau lors de la modification des données de paquets. 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.

Si un pilote de légende a modifié un paquet qu’il injecte avec FwpsInjectTransportReceiveAsync0, il doit appeler le Fonction FwpsConstructIpHeaderForTransportPacket0 pour corriger les sommes de contrôle IP et de protocole de niveau supérieur (TCP, UDP et ICMP). Le paramètre headerIncludeHeaderSize de FwpsConstructIpHeaderForTransportPacket0 doit avoir la même valeur que le membre ipHeaderSize du FWPS_INCOMING_METADATA_VALUES0 structure passée au paramètre inMetaValues de la fonction de légende classFn du pilote de légende.

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 net pointée par netBufferList doit être libérée par un appel à FwpsFreeNetBufferList0 ou FwpsFreeCloneNetBufferList0.

Si les données de paquet entrant d’origine avaient été soumises à l’application de la stratégie IPsec lors de leur traitement initial par la couche de transport, le paquet cloné injecté par cette fonction contournera la vérification IPsec lorsqu’il entre à nouveau dans la pile réseau. Les paquets entrants générés localement qui utilisent la fonction FwpsAllocateNetBufferAndNetBufferList0 contournent également la vérification IPsec.

Pour permettre à IPsec de traiter d’abord les paquets entrants, la légende qui inspecte les données de la couche de transport doit avoir une valeur inférieure de subLayerWeight dans la structure FWPS_FILTER0 que la sous-couche universelle. En outre, le pilote de légende ne doit pas intercepter les paquets en mode tunnel pour lesquels la combinaison de FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 membres ( isTunnelMode &&  ! isDeTunneled ) est retourné par le Fonction FwpsGetPacketListSecurityInformation0 . Le pilote de légende doit attendre que le paquet soit détunnelé, puis doit l’intercepter au niveau de la couche de transport ou d’une couche avant.

En raison de la sémantique de verrouillage du protocole TCP, TCP ne peut être injecté hors bande qu’à 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.

Cette fonction peut être appelée à partir de l’une des couches de transport suivantes si l’indicateur de métadonnées FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED n’est pas défini :

FWPS_LAYER_INBOUND_TRANSPORT_V4

FWPS_LAYER_INBOUND_TRANSPORT_V6

FWPS_LAYER_DATAGRAM_DATA_V4 (lorsque le sens entrant est spécifié avec FWP_DIRECTION_INBOUND)

FWPS_LAYER_DATAGRAM_DATA_V6 (lorsque le sens entrant est spécifié avec FWP_DIRECTION_INBOUND)

FWPS_LAYER_INBOUND_ICMP_ERROR_V4

FWPS_LAYER_INBOUND_ICMP_ERROR_V6

Dans le cas contraire, cette fonction doit être appelée à partir des couches ale (Application Layer Enforcement) suivantes après qu’une opération ALE pendante a été lancée avec un appel à FwpsPendOperation0 et s’est terminée avec un appel à FwpsCompleteOperation0 :

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6

Une liste de mémoires tampons nettes à injecter doit être passée à la fonction FwpsCompleteOperation0 en tant qu’argument netBufferList .

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

Configuration requise

Condition requise Valeur
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_FILTER0

FWPS_FILTER_CONDITION0

FWPS_INCOMING_METADATA_VALUES0

FWPS_PACKET_INJECTION_STATE

FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0

FwpsCompleteOperation0

FwpsFreeCloneNetBufferList0

FwpsFreeNetBufferList0

FwpsGetPacketListSecurityInformation0

FwpsInjectNetworkSendAsync0

FwpsInjectionHandleCreate0

FwpsInjectionHandleDestroy0

FwpsPendOperation0

FwpsQueryPacketInjectionState0

NET_BUFFER_LIST

classFn

completionFn