FwpsStreamInjectAsync0 函数 (fwpsk.h)

FwpsStreamInjectAsync0 函数将 TCP 数据段注入 TCP 数据流。

注意FwpsStreamInjectAsync0FwpsStreamInjectAsync 的特定版本。 有关详细信息 ,请参阅 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

保留。 标注驱动程序应将此参数设置为零。

[in] flowId

一个运行时标识符,指定要将数据注入到其中的数据流。 数据流的运行时标识符通过筛选器引擎提供给标注驱动程序的 classifyFn 标注函数的FWPS_METADATA_FIELD_FLOW_HANDLE元数据值提供给标注驱动程序。

[in] calloutId

筛选器引擎中标注的运行时标识符。 当标注驱动程序调用 FwpsCalloutRegister0FwpsCalloutRegister1 函数以向筛选器引擎注册标注时,将返回此标识符。

[in] layerId

正在处理数据流的筛选层的运行时标识符。 此值必须是FWPS_LAYER_STREAM_V4或FWPS_LAYER_STREAM_V6。 正在处理数据流的层的运行时标识符提供给筛选器引擎传递给标注驱动程序的 classifyFn 标注函数的FWPS_INCOMING_VALUES0结构的 layerId 成员中的标注。

[in] streamFlags

指定要将数据注入到其中的数据流的特征的标志。

将数据注入入站数据流时,标注驱动程序会指定以下一个或多个标志:

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 开始可用。

将数据注入出站数据流时,标注驱动程序会指定以下一个或多个标志:

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 结构,用于通过调用 将数据注入数据流 FwpsAllocateCloneNetBufferList0FwpsAllocateNetBufferAndNetBufferList0FwpsCloneStreamData0 函数。 NET_BUFFER_LIST结构可以描述网络缓冲区列表链。 如果 streamFlags 参数 FWPS_STREAM_FLAG_RECEIVE_DISCONNECTFWPS_STREAM_FLAG_SEND_DISCONNECT则 netBufferList 可以为 NULL

[in] dataLength

要注入到数据流中的数据的字节数。

[in] completionFn

指向标注驱动程序提供的 completionFn 标注函数的指针。 将 netBufferList 参数描述的数据包数据注入网络堆栈后,筛选器引擎将调用此函数。

如果 netBufferList 参数描述NET_BUFFER_LIST链,则将为链中的每个NET_BUFFER_LIST调用一次 completionFn

如果 netBufferList 参数为 NULL ,并且 streamFlags 参数已设置 FWPS_STREAM_FLAG_RECEIVE_DISCONNECTFWPS_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返回值,则不会调用完成函数。 在这种情况下,必须通过调用 FwpsFreeNetBufferList0 或 FwpsFreeCloneNetBufferList0 来释放 netBufferList 指向的网络缓冲区列表

要求

要求
最低受支持的客户端 从 Windows Vista 开始可用。
目标平台 通用
标头 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