次の方法で共有


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 構造体を割り当てます。 FwpsAllocateCloneNetBufferList0FwpsAllocateNetBufferAndNetBufferList0、または FwpsCloneStreamData0 関数。 NET_BUFFER_LIST構造では、ネットワーク バッファー リストのチェーンを記述できます。 streamFlags パラメーターがFWPS_STREAM_FLAG_RECEIVE_DISCONNECTまたはFWPS_STREAM_FLAG_SEND_DISCONNECTの場合、netBufferListNULL にすることができます

[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 の表示がペンされた後にデータ ストリームにデータを挿入できます。

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

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

挿入されたストリーム データは吹き出しに再配信されませんが、低いウェイトのサブレイヤーから吹き出しをストリーミングできるようになります。

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

要件

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