文件系统筛选器验证

使用情况验证

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

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

筛选器管理器对象跟踪

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

  • 筛选上下文 (流上下文、文件上下文等)
  • 回调数据结构
  • 已排队的工作项
  • 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“忽略:继续执行”。 如果再次遇到此冲突,筛选器验证程序会将冲突消息打印到调试器、停止执行并显示提示。
  • 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 文件系统筛选器验证功能。 有关详细信息,请参阅 选择驱动程序验证程序选项

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

verifier.exe /standard /driver MyFilter.sys

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

  • 在 Windows 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