以异步方式处理分类标注

WFP 标注驱动程序可以通过从分类Fn 标注函数返回操作类型FWP_ACTION_PERMITFWP_ACTION_CONTINUEFWP_ACTION_BLOCK来授权或拒绝网络操作,或者允许或放弃网络数据包。 通常,标注驱动程序无法从其 分类Fn 函数返回检查决策,直到指示的信息(如可分类字段、元数据或数据包)可以转发到另一个组件(例如用户模式应用程序)进行处理。 在这些情况下,可能需要在以后的某个时间异步做出决定。

异步处理的一般规则

WFP 支持 对分类Fn 标注函数进行异步处理。 但是,执行此操作的机制因层而异。

异步 ALE 分类
标注驱动程序必须从分类Fn 调用 FwpsPendOperation0 函数。 异步操作必须通过调用 FwpsCompleteOperation0 函数来完成。

异步数据包分类
标注驱动程序应从分类Fn 函数返回FWP_ACTION_BLOCK,并设置FWPS_CLASSIFY_OUT_FLAG_ABSORB标志。 必须引用或克隆网络数据包。 异步操作通过重新注入克隆或修改的数据包或通过静默放弃数据包来完成。

包含数据包的异步 ALE 分类
使用前两个过程的组合:对分类操作进行笔式处理,引用或克隆数据包,稍后完成对 分类Fn 的调用,并重新注入或丢弃克隆的数据包。

特殊情况和注意事项

ALE Connect 与接收/接受层
调用 FwpsCompleteOperation0 以在 ALE 连接层 (FWPS_LAYER_ALE_AUTH_CONNECT_V4或FWPS_LAYER_ALE_AUTH_CONNECT_V6) 完成笔式分类操作时,会在相应的 ALE 连接层触发 ALE 重新授权分类操作。 标注驱动程序应返回此重新授权分类操作中的检查决策。 可以通过检查是否设置了 FWP_CONDITION_FLAG_IS_REAUTHORIZE 标志来检测 ALE 重新授权分类操作。

标注驱动程序必须为每个吊坠ALE_AUTH_CONNECT分类操作保持唯一状态,以便可以在 FwpsCompleteOperation0 触发的重新授权期间查找每个分类操作的检查决策。 如果在插入ALE_AUTH_CONNECT分类操作期间引用或克隆数据包 (例如,对于) 的非 TCP 连接,则可以在重新授权后重新插入数据包。

在 ALE 接收/接受层 (FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4或FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6) 期间调用 FwpsCompleteOperation0 时,FwpsCompleteOperation0 不会触发 ALE 重新授权。 相反,如果修改不够重要,无法绕过筛选器,则当克隆的数据包重新注入传入时,会再次发出对 分类Fn 的新调用。 允许来自ALE_RECV_ACCEPT层的自注入克隆可以有效地授权传入连接。 如果不允许传入连接,请在调用 FwpsCompleteOperation0 后放弃传入数据包。

ALE 重新授权
可以在 ALE 连接层或接收/接受层重新分类标注驱动程序,例如策略更改 (例如,在层) 添加或删除筛选器、检测新的到达接口以及使用 IPsec 重新设置连接键。 此类重新授权不能通过调用 FwpsCompleteOperation0 进行笔触,并且无需这样做。 标注驱动程序应使用前面列出的规则来处理重新授权期间指示的数据包。

请注意,传入和传出数据包都可以在ALE_AUTH_CONNECT层或ALE_RECV_ACCEPT层重新授权。 例如,可以在ALE_AUTH_CONNECT层重新授权传入的数据包。 标注驱动程序不得假定数据包的方向与连接方向相同。

ALE_FLOW_ESTABLISHED层
这些层 (FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4或FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6) 不支持异步处理。

INBOUND_TRANSPORT层
标注驱动程序不得对传入 (入站) 传输层 (FWPS_LAYER_INBOUND_TRANSPORT_V4或FWPS_LAYER_INBOUND_TRANSPORT_V6) 进行 ALE 分类处理的数据包执行异步处理。 执行此操作可能会干扰流的创建。 当 WFP 在传入传输层调用 分类Fn 标注函数时,它会为那些需要 ALE 分类处理的数据包设置 FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED 标志。 标注驱动程序应允许来自INBOUND_TRANSPORT层的此类数据包,并应延迟处理它们,直到它们到达ALE_RECV_ACCEPT层。

STREAM 层
在流层 (FWPS_LAYER_STREAM_V4FWPS_LAYER_STREAM_V6) ,指示 TCP 数据段而不是 IP 或 TCP 标头。 流层也是可在一次调用 分类Fn 标注函数时指示网络缓冲区列表链的位置。 WFP 提供专用克隆和注入函数 FwpsCloneStreamData0FwpsStreamInjectAsync0,供流层标注使用。

由于流层数据的有序传递性质,只要任何流数据仍处于挂起状态,标注驱动程序必须继续克隆和吸收数据。 混合给定流流的异步和同步操作可能会导致未定义的行为。