Función FwpsInjectTransportReceiveAsync0 (fwpsk.h)

La función FwpsInjectTransportReceiveAsync0 inserta datos de paquetes de las capas de error de transporte, datos de datagramas o ICMP en la ruta de acceso de los datos de recepción.

NotaFwpsInjectTransportReceiveAsync0 es una versión específica de FwpsInjectTransportReceiveAsync. Para obtener más información, consulte NOMBRES de PMA Version-Independent y versiones específicas de destino de Windows .
 

Sintaxis

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

Parámetros

[in] injectionHandle

Identificador de inyección creado anteriormente por una llamada a . Función FwpsInjectionHandleCreate0 .

[in, optional] injectionContext

Identificador opcional para el contexto de inyección. Si se especifica, se puede obtener llamando a la función FwpsQueryPacketInjectionState0 cuando el estado de inyección de paquetes FWPS_PACKET_INJECTION_STATE es FWPS_PACKET_INJECTED_BY_SELF o FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.

reserved

Reservado. Los controladores de llamada deben establecer este parámetro en cero.

[in] flags

Reservado. Los controladores de llamada deben establecer este parámetro en cero.

[in] addressFamily

Una de las siguientes familias de direcciones:

AF_INET

Familia de direcciones IPv4.

AF_INET6

Familia de direcciones IPv6.

[in] compartmentId

Identificador del compartimiento de enrutamiento en el que se insertan los datos del paquete, especificados como un tipo de COMPARTMENT_ID . Este identificador se proporciona a una llamada a través del miembro compartmentId del FWPS_INCOMING_METADATA_VALUES0 estructura que se pasa a la función de llamada classifyFn del controlador de llamada. Si el miembro compartmentId está disponible para las llamadas, FWPS_METADATA_FIELD_COMPARTMENT_ID se establecerá en el miembro currentMetadataValues . De lo contrario, establezca este parámetro en UNSPECIFIED_COMPARTMENT_ID.

[in] interfaceIndex

Índice de la interfaz en la que se recibieron los datos del paquete original. Un controlador de llamada debe usar el valor del índice de interfaz que se pasa como uno de los valores de datos entrantes a su función de llamada classifyFn para este parámetro si el paquete se va a insertar en la misma interfaz donde se indicó el paquete original.

[in] subInterfaceIndex

Índice de la subinterfase en la que se recibieron los datos del paquete original. Un controlador de llamada debe usar el valor del índice de subinterface que se pasa como uno de los valores de datos entrantes a su función de llamada classifyFn para este parámetro si el paquete se va a insertar en la misma subinterfase donde se indicó el paquete original.

[in, out] netBufferList

Puntero a una estructura de NET_BUFFER_LIST que describe los datos de paquete que se insertan. Un controlador de llamada asigna una estructura de NET_BUFFER_LIST que se usará para insertar datos de paquetes mediante una llamada a la función FwpsAllocateCloneNetBufferList0 o a la función FwpsAllocateNetBufferAndNetBufferList0 . La estructura NET_BUFFER_LIST debe comenzar con un encabezado IP.

[in] completionFn

Puntero a una función de llamada completionFn proporcionada por el controlador de llamada. El motor de filtros llama a esta función después de los datos del paquete, descritos por el parámetro netBufferList , se ha insertado en la pila de red.

[in, optional] completionContext

Puntero a un contexto proporcionado por el controlador de llamada que se pasa a la función de llamada a la que apunta el parámetro completionFn . Este parámetro es opcional y puede ser NULL.

Valor devuelto

La función FwpsInjectTransportReceiveAsync0 devuelve uno de los siguientes códigos NTSTATUS .

Código devuelto Descripción
STATUS_SUCCESS
La inyección de datos de paquetes se inició correctamente. El motor de filtros llamará a la función de finalización después de que el motor de filtro haya completado la inserción de los datos de paquete en la pila de red o cuando se produzca un error posteriormente. En caso de error, el miembro Status de la estructura de NET_BUFFER_LIST completada indicará el motivo del error.
STATUS_FWP_TCPIP_NOT_READY
La pila de red TCP/IP no está lista para aceptar la inyección de datos de paquetes.
STATUS_FWP_INJECT_HANDLE_CLOSING
El controlador de inyección se está cerrando.
Otros códigos de estado
Se produjo un error.

Comentarios

