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
保留。 标注驱动程序应将此参数设置为零。
[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
指定要将数据注入到其中的数据流的特征的标志。
将数据注入入站数据流时,标注驱动程序会指定以下一个或多个标志:
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 结构的指针,该结构描述要注入到数据流中的数据。 标注驱动程序分配 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链,则将为链中的每个NET_BUFFER_LIST调用一次 completionFn。
如果 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返回值,则不会调用完成函数。 在这种情况下,必须通过调用 FwpsFreeNetBufferList0 或 FwpsFreeCloneNetBufferList0 来释放 netBufferList 指向的网络缓冲区列表。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从 Windows Vista 开始可用。 |
目标平台 | 通用 |
标头 | fwpsk.h (包括 Fwpsk.h) |
Library | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |