Compartilhar via


Função FwpsConstructIpHeaderForTransportPacket0 (fwpsk.h)

A função FwpsConstructIpHeaderForTransportPacket0 é chamada por um texto explicativo para construir um novo cabeçalho IP ou para recompilar um cabeçalho de pacote IP preexistente para apenas um buffer de rede.

ObservaçãoFwpsConstructIpHeaderForTransportPacket0 é uma versão específica de FwpsConstructIpHeaderForTransportPacket. Consulte Nomes de Version-Independent WFP e Direcionamento de versões específicas do Windows para obter mais informações.
 

Sintaxe

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

Um ponteiro para uma estrutura NET_BUFFER_LIST que descreve os dados clonados de pacote de camada de transporte para os quais um novo cabeçalho IP deve ser construído ou recriado. Para construir um novo cabeçalho IP, localize o deslocamento da estrutura de NET_BUFFER_LIST clonada no início do cabeçalho de transporte. Para recompilar um cabeçalho de pacote IP preexistente, localize o deslocamento no início do cabeçalho ip.

headerIncludeHeaderLength

Se a estrutura de NET_BUFFER_LIST apontada por NetBufferList já contiver um cabeçalho IP, indicará o tamanho total, em bytes, do cabeçalho IP existente (se existir). Se NetBufferList não contiver um cabeçalho IP, headerIncludeHeaderSize será zero. Caso contrário, o valor desse parâmetro será igual ao membro ipHeaderSize do FWPS_INCOMING_METADATA_VALUES0 estrutura passada para a função de texto explicativo classifyFn do driver de texto explicativo. Observe que os cabeçalhos de extensão para um cabeçalho IPv6 existente serão removidos quando essa função for chamada, embora as opções IPv4 sejam preservadas. Para obter mais informações, consulte Comentários.

[in] addressFamily

Uma das seguintes famílias de endereços:

AF_INET

A família de endereços IPv4.

AF_INET6

A família de endereços IPv6.

[in] sourceAddress

Um ponteiro para o endereço IP de origem que fará parte do cabeçalho IP a ser construído. Para IPv4, o endereço é de 4 bytes. Para IPv6, o endereço é de 16 bytes. Os bytes de endereço de origem estão sempre em ordem de byte de rede.

[in] remoteAddress

Um ponteiro para um buffer que especifica o endereço IP remoto que fará parte do cabeçalho IP a ser construído.

O buffer pode conter um endereço IPv4 (4 bytes) ou um endereço IPv6 (16 bytes) e o endereço deve ser especificado na ordem de bytes de rede. A versão do IP deve corresponder ao parâmetro addressFamily .

[in] nextProtocol

Especifica o tipo de protocolo IPPROTO do novo cabeçalho IP a ser construído. Para obter mais informações sobre a enumeração IPPROTO, consulte AF_INET ou AF_INET6.

[in, optional] endpointHandle

Um identificador opcional que indica o ponto de extremidade de transporte de pilha no caminho de envio de dados no qual o pacote deve ser injetado. Esse identificador de ponto de extremidade é fornecido a um texto explicativo por meio do membro transportEndpointHandle do FWPS_INCOMING_METADATA_VALUES0 estrutura passada para a função de texto explicativo classifyFn do driver de texto explicativo.

[in, optional] controlData

Um ponteiro opcional para um buffer que contém dados de controle de soquete especificados pela função WSASendMsg, que é descrita na documentação do SDK do Microsoft Windows. Para obter informações sobre o tipo WSACMSGHDR, consulte CMSGHDR.

Se presentes, os dados de controle de soquete são fornecidos a um texto explicativo com o membro controlData do FWPS_INCOMING_METADATA_VALUES0 estrutura passada para a função de texto explicativo classifyFn do driver de texto explicativo.

Se os dados de controle de soquete não forem NULL, eles deverão ser copiados profundamente na implementação do driver de texto explicativo da função classifyFn e o buffer controlData deverá ser mantido válido até que a função de conclusão da injeção seja chamada.

[in] controlDataLength

O comprimento, em bytes, do parâmetro controlData .

[in] flags

Sinalizadores que especificam se a NBL se destina ao caminho de envio ou recebimento. O parâmetro flags pode ter os seguintes valores:

Valor Significado
FWPS_CONSTRUCT_IPHEADER_FOR_SEND Quando definido, esse sinalizador especifica que a NBL destina-se ao caminho de envio.
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE Quando definido, esse sinalizador especifica que a NBL destina-se ao caminho de recebimento.

Para drivers de texto explicativo que dão suporte a USO ou URO, é obrigatório definir esse parâmetro como um desses valores. Outros drivers de texto explicativo podem definir esse parâmetro como zero. Esses sinalizadores só têm suporte no Windows Server 2022 23H2 e posterior. Em versões anteriores do Windows, os drivers de texto explicativo sempre devem definir esse parâmetro como zero.

reserved

Reservado. Os drivers de texto explicativo devem definir esse parâmetro como NULL.

[in, optional] interfaceIndex

