文件系统筛选器验证

使用情况验证

筛选器验证程序验证微型筛选器驱动程序中的以下用法:

  • 正确使用参数和调用上下文
  • 更正预操作和操作后回调例程中的返回值
  • 回调数据中参数的一致和一致更改

筛选器管理器对象跟踪

筛选器验证程序跟踪以下筛选器管理器对象:

  • 筛选器上下文(流上下文、文件上下文等)
  • 回调数据结构
  • 排队的工作项
  • NameInformation 结构
  • 文件对象
  • 筛选对象
  • 实例对象
  • 卷对象

对于引用计数结构(如筛选器上下文和名称信息结构),如果任何引用计数似乎已泄露,筛选器验证程序将在卸载筛选器驱动程序时闯入调试器。 它将打印有关如何使用 !fltkd 调试器扩展 查找泄漏结构的说明。

筛选验证程序冲突

筛选器验证程序检测到冲突时,它会在描述冲突的调试器中输出消息。 对于大多数冲突,它还会停止执行,并提示用户采取一些操作。 例如:

FILTER VERIFIER ERROR: A filter returned an unknown pre-operation callback status.
(Filter = FFFFAC04A21CD8A0 (MyFilter), Status = 0xbaadf00d)
Break, ignore, zap or remove ?

若要继续,请键入四个单字母命令中的一个:

  • Bb中断:这会中断调试器,你可以在其中执行进一步调查。
  • Ii 对于 Ignore:恢复执行。 如果再次遇到此冲突,筛选器验证程序会将冲突消息输出到调试器,停止执行并显示提示。
  • Zz Zap:继续执行。 如果再次遇到此冲突,筛选器验证程序会将冲突消息输出到调试器,但不会停止执行。
  • Rr删除”:恢复执行。 如果再次遇到此冲突,筛选器验证程序将不会打印冲突消息,也不会停止执行。

注意

在启用了编译器优化的情况下生成的驱动程序上使用筛选器验证程序时,有时可能会遇到筛选器验证程序错误,指出筛选器泄露了对一个或多个资源的引用,即使找不到代码中泄漏的原因也是如此。 该消息将以类似于以下内容的文本开头:

FILTER VERIFIER ERROR: A filter (Filter = FFFFAC04A21CD8A0 (MyFilter)) leaked references to the following resources:

还可以看到一条消息,指示对象跟踪不同步,例如:

FILTER VERIFIER WARNING: Filter manager verifier object tracking may be out of sync for the system

此条件的最常见原因是筛选器验证程序由于尾部调用优化而无法识别筛选器管理器 API 的真实调用方。 当驱动程序中的例程调用筛选器管理器 API 作为其最后一行时,可能会发生这种情况。 例如:

void MyWorkItemCallback(PFLT_GENERIC_WORKITEM WorkItem,
                        PVOID Filter,
                        PVOID Context)
{
   // Do some stuff
   ...
   FltFreeGenericWorkItem(WorkItem);
}

有几种方法可以验证这是否发生了:

  1. 通过将可疑例程包装在内 #pragma optimize("", off) ... #pragma optimize("", on)来禁用优化。
  2. 对代码进行重新排序,以便筛选器管理器 API 调用不是例程中发生的最后一件事。

如果错误在尝试其中一个选项后不再重现,则可能是误报。

激活此选项

可以使用命令行为一个或多个驱动程序 verifier.exe 激活文件系统筛选器验证功能。 有关详细信息,请参阅 “选择驱动程序验证程序选项”。

注意

在 Windows 内部版本 25126 之前,不支持在选择 ntoskrnl 进行验证的一个或微型筛选器上启用文件系统筛选器验证。 这样做可能会导致虚假的验证程序错误。

若要避免此问题,请在组件列表中不包含 ntoskrnl ,以在内部版本 25126 之后验证或升级到 Windows 版本。

启动筛选器验证程序的建议方法是使用 /standard 选项 verifier.exe,因为它提供了其他有用的功能,例如 特殊的池池跟踪

verifier.exe /standard /driver MyFilter.sys

当微型筛选器驱动程序向筛选器管理器注册时,验证将启动。

  • 在 Windows 11 及更高版本中仅启用筛选器验证程序,若要启用最小筛选器验证程序检查集,请启用驱动程序验证程序(verifier.exe)中的 I/O 验证文件系统筛选器验证选项。 例如:

    verifier.exe /ruleclasses 5 37 /driver MyFilter.sys
    
  • 在 Windows 10 和早期版本的 Windows 中启用“仅筛选验证程序”以启用最小筛选器验证程序检查集,指定微型筛选器驱动程序的名称,并在驱动程序验证程序(verifier.exe)中启用 I/O 验证选项。 例如:

    verifier.exe /flags 0x10 /driver MyFilter.sys