Что означает код BSOD 0xD1 (DRIVER_IRQL_NOT_LESS_OR_EQUAL)?

 
Также может означать:
КонстантаТипОС
ERROR_INVALID_SIGNAL_NUMBERОшибка WindowsWindows
Предыдущий Следующий
DRIVER_CORRUPTED_MMPOOL BUGCODE_ID_DRIVER

DRIVER_IRQL_NOT_LESS_OR_EQUAL

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

Параметры DRIVER_IRQL_NOT_LESS_OR_EQUAL

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

1

Память, к которой выполнено обращение.

2

IRQL во время обращения.

3

  • 0 — чтение
  • 1 — запись
  • 2 — выполнение
  • 8 — выполнение

4

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

Причина

Обычно при этой ошибке драйвер пытается обратиться к pageable или полностью недопустимому адресу при слишком высоком interrupt request level (IRQL). Возможные причины:

Если удаётся определить драйвер, вызвавший ошибку, его имя выводится на синем экране и сохраняется в памяти по адресу (PUNICODE_STRING) KiBugCheckDriver. Для вывода этих сведений можно использовать dx (вывод выражения object model отладчика в DRIVER_IRQL_NOT_LESS_OR_EQUAL контексте) — команду отладчика: dx KiBugCheckDriver.

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

Возможные причины page fault:

Устранение неполадок

Если проблема вызвана разрабатываемым вами драйвером, убедитесь, что выполнявшаяся в момент проверки функция не помечена как pageable и не вызывает inline-функции, которые могут быть выгружены из памяти.

Для анализа: Расширение !analyze выводит сведения о bug check и помогает установить первопричину. Ниже приведён пример вывода !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

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

Для начала отладки проверки такого типа исследуйте стек вызовов командами k, kb, kc, kd, kp, kP, kv (вывод стека вызовов).

В отладчике выполните !irql, чтобы вывести IRQL процессора целевого компьютера перед остановкой в отладчике. Например:

REM DRIVER_IRQL_NOT_LESS_OR_EQUAL diagnostic command.
0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)

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

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

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

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

Командами просмотра памяти исследуйте память по адресу из параметра 1.

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

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

Driver Verifier

Driver Verifier — средство реального времени для проверки поведения драйверов. Driver Verifier, например, контролирует использование ресурсов памяти, включая пулы памяти. Обнаружив ошибку выполнения кода драйвера, Driver Verifier намеренно создаёт исключение, чтобы соответствующий участок кода можно было подробно исследовать. Можно использовать встроенный в Windows диспетчер Driver Verifier, доступный на всех компьютерах с Windows.

Для анализа: Чтобы запустить Driver Verifier Manager, введите verifier в командной строке. Можно выбрать драйверы, которые необходимо проверять. Учитывайте, что проверка драйверов создаёт дополнительную нагрузку, поэтому проверяйте минимально необходимое число драйверов. Дополнительные сведения см. в документации Driver Verifier.


Нужно найти другой код? Найти другой код состояния или ошибки.