Compartilhar via


Funções de injeção de pacote

Um driver de texto explicativo pode chamar as seguintes funções WFP para injetar dados de pacotes pendentes ou modificados na pilha TCP/IP. As camadas aplicáveis das quais os dados podem ser injetados, juntamente com possíveis destinos, são listadas na tabela a seguir.

Função injeção Camada aplicável Destino

FwpsInjectForwardAsync0

camada de rede

o caminho de dados de encaminhamento

FwpsInjectNetworkReceiveAsync0

camada de rede

o caminho de dados de recebimento

FwpsInjectNetworkSendAsync0

camada de rede

o caminho de dados de envio

FwpsInjectTransportReceiveAsync0

dados de pacote do transporte, dados de datagrama, erro ICMP ou camadas ALE

o caminho de dados de recebimento

FwpsInjectTransportSendAsync0

dados de pacote do transporte, dados de datagrama, erro ICMP ou camadas ALE

o caminho de dados de envio

FwpsStreamInjectAsync0

Segmentos de dados TCP

um fluxo de dados

Além disso, a função FwpsQueryPacketInjectionState0 é usada para inspecionar o histórico de injeção de dados de pacotes.

A injeção entre camadas será habilitada se o texto explicativo puder fornecer todas as informações necessárias exigidas pela função de injeção e a lista de buffers líquidos tiver o formato esperado pela função de injeção. Por exemplo, um texto explicativo pode capturar um pacote no caminho de encaminhamento, modificar seu endereço de destino para o do computador local e chamar FwpsInjectTransportReceiveAsync0 para redirecionar o pacote para a pilha TCP/IP do computador local.

Exceto pela injeção de fluxo (dados TCP), os pacotes de entrada injetados são reentradas da "parte inferior" das camadas de pilha e WFP, enquanto os pacotes de saída injetados são reentrantes da "parte superior" das camadas de pilha e WFP. Por exemplo, um pacote UDP injetado da camada de dados de datagrama de entrada reentrará na pilha e atravessará a camada de rede, a camada de transporte, a camada de recebimento ou aceitação da ALE (opcional) e voltará para a camada de dados do datagram. Outro pacote UDP injetado da camada de rede de saída reentrará na pilha e atravessará o ALE (opcional), os dados de datagrama e as camadas de transporte e voltará para a camada de rede.

FwpsInjectTransportReceiveAsync0 ignora automaticamente o processamento IPsec para o pacote reinjetado porque ele já havia passado pela verificação IPsec.

Um pacote injetado por um driver de texto explicativo WFP será indicado novamente para o texto explicativo, exceto nos casos em que a modificação no pacote faz com que ele perca as condições de filtro originais. O WFP fornece a função FwpsQueryPacketInjectionState0 para que os textos explicativos consultem se o pacote foi injetado (ou injetado anteriormente) pelo texto explicativo. Para evitar loops infinitos, os textos explicativos devem permitir pacotes auto-injetados.

Os textos explicativos devem ajustar a soma de verificação da camada de ip ou transporte, ou ambos, depois de modificarem um pacote IP. Um texto explicativo pode definir a soma de verificação como 0 para UDP em pacotes IPv4. Para ser compatível com o descarregamento de soma de verificação da camada de transporte e ajustar a soma de verificação completa versus cálculos de soma de verificação pseudo adequadamente, um texto explicativo pode usar a seguinte lógica:

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

Se ChecksumInfo.Transmit.NdisPacketTcpChecksum for TRUE, a operação de envio TCP será descarregada. Se ChecksumInfo.Transmit.NdisPacketUdpChecksum for TRUE, a operação de envio do UDP será descarregada.

No Windows Vista com Service Pack 1 (SP1) e Windows Server 2008, se inMetaValues-headerIncludeHeaderLength> for maior que 0, o pacote de saída será uma reinjeção de envio RAW que inclui um cabeçalho IP. Para executar reinjeções de envio RAW que incluem um cabeçalho IP para Windows Vista com SP1 e Windows Server 2008, você deve retirar o pacote clonado pela quantidade em inMetaValues-headerIncludeHeaderLength> e copiar o inMetaValues-headerIncludeHeader> sobre o espaço recém-estendido. Em seguida, use FwpsInjectTransportSendAsync0 com a lista de buffers líquidos para o pacote e deixe o parâmetro FWPS_TRANSPORT_SEND_PARAMS0 definido como NULL. Para obter mais informações sobre operações de retirada para listas de buffers líquidos, consulte Operações de retirada e avanço.

Nota Para operações de envio bruto, a lista de buffers líquidos deve conter apenas um único buffer de rede. Se sua lista de buffers líquidos contiver mais de um buffer líquido, você precisará converter sua lista de buffers líquidos em uma série de listas de buffers líquidos e cada uma na série deverá conter um único buffer líquido. Para obter mais informações sobre o gerenciamento de lista de buffers líquidos, consulte Arquitetura de NET_BUFFER.