Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Средство проверки драйверов выполняет следующие проверки при проверке одного или нескольких драйверов. Эти проверки нельзя активировать или отключить. Начиная с 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.) Стек, отображаемый командой отладчика KB, обычно показывает драйвер, который выполнил эту операцию.
Проверка выгрузки драйвера
После выгрузки драйвера, который проверяется, средство проверки драйверов выполняет несколько проверок, чтобы убедиться, что драйвер выполнил все операции по очистке.
В частности, средство проверки драйверов ищет следующее:
Незавершенные таймеры
Ожидающие отложенные процедуры вызовов (DPC)
Непрсотертые списки lookaside
Незавершенные рабочие потоки
Отмена очередей
Другие аналогичные ресурсы
Такие проблемы, как эти, могут привести к появлениям проверок системных ошибок некоторое время после выгрузки драйвера из системы, а причину этих проверок ошибок может быть сложно определить. Когда средство проверки драйверов активно, такие нарушения приведут к тому, что код ошибки проверки 0xC7 будет выдан сразу после выгрузки драйвера. См. проверку ошибок Bug Check 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. В отличие от глобального адресного пространства, виртуализация адресного пространства проводится для каждого сеанса Terminal Server. Это означает, что один и тот же виртуальный адрес, используемый в контексте двух разных сеансов, ссылается на два разных объекта. Ядро 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, Driver Verifier инициирует прерывание в отладчике ядра, если завершение работы системы не произойдет в течение 20 минут после его начала. Средство проверки драйверов назначает начало завершения работы системы в качестве времени, когда ядро Windows начинает завершение работы различных подсистем, таких как Реестр, Подключаемый модуль и подсистемы диспетчера ввода-вывода.
Если отладчик ядра не подключен к системе, Driver Verifier выдает Проверка ошибок 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION со значением параметра 1, равным 0x115, вместо этой точки останова.
Часто завершение работы системы, которое не может завершиться менее чем за 20 минут, указывает, что один из драйверов, работающих в этой системе, не работает. При выполнении !analyze -v из отладчика ядра отображается трассировка стека рабочего потока системы, ответственного за завершение работы. Необходимо проверить трассировку стека и определить, блокируется ли поток завершения работы одним из тестируемых драйверов.
Иногда система не может завершить работу, так как она подвергается тяжелому стресс-тестированию, даже если все драйверы работают правильно. Пользователь может продолжить выполнение после этой точки останова средства проверки драйвера и проверить, завершается ли система в конечном итоге.