STOP 0x0000006B
Статья дополняет серию материалов, освещающих методы устранения проблем, приводящих к возникновению критической системной ошибки (BSOD). В материалах раздела рассматриваются ситуации, с которыми я сталкивался лично (в своей практике) и с которыми мне удалось разобраться. STOP-ошибка (STOP error), контроль дефекта (BugCheck) или в простонародье BSOD — фатальный системный сбой операционной системы Windows, являющийся причиной полного прекращения функционирования основных компонентов ядра операционной системы, влекущий за собой потерю динамических не сохраненных пользовательских данных и приводящий к появлению на экране монитора синего экрана смерти (BSOD). Числовое обозначение STOP-ошибки — идентификатор, характеризующий «природу» фатальной системной ошибки, используется при диагностике причины возникшей неполадки. В данной статье речь пойдет о сбое с идентификатором STOP 0000006B.
Теория
STOP 0x0000006B имеет собственную специфику и возникает на ранних стадиях загрузки операционной системы. В момент возникновения сбоя пользователь наблюдает на экране следующее сообщение об фатальной системной ошибке:
В общем случае формат ошибки следующий:
| Значение | Описание |
|---|---|
| 0xAAAAAAAA | Первый параметр. Статус завершения операции. |
| 0xBBBBBBBB | Второй параметр. Неофициально — указатель на этап загрузки/инициализации. |
| 0xCCCCCCCC | Третий параметр. Зарезервировано. |
| 0xDDDDDDDD | Четвертый параметр. Зарезервировано. |
Вообще загрузка операционной системы представляет собой достаточно сложную процедуру, которая состоит из множества стадий. На одной из начальных стадий загружается непосредственно ядро операционной системы, которое начинает проходить этапы инициализации/создания собственных структур и создания/запуска основных системных процессов, составляющих исполнительную подсистему ядра. Символическое имя ошибки PROCESS1_INITIALIZATION_FAILED (ОШИБКА_ИНИЦИАЛИЗАЦИИ_ПРОЦЕССА1), по идее разработчиков, должно сообщать нам о том, что ошибка STOP 0000006B возникает в ситуации невозможности загрузки/инициализации некоего критичного для загрузки операционной системы модуля. Что означает имя PROCESS1 , это процесс, загружаемый на стадии 1 или процесс с номером (идентификатором) 1? И если следовать подобной логике, то зададимся вопросом: процесс №1 это случайно не процесс System ? Ведь если брать во внимание высказывание главного разработчика Microsoft Раймонда Чена (Raymond Chen):
..в то время как процесс System имеет PID =4, то получается, что PROCESS1 и есть System ? Далее, опираясь на данные, которые можно получить из исходных кодов ядра, можно утверждать, что на определенном этапе стартует Диспетчер процессов . Диспетчер процессов предназначается для управления процессами в ОС и одной из его задач является загрузка и подготовка (экспорт) функций DLL. На одном из ранних этапов загрузки, при подготовке процесса System, происходит связывание функции основных системных DLL ( ntdll.dll и других). Как раз на этом этапе работы и может появляться рассматриваемая нами ошибка: либо по причине повреждения одной из критичных системных DLL, либо из-за разных версий взаимосвязанных DLL, либо по причине несоответствие подписи (подделки) кода некоторых DLL (защита которых реализована в специальном коде ядра операционной системы).
Второй параметр (BugCheckParameter2)
Все найденные мной точки возникновения критической ошибки STOP 0000006B располагаются в коде ядра операционной системы, размещенного в файле ntoskrnl.exe (либо другом ntkr*.exe в зависимости от аппаратной конфигурации станции). Давайте попробуем разобрать каждую из них подробнее.
Второй параметр =2
Первый найденный фрагмент находится внутри функции PsLocateSystemDlls и выглядит он следующим образом:
Функция PsLocateSystemDll , судя по всему, открывает последовательно все версии библиотеки ntdll.dll (в 64-разрядных системах их несколько) и получает оттуда точки входа функций KiUserApcDispatcher , KiUserExceptionDispatcher , KiUserCallbackDispatcher , RtlRaiseException и некоторых других. Адреса данных процедур необходимы ядру для выполнения основных задач (например, для генерации исключения для процессов пользовательского режима, доставки APC и обратных вызовов графического пользовательского интерфейса win32k.sys ).
Второй параметр =3
Следующий фрагмент был найден внутри функции PspLocateSystemDll :
то есть второй параметр 3! Функция PspLocateSystemDll выполняет инициализацию (заполнение) полей структуры размещаемых в памяти ядра системных библиотек.
Второй параметр =6
Очередной блок размещается внутри функции PspInitializeSystemDlls :
то есть второй параметр 6! Похоже функция PspInitializeSystemDlls производит заполнение (инициализацию) полей структуры экспортируемых библиотекой ntdll.dll функций. Она берет базовый адрес образа ( ImageBase ) каждой доступной в системе версии ntdll.dll и производит разрешение всех экспортируемых функций, а так же производит ряд других манипуляций.
Все параметры =0
И наконец внутри функции Phase1InitializationDiscard имеется такой вот код:
Судя по приведенному блоку кода, непосредственно перед заталкиванием в стек кода ошибки (значение 6Bh ), подготовки четырех параметров перед вызовом функции KeBugCheck не производится. Скорее всего как раз по этой причине, в ряде сбоев, на результирующем синем экране все параметры равны нулю . Как видно из кода, перед возбуждением исключения STOP 0000006B производится проверка результата выполнения функции PsInitSystem . Сама функция фактически представляет собой диспетчер процессов и предназначена для создания структуры процесса, вызывается ядром в ходе инициализации в фазах 0 и 1. Сам останов в этой точке возникает как реакция на нештатное завершение функции PsInitSystem , внутри которой к возникновению ошибки могут приводить следующие события:
- ошибочное завершение ObCreateObjectTypeEx (Создание объекта в пространстве имен);
- ошибочное завершение SeRegisterObjectTypeMandatoryPolicy (Регистрация политики доступа к объекту);
- равенство значений переменных PsPAffinityUpdateLock (?) = PspCidTable (указатель на таблицу описателей, хранящей созданные объекты процессов и нитей);
- ошибочное завершение ExInitializeResourceLite (инициализация ресурса исполняемой подсистемы);
- ошибочное завершение PspCreateProcess (Создание процесса);
- ошибочное завершение ObReferenceObjectByHandle (Поиск объекта по описателю);
- неправильное значение поля PsInitialSystemProcess +1ECh (глобальная переменная, указатель на структуру EPROCESS для процесса System);
- ошибочное завершение PsCreateSystemThread (создание потока, запускающийся в режиме ядра, возврат описателя процесса).
Понятное дело, что глубже весь этот кодовый треш никто не собирается тут анализировать, я просто оставил это здесь для того, что бы вы могли проникнуться неопределенностью вместе со мной 🙂
Первый параметр (BugCheckParameter1)
Помимо приведенных выше указателей на этапы (второй параметр BugCheckParameter2 ), в процессе исполнения кода которых произошел сбой, более свободно ориентироваться в причинах проблемы помогает первый параметр. Напомню, что применительно к сбою STOP 0000006B, первый входной параметр ( BugCheckParameter1 ) дает нам статус завершения операции:
| Значение первого параметра | Символическое имя | Описание |
|---|---|---|
| 0xC0000034 | STATUS_OBJECT_NAME_NOT_FOUND | Имя объекта не найдено. Проблема часто возникает после сбоя в процессе установки системных обновлений и сообщает о рассинхронизации системных библиотек/драйверов ранних стадий загрузки, в случае когда часть связанных функционалом модулей осталась предыдущих версии, а часть обновилась до последней актуальной. Причиной являются ошибки, возникающие в процессе установки обновления, например пользователь мог жестко прервать процесс, вручную перезагрузившись/отключив питание, не дождавшись завершения установки. |
| 0xC0000020 | STATUS_INVALID_FILE_FOR_SECTION | Исполняемый образ модуля, участвующего в начальных стадиях загрузки ОС, поврежден, то есть имеет проблемы с одной из секций (в таблице секций). Ошибка может возникать после сбоя в процессе установки обновлений/драйверов в систему, что ведет к повреждению файлов (образов). Так же, ошибка может быть вызвана проблемами загрузки уже существующих драйверов этапа загрузки (BOOT) по множеству причин: поврежденная файловая система, аппаратные проблемы с диском, контроллером. |
| 0xC000012F | STATUS_INVALID_IMAGE_NOT_MZ | Загрузочный образ не соответствует требуемому формату исполняемых файлов, то есть не содержит сигнатуру MZ в заголовке. Ошибка может возникать после неудачной попытки установки обновлений/драйверов в систему, что влечет за собой повреждение данных. Так же, ошибка может быть вызвана проблемами загрузки уже существующих драйверов этапа загрузки (BOOT) по множеству причин: поврежденная файловая система, аппаратные проблемы с диском, контроллером. |
| 0xC0000102 | STATUS_FILE_CORRUPT_ERROR | Загрузочный образ поврежден. Ошибка может возникать в следствии ошибки в процессе установки обновлений/драйверов в систему. Так же, ошибка может быть вызвана проблемами загрузки уже существующих драйверов этапа загрузки (BOOT) по множеству причин: поврежденная файловая система, аппаратные проблемы с диском, контроллером. |
| 0xC0000428 | STATUS_INVALID_IMAGE_HASH | Ошибка контрольной суммы: исполняемый файл, критичный для загрузки ОС, был заменен, его хэш не совпадает с содержащимся в каталоге (.cat). Значение хэша открытого файла отсутствует в записи системного каталога, и файл может быть подделан/поврежден. Обычно это случается при подмене файла ci.dll , ntdll.dll и ряда других. |
Общие причины
- Ошибка обнаружения критичного для загрузки ОС объекта/модуля (драйвера/библиотеки) по причинам: ошибки файловой системы, повреждение носителя информации, .
- Ошибка инициализации критичного для загрузки ОС объекта/модуля (драйвера/библиотеки): ошибки структуры файла (повреждение данных файла), ошибки файловой системы, повреждение носителя информации, . ;
- Рассинхронизация (несоответствие) версий ядра (файл(ы) ntoskrnl.exe , ntkrnlmp.exe , ntkrnlpa.exe , ntkrpamp.exe ) и библиотеки ntdll.dll (обычно после обновлений).
- Иные ошибки, попадающие под общую категорию ошибок инициализации фаз ядра.
Общие варианты решения
В данном заголовке приводятся общие методы восстановления, которые применяются для всех подвидов ошибки STOP 0x0000006B вне зависимости от параметров ошибки ( BugCheckParameter1 , BugCheckParameter2 , BugCheckParameter3 , BugCheckParameter4 ), которые указаны после кода STOP-ошибки в круглых скобках.
Код ошибки 0x0000006b windows 7
Описание проблемы
При загрузке, через некоторое время после появления заставки «Windows XP», компьютер сам уходит на перезагрузку.
После отключения автоматической перезагрузки выяснил, что выпадает такой «синий экран смерти»:
Указания на конкретный источник сбоя (файл, драйвер) не было. При выборе безопасного режима загрузки симптомы те же.
Нашел рекомендации по теме: «ошибка может быть вызвана наличием несовместимости внутри системы ввода-вывода» и «ошибка может быть связана с проблемами конфигурации диска».
Действия по устранению неисправности
1. Проверка диска
Диск проверил в программе MHDD32 на наличие поврежденных секторов. Несколько таких секторов нашлось и все они были переназначены (исправлены).
Загрузился со спасательного компакт-диска в Windows PE и проверил файловую систему NTFS:
Было найдено несколько ошибок, все они исправились. Каталоги и файлы были на своих местах и открывались нормально.
Попытка загрузки оказалась неудачной, симптомы те же.
2. Перенос системы на другой диск
Неисправный диск уже довольно старый и, чтобы не иметь проблем с ним в дальнейшем, решил перенести систему на другой диск. Установка заново в данном случае не подошла, т.к. имелось много специфичных программ.
На том же компьютере установлен второй диск, почти пустой, поэтому стал переносить систему на него.
Порядок действий был такой:
- Загрузился в Windows PE и скопировал все файлы.
- Выключил компьютер, отключил неисправный диск и поставил новый на его место.
- Запустил консоль восстановления с установочного диска Windows XP и прописал загрузочные сектора командами fixmbr , fixboot c: .
- Загрузился в DOS и сделал новый системный раздел активным.
Попытка загрузки оказалась неудачной, симптомы те же. Впрочем, и новых проблем после переноса не появилось.
3. Проверка системных файлов
В одной из статей по теме — STOP 0x0000006B Process1_Initialization_Failed — нашел подсказку:
Загрузившись в Windows PE убедился, что библиотеки ntdll.dll нет на месте. Скопировал недостающий файл из %SystemRoot%\system32\dllcache .
«Синий экран смерти» больше не появился, загрузка продолжилась нормально, но до конца так и не дошла. Появился голубой экран с небольшим логотипом Windows XP справа. Такое встречал раньше после лечения некоторых вирусов, прописавшихся в реестре для автозагрузки — значит, надо проверять реестр.
4. Проверка Winlogon
Снова загрузившись в Windows PE подключил куст SOFTWARE в ветку SW и проверил настройки Winlogon:
Файл C:\WINDOWS\system32\userinit.exe оказался на своем месте. По дате, размеру и содержимому совпал с таким же файлом из Windows PE, т.е. файл не подменен каким-нибудь вирусом.
Отключил autologon, чтобы посмотреть, что же происходит при загрузке — исправил реестр в том же месте:
Выяснилось, что окно ввода пароля отображается, но сразу после ввода правильного пароля появляется окно «Завершение сеанса».
Поиском по фразе «завершение сеанса сразу после входа» нашел возможную причину — несоответствие буквы системного диска. Проверка: подключил неисправный диск вместе с новым системным, загрузился с нового диска — успешно. Выяснил, какая буква назначена системному диску:
Все верно, этот диск ранее был подключен к компьютеру и разделу была назначена буква D: . Система же «привязана» к диску C: , в частности — указанный в реестре путь к userinit.exe неверен.
5. Изменение буквы системного диска
Статья по этому вопросу нашлась легко: Изменение буквы системного или загрузочного диска в Windows .
В реестре (на новом диске), в разделе [HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices] поменял местами буквы дисков:
- Переименовал параметр \DosDevices\C: в \DosDevices\C1
- Переименовал параметр \DosDevices\D: в \DosDevices\C:
- Переименовал параметр \DosDevices\C1 в \DosDevices\D:
После отключения неисправного диска система на новом диске успешно загрузилась.
Выводы
Восстановление загрузки компьютера иногда занимает много времени, большая часть которого уходит на поиск истинной причины неисправности. Внимательное исследование системы и реестра может показаться напрасным и неблагодарным занятием. Но и любимые многими радикальные варианты восстановления загрузки «переустановить систему» или «накатить сверху» не всегда подходят.

