Черный экран смерти

Метки:  , , , , , , , , , , ,

Проблемы различных этапов загрузки операционной системы Windows довольно широко распространены и определенно достойны собственного раздела. Данное явление нашло своё выражение в большом количестве разнообразных ошибок, возникающих при выполнении кода из секторов MBR/PBR, модулей Bootmgr, Winload, Ntoskrnl, SMSS, Csrss, Winlogon, Userinit и некоторых других, одним словом, всех тех компонентов, которые участвуют в процессе загрузки операционной системы. Не так давно в своей практике я очередной раз столкнулся с одной из подобных проблем и решил написать себе небольшую шпаргалку, поскольку всегда хотел как-то систематизировать подобного рода ошибки, и с чего то надо было определенно начинать. Из всего множества сбоев, возникающих на этапе загрузки Windows, хотелось бы отдельно отметить ошибки, называемые пользователями Черным экраном смерти.

Черный экран смерти - группа ошибок различных этапов загрузки операционной системы, характеризуемая прекращением (подвисанием) процесса загрузки на стадиях, не выполняющих вывода какой-либо (текстовой/графической) информации на экран, визуально наблюдаемая в виде черного экрана, на котором иногда можно видеть графический (мышь) либо аппаратный (текстовый) курсор.

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

Поэтому, возьму на себя смелость классифицировать несколько разновидностей сбоя:

  1. Черный экран, возникающий на этапе загрузки/функционирования Master Boot Record (MBR) и Partition Boot Record (PBR). Курсор не отображается. При нажатии на клавиши слышен звуковой сигнал.
  2. Черный экран, возникающий до отображения экрана приветствия (логотип/строка Запуск Windows) Windows (Bootscreen). Отображается аппаратный курсор.
  3. Черный экран, возникающий после отображения экрана приветствия (логотип/строка Запуск Windows) Windows (Bootscreen). Отображается графический курсор мыши.

Из описанного выше становится ясно, что вид у этого черного экрана смерти может различаться, вот пример экрана с отображаемым на нем работоспособным курсором мыши:

black screen of death

После появления черного экрана смерти загрузка останавливается. В зависимости от разновидности черного экрана, либо мы сразу не наблюдаем более никакой активности, либо некоторое время можно наблюдать активность жесткого диска (светодиод), однако на этом всё и заканчивается. Зачастую, операционная система теряет способность загрузки в каком бы то ни было из доступных режимов: нормальном и безопасном, что иногда существенно усложняет поиск источника проблемы. В своё время во мне зрела идея каким то образом систематизировать ошибки, возникающие на различных этапах загрузки системы, результатом которой явилась первая статья серии про ошибки Bootmgr, однако на данный момент, начиная с этапа Winload и далее стадии не описаны, поэтому приходится публиковать такие вот местечковые исследования реальных сбоев. Причиной черного экрана смерти является не исследованный пока что мною досконально программный цикл, возникающий на различных стадиях по следующим глобальным причинам:

  • Повреждение кода/данных секторов MBR/PBR;
  • Повреждение системных кустов реестра;
  • Невозможность загрузки критических драйверов этапа загрузки;
  • Невозможность запуска критически необходимых сервисов/служб;

Почему подобные описанным выше ошибки вообще существуют? Из-за программно/аппаратных сбоев либо ошибках в коде системных компонентов, работающих с критическими дисковыми структурами, а так же несовершенства кода некоторых модулей, участвующих в процессе загрузки ОС Windows. Скорее всего возникает некий программный цикл, который не может завершиться ("разомкнуться"), по причине повреждения кода либо отсутствия (или некорректной работы) кода проверки возникновения проблем в загрузке кустов реестра, драйверов/сервисов. Конечно же, в очередной раз не перестаю удивляться терпению разработчиков, уже на протяжении 20 с лишним лет упорно игнорирующих хорошо известные общественности проблемы. Имеются подозрения, что система обработки ошибок в различных модулях содержит недоработки, не предусматривающие информирование пользователя о проблеме на более-менее приемлемом уровне, вместо этого происходит останов и отказ в загрузке модулей следующего этапа, результатом чего является черный экран смерти, который (при штатном выполнении) должен являться всего-лишь переходным этапом от одной стадии к другой. Мы наблюдаем его всегда, но при нормальном течении процесса загрузки он кратковременен и мы попросту не фокусируем на нем свое внимание.

