Программирование драйверов 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 Второй параметр исключения
<


Начало    Вперед