FwpsInjectTransportReceiveAsync0 関数 (fwpsk.h)
FwpsInjectTransportReceiveAsync0 関数は、トランスポート、データグラム データ、または ICMP エラー レイヤーからのパケット データを受信データ パスに挿入します。
構文
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_ID は currentMetadataValues メンバーに設定されます。 それ以外の場合は、このパラメーターを 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 コードを返します。
リターン コード | 説明 |
---|---|
|
パケット データの挿入が正常に開始されました。 フィルター エンジンは、フィルター エンジンがネットワーク スタックへのパケット データの挿入を完了した後、またはエラーが発生した後に完了関数を呼び出します。 エラーが発生した場合、完了したNET_BUFFER_LIST構造体の Status メンバーは、失敗の理由を示します。 |
|
TCP/IP ネットワーク スタックは、パケット データの挿入を受け入れる準備ができていません。 |
|
インジェクション ハンドルが閉じられています。 |
|
エラーが発生しました。 |
解説
コールアウト ドライバーは 、FwpsInjectTransportReceiveAsync0 関数を呼び出して、トランスポート、データグラム データ、または ICMP エラー レイヤーからのパケット データを受信データ パスに挿入します。 この関数は非同期的に実行できます。 コールアウト ドライバーは通常、パケット データを変更するときにネットワーク スタックにデータを挿入します。 吹き出しドライバーがパケット データを変更する方法の詳細については、「 Callout Driver Operations」を参照してください。
引き出しドライバーが FwpsInjectTransportReceiveAsync0 で挿入するパケットを変更した場合は、 を呼び出す必要があります。 FwpsConstructIpHeaderForTransportPacket0 関数を使用して、IP と上位レベルのプロトコル (TCP、UDP、ICMP) のチェックサムを修正します。 FwpsConstructIpHeaderForTransportPacket0 の headerIncludeHeaderSize パラメーターは、 の 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 |