Внимание! Решение проблемы связано с внесением изменений в системный реестр. Перед внесением изменений в системный реестр рекомендуется создать резервную копию системного реестра и изучить процедуру его восстановления.
Возможности средства проверки драйверов.
Чтобы выполнить проверку драйверов, необходимо запустить средство Verifier.exe и перезагрузить компьютер. Чтобы начать анализ драйверов, других действий выполнять не нужно.
Средство проверки драйверов предоставляет следующие возможности.
Выделение ресурсов из пула
При получении запросов на выделение памяти из пула производится попытка удовлетворить все запросы, выделяя память из особого пула. При этом выделяемые ресурсы не могут использоваться другими процессами системы – они изолируются и ограничиваются страницами, для которых установлены разрешения «Нет доступа». Это позволяет выявлять ситуации, в которых драйвер выделяет больше памяти, чем получено из пула, что может привести к нарушению стабильности работы системы. Если при использовании данного режима компьютер обладает достаточным объемом физической и виртуальной памяти, то все ресурсы для драйвера выделяются из особого пула.
Проверка работоспособности при повышенной нагрузке на память
Проверка работоспособности при повышенной нагрузке на память может выполняться для заданного драйвера и не затрагивать остальные драйверы (независимо от объема памяти в системе). Для этого необходимо, чтобы диспетчер памяти пометил как недействительные выгружаемый код и данные драйвера, а также выгружаемый пул системы, код и данные. Это позволит выявить драйверы, которые ошибочно удерживают спин-блокировки или запускают прерывания IRQL, а затем получают доступ к выгружаемому коду или данным. Данный режим позволяет выявить несистематические проблемы и определить их причину.
Проверка параметров
Все производимые драйвером вызовы, приводящие к установке спин-блокировок, возникновению прерываний IRQL и распределению пула автоматически, подвергаются проверке параметров. При этом проверяется, удовлетворяют ли данные вызовы следующим требованиям.
• | Возникающее прерывание IRQL действительно возникает (уровень текущего прерывания IRQL меньше, чем уровень требуемого IRQL). |
• | Более низкий уровень IRQL действительно представляет собой более низкий уровень IRQL. |
• | Выполняется двойное снятие спин-блокировок. |
• | Установка и снятие спин-блокировок выполняются на соответствующем уровне прерывания IRQL. |
• | Выделение и освобождение выгружаемого пула выполняется на соответствующем уровне прерывания IRQL (уровень APC_LEVEL или более низкий). |
• | Выделение и освобождение невыгружаемого пула выполняется на соответствующем уровне прерывания IRQL (уровень DISPATCH_LEVEL или более низкий). |
• | Функциям API не передаются случайные (неинициализированные) значения. |
Имитация сбоев при распределении пула
Запросы на выделение ресурсов из пула, для которых драйвер не устанавливает флаг MUST_SUCCEED, могут случайным образом отклоняться. Это позволяет проверить правильность работы драйвера в условиях недостатка памяти.
Освобождение пула
При освобождении пула проверяется, не остались ли в пуле отложенные таймеры, поскольку это может вызвать сбои, причину которых тяжело определить.
Обнаружение утечек пула
Система автоматически отслеживает все запросы драйвера на выделение ресурсов из пула. Если при выгрузке драйверов какие-либо ресурсы не освобождены, возникает системная ошибка. Чтобы просмотреть список выделенных ресурсов, которые еще не освобождены, воспользуйтесь командой !verifier 3 отладчика ядра. Кроме того, данную команду можно использовать до выгрузки драйвера, чтобы ознакомиться со списком ресурсов, которые были выделены драйверу в произвольный момент времени.
Проверка выгрузки драйвера
Данная проверка позволяет выявить драйверы, которые при выгрузке не полностью удаляют используемые ресурсы, что увеличивает вероятность возникновения сбоя через некоторые время после выгрузки данного драйвера. В число подобных ресурсов входят ассоциативные списки, отложенные вызовы отложенных процедур (DPC), рабочие потоки, очереди, таймеры и другие ресурсы.
Проверка ввода-вывода
После включения проверки ввода-вывода с помощью диспетчера проверки файлов или путем изменения параметра реестра VerifyDriverLevel (дополнительные сведения см. в разделе «Включение проверки драйверов» данной статьи) при операциях ввода-вывода выполняются некоторые проверки, перечисленные ниже.
• | Все распределения IRPS, выполняемые с помощью функции IoAllocateIrp, выделяются из особого пула. |
• | В функциях IoCallDriver, IoCompleteRequest и IoFreeIrp выполняются проверки, позволяющие отслеживать сообщения драйвера об ошибках. |
• | Все сбои, возникающие при проверке ввода-вывода, порождают системную ошибку с кодом DRIVER_VERIFIER_IOMANAGER_VIOLATION (0xC9). |
Необходимые условия для выполнения проверки драйверов
Средство проверки драйверов работает под управлением Windows 2000, Windows XP и Windows Server 2003. Использование одной из указанных операционных систем является единственным условием, необходимым для применения данного средства. Средство проверки драйверов поддерживается как в розничной, так и в отладочной версиях Windows. Рекомендации по подготовке к использованию диспетчера проверки драйверов на рабочих серверах см. в статье 251233 базы знаний Майкрософт. Если на компьютере установлена программа Norton Antivirus, не используйте в диспетчере проверки драйверов режим обнаружения взаимоблокировки. Дополнительные сведения см. в статье 325672 базы знаний Майкрософт.
Включение проверки драйверов
Чтобы включить проверку драйверов, воспользуйтесь средством Verifier.exe. Данное средство входит в состав всех перечисленных выше версий Windows и автоматически устанавливается в папку System32. Средство Verifier.exe поддерживает пользовательский интерфейс и режим командной строки и позволяет выбирать проверяемые драйверы и соответствующий уровень проверки. Статистика проверки драйверов отображается в режиме реального времени. Дополнительные сведения см. в разделе «Диспетчер проверки драйверов» данной статьи.
Устранение ошибок, возникающих при проверке драйверов
Команда !verifier отладчика ядра и средство Verifier.exe показывают текущие параметры проверки драйверов и статистику в режиме реального времени.
Все ошибки, возникающие при проверке драйверов, вызывают появление системных ошибок. Наиболее распространенные ошибки приведены ниже.
• | IRQL_NOT_LESS_OR_EQUAL 0xA |
• | PAGE_FAULT_IN_NONPAGED_AREA 0×50 |
• | PAGE_FAULT_IN_NONPAGED_AREA 0×50 |
• | ATTEMPTED_WRITE_TO_READONLY_MEMORY 0xBE |
• | SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION 0xC1 |
• | DRIVER_VERIFIER_DETECTED_VIOLATION 0xC4 |
• | DRIVER_CAUGHT_MODIFYING_FREED_POOL 0xC6 |
• | TIMER_OR_DPC_INVALID 0xC7 |
• | DRIVER_VERIFIER_IOMANAGER_VIOLATION 0xC9 |
Проверка драйверов и графические драйверы
Графические драйверы Windows уровня ядра (например, библиотеки драйверов принтера и видеокарт) не могут напрямую обращаться к точке входа в пул. Вместо этого распределение пула выполняется косвенным образом с помощью графического интерфейса драйвера устройств (DDI), осуществляющего ответные вызовы драйвера Win32k.sys. Например, вызов функции EngAllocMem представляет собой ответный вызов, выполняемый графическим драйвером для явного выделения памяти из пула. Кроме того, выделение памяти из пула выполняют и другие специализированные обратные вызовы, например EngCreatePalette и EngCreateBitmap.
Чтобы предоставить возможность аналогичной автоматической проверки графических драйверов, в драйвер Win32k.sys добавлена поддержка некоторых функций проверки драйверов. Однако, поскольку на графические драйверы налагается больше ограничений, чем на драйверы уровня ядра, для проверки графических драйверов требуются только некоторые возможности, предоставляемые средством проверки драйверов. В частности, нет необходимости в проверке IRQL и проверке ввода-вывода. Другие возможности (например, использование особого пула, имитация сбоев при распределении пула и отслеживание пула) в различной степени поддерживаются различными обратными вызовами DDI.
Имитация сбоев при распределении пула поддерживается для следующих функций обратного вызова графического интерфейса DDI.
• | EngAllocMem |
• | EngAllocUserMem |
• | EngCreateBitmap |
• | EngCreateDeviceSurface |
• | EngCreateDeviceBitmap |
• | EngCreatePalette |
• | EngCreateClip |
• | EngCreatePath |
• | EngCreateWnd |
• | EngCreateDriverObj |
• | BRUSHOBJ_pvAllocRbrush |
• | CLIPOBJ_ppoGetPath |
Кроме того, использование особого пула и отслеживание пула поддерживаются для функции EngAllocMem.
Включение проверки драйверов для графических драйверов выполняется так же, как и для остальных драйверов (дополнительные сведения см. в разделе «Включение проверки драйверов» данной статьи). Неподдерживаемые флаги, например флаг проверки IRQL, игнорируются. Для определения параметров проверки драйверов и трассировки пула для графических драйверов можно воспользоваться командой !gdikdx.verifier отладчика ядра.
ПРИМЕЧАНИЕ. Режим имитации сбоев при распределении пула должен применяться только с целью проверки надежности работы. Поскольку использование данного режима может вызывать появление сообщений об ошибках создания изображений, не используйте данный режим для проверки правильности реализации графических драйверов (например, путем сравнения изображения, формируемого драйвером, с эталонным изображением).
Диспетчер проверки драйверов (Verifier.exe)
Для создания и изменения параметров проверки драйверов, а также для сбора статистики при проверке драйверов корпорация Майкрософт рекомендует использовать средство «Диспетчер проверки драйверов» (Verifier.exe). Данное средство поставляется в составе Windows и находится в папке %WinDir%\System32.
Состояние драйвера
Страница Состояние драйвера отображает текущее состояние средства проверки драйверов, а также список драйверов, обнаруженных средством проверки, и состояние драйверов. В поле «Состояние» могут быть указаны следующие значения.
• | Загружен. Драйвер загружен и проверен. |
• | Выгружен. В настоящий момент драйвер не загружен, однако после перезагрузки компьютера драйвер был загружен хотя бы один раз. |
• | Никогда не был загружен. Драйвер не загружался ни разу. Если для драйвера указано состояние «Никогда не был загружен», значит файл с образом драйвера поврежден или в системе отсутствует драйвер с указанным именем. |
Чтобы отсортировать список по имени драйвера или по состоянию, щелкните заголовок нужного столбца. В правом верхнем углу окна диспетчера проверки драйверов отображаются выполняемые проверки. Если для переключателя «Частота обновления» установлено любое значение, кроме значения «Вручную», то состояние драйверов обновляется автоматически. Чтобы изменить частоту обновления, воспользуйтесь переключателем, находящимся в левом нижнем углу окна. Чтобы принудительно обновить состояние драйверов, нажмите кнопку Обновить сейчас.
Если установлен флаг «Особый пул» и если менее 95 процентов выделяемых ресурсов распределяется из особого пула, на данной странице появляется предупреждающее сообщение. Это значит, что для улучшения качества проверки распределения пула необходимо уменьшить число проверяемых драйверов или увеличить объем оперативной памяти компьютера.
Глобальные счетчики
На странице Глобальные счетчики отображается состояние некоторых счетчиков, поддерживаемых средством проверки драйверов. Нулевое значение счетчика может говорить о том, что в диспетчере проверки драйверов не установлен флаг, соответствующий данному счетчику. Например, если значение счетчика «Неудачных» равно 0, значит не установлен флаг «Нехватка ресурсов». По умолчанию значения счетчиков обновляются автоматически. Это позволяет отслеживать работу средства проверки. Чтобы изменить частоту обновления, переключиться в режим ручного обновления или выполнить принудительное обновление состояния счетчиков, используйте элементы управления, находящиеся в левом нижнем углу окна.
Слежение за пулом
На данной странице отображаются значения дополнительных счетчиков, поддерживаемых средством проверки драйверов. Все счетчики, находящиеся на этой странице, активируются при установке в диспетчере проверки драйверов флага «Слежение за пулом». Большинство счетчиков отображают данные, относящиеся к конкретному драйверу (например, счетчики «Текущих распределений», «Байт в текущий момент» и т. п.). Чтобы просмотреть показания счетчика для какого-либо драйвера, необходимо выбрать имя драйвера в поле со списком, находящемся в верхней части окна.
Параметры
Данная страница позволяет создавать и изменять параметры проверки драйверов. Эти параметры сохраняются в системном реестре, поэтому, чтобы изменения вступили в силу, необходимо перезагрузить компьютер. На данной странице также отображается список установленных драйверов. Каждый драйвер, указанный в списке, может находиться в одном из следующих состояний.
• | Включена. Драйвер проверяется. |
• | Отключена. Драйвер не проверяется. |
• | Включена (требуется перезагрузка). Проверка драйвера начнется после перезагрузки. |
• | Отключена (требуется перезагрузка). Драйвер проверяется. После перезагрузки проверка будет отключена. |
Чтобы изменить состояние драйверов, выберите из списка один или несколько драйверов и укажите требуемое состояние, используя кнопки, находящиеся под списком. Кроме того, для изменения состояния драйвера можно щелкнуть название нужного драйвера правой кнопкой мыши и выбрать требуемое состояние в появившемся контекстном меню.
В нижней части страницы можно указать названия дополнительных драйверов, которые следует проверить после перезагрузки. Вводимые названия следует разделять пробелами. Как правило, это необходимо при установке нового драйвера, который еще не загружен.
Если переключатель в верхней части окна установлен в положение Проверить все драйверы, то список драйверов, кнопки Проверить и Не проверять, а также поле для ввода названий драйверов становятся недоступными. Это означает, что после следующей перезагрузки будут проверяться все драйверы.
Флажки, находящиеся в правом верхнем углу окна, позволяют указать тип проверки. Проверка ввода-вывода может выполняться на уровне 1 или на уровне 2. Уровень 2 предполагает выполнение дополнительных проверок по сравнению с уровнем 1.
Чтобы сохранить сделанные изменения, необходимо нажать кнопку Применить. Кроме кнопки «Применить» на данной странице находятся следующие кнопки.
• | «Предпочтения». При нажатии данной кнопки для всех выбранных драйверов устанавливаются параметры проверки по умолчанию. |
• | «Сбросить все». При нажатии данной кнопки снимаются все флажки, находящиеся на данной странице, и отключается проверка всех драйверов. |
Чтобы изменения вступили в силу, необходимо нажать кнопку Применить и перезагрузить компьютер.
Легко меняющиеся настройки
Данная страница позволяет изменить значения некоторых параметров проверки драйверов без перезагрузки. Список проверяемых драйверов при этом изменять нельзя. Чтобы изменения вступили в силу, необходимо нажать кнопку Применить. Изменения вступают в силу сразу после нажатия данной кнопки и действуют до внесения новых изменений или до перезагрузки компьютера.
Параметры командной строки
Средство Verifier.exe можно запускать из командной строки (чтобы получить дополнительные сведения, введите в командной строкеverifier.exe /? ). Ниже перечислены основные параметры командной строки, поддерживаемые данным средством.
• | verifier.exe /flagsфлаг [/iolevel 2] Задает в десятичном виде значение флагов проверки драйверов, позволяет указывать уровень проверки ввода-вывода (чтобы ознакомиться со списком доступных флагов, выполните в командной строке командуverifier.exe /? или обратитесь к разделу «Включение проверки драйверов» данной статьи). В приведенном примерефлаг – параметр, значение которого определяется исходя из значения отдельных битов, каждый из которых соответствует указанному ниже флагу. 0 – Особый пул. Например, введите следующую команду. c:\verifier /flags 3 /iolevel 2 ПРИМЕЧАНИЕ. По умолчанию используется первый уровень проверки ввода-вывода. Если во флаге не установлен бит проверки ввода-вывода, данное значение игнорируется. |
• | verifier.exe /all Проверять все драйверы в системе. |
• | verifier.exe /volatile /flagsфлаг Изменить флаги немедленно. |
• | verifier.exe /reset Сбросить все параметры проверки драйверов. |
• | verifier /query Вывести текущее состояние проверки драйверов и значения счетчиков на стандартное устройство вывода. |
• | verifier.exe /log ИМЯ_ФАЙЛА_ЖУРНАЛА [/intervalколичество_секунд] Сохранить состояние и значения счетчиков проверки драйверов в файле журнала (гдеколичество_секунд – заданный интервал времени). |
Дополнительные сведения для разработчиков драйверов
Следующий раздел содержит дополнительные сведения о параметрах проверки драйверов, которые могут потребоваться разработчикам драйверов. Администраторы и опытные пользователи эти параметры, как правило, не используют.
Предупреждение. Неправильное использование редактора реестра может привести к возникновению серьезных неполадок, требующих переустановки операционной системы. Корпорация Майкрософт не несет ответственности за неправильное использование редактора реестра. За результаты работы пользователя с редактором реестра корпорация Майкрософт ответственности не несет.
Чтобы включить проверку драйверов путем изменения параметров реестра, выполните следующие действия.
1. | Запустите редактор реестра (Regedt32). |
2. | Найдите следующий параметр реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDrivers |
3. | Измените значение этого параметра (данный параметр имеет тип REG_SZ). |
Внесите в данный параметр имена проверяемых драйверов (вводимые имена нечувствительны к регистру букв). Средство проверки драйверов позволяет указать несколько драйверов, однако использовать только один из них. Это гарантирует, что системные ресурсы не будут израсходованы преждевременно. Преждевременное расходование ресурсов не снижает надежность системы, но может привести к тому, что часть проверок не будет выполнена.
Ниже приведены примеры значений данного параметра.
• | Ntfs.sys |
• | Win32k.sys ftdisk.sys |
• | *.sys |
Чтобы указать уровень проверки драйвера, измените следующий параметр реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDriverLevel Ниже приведено описание побитовых значений данного параметра. Указанные значения можно объединять.
• | 0×01. Пытаться выполнить все распределения из особого пула. |
• | 0×02. Проверить работу драйвера в режиме повышенной нагрузки на память. Это позволяет проверить использование прерываний IRQL при доступе к выгружаемому коду и данным. |
• | 0×04. Случайным образом осуществлять имитацию сбоев при распределении пула. Данный режим используется после того, как система запущена и достигнута точка, когда сбой может рассматриваться как проблема и должен быть обработан. |
• | 0×08. Включить слежение за пулом. Перед выгрузкой драйвера система проверяет, освободил ли драйвер все выделенные ресурсы. Если часть ресурсов не освобождена, появляется сообщение об ошибке. |
• | 0×10. Включить проверку ввода-вывода. |
ПРИМЕЧАНИЕ. Если данный параметр реестра отсутствует или уровень проверки драйвера не указан, по умолчанию используется значение 3. Если в диспетчере проверки драйверов нажать кнопку «Предпочтения», данному параметру будет присвоено значение 0x1B. Чтобы обнаружить утечки памяти, используйте значение 0xB. Чтобы присвоить данному параметру значение 0xB, нажмите кнопку Предпочтения, а затем снимите флажок Проверка ввода/вывода.
Взято в support.microsoft.com