FwpsStreamInjectAsync0 関数 (fwpsk.h)
FwpsStreamInjectAsync0 関数は、TCP データ セグメントを TCP データ ストリームに挿入します。
構文
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_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 フラグを設定します。
[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 コードが含まれます。
リターン コード | 説明 |
---|---|
|
データ ストリームへの挿入が正常に開始されました。 フィルター エンジンは、フィルター エンジンがデータ ストリームへのデータの挿入を完了した後 に、NET_BUFFER_LIST 構造体が割り当てられたときに指定された完了関数を呼び出します。 |
|
TCP/IP ネットワーク スタックは、ストリーム データの挿入を受け入れる準備ができていません。 |
|
インジェクション ハンドルが閉じられています。 |
|
エラーが発生しました。 |
解説
吹き出しドライバーは、吹き出しの 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 |