コールアウト ドライバーは、次の WFP 関数を呼び出して、ペンドまたは変更されたパケット データを TCP/IP スタックに挿入できます。 次の表に、データを挿入できる適用可能なレイヤーと、可能な宛先を示します。
| Injection function | Applicable layer | Destination |
|---|---|---|
network layer |
転送データ パス |
|
network layer |
受信データ パス |
|
network layer |
送信データ パス |
|
トランスポート、データグラム データ、ICMP エラー、または ALE レイヤーからのパケット データ |
受信データ パス |
|
トランスポート、データグラム データ、ICMP エラー、または ALE レイヤーからのパケット データ |
送信データ パス |
|
TCP データ セグメント |
データ ストリーム |
In addition, the FwpsQueryPacketInjectionState0 function is used to inspect the injection history of packet data.
クロスレイヤー挿入は、吹き出しがインジェクション関数に必要なすべての必要な情報を提供でき、ネット バッファー リストがインジェクション関数で予期される形式を持つ場合に有効になります。 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.
ストリーム (TCP データ) インジェクションを除き、挿入された受信パケットはスタックと WFP レイヤーの "下部" から再入力され、挿入された送信パケットはスタックレイヤーと WFP レイヤーの "top" から再入力されます。 たとえば、受信データグラム データ層から挿入された UDP パケットは、スタックに再入し、ネットワーク 層、トランスポート層、ALE 受信層または受け入れ層 (省略可能) を走査し、データグラム データ層に戻ります。 送信ネットワーク 層から挿入された別の UDP パケットは、スタックを再入力し、ALE (省略可能)、データグラム データ、トランスポート 層を走査し、ネットワーク レイヤーに戻ります。
FwpsInjectTransportReceiveAsync0 automatically bypasses IPsec processing for the reinjected packet because it had previously gone through IPsec verification.
WFP 吹き出しドライバーによって挿入されたパケットは、パケットの変更によって元のフィルター条件を満たさなくなる場合を除き、吹き出しに再び示されます。 WFP provides the FwpsQueryPacketInjectionState0 function for callouts to query whether the packet was injected (or injected earlier) by the callout. 無限ループを防ぐには、吹き出しで自己挿入パケットを許可する必要があります。
コールアウトでは、IP パケットを変更した後で、IP またはトランスポート層のチェックサム、またはその両方を調整する必要があります。 IPv4 パケット経由の UDP の場合、吹き出しでチェックサムを 0 に設定できます。 トランスポート層チェックサム オフロードと互換性があり、それに応じて完全なチェックサムと擬似チェックサムの計算を調整するには、吹き出しで次のロジックを使用できます。
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.
Windows Vista Service Pack 1 (SP1) および Windows Server 2008 では、inMetaValues->headerIncludeHeaderLength が 0 より大きい場合、送信パケットは IP ヘッダーを含む RAW 送信の再挿入です。 SP1 および Windows Server 2008 で Windows Vista の IP ヘッダーを含む RAW 送信の再挿入を実行するには、複製されたパケットを inMetaValues->headerIncludeHeaderLength 内の量で退避し、新しく拡張された領域に inMetaValues->headerIncludeHeader をコピーする必要があります。 Then, use FwpsInjectTransportSendAsync0 with the net buffer list for the packet and leave the FWPS_TRANSPORT_SEND_PARAMS0 parameter set to NULL. ネット バッファー リストの退避操作の詳細については、「 退避操作と事前操作」を参照してください。
Note For raw send operations, the net buffer list must contain only a single net buffer. ネット バッファー リストに複数のネット バッファーが含まれている場合は、ネット バッファー リストを一連のネット バッファー リストに変換する必要があり、系列内のそれぞれに 1 つのネット バッファーが含まれている必要があります。 For more information about net buffer list management, see NET_BUFFER Architecture.