O índice da interface na qual os dados do pacote original foram recebidos. Um driver de texto explicativo deve usar o valor do índice de interface que é passado como um dos valores de dados de entrada para sua função de texto explicativo classifyFn para esse parâmetro. Esse parâmetro é opcional e pode ser zero.

[in, optional] subInterfaceIndex

O índice da subinterface na qual os dados do pacote original foram recebidos. Um driver de texto explicativo deve usar o valor do índice de subinterface que é passado como um dos valores de dados de entrada para sua função de texto explicativo classifyFn para esse parâmetro se o pacote deve ser injetado na mesma subinterface em que o pacote original foi indicado. Esse parâmetro é opcional e pode ser zero.

Retornar valor

A função FwpsConstructIpHeaderForTransportPacket0 retorna um dos seguintes códigos NTSTATUS.

Código de retorno Descrição
STATUS_SUCCESS
Um novo cabeçalho IP foi construído com êxito.
Outros códigos de status
Ocorreu um erro.

Comentários

De uma lista de buffers de rede clonada em uma camada de transporte de saída (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx) do WFP, FwpsConstructIpHeaderForTransportPacket0 constrói um novo cabeçalho para cada buffer de rede que faz parte da cadeia de lista de buffers líquidos. Essa função também pode ser usada para recompilar o cabeçalho IP preexistente de um pacote; nesse caso, a lista de buffers líquidos deve conter apenas um buffer líquido.

Essa função é útil quando o cabeçalho IP ainda não foi criado, mas o endereço IP de origem ou a porta de origem devem ser modificados da camada de transporte. Embora normalmente seja possível esperar para executar essas modificações até que o pacote atinja a camada rede, isso não pode ser feito em um ambiente IPsec no qual os pacotes IP são criptografados ou assinados digitalmente antes de atingirem a camada de rede.

O endereço IP de origem pode ser modificado para ser outro endereço IP definido localmente ou outro endereço que não existe no computador local. Os pacotes modificados podem ser enviados ou injetados no caminho de dados de recebimento ou encaminhamento.

Se um parâmetro endpointHandle diferente de zero for especificado, os estados de sessão (opções de soquete), se houver, associados ao soquete serão usados para construir cada novo cabeçalho IP. Da mesma forma, se opções de soquete adicionais forem especificadas com os parâmetros controlData e controlDataLength , essas opções serão usadas para construir cada novo cabeçalho IP.

Se a lista de buffers de rede de entrada tiver sido clonada de uma camada de transporte WFP de entrada ou se ela tiver sido criada como resultado de uma operação de envio bruto, os buffers de rede já conterão um cabeçalho IP. Nesse caso, quando essa função for chamada, as opções IPv4 serão preservadas no novo cabeçalho IP, mas cabeçalhos AH/ESP e cabeçalhos de extensão IPv6 serão removidos. Como a pilha TCP/IP retém cabeçalhos AH/ESP após o processamento do IPsec, os pacotes que foram indicados pelo WFP e clonados por textos explicativos não podem ser prontamente injetados no caminho de dados de recebimento. Consequentemente, essa função é útil para recompilar pacotes processados por IPsec que devem ser injetados no caminho de dados de recebimento com a função FwpsInjectTransportReceiveAsync0 .

Para uma sessão de inclusão de cabeçalho; Por exemplo, para filtrar o tráfego gre (encapsulamento de roteamento genérico) (protocolo IP 47) enviado em um soquete bruto de camadas de transporte de saída, use o seguinte procedimento antes de chamar FwpsConstructIpHeaderForTransportPacket0:

  1. Clonar a lista de buffers de rede chamando o Função FwpsAllocateCloneNetBufferList0 .
  2. Se o membro headerIncludeHeaderLength da estrutura FWPS_INCOMING_METADATA_VALUES0 apontado pelo parâmetro inMetaValues da função classifyFn for maior que zero, recue a lista de buffers de rede clonada por esse valor; por exemplo, por uma chamada para NdisRetreatNetBufferListDataStart.
  3. Copie o buffer apontado pelo membro headerIncludeHeader do FWPS_INCOMING_METADATA_VALUES0 para a região recém-retirada da lista de buffers de rede clonada. O tamanho do buffer deve ser igual ao valor de headerIncludeHeaderLength.
  4. Chame FwpsConstructIpHeaderForTransportPacket0 que tem o parâmetro NetBufferList apontando para a lista de buffers de rede clonado e o parâmetro headerIncludeHeaderSize definido como o valor de headerIncludeHeaderLength.
FwpsConstructIpHeaderForTransportPacket0 desabilita o LSO (descarregamento de envio grande) e o suporte de descarregamento de soma de verificação para a lista de buffers líquidos resultante. Somas de verificação completas são calculadas para protocolos de nível superior (TCP, UDP e ICMP). A soma de verificação de IP é recalculada quando o cabeçalho IP é reconstruído.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível a partir do Windows Server 2008.
Plataforma de Destino Universal
Cabeçalho fwpsk.h (inclua Fwpsk.h)
Biblioteca Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

Confira também

AF_INET

AF_INET6

CMSGHDR

FWPS_INCOMING_METADATA_VALUES0 FwpsInjectTransportReceiveAsync0

NET_BUFFER_LIST

classifyFn