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


Автоматические проверки

Средство проверки драйверов выполняет следующие проверки при проверке одного или нескольких драйверов. Эти проверки нельзя активировать или отключить. Начиная с Windows 10 версии 1709 эти автоматические проверки были перемещены в соответствующие стандартные флаги. В результате пользователи, включиющие средство проверки драйверов со стандартными флагами, не должны видеть никаких сокращений применяемых проверок.

Мониторинг процедур IRQL и памяти

Средство проверки драйверов отслеживает выбранный драйвер на наличие следующих запрещенных действий:

  • Повышение IRQL путем вызова KeLowerIrql

  • Снижение IRQL путем вызова KeRaiseIrql

  • Запрос нулевого размера выделения памяти

  • Выделение или освобождение выстраивного пула с помощью IRQL > APC_LEVEL

  • Выделение или освобождение непагражированного пула с помощью IRQL > DISPATCH_LEVEL

  • Попытка освободить адрес, который не был возвращен из предыдущего выделения

  • Попытка освободить адрес, который уже был освобожден

  • Получение или освобождение быстрого мьютекса с помощью IRQL > APC_LEVEL

  • Получение или освобождение спин-блокировки с помощью IRQL не равно DISPATCH_LEVEL

  • Двойное освобождение спин-блокировки.

  • Маркировка запроса на выделение MUST_SUCCEED. Такие запросы никогда не допускаются.

Если средство проверки драйверов неактивно, эти нарушения могут не вызвать немедленный сбой системы во всех случаях. Средство проверки драйверов отслеживает поведение драйвера и выдает проверка 0xC4 ошибок при возникновении какого-либо из этих нарушений. Список параметров проверка ошибок см. в разделе 0xC4 проверки ошибок (DRIVER_VERIFIER_DETECTED_VIOLATION).

Мониторинг переключения стека

Средство проверки драйверов отслеживает использование стека проверяемым драйвером. Если драйвер переключает свой стек, а новый стек не является ни стеком потоков, ни стеком DPC, проверка ошибок. (Это будет проверка 0xC4 ошибок с первым параметром, равным 0x90.) В стеке, отображаемом командой отладчика базы знаний, обычно отображается драйвер, который выполнил эту операцию.

Проверка выгрузки драйвера

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

В частности, средство проверки драйверов ищет:

  • Таймеры отмены

  • Ожидающие отложенные вызовы процедур (DPC)

  • Отмененные списки просмотра

  • Отмена удаления рабочих потоков

  • Очереди с отменой удаления

  • Другие аналогичные ресурсы

Такие проблемы могут привести к тому, что проверки системных ошибок могут быть выданы через некоторое время после выгрузки драйвера, и причину этих проверок ошибок может быть трудно определить. Если средство проверки драйверов активно, такие нарушения приведут к проверка 0xC7 ошибок сразу после выгрузки драйвера. Список параметров проверка ошибок см. в разделе 0xC7 проверки ошибок (TIMER_OR_DPC_INVALID).

Мониторинг использования списка дескрипторов памяти (MDL)

В Windows Vista средство проверки драйверов также отслеживает выбранный драйвер на наличие следующих запрещенных действий:

  • Вызов MmProbeAndLockPages или MmProbeAndLockProcessPages в MDL без соответствующих флагов. Например, неправильно вызывать MmProbeAndLockPages для MDL, созданного с помощью MmBuildMdlForNonPagedPool.

  • Вызов MmMapLockedPages в MDL без соответствующих флагов. Например, неправильно вызывать MmMapLockedPages для MDL, который уже сопоставлен с системным адресом или MDL, который не заблокирован.

  • Вызов MmUnlockPages или MmUnmapLockedPages для частичного MDL, то есть MDL, созданного с помощью IoBuildPartialMdl.

  • Вызов MmUnmapLockedPages в MDL, который не сопоставлен с системным адресом.

