次の方法で共有


FwpsStreamInjectAsync0 関数 (fwpsk.h)

FwpsStreamInjectAsync0 関数は、TCP データ セグメントを TCP データ ストリームに挿入します。

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

構文

NTSTATUS FwpsStreamInjectAsync0(
  [in]           HANDLE                injectionHandle,
  [in, optional] HANDLE                injectionContext,
  [in]           UINT32                flags,
  [in]           UINT64                flowId,
  [in]           UINT32                calloutId,
  [in]           UINT16                layerId,
  [in]           UINT32                streamFlags,
  [in, out]      NET_BUFFER_LIST       *netBufferList,
  [in]           SIZE_T                dataLength,
  [in]           FWPS_INJECT_COMPLETE0 completionFn,
  [in, optional] HANDLE                completionContext
);

パラメーター

[in] injectionHandle

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

[in, optional] injectionContext

挿入コンテキストへの省略可能なハンドル。

[in] flags

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

[in] flowId

データを挿入するデータ フローを指定するランタイム識別子。 データ フローのランタイム識別子は、吹き出しドライバーの classifyFn 吹き出し関数にフィルター エンジンが提供するFWPS_METADATA_FIELD_FLOW_HANDLEメタデータ値を介して、引き出しドライバーに提供されます。

[in] calloutId

フィルター エンジンの吹き出しの実行時識別子。 この識別子は、FwpsCalloutRegister0 または FwpsCalloutRegister1 関数を 呼び出しドライバーが呼び出しをフィルター エンジンに登録するときに返されました。

[in] layerId

データ ストリームが処理されているフィルターレイヤーのランタイム識別子。 この値は、FWPS_LAYER_STREAM_V4またはFWPS_LAYER_STREAM_V6である必要があります。 データ ストリームが処理されているレイヤーのランタイム識別子は、フィルター エンジンが引き出しドライバーの classifyFn 吹き出し関数に渡した FWPS_INCOMING_VALUES0 構造の layerId メンバーの吹き出しに提供されます。

[in] streamFlags

データを挿入するデータ ストリームの特性を指定するフラグ。

受信データ ストリームにデータを挿入する場合、コールアウト ドライバーは次のフラグの 1 つ以上を指定します。

FWPS_STREAM_FLAG_RECEIVE

データを受信データ ストリームに挿入することを指定します。 このフラグは、受信データ ストリームにデータを挿入するときに必要です。

FWPS_STREAM_FLAG_RECEIVE_DISCONNECT

受信データ ストリームに挿入されるデータの TCP ヘッダーに FIN フラグを設定することを指定します。

このフラグが設定されている場合は、FWPS_STREAM_FLAG_RECEIVE フラグも設定する必要があります。そうしないと、STATUS_FWP_INVALID_PARAMETER が返されます。
 

FWPS_STREAM_FLAG_RECEIVE_EXPEDITED

受信データ ストリームに挿入されるデータが、優先度の高い帯域外データであることを指定します。

FWPS_STREAM_FLAG_RECEIVE_PUSH

受信データが受信され、TCP ヘッダーに PUSH フラグが設定されていることを指定します。これは、送信者が即時データ転送を要求することを示します。 このフラグが設定されていない場合、データ転送で望ましくない遅延が発生する可能性があります。 このフラグは、Windows Vista SP1 以降で使用できます。

送信データ ストリームにデータを挿入する場合、コールアウト ドライバーは次のフラグの 1 つ以上を指定します。

FWPS_STREAM_FLAG_SEND

データを送信データ ストリームに挿入することを指定します。 このフラグは、送信データ ストリームにデータを挿入するときに必要です。

FWPS_STREAM_FLAG_SEND_EXPEDITED

送信データ ストリームに挿入されるデータが、優先度の高い帯域外データであることを指定します。

FWPS_STREAM_FLAG_SEND_NODELAY

コールアウト ドライバーが、送信データ ストリームに挿入されるデータのバッファリングがないことを要求することを指定します。

FWPS_STREAM_FLAG_SEND_DISCONNECT

送信データ ストリームに挿入されるデータが送信された後にストリームを切断することを指定します。 ネットワーク スタックは、最後に送信されたパケットの TCP ヘッダーに FIN フラグを設定します。

メモ このフラグが設定されている場合は、FWPS_STREAM_FLAG_SEND フラグも設定する必要があります。そうしないと、STATUS_FWP_INVALID_PARAMETER が返されます。
 

[in, out] netBufferList

データ ストリームに挿入されるデータを記述する NET_BUFFER_LIST 構造体へのポインター。 コールアウト ドライバーは、データ ストリームにデータを挿入するために使用する NET_BUFFER_LIST 構造体を割り当てます。 FwpsAllocateCloneNetBufferList0、fwpsAllocateNetBufferAndNetBufferList0 、または fwpsCloneStreamData0 関数します。 NET_BUFFER_LIST 構造体は、ネットワーク バッファー リストのチェーンを記述できます。 streamFlags パラメーターが FWPS_STREAM_FLAG_RECEIVE_DISCONNECT または FWPS_STREAM_FLAG_SEND_DISCONNECTの場合、netBufferList NULL できます。

[in] dataLength

データ ストリームに挿入されるデータのバイト数。

[in] completionFn

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

netBufferList パラメーターで NET_BUFFER_LIST チェーンが記述されている場合、completionFn はチェーン内の NET_BUFFER_LIST ごとに 1 回呼び出されます。

netBufferList パラメーターが NULL であり、streamFlags パラメーターに FWPS_STREAM_FLAG_RECEIVE_DISCONNECT または FWPS_STREAM_FLAG_SEND_DISCONNECT が設定されている場合、completionFn 関数は呼び出されません。

このパラメーターは必須であり、NULL することはできません。 NULL 場合は、STATUS_FWP_NULL_POINTER が返されます。

[in, optional] completionContext

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

戻り値

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

リターン コード 形容
STATUS_SUCCESS
データ ストリームへの挿入が正常に開始されました。 フィルター エンジンは、フィルター エンジンがデータ ストリームへのデータの挿入を完了した後、NET_BUFFER_LIST 構造体が割り当てられたときに指定された完了関数を呼び出します。
STATUS_FWP_TCPIP_NOT_READY
TCP/IP ネットワーク スタックは、ストリーム データの挿入を受け入れる準備ができていません。
STATUS_FWP_INJECT_HANDLE_CLOSING
挿入ハンドルが閉じられています。
その他の状態コードの
エラーが発生しました。

備考

コールアウト ドライバーは、コールアウトの classifyFn 吹き出し関数内から FwpsStreamInjectAsync0 関数を呼び出して、現在処理中のデータ ストリームに新しいデータまたは複製されたデータを挿入します。 コールアウト ドライバーは、ストリーム レイヤーでデータ フローを処理している場合にのみ、FwpsStreamInjectAsync0 関数を呼び出すことができます。

コールアウト ドライバーは、コールアウトの classifyFn 吹き出し関数の外部から FwpsStreamInjectAsync0 関数を呼び出して、現在遅延しているデータ ストリームにデータを挿入することもできます。 データ ストリームは、吹き出しの classifyFn 吹き出し関数が、streamAction メンバーを設定すると遅延されます。FWPS_STREAM_ACTION_DEFERする構造体を FWPS_STREAM_CALLOUT_IO_PACKET0 します。

さらに、引き出し線ドライバーは、引き出し線の classifyFn 吹き出し関数の外部から FwpsStreamInjectAsync0 関数を呼び出して、FIN 表示がペンされた後にデータ ストリームにデータを挿入できます。

または、吹き出しドライバーは、吹き出しドライバーがクローンし、帯域外処理のために示されたすべてのデータをブロックする場合、吹き出しの 分類Fn 吹き出し関数の外部の任意のスレッド コンテキストから FwpsStreamInjectAsync0 関数を呼び出すことができます。 指定されたすべてのデータを処理のためにユーザー モードにリダイレクトするコールアウト ドライバーは、この方法で FwpsStreamInjectAsync0 関数を呼び出すことができます。

吹き出しは、最初に FwpsCloneStreamData0 関数の呼び出しでデータ セグメントを複製し、その後、FWPS_CLASSIFY_OUT0 構造体の actionType メンバーにFWP_ACTION_BLOCKを設定してデータ セグメントをブロックすることで、データ セグメントをペンできます。

挿入されたストリーム データは吹き出しに再び挿入されませんが、下位サブレイヤーから吹き出しをストリーミングするために使用できるようになります。

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

必要条件

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

関連項目

FWPS_INCOMING_VALUES0

FWPS_STREAM_CALLOUT_IO_PACKET0 FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0

FwpsCalloutRegister0

FwpsCalloutRegister1

FwpsCloneStreamData0

FwpsInjectionHandleCreate0

FwpsInjectionHandleDestroy0

NET_BUFFER_LIST

classifyFn

completionFn