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

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

本主题包含以下各节:

本机代码

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

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

对于查询应用程序:

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

对于 IFilters 和语言资源:

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

其他资源

开发筛选器处理程序

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

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

附带Windows的筛选器处理程序

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

注册筛选器处理程序

测试筛选器处理程序