FwpsInjectTransportSendAsync1 函数 (fwpsk.h)

FwpsInjectTransportSendAsync1 函数将来自传输层、数据报数据层或 ICMP 错误层的数据包数据注入到发送数据路径中。 此函数与 FwpsInjectTransportSendAsync0) 以前的 (版本不同,因为它采用更新的参数结构作为参数。

注意FwpsInjectTransportSendAsync1 是 Windows 7 及更高版本中使用的 FwpsInjectTransportSendAsync 的特定版本。 有关详细信息 ,请参阅 WFP Version-Independent 名称和面向特定版本的 Windows 。 对于 Windows Vista,FwpsInjectTransportSendAsync0 可用。
 

语法

NTSTATUS FwpsInjectTransportSendAsync1(
  [in]           HANDLE                      injectionHandle,
  [in, optional] HANDLE                      injectionContext,
  [in]           UINT64                      endpointHandle,
  [in]           UINT32                      flags,
  [in, optional] FWPS_TRANSPORT_SEND_PARAMS1 *sendArgs,
  [in]           ADDRESS_FAMILY              addressFamily,
  [in]           COMPARTMENT_ID              compartmentId,
  [in, out]      NET_BUFFER_LIST             *netBufferList,
  [in]           FWPS_INJECT_COMPLETE0       completionFn,
  [in, optional] HANDLE                      completionContext
);

参数

[in] injectionHandle

以前通过调用 创建的注入句柄 FwpsInjectionHandleCreate0 函数。

[in, optional] injectionContext

注入上下文的可选句柄。 如果已指定,则当数据包注入状态FWPS_PACKET_INJECTION_STATE为FWPS_PACKET_INJECTED_BY_SELFFWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF时,可以通过调用 FwpsQueryPacketInjectionState0 函数来获取它。

[in] endpointHandle

一个句柄,指示数据包要注入到的发送数据路径中的堆栈传输终结点。 此终结点句柄通过 的 transportEndpointHandle 成员提供给标注 FWPS_INCOMING_METADATA_VALUES0 传递给标注驱动程序的 classifyFn 标注函数的结构。 在与堆栈终结点关联的套接字关闭且句柄不再有效之前,标注驱动程序应使用提供的句柄尽快将克隆的数据包注入回数据路径。

[in] flags

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

[in, optional] sendArgs

指向 FWPS_TRANSPORT_SEND_PARAMS1 结构,用于指定当前出站数据包的属性。 仅当要注入的网络缓冲区列表包含 IP 标头 ((例如,数据包通过原始套接字) 发送)时,此参数才能为 NULL

[in] addressFamily

以下地址系列之一:

AF_INET

IPv4 地址系列。

AF_INET6

IPv6 地址系列。

[in] compartmentId

数据包数据注入到的路由隔离舱的标识符,指定为 COMPARTMENT_ID 类型。 此标识符通过 的 隔离舱 Id 成员提供给标注 FWPS_INCOMING_METADATA_VALUES0 传递给标注驱动程序的 classifyFn 标注函数的结构。 如果 隔离区Id 成员可用于标注,则将在 currentMetadataValues 成员中设置FWPS_METADATA_FIELD_COMPARTMENT_ID。 否则,请将此参数设置为UNSPECIFIED_COMPARTMENT_ID。

[in, out] netBufferList

指向描述要注入的数据包数据的 NET_BUFFER_LIST 结构的指针。 标注驱动程序分配 NET_BUFFER_LIST 结构,用于通过调用 任意一个 来注入数据包数据 FwpsAllocateCloneNetBufferList0 函数或 FwpsAllocateNetBufferAndNetBufferList0 函数。

[in] completionFn

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

[in, optional] completionContext

指向标注驱动程序提供的上下文的指针,该上下文传递给 completionFn 参数指向的标注函数。 此参数是可选的,可以为 NULL

返回值

FwpsInjectTransportSendAsync1 函数返回以下 NTSTATUS 代码之一:

返回代码 说明
STATUS_SUCCESS
已成功启动数据包数据注入。 在筛选器引擎完成将数据包数据注入网络堆栈后,或者随后发生错误时,筛选器引擎将调用完成函数。 如果发生错误,已完成NET_BUFFER_LIST结构的 Status 成员将指示失败的原因。
STATUS_FWP_TCPIP_NOT_READY
TCP/IP 网络堆栈尚未准备好接受数据包数据的注入。
STATUS_FWP_INJECT_HANDLE_CLOSING
正在关闭注入句柄。
其他状态代码
出现了错误。

注解

标注驱动程序调用 FwpsInjectTransportSendAsync1 函数,以将来自传输层、数据报数据层或 ICMP 错误层的数据包数据注入到发送数据路径中。 在这些层,IP 标头可能尚未形成,当 IPsec 策略处于活动状态时,数据包数据未加密或签名。 因此,此函数非常适合用于启用 IPsec 的环境中的数据包检查。

此函数可以异步执行。

如果未 STATUS_SUCCESS返回值,则不会调用完成函数。 在这种情况下,必须通过调用 FwpsFreeNetBufferList0 或 FwpsFreeCloneNetBufferList0 来释放 netBufferList 指向的净缓冲区列表

标注驱动程序通常在修改数据包数据时将数据注入网络堆栈。 有关标注驱动程序如何修改数据包数据的详细信息,请参阅 标注驱动程序操作

可以再次向标注驱动程序指示注入的数据包。 若要防止无限循环,驱动程序应首先调用 FwpsQueryPacketInjectionState0 函数在调用 classifyFn 标注函数之前,允许将注入状态 FWPS_PACKET_INJECTION_STATE 设置为 FWPS_PACKET_INJECTED_BY_SELFFWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF的数据包。

在 中声明的 endpointHandle 参数和成员
sendArgs 参数指向的FWPS_TRANSPORT_SEND_PARAMS1结构提供给来自以下网络层的标注:

FWPS_LAYER_OUTBOUND_TRANSPORT_V4
FWPS_LAYER_OUTBOUND_TRANSPORT_V6
使用 FWP_DIRECTION_OUTBOUND) 指定出站方向时FWPS_LAYER_DATAGRAM_DATA_V4 (
使用 FWP_DIRECTION_OUTBOUND) 指定出站方向时FWPS_LAYER_DATAGRAM_DATA_V6 (
FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4
FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6

如果以下两项都为 true,则数据报属于原始套接字:

在以下网络层,如果数据报属于原始套接字,则需要将FWPS_INCOMING_METADATA_VALUES0结构的 headerIncludeHeaderheaderIncludeHeaderLength 成员复制到 sendArgs 参数指向的FWPS_TRANSPORT_SEND_PARAMS1 结构的相应成员中:

  • 使用 FWP_DIRECTION_OUTBOUND) 指定出站方向时FWPS_LAYER_DATAGRAM_DATA_V4 (
  • 使用 FWP_DIRECTION_OUTBOUND) 指定出站方向时FWPS_LAYER_DATAGRAM_DATA_V6 (

要求

要求
最低受支持的客户端 从 Windows 7 开始可用。
目标平台 通用
标头 fwpsk.h (包括 Fwpsk.h)
Library Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

另请参阅

FWPS_INCOMING_METADATA_VALUES0

FWPS_PACKET_INJECTION_STATE

FWPS_TRANSPORT_SEND_PARAMS1

FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0

FwpsFreeCloneNetBufferList0

FwpsFreeNetBufferList0

FwpsInjectTransportSendAsync0

FwpsInjectionHandleCreate0

FwpsInjectionHandleDestroy0

FwpsQueryPacketInjectionState0

NET_BUFFER_LIST

分类Fn

completionFn