FwpsInjectTransportSendAsync0 函数 (fwpsk.h)
FwpsInjectTransportSendAsync0 函数将传输、数据报数据或 ICMP 错误层中的数据包数据注入到发送数据路径中。
语法
NTSTATUS FwpsInjectTransportSendAsync0(
[in] HANDLE injectionHandle,
[in, optional] HANDLE injectionContext,
[in] UINT64 endpointHandle,
[in] UINT32 flags,
[in, optional] FWPS_TRANSPORT_SEND_PARAMS0 *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_SELF或FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF时,可以通过调用 FwpsQueryPacketInjectionState0 函数来获取它。
[in] endpointHandle
一个句柄,指示数据包要注入到的发送数据路径中的堆栈传输终结点。 此终结点句柄通过 的 transportEndpointHandle 成员提供给标注 FWPS_INCOMING_METADATA_VALUES0 传递给标注驱动程序的 分类Fn 标注函数的结构。 标注驱动程序应使用提供的句柄尽快将克隆的数据包注入回数据路径,然后与堆栈终结点关联的套接字关闭且句柄不再有效。
[in] flags
保留。 标注驱动程序必须将此参数设置为零。
[in, optional] sendArgs
指向 FWPS_TRANSPORT_SEND_PARAMS0 结构,用于指定当前出站数据包的属性。 仅当要注入的 net 缓冲区列表包含 IP 标头 ((例如,通过原始套接字) 发送数据包)时,才能为 NULL 。
[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, out] netBufferList
指向描述要注入的数据包数据的 NET_BUFFER_LIST 结构的指针。 标注驱动程序分配 NET_BUFFER_LIST 结构,用于通过调用 任一方式注入数据包数据 FwpsAllocateCloneNetBufferList0 函数或 FwpsAllocateNetBufferAndNetBufferList0 函数。
[in] completionFn
指向标注驱动程序提供的 completionFn 标注函数的指针。 在 netBufferList 参数描述的数据包数据注入网络堆栈后,筛选器引擎会调用此函数。
[in, optional] completionContext
指向标注驱动程序提供的上下文的指针,该上下文传递给 由 completionFn 参数指向的标注函数。 此参数是可选的,可以为 NULL。
返回值
FwpsInjectNetworkSendAsync0 函数返回以下 NTSTATUS 代码之一。
返回代码 | 说明 |
---|---|
|
已成功启动数据包数据注入。 在筛选器引擎完成将数据包数据注入网络堆栈后,或者随后发生错误时,筛选器引擎将调用完成函数。 如果出现错误,已完成NET_BUFFER_LIST结构的 Status 成员将指示失败的原因。 |
|
TCP/IP 网络堆栈尚未准备好接受数据包数据的注入。 |
|
注入句柄正在关闭。 |
|
出现了错误。 |
注解
标注驱动程序调用 FwpsInjectNetworkSendAsync0 函数,将传输、数据报数据或 ICMP 错误层中的数据包数据注入发送数据路径。 在这些层,IP 标头可能尚未形成,并且当 IPsec 策略处于活动状态时,数据包数据未加密或签名。 因此,此函数非常适合用于启用 IPsec 的环境中的数据包检查。
此函数可以异步执行。
如果未STATUS_SUCCESS返回值,则不会调用完成函数。 在这种情况下,需要通过调用 FwpsFreeNetBufferList0 或 FwpsFreeCloneNetBufferList0 来释放 netBufferList 指向的 net 缓冲区列表。
标注驱动程序在修改数据包数据时通常会将数据注入网络堆栈。 有关标注驱动程序如何修改数据包数据的详细信息,请参阅 标注驱动程序操作。
由于 TCP 协议锁定语义,TCP 只能在任何传输层或等效层进行带外注入,因此 FwpsInjectTransportReceiveAsync0 和 FwpsInjectTransportSendAsync0 必须由 DPC 排队并运行。
可以再次向标注驱动程序指示注入的数据包。 若要防止无限循环,驱动程序应在调用分类Fn 标注函数之前先调用 FwpsQueryPacketInjectionState0 函数,并允许将注入状态FWPS_PACKET_INJECTION_STATE设置为FWPS_PACKET_INJECTED_BY_SELF或FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF的数据包。
endpointHandle 参数,以及在 中声明的成员sendArgs 参数指向的FWPS_TRANSPORT_SEND_PARAMS0结构提供给来自以下网络层的标注:
- 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
如果以下两项都成立,则数据报属于原始套接字:
- FWPS_INCOMING_METADATA_VALUES0 结构的 currentMetadataValues 成员具有FWPS_METADATA_FIELD_IP_HEADER_SIZE标志集。
- FWPS_INCOMING_METADATA_VALUES0 结构的 ipHeaderSize 成员大于零。
在以下网络层,如果数据报属于原始套接字,则必须调整 netBufferList 指向的 netBufferList 指向的净缓冲区列表,以从 IP 标头开始 (该标头必须附加到 net buffer list) :
- 使用 FWP_DIRECTION_OUTBOUND) 指定出站方向时FWPS_LAYER_DATAGRAM_DATA_V4 (
- 使用 FWP_DIRECTION_OUTBOUND) 指定出站方向时FWPS_LAYER_DATAGRAM_DATA_V6 (
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从 Windows Vista 开始可用。 |
目标平台 | 通用 |
标头 | fwpsk.h (包括 Fwpsk.h) |
Library | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |