标注驱动程序编程注意事项

在对 Windows 筛选平台标注驱动程序进行编程时,请考虑以下主题。

用户模式与内核模式

如果使用 Windows 筛选平台内置的标准筛选功能来完成所需的筛选, (ISV) 的独立软件供应商应编写用户模式管理应用程序来配置筛选器引擎,而不是编写内核模式标注驱动程序。 仅当必须以标准内置筛选功能无法处理的方式处理网络数据时,才应编写内核模式标注驱动程序。 有关如何编写用户模式 Windows 筛选平台管理应用程序的信息,请参阅Microsoft Windows SDK中的 Windows 筛选平台文档。

选择筛选层

标注驱动程序应在网络堆栈中尽可能高的筛选层筛选网络数据。 例如,如果可以在流层处理所需的筛选任务,则不应在网络层实现该任务。 有关驱动程序应使用筛选层来保证与 Windows 中的 IPsec 兼容的建议的详细信息,请参阅 开发IPsec-Compatible标注驱动程序

在应用程序层强制 (ALE) 流建立层时阻止

通常,如果已将标注添加到某个 ALE 流建立 的筛选层 (FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4或FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6) 的筛选引擎中,则其 classifyFn 标注函数绝不应返回操作的FWP_ACTION_BLOCK。 不应在某个 ALE 流建立的筛选层上决定授权或拒绝连接。 此类决策应始终在其他 ALE 筛选层之一做出。

此类 classifyFn 标注函数返回操作FWP_ACTION_BLOCK的唯一有效原因是,如果发生错误,如果建立的连接未结束,可能会带来潜在的安全风险。 在这种情况下,返回操作FWP_ACTION_BLOCK会关闭连接,以防止潜在安全风险被利用。

标注函数执行时间

由于筛选器引擎通常在 IRQL = DISPATCH_LEVEL 调用标注的标注函数,因此请确保这些函数尽快完成其执行,以使系统高效运行。 IRQL = DISPATCH_LEVEL 的扩展执行可能会对系统的整体性能产生负面影响。

注入到接收数据路径

标注应在调用注入到接收数据路径的 数据包注入函数 之前重新计算 IP 校验和,因为从 IP 数据包片段重新组合数据包时,原始数据包中的校验和可能不正确。 没有可靠的机制可指示是否从片段重新组合净缓冲区列表。

来自传输层的 TCP 数据包的内联注入

由于 TCP 堆栈的锁定行为,传输层的标注无法注入 来自 classifyFn 标注函数的新 TCP 数据包或克隆的 TCP 数据包。 如果需要内联注入,标注必须将 DPC 排队以执行注入。

传出 IP 标头对齐

当其中一个数据包注入函数用于将数据包数据注入传出路径时,描述 net buffer list (NET_BUFFER_CURRENT_MDL (NET_BUFFER_LIST_FIRST_NB (netBufferList) ) ) 中的 IP 标头的 MDL 必须与指针对齐。 由于传入数据包的 IP 标头 MDL 可能与指针对齐,因此在将传入数据包注入传出路径时,如果尚未) 对齐,则标注必须重新生成 IP 标头 (。

Windows 筛选平台标注驱动程序