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 recriar um cabeçalho de pacote IP preexistente para apenas um buffer de rede.

ObservaçãoFwpsConstructIpHeaderForTransportPacket0 é uma versão específica do FwpsConstructIpHeaderForTransportPacket. Consulte nomes de Version-Independent WFP e versões específicas de destino 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 de pacote de camada de transporte clonado 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 pelo 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 é igual ao ipHeaderSize membro do FWPS_INCOMING_METADATA_VALUES0 estrutura passada para a função de texto explicativo do driver de texto explicativo classifyFn. 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 é 4 bytes. Para IPv6, o endereço é 16 bytes. Os bytes de endereço de origem estão sempre em ordem de bytes 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 dados de envio no qual o pacote deve ser injetado. Esse identificador de ponto de extremidade é fornecido para um texto explicativo no transportEndpointHandle membro do FWPS_INCOMING_METADATA_VALUES0 estrutura passada para a função de texto explicativo do driver de texto explicativo classifyFn.

[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 controlData membro do FWPS_INCOMING_METADATA_VALUES0 estrutura passada para a função de texto explicativo do driver de texto explicativo classifyFn.

Se os dados de controle de soquete não estiverem 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 o NBL destina-se ao caminho de envio ou recebimento. Os sinalizadores parâmetro podem ter os seguintes valores:

Valor Significado
FWPS_CONSTRUCT_IPHEADER_FOR_SEND Quando definido, esse sinalizador especifica que o NBL destina-se ao caminho de envio.
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE Quando definido, esse sinalizador especifica que o 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 para 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 seu classifyFn função de texto explicativo 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 seu classificarFn função de texto explicativo 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.

Valor de retorno

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.

Observações

De uma lista de buffers líquidos clonada em uma camada de transporte de saída do WFP (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx), FwpsConstructIpHeaderForTransportPacket0 constrói um novo cabeçalho para cada buffer líquido 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 de rede 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 aguardar para executar essas modificações até que o pacote atinja a camada de rede, isso não pode ser feito em um ambiente IPsec no qual os pacotes IP são criptografados ou assinados digitalmente antes de chegarem à camada 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 não 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 o controlData e controlDataLength parâmetros, 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 injetados prontamente no caminho de dados de recebimento. Consequentemente, essa função é útil para recriar 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 (protocolo IP 47) enviado em um soquete bruto de camadas de transporte de saída, use o procedimento a seguir antes de chamar FwpsConstructIpHeaderForTransportPacket0:

  1. Clonar a lista de buffers de rede chamando o função de FwpsAllocateCloneNetBufferList0.
  2. Se o cabeçalho IncludeHeaderLength membro da estrutura FWPS_INCOMING_METADATA_VALUES0 que é apontado pelo parâmetro classifyFnda função inMetaValues é 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 cabeçalho IncludeHeader membro 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 tenha 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 de rede 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
de cliente com suporte mínimo Disponível a partir do Windows Server 2008.
da Plataforma de Destino Universal
cabeçalho fwpsk.h (inclua Fwpsk.h)
biblioteca Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

Consulte também

AF_INET

AF_INET6

CMSGHDR

FWPS_INCOMING_METADATA_VALUES0 FwpsInjectTransportReceiveAsync0

NET_BUFFER_LIST

classifyFn