FwpsInjectTransportReceiveAsync0 函数 (fwpsk.h)

FwpsInjectTransportReceiveAsync0 函数将传输、数据报数据或 ICMP 错误层中的数据包数据注入到接收数据路径中。

注意FwpsInjectTransportReceiveAsync0FwpsInjectTransportReceiveAsync 的特定版本。 有关详细信息 ,请参阅 WFP Version-Independent 名称和面向 Windows 的特定版本
 

语法

NTSTATUS FwpsInjectTransportReceiveAsync0(
  [in]           HANDLE                injectionHandle,
  [in, optional] HANDLE                injectionContext,
                 PVOID                 reserved,
  [in]           UINT32                flags,
  [in]           ADDRESS_FAMILY        addressFamily,
  [in]           COMPARTMENT_ID        compartmentId,
  [in]           IF_INDEX              interfaceIndex,
  [in]           IF_INDEX              subInterfaceIndex,
  [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 函数来获取它。

reserved

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

[in] flags

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

[in] addressFamily

以下地址系列之一:

AF_INET

IPv4 地址系列。

AF_INET6

IPv6 地址系列。

[in] compartmentId

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

[in] interfaceIndex

接收原始数据包数据的接口的索引。 如果要将数据包注入指示原始数据包的同一接口,则标注驱动程序应使用接口索引的值,该索引作为传入数据值之一传递给其 分类Fn 标注函数的此参数。

[in] subInterfaceIndex

接收原始数据包数据的子接口的索引。 如果要将数据包注入到指示原始数据包的同一子接口中,标注驱动程序应使用子接口索引的值,该索引作为传入数据值之一传递给此参数的 分类Fn 标注函数。

[in, out] netBufferList

指向描述要注入的数据包数据的 NET_BUFFER_LIST 结构的指针。 标注驱动程序通过调用 FwpsAllocateCloneNetBufferList0 函数或 FwpsAllocateNetBufferAndNetBufferList0 函数来分配用于注入数据包数据的NET_BUFFER_LIST结构。 NET_BUFFER_LIST 结构必须以 IP 标头开头。

[in] completionFn

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

[in, optional] completionContext

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

返回值

FwpsInjectTransportReceiveAsync0 函数返回以下 NTSTATUS 代码之一。

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

注解

标注驱动程序调用 FwpsInjectTransportReceiveAsync0 函数,将来自传输、数据报数据或 ICMP 错误层的数据包数据注入到接收数据路径中。 此函数可以异步执行。 标注驱动程序通常在修改数据包数据时将数据注入网络堆栈。 有关标注驱动程序如何修改数据包数据的详细信息,请参阅 标注驱动程序操作

如果标注驱动程序修改了将使用 FwpsInjectTransportReceiveAsync0 注入的数据包,则应调用 FwpsConstructIpHeaderForTransportPacket0 函数,用于更正 TCP、UDP 和 ICMP (IP 和上层协议) 校验和。 FwpsConstructIpHeaderForTransportPacket0headerIncludeHeaderSize 参数应与 的 ipHeaderSize 成员的值相同 FWPS_INCOMING_METADATA_VALUES0传递给标注驱动程序的分类Fn 标注函数的 inMetaValues 参数的结构。

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

如果原始入站数据包数据在最初由传输层处理时受到 IPsec 策略强制实施,则此函数注入的克隆数据包在重新进入网络堆栈时将绕过 IPsec 验证。 使用 FwpsAllocateNetBufferAndNetBufferList0 函数的本地生成的入站数据包也绕过 IPsec 验证。

若要允许 IPsec 首先处理入站数据包,检查传输层数据的标注在FWPS_FILTER0结构中的 subLayerWeight 值必须低于通用子层。 此外,标注驱动程序不得截获其组合的隧道模式数据包 (isTunnelMode && FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0成员! isDeTunneled ) 由 返回 FwpsGetPacketListSecurityInformation0 函数。 标注驱动程序必须等待数据包解通,然后应在传输层或转发层拦截数据包。

由于 TCP 协议锁定语义,TCP 只能在任何传输层或等效层进行带外注入,因此 FwpsInjectTransportReceiveAsync0 和 FwpsInjectTransportSendAsync0 必须由 DPC 排队并运行。

如果未设置 FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED 元数据标志,可以从以下传输层之一调用此函数:

FWPS_LAYER_INBOUND_TRANSPORT_V4

FWPS_LAYER_INBOUND_TRANSPORT_V6

使用 FWP_DIRECTION_INBOUND) 指定入站方向时FWPS_LAYER_DATAGRAM_DATA_V4 (

使用 FWP_DIRECTION_INBOUND) 指定入站方向时 FWPS_LAYER_DATAGRAM_DATA_V6 (

FWPS_LAYER_INBOUND_ICMP_ERROR_V4

FWPS_LAYER_INBOUND_ICMP_ERROR_V6

否则,应在通过调用 FwpsPendOperation0 启动笔式 ALE 操作并完成对 FwpsCompleteOperation0 的调用后,从以下应用程序层强制 (ALE) 层调用此函数:

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6

要注入的净缓冲区列表必须作为 netBufferList 参数传递给 FwpsCompleteOperation0 函数。

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

要求

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

另请参阅

FWPS_FILTER0

FWPS_FILTER_CONDITION0

FWPS_INCOMING_METADATA_VALUES0

FWPS_PACKET_INJECTION_STATE

FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0

FwpsCompleteOperation0

FwpsFreeCloneNetBufferList0

FwpsFreeNetBufferList0

FwpsGetPacketListSecurityInformation0

FwpsInjectNetworkSendAsync0

FwpsInjectionHandleCreate0

FwpsInjectionHandleDestroy0

FwpsPendOperation0

FwpsQueryPacketInjectionState0

NET_BUFFER_LIST

分类Fn

completionFn