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
以前通过调用
[in, optional] injectionContext
注入上下文的可选句柄。
[in] flags
保留。 标注驱动程序应将此参数设置为零。
[in] flowId
一个运行时标识符,用于指定要将数据注入到其中的数据流。 数据流的运行时标识符通过筛选器引擎提供给标注驱动程序的FWPS_METADATA_FIELD_FLOW_HANDLE元数据值,该元数据值提供给标注驱动程序的 分类Fn 标注函数。
[in] calloutId
筛选器引擎中标注的运行时标识符。 调用 FwpsCalloutRegister0 或 FwpsCalloutRegister1 函数以向筛选器引擎注册标注时,将返回此标识符。
[in] layerId
正在处理数据流的筛选层的运行时标识符。 此值必须是FWPS_LAYER_STREAM_V4或FWPS_LAYER_STREAM_V6。 正在处理数据流的层的运行时标识符提供给 FWPS_INCOMING_VALUES0 结构的 layerId 成员中的标注,筛选器引擎传递给标注驱动程序的 分类Fn 标注函数。
[in] streamFlags
指定要将数据注入到的数据流特征的标志。
将数据注入入站数据流时,标注驱动程序指定以下一个或多个标志:
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 开始可用。
将数据注入出站数据流时,标注驱动程序指定以下一个或多个标志:
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 结构的指针,该结构描述要注入到数据流中的数据。 标注驱动程序通过调用
[in] dataLength
要注入到数据流中的数据的字节数。
[in] completionFn
指向标注驱动程序提供的 completionFn 标注函数的指针。 筛选器引擎在 netBufferList 参数描述的数据包数据被注入网络堆栈后调用此函数。
如果 netBufferList 参数描述 NET_BUFFER_LIST 链,完成Fn 将为链中的每个 NET_BUFFER_LIST 调用一次。
如果 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 网络堆栈尚未准备好接受流数据的注入。 |
|
正在关闭注入句柄。 |
|
发生错误。 |
言论
标注驱动程序从标注的 分类Fn 标注函数中调用 FwpsStreamInjectAsync0 函数,以将新的或克隆的数据注入当前正在处理的数据流中。 仅当调用方在流层处理数据流时,标注驱动程序才能调用 FwpsStreamInjectAsync0 函数。
标注驱动程序还可以从标注的分类 标注函数外部调用 FwpsStreamInjectAsync0 函数,以将数据注入当前延迟的数据流。 当标注的 分类Fn 标注函数设置 streamAction 成员时,数据流将延迟 FWPS_STREAM_CALLOUT_IO_PACKET0 结构来FWPS_STREAM_ACTION_DEFER。
此外,标注驱动程序可以从标注的分类 分类 标注函数外部调用 FwpsStreamInjectAsync0 函数,以便将数据注入到数据流中,
或者,标注驱动程序可以从标注的 分类的任意线程上下文调用 FwpsStreamInjectAsync0 函数(如果标注驱动程序克隆并阻止为带外处理指示的所有数据)。 将所有指示的数据重定向到用户处理模式的标注驱动程序可以通过这种方式调用 FwpsStreamInjectAsync0 函数。
标注可以通过先通过调用 FwpsCloneStreamData0 函数来绘制数据段,然后通过在 FWPS_CLASSIFY_OUT0 结构的 actionType 成员中设置FWP_ACTION_BLOCK来阻止数据段。
注入的流数据不会重新分配给标注,但它将可用于流式处理来自较低权重子层的标注。
如果未STATUS_SUCCESS返回值,则不会调用完成函数。 在这种情况下,必须通过调用 FwpsFreeNetBufferList0 或 FwpsFreeCloneNetBufferList0释放 netBufferList 指向的网络缓冲区列表。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows Vista 开始可用。 |
目标平台 | 普遍 |
标头 | fwpsk.h (包括 Fwpsk.h) |
库 | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |