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.

Injection function Applicable layer Destination

FwpsInjectForwardAsync0

network layer

o caminho de dados de encaminhamento

FwpsInjectNetworkReceiveAsync0

network layer

o caminho de dados de recebimento

FwpsInjectNetworkSendAsync0

network layer

o caminho de dados de envio

FwpsInjectTransportReceiveAsync0

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

o caminho de dados de recebimento

FwpsInjectTransportSendAsync0

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

o caminho de dados de envio

FwpsStreamInjectAsync0

Segmentos de dados TCP

um fluxo de dados

In addition, the FwpsQueryPacketInjectionState0 function is used to inspect the injection history of packet data.

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. For example, a callout can capture a packet at the forward path, modify its destination address to that of the local computer, and call FwpsInjectTransportReceiveAsync0 to redirect the packet into the local computer's TCP/IP stack.

Com exceção da injeção de fluxo (dados TCP), os pacotes de entrada injetados são reentradas na "parte inferior" das camadas de pilha e WFP, enquanto os pacotes de saída injetados são reentradas da "parte superior" da pilha e das camadas 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 do 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 retornará à camada de rede.

FwpsInjectTransportReceiveAsync0 automatically bypasses IPsec processing for the reinjected packet because it had previously gone through IPsec verification.

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. WFP provides the FwpsQueryPacketInjectionState0 function for callouts to query whether the packet was injected (or injected earlier) by the callout. Para evitar looping infinito, os textos explicativos devem permitir pacotes auto-injetados.

Os textos explicativos devem ajustar a soma de verificação da camada de transporte ou IP, 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);

If ChecksumInfo.Transmit.NdisPacketTcpChecksum is TRUE, the TCP send operation will be offloaded. If ChecksumInfo.Transmit.NdisPacketUdpChecksum is TRUE, the UDP send operation will be offloaded.

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 estendido recentemente. Then, use FwpsInjectTransportSendAsync0 with the net buffer list for the packet and leave the FWPS_TRANSPORT_SEND_PARAMS0 parameter set to 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.

Note For raw send operations, the net buffer list must contain only a single net buffer. 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. For more information about net buffer list management, see NET_BUFFER Architecture.