STOP 0x00000033

Метки:  , ,

Критическая ошибка STOP 00000033 имеет символическое имя UNEXPECTED_INITIALIZATION_CALL (НЕПРЕДУСМОТРЕННЫЙ_СИСТЕМНЫЙ_ВЫЗОВ). По задумке разработчиков, данный системный сбой должен сообщать нам о некоем "неожиданном" системном вызове, который по идее, не должен был быть осуществлен в той ситуации (контекст работы, глобальные флаги и переменные), в которой он произошел. Как всегда у Microsoft с классификацией ошибок черт ногу сломит, и порой довольно сложно понять причину только лишь по символическому имени :) Иначе говоря, если вы видите останов STOP 00000033, то возникла ситуация, в которой в контексте (процесса/потока) ядра, был выполнен вызов внутренней функции одного из этапов инициализации и в этот самый момент ядро находилось в фазе, в которой оно в данный момент не должно было находиться. В общем то, как вы сможете увидеть далее в статье, символическое имя не лишено смысла, поскольку в некоторым алгоритмическим нюансам сложно бывает придумать внятное описание.

Входные параметры ошибки

Нижеследующие параметры можно наблюдать среди диагностической информации синего экрана смерти, либо в соответствующих полях дампа памяти.

Параметр Описание
1 Номер фазы инициализации ядра (Phase0/Phase1), в которой возник останов.
2 Не имеет значения (всегда 0)
3 Не имеет значения (всегда 0)
4 Не имеет значения (всегда 0)

Низкий уровень

Все оказалось достаточно тривиально. Код ошибки 33h был обнаружен при анализе исходного кода ядра (файл ntoskrnl.exe). Сбой STOP 00000033, судя по всему, возникает на ранних стадиях фаз инициализации ядра (фазы 0,1), и сейчас мы перечислим причины, а точнее места в коде, где мне посчастливилось встретить данную ошибку.

Причина №1:

В процедуре инициализации Диспетчера процессов/потоков (Process and Thread Manager):

по причине некорректного параметра InitializationPhase, содержащего номер текущей фазы инициализации ядра: значения, отличные от 0 и 1 считаются недопустимыми, поскольку существует всего две основных фазы: 0 и 1.

Причина №2

При попытке создания ядром системного потока обслуживания DPC:

на выходе функции KiStartDpcThread, при неудачном завершении функции создания системного потока обслуживания DPC.

Причина №3

В процедуре инициализации Диспетчера PnP (PnP Manager):

по причине некорректного значения параметра InitializationPhase, содержащего номер текущей фазы инициализации ядра: значения, отличные от 0 и 1 считаются недопустимыми, поскольку существует всего две основных фазы: 0 и 1.

Причина №4

В процедуре инициализации Библиотеки отладки (Debugger Library):

по причине некорректного значения параметра InitializationPhase.

Причина №5

В процедуре инициализации Подсистемы безопасности (Security Reference Monitor):

Причина №6

В процедуре инициализации Подсистемы верификации (Verification Library):

Причина №7

В процедуре инициализации Исполнительной подсистемы (Executive Support Library):

Судя по привиденным фрагментам кода, в последние три параметра (BugCheckParameter2, BugCheckParameter3, BugCheckParameter4) всегда записываются нули (0), в общем то, абсолютно нивелируя какую-либо смысловую нагрузку. В первом параметре (BugCheckParameter1) размещается номер текущей фазы инициализации ядра.

Прототип:

Общие варианты решения

Судя по тому, что на значение внутренней переменной ядра могут повлиять очень ограниченное количество факторов, могу предположить, что будут актуальны следующие причины и варианты решения:

  • Аппаратные проблемы: повреждается содержимое страницы памяти, содержащей переменную InitializationPhase. Можно порекомендовать проверить оперативную память (иногда и прочее оборудование);
  • Программные проблемы: сборка операционной системы содержит нестандартное (кастомное) ядро, вероятно содержащее какие-либо ошибки, либо мы имеем дело с модификацией кода ядра (руткит); Можно порекомендовать использовать официальную MSDN-версию системы или проверить систему на целостность кода;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *