Поделиться через


Проверка фильтра файловой системы

Проверка использования

Средство проверки фильтра проверяет следующее использование в драйвере минифильтра:

  • Правильное использование параметров и контекст вызова
  • Правильные возвращаемые значения из подпрограмм обратного вызова предоперперации и после операции
  • Согласованные и последовательные изменения параметров в данных обратного вызова

Отслеживание объектов Диспетчера фильтров

Средство проверки фильтров отслеживает следующие объекты диспетчера фильтров:

  • Фильтрация контекстов (контексты потока, контексты файлов и т. д.)
  • Структуры данных обратного вызова
  • Рабочие элементы в очереди
  • Структуры NameInformation
  • Объекты файлов
  • Фильтрация объектов
  • Объекты экземпляров
  • Объекты томов

Для ссылочных структур, таких как контексты фильтров и структуры сведений о имени, средство проверки фильтров будет разбито на отладчик после выгрузки драйвера фильтра, если какие-либо счетчики ссылок, как представляется, были утечки. В нем будут напечатаны инструкции по использованию расширения отладчика !fltkd для поиска утечки структур.

Нарушения проверяющего фильтра

Когда средство проверки фильтра обнаруживает нарушение, оно выводит сообщение в отладчике, описывающее нарушение. Для большинства нарушений он также останавливает выполнение и предлагает пользователю выполнить некоторые действия. Например:

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

Чтобы продолжить, введите одну из четырех однобуквенные команды:

  • B или b для прерывания. Это разбивается на отладчик, где можно выполнить дальнейшее исследование.
  • I или i для пропуска: возобновление выполнения. Если это нарушение возникает снова, средство проверки фильтров будет выводить сообщение о нарушении в отладчик, остановить выполнение и отобразить запрос.
  • Z или z для Zap: возобновляет выполнение. Если это нарушение возникает снова, средство проверки фильтров выводит сообщение о нарушении в отладчик, но не остановит выполнение.
  • R или r для удаления: возобновление выполнения. Если это нарушение возникает снова, средство проверки фильтров не будет выводить сообщение о нарушении и не будет остановлено выполнение.

Примечание.

При использовании средства проверки фильтров на драйвере, который был создан с включенными оптимизацией компилятора, иногда возникает ошибка средства проверки фильтра, которая постоянно утверждает, что утечка ссылок фильтра на один или несколько ресурсов даже в том случае, если не удается найти причину утечки в коде. Сообщение начинается с текста, аналогичного следующему:

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 в список компонентов для проверки или обновления до версии Windows после сборки 25126.

Рекомендуемый способ запуска средства проверки фильтра — с параметром /standardverifier.exe, так как он предоставляет дополнительные полезные функции, такие как специальный пул и отслеживание пула:

verifier.exe /standard /driver MyFilter.sys

Проверка начинается, когда драйвер минифильтра регистрируется в диспетчере фильтров.

  • Включение только средства проверки фильтра в Windows 11 и более поздних версиях Windows , чтобы включить минимальный набор проверок средства проверки фильтра, включите параметры проверки ввода-вывода и проверки файловой системы в средстве проверки драйверов (verifier.exe). Например:

    verifier.exe /ruleclasses 5 37 /driver MyFilter.sys
    
  • Включение средства проверки только фильтров в Windows 10 и предыдущих версиях Windows , чтобы включить минимальный набор проверок средства проверки фильтра, укажите имя драйвера минифильтра и включите параметр проверки ввода-вывода в средстве проверки драйверов (verifier.exe). Например:

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