Compartir a través de


Funciones de inyección de paquetes

Un controlador de llamada puede llamar a las siguientes funciones de PMA para insertar datos de paquetes modificados o en la pila TCP/IP. Las capas aplicables de las que se pueden insertar datos, junto con los posibles destinos, se muestran en la tabla siguiente.

Función de inyección Capa aplicable Destination

FwpsInjectForwardAsync0

capa de red

la ruta de acceso de datos de reenvío

FwpsInjectNetworkReceiveAsync0

capa de red

la ruta de acceso de los datos de recepción

FwpsInjectNetworkSendAsync0

capa de red

la ruta de acceso de envío de datos

FwpsInjectTransportReceiveAsync0

datos de paquetes de las capas de transporte, datagramas, errores ICMP o ALE

la ruta de acceso de los datos de recepción

FwpsInjectTransportSendAsync0

datos de paquetes de las capas de transporte, datagramas, errores ICMP o ALE

la ruta de acceso de envío de datos

FwpsStreamInjectAsync0

Segmentos de datos TCP

un flujo de datos

Además, la función FwpsQueryPacketInjectionState0 se usa para inspeccionar el historial de inyección de datos de paquetes.

La inserción entre capas está habilitada si la llamada puede proporcionar toda la información necesaria que requiere la función de inyección y la lista de búferes netos tiene el formato esperado por la función de inyección. Por ejemplo, una llamada puede capturar un paquete en la ruta de acceso de reenvío, modificar su dirección de destino a la del equipo local y llamar a FwpsInjectTransportReceiveAsync0 para redirigir el paquete a la pila TCP/IP del equipo local.

Excepto para la inyección de flujo (datos TCP), los paquetes entrantes insertados vuelven a entrar desde la "parte inferior" de las capas de pila y PMA, mientras que los paquetes salientes insertados vuelven a entrar desde la "parte superior" de la pila y las capas del PMA. Por ejemplo, un paquete UDP insertado desde la capa de datos del datagrama entrante volverá a escribir la pila y recorrerá la capa de red, la capa de transporte, la capa de recepción o aceptación de ALE (opcional) y volverá a la capa de datos del datagrama. Otro paquete UDP insertado desde la capa de red saliente volverá a escribir la pila y recorrerá el ALE (opcional), los datos del datagrama y las capas de transporte, y volverá a la capa de red.

FwpsInjectTransportReceiveAsync0 omite automáticamente el procesamiento de IPsec para el paquete reinyectado porque anteriormente había pasado por la comprobación de IPsec.

Un paquete insertado por un controlador de llamada de PMA se volverá a indicar a la llamada, excepto en los casos en los que la modificación del paquete hace que se pierdan las condiciones de filtro originales. EL PMA proporciona la función FwpsQueryPacketInjectionState0 para que las llamadas consulten si el paquete se insertó (o insertó anteriormente) mediante la llamada. Para evitar un bucle infinito, las llamadas deben permitir paquetes autoinsyectados.

Las llamadas deben ajustar la suma de comprobación de la capa de transporte o IP, o ambas, después de modificar un paquete IP. Una llamada puede establecer la suma de comprobación en 0 para los paquetes UDP a través de IPv4. Para ser compatible con la descarga de suma de comprobación de la capa de transporte y ajustar la suma de comprobación completa frente a los cálculos de pseudo suma de comprobación en consecuencia, una llamada puede usar la siguiente lógica:

NDIS_TCP_IP_CHECKSUM_PACKET_INFO ChecksumInfo;
 ChecksumInfo.Value = 
 (ULONG) (ULONG_PTR)NET_BUFFER_LIST_INFO(
 NetBufferList,TcpIpChecksumNetBufferListInfo);

Si ChecksumInfo.Transmit.NdisPacketTcpChecksum es TRUE, se descargará la operación de envío TCP. Si ChecksumInfo.Transmit.NdisPacketUdpChecksum es TRUE, se descargará la operación de envío UDP.

En Windows Vista con Service Pack 1 (SP1) y Windows Server 2008, si inMetaValues-headerIncludeHeaderLength> es mayor que 0, el paquete saliente es una reinjección de envío RAW que incluye un encabezado IP. Para realizar las reinjecciones de envío RAW que incluyen un encabezado IP para Windows Vista con SP1 y Windows Server 2008, debe retirar el paquete clonado por la cantidad de inMetaValues-headerIncludeHeaderLength> y copiar inMetaValues-headerIncludeHeader> en el espacio recién extendido. A continuación, use FwpsInjectTransportSendAsync0 con la lista de búferes netos para el paquete y deje el parámetro FWPS_TRANSPORT_SEND_PARAMS0 establecido en NULL. Para obtener más información sobre las operaciones de retirada para las listas de búferes netos, vea Operaciones de retirada y avance.

Nota Para las operaciones de envío sin procesar, la lista de búferes netos solo debe contener un único búfer neto. Si la lista de búferes netos contiene más de un búfer neto, debe convertir la lista de búferes netos en una serie de listas de búferes netos y cada uno de ellos debe contener un único búfer neto. Para obtener más información sobre la administración de listas de búferes netos, consulte arquitectura de NET_BUFFER.