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.
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 |
---|---|
|
Um novo cabeçalho IP foi construído com êxito. |
|
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:
- Clonar a lista de buffers de rede chamando o função de FwpsAllocateCloneNetBufferList0.
- 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.
- 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.
- 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.
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 |