- Windows failed to start — Система не загружается
- Windows failed to start a recent — ошибка загрузки
- 1] Установите правильный порядок загрузки
- 2] Проверить оборудование
- 3] Автоматическое восстановление при Загрузке
- 4] Восстановить BCD
- Firmware update failures in Windows 8.1
- Summary
- More information
- How to tell whether your PC installs firmware updates
- Transient vs. non-transient failure codes
- Transient failures
- Non-transient failures
- Windows Update power checks
- Ошибки Bootmgr
- Об ошибках в модулях загрузки
- Некоторые особенности ошибок
- BmFatalErrorEx
- Стадия BIOS
- Стадия MBR
- Стадия PBR (VBR)
- Стадия Boot Manager (BOOTMGR)
- Инициализация
- Открытие BCD
- Загрузка пункта и передача управления OSLoader
- Возникающие ошибки
- Выводы
Windows failed to start — Система не загружается
Windows может перестать работать, фактически, не запуститься из-за любых изменений оборудования и программного обеспечения. Эти изменения мешают обычному процессу загрузки. В этом посте мы постараемся решить проблему с помощью советов по устранению неполадок.
Windows failed to start a recent — ошибка загрузки
Обычно проблема связана с отсутствующим загрузчиком или подключенным оборудованием. Вам нужно будет сделать загрузочный USB-накопитель для загрузки в режиме расширенного восстановления. Поскольку вы не можете получить доступ к своему компьютеру, вы можете использовать другой компьютер с Windows 10 для создания загрузочного диска.
У вас есть следующие варианты:
- Проверить оборудование
- Восстановление системы
- Восстановить BCD
- Установите правильный порядок загрузки
Вам также понадобится учетная запись администратора в одном из процессов, поэтому обязательно запомните это.
1] Установите правильный порядок загрузки
При запуске Windows загрузчик ищет набор файлов, откуда он может начать загрузку Windows. Если он не найдет нужные файлы, Windows не загрузится. Вы должны убедиться, что загрузочным диском по умолчанию является ваш SSD или HDD.
Если он не установлен по умолчанию и у вас подключен USB-накопитель, Windows зависнет. Поэтому загрузитесь в BIOS с помощью клавиши DEL или F2 при включении компьютера и измените порядок, Как изменить порядок загрузки.
2] Проверить оборудование
Если проблемы с порядком загрузки нет, вы можете проверить, есть ли проблема с жестким диском. Первым делом вам следует проверить, может ли BIOS его обнаружить. Если это так, то вам нужно проверить это на другом компьютере. Если жесткий диск или твердотельный накопитель не удается распознать, у вас проблема с оборудованием.
Если вы столкнулись с этим на ноутбуке, вам нужно вручную вынуть его и проверить. Если это аннулирует вашу гарантию. пожалуйста, отнесите его в сервисный центр, и не открывайте его самостоятельно.
3] Автоматическое восстановление при Загрузке
Windows Advanced Recovery предлагает функцию автоматического восстановления (восстановление при загрузке), которая сканирует системные файлы, параметры реестра, параметры конфигурации и многое другое и пытается решить проблему самостоятельно, автоматически. Обычно он запускается автоматически, если процесс перезагрузки прерывается несколько раз.
Вы можете использовать загрузочный USB-накопитель для загрузки в Recovery.
Вам нужно будет выбрать Устранение неполадок> Дополнительные параметры> Автоматическое восстановление. При появлении запроса введите данные учетной записи и позвольте процессу выполнить свою работу.
4] Восстановить BCD
BCD или данные конфигурации загрузки содержат информацию, которая позволяет загрузчику находить нужные файлы для загрузки Windows. Если BCD поврежден или не содержит информации, Windows зависает. Выполните следующие действия, чтобы восстановить BCD:
- Загрузите компьютер в расширенный режим восстановления
- Запустить командную строку, доступную в разделе «Дополнительные параметры».
- Чтобы восстановить BCD или файл данных конфигурации загрузки, используйте команду –bootrec /rebuildbcd
- Он просканирует систему и позволит вам выбрать ОС, которые вы хотите добавить в BCD.
Если он не находит загрузочный раздел, вы можете использовать bootrec /scanos, чтобы найти список раздела, на котором установлена ОС. Затем используйте команду bcdboot, чтобы добавить его в список. После того, как путь установлен, перезагрузите компьютер, и ошибка больше не должна возникать.
Вы также можете попробовать исправить MBR или основную загрузочную запись, выполнив команды в командной строке bootrec/fixMbr and bootrec /fixboot.
Firmware update failures in Windows 8.1
This article describes how and why firmware updates occasionally fail in a Windows 8.1 environment.
Original product version: В Windows 8.1
Original KB number: В 2909710
Summary
Computers that are running Windows may use Windows Update to update their firmware. Specifically, these computers use Windows driver packages to install firmware updates. After a firmware driver package has been installed, Windows hands off the firmware updates to UEFI system firmware for installation during your computer’s next restart. UEFI system firmware is provided by your computer manufacturer and is separate from Windows. Windows itself doesn’t install firmware updates but instead hands off firmware updates to the UEFI system firmware for your computer.
More information
Firmware updates are provided by your computer manufacturer to help improve the stability and performance of your PC. Sometimes firmware updates may not be installed correctly. UEFI system firmware uses a set of return codes to report back to Windows about the success or failure of a firmware installation attempt. These return codes are available in Device Manager and are also reported by Windows Update. In some cases, Windows Update may try to reinstall firmware updates after the initial attempt, depending on the type of failure.
This article describes how to determine whether your PC is using Windows Update and UEFI to install firmware updates. It also describes what each return code means. Finally, it summarizes the Windows Update notifications that you can expect to receive after a failed firmware installation attempt.
How to tell whether your PC installs firmware updates
Windows PCs that use Windows Update to install firmware updates will have «System Firmware Update» entries in the View your update history for Windows page of Windows Update.
To view your update history in Windows Update:
- On the Start screen, type update history, and then click View your update history for Windows.
- In the search box, enter Windows Update, and then select View update history. You can also view the error codes that are returned for a failed firmware update by selecting the failed System Firmware Update entry in your update history. The update history page in Windows Update includes a status column, and this indicates which updates failed to install successfully. You can select the entry and open it to see details about the installation, including the installation status and error details.
A computer that uses UEFI to update firmware may also have entries for updatable firmware components in Device Manager. To determine whether your computer uses UEFI to update firmware, follow these steps:
From the computer’s desktop, open File Manager.
In File Manager, right-click This PC, and then click Properties.
Click Device Manager.
If your computer is using UEFI to manage firmware, there will be a Firmware group under the PC root of Device Manager. Expand the Firmware group to see each updatable firmware component.
Firmware that wasn’t installed successfully will have a «banged out» (!) entry under the Firmware group.
You can right-click a failed firmware component and then click Properties to see the error codes that were returned. By combining the preceding two checks, you can determine whether your computer is updating firmware through both Windows Update and UEFI.
Firmware entries in Device Manager are not guaranteed to be returned from UEFI. In some cases, Windows drivers may install firmware that then is listed under the Firmware group. If you are uncertain about whether your PC is using UEFI, contact your PC manufacturer. You can also view the Hardware IDs details for a particular firmware resource in its properties. UEFI firmware resources are prepended by UEFI\ in the device hardware ID.
Transient vs. non-transient failure codes
Windows separates UEFI firmware update failures into two categories: transient and non-transient.
Transient failures
Transient failures occur because of temporary conditions such as insufficient battery power or lack of system resources. Windows may try to reinstall firmware updates that fail under these circumstances.
For example, your PC may require a certain level of battery power (for example, 25 percent) to install firmware updates. Firmware updates that have failed to install because of low battery power are always retried after the next computer restart. If your PC doesn’t have the required battery power available, firmware updates may fail to install. However, Windows will continue to try to install the firmware update at each restart. This battery level check is enforced by both Windows and your computer’s UEFI system firmware to make sure that your PC doesn’t lose power during a critical firmware update operation.
Windows and UEFI ignore available A/C power and only check the available battery level of your PC. If your battery does not charge beyond the required level, you may not be able to install future firmware updates. If the battery for your PC does not charge, contact your PC manufacturer.
Windows will make a total of three installation attempts after the next three restarts for other transient failures such as a lack of system resources or other reasons that are returned by your UEFI system firmware. If your firmware update fails to install on the third and final restart, Windows won’t try to install the firmware update again, and it will be marked as failed in both Device Manager and Windows Update history. The update won’t be tried again until your PC manufacturer releases a new update that replaces the failed update.
Non-transient failures
Non-transient firmware update failures are caused by a condition that can’t be repaired. Windows doesn’t try to reinstall firmware updates that fail because of non-transient conditions.
Installation of the update won’t be retried until your PC manufacturer releases a new update the replaces the failed update.
Windows retries firmware updates as follows.
Error condition | Number of retries |
---|---|
Transient | 3 |
Transient: power condition | No limit |
Non-transient | 0 |
Windows Update power checks
Because your computer may require a certain level of battery power (for example 25 percent) to install firmware updates, Windows Update monitors your battery power level to prevent your computer from needlessly failing a firmware update during an interactive install.
During an interactive install, a user manually checks for updates from the Windows Update control panel or the Settings app and then manually starts the update process. An automatic background install occurs in the background, staging the new updates that are available for your PC and notifying you that your PC requires a restart. Most of your updates are installed automatically in the background.
Windows Update will verify that your PC has at least 40-percent battery power before it starts firmware updates during an interactive install. During an automatic background install, Windows Update doesn’t check for the 40-percent battery power threshold. This behavior occurs because Windows won’t try to restart your PC until you have at least 40-percent battery power. Additionally, it will automatically retry installation of failed firmware updates when the battery charges to 40 percent or more.
Ошибки Bootmgr
Многие технические специалисты в своей работе сталкиваются с ошибками, возникающими на различных стадиях загрузки операционной системы Windows. Случился и в моем практике не так давно достаточно нетипичный сбой этапа загрузки, в котором мне, к моему огромному недовольству, затруднительно было сходу разобраться. Смысл проблемы заключался в том, что вышедшая из строя по достаточно нетривиальной цепочке причин, система Windows 7 (Профессиональная) отказывалась грузиться во всех, без исключения, режимах загрузки. Процесс загрузки просто «вис» на черном экране на этапе, следующем за графическим экраном заставки (splash screen). Код работы с видеоадаптером устанавливал разрешение в родное для монитора, а далее загрузка просто-напросто останавливалась, при этом отчетливо был виден графический курсор мыши, сам манипулятор функционировал. Я так полагаю, что у профессионалов подобное явление обозначается термином черный экран смерти (Black Screen of Death, KSOD), наиболее распространенными причинами которого являются: повреждение различных частей реестра, невозможность запуска критически важных служб и кривая установка разрешений на системные каталоги (все эти вещи зачастую вызваны обновлениями). Большая просьба не путать термин «черный экран смерти» с общеизвестным синим экраном смерти (Blue Screen of Death, BSOD). Как я уже упоминал, загрузка в безопасном режиме останавливалась на том же самом месте, то есть я вообще никак, ни в каком из режимов не мог загрузить ОС!! С грустью вспомнил обо всех хваленых средствах диагностики загрузки вида xbootmgr и прочих трассировщиках, которые оказывались абсолютно бесполезными в подобной ситуации. Потом пришла мысль, что хорошо было бы подключиться каким-нибудь отладчиком удаленно и просто протрассировать код до ошибки, но подобным опытом я пока не обладаю, а проблему надо было решать в сжатые сроки.
Однако, сама ситуация навела меня на размышления о том, что на дворе уже далеко ведь не первая версия операционной системы, да и эра технологий, так сказать, в полном разгаре :), а пользователи Windows продолжают наблюдать «неопределенные состояния», в которых операционная система не в силах хотя бы на простом уровне вычислить причину сбоя и сообщить об этом оператору!! С другой стороны для меня лично очевидно, насколько сложно создать код, который отслеживал бы все возможные внутренние состояния. Как же быть? Ведь я совершенно не могу понять, на каком именно этапе загрузка остановилась. Поизучав материалы, которые имеются в Сети по теме этапов загрузки, понял, что большинстве своем они не дают представления о характерах и причинах возникновения ошибок, а содержат лишь общие рекомендации по устранению. Поэтому у меня возникло желание углубиться в материал и сделать себе небольшую карту ошибок этапов загрузки, да и для дальнейшего изучения он был бы неплохой отправной точкой. Так родилась идея начать серию статей по описанию стадий загрузки Windows с уклоном в сторону диагностики ошибок. Затем захотелось посмотреть на проблему ошибок загрузки Windows не с точки зрения последовательности «описание — снимок экрана — а попробуйте во это решение», а именно со стороны изучения всех возможных причины возникновения той или иной ошибки непосредственно с изучением кода. Да и вообще, мне лично всегда было интересно погрузиться до глубин кода, заглянуть «в файл» и прикоснуться к граням алгоритмов загрузки Windows, понять больше, познакомиться с ошибками, которые никогда не встречались мне на практике и не были освещены в информационном пространстве Сети, понять происходящее «изнутри».
Поэтому я начал сокращать материал и решил сильно не вдаваться в подробности логики работы процедур/функций, а сфокусироваться именно на причинах ошибок, возникающих на различных стадиях исполнения кода. Весь материал я вынужден разбить на несколько частей, что бы не городить огромную стену теста, при чтении которой можно запросто заснуть. В этой, первой статье цикла мы будем исследовать ошибки Bootmgr, то есть одного из начальных модулей в цепи загрузки операционной системы Windows.
Как Вы уже поняли, данный материал в доработанной своем состоянии (к которому еще только предстоит дойти) призван помочь нам в дальнейшей практике и существенно облегчить диагностику проблем, возникающих на стадиях загрузки операционной системы, помочь более точно отследить логику ошибки, вместо того, чтобы с досады бросить решение и взяться за модернизацию, переустановку и прочие разные нехорошие вещи.
Да просто потому, что под рукой в нужный момент оказалась именно эта конфигурация. Алгоритм с использованием GPT быть может опишу в будущем, но сразу могу сказать, что уже даже на достаточно ранних этапах код, в большинстве своем, идентичен.
Об ошибках в модулях загрузки
Непосредственно перед тем как начать описание процесса загрузки и возникающих в процессе проблем, я бы хотел сделать небольшое отступление на тему ошибок Bootmgr, Winload и ntoskrnl, возникающих в ходе работы кода одноименных модулей. Многие критичные процедуры кода, реагируя на те или иные условия, генерируют числовые идентификаторы ошибок и возвращают их через произвольный регистр (чаще всего это eax ). Поскольку регистр, хранящий код ошибки, часто сохраняется либо умышленно не используется, ошибки в «сквозном» режиме передаются на верхний уровень иерархии вложенных подпрограмм, то есть просто при множественном возврате из них по команде ret . Таким образом ошибки регистрируются до тех пор, пока в коде не встречается логика обработки ошибки. Подобных участков обработки ошибок Bootmgr у нас несколько:
- Блок кода в процедуре BmMain , выдающий ошибку BlInitializeLibrary failed . ;
- Блок кода в процедуре BmMain , выдающий ошибку BlResourceFindMessage failed . ;
- Блок кода в процедуре BmMain , выдающий ошибку BlXmiInitialize failed . ;
- Процедура BmFatalErrorEx , которая является глобальным обработчиком ошибок на все остальные случаи;
- Процедура BlStatusError , которая вызывается из процедур MmHapReportHeapCorruption и BmFatalErrorEx в аварийной ситуации, проверяет наличие активного отладчика и случае наличия выдает специальную ошибку *** Fatal error . ;
Некоторые обработчики незамедлительно выдают сообщение о возникшей проблеме на консоль, а вот глобальный кейс-обработчик BmFatalErrorEx содержит более витиеватую логику обработки поступившего кода с выдачей уже развернутого текста ошибки. Другая особенность обработки ошибок Bootmgr/Winload заключается в том, что, насколько я смог разобраться, менее значимые ошибки замещаются более значимыми. А это означает, что если ошибка возникла в какой-то процедуре как реакция на определенное условие, то другая ошибка, возникшая позже и являющаяся более приоритетной, может в процессе дальнейшего исполнения кода просто «затереть» первичную ошибку. Из этого следует, что на консоли пользователь видит лишь один результирующий статус, имеющий самый высокий приоритет, хотя, вероятно, имелся и менее приоритетный статус (или серия статусов), который был потерян.
Все ошибки, возникающие на этапах загрузки операционной системы Windows можно подразделить на две общие категории:
- Ошибка NT_ERROR (NTSTATUS). Хорошо знакомый разработчикам статус, использующийся для передачи результатов ошибок между разными компонентами ОС. Используется в ошибках Bootmgr/Winload, то есть сразу начиная с этапа Bootmgr.
- Ошибка BSOD BugCheck (STOP). Фатальная ошибка, хорошо знакомый всем нам синий экран смерти. Может возникать на поздних стадиях загрузки ОС, после того как подгружается логика обработки критических ошибок на этапе Ntoskrnl.
NTSTATUS частично описан в заголовочном файле ntstatus.h комплекта Windows WDK. Значения подразделяются на четыре категории:
- NT_SUCCESS (0 − 0x3FFFFFFF);
- NT_INFORMATION (0x40000000 − 0x7FFFFFFF);
- NT_WARNING (0x80000000 − 0xBFFFFFFF);
- NT_ERROR (0xC0000000 — 0xFFFFFFFF);
По коду можно заметить, что неотрицательные значения соответствуют «успешному» завершению подпрограммы, отрицательные — «ошибочному». Числовой статус обычно ассоциирован с текстовым описателем, который призван олицетворять понятный человеку, осмысленный текст ошибки (в теории, а на практике иногда весь мозг сломаешь в догадках). Полный список статусов NTSTATUS достаточно внушителен, но весь он нам не потребуется, поскольку далеко не все ошибки из этого списка мы можем наблюдать на изучаемых этапах загрузки Windows, а это, согласитесь, существенно облегчает нам работу 🙂
Некоторые особенности ошибок
У ошибок в коде Bottmgr я выделил несколько особенностей:
- Еще одна особенность ошибок Bootmgr заключается в присутствии в коде неких «перекодирующих процедур», которые на входе проверяют значения некоторых ошибок NT_ERROR (диапазон 0xC0000000-0xFFFFFFFF) и, в зависимости от неких условий, преобразуют их в в предупреждения NT_WARNING (диапазон 0x80000000-0xBFFFFFFF). По этой причине некоторые ошибки пользователь вообще никогда не будет наблюдать на результирующем ошибочном экране, выводимом Bootmgr. Однако, я этот факт в своей работе не учитывал и описывал все без исключения ошибки.
- Следующий немаловажный момент в логике обработки ошибок заключается вот в чем: Информационные сообщения об ошибках BootMgr/Winload, выводимые кодом модулей, вовсе не обязательно будут однозначно соответствовать уникальному значению NTSTATUS! Вот вам простой пример, наверняка многие видели на практике вот такую вот ошибку:
А вот теперь та же самая ошибка, но с другим состоянием:
Описание идентично, а коды разные!! Из этого следует, что одно текстовое сообщение об ошибке (сведения) может группировать сразу несколько родственных состояний (кодов ошибок). Если я нигде не ошибся, то для меня это, честно говоря, открытие! Получается, что разработчики решили особо не заморачиваться и не описывать в коде реакции на все возможные варианты ошибок, а ограничиться лишь конечным списком пояснений с выдачей конкретизирующего кода состояния (по которому и можно определить детали). И удивляться тут нечему, ведь данный факт опирается на бессмысленность генерации в коде реакции на все возможные состояния, поскольку код Bootmgr генерирует более 70 (!) уникальных ошибок, при том что многие неявны и по ним очень сложно работать, да и многие коды ошибок Bootmgr действительно одинаковы на разные события. Не думаю, что разработчик будет сидеть и корпеть над уникальным описанием для каждой ошибки.
Учитывая все вышеописанные обстоятельства, мы примем на вооружение следующую логику:
Собственно, этот постулат и будет у нас основополагающим, мы будем изучать ошибки Bootmgr, а не их описания. Это позволит нам более детально локализовать, конкретизировать проблему, то есть сделать её более определенной в причине собственного возникновения.
BmFatalErrorEx
Хотелось бы еще отдельно упомянуть основную процедуру для вывода сообщений об ошибках на консоль, именуемую BmFatalErrorEx . Она вызывается примерно из 9 мест на протяжении всего кода Bootmgr. Сама процедура предназначена для группировки ошибок по классам и вывода ограниченного количества сообщений об ошибках. Я думаю практически всем специалистам приведенный ниже шаблон достаточно хорошо знаком:
Указанная самой последней строка «Сведения» может содержать одну из нижеследующих текстовых строк:
Русское обозначение | Английское обозначение |
---|---|
An error occured while attempting to read the boot configuration data file | |
An error occured while attempting to load the boot application | |
Ошибка при перечислении глобальных параметров | An error occured while enumerating global parameters |
Произошла непредвиденная ошибка | An unexpected error has occured |
Возникла неожиданная ошибка ввода-вывода | An unexpected I/O error has occured |
Не удается загрузить выбранную запись, поскольку приложение отсутствует или повреждено. | The selected entry could not be loaded because the application is missing or corrupt |
Файл данных конфигурации загрузки Windows не содержит действительного элемента списка загрузки ОС. | The Windows Boot onfiguration Data file does not contain a valid OS entry |
Введена неверная группа цифр. Исправьте выделенную группу. | Invalid group of digits entered. Please correct the highlighted group |
Сбой меню загрузки, поскольку требуемое устройство недоступно. | The boot selection failed because a required device is inaccessible. |
Не удается завершить действие, поскольку не получен ключ программы шифрования диска BitLocker, необходимый для снятия блокировки с тома. | The action could not be completed because the BitLocker Drive Encryption key required to unlock the volume could not be obtained |
Не удается создать диск в памяти, поскольку недостаточно памяти | Ramdisk device creation failed due to insufficient memory |
Требуемая информация отсутствует в файле данных конфигурации загрузки Windows | The Windows Boot Configuration Data file is missing required information |
Попытка загрузить 64-разрядное приложение, однако данный процессор не совместим с 64-разрядным режимом. | Attempting to load a 64-bit application, however the CPU is not compatible with 64-bit mode |
Возможно, файл поврежден. Указанная в его заголовке контрольная сумма не совпадает с вычисленной. | The file possibly corrupt. Its header checksum does not match the computed checksum |
Не удается проверить цифровую подпись этого файла. | Windows cannot verify the digital signature for this file |
В хранилище данных конфигурации загрузки обнаружена недопустимая конфигурация элемента объекта. | The configuration for an element within the object is invalid in the boot configuration data store |
The boot manager experienced an error parsing element within BCD object. | |
The boot manager experienced error due to an invalid entry in the BCD store. | |
Файл хранилища данных конфигурации загрузки Windows содержит неправильные данные | The boot configuration file is invalid. |
No valid entries found in the boot configuration data file |
Как можно заметить, не все ошибки имеют свою локализацию на русскому языке. Не знаю с чем это может быть связано, однако имеются две вероятных причины: я неправильно распарсил ресурсы главного модуля bootmgr.exe , либо пропустил какие-то записи в файле локализации bootmgr.exe.mui .
Ну и наконец то давайте уже переходит к анализу ошибок Bootmgr. Хотелось бы заметить, что вступление у нас было бы неполным, если бы сразу перешли к этапу Bootmgr и не осветили, хотя бы даже и поверхностно, стадии, которые ему предшествуют и относятся к процессу работы кода BIOS, MBR, PBR (VBR), ибо без них сюжетная линия повествования не была бы цельной.
Стадия BIOS
На IBM PC/AT-совместимой машине с классическим BIOS, код прошивки (firmware) на финальной стадии своего функционирования, по очереди перебирает устройства загрузки, заданные пользователем через меню настройки (Setup), и пытается считать с каждого из этих устройств загрузочный сектор. Сектор этот носит название Главной Загрузочной Записи (Master Boot Record, MBR). После загрузки с носителя загрузочного сектора, код BIOS проверяет наличие в последних двух байтах сигнатуры AA55h , и если сигнатура не обнаружена, то будет предпринята попытка перехода к другому устройству, если это устройство последнее в списке загрузки, то выдается одна из следующих ошибок (зависит от вендора оборудования):
Ошибка |
|
Описание | BIOS не нашел Master Boot Record (MBR)! А записан ли он вообще? Необходимо удостовериться: |
- Правильно ли в BIOS задан загрузочный носитель? Не редки ситуации, когда ошибочно задается (или выбирается автоматически) другой, не имеющий системной разметки.
- Заданный физический носитель размечен и на него определенно производилась установка операционной системы?
bootrec /fixmbr
Как Вы видите, с точки зрения ошибок финальная стадия BIOS достаточно проста, поскольку характеризуется всего-лишь невозможность нахождения кода MBR, а именно 512-байтного физического сектора с предопределенной сигнатурой AA55h .
Стадия MBR
Если коду BIOS удалось успешно считать первый физический сектор носителя в память и успешно проверить его сигнатуру, то он передает считанным данным управление. Начинает выполняться непосредственно сам код MBR. Поскольку в этом миниатюрном участке кода сложно выделить данные, то мы просто будем говорить о блоке кода и данных, который содержит всего три ошибки, детектируемые на стадии выполнения кода главной загрузочной записи. ASCII-строки ошибок располагаются во второй половине 512-байтного сектора и выглядят следующим образом:
Если обратите внимание, в данном случае со смещения 160 начинаются те самые ошибки. Ну а теперь давайте более детально остановимся на каждой из них:
Ошибка | Invalid partition table |
Описание | код MBR не нашел в таблице разделов активный раздел (маркер 80h), то есть раздел, с которого должна происходить дальнейшая загрузка. Повреждена таблица разделов, то есть она не содержит активного раздела для загрузки. |
Решение | Для начала попробуем автоматические средства. Загрузимся в консоль восстановления и выполним команду: bootrec /fixmbr |
Ошибка | Error loading operating system |
Описание | Код не смог считать сектор с носителя при помощи функций прерывания int 13h. Ошибку возвращает код BIOS, который взаимодействует с портами контроллера. Проблема в BIOS? Это слишком старая материнская плата, у которой имеются проблемы с обработкой int 13h? 🙂 Или физическая проблема контроллера/носителя? |
Решение |
|
Ошибка | Missing operating system |
Описание | Считали загрузочный сектор раздела (PBR), однако у него сигнатура оказалась не AA55h. То есть, считается, что на месте сектора записан мусор. По какой то причине поврежден PBR. Скорее всего с самим разделом всё нормально, то он существует и назначен активным, а вот с первым сектором раздела что-то не так. |
Решение | Требуется восстановить PBR. Для этого загружается в консоль восстановления и выполняем команду: bootrec /fixmbr bootrec /fixboot |
Стадия PBR (VBR)
MBR нашел раздел, помеченный активным, загрузил с него первый физический сектор NTFS-раздела (партиции, тома) PBR (VBR), проверил его сигнатуру и передал ему управление. Как мы помним, основной целью кода PBR является загрузка Менеджера загрузки Windows (Windows Boot Manager, BootMgr) и передача ему управления.
Ошибка | A disk read error occurred |
Описание | Универсальная комплексная ошибка, используемая кодом PBR сразу на нескольких стадиях: |
- код PBR в попытке проверить самого себя (!) сравнивает начальные байты сектора с ASCII-значением NTFS (сигнатура, которая предваряет Boot Parameter Block, BPB)
- код не смог определить наличие расширений int 13h
- код пытается получить расширенный блок параметров диска при помощи int 13h
- код сравнивает значение из BPB, расположенного в начале сектора со значением, возвращенным функцией 48h прерывания int 13h.
bootrec /fixboot
Ошибка | BOOTMGR is missing |
Описание | Код PBR не смог найти файл BOOTMGR на специализированном разделе. |
Решение | Идем по списку: |
- Сперва проверить фактическое наличие зарезервированного (скрытого) раздела, его целостность;
- В случае присутствия раздела проверить (при помощи diskpart), помечен ли раздел как активный (active);
- Проверить наличие на разделе необходимой файловой структуры, включающей и актуальный для данной системы файл Bootmgr.exe . Для PCAT/MBR-загрузки: неплохо было бы переписать Bootmgr.exe с системного диска из \Windows\Boot\PCAT\Bootmgr.exe .
Ошибка | BOOTMGR is compressed |
Описание | Код PBR определил, что что-то не так с разделом, на котором располагается Bootmgr. |
Решение | Снять атрибут сжатия с раздела, на котором находится Bootmgr. |
Ошибка | An operating system wasn’t found |
Описание | Очередная комплексная ошибка дополнительного кода PBR, возникает в следующих случаях: |
- Для PCAT/MBR- загрузки: код не смог найти активный раздел, с которого будет производиться загрузка файла Bootmgr. Нет раздела, помеченного как активный (active).
- Код на может найти файл Bootmgr в корне несмонтированного системного раздела.
- Загрузиться в среду восстановления и из командной строки при помощи diskpart назначить активный раздел;
- Загрузиться в любую среду WinPE и скопировать в корень несмонтированного системного раздела файл Bootmgr. Файл должен быть той же версии. Обычно он содержится на разделе с установленной системой по пути %SystemRoot%\Boot\PCAT .
Стадия Boot Manager (BOOTMGR)
Вот тут то у нас и начинается самое интересное, собственно то, ради чего данная статья и задумывалась. Код PBR(VBR) находит зарезервированный загрузочный раздел (System Reserved), находит в корне раздела файл Bootmgr и загружает его в память, затем передает ему управление. Стоит обратить отдельное внимание на оригинальный файл Bootmgr , располагающийся в корне зарезервированного раздела. Если Вы заметили он не имеет расширения, поскольку это не исполняемый PE-файл в привычном нам понимании, а составной файл, содержащий в начале 16-битную «заглушку» реального режима и «запакованный» 32-битный PE-файл bootmgr.exe . После загрузки в память управление получает именно 16-битная «заглушка», которая и занимается переводом процессора в 32-битный защищенный режим, использующий плоскую модель памяти, распаковкой оригинального .exe-файла и передачей ему управления.
Инициализация
Bootmgr.exe стартует с основной процедуры BmMain , которая сразу же начинает выполнять инициализацию внутренних структур и ключевых аппаратных компонентов системы при помощи процедуры: BlInitializeLibrary . Эта процедура включает в себя такие подпрограммы как InitializeLibrary , ReinitializeLibrary . Код которых, в свою очередь, друг за другом вызывает следующие процедуры:
Процедура | Описание |
---|---|
BlFwSetParameters | Инициализация параметров, предназначающихся для последующей работы с функциями BIOS PC/AT. В том числе задается ключевой для всей логики параметр PcatServicesTable ; |
BlpMmInitialize | Выделение памяти под рабочий процесс; |
BlpTimeInitialize | Замеры производительности системы, и определение параметра BlpTimePerformanceFrequency , который далее будет часто использоваться в коде; |
BlpArchInitialize | Инициализация служебных структур: глобальная таблица дескрипторов (GDT), таблица векторов прерываний (IDT), схема управления страницами физической памяти и прочее; |
BlpTpmInitialize | Инициализация модуля TPM; |
BlpIoInitialize | Инициализация файловых систем FAT32/NTFS для обеспечения доступа к основному системному разделу, содержащему операционную систему; |
BlNetInitialize | Инициализация сети. Используется для работы с PXE?; |
BlUtlInitialize | Инициализация внутренних переменных модуля. Для нас процедура на данный момент абсолютно не интересная; |
PltInitializePciConfiguration | Выделяет область памяти для работы с пространством PCI; |
BlpSiInitialize | Инициализация подсистемы безопасности; |
BlBdInitialize | Проверка на наличие отладчика этапа загрузки. Конфигурирование отладки режима загрузки; |
BlpLogInitialize | Конфигурирование файла хранения журнала загрузки; |
BlpDisplayInitialize | Инициализация консоли для вывода. Под консолью подразумевается как текстовый, так и графический локальный терминал, так и удаленная сетевая консоль. |
BlpResourceInitialize | Инициализация данных в ресурсной (.rsrc) секции, получения параметров дисплея, загрузка данных из файлов локализации (.mui), инициализация локали. Достаточно важная, я бы даже сказал, ключевая процедура, поскольку именно от её функционирования зависит дальнейшая работа с конфигурационными файлами. |
Поскольку стадия инициализации критична для дальнейшего функционирования модуля Bootmgr, разработчики решили сообщать об ошибках данной стадии отдельно. Поэтому, при возникновении проблем в функционировании процедуры BlInitializeLibrary мы можем получить нашу первую ошибку Bootmgr, и выглядит она следующим образом:
Текст вывода намекает нам на то, что произошел сбой в какой-то из перечисленных выше подпрограмм. Поскольку данная ошибка охватывает достаточно большой диапазон кода и не имеет текстового описателя, то оператору будет довольно сложно понять в какой именно подпрограмме она возникла. Из этого следует, что единственный способ выявить причину, это попытаться вычислить её по коду ошибки. А что, в свою очередь, представляет из себя код 0xXXXXXXXX ? Так ведь это же описанный выше NTSTATUS . Коды ошибок и их описания смотри в разделе ниже. Ну а мы двигаемся дальше.
Открытие BCD
После первичной инициализации логика bootmgr выполняет открытие файла данных конфигурации загрузки (BCD), который размещается:
- Для традиционной PC/AT (MBR) загрузки — на активном разделе по пути \Boot\BCD ;
- Для современной UEFI загрузки — на разделе EFI по пути \EFI\Microsoft\Boot\BCD ;
Для достижения этой цели используется процедура под названием BmOpenDataStore .
Как Вы уже поняли, BCD является одной из ключевых структур процесса загрузки, содержащей пункты меню загрузки, описывающие пути и настройки определенных элементов конфигурации. Естественно, что любые проблемы с этой базой сразу же выливаются в критические ошибки Bootmgr и невозможность продолжения процесса загрузки операционной системы.
Далее проверяются настройки журналирования этапов загрузки и если логгирование включено, то статус записывается в файл %SystemDrive%\Boot\bootstat.dat процедурой BmpInitializeBootStatusDatalog .
Затем процедура BlResourceFindHtml используется для поиска ресурсного файла bootmgr.xsl внутри ресурсной секции (.rsrc) образа файла bootmgr.exe.
Затем предпринимается попытка найти файл bootmgr.exe.mui , содержащий локализованные версии сообщений. На этапе поиска ресурсов, в случае возникновения проблем с нахождением/открытием оных, мы можем наблюдать ошибку:
Тут у нас ситуация, похожая ту, которая описывалась на этапе инициализации. Текст данной ошибки Bootmgr говорит о том, что в процедуре возникла проблема с нахождением ключевых ресурсов, которые потребуются в дальнейшей работе. Поскольку процедура многосоставная, то и источников проблемы может быть множество. Одной из причин данной ошибки могут быть проблемы с файлом bootmgr.xsl , поскольку без параметров, в нем описанных, дальнейшее выполнение невозможно. Коды ошибок у нас опять же сгруппированы в разделе под названием «Возникающие ошибки» ниже по тексту.
Далее ссылка на данные, загруженные из файла bootmgr.xsl передается процедуре BlXmiInitialize , которая предназначена для разбора содержимого файла и вывода на консоль меню загрузки на основе обнаруженных настроек. В случае, когда инсталлировано несколько операционных систем, либо присутствует несколько пунктов выбора, процедура отображает текстовое меню загрузки и ожидает пользовательского выбора.
при неудачном окончании процедуры выдается ошибка:
Ошибка говорит нам о том, что на этот раз уже с содержимым файла bootmgr.xsl что-то не так. Вероятно, присутствуют ошибки в операндах, структуре. Возможно, пользователь пытался изменить внешнее представление меню при помощи какой-то редактора и допустил ошибку.
Далее происходит проверка собственной цифровой подписи при помощи процедуры BmFwVerifySelfIntegrity . На этом этапе мы можем видеть ошибку C0000428 .
Отдельно происходит проверка на наличии файла гибернации hiberfil.sys при помощи процедуры BmResumeFromHibernate , и в случае необходимости, код вызывает winresume.exe и начинает восстановление системы из режима гибернации.
Далее, в коде имеется еще один локальный обработчик ошибки, который предназначен для вывода на консоль следующего содержания:
Честно признаюсь, воочию я никогда в живой природе подобной ошибки не наблюдал, да и судя по коду она возникает только в случае подключенного отладчика в теле процедуры BlStatusError непосредственно перед передачей управления отладчику посредством вызова прерывания командой int 3 , поэтому акцентировать внимание мы на ней не будем.
Загрузка пункта и передача управления OSLoader
Этот этап у нас является финальным в логике работы модуля Bootmgr. Когда пункт загрузки выбран пользователем, либо назначен автоматически, процедура под названием BmpLaunchBootEntry начинает загружать выбранный пункт загрузки. Процедура BlImgStartBootApplication через подмножество вложенных процедур передает параметры и управление загрузчику операционной системы следующего этапа под названием winload.exe (OSLoader), располагающемуся на выбранном разделе по пути ?:\Windows\System32\winload.exe либо ?:\Windows\System32\boot\winload.exe .
Возникающие ошибки
Для удобства поиска по коду ошибки и её описателю, в данном разделе будут сведены воедино все ошибки Bootmgr, возникающие на различных стадиях процесса функционирования кода модуля. Сортироваться у нас они будут по коду NTSTATUS и иметь возможные варианты описания причины возникновения. К сожалению, таблица получилась не достаточно удобной, однако другого формата представления данных я пока не придумал, поэтому что есть то есть.
Код ошибки | Контекст / Причина |
---|---|
C0000001 STATUS_UNSUCCESSFUL Запрошенная операция была неудачной. | BlpNetInitialize :: Выставляется, если параметр BlpPxeInfo равен нулю. | BlpNetSoftReboot :: Выставляется, если параметр BlpPxeInfo равен нулю. |
BmpGetCustomAction :: Возникает при проверке списка возвращенных опций из BlpGetBootOptionIntegerList. | |
BmPopulateBootEntryList :: Возникает при ошибке MiscGetBootOption, которая ищет опции загрузки по заданному типу. | |
BmpInitializeDisplayMeasurements :: Возникает как реакция на ошибку BlResourceFindMessage, которая ищет ошибку в ресурсной секции по её идентификатору. | |
DmDisplayFveRecovery :: Возникает как реакция на ошибку BlResourceFindMessage, которая ищет ошибку в ресурсной секции по её идентификатору. | |
DmDisplayFvePinEntry :: Возникает как реакция на ошибку BlResourceFindMessage, которая ищет ошибку в ресурсной секции по её идентификатору. | |
BmpResumeCreateBootEntry :: Возникает при проверке существования опции загрузки, получении описателя записи загрузки. | |
BmpBootIniConvertToOptionList :: Возникает как реакция на ошибку AhCreateLoadOptionsList, которая создает список опций загрузки для записи загрузки. | |
PcatGetNextE820Descriptor :: Возникает как реакция на ошибку PcatBiosInterrupt, которая вызывает прерывание. | |
FvebpPromptForExternalMedia :: Возникает как реакция на ошибку отклика от консоли вывода. | |
DeviceTablePurge :: Возникает при проверке открыто ли уже текущее устройство. | |
BcInitialize :: Возникает если BcpBlockAllocatorHandle = -1. | |
UdpFirmwareReceivePacket :: Возникает при проверке таймера через BlpFwCheckTimer. | |
VhdiDynamicReadWriteAtOffset :: Возникает при проверке первого входного аргумента функции на не нулевое значение. | |
VhdiReadVhdInfornationAtOffset :: Возникает при проверке четвертого входного аргумента функции. | |
BlDisplayGetCharacterResolution :: Возникает при проверке параметра DspTextConsole на нулевое значение. | |
BlDisplayGetTextColor :: Возникает при проверке параметра DspTextConsole на значение 14h. | |
BlDisplayGetScreenResolution :: Возникает при проверке параметра DspTextConsole на нулевое значение. | |
BfiPrintBitmap :: Возникает при проверке входных параметров функции. | |
ConsoleTextLocalSetTextResolution :: Возникает при проверке результата ConsolepFindResolution, которая выполняет поиск разрешения в списке. | |
ConsoleGraphicalGetConsoleResolution :: Возникает при проверке значения переменной блока входных параметров. | |
ConsoleGraphicalGetOriginalResolution :: Возникает при проверке значения переменной блока входных параметров. | |
ConsoleGraphicalGetOriginalFormat :: Возникает при проверке значения переменной блока входных параметров. | |
ConsoleGraphicalClearPixels :: Возникает при проверке значения переменной блока входных параметров. | |
ConsoleGraphicalReadPixels :: Возникает при проверке значения переменной блока входных параметров. | |
ConsoleGraphicalWritePixels :: Возникает при проверке значения переменной блока входных параметров. | |
ConsoleGraphicalGetFrameBuffer :: Возникает при проверке значения переменной блока входных параметров. | |
BfiMapCharacterCodeToGlyphIndex :: Возникает при проверке входных параметров функции. | |
ConsolePcatFindModeFromAllowed :: Возникает при проверке входных параметров функции. | |
ConsolePcatFindTargetMode :: Возникает при ошибке функции ConsolePcatFindModeFromAllowed. | |
FileTablePurgeEntry :: Возникает при проверке входных параметров функции. | |
FileIoOpen :: Возникает при ошибке нахождения записи о файле в файловой системе. | |
FatMount :: Возникает при отсутствии инструкции jmp (E9h) в первом байте загрузочного сектора раздела, то есть это не FAT!. | |
FatpIoOperation :: Статус по умолчанию? | |
EtfspCheckEtfs :: | |
EtfspCheckCdfs :: Возникает при ошибке сравнения имен посредством функции EtfsCompareNames. | |
UdfspGetNextDirectoryEntry :: Возникает при сравнении локального параметра (?) со значением 101h. | |
NtfsMount :: Возникает как реакция на неправильное значение параметра в BPB. | |
NtfsDecodeUsa :: . | |
NtfspDeviceReadAtOffset :: Возникает при проверке входного параметра на определенное значение. | |
NtfspDeviceWriteAtOffset :: Возникает при проверке входного параметра на определенное значение. | |
NtfspFileRecordPurgeEntry :: Выставляется при проверке блока входных параметров. | |
NetMount :: Выставляется при проверке входного параметра. | |
WimpValidateWim :: Ошибка проверки длины wim-образа. | |
BsdpGetLogControl :: Выставляется, если функция BlFileReadAtOffset вернула ошибку. | |
BsdpWriteAtLogOffset :: Выставляется, если функция BlFileWriteAtOffset вернула ошибку. | |
PxeGetBcdFilePath :: Выставляется при проверке на ноль второго параметра функции PxepGetPacketByType. | |
PxeGetBcdFilePath :: Выставляется как реакция на ошибку в функции PxepFindOption. | |
PxepGetInformation :: Выставляется при проверке на ноль второго параметра функции PxepGetPacketByType. | |
BlUtlRegisterMulticastRoutine :: Появляется если параметр UtlMcDisplayMessageRoutine равен нулю. | |
BlUtlRegisterProgressRoutine :: Появляется если параметр UtlProgressRoutine равен нулю. | |
BlEnRegisterEventHandler :: Появляется если параметр EnSubsystemInitialized равен нулю. | |
BlPdFreeData :: Возникает как реакция на ошибку в BlMmTranslateVirtualAddress, которая выполняет преобразование реальных и виртуальных адресов. | |
TblDoNotPurgeEntry :: Функция всегда возвращает данный код. | |
BlTftpQueryFileSize :: Возникает как ошибка при вычислении длины получаемого по TFTP файла | |
TftppGetImageRegular :: Выставляется, если первый входной параметр функции равен нулю. | |
TftppGetImageWindow :: Ставится при равенстве пятого входного параметра некоему значению. | |
TftppReceive :: . | |
TftppNegotiate :: Ставится при возврате в eax значения 0FFFFFFFFh из функции TftppSafeAtol. | |
PxeApiService :: Возвращается в коде ошибки в любом случае. | |
PxeSoftReboot :: Выставляется в случае значения переменной BlpPxeInfo , отличной от нуля. | |
SipGetOrCreatePersistentState :: Ошибка выставляется при значении определенной переменной в блоке параметров BlpLibraryParameters значению 100h. | |
SipInitializePhase1 :: Выставляет при вхождении подсистемы безопасности в некое незащищенное состояние. Пока не ясно, что это такое? | |
SipGracefulCloseEnvironment :: Возникает при проверке некоего глобального статуса безопасности (?). | |
BlTpmpFirmwareCall :: Возникает после проверки некоего глобального параметра, указывающего на номер функции работы с TPM. Если не укладываемся в диапазон функций, то ошибка. | |
ImgPcatStartLegacyLoader :: Возникает при ошибках функций RtlUnicodeStringToAnsiString и BlGetBootOptionString. | |
ImgPcatStartRestartBootcode :: Код ошибки в любом случае устанавливается на выходе функции. | |
BlMmFreeHeap :: Выставляется при проверке параметра HapInitializationStatus на несоответствие значению 1. | |
BlMmAllocateMemoryBlocks :: Выставляется при нулевом значении параметра MmBlockAllocatorInitialized . | |
BlMmDeleteBlockAllocator :: Выставляется при нулевом значении параметра MmBlockAllocatorInitialized . | |
BlpMmFreeMemoryBlocks :: Выставляется при нулевом значении параметра MmBlockAllocatorInitialized . | |
MmBapPurgeBlockAllocatorTableEntry :: Возникает при проверке блока входных параметров. | |
BcdGetElementDataWithFlags :: | |
BcdDeleteElement :: | |
BdpReconfigureDebuggerDevice :: Возникает при невозможности инициализировать контроллер шины 1394. | |
BdSetupPciDevice :: Ошибка выставляется, когда функция поиска отладочного устройства BdSearchForPciDebuggingDevice ничего не находит. | |
BdSendWaitContinue :: Возникает при проверке ошибок от множества функций, в том числе от BdMoveMemory и KdTransportMaxPacketSize. | |
BdWriteBreakPointEx :: возникает при проверке статуса выполнения функции BdDeleteBreakPoint. | |
BdRestoreBreakPointEx :: возникает при проверке статуса выполнения функции BdDeleteBreakPoint. | |
FveStatusFromHResult :: Возникает при перекодировке определенных статусов Bitlocker. | |
FveDatumCreateAndCopy :: | |
FveDatumFree :: Возникает при проверке локальной переменной. | |
Dbg1394_ReadPhyRegister :: Возникает как реакция на ошибку в функции BL_READ_REGISTER_ULONG. | |
Dbg1394_InitializeController :: Возникает при невозможности инициализировать контроллер шины 1394. | |
C0000002 STATUS_NOT_IMPLEMENTED Запрошенная операция не выполнена. | BlDeviceEnumerateDeviceClass :: Выставляется при нулевом значении переменной BlockIoDeviceFunctionTable . |
BlpDeviceOpen :: Выставляет при неподдерживаемом типе устройства. | |
BlockIoEnumerateDeviceClass :: Выставляется при нулевом значении переменной DiskDeviceFunctionTable . | |
BlockIoCreate :: Выставляется при проверки серии глобальных переменных на нулевое значение. | |
UdpEnumerateDeviceClass :: Единственный код возврата из функции. Вероятно говорит о том, что данная функция не доработана? | |
UdpReset :: Единственный код возврата из функции. Вероятно говорит о том, что данная функция не доработана? | |
ConsoleGraphicalSetTextResolution :: Выставляется, если первый параметр функции нулевой. | |
BfiGetEbdtBitmapInformationFromSubTable :: | |
BfiReadEbdtImage :: Выставляется при проверке значения третьего входного параметра функции. | |
WimWrite :: Единственный код возврата из функции. Вероятно говорит о том, что данная функция не доработана? | |
NtfspReadWriteAttributeEx :: Выставляется при нулевом значении седьмого входного параметра функции. | |
BlTpmpFirmwareCall :: Выставляется при отсутствии необходимых функций для работы с TPM. | |
BlTcgFwGetLog :: Выставляется при различных проблемах дешифровки проверки TPM/дешифровки содержимого. | |
MmPaeInitializeTranslation :: Выставляется при ненулевом значении второго входного параметра функции. | |
MmDefInitializeTranslation :: Выставляется при ненулевом значении второго входного параметра функции. | |
RtlpImageDirectoryEntryToData32 :: | |
RtlpImageDirectoryEntryToData64 :: | |
FveStatusFromHResult :: Выставляется при результате 80004001 (Unable to activate partition) BitLocker. | |
FveVmkInfoProcess :: Выставляется при проверке некой локальной переменной на значение 1? | |
C0000005 STATUS_ACCESS_VIOLATION Инструкция обратилась к определенному адресу памяти и не может выполнить (чтение/запись/выполнение). | BdTrap0d :: |
BdTrap0e :: | |
C000000E STATUS_NO_SUCH_DEVICE Заданное устройство не существует. | BmOpenDataStore :: возникает при неготовности PXE. |
BmResumeProbeLegacyHiberFile :: Не может получить доступ к устройству загрузки. | |
BmReadBootIni :: Выставляется как реакция на ошибку в функции BlGetBootOptionDevice, которая получает различные опции для устройства загрузки. | |
FileDeviceOpen :: Возникает как реакция на ошибку в функции BlDeviceOpen. | |
DiskFirmwareOpen :: Устанавливается, если переменная NextDiskNumber больше FirmwareDisks . | |
CdromFirmwareOpen :: Возникает при проверке блока параметров, на который указывает BlpRootDevice . | |
FloppyFirmwareOpen :: Возникает, если переменная NextFloppyNumber больше значения 2. | |
BlNetSoftReboot :: Возникает если переменная BlpBootDevice принимает нулевое значение. | |
PxeGetBcdFilePath :: Выставляется при проверке переменной BlpPxeInfo на нулевое значение. | |
AhGetBootEnvironmentDevice :: Выставляется при проверке локальной переменной после вызова BlDeviceEnumerateDeviceClass и при равенстве переменной BlpPxeInfo нулю. | |
AhGetFilePath :: Генерируется при проверке выходных переменных функции BlGetDevice . | |
PltpCheckDeviceExistence :: Устанавливается при ошибках доступа к устройству по шине. | |
C000000F STATUS_NO_SUCH_FILE Файл не найден. Файл не существует. | BmpReadBootIni :: Возникает при проверке параметра из блока параметров BlpPxeInfo . |
FvebpReadKeyFile :: Возникает при несовпадении при сравнении внутреннего параметра с аргументом. Скорее всего по факту считывания блока данных, относящего к ключевому файлу BitLocker’а из внешнего источника. | |
FvebpSearchForKeyFileNoPrompt :: Возникает при ошибке выполнения функции BlDeviceEnumerateDeviceClass . Скорее всего отсутствует ключевой файл BitLocker’a. | |
FileDeviceOpen :: Возникает при ошибке в функции BlpFileOpen. В глобальном плане система не может найти файл следующего этапа (зачастую это \Windows\System32\Winload.exe (Winload.efi) ). | |
RdpLoadImage :: Возникает при ошибке в функции RdpQueryImageSize. Вероятно, в глобальном плане это ошибка загрузки образа виртуального диска (ramdisk). | |
RdpUnlockSourceDevice :: Устанавливается как реакция на ошибку функции BlGetDevice. Относится к виртуальному диску (ramdisk). | |
RdpLoadFileToImage :: Возникает при ошибке функции BlGetFilePath. В глобальном плане функция монтирует файл в образ в памяти (ramdisk). | |
FatpGetNextDirent :: Вероятно, возникает при вычислении следующего элемента файловой таблицы? | |
EtfspSearchForDirent :: Появляется при ошибке функции EtfspGetDirent. В глобальном плане имеется в виду файловая система El Torito File System, используемая на CD диска. Скорее всего ошибка поиска записи в файловой системе. | |
EtfspGetDirent :: Ошибка в получении записи файла из файловой системы El Torito File System. | |
UdfspSearchForMatchingFid :: Возникает при проблемах получения записи о файле при помощи функции UdfspGetNextDirectoryEntry. Подразумевается файловая система udfs, которая может использоваться на широком спектре сменных носителей (чаще оптические диски). | |
NtfspSearchForFileIndexEntryEx :: Генерируется при ошибке функции NtfspGetNextFileIndexEntry, которая выполняет поиск записи о файле в файловой системе ntfs. | |
NtfspGetNextFileIndexEntry :: Генерируется при ошибке функции NtfspGetNextIndexEntry, которая выполняет поиск записи любого типа в файловой системе ntfs. | |
WimOpen :: Возникает при работе с блоком данных WimFunctionTable. В глобальном плане это попытка открытия wim-образа инсталляции. | |
WimpSearchForDirent :: Ошибка поиска файловой записи в образе. | |
BlTftpQueryFileSize :: Устанавливается при ошибках длины удаленного файла. | |
TftppReceive :: Генерируется при проверке входного параметра на значение 100h. | |
C0000010 STATUS_INVALID_DEVICE_ REQUEST Указанный запрос является не допустимой операцией для целевого устройства. | BlockIopReadWriteVirtualDevice :: |
UdpOpen :: | |
UdpRead :: | |
UdpWrite :: | |
DeviceLogGetDeviceInfo :: | |
NetOpen :: | |
NetRead :: | |
NetWrite :: | |
C0000011 STATUS_END_OF_FILE Достигнут конец файла. Далее данной отметки в файле данных не обнаружено. | NtfspGetNextIndexEntry :: Возникает при отсутствии следующего индекса в цепочке кластеров. Данных для файла больше нет. |
NtfspReadWriteAttribute :: Возникает при проверке входных параметров функции. Скорее всего при проверке атрибутов файла. | |
C0000017 STATUS_NO_MEMORY Не хватает виртуальной памяти или файла подкачки для завершения операции. | BlMmAllocateHeap :: Возникает, когда функция не смогла выделить кучу (блок) памяти коду произвольной стадии. Выделение памяти инициируется в более чем 180 (!) фрагментах кода Bootmgr, однако привести огромный список всех процедур пока не могу. Причина ошибки может быть: |
- проблемы в работе оперативной памяти;
- недостаточное количество оперативной памяти;
- интегрирование большого количества драйверов в образ;
- интегрирование большого количества приложений в образ;
STATUS_ACCESS_DENIED
Процесс запросил доступ к объекту, но не был наделен правами доступа.
STATUS_BUFFER_TOO_SMALL
Буфер слишком мал, чтобы уместить запись. Информация не записана в буфер.
STATUS_OBJECT_TYPE_ MISMATCH
Существует несоответствие между типом объекта, который требуется по запрошенной операции и типом объекта, указанным в запросе.
STATUS_DISK_CORRUPT_ ERROR
Структура файловой системы на диске повреждена и непригодна для использования. Запустите служебную программу chkdsk для тома.
STATUS_OBJECT_NAME_ INVALID
Имя объекта является недействительным.
STATUS_OBJECT_NAME_NOT_ FOUND
Имя объекта не найдено.
STATUS_OBJECT_NAME_ COLLISION
Имя объекта уже существует.
STATUS_CRC_ERROR
Ошибка контрольной суммы.
STATUS_SECTION_TOO_BIG
Указанный раздел слишком большой, чтобы быть отображенным на файл.
STATUS_REVISION_MISMATCH
Указывает на то, что два уровня редакции являются несовместимыми.
STATUS_PROCEDURE_NOT_FOUND
Адрес процедуры не найден в библиотеке DLL.
STATUS_INVALID_IMAGE_ FORMAT
Образ либо не предназначен для выполнения в Windows, либо содержит ошибку в структуре.
STATUS_INTEGER_OVERFLOW
Целочисленное переполнение.
STATUS_FILE_INVALID
Раздел, на котором размещался файл был изменен извне, таким образом открытый файл больше не действителен.
STATUS_INSUFFICIENT_ RESOURCES
Недостаточно системных ресурсов для завершения вызова API.
STATUS_DEVICE_DATA_ ERROR
На жестком диске имеются сбойные блоки (сектора).
STATUS_DEVICE_NOT_CONNECTED
Проблема с кабелем, диск не терминирован, или контроллер не смог получить доступ к жесткому диску.
STATUS_MEMORY_NOT_ALLOCATED
Была сделана попытка освободить виртуальную память, которая не выделялась.
STATUS_MEDIA_WRITE_ PROTECTED
Запись на диск невозможна, потому что он защищен от записи. Снимите защиту от записи.
STATUS_DEVICE_NOT_READY
Привод не готов к использованию; возможно открыта дверца. Убедитесь, что диск вставлен и дверца привода закрыта.
STATUS_FILE_IS_A_DIRECTORY
Файл, который был указан как целевой, является директорией, а вызывающий код указал, что это может быть что угодно, но не каталог.
STATUS_NOT_SUPPORTED
Запрос не поддерживается.
STATUS_DUPLICATE_NAME
Дубликат имени обнаружен в сети.
STATUS_DEVICE_DOES_NOT_ EXIST
Данное устройство не существует.
STATUS_INTERNAL_DB_CORRUPTION
Запрошенная операция не может быть завершена из-за катастрофического сбоя носителя или повреждении структуры данных на диске.
STATUS_UNEXPECTED_IO_ ERROR
Если возвращается ошибка ввода-вывода, которая не определена в стандартном фильтре FsRtl, она конвертируется в данный код. Непредвиденная ошибка ввода-вывода. Скорее всего проблемы с чтением носителя.
STATUS_INVALID_PARAMETER_2
Неверный параметр был передан функции в качестве второго аргумента.
STATUS_INVALID_PARAMETER_9
Неверный параметр был передан функции в качестве девятого аргумента.
STATUS_NOT_A_DIRECTORY
Запрошенный открытый файл не является каталогом.
STATUS_NAME_TOO_LONG
Указанное имя строки слишком длинное. Невозможно использовать в целевой функции.
STATUS_CANCELLED
Запрос ввода-вывода был отменен.
STATUS_INVALID_ADDRESS
Дескриптор адреса недействителен.
STATUS_REGISTRY_CORRUPT
Структура одного из файлов, содержащего данные реестра, повреждена; Образ файла в памяти поврежден; или файл не может быть восстановлен, поскольку резервная копия или журнал отсутствуют или повреждены.
STATUS_UNRECOGNIZED_ VOLUME
Том не содержит распознаваемую файловую систему. Убедитесь, что все необходимые драйверы файловой системы были загружены и том не поврежден.
STATUS_INVALID_DEVICE_ STATE
Устройство не находится в допустимом состоянии для выполнения запроса.
STATUS_IO_DEVICE_ ERROR
Устройство ввода/вывода сообщает об ошибке ввода/вывода.
STATUS_TRUST_FAILURE
Ошибка входа в сеть. Узел проверки недоступен.
STATUS_IMAGE_CHECKSUM_MISMATCH
Возможно образ файла поврежден. Контрольная сумма, указанная в заголовке, не совпадает с расчетной.
STATUS_NOT_FOUND
Объект не найден.
- Неправильно выставленные параметры загрузки в BIOS: UEFI/Legacy-схемы загрузки.
Частные причины:
BmMain :: Выставляется при ошибках в функциях: BmpInitializeBootStatusDataLog, BmpLogBootResolution, BlResourceFindHtml, которые выполняют инициализацию файла журнала и поиск ресурсов внутри секций модуля Bootmgr.
STATUS_FAIL_CHECK
Проверка не удалась.
STATUS_BAD_COMPRESSION_ BUFFER
Указанный буфер содержит неправильно оформленные данные.
STATUS_UNSUPPORTED_ COMPRESSION
Указанный формат сжатия не поддерживается.
STATUS_NO_MORE_MATCHES
Больше нет совпадений для текущего индекса перечисления.
STATUS_DEBUGGER_INACTIVE
Попытка произвести действие с отладочным портом не удалась, порт находится в процессе удаления.
STATUS_INVALID_IMAGE_WIN_32
Указанный образа файла имеет неправильный формат; возможно это образ для 32-битной Windows.
STATUS_INVALID_IMAGE_WIN_64
Указанный образа файла имеет неправильный формат; возможно это образ для 64-битной Windows.
STATUS_ASSERTION_FAILURE
Произошла ошибка утверждения.
STATUS_INVALID_IMAGE_HASH
Хэш для образа не найден в системных каталогах. Образ поврежден или подделан.
STATUS_RESTART_ BOOT_ APPLICATION
Это приложение загрузки необходимо перезапустить.
STATUS_ALREADY_REGISTERED
Функция обратного вызова уже зарегистрирована.
STATUS_FILE_TOO_LARGE
Размер файла превышает допустимый и не может быть записан.
STATUS_ACPI_INVALID_TABLE
Была сделана попытка использовать некорректную таблицу.
STATUS_LOG_BLOCK_INVALID
Служба логгирования обнаружила недопустимый блок.
STATUS_VHD_DRIVE_FOOTER_ CHECKSUM_ MISMATCH
Некорректная контрольная сумма футера (завершающего блока) виртуального образа.
STATUS_VHD_DRIVE_FOOTER_ CORRUPT
Поврежденный футер (завершающий блок) виртуального образа.
STATUS_VHD_FORMAT_UNKNOWN
Некорректный формат виртуального образа.
STATUS_VHD_FORMAT_ UNSUPPORTED_ VERSION
Неподдерживаемая версия формата виртуального образа.
STATUS_VHD_INVALID_BLOCK_ SIZE
Неправильный размер блока виртуального образа.
STATUS_VHD_BITMAP_MISMATCH
Несоответствие битовой карты виртуального диска.
STATUS_VHD_CHILD_PARENT_ID_ MISMATCH
Ошибка идентификатора ID виртуального образа.
STATUS_VHD_INVALID_SIZE
Некорректный размер виртуального образа.
Выводы
Изучение внутренней структуры ошибок Bootmgr достаточно трудоемкое и кропотливое занятие, требующее огромного количества времени, а самое главное, недюжих знаний, каковыми я пока что не обладаю. Следствием этого, как Вы могли уже заметить, является тот факт, что далеко не все ошибки Bootmgr освещены достаточно подробно. В отсутствии вменяемой логики анализа исходного кода приходится изучать ошибки Bootmgr по ассемблерному листингу в отладчике. Вероятно, кто-то из профессионалов реверсинга может посоветовать восстанавливать исходные тексты на языке C/C++ для упрощения восприятия, но и данными, казалось бы, необходимыми знаниями я пока не наделен. Поэтому, статья находится в статусе альфа как не до конца проработанная, тем не менее, надеюсь, что даже в таком сыром виде будет полезна кому-либо в качестве плацдарма для изучения специфических, возникающих на начальной стадии Bootmgr, ошибок. Какие выводы можно сделать по данному материалу? Я думаю, основной вывод, который напрашивается: невозможно точно характеризовать возникающую ошибку Bootmgr и определенно сказать об причине её возникновения даже по числовому идентификатору NTSTATUS , поскольку многие статусы имеют различные причины в различных функциях. Единственное что можно сделать, это попытаться по перебору возможных причин ошибки дойти до настоящего виновника сбоя, затем уже воспользовавшись для ошибки рекомендациями по устранению. Можно воспользоваться и общими алгоритмами, которые на каждом шагу можно встретить в Сети, однако не все из них действенны. Возможно, большинство ошибок, которые приведены в результирующей таблице, на практике никогда никому не встречались и скорее всего, в живой природе можно наблюдать значительно меньший диапазон ошибок, которые уже более-менее изучены и по которым написаны развернутые мануалы по устранению. Однако, судя по некоторым темам конференций, можно сказать, что раритетные ошибки всё же имеют место быть, поэтому в качестве отправной точки материал всё же пригодится.