FwpsInjectTransportSendAsync1 関数 (fwpsk.h)

FwpsInjectTransportSendAsync1 関数は、トランスポート、データグラム データ、または ICMP エラー レイヤーからのパケット データを送信データ パスに挿入します。 この関数は、更新されたパラメーター構造を引数として受け取る点で、以前のバージョン (FwpsInjectTransportSendAsync0) とは異なります。

メモFwpsInjectTransportSendAsync1 は、Windows 7 以降で使用される FwpsInjectTransportSendAsync の特定のバージョンです。 詳細については、「 WFP Version-Independent 名と特定のバージョンの Windows を対象 とする」を参照してください。 Windows Vista の場合、 FwpsInjectTransportSendAsync0 を使用できます。
 

構文

NTSTATUS FwpsInjectTransportSendAsync1(
  [in]           HANDLE                      injectionHandle,
  [in, optional] HANDLE                      injectionContext,
  [in]           UINT64                      endpointHandle,
  [in]           UINT32                      flags,
  [in, optional] FWPS_TRANSPORT_SEND_PARAMS1 *sendArgs,
  [in]           ADDRESS_FAMILY              addressFamily,
  [in]           COMPARTMENT_ID              compartmentId,
  [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 関数を呼び出すことによって取得できます。

[in] endpointHandle

パケットが挿入される送信データ パス内のスタック トランスポート エンドポイントを示すハンドル。 このエンドポイント ハンドルは、 の transportEndpointHandle メンバーを介して吹き出しに提供されます。 FWPS_INCOMING_METADATA_VALUES0 呼び出しドライバーの classifyFn 吹き出し関数に渡される構造体です。 コールアウト ドライバーでは、指定されたハンドルを使用して、スタック エンドポイントに関連付けられているソケットが閉じられ、ハンドルが有効でなくなる前に、複製されたパケットをできるだけ早くデータ パスに挿入する必要があります。

[in] flags

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

[in, optional] sendArgs

へのポインター FWPS_TRANSPORT_SEND_PARAMS1 現在の送信パケットのプロパティを指定する構造体です。 このパラメーターは、挿入するネット バッファー リストに IP ヘッダーが含まれている場合 (たとえば、パケットが未加工のソケットを介して送信される場合) にのみ NULL にすることができます。

[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, out] netBufferList

挿入されるパケット データを記述する NET_BUFFER_LIST 構造体へのポインター。 コールアウト ドライバーは、 を呼び出してパケット データを挿入するために使用する NET_BUFFER_LIST 構造体を割り当てます。 FwpsAllocateCloneNetBufferList0 関数または FwpsAllocateNetBufferAndNetBufferList0 関数。

[in] completionFn

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

[in, optional] completionContext

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

戻り値

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

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

解説

コールアウト ドライバーは 、FwpsInjectTransportSendAsync1 関数を呼び出して、トランスポート、データグラム データ、または ICMP エラー レイヤーからのパケット データを送信データ パスに挿入します。 これらのレイヤーでは、IP ヘッダーがまだ形成されていない可能性があり、IPsec ポリシーがアクティブな場合、パケット データは暗号化または署名されません。 したがって、この関数は、IPsec 対応環境でのパケット検査に使用するのに最適です。

この関数は非同期的に実行できます。

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

コールアウト ドライバーは通常、パケット データを変更するときにネットワーク スタックにデータを挿入します。 吹き出しドライバーがパケット データを変更する方法の詳細については、「 Callout Driver Operations」を参照してください。

挿入されたパケットは、コールアウト ドライバーに再度示すことができます。 無限ループを防ぐために、ドライバーは最初に を呼び出す必要があります。classifyFn 吹き出し関数を呼び出す前に FwpsQueryPacketInjectionState0 関数を使用し、インジェクション状態がFWPS_PACKET_INJECTED_BY_SELFまたはFWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELFに設定FWPS_PACKET_INJECTION_STATEパケット許可します。

endpointHandle パラメーターと で宣言されたメンバー
sendArgs パラメーターが指すFWPS_TRANSPORT_SEND_PARAMS1構造は、次のネットワーク レイヤーからの吹き出しに提供されます。

FWPS_LAYER_OUTBOUND_TRANSPORT_V4
FWPS_LAYER_OUTBOUND_TRANSPORT_V6
FWPS_LAYER_DATAGRAM_DATA_V4 (送信方向が FWP_DIRECTION_OUTBOUND で指定されている場合)
FWPS_LAYER_DATAGRAM_DATA_V6 (送信方向が FWP_DIRECTION_OUTBOUND で指定されている場合)
FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4
FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6

次の両方が当てはまる場合、データグラムは生ソケットに属します。

次のネットワーク レイヤーでは、データグラムが生のソケットに属している場合は、FWPS_INCOMING_METADATA_VALUES0構造体の headerIncludeHeaderheaderIncludeHeaderLength メンバーを、sendArgs パラメーターが指すFWPS_TRANSPORT_SEND_PARAMS1構造体の対応するメンバーにコピーする必要があります。

  • FWPS_LAYER_DATAGRAM_DATA_V4 (送信方向が FWP_DIRECTION_OUTBOUND で指定されている場合)
  • FWPS_LAYER_DATAGRAM_DATA_V6 (送信方向が FWP_DIRECTION_OUTBOUND で指定されている場合)

要件

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

こちらもご覧ください

FWPS_INCOMING_METADATA_VALUES0

FWPS_PACKET_INJECTION_STATE

FWPS_TRANSPORT_SEND_PARAMS1

FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0

FwpsFreeCloneNetBufferList0

FwpsFreeNetBufferList0

FwpsInjectTransportSendAsync0

FwpsInjectionHandleCreate0

FwpsInjectionHandleDestroy0

FwpsQueryPacketInjectionState0

NET_BUFFER_LIST

classifyFn

completionFn