Un controlador de llamada llama a la función FwpsInjectTransportReceiveAsync0 para insertar datos de paquetes de los niveles de error de transporte, datagramas o ICMP en la ruta de acceso de los datos de recepción. Esta función se puede ejecutar de forma asincrónica. Los controladores de llamada normalmente insertan datos en la pila de red al modificar los datos de paquetes. Para obtener más información sobre cómo un controlador de llamada puede modificar los datos de paquetes, consulte Operaciones del controlador de llamada.

Si un controlador de llamada modificó un paquete que insertará con FwpsInjectTransportReceiveAsync0, debe llamar al Función FwpsConstructIpHeaderForTransportPacket0 para corregir las sumas de comprobación ip y protocolo de nivel superior (TCP, UDP e ICMP). El parámetro headerIncludeHeaderSize de FwpsConstructIpHeaderForTransportPacket0 debe ser el mismo valor que el miembro ipHeaderSize del FWPS_INCOMING_METADATA_VALUES0 estructura que se pasa al parámetro inMetaValues de la función de llamada classifyFn del controlador de llamada.

Si el valor devuelto no es STATUS_SUCCESS, no se llamará a la función de finalización. En este caso, la lista de búferes netos a la que apunta netBufferList debe liberarse mediante una llamada a FwpsFreeNetBufferList0 o FwpsFreeCloneNetBufferList0.

Si los datos originales del paquete entrante habían estado sujetos a la aplicación de directivas IPsec cuando la capa de transporte la procesó originalmente, el paquete clonado insertado por esta función omitirá la comprobación de IPsec cuando vuelva a escribir la pila de red. Los paquetes entrantes generados localmente que usan la función FwpsAllocateNetBufferAndNetBufferList0 también omiten la comprobación de IPsec.

Para permitir que IPsec procese primero los paquetes entrantes, la llamada que inspecciona los datos de la capa de transporte debe tener un valor inferior de subLayerWeight en la estructura de FWPS_FILTER0 que la subcapa universal. Además, el controlador de llamada no debe interceptar paquetes en modo túnel para los que la combinación de FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 miembros ( isTunnelMode && ! isDeTunneled ) devuelve . Función FwpsGetPacketListSecurityInformation0 . El controlador de llamada debe esperar a que el paquete se desajuste y, a continuación, debe interceptarlo en la capa de transporte o en una capa de reenvío.

Debido a la semántica de bloqueo del protocolo TCP, TCP solo se puede insertar fuera de banda en cualquier capa de transporte o capa equivalente, por lo que FwpsInjectTransportReceiveAsync0 y FwpsInjectTransportSendAsync0 deben estar en cola y ejecutarse por un DPC.

Se puede llamar a esta función desde una de las siguientes capas de transporte si no se establece la marca de metadatos de FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED :

FWPS_LAYER_INBOUND_TRANSPORT_V4

FWPS_LAYER_INBOUND_TRANSPORT_V6

FWPS_LAYER_DATAGRAM_DATA_V4 (cuando se especifica la dirección de entrada con FWP_DIRECTION_INBOUND)

FWPS_LAYER_DATAGRAM_DATA_V6 (cuando se especifica la dirección de entrada con FWP_DIRECTION_INBOUND)

FWPS_LAYER_INBOUND_ICMP_ERROR_V4

FWPS_LAYER_INBOUND_ICMP_ERROR_V6

De lo contrario, se debe llamar a esta función desde las siguientes capas de cumplimiento de la capa de aplicación (ALE) después de iniciar una operación de ALE con lápiz con una llamada a FwpsPendOperation0 y se ha completado con una llamada a FwpsCompleteOperation0:

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6

Se debe pasar una lista de búferes netos que se va a insertar a la función FwpsCompleteOperation0 como argumento netBufferList .

El paquete insertado se puede indicar de nuevo al controlador de llamada. Para evitar el bucle infinito, el controlador debe llamar primero a . La función FwpsQueryPacketInjectionState0 antes de continuar con una llamada a la función de llamada classifyFn , y el controlador debe permitir paquetes que tengan el estado de inyección FWPS_PACKET_INJECTION_STATE establecido en FWPS_PACKET_INJECTED_BY_SELF o FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF para pasar a través de inalterados.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible a partir de Windows Vista.
Plataforma de destino Universal
Encabezado fwpsk.h (incluya Fwpsk.h)
Library Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

Consulte también

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

classifyFn

completionFn