Программирование драйверов Windows

       

Коды ошибочных ситуаций


При выводе системных сообщений о прекращении работы (известные как 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 &#8212 чтение, 1 &#8212 запись
4 Адрес инструкции, которая выполняла некорректное обращение

0x10 SPIN_LOCK_NOT_OWNED
Программный поток пытается освободить объект спин-блокировки, которым не владеет
Параметры Описание
1-4 Зарезервировано

0x19 MEMORY_MANAGEMENT
Структура "кучи" (heap &#8212 область, из которой программному коду динамически выделяется память) нарушена
Параметры Описание
1-4 Зарезервировано

0x1E KMODE_ESCEPTION_NOT_HANDLED
Программный код режима ядра вызвал исключение, для которого нет обработчика (в частности, его не предоставил сам программный код)
Параметры Описание
1 Код исключения (как правило, это значения, которые можно найти в файле winerror.h), в частности:

• 0xC0000005 &#8212 нарушение прав доступа (access violation): ошибочный указатель или запись в область памяти "только для чтения"

• 0xC000001D &#8212 ошибочная инструкция. Возможно, при выполнении вызова по указателю произошло неправильное декодирование инструкции, поскольку адрес был ошибочен. Возможно, что стек был испорчен, в результате чего не сохранился адрес возврата из текущей функции

• 0xC0000094 &#8212 целочисленное деление на ноль

• 0xC00000FD &#8212 переполнение стека, например, в результате многочисленных рекурсивных вызовов

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
Данная ошибка обычно бывает обусловлена сбоем в контроле четности в системной памяти &#8212 аппаратная проблема. (Данная ошибка может быть также вызвана обращением драйвера по несуществующему виртуальному адресу 0x8xxxxxxx в системном адресном пространстве.)
Параметры Описание
1 Виртуальный адрес, который вызвал сбой
2 Физический адрес, который вызвал сбой
3 Содержимое PSR (Process Status Register, регистра состояния процессора)
4 Faulting instruction register (FIR)
0x35 NO_MORE_IRP_STACK_LOCATIONS
Был создан IRP пакет, в котором оказалось недостаточно ячеек стека (stack locations) для того, чтобы передать его в IoCallDriver &#8212 для обработки нижними слоями драйверов
Параметры Описание
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 &#8212 чтение, 1 &#8212 запись
3 Адрес инструкции, из которой был осуществлен ошибочный доступ (если он известен)
4 Зарезервировано
0x51 REGISTRY_ERROR
Структура Системного Реестра нарушена, возможно, в процессе предыдущего системного сбоя. К сожалению, переустановка Windows самый вероятный способ преодоления этой проблемы. (Разумеется, если не выполнялось резервное копирование системных файлов.)
Параметры Описание
1-4 Зарезервировано
0x58 FT_DISK_INTERNAL_ERROR
Система была загружена из восстановленного основного раздела (primary partition). (Поддерево реестра говорит &#8212 все хорошо, но на самом деле это не так.)
Параметры Описание
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 &#8212 текущий процесс

Если тип блокировки 3 &#8212 виртуальный адрес
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
Ошибка при инициализации спин-блокировки. Условия возникновения данной ошибки четко не определены, однако ее природа всегда &#8212 программная
Параметры Описание
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 &#8212 чтение, 1 &#8212 запись
4 Адрес инструкции, обратившейся к области памяти
<


0xC6 DRIVER_CAUGHT_MODIFYING_FREED_POOL
Драйвер обращается к области пула памяти, которая освобождена
Параметры Описание
1 Указатель на область памяти, обращение к которой вызвало сбой
2 Код доступа при возникновении ошибки 0 &#8212 чтение, 1 &#8212 запись
3 0: в режиме ядра

1: в пользовательском режиме
4 4
0xC7 TIMER_OR_DPC_INVALID
Области памяти под объектами уровня ядра &#8212 таймером или DPC &#8212 были освобождены, хотя они еще находятся в очереди, ожидая активации
Параметры Описание
1 0: объект таймера

1: объект DPC

2: DPC процедура
2 Адрес объекта
3 Начало области, обращение к которой вызвало ошибку
4 Конец области, обращение к которой вызвало ошибку
0xCA PNP_FATAL_ERROR
РnР Менеджер обнаружил критическую ошибку, вероятно, в результате ошибки в функционировании РnР драйвера
Параметры Описание
Обнаружены двойники-PDO (объекты физического устройства) &#8212 отдельные фрагменты драйвера создали несколько 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 &#8212 чтение, 1 &#8212 запись
3 Адрес инструкции, из которой был осуществлен ошибочный доступ (если он известен)
4 Зарезервировано
0xCD PAGE_FAULT_BEYOND_END_OF_ALLOCATION
Система обратилась к памяти за пределами выделенной драйвером области (в некотором пуле)
Параметры Описание
1 Адрес, обращение по которому вызвало сбой
2 Код доступа при возникновении ошибки 0 &#8212 чтение, 1 &#8212 запись
3 Адрес инструкции, из которой был осуществлен ошибочный доступ (если он известен)
4 Зарезервировано
0xCE DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATION
Драйвер не отменил незавершенные (pending) операции перед своей выгрузкой
Параметры Описание
1 Адрес, обращение по которому вызвало сбой
2 Код доступа при возникновении ошибки 0 &#8212 чтение, 1 &#8212 запись
3 Адрес инструкции, из которой был осуществлен ошибочный доступ (если он известен)
4 Зарезервировано
0xD0 DRIVER_CORRUPTED_MMPOOL
Драйвер испортил системный пул памяти
Параметры Описание
1 Адрес, обращение по которому вызвало сбой
2 Уровень IRQL в момент обращения
3 Код доступа при возникновении ошибки 0 &#8212 чтение, 1 &#8212 запись
4 Адрес инструкции, из которой был осуществлен ошибочный доступ
0xD1 DRIVER_IRQL_NOT_LESS_OR_EQUAL
Драйвер пытался получить доступ к страничной памяти при работе на высоком уровне IRQL
Параметры Описание
1 Адрес, обращение по которому вызвало сбой
2 Уровень IRQL в момент обращения
3 Код доступа при возникновении ошибки 0 &#8212 чтение, 1 &#8212 запись
4 Адрес инструкции, из которой был осуществлен ошибочный доступ
<


0xD3 DRIVER_PORTION_MUST_BE_NONPAGED
Драйвер поступил некорректно, пометив сегмент своего кода или своих данных как размещаемый в страничной памяти
Параметры Описание
1 Адрес, обращение по которому вызвало сбой
2 Уровень IRQL в момент обращения
3 Код доступа при возникновении ошибки 0 &#8212 чтение, 1 &#8212 запись
4 Адрес инструкции, из которой был осуществлен ошибочный доступ
0xD4 SYSTEM_SCAN_AT_RAISED_IRQL_CAUGHT_IMPROPER_DRIVER_UNLOAD
Драйвер не отменил незавершенные (pending) операции перед своей выгрузкой
Параметры Описание
1 Адрес, обращение по которому вызвало сбой
2 Уровень IRQL в момент обращения
3 Код доступа при возникновении ошибки 0 &#8212 чтение, 1 &#8212 запись
4 Адрес инструкции, из которой был осуществлен ошибочный доступ
0xD5 DRIVER_PAGE_FAULT_IN_FREED_SPECIAL_POOL
Драйвер обратился к ранее освобожденной области памяти
Параметры Описание
1 Адрес, обращение по которому вызвало сбой
2 Код доступа при возникновении ошибки 0 &#8212 чтение, 1 &#8212 запись
3 Адрес инструкции, из которой был осуществлен ошибочный доступ (если он известен)
4 Зарезервировано
0xD6 DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION
Драйвер обратился к памяти за пределами выделенного пула памяти
Параметры Описание
1 Адрес, обращение по которому вызвало сбой
2 Код доступа при возникновении ошибки 0 &#8212 чтение, 1 &#8212 запись
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 &#8212 чтение, 1 &#8212 запись
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 была обнаружена в области памяти, которая не должна была содержать такую запись
Параметры Описание
1 Индикатор положения кода
2 Адрес записи рабочего процесса
3 Начало блока памяти
4 Конец блока памяти

Содержание раздела