Callout驱动程序编程注意事项

在为 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 数据包。 如果需要内联注入,调用必须排队 DPC 来执行注入。

传出 IP 标头对齐方式

当使用其中一个数据包注入函数将数据包数据注入到传出路径时,描述网络缓冲区列表中 IP 标头的 MDL(NET_BUFFER_CURRENT_MDLNET_BUFFER_LIST_FIRST_NBnetBufferList))必须保持指针对齐。 由于传入数据包的 IP 标头 MDL 可能是指针对齐的,因此在将传入数据包注入传出路径时,如果标头尚未对齐,回调函数必须重新生成 IP 标头。

Windows 筛选平台标注驱动程序