Если средство проверки драйверов неактивно, эти нарушения могут не привести к тому, что система перестанет отвечать немедленно во всех случаях. Средство проверки драйверов отслеживает поведение драйвера и выдает проверка 0xC4 ошибок при возникновении какого-либо из этих нарушений. Список параметров проверка ошибок см. в разделе 0xC4 проверки ошибок (DRIVER_VERIFIER_DETECTED_VIOLATION).

Выделение объекта синхронизации из памяти nonPagedPoolSession

Начиная с Windows 7 средство проверки драйверов проверяет объекты синхронизации из памяти сеанса.

Объекты синхронизации должны быть недоступными для страницы. Они также должны находиться в глобальном, системном виртуальном адресном пространстве.

Графический драйвер может выделять память сеанса, вызывая ТАКИЕ API, как EngAllocMem. В отличие от глобального адресного пространства, адресное пространство сеанса виртуализировано для каждого сеанса сервера терминалов. Это означает, что один и тот же виртуальный адрес, используемый в контексте двух разных сеансов, ссылается на два разных объекта. Ядро Windows должно иметь доступ к объектам синхронизации из любого сеанса сервера терминалов. Попытка сослаться на адрес памяти сеанса из другого сеанса приводит к непредсказуемым результатам, таким как сбой системы или автоматическое повреждение данных другого сеанса.

Начиная с Windows 7, когда проверенный драйвер инициализирует объект синхронизации путем вызова ТАКИХ API, как KeInitializeEvent или KeInitializeMutex, средство проверки драйверов проверяет, попадает ли адрес объекта в виртуальное адресное пространство сеанса. Если средство проверки драйверов обнаруживает такой неправильный адрес, он выдает 0xC4 проверки ошибок: DRIVER_VERIFIER_DETECTED_VIOLATION со значением параметра 1 0xDF.

Изменение значения счетчика ссылок на объекты с 0 на 1

Начиная с Windows 7 средство проверки драйверов проверяет наличие дополнительных классов неправильных ссылок на объекты.

Когда диспетчер объектов ядра Windows создает объект, например объект File или Thread, для счетчика ссылок нового объекта устанавливается значение 1. Счетчик ссылок увеличивается путем вызовов API, таких как ObReferenceObjectByPointer или ObReferenceObjectByHandle. Счетчик ссылок уменьшается при каждом вызове ObDereferenceObject для одного и того же объекта.

После того как счетчик ссылок достигнет значения 0, объект становится доступным для освобождения. Диспетчер объектов может освободить его немедленно или позже. Вызов ObReferenceObjectByPointer или ObDereferenceObject и изменение счетчика ссылок с 0 на 1 означает увеличение счетчика ссылок уже освобожденного объекта. Это всегда неправильно, так как это может привести к повреждению выделения памяти другого пользователя.

Блоки или задержки завершения работы системы

Начиная с Windows 7 средство проверки драйверов прерывает работу отладчика ядра, если завершение работы системы не завершается через 20 минут после запуска. Средство проверки драйверов назначает начало завершения работы системы как время, когда ядро Windows начинает завершать работу различных подсистем, таких как реестр, Plug And Play или подсистемы диспетчера ввода-вывода.

Если отладчик ядра не подключен к системе, средство проверки драйверов выдает 0xC4 проверки ошибок: DRIVER_VERIFIER_DETECTED_VIOLATION со значением параметра 1 0x115 вместо этой точки останова.

Часто завершение работы системы, которое не может завершиться менее чем через 20 минут, указывает на то, что один из драйверов, работающих в этой системе, не работает. При запуске !analyze -v из отладчика ядра отображается трассировка стека системного рабочего потока, отвечающего за завершение работы. Следует изучить эту трассировку стека и определить, заблокирован ли поток завершения работы одним из тестируемых драйверов.

Иногда системе не удается завершить работу, так как она подвергается интенсивному стресс-тестированию, даже если все драйверы работают правильно. Пользователь может продолжить выполнение после этой точки останова средства проверки драйверов и проверка, будет ли система в конечном итоге завершить работу.