Рекомендации по созданию обработчиков фильтров в Windows Search

Microsoft Windows Search использует фильтры для извлечения содержимого элементов для включения в полнотекстовый индекс. Вы можете расширить Windows Search для индексирования новых или собственных типов файлов, написав обработчики фильтров для извлечения содержимого и обработчики свойств для извлечения свойств файлов. Фильтры связаны с типами файлов, обозначаемыми расширениями имен файлов, типами MIME или идентификаторами классов (CLSID). Хотя один фильтр может обрабатывать несколько типов файлов, каждый тип работает только с одним фильтром.

Этот раздел состоит из следующих подразделов.

Машинный код

В Windows 7 и более поздних версиях фильтры, написанные в управляемом коде, явно блокируются. Фильтры должны быть написаны в машинном коде из-за потенциальных проблем с управлением версиями CLR в процессе, в который выполняются несколько надстроек.

Ниже приведены рекомендации по написанию безопасных приложений для использования с Windows Search.

Для приложений запросов:

  • При написании клиентов поиска следует выбрать API, который выполняется в контексте безопасности, который предоставляет пользователю минимальные привилегии. Например, страницы ASP могут использовать объект запроса IXSSO, который выполняется как пользовательский процесс.

Для IFilters и языковых ресурсов:

  • Если новый обработчик фильтра для типа файла устанавливается в качестве замены существующей регистрации фильтра, установщик должен сохранить текущую регистрацию и восстановить ее при удалении нового обработчика фильтра. Механизм цепочки фильтров отсутствует. Следовательно, новый обработчик фильтра отвечает за репликацию всех необходимых функций старого фильтра.
  • Фильтры IFilter, средства разбиения по словам и парадигматические модули для Windows Search выполняются в контексте локальной безопасности. Они должны быть записаны для управления буферами и правильного стека. Все копии строк должны иметь явные проверки для защиты от переполнения буфера. Всегда следует проверять выделенный размер буфера и проверять размер данных на соответствие размеру буфера. Переполнение буфера — это распространенный метод использования кода, который не применяет ограничения на размер буфера.
  • Компоненты IFilter, средства разбиения по словам и stemmer никогда не должны вызывать функцию ExitProcess или аналогичный API, который завершает процесс и все его потоки.
  • Не выделяйте и не освобождайте ресурсы в точке входа DllMain. Это может привести к сбоям во время стресс-тестов с низким ресурсом.
  • Кодировать все объекты так, чтобы они были потокобезопасны. Windows Search вызывает любой экземпляр средства разбиения по словам или стеммера в одном потоке за раз, но он может вызывать несколько экземпляров одновременно в нескольких потоках.
  • Избегайте создания временных файлов или записи в реестр.
  • Если вы используете компилятор Microsoft Visual C++, убедитесь, что приложение компилируется с помощью параметра /GS. Параметр /GS используется для обнаружения переполнения буфера. Параметр /GS выполняет проверку безопасности в скомпилированном коде. Дополнительные сведения см. в разделе Функция /DllGetClassObjectGS (проверка безопасности буфера) в разделе Параметры компилятора Visual C++ пакета SDK для платформы.

Дополнительные ресурсы

Разработка обработчиков фильтров

Сведения о обработчиках фильтров в Windows Search

Возврат свойств из обработчика фильтра

Обработчики фильтров, поставляемые с Windows

Реализация обработчиков фильтров в Windows Search

Регистрация обработчиков фильтров

Тестирование обработчиков фильтров