Теория

Для того, что бы проводить дальнейшие изыскания, необходимо понимать этапы загрузки операционной системы Windows. Так как статья в альфа-версии, и я пока подробно не разбирался с логикой работы этапа да и самого кода ntoskrnl.exe, поэтому ограничусь лишь предположениями на основании тех данных, которые удалось собрать на текущий момент, а в последствии, по мере получения какой-либо конкретной информации, будем видоизменять материал. Всё зависит от того, на каком этапе мы наблюдаем черный экран смерти. Если мы наблюдаем черный экран смерти с графическим курсором мыши, то обычно мы видим его после экрана приветствия (Windows Bootsplash, Bootscreen), показывающего нам анимированный логотип Windows (и строку "Запуск Windows"). На основании этого могу предположить, что мы находимся на этапе загрузки ntoskrnl.exe, в так называемой фазе 1. Состояние черного экрана смерти наступает на этом этапе по следующим причинам:

  • Проблема с драйвером одной из системных шин. К примеру, довольно часто случаются проблемы с драйверами контроллеров IDE/SATA. По ряду причин драйвер не может загрузиться: он либо отключен, либо вовсе отсутствует или испорчен.
  • Повреждение куста реестра (DEFAULT, SAM, SECURITY, SOFTWARE, одним словом любого куста кроме SYSTEM, поскольку последний отрабатывается ранее на этапе Winload).

Но, ведь появление черного экрана смерти вовсе не означает, что именно на этапе функционирования ntoskrnl.exe код входит в бесконечный цикл. Как говорилось выше, активность диска видна визуально по состоянию светодиода, поэтому, вероятно ntoskrnl.exe продолжает выполнять свои фазы, и, возможно, передает управления следующему этапу, чего мы просто уже визуально не наблюдаем. Быть может даже мы доходим до этапа Winlogon.exe, который по каким-то причинам (описанные выше причины) не запускает модуль logonui.exe, призванный выводить экран с приглашением к авторизации (для входа в систему нажмите клавиши Ctrl+Alt+Del). После этапа ntoskrnl.exe и до Winlogon.exe имеются еще этапы SMSS/Csrss/Wininit, и цикл может возникнуть на любом из них, но для более детальной информации уже необходимо отлаживать этапы загрузки.
Поэтому, первое, что необходимо делать в случае с черным экраном смерти, это по возможности попытаться получить как можно больше информации о деталях сбоя. В этом нам поможет системный Журнал событий (EventLog), потому как подсистема логгирования на этапе ntoskrnl.exe уже функционирует и информацию собирает.

Причина 1: повреждение куста реестра

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

Разработчики из Microsoft предоставляют техническим специалистам превосходное средство под названием DaRT (Diagnostics and Recovery Toolset), которое является наследником легендарного ERD Commander. У Microsoft есть продукт под названием Microsoft Desktop Optimization Pack (MDOP), представляющий собой набор инструментов для решения разнообразных административных задач, который распространяется по программе Software Assurance. Одним из компонентов MDOP является Microsoft Diagnostic and Recovery Toolset (DaRT). Не берусь утверждать что это лучшее средство восстановление из имеющихся в природе, для подобных выводов у меня слишком мало информации, однако мне оно определенно понравилось, поскольку имеет возможность (при загрузке с внешнего носителя) подцеплять различные функциональные части системы с основного системного носителя (HDD/SSD) и работать с ними как с нативными, сохраняя иллюзию работы в диагностируемой операционной системе как в "живой".
Поскольку самостоятельно система не загружается ни в одном из режимов, мы вынуждены воспользоваться MS DaRT на внешнем носителе и загрузиться с него. После окончания загрузки и прохождения первичных этапов настройки, мы попадаем в окно Параметры восстановления системы, выбираем пункт Microsoft Diagnostics and Recovery Toolset. В открывшемся окне запускаем оснастку Управление компьютером, после запуска которой, в левом фрейме, выбираем пункт дерева Просмотр событий и далее выделяем пункт Журналы Windows, а затем щелкаем по System. Как Вы уже могли заметить, это стандартная, знакомая практически всем, оснастка, при помощи которой мы традиционной подключаемся к системным логам.

