次の方法で共有


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_INJECTED_BY_SELF または FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELFのときに、FwpsQueryPacketInjectionState0 FWPS_PACKET_INJECTION_STATE 関数を呼び出すことによって取得できます。

reserved

引っ込み思案。 コールアウト ドライバーでは、このパラメーターを 0 に設定する必要があります。

[in] flags

引っ込み思案。 コールアウト ドライバーでは、このパラメーターを 0 に設定する必要があります。

[in] addressFamily

次のいずれかのアドレス ファミリ:

AF_INET

IPv4 アドレス ファミリ。

AF_INET6

IPv6 アドレス ファミリ。

[in] compartmentId

パケット データが挿入されるルーティング コンパートメントの識別子。COMPARTMENT_ID 型として指定されます。 この識別子は、の compartmentId メンバーを介して吹き出しに提供されます。吹き出しドライバーの classifyFn 吹き出し関数に渡される FWPS_INCOMING_METADATA_VALUES0 構造体。 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 エラー 層からのパケット データを受信データ パスに挿入します。 この関数は非同期的に実行できます。 コールアウト ドライバーは、通常、パケット データを変更するときにネットワーク スタックにデータを挿入します。 吹き出しドライバーがパケット データを変更する方法の詳細については、「コールアウト ドライバー操作 を参照してください。

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

戻り値が STATUS_SUCCESSされていない場合、完了関数は呼び出されません。 この場合、netBufferList が指す net バッファー リストは、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

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

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6

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

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

必要条件

要件 価値
サポートされる最小クライアント Windows Vista 以降で使用できます。
ターゲット プラットフォーム 万国
ヘッダー fwpsk.h (Fwpsk.h を含む)
ライブラリ 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