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


0xD1 проверки ошибок: DRIVER_IRQL_NOT_LESS_OR_EQUAL

Проверка ошибок DRIVER_IRQL_NOT_LESS_OR_EQUAL имеет значение 0x000000D1. Это означает, что драйвер в режиме ядра пытался получить доступ к страничной памяти, пока процесс IRQL был слишком высоким.

Важно!

Эта статья предназначена для программистов. Если вы являетесь клиентом, который получил код ошибки "синий экран" во время работы с компьютером, см. статью Устранение ошибок синего экрана.

параметры DRIVER_IRQL_NOT_LESS_OR_EQUAL

Параметр Описание

1

Память, на который ссылается ссылка.

2

IRQL на момент ссылки.

3

  • 0 — чтение
  • 1. Запись
  • 2. Выполнение
  • 8. Выполнение

4

Адрес, ссылающийся на память. Используйте ln (список ближайших символов) для этого адреса, чтобы просмотреть имя функции.

Причина

Чтобы определить причину, требуется отладчик Windows, опыт программирования и доступ к исходному коду модуля сбоя.

Как правило, при возникновении этой ошибки драйвер пытается получить доступ к адресу, который доступен для страниц (или является полностью недопустимым), в то время как уровень запроса прерывания (IRQL) был слишком высоким. Для этого могут быть следующие причины:

  • Разыменование неверного указателя (например, NULL или освобожденного указателя) при выполнении на уровне DISPATCH_LEVEL или выше.

  • Доступ к страничным данным на уровне DISPATCH_LEVEL или выше.

  • Выполнение страничного кода на уровне DISPATCH_LEVEL или выше.

Если драйвер, ответственный за ошибку, можно определить, его имя выводится на синем экране и сохраняется в памяти в расположении (PUNICODE_STRING) KiBugCheckDriver. Вы можете использовать dx (отображение выражения объектной модели отладчика), команду отладчика, чтобы отобразить следующее: dx KiBugCheckDriver.

Эта ошибка проверка обычно вызвана драйверами, которые использовали неправильные адреса памяти.

Возможные причины сбоя страницы включают следующие события:

  • Функция была помечена как страничной и выполнялась в режиме IRQL с повышенными привилегиями (включая получение блокировки).

  • Был выполнен вызов функции в другом драйвере, и этот драйвер был выгружен.

  • Функция была вызвана с помощью указателя функции, который был недопустимым указателем.

Дополнительные сведения о windows IRQLs см. в статье Windows Internals 7th Edition Part 1 (Windows Internals 7th Edition Part 1 ) (Павел Йосифович), Марк Е. Руссинович (Mark E. Russinovich), Дэвид А. Соломон (David A. Solomon) и Алекс Ионеску (Alex Ionescu).

Решение

Если проблема вызвана драйвером, который вы разрабатываете, убедитесь, что функция, которая выполнялась во время проверка ошибки:

  • Не помечено как страничный
  • Не вызывает другие встроенные функции, которые можно вывести на страницы.

Расширение отладчика !analyze отображает сведения об ошибке проверка и может быть полезным при определении первопричины. Следующий пример является выходными данными из !analyze.

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: fffff808add27150, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000000, value 0 = read operation, 1 = write operation
Arg4: fffff808adc386a6, address which referenced memory

Если драйвер, ответственный за ошибку, можно определить, его имя выводится на синем экране и сохраняется в памяти в расположении (PUNICODE_STRING) KiBugCheckDriver. Вы можете использовать dx (отображение выражения объектной модели отладчика), команду отладчика, чтобы отобразить следующее: dx KiBugCheckDriver.

0: kd> dx KiBugCheckDriver
KiBugCheckDriver                 : 0xffffc6092de892c8 : "Wdf01000.sys" [Type: _UNICODE_STRING *]

Если кадр ловушки доступен в файле дампа, используйте команду .trap , чтобы задать для контекста указанный адрес.

Чтобы начать отладку проверка ошибок этого типа, изучите трассировку стека с помощью команд k, kb, kc, kd, kp, kP, kv (обратная трассировка стека отображения).

В отладчике выполните команду !irql , чтобы отобразить сведения об IRQL процессора на целевом компьютере до приостановки работы отладчика. Пример:

0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)

В большинстве случаев проверка ошибок этого типа проблема заключается не в уровне IRQL, а в памяти, к которой осуществляется доступ.

Так как эта ошибка проверка обычно вызвана драйверами, которые использовали неправильные адреса памяти, используйте параметры 1, 3 и 4 для дальнейшего изучения.

Используйте ln (список ближайших символов) с параметром 4, чтобы просмотреть имя вызванной функции. Кроме того, проверьте выходные данные !analyze , чтобы узнать, обнаружен ли код сбоя.

Используйте !pool в адресе параметра 1, чтобы узнать, является ли он выстраивным пулом. Используйте !address и расширенную команду !pte , чтобы узнать больше об этой области памяти.

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

Используйте команды u, ub, uu (unassemble) для просмотра кода в адресе, который ссылается на память в параметре 4.

Используйте команду lm t n , чтобы получить список модулей, загруженных в память. Используйте !memusage и для изучения общего состояния системной памяти.

Средство проверки драйверов

Средство проверки драйверов — это средство, которое выполняется в режиме реального времени для проверки поведения драйверов. Например, средство проверки драйверов проверяет использование ресурсов памяти, таких как пулы памяти. При обнаружении ошибок при выполнении кода драйвера он заранее создает исключение, чтобы эта часть кода драйвера была тщательно изучена. Диспетчер проверки драйверов встроен в Windows и доступен на всех компьютерах с Windows.

Чтобы запустить диспетчер проверки драйверов, введите verifier в командной строке. Вы можете настроить драйверы для проверки. Код, который проверяет драйверы, добавляет дополнительные затраты при выполнении, поэтому попробуйте проверить минимальное количество драйверов. Дополнительные сведения см. в разделе Средство проверки драйверов.

Комментарии

Если для решения этой проблемы у вас нет возможности использовать отладчик Windows, можно использовать некоторые основные методы устранения неполадок.

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

  • Если в сообщении об ошибке указан драйвер, отключите его или обратитесь к изготовителю за обновлениями драйверов.

  • Убедитесь, что любое новое установленное оборудование совместимо с установленной версией Windows. Например, сведения о требуемом оборудовании можно получить на странице спецификаций Windows 10.

Дополнительные общие сведения об устранении неполадок см. в разделе Данные синего экрана.