Función FwpsConstructIpHeaderForTransportPacket0 (fwpsk.h)
Una llamada llama a la función FwpsConstructIpHeaderForTransportPacket 0 para construir un nuevo encabezado IP o para volver a generar un encabezado de paquete IP preexistente para un solo búfer neto.
Sintaxis
NTSTATUS FwpsConstructIpHeaderForTransportPacket0(
[in, out] NET_BUFFER_LIST *netBufferList,
ULONG headerIncludeHeaderLength,
[in] ADDRESS_FAMILY addressFamily,
[in] const UCHAR *sourceAddress,
[in] const UCHAR *remoteAddress,
[in] IPPROTO nextProtocol,
[in, optional] UINT64 endpointHandle,
[in, optional] const WSACMSGHDR *controlData,
[in] ULONG controlDataLength,
[in] UINT32 flags,
PVOID reserved,
[in, optional] IF_INDEX interfaceIndex,
[in, optional] IF_INDEX subInterfaceIndex
);
Parámetros
[in, out] netBufferList
Puntero a una estructura de NET_BUFFER_LIST que describe los datos de paquetes de capa de transporte clonados para los que se va a construir o volver a generar un nuevo encabezado IP. Para construir un nuevo encabezado IP, busque el desplazamiento de la estructura clonada NET_BUFFER_LIST al principio del encabezado de transporte. Para volver a generar un encabezado de paquete IP preexistente, busque el desplazamiento al principio del encabezado IP.
headerIncludeHeaderLength
Si la estructura de NET_BUFFER_LIST a la que apunta netBufferList ya contiene un encabezado IP, indica el tamaño total, en bytes, del encabezado IP existente (si existe). Si NetBufferList no contiene un encabezado IP, headerIncludeHeaderSize es cero. De lo contrario, el valor de este parámetro es igual al ipHeaderSize miembro de . FWPS_INCOMING_METADATA_VALUES0 estructura que se pasa a la función de llamada clasifiqueFn función de llamada. Tenga en cuenta que los encabezados de extensión de un encabezado IPv6 existente se quitarán cuando se llame a esta función, aunque se conservarán las opciones de IPv4. Para obtener más información, vea Comentarios.
[in] addressFamily
Una de las siguientes familias de direcciones:
AF_INET
Familia de direcciones IPv4.
AF_INET6
Familia de direcciones IPv6.
[in] sourceAddress
Puntero a la dirección IP de origen que formará parte del encabezado IP que se va a construir. Para IPv4, la dirección es de 4 bytes. Para IPv6, la dirección es de 16 bytes. Los bytes de dirección de origen siempre están en orden de bytes de red.
[in] remoteAddress
Puntero a un búfer que especifica la dirección IP remota que formará parte del encabezado IP que se va a construir.
El búfer puede contener una dirección IPv4 (4 bytes) o una dirección IPv6 (16 bytes) y la dirección debe especificarse en orden de bytes de red. La versión de IP debe coincidir con el parámetro addressFamily.
[in] nextProtocol
Especifica el tipo de protocolo IPPROTO del nuevo encabezado IP que se va a construir. Para obtener más información sobre la enumeración IPPROTO, consulte AF_INET o AF_INET6.
[in, optional] endpointHandle
Identificador opcional que indica el punto de conexión de transporte de pila en la ruta de acceso de envío de datos en la que se va a insertar el paquete. Este identificador de punto de conexión se proporciona a una llamada a través del miembro transportEndpointHandle del elemento FWPS_INCOMING_METADATA_VALUES0 estructura que se pasa a la función de llamada clasifiqueFn función de llamada.
[in, optional] controlData
Puntero opcional a un búfer que contiene los datos de control de socket especificados por el función WSASendMsg, que se describe en la documentación de Microsoft Windows SDK. Para obtener información sobre el tipo WSACMSGHDR, consulte CMSGHDR.
Si está presente, los datos del control de socket se proporcionan a una llamada con el controlData miembro del FWPS_INCOMING_METADATA_VALUES0 estructura que se pasa a la función de llamada clasifiqueFn función de llamada.
Si los datos del control de socket no se null, debe copiarse en profundidad en la implementación del controlador de llamada de la función de clasifiqueFn y el búfer de controlData debe mantenerse válido hasta que se llame a la función de finalización de inyección.
[in] controlDataLength
Longitud, en bytes, del parámetro controlData.
[in] flags
Marcas que especifican si el NBL está destinado a la ruta de acceso de envío o recepción. Las marcas parámetro pueden tener los siguientes valores:
Valor | Significado |
---|---|
FWPS_CONSTRUCT_IPHEADER_FOR_SEND | Cuando se establece, esta marca especifica que el NBL está pensado para la ruta de acceso de envío. |
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE | Cuando se establece, esta marca especifica que el NBL está pensado para la ruta de acceso de recepción. |
Para los controladores de llamada que admiten USO o URO, es obligatorio establecer este parámetro en uno de estos valores. Otros controladores de llamada pueden establecer este parámetro en cero. Estas marcas solo se admiten en Windows Server 2022 23H2 y versiones posteriores. En versiones anteriores de Windows, los controladores de llamada siempre deben establecer este parámetro en cero.
reserved
Reservado. Los controladores de llamada deben establecer este parámetro en null.
[in, optional] 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 clasificarFn función de llamada para este parámetro. Este parámetro es opcional y puede ser cero.
[in, optional] 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 clasificarFn función de llamada para este parámetro si el paquete se va a insertar en la misma subinterfase donde se indicó el paquete original. Este parámetro es opcional y puede ser cero.
Valor devuelto
La función FwpsConstructIpHeaderForTransportPacket0 devuelve uno de los siguientes códigos NTSTATUS.
Código devuelto | Descripción |
---|---|
|
Se construyó correctamente un nuevo encabezado IP. |
|
Error. |
Observaciones
Desde una lista de búferes netos clonada en una capa de transporte saliente del PMA (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx), FwpsConstructIpHeaderForTransportPacket0 construye un nuevo encabezado para cada búfer neto que forma parte de la cadena de lista de búferes de red. Esta función también se puede usar para recompilar el encabezado IP preexistente de un paquete, en cuyo caso la lista de búferes netos debe contener solo un búfer neto.
Esta función es útil cuando aún no se ha creado el encabezado IP, pero la dirección IP de origen o el puerto de origen deben modificarse desde la capa de transporte. Aunque normalmente sería posible esperar a realizar estas modificaciones hasta que el paquete llega a la capa de red, esto no se puede hacer en un entorno IPsec en el que los paquetes IP se cifran o firman digitalmente antes de llegar a la capa de red.
La dirección IP de origen se puede modificar para que sea otra dirección IP definida localmente u otra dirección que no exista en el equipo local. Los paquetes para que se modifiquen se pueden enviar o insertar en la ruta de acceso de recepción o reenvío de datos.
Si se especifica un parámetro endpointHandle distinto de cero, los estados de sesión (opciones de socket), si los hay, asociados al socket se usarán para construir cada nuevo encabezado IP. Del mismo modo, si se especifican opciones de socket adicionales con los parámetros de controlData y controlDataLength, estas opciones se usarán para construir cada nuevo encabezado IP.
Si la lista de búferes netos de entrada se ha clonado desde una capa de transporte DE ENTRADA DEL PMA o si se creó como resultado de una operación de envío sin procesar, los búferes netos ya contendrán un encabezado IP. En este caso, cuando se llama a esta función, las opciones IPv4 se conservarán en el nuevo encabezado IP, pero se quitarán los encabezados de extensión AH/ESP e IPv6. Dado que la pila TCP/IP conserva los encabezados AH/ESP después del procesamiento de IPsec, los paquetes indicados por EL PMA y clonados por llamadas no se pueden insertar fácilmente en la ruta de acceso de recepción de datos. Por lo tanto, esta función es útil para volver a generar paquetes procesados por IPsec que se van a insertar en la ruta de acceso de los datos de recepción con la función fwpsInjectTransportReceiveAsync0.
Para una sesión de inclusión de encabezado; Por ejemplo, para filtrar el tráfico de encapsulación de enrutamiento genérico (GRE) enviado en un socket sin procesar desde capas de transporte salientes, use el procedimiento siguiente antes de llamar a FwpsConstructIpHeaderForTransportPacket0:
- Clone la lista de búferes netos mediante una llamada a función FwpsAllocateCloneNetBufferList0.
- Si el headerIncludeHeaderLength miembro de la estructura FWPS_INCOMING_METADATA_VALUES0 a la que apunta la clasifiqueFnde la función inMetaValues parámetro es mayor que cero, retire la lista de búferes netos clonados por esa cantidad; por ejemplo, mediante una llamada a NdisRetreatNetBufferListDataStart.
- Copie el búfer al que apunta el encabezado EncabezadoIncludeHeader miembro de FWPS_INCOMING_METADATA_VALUES0 en la región recién retirada de la lista de búferes netos clonados. El tamaño del búfer debe ser igual al valor de headerIncludeHeaderLength.
- Llame al FwpsConstructIpHeaderForTransportPacket0 que tiene el parámetro NetBufferList que apunta a la lista de búferes net clonado y al parámetro headerIncludeHeaderSize establecido en el valor de headerIncludeHeaderLength.
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Disponible a partir de Windows Server 2008. |
de la plataforma de destino de | Universal |
encabezado de | fwpsk.h (incluya Fwpsk.h) |
biblioteca de | Fwpkclnt.lib |
irQL | <= DISPATCH_LEVEL |