次の方法で共有


FwpsInjectTransportReceiveAsync0 関数 (fwpsk.h)

FwpsInjectTransportReceiveAsync0 関数は、トランスポート、データグラム データ、または ICMP エラー レイヤーからのパケット データを受信データ パスに挿入します。

メモFwpsInjectTransportReceiveAsync0 は、 FwpsInjectTransportReceiveAsync の特定のバージョンです。 詳細については、「 WFP Version-Independent 名と特定のバージョンの Windows を対象 とする」を参照してください。
 

構文

NTSTATUS FwpsInjectTransportReceiveAsync0(
  [in]           HANDLE                injectionHandle,
  [in, optional] HANDLE                injectionContext,
                 PVOID                 reserved,
  [in]           UINT32                flags,
  [in]           ADDRESS_FAMILY        addressFamily,
  [in]           COMPARTMENT_ID        compartmentId,
  [in]           IF_INDEX              interfaceIndex,
  [in]           IF_INDEX              subInterfaceIndex,
  [in, out]      NET_BUFFER_LIST       *netBufferList,
  [in]           FWPS_INJECT_COMPLETE0 completionFn,
  [in, optional] HANDLE                completionContext
);

パラメーター

[in] injectionHandle

への呼び出しによって以前に作成されたインジェクション ハンドル FwpsInjectionHandleCreate0 関数。

[in, optional] injectionContext

挿入コンテキストへの省略可能なハンドル。 指定した場合は、パケット挿入状態FWPS_PACKET_INJECTION_STATEがFWPS_PACKET_INJECTED_BY_SELFまたはFWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELFのときに FwpsQueryPacketInjectionState0 関数を呼び出すことによって取得できます。

reserved

予約済み。 吹き出しドライバーでは、このパラメーターを 0 に設定する必要があります。

[in] flags

予約済み。 吹き出しドライバーでは、このパラメーターを 0 に設定する必要があります。

[in] addressFamily

次のいずれかの住所ファミリ:

AF_INET

IPv4 アドレス ファミリ。

AF_INET6

IPv6 アドレス ファミリ。

[in] compartmentId

パケット データが挿入されるルーティング コンパートメントの識別子。 COMPARTMENT_ID 型として指定されます。 この識別子は、 の compartmentId メンバーを介して吹き出しに提供されます。 FWPS_INCOMING_METADATA_VALUES0 呼び出しドライバーの classifyFn 吹き出し関数に渡される構造体です。 引き出し線で compartmentId メンバーを使用できる場合、 FWPS_METADATA_FIELD_COMPARTMENT_IDcurrentMetadataValues メンバーに設定されます。 それ以外の場合は、このパラメーターを UNSPECIFIED_COMPARTMENT_ID に設定します。

[in] interfaceIndex

元のパケット データを受信したインターフェイスのインデックス。 コールアウト ドライバーは、パケットが元のパケットが示されたのと同じインターフェイスに挿入される場合、このパラメーターの classifyFn 吹き出し関数に受信データ値の 1 つとして渡されるインターフェイス インデックスの値を使用する必要があります。

[in] subInterfaceIndex

元のパケット データを受信したサブインターフェイスのインデックス。 コールアウト ドライバーは、パケットが元のパケットが示されたのと同じサブインターフェイスに挿入される場合、このパラメーターの classifyFn 吹き出し関数に受信データ値の 1 つとして渡されるサブインターフェイス インデックスの値を使用する必要があります。

[in, out] netBufferList

挿入されるパケット データを記述する NET_BUFFER_LIST 構造体へのポインター。 コールアウト ドライバーは、FwpsAllocateCloneNetBufferList0 関数または FwpsAllocateNetBufferAndNetBufferList0 関数を呼び出すことによって、パケット データを挿入するために使用するNET_BUFFER_LIST構造体を割り当てます。 NET_BUFFER_LIST構造体は、IP ヘッダーで始まる必要があります。

[in] completionFn

吹き出しドライバーによって提供される completionFn 吹き出し関数へのポインター。 フィルター エンジンは、 netBufferList パラメーターによって記述されたパケット データがネットワーク スタックに挿入された後に、この関数を呼び出します。

[in, optional] completionContext

completionFn パラメーターが指す引き出し関数に渡される、引き出しドライバーによって提供されるコンテキストへのポインター。 このパラメーターは省略可能であり、 NULL にすることができます。

戻り値

FwpsInjectTransportReceiveAsync0 関数は、次のいずれかの NTSTATUS コードを返します。

リターン コード 説明
STATUS_SUCCESS
パケット データの挿入が正常に開始されました。 フィルター エンジンは、フィルター エンジンがネットワーク スタックへのパケット データの挿入を完了した後、またはエラーが発生した後に完了関数を呼び出します。 エラーが発生した場合、完了したNET_BUFFER_LIST構造体の Status メンバーは、失敗の理由を示します。
STATUS_FWP_TCPIP_NOT_READY
TCP/IP ネットワーク スタックは、パケット データの挿入を受け入れる準備ができていません。
STATUS_FWP_INJECT_HANDLE_CLOSING
インジェクション ハンドルが閉じられています。
その他の状態コード
エラーが発生しました。

解説

コールアウト ドライバーは 、FwpsInjectTransportReceiveAsync0 関数を呼び出して、トランスポート、データグラム データ、または ICMP エラー レイヤーからのパケット データを受信データ パスに挿入します。 この関数は非同期的に実行できます。 コールアウト ドライバーは通常、パケット データを変更するときにネットワーク スタックにデータを挿入します。 吹き出しドライバーがパケット データを変更する方法の詳細については、「 Callout Driver Operations」を参照してください。

引き出しドライバーが FwpsInjectTransportReceiveAsync0 で挿入するパケットを変更した場合は、 を呼び出す必要があります。 FwpsConstructIpHeaderForTransportPacket0 関数を使用して、IP と上位レベルのプロトコル (TCP、UDP、ICMP) のチェックサムを修正します。 FwpsConstructIpHeaderForTransportPacket0headerIncludeHeaderSize パラメーターは、 の ipHeaderSize メンバーと同じ値にする必要があります FWPS_INCOMING_METADATA_VALUES0呼び出しドライバーの classifyFn 吹き出し関数の inMetaValues パラメーターに渡される構造体です。

戻り値が STATUS_SUCCESSされていない場合、完了関数は呼び出されません。 この場合、 netBufferList が指すネット バッファー リストは 、FwpsFreeNetBufferList0 または への呼び出しによって解放する必要があります。 FwpsFreeCloneNetBufferList0

元の受信パケット データがトランスポート 層によって最初に処理されたときに IPsec ポリシーの適用の対象になっていた場合、この関数によって挿入された複製されたパケットは、ネットワーク スタックに再入するときに IPsec 検証をバイパスします。 FwpsAllocateNetBufferAndNetBufferList0 関数を使用するローカルで生成された受信パケットも、IPsec 検証をバイパスします。

IPsec が最初に受信パケットを処理できるようにするには、トランスポート 層データを検査する吹き出しの値が、ユニバーサル サブレイヤーよりもFWPS_FILTER0構造体の subLayerWeight の値が小さい必要があります。 さらに、引き出しドライバーは、 の組み合わせに対してトンネル モード パケットをインターセプトしてはなりません。 FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 メンバー ( isTunnelMode && ! isDeTunneled )は によって返されます。 FwpsGetPacketListSecurityInformation0 関数。 吹き出しドライバーは、パケットがデトンネルされるのを待ってから、トランスポート 層または前方レイヤーでパケットをインターセプトする必要があります。

TCP プロトコルのロック セマンティクスにより、TCP は任意のトランスポート 層または同等のレイヤーでのみ帯域外に挿入できるため、FwpsInjectTransportReceiveAsync0 と FwpsInjectTransportSendAsync0 をキューに入れ、DPC によって実行する必要があります。

FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIREDメタデータ フラグが設定されていない場合は、次のいずれかのトランスポート 層からこの関数 呼び出すことができます。

FWPS_LAYER_INBOUND_TRANSPORT_V4

FWPS_LAYER_INBOUND_TRANSPORT_V6

FWPS_LAYER_DATAGRAM_DATA_V4 (受信方向が FWP_DIRECTION_INBOUND で指定されている場合)

FWPS_LAYER_DATAGRAM_DATA_V6 (受信方向が FWP_DIRECTION_INBOUND で指定されている場合)

FWPS_LAYER_INBOUND_ICMP_ERROR_V4

FWPS_LAYER_INBOUND_ICMP_ERROR_V6

それ以外の場合は、 FwpsPendOperation0 の呼び出しでペンドされた ALE 操作が開始され、 FwpsCompleteOperation0 の呼び出しで完了した後、次のアプリケーション層強制 (ALE) レイヤーからこの関数を呼び出す必要があります。

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6

挿入するネット バッファー リストは、netBufferList 引数として FwpsCompleteOperation0 関数に渡す必要があります。

挿入されたパケットは、コールアウト ドライバーに再度示すことができます。 無限ループを防ぐために、ドライバーは最初に を呼び出す必要があります。classifyFn 吹き出し関数の呼び出しを続行する前に FwpsQueryPacketInjectionState0 関数を実行すると、ドライバーは、挿入状態が FWPS_PACKET_INJECTION_STATE FWPS_PACKET_INJECTED_BY_SELF または FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF に設定されているパケットを変更されていない状態で通過することを許可する必要があります。

要件

要件
サポートされている最小のクライアント Windows Vista 以降で使用できます。
対象プラットフォーム ユニバーサル
Header fwpsk.h (Fwpsk.h を含む)
Library Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

こちらもご覧ください

FWPS_FILTER0

FWPS_FILTER_CONDITION0

FWPS_INCOMING_METADATA_VALUES0

FWPS_PACKET_INJECTION_STATE

FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0

FwpsCompleteOperation0

FwpsFreeCloneNetBufferList0

FwpsFreeNetBufferList0

FwpsGetPacketListSecurityInformation0

FwpsInjectNetworkSendAsync0

FwpsInjectionHandleCreate0

FwpsInjectionHandleDestroy0

FwpsPendOperation0

FwpsQueryPacketInjectionState0

NET_BUFFER_LIST

classifyFn

completionFn