Если вдруг по каким-то причинам Вы занимаетесь восстановлением при помощи какого-либо другого инструментария (не MS DaRT) и не можете работать с оснасткой Управление компьютером, то просто открывайте системный диск, на котором располагается поврежденная система, переходите по пути C:\Windows\System32\winevt\Logs и ищите файл с именем system.evtx. Его Вы сможете переписать на внешний носитель (флешка) и открыть в любой рабочей системе двойным щелчком, либо принудительно через средство EventVwr, для последующего изучения.

Теперь перед нашими глазами списки событий, откручиваем их на дату сбоя, и начинаем просматривать, последовательно двигаясь по списку событий от более ранних к более поздним (вверх). Сейчас увидим, что же интересного мне удалось найти применительно конкретно к моему случаю:
Первое событие, которое меня заинтересовало, являлось первопричиной всей той витиеватой цепочки событий, которая и привела к черному экрану смерти. Причина заключалась в действии пользователя, о чем красноречиво говорило событие с кодом 6008, "Предыдущее завершение работы системы было неожиданным":

завершение было неожиданным

То есть пользователь принудительно выключил станцию, не дождавшись завершения работы в штатном режиме. Почему? Нам предстоит выяснить далее. Затем удалось обнаружить последствия действий нашего "предприимчивого" пользователя, событие с кодом 5, источником Kernel-General, "куст реестра (файл) \SystemRoot\System32\Config\SOFTWARE был поврежден и восстановлен.":

куст SOFTWARE поврежден

Далее было обнаружено событие с кодом 7023, источником Service Control Manager и описанием "Не удается найти описание для идентификатора события 7023 из источника Service Control Manager. Вызывающий данное событие компонент не установлен на этом локальном компьютере или поврежден. Установите или восстановите компонент на локальном компьютере. Если событие возникло на другом компьютере, возможно, потребуется сохранить отображаемые сведения вместе с событием. К событию были добавлены следующие сведения: Установщик модулей Windows %%16405. Отсутствует специальный ресурс языкового стандарта для нужного сообщения":

компонент поврежден

А вот и ответ на вопрос "Почему?", видите в тексте описания фразу "Установщик модулей Windows %%16405"? Сдается мне, что в процессе завершения работы начали устанавливаться обновления, что значительно этот самый процесс и замедлило. Как выяснилось позже, пользователь очень спешил, поэтому с его стороны и было принято столь необдуманное решение по принудительному отключению питания. Я обычно не злобствую, но к слову сказать, "лечатся" такие товарищи достаточно легко: начиная от уведомления департамента безопасности и заканчивая констатацией потери всей/части информации, находящейся в профиле пользователя.
Далее по списку событий у нас располагаются множественные ошибки, указывающие на невозможность запуска различных служб и драйверов. Вот один из примеров:

в нем описывается событие с кодом 7026, источник Service Control Manager: "Сбой при загрузке драйвера(ов) перезагрузки или запуска системы: CProCtrl, ctxusbm, discache, eeCtrl, MpFilter, spldr, Wanarpv6".
На первый взгляд событие как событие, говорящее о невозможности загрузки нескольких критически-важных драйверов, но во мне оно родило некоторое количество вопросов. Давайте, для начала, посмотрим на то, что это за драйвера:

Наименование Описание

CProCtrl

Драйвер контроля загрузки CSP/HSM. Драйвер из комплекта Крипто-Про.

ctxusbm

Citrix ICA Client USB Monitor Driver. Драйвер из комплекта Citrix Receiver.

discache

System Indexer/Cache Driver (Драйвер системного индексатора/кеша). Выполняется в системе как драйвер режима ядра с именем "System Attribute Cache". Системный драйвер.

eeCtrl

Symantec Eraser Control Driver. Драйвер из комплекта Symantec Endpoint Agent.

MpFilter

Microsoft Malware Protection Driver. Драйвер из комплекта Microsoft Security Essentials.

spldr

Security Processor Loader Driver. Системный драйвер.

Wanarpv6

Remote Access IPv6 ARP Driver. Системный драйвер.

Меня озадачил драйвер spldr, поскольку он должен загружаться функцией OslLoadImage еще на стадии работы модуля Winload.exe, так как некоторые критические драйвера (в том числе и spldr) загружаются именно на данном этапе. Почему же тогда событие об ошибках загрузки этого драйвера попадает в логи от источника Service Control Manager (Диспетчер управления службами, SCM), ведь SCM стартует значительно позже, на этапе работы модуля Wininit? Могу предположить, что код функции OslLoadImage, который начинает загружать драйвера раннего этапа, в последствии становится либо частью SCM, либо просто все события по загрузке всех драйверов системы (не важно кем и на каком этапе) имеют в логах источник SCM. Но это, пока что, всего-лишь мое предположение.

Решение 1: восстановление реестра

Как Вы помните, одно из событий у нас указывает на повреждение куста реестра SOFTWARE. Однако, в описании к событию сказано, что код загрузки системы попытался самостоятельно восстановить куст, о чем нас и уведомляет следующая формулировка: "куст реестра (файл) \SystemRoot\System32\Config\SOFTWARE был поврежден и восстановлен". Поверили? :) А я нет! Вот не верю и всё тут! Возник сразу резонный вопрос: что значит восстановлен? Что, вот так вот прямо взят файл SOFTWARE, размещающийся в каталоге бэкапа \Windows\System32\config\regback\ и переписан в \Windows\System32\config\?. А есть вообще подобный код в средствах восстановления или мы имеем дело с иной логикой, которая просто проверяет файл реестра на ошибки в структуре? Как вы понимаете, это абсолютно разные процедуры. Без углубленного анализа кода тут не обойтись, а он пока не произведен, поэтому алгоритм работы восстановления пока для нас остается загадкой.
Поэтому, давайте самостоятельно произведен восстановление в ручном режиме. Для этого можно использовать как встроенную консоль восстановления, так и загрузочный носитель со средствами DaRT. Можно выполнить полное восстановление всех кустов реестра, благо сама процедура описана в статье о восстановлении реестра из консоли восстановления. В данном решении я сделал исключение, и дабы сделать эксперимент максимально чистым, я не стал копировать все файлы, а скопировал только лишь файл SOFTWARE:

xcopy d:\windows\system32\config\regback\SOFTWARE d:\windows\system32\config /h /r /y

..где d: - диск, на котором у нас установлена поврежденная система.
После окончания процесса копирования файла закрываем консоль. Для этого можно нажать на значок закрытия окна, либо в командной строке набрать команду exit и вернуться в меню выбора параметров восстановления. Потом нажимаем кнопку Перезагрузка для инициирования процесса перезагрузки станции. После перезагрузки станции я увидел долгожданный графический экран приветствия, система благополучно загрузилась.

Причина 2: отказ в запуске служб

Решение находится на стадии доработки. Оформление не завершено!

На момент создания раздела у меня "на руках" не было деталей подобного рода сбоев, поэтому раздел будет переработан по мере возникновения похожего случая. Обычно причиной является либо полный отказ, либо задержка запуска одной из служб. Последний похожий инцидент у меня был связан со случаем, когда неквалифицированный специалист произвел восстановление системы до последней контрольной точки прямо сеансе, в котором агентом SCCM были установлены (и ждали применения при перезагрузке) обновления. После завершения восстановления станция ушла в перезагрузку, которая ожидаемо завершилась черным экраном смерти.

Решение 2: восстановление запуска служб

Всё так же использовалось средство восстановления на внешнем носителе. Перво-наперво были проанализированы логи, по которым, насколько я помню, стало очевидно, что имеются проблемы со следующими службами: Узел агента SMS, Удаленное управление Configuration Manager, Агент последовательности задач Configuration Manager и Центр обновления Windows. Для каждой из этих служб были изучены соответствующие ошибки в журнале событий и по каждой ошибке были предприняты действия по устранению причин и восстановлению запуска службы, после чего станция ожила. К сожалению, более подробную информацию уже и не вспомню.

Причина 3: сторонняя оболочка (проводник)

Иногда встречаются ситуации, когда к черному экрану смерти приводит некорректная работа зарегистрированной (обычно вирусом) сторонней пользовательской оболочки, которая может содержать ошибки в коде. На одной из последних стадий загрузки операционной системы модуль Winlogon.exe запускает модуль под названием Userinit.exe, который, в свою очередь, запускает скрипты стадии загрузки, а затем вызывает оболочку пользовательского интерфейса explorer.exe, более известную нам под именем Проводник. Как загрузчик скриптов, так и саму оболочку можно подменить, поскольку в системе предусмотрен механизм конфигурирования альтернативной оболочки и загрузчика посредством специализированных ключей реестра. Понятное дело, что время от времени этой возможностью вовсю пользуются вирусописатели. В случае подмены сторонняя оболочка, получая управление, либо не выполняет своих функций из-за ошибки в коде, либо вовсе изначально не спроектирована для поддержки функциональных возможностей, присущих стандартному проводнику, результатом чего может являться появление черного экрана смерти.

Решение 3: восстановление оболочки

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

  • После появления черного экрана смерти попробовать несколько раз нажать комбинацию клавиш Ctrl + Alt + Del. Если нажатие прошло и высветился список, то запустить Диспетчер задач. В открывшемся окне выбираем вкладку Приложения, в нижней части окна жмем кнопку Новая задача. В открывшемся небольшом окошке, в строке ввода набираем explorer и нажимаем Ok. Таким образом мы собственноручно запустим проводник;
  • Если предыдущий метод на сработал, то потребуется загрузиться с внешнего носителя, содержащего средства восстановления (DaRT или любой другой);

Поскольку настройка оболочки хранится в системном реестре, нам потребуется запустить редактор реестра Regedit.exe, при помощи которого мы и будем производить необходимые изменения. В реестре за настройку пользовательской оболочки отвечает следующий ключ:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
проверяем параметр Shell (сама оболочка), который должен содержать значение explorer.exe.
проверяем параметр Userinit (программы, загружаемые процессом Winlogon на этапе входа пользователя в систему), который должен содержать значение C:\Windows\system32\userinit.exe,. * Не забывайте знак запятой в конце.
Как Вы уже поняли, восстановление работоспособности, в данном случае, сводится к проверке наличия сторонних записей в приведенных выше ключах реестра и (в случае необходимости) восстановлении указанных значений по умолчанию. После внесения изменений в ключи реестра, потребуется выполнить перезагрузку операционной системы.

Общий алгоритм действий

При возникновении черного экрана смерти нужно загрузиться с удобного Вам средства восстановления и:

  1. Проверить, не заменены ли оболочка/загрузчик. При необходимости восстановить, иначе переходим к следующему пункту;
  2. Изучить логи раздела Система на предмет событий с уровнем ошибка, затем проанализировать их. На основании собранной информации (приоритет уменьшается по списку):
    • В случае нахождения событий, сообщающих о повреждении кустов реестра: вручную восстановить необходимые (либо все) кусты реестра;
    • В случае нахождения событий, сообщающих о сбоях запуска критически важных сервисов/служб: при помощи оснастки Службы (services.msc) проверить факт запуска служб, при необходимости восстановить параметры запуска (например, на Автозапуск). В случае проблем с зависимостями проблемной службы, проверить службы, от которых зависит данная. В случае совсем уж серьезных проблем выполнять восстановление параметров напрямую через реестр;
    • В случае нахождения событий, сообщающих о сбоях запуска критически важных драйверов: проверить опции запуска драйверов в реестре, проверить наличие и доступность соответствующих файлов драйверов на системном носителе и при выявлении повреждений попытаться восстановить оригиналы с рабочей системы идентичной версии;

То есть, в случае необходимости, приоритетно восстанавливаем реестр. Если с реестром все в порядке, а есть проблемы со службами (сервисами), то пытаемся восстановить их запуск. Если имеются проблемы с драйверами, то пытаемся выяснить, почему они не запускаются и исправить ситуацию.

  • Поделиться:

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

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