При выводе системных сообщений о прекращении работы (известные как bug-checks), выводятся также коды, по которым можно определить, что побудило систему запаниковать. В зависимости от ошибки, система сообщает до 4-х дополнительных параметров, которые дают дополнительную информацию о возникшей проблеме. Хотя полный перечень кодов можно найти в заголовочном файле bug-codes.h, входящий в пакет DDK, расшифровки значений там не приводится. По этой причине ниже приводятся наиболее часто встречающиеся коды, основные причины данных ситуаций и расшифровка дополнительных параметров. Данному вопросу посвящена статья Microsoft Knowledge Base Q103059.
0x08
IRQL_NOT_DISPATCH_LEVEL
Был выполнен функцией (предназначенной для вызова с уровня IRQL, равного DISРATCH_LEVEL) из кода, работающего на более высоких уровнях, например DIRQL
Параметры
Описание
1-4
Зарезервировано
0x0A
IRQL_NOT_LESS_OR_EQUAL
Драйвер пытается получить доступ к странично организованной памяти при работе на уровне привилегий IRQL равном DISPATCH_LEVEL или выше, причем эта страница в момент обращения отсутствует в оперативной памяти (ситуация не может быть перехвачена обработчиком PAGE FAULT)
Параметры
Описание
1
Адрес в страничной памяти, обращение по которому вызвало сбой
2
Значение уровня IRQL в момент обращения
3
Тип доступа при этом обращении 0 — чтение, 1 — запись
4
Адрес инструкции, которая выполняла некорректное обращение
0x10
SPIN_LOCK_NOT_OWNED
Программный поток пытается освободить объект спин-блокировки, которым не владеет
Параметры
Описание
1-4
Зарезервировано
0x19
MEMORY_MANAGEMENT
Структура "кучи" (heap — область, из которой программному коду динамически выделяется память) нарушена
Параметры
Описание
1-4
Зарезервировано
0x1E
KMODE_ESCEPTION_NOT_HANDLED
Программный код режима ядра вызвал исключение, для которого нет обработчика (в частности, его не предоставил сам программный код)
Параметры
Описание
1
Код исключения (как правило, это значения, которые можно найти в файле winerror.h), в частности:
• 0xC0000005 — нарушение прав доступа (access violation): ошибочный указатель или запись в область памяти "только для чтения"
• 0xC000001D — ошибочная инструкция. Возможно, при выполнении вызова по указателю произошло неправильное декодирование инструкции, поскольку адрес был ошибочен. Возможно, что стек был испорчен, в результате чего не сохранился адрес возврата из текущей функции
• 0xC0000094 — целочисленное деление на ноль
• 0xC00000FD — переполнение стека, например, в результате многочисленных рекурсивных вызовов
2
Адрес инструкции, которая вызвала исключение
3
Первый параметр исключения
4
Второй параметр исключения
<
0x24
NTFS_FILE_SYSTEM
Выявлена проблема в ntfs.sys
Параметры
Описание
1
Исходный файл и номер строки
2
Адрес записи исключения (необязательно)
3
Адрес записи контекста (необязательно)
4
Адрес инструкции, где было вызвано исключение (необязательно)
0x2A
INCONSISTENT_IRP
Проблема в структуре IRP пакета: параметры конфликтуют. Возможно, в результате того, что указатель на IRP пакет ошибочно использовался в качестве указателя на элемент данных другого типа
Параметры
Описание
1
Адрес IRP пакета
2-4
Зарезервировано
0x2E
DATA_BUS_ERROR
Данная ошибка обычно бывает обусловлена сбоем в контроле четности в системной памяти — аппаратная проблема. (Данная ошибка может быть также вызвана обращением драйвера по несуществующему виртуальному адресу 0x8xxxxxxx в системном адресном пространстве.)
Параметры
Описание
1
Виртуальный адрес, который вызвал сбой
2
Физический адрес, который вызвал сбой
3
Содержимое PSR (Process Status Register, регистра состояния процессора)
4
Faulting instruction register (FIR)
0x35
NO_MORE_IRP_STACK_LOCATIONS
Был создан IRP пакет, в котором оказалось недостаточно ячеек стека (stack locations) для того, чтобы передать его в IoCallDriver — для обработки нижними слоями драйверов
Параметры
Описание
1
Адрес IRP пакета
2-4
Зарезервировано
0x36
DEVICE_REFERENCE_COUNT_NOT_ZERO
Был выполнен системный вызов IoDeleteDevice, в процессе которого обнаружилось, что число ссылок на объект устройства все еще не равно нулю, то есть операция удаления объекта некорректна
Параметры
Описание
1
Адрес объекта устройства (Device Object)
2-4
Зарезервировано
0x3F
NO_MORE_SYSTEM_PTES
Системная таблица страниц заполнена. Наиболее вероятная причина состоит в том, что драйвер не выполняет освобождение страниц памяти. Возможно, слишком мала таблица страниц (следует обратиться к методам ее увеличения)
Параметры
Описание
1-4
Зарезервировано
<
0x44
MULTIPLE_IRP_COMPLETE_REQUESTS
Был выполнен системный вызов IoCompleteRequest, в процессе которого обнаружилось, что относительно данного IRP пакета это действие уже выполнялось ранее
Параметры
Описание
1
Адрес IRP пакета
2-4
Зарезервировано
0x50
PAGE_FAULT_IN_NONPAGED_AREA
Ошибочное обращение к области памяти в системном адресном пространстве
Параметры
Описание
1
Адрес, обращение по которому вызвало сбой
2
Код доступа при возникновении ошибки 0 — чтение, 1 — запись
3
Адрес инструкции, из которой был осуществлен ошибочный доступ (если он известен)
4
Зарезервировано
0x51
REGISTRY_ERROR
Структура Системного Реестра нарушена, возможно, в процессе предыдущего системного сбоя. К сожалению, переустановка Windows самый вероятный способ преодоления этой проблемы. (Разумеется, если не выполнялось резервное копирование системных файлов.)
Параметры
Описание
1-4
Зарезервировано
0x58
FT_DISK_INTERNAL_ERROR
Система была загружена из восстановленного основного раздела (primary partition). (Поддерево реестра говорит — все хорошо, но на самом деле это не так.)
Параметры
Описание
1-4
Зарезервировано
0x76
PROCESS_HAS_LOCKED_PAGES
Работа завершена, но остались зафиксированные в памяти (locked) страницы. Возможно, драйвер пытался освободить заблокированные страницы после операции ввода/вывода, в частности, в процедуре Unload или обработчике запроса Shutdown, но это ему не удалось
Параметры
Описание
1
0
2
Адрес процесса
3
Число заблокированных страниц
4
0 или указатель на стек драйвера
0x77
KERNEL_STACK_INPAGE_ERROR
Запрошенная страница системного адресного пространства, размещенная в страничном файле, не может быть считана в оперативную память
Параметры
Описание
1
Код состояния или 0
2
Код состояния ввода/вывода или значение, найденное в стеке, где должна размещаться сигнатура
3
0 или номер страничного файла
4
Адрес сигнатуры в стеке или смещение в страничном файле
<
0x79
MISMATCHED_HAL
Версии ( revision level) программного кода ядра и программного кода HAL не согласуются. Это может происходить из-за неправильного использования ключей /kernel и /hal в файле BOOT.INI. (См. Microsoft Knowledge Base, Q103059.)
Параметры
Описание
1
1: Рассогласование редакций PRCB
2: Рассогласование версий сборки
3: Рассогласование Micro Channel
2
1: Редакция (release level) ntoskrnl.exe
2: Тип сборки (build type) ntoskrnl.exe
3: Тип компьютера, обнаруженный во время загрузки
3
1: Редакция hal.dll
2: Тип сборки hal.dll
3: Тип компьютера, поддерживаемый HAL
4
Зарезервировано
0x7A
KERNEL_DATA_INPAGE_ERROR
Запрошенная страница системного адресного пространства, размещенная в страничном файле, не может быть считана в оперативную память
Параметры
Описание
1
Тип блокировки (значения 1,2,3 или адрес записи в таблице страниц)
2
Код статуса операции ввода/вывода (во время которой произошла ошибка)
3
Если тип блокировки 1 или 2 — текущий процесс
Если тип блокировки 3 — виртуальный адрес
4
Виртуальный адрес, соответствующая которому страница не может быть считана в оперативную память
0x7B
INACCESSIBLE_BOOT_DEVICE
Операционная система Window NT потеряла доступ к системному разделу (system partition) во время запуска. Это может происходить из-за ошибок в драйвере, обслуживающем устройство, с которого должна осуществляться загрузка, из-за наличия программного обеспечения, несовместимого с NT, вирусов, неверного конфигурирования CD-ROM, ошибок в разбиении или незавершенного разбиения жесткого диска (partition table). (См. также Microsoft Knowledge Base Q103069, Q105026, Q115339, Q120744, Q124307, Q126423, Q131337, Q131712, Q136074, Q137860, Q153296, Q156168, Q161960.)
Параметры
Описание
1
Адрес объекта устройства, которое не может быть смонтировано
2-4
0
0x7F
UNEXPECTED_KERNEL_MODE_TRAP
Только для платформы INTEL. Процессор сгенерировал системное прерывание (trap), которое не может быть обработано ядром
Параметры
Описание
1
Код прерывания
2-4
Зарезервировано
<
0x81
SPIN_LOCK_INIT_FAILURE
Ошибка при инициализации спин-блокировки. Условия возникновения данной ошибки четко не определены, однако ее природа всегда — программная
Параметры
Описание
1-4
Зарезервировано
0x9F
DRIVER_POWER_STATE_FAILURE
Драйвер находится в ошибочном состоянии с точки зрения участия в схеме энергопотребления
Параметры
Описание
1
1: Освобождаемый драйверный объект имеет незавершенный запрос по схеме энергопотребления, который ожидает обработки
2: Драйверный объект завершил обработку системного IRP запроса по энергопотреблению, но не выполнил вызов PoStartNextPowerIrp
3: Драйвер не оформил должным образом IRP запрос как ожидающий обработки или как обработанный
100: Объекты устройств в узле (devnode) несостоятельны в своем использовании DO_POWER_PAGABLE
101: Родительский объект устройства обнаружил, что дочерний объект устройства не установил бит DO_POWER_PAGABLE
2
1: Указатель на объект устройства
2: Указатель на целевой объект устройства
3: Указатель на целевой объект устройства
100: Указатель на объект устройства в нестраничной памяти
101: Дочерний объект устройства (FDO)
3
1: Зарезервировано
2: Указатель на объект устройства
3: Указатель на объект устройства
100: Указатель на целевой объект устройства
101: Дочерний объект устройства (FDO)
4
1: Зарезервировано
2: Зарезервировано
3: IRP пакет
100: Указатель на уведомляемый объект устройства
101: Родительский объект устройства
0xBE
ATTEMPTED_WRITE_TO_READONLY_MEMORY
Драйвер пытается выполнить запись в область памяти, предназначенную только для чтения
Параметры
Описание
1
Виртуальный адрес, по которому производится попытка записи
2
Содержимое записи в таблице страниц
3-4
Зарезервировано
0xC1
SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION
Драйвер произвел запись в ошибочную секцию специального пула памяти
Параметры
Описание
Попытка освободить область памяти, которая не была ранее получена (выделена, allocated)
1
Адрес, к которому предпринята попытка "освободить" его
2
Зарезервировано
3
0
4
0x20
Попытка освободить область по ошибочному адресу
1
Адрес, к которому предпринята попытка "освободить"
2
Запрошенное число байт
3
Рассчитанное число байт
4
0x21, 0x22
Попытка освободить область по адресу, в то время как близлежащие байты на странице испорчены
1
Адрес, к которому предпринята попытка "освободить"
2
Адрес, где размещается испорченная область
3
Зарезервировано
4
0x23
Попытка освободить область по адресу, в то время как байты после данной выделенной области перезаписаны
1
Адрес, к которому предпринята попытка "освободить"
2
Адрес, где размещается испорченная область
3
Зарезервировано
4
0x24
Попытка получить область в пуле памяти при ненадлежащем уровне IRQL
1
Текущий уровень IRQL
2
Тип пула памяти
3
Число байт
4
0x30
Попытка освободить область в пуле памяти при ненадлежащем уровне IRQL
1
Текущий уровень IRQL
2
Тип пула памяти
3
Адрес, к которому предпринята попытка "освободить"
4
0x31
<
0xC2
BAD_POOL_CALLER
Текущий программный поток сделал ошибочный запрос к области памяти
Параметры
Описание
Заголовок пула памяти испорчен
1
0x01, 0x02 или 0x04
2
Указатель на заголовок пула
3
Первая часть содержимого заголовка пула
4
0
Попытка освободить область в пуле памяти, которая уже освобождена
1
0x06
2
Зарезервировано
3
Указатель на заголовок пула
4
Содержимое заголовка пула
Попытка освободить область в пуле памяти, которая уже освобождена
1
0x07
2
Зарезервировано
3
Указатель на заголовок пула
4
0
Попытка получить область в пуле памяти при ненадлежащем уровне IRQL
1
0x08
2
Текущий уровень IRQL
3
Тип пула памяти
4
Размер запрошенной области
Попытка освободить область в пуле памяти при ненадлежащем уровне IRQL
1
0x09
2
Текущий уровень IRQL
3
Тип пула памяти
4
Адрес пула
Попытка освободить область в пуле памяти уровня ядра по указателю, который имеет вид адреса пользовательского режима
1
0x40
2
Начальный адрес области
3
Начало системного адресного пространства
4
0
Попытка освободить область в пуле нестраничной памяти, которая не была ранее получена (выделена, allocated)
1
0x41
2
Начальный адрес области
3
Страничный блок физической памяти
4
Максимальный страничный блок физической памяти
Попытка освободить область в нуле страничной памяти, которая не была выделена
1
0x50
2
Начальный адрес области
3
Смещение (в страницах) от начала страничного пула
4
Размер области страничного пула в байтах
Попытка освободить область в пуле памяти по ошибочному адресу либо с разрушенным заголовком
1
0x99
2
Адрес, к которому предпринята попытка "освободить"
3
0
4
0
0xC5
DRIVER_CORRUPTED_EXPOOL
Драйвер, возможно, разрушил пул в системном адресном пространстве
Параметры
Описание
1
Указатель на область памяти, обращение к которой вызвало сбой
2
Уровень IRQL в момент обращения
3
Код доступа при возникновении ошибки 0 — чтение, 1 — запись
4
Адрес инструкции, обратившейся к области памяти
<
0xC6
DRIVER_CAUGHT_MODIFYING_FREED_POOL
Драйвер обращается к области пула памяти, которая освобождена
Параметры
Описание
1
Указатель на область памяти, обращение к которой вызвало сбой
2
Код доступа при возникновении ошибки 0 — чтение, 1 — запись
3
0: в режиме ядра
1: в пользовательском режиме
4
4
0xC7
TIMER_OR_DPC_INVALID
Области памяти под объектами уровня ядра — таймером или DPC — были освобождены, хотя они еще находятся в очереди, ожидая активации
Параметры
Описание
1
0: объект таймера
1: объект DPC
2: DPC процедура
2
Адрес объекта
3
Начало области, обращение к которой вызвало ошибку
4
Конец области, обращение к которой вызвало ошибку
0xCA
PNP_FATAL_ERROR
РnР Менеджер обнаружил критическую ошибку, вероятно, в результате ошибки в функционировании РnР драйвера
Параметры
Описание
Обнаружены двойники-PDO (объекты физического устройства) — отдельные фрагменты драйвера создали несколько PDO объектов с одинаковыми идентификатором устройства
1
0x01
2
Адрес вновь созданного PDO объекта
3
Адрес ранее созданного PDO объекта, который теперь "повторен"
4
Зарезервировано
Ошибка в объекте физического устройства. Программный поток, которых запросил объект PDO, не выполнил инициализацию объектов PDO или FDO
1
0x02, 0x03
2
Адрес подразумеваемого PDO объекта
3
Зарезервировано
4
Зарезервировано
Ошибка в идентификаторе (ID). Модуль ядра, который выполнял перечисление (enumeration) возвратил идентификатор, который содержит ошибочные символы или неверно завершен. Идентификаторы должны содержать только символы ASCII 0x20..0x2B и 0x2D..0x7F
1
0x04
2
Адрес PDO объекта с установленным DO_DELETE_PENDING
3
Адрес буфера, содержащего ID
4
1: DeviceID
2: UniqueID
3: Аппаратные идентификаторы
4: Совместимые идентификаторы
Объект PDO был освобожден (то есть Менеджер объектов уменьшил число ссылок на него до нуля), но сам объект еще участвует в дереве объектов устройств (devnode tree). Как правило, это означает, что драйвер не добавил ссылку (соответствующим системным вызовом) в тот момент, когда возвратил PDO объект в ответ на поступивший соответствующий IRP запрос
1
0x05
2
Адрес PDO объекта
3
Зарезервировано
4
Зарезервировано
<
0xCB
DRIVER_LEFT_LOCKED_PAGES_IN_PROCESS
Драйверу не удалось выполнить освобождение зафиксированных в оперативной памяти (locked) страниц после операции ввода/вывода
Параметры
Описание
1
Адрес инициатора (в драйвере) фиксации данных страниц
2
Инициатор вызова инициатора фиксации
3
Указатель на MDL список, содержащий зафиксированные в оперативной памяти страницы
4
Указатель на имя "виновного" драйвера (в формате Unicode)
0xCC
PAGE_FAULT_IN_FREED_SPECIAL_POOL
Система обратилась к ранее освобожденной области памяти
Параметры
Описание
1
Адрес, обращение к которому, вызвало сбой
2
Код доступа при возникновении ошибки 0 — чтение, 1 — запись
3
Адрес инструкции, из которой был осуществлен ошибочный доступ (если он известен)
4
Зарезервировано
0xCD
PAGE_FAULT_BEYOND_END_OF_ALLOCATION
Система обратилась к памяти за пределами выделенной драйвером области (в некотором пуле)
Параметры
Описание
1
Адрес, обращение по которому вызвало сбой
2
Код доступа при возникновении ошибки 0 — чтение, 1 — запись
3
Адрес инструкции, из которой был осуществлен ошибочный доступ (если он известен)
Драйвер не отменил незавершенные (pending) операции перед своей выгрузкой
Параметры
Описание
1
Адрес, обращение по которому вызвало сбой
2
Уровень IRQL в момент обращения
3
Код доступа при возникновении ошибки 0 — чтение, 1 — запись
4
Адрес инструкции, из которой был осуществлен ошибочный доступ
0xD5
DRIVER_PAGE_FAULT_IN_FREED_SPECIAL_POOL
Драйвер обратился к ранее освобожденной области памяти
Параметры
Описание
1
Адрес, обращение по которому вызвало сбой
2
Код доступа при возникновении ошибки 0 — чтение, 1 — запись
3
Адрес инструкции, из которой был осуществлен ошибочный доступ (если он известен)
4
Зарезервировано
0xD6
DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION
Драйвер обратился к памяти за пределами выделенного пула памяти
Параметры
Описание
1
Адрес, обращение по которому вызвало сбой
2
Код доступа при возникновении ошибки 0 — чтение, 1 — запись
3
Адрес инструкции, из которой был осуществлен ошибочный доступ (если он известен)
4
Зарезервировано
0xD7
DRIVER_UNMAPPING_INVALID_VIEW
Драйвер пытается получить физический адрес для виртуального, который не существует
Параметры
Описание
1
Виртуальный адрес
2
0: Система не является терминальным сервером
1: Система является терминальным сервером
3
0
4
0
0xD8
DRIVER_USED_EXCESSIVE_PTES
Не осталось свободных записей в системной таблице страниц виртуальной памяти
Параметры
Описание
1
Указатель на имя "виновного" драйвера (Unicode) либо 0
2
Число записей в системной таблице страниц, используемых "виновным" драйвером (если первый параметр не равен 0)
3
Общее количество свободных записей в системной таблице страниц
4
Общее количество записей в системной таблице страниц
<
0xDB
DRIVER_CORRUPTED_SYSPTES
Была сделана попытка обращения к памяти при ненадлежащем уровне IQRL, вероятно, из-за разрушения записей в системных страничных таблицах виртуальной памяти
Параметры
Описание
1
Адрес, обращение по которому вызвало сбой
2
Уровень IRQL в момент обращения
3
Код доступа при возникновении ошибки 0 — чтение, 1 — запись
4
Адрес инструкции, из которой был осуществлен ошибочный доступ
0xDC
DRIVER_INVALID_STACK_ACCESS
Драйвер пытался получить доступ к пространству стека, которое находится ниже указателя границы стека (stack pointer) текущего рабочего потока
Параметры
Описание
1-4
Зарезервировано
0xDE
POOL_CORRUPTED_IN_FILE_AREA
Драйвер разрушил пул памяти, используемый для хранения страниц, предназначенных для работы с диском
Параметры
Описание
1-4
Зарезервировано
0xE1
WORKER_THREAD_RETURNED_AT_BAD_IRQL
Рабочий поток, созданный драйвером, завершился и вернул управление на IRQL уровне равном DISPATCH_LEVEL или выше
Параметры
Описание
1
Адрес рабочей процедуры
2
Уровень IRQL (должен быть 0)
3
Параметры рабочей единицы
4
Адрес рабочей единицы
0xE2
MANUALLY_INITIATED_CRASH
Пользователь сознательно вызвал сбой из отладчика либо с клавиатуры
Параметры
Описание
1-4
Зарезервировано
0xE3
RESOURCE_NOT_OWNED
Программный поток пытается освободить ресурс, который ему не принадлежит
Параметры
Описание
1
Адрес объекта ресурса
2
Адрес объекта потока
3
Адрес таблицы владельца (если существует)
4
Зарезервировано
0xE4
WORKER_INVALID
Запись рабочего процесса подмножества Executive была обнаружена в области памяти, которая не должна была содержать такую запись