在 Windows 搜索中创建筛选器处理程序的最佳做法

Microsoft Windows 搜索使用筛选器提取要包含在全文索引中的项的内容。 可以通过编写筛选器处理程序提取内容和属性处理程序来扩展 Windows 搜索以为新的或专有文件类型编制索引,并编写属性处理程序来提取文件的属性。 筛选器与文件类型相关联,由文件扩展名、MIME 类型或类标识符 (CLSID) 表示。 虽然一个筛选器可以处理多个文件类型,但每种类型只能使用一个筛选器。

本主题包含以下各节:

本机代码

在 Windows 7 及更高版本中,显式阻止使用托管代码编写的筛选器。 由于运行多个加载项的进程存在潜在的 CLR 版本控制问题,必须使用本机代码编写筛选器。

下面是编写用于 Windows 搜索的安全应用程序的做法。

对于查询应用程序:

  • 编写搜索客户端时,应选择在允许用户拥有最低特权的安全上下文中运行的 API。 例如,ASP 页面可以使用 IXSSO 查询对象,该对象作为用户进程运行。

对于 IFilters 和语言资源:

  • 如果正在安装某个文件类型的新筛选器处理程序作为现有筛选器注册的替换,安装程序应保存当前注册,并在卸载新的筛选器处理程序时还原它。 没有链接筛选器的机制。 因此,新的筛选器处理程序负责复制旧筛选器的任何必要功能。
  • Windows 搜索的 IFilter、断字符和词干分析器在本地安全上下文中运行。 应编写它们以管理缓冲区和正确堆叠。 所有字符串副本都必须具有显式检查,以防止缓冲区溢出。 应始终验证已分配的缓冲区大小,并对照缓冲区的大小测试数据的大小。 缓冲区溢出是利用不强制实施缓冲区大小限制的代码的常用方法。
  • IFilter、断字符和词干分析器组件不应调用终止进程及其所有线程的 ExitProcess 函数 或类似 API。
  • 不要在 DllMain 入口点中分配或释放资源。 这可能会导致在低资源压力测试期间失败。
  • 将所有对象编码为线程安全。 Windows 搜索一次在一个线程中调用断字符或词干分析器的任何一个实例,但它可能同时跨多个线程调用多个实例。
  • 避免创建临时文件或写入注册表。
  • 如果使用 Microsoft Visual C++ 编译器,请确保使用 /GS 选项编译应用程序。 /GS 选项用于检测缓冲区溢出。 /GS 选项将安全检查放入编译的代码中。 有关详细信息,请参阅平台 SDK 的 Visual C++ 编译器选项部分中的 DllGetClassObject 函数 /GS (缓冲区安全检查) 。

其他资源

开发筛选器处理程序

关于 Windows 搜索中的筛选器处理程序

从筛选器处理程序返回属性

随 Windows 一起交付的筛选器处理程序

在 Windows 搜索中实现筛选器处理程序

注册筛选器处理程序

测试筛选器处理程序