Udostępnij przez


Funkcje iniekcji pakietów

Sterownik wywoławczy może wywołać następujące funkcje WFP w celu wstrzyknięcia wstrzymanych lub zmodyfikowanych danych pakietów do stosu TCP/IP. Odpowiednie warstwy, z których można wstrzykiwać dane wraz z możliwymi miejscami docelowymi, są wymienione w poniższej tabeli.

Injection function Applicable layer Destination

FwpsInjectForwardAsync0

network layer

ścieżka przekazywania danych

FwpsInjectNetworkReceiveAsync0

network layer

ścieżka odbioru danych

FwpsInjectNetworkSendAsync0

network layer

ścieżka wysyłania danych

FwpsInjectTransportReceiveAsync0

dane pakietowe z warstw transportowej, datagramów, błędów ICMP lub warstw ALE

ścieżka odbioru danych

FwpsInjectTransportSendAsync0

dane pakietowe z warstw transportowej, datagramów, błędów ICMP lub warstw ALE

ścieżka wysyłania danych

FwpsStreamInjectAsync0

Segmenty danych TCP

strumień danych

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

Wstrzykiwanie między warstwami jest włączone, jeśli wywołanie zwrotne może dostarczyć wszystkie potrzebne informacje wymagane przez funkcję wstrzykiwania, a lista bufora sieciowego ma format oczekiwany przez funkcję wstrzykiwania. 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.

Z wyjątkiem iniekcji strumienia (danych TCP), wstrzyknięte pakiety przychodzące wchodzą ponownie z dolnej warstwy stosu i warstwy WFP, podczas gdy pakiety wychodzące są ponownie wstrzykiwane z góry stosu i warstw WFP. Na przykład pakiet UDP wstrzykiwany z przychodzącej warstwy danych datagramu wejdzie ponownie do stosu i przejdzie przez warstwę sieciową, warstwę transportową, warstwę odbierania lub akceptowania ALE (opcjonalnie), i z powrotem do warstwy danych datagramu. Inny pakiet UDP wstrzyknięty z wychodzącej warstwy sieciowej ponownie wejdzie do stosu i przechodzi przez warstwę ALE (opcjonalnie), dane datagramu i warstwy transportowej, a następnie z powrotem do warstwy sieciowej.

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

Pakiet wstrzykiwany przez sterownik wywołania WFP zostanie ponownie wskazany do wywołania, z wyjątkiem przypadków, w których modyfikacja pakietu powoduje pominięcie oryginalnych warunków filtrowania. WFP provides the FwpsQueryPacketInjectionState0 function for callouts to query whether the packet was injected (or injected earlier) by the callout. Aby zapobiec nieskończonemu zapętleniu, wywołania powinny pozwalać na własne pakiety wstrzyknięte.

Wywołania muszą dostosować sumę kontrolną warstwy IP lub transportu, albo oba te elementy, po modyfikacji pakietu IP. Wywołanie może ustawić sumę kontrolną na 0 dla pakietów UDP w IPv4. Aby zapewnić zgodność z odciążeniem sumy kontrolnej warstwy transportu i odpowiednio dostosować pełną sumę kontrolną względem obliczeń pseudosumy kontrolnej, wywołanie może użyć następującej logiki:

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.

W systemie Windows Vista z dodatkiem Service Pack 1 (SP1) i Windows Server 2008, jeśli parametr inMetaValues->headerIncludeHeaderLength jest większy niż 0, pakiet wychodzący stanowi ponowne wstrzyknięcie wysyłania RAW, które zawiera nagłówek IP. Aby wykonać operacje ponownego wstrzyknięcia plików RAW, które zawierają nagłówek IP dla systemu Windows Vista z dodatkiem SP1 i Windows Server 2008, należy cofnąć sklonowany pakiet o wartość z elementu inMetaValues->headerIncludeHeaderLength i skopiować inMetaValues->headerIncludeHeader nad nowo rozszerzonym miejscem. Then, use FwpsInjectTransportSendAsync0 with the net buffer list for the packet and leave the FWPS_TRANSPORT_SEND_PARAMS0 parameter set to NULL. Aby uzyskać więcej informacji na temat operacji wycofywania list buforów sieciowych, zobacz Retreat and Advance Operations.

Note For raw send operations, the net buffer list must contain only a single net buffer. Jeśli lista buforów sieciowych zawiera więcej niż jeden bufor sieciowy, musisz przekonwertować swoją listę buforów sieciowych na serię list buforów sieciowych, i każda z tej serii musi zawierać jeden bufor sieciowy. For more information about net buffer list management, see NET_BUFFER Architecture.