Bootmgr (Windows Boot Manager) — Менеджер загрузки, используемый в операционных системах Microsoft Windows (Windows Vista/7/8/10).
Bootmgr появился в операционной системе Windows Vista и представляет собой дальнейшее (развитие) эволюционирование хорошо известного нам по предыдущим версиям Windows загрузчика NTLDR
, который был переписан с учетом некоторых нововведений, в том числе обеспечения поддержки интерфейса EFI
(Extensible Firmware Interface, Расширенный интерфейс прошивки). Загрузчик сохранил совместимость и со «старой», традиционной (legacy) схемой загрузки ОС, использующей последовательность BIOS
-> MBR
-> PBR (VBR)
-> BOOTMGR
-> winload.exe
-> ntoskrnl.exe
-> SMSS
-> Winlogon
. В зависимости от метода загрузки системы и реализованной в BIOS версии спецификации UEFI, модуль менеджера загрузки может именоваться:
- bootmgr.exe — традиционный (legacy);
- bootmgfw.efi — UEFI;
- bootmgr.efi — UEFI;
- bootx64.efi — UEFI;
Представляет собой исполняемый (PE-формат) файл, располагающийся на скрытом системном разделе, и предназначающийся для решения следующих задач:
- Подготовка среды загрузки ядра, прединициализации структур/интерфейсов: таблиц дескрипторов GDT, IDT, микрокода, модуля TPM, файловых систем, шины PCI, отладчика ядра, текстовой консоли, сетевого интерфейса и др.;
- Поддержка (новой) базы данных конфигурации загрузки (Boot Configuration Data, BCD), включающей меню загрузки ОС (текущей/предыдущих версий), опции гибернации, восстановления, позволяющей интегрировать опции сторонних разработчиков (различные модули этапа загрузки);
- Обеспечение опций загрузки начального этапа: устранение неполадок компьютера, безопасный режим, безопасный режим с загрузкой сетевых драйверов, безопасный режим с поддержкой командной строки, ведение журнала загрузки, включение видеорежима с низким разрешением, последняя удачная конфигурация, режим восстановления служб каталогов, режим отладки, отключить автоматическую перезагрузку при отказе системы, отключение обязательной проверки подписи драйверов, обычная загрузка Windows.
- Нахождение/проверка/загрузка модуля следующего этапа winload.exe(.efi).
Начиная с версии Windows 7, даже в случае установки системы с использованием классического способа разметки/загрузки (BIOS/POST → MBR), менеджер загрузки bootmgr размещается на специализированном скрытом разделе под названием System Reserved (Зарезервировано системой).
Тут самое время задаться вопросом, зачем разработчикам вводить отдельный раздел для классической схемы загрузки (BIOS/MBR)? Ведь раньше то ничего подобного не создавалось, все прекрасно загружалось без всяких там скрытых разделов, все файлы цепочки загрузки находились на основном системном разделе, куда же проще? А ответ, как мне кажется, достаточно прост. Выше мы уже упомянули, что схема загрузки была переделана Microsoft с учетом потребностей новой технологии UEFI, у которой для размещения загрузчиков используется специальный раздел ESP. Так что же, для UEFI использовать один алгоритм загрузки, а для классической BIOS/MBR оставлять традиционный? Подобное решение влечет за собой огромное количество проблем и необходимость обновления двух веток кода, не проще ли привести все «к одному знаменателю»: традиционную и UEFI-загрузки реализовать в рамках единого алгоритма, в любом случае размещая загрузчик в специальном разделе? Собственно это и было реализовано.
Поэтому, раздел System Reserved в традиционной схеме загрузки (BIOS/MBR) предназначается для:
- приведения иерархий разметки диска/файловой системы (используемых при традиционной (legacy) загрузке) в соответствие с аналогичной структурой стандарта UEFI: размещение на разделе (в классифицированном дереве директорий) файлов операционной системы, фигурирующих в начальном этапе загрузки ОС (Bootmgr/BCD);
- дополнительной защиты загрузочных файлов операционной системы от (не)преднамеренных деструктивных действий приложений/пользователя;
- хранения загрузочных файлов BitLocker Drive Encryption в случае, если используется шифрование разделов;
Скрытый раздел System Reserved создается на этапе установки операционной системы и имеет типовой размер порядка 100Mb (хотя может быть уменьшен до 30Mb без потери функционала). Далее мы будем рассматривать внутреннюю структуру файла bootmgr, представляющего из себя гибрид блоков кода на языке ассемблера, и встроенного образа PE-формата (написанного на языке C) с ресурсами и дополнительными секциями, содержащими наборы рабочих данных.
Где находится bootmgr Windows 7
В операционной системе Windows 7 bootmgr имеет довольно ощутимый размер для файла загрузки (в тестовой системе = 383786 байт), поскольку, как мы сможем увидеть позже, по большей части написан на языке высокого уровня. Располагается bootmgr в корневом каталоге основного активного скрытого раздела размером в 100 мегабайт. Данный раздел размещается в начале диска, предваряя все остальные. Партиции этой не присваивается логического имени (литеры/буквы диска), поэтому в самой операционной системе она не видна для стандартных средств операционной системы. Как вы можете догадаться, таким вот незатейливым способом данная партиция защищена от деструктивных действий пользователя, могущих повлечь за собой повреждение критически важной загрузочной информации.
Для того, чтобы найти файл bootmgr в системе, необходимо сначала научиться взаимодействовать со скрытым разделом. Для этого открываем апплет Управление компьютером, щелкнув правой кнопкой мыши на иконке «Компьютер» и выбрав пункт «Управление», либо можно запустить (Win+R) из командной строки diskmgmt.msc. Текущий пользователь должен иметь права администратора. В ответ на это действие откроется окно следующего вида:
Чтобы содержимое скрытого раздела предстало нашему взору, нам необходимо назначить ему логический номер (букву/литеру). На рисунке (схематично) я обозначил последовательность действий, которые нам необходимо предпринять. После выбора пункта «Изменить букву диска или путь к диску» у нас появится следующее окно выбора:
После нажатия кнопки ОК логическое имя будет присвоено разделу и он станет доступен в проводнике. Содержимое его, которое нам как раз и необходимо, наконец-то можно увидеть. Но это еще не все, дело в том, что некоторые файлы и директории раздела имеют атрибут «скрытый», поэтому нам нужно включить отображение скрытых и системных файлов. Это можно сделать в свойствах папки (Параметры папок и поиска — Вид). А теперь, давайте взглянем на искомый нами файл bootmgr, который можно увидеть прямо в корне партиции:
На рисунке бывает порой сложно, а чаще и вовсе не получается наглядно отобразить всю структуру раздела, поэтому приведу его в виде текстового списка. Итак, содержимое скрытого раздела «Зарезервировано системой» выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
\Boot \de—DE bootmgr.exe.mui 91712 локализация интерфейса загрузчика \en—ES bootmgr.exe.mui 85056 локализация интерфейса загрузчика \es—ES bootmgr.exe.mui 90192 локализация интерфейса загрузчика \Fonts wgl4_boot.ttf 47452 шрифт \fr—FR bootmgr.exe.mui 93248 локализация интерфейса загрузчика \it—IT bootmgr.exe.mui 90704 локализация интерфейса загрузчика \ru—RU bootmgr.exe.mui 90192 локализация интерфейса загрузчика memtest.exe.mui 43600 локализованная версия утилиты memtest BCD 20480 хранилище данных конфигурации загрузки BCD.LOG 17408 BCD.LOG1 0 BCD.LOG2 0 BOOTSTAT.DAT 65536 Boot Status Data. log-файл для записи статуса загрузки/завершеения (если включено логгирование) memtest.exe 485760 утилита memtest bootmgr 383786 менеджер загрузки BOOTSECT.BAK 8192 WLJAV 357376 |
По комментарию напротив (справа от) каждого файла в окне представления вы можете увидеть краткое описание функционального назначения.
Хотелось бы сделать некое лирическое отступление и поговорить о файлах, имеющих расширение .mui
. Если вы были достаточно внимательны, то обратили внимание, что одноименные файлы с расширением .mui имеют значительно меньший размер в сравнении со своими оригиналами. Это объясняется тем, что .mui-файл — это файл ресурсов, который содержит элементы локализации интерфейса основной программы для определенного языка. Проще говоря — это перевод интерфейса программы. Технология впервые была использована в ОС Windows Vista и предназначалась для связывания ресурсов, описанных в языковом файле (текст меню, диалоговых окон, строк помощи и прочее.) с независимым от языка основным исполняемым файлом.
Но, вернемся к основной линии повествования. Управление код bootmgr Windows 7 получает сразу после своей загрузки кодом загрузочного сектора раздела PBR.
Структура файла bootmgr Windows 7
По анализу кода загрузочного сектора раздела (PBR) в предыдущих статьях нам удалось определить, что первый файл, который загружается и выполняется после кода PBR, это bootmgr, находящийся в корне скрытого системного раздела. Интересно было бы посмотреть на структуру этого файла.
Дабы в следствии экспериментов не вывести систему из работоспособного состояния, стоит сделать резервную копию файла bootmgr в какой-нибудь временной директории, к примеру %TEMP%.
С чего мы начнем изучение? Первое, что приходит на ум, это визуально осмотреть структуру файла с помощью любого доступного под рукой шестнадцатеричного редактора. Что мы и сделаем сейчас, в моем случае я воспользовался встроенным в файловый менеджер FAR Commander редактором, переключив его в режим шестнадцатеричного представления.
При беглом осмотре структуры, удалось обнаружить некоторые особенности.
- 16-битный загрузчик. Начиная со смещения
00000000
предположительно идет код, напоминающий по виду код реального режима (aka ассемблер). Вероятно, у bootmgr есть участок кода, который исполняется в реальном 16-битном режиме процессора сразу после прыжка из кода PBR (поскольку код PBR не переводит процессор ни в какой другой режим). Я думаю, что код этот производит некие подготовительные действия. Предположительно (!) в файле он размещается до адреса00003DDF
. - PE-образ неопределенного назначения. Далее, по смещению
00005BF0
удалось обнаружить некое подобие стандартного заголовка PE-образа, который начинается с сигнатуры MZ (4D 5A). Насколько я понял, этот образ располагается вплоть до адреса00007BF0
, то есть имеет размер 8192 байта (2000h). Этот образ содержит PE-заголовок, но при этом имеет не все типовые секции (такие как секции кода, данных, ресурсов). Многие из этих секций заполнены нулями, поэтому я могу сделать предположение, что он вообще не исполняется. - Запакованный bootmgr.exe. Затем, удалось найти еще один PE-образ по смещению
00007BF0
, который так же начинается со стандартной сигнатуры MZ и размещается вплоть до самого конца файла bootmgr Windows 7.
Portable Executable — (PE, дословно: переносимый исполняемый) — формат исполняемых файлов, используемый во всех версиях операционной системы Microsoft Windows
По сути, на основе тех данных, которые нам только что удалось получить при беглом, поверхностном анализе данных, файл bootmgr имеет три составных части:
- некий 16-битный код-загрузчик;
- пустой PE-образ: назначение неизвестно;
- еще один PE-образ: предположительно 32-битный запакованный файл bootmgr.exe;
На этом предварительный анализ заканчивается. Теперь нам предстоит более предметно подойти к вопросу и попробовать «в лоб» дизассемблировать bootmgr Windows 7 с целью понять, действительно ли код, располагающийся в начале файла, простой участок кода реального режима?
16-битный загрузчик (16-bit stub)
В самом начале исходного кода я обнаружил (традиционный) блок настройки сегментных регистров. Базу сегмента я не корректировал пока (уверен, что при переходе от PBR они имеют другие значения), поскольку не разобрался, с какого адреса стартует этот участок кода.
seg000:01D8 mov bx, 3DE0h seg000:01DB shr bx, 4 seg000:01DE mov ax, cs seg000:01E0 add ax, bx seg000:01E2 mov ss, ax seg000:01E4 mov sp, 0C80h seg000:01E7 push dx seg000:01E8 mov ds, ax seg000:01EA mov es, ax seg000:01EC xor ebp, ebp seg000:01EF movzx esp, sp seg000:01F3 mov word ptr ds:1534h, ds seg000:01F7 mov word ptr ds:1536h, cs seg000:01FB call sub_56C |
Затем, далее по кодовому ветвлению, идет сброс контроллера диска.
seg000:0A52 mov dx, 3F2h seg000:0A55 mov ax, 0Ch seg000:0A58 out dx, al seg000:0A59 retn |
Далее следует включение линии A20.
seg000:0AC2 call sub_AE4 seg000:0AC5 jnz locret_AE3 seg000:0AC9 pushfd seg000:0ACB cli seg000:0ACC mov al, 0D1h ; ‘T’ seg000:0ACE out 64h, al seg000:0AD0 call sub_AE4 seg000:0AD3 mov al, 0DFh ; ‘-‘ seg000:0AD5 out 60h, al seg000:0AD7 call sub_AE4 seg000:0ADA mov al, 0FFh seg000:0ADC out 64h, al seg000:0ADE call sub_AE4 seg000:0AE1 popfd seg000:0AE3 locret_AE3: seg000:0AE3 retn |
Потом код производит работу с настройкой страничной адресации.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
seg000:07F2 mov ax, ds:word_1510 seg000:07F5 and ax, ax seg000:07F7 jnz locret_86F seg000:07FB push large 0 seg000:0801 popfd seg000:0803 mov ds:word_1510, 1 seg000:0809 mov eax, ds:dword_1514 seg000:080D xor edx, edx seg000:0810 or edx, 1 seg000:0814 and eax, 80000000h seg000:081A jz loc_825 seg000:081E or edx, 80000000h seg000:0825 loc_825: seg000:0825 cli seg000:0826 lgdt fword ptr ds:byte_1500 seg000:082B lidt fword ptr ds:byte_1508 seg000:0830 mov eax, cr0 seg000:0833 or eax, edx seg000:0836 mov cr0, eax seg000:0839 xchg bx, bx seg000:083B nop seg000:083C jmp short loc_83F |
Ну и затем осуществляется переход в защищенный режим. А вот после этого следует довольно большой участок кода, который активно манипулирует блоками данных и выполняет над ними различные арифметико-логические операции, очень похожий на код распаковки 32-битного образа bootmgr.exe (предположение). Затем идут процедуры подготовки окружения для запуска 32-битного образа. Образ распаковывается и размещается по адресу (базе) 0x400000
, то есть мы видим уже классическую схему загрузки PE-файла Windows.
Заголовок размером 16 байт
Используется 16-битным блоком кода реального режима для определения параметров распаковки файла bootmgr.exe.
PE-образ размером 8192 байта неизвестного предназначения
Содержит структуру PE-заголовка. Заглушку для вывода ошибки при запуске в реальном режиме. Часть секций присутствует. Большинство секций заполнены нулями.
32-битный PE-образ bootmgr.exe
Как мы уже упоминали выше, последним найденным блоком данных был файл bootmgr.exe, правда основная проблема заключается в том, что он запакован (сжат). Поэтому, непосредственно перед изучением логики его работы, нам необходимо извлечь (и распаковать) этот файл из загрузчика bootmgr. Для выполнения извлечения и распаковки на просторах бескрайней Сети я нашел утилиту под названием bmzip, которую можно найти на странице автора тут. В моём случае распакованный файл bootmgr.exe занимал 523648 байт. А вот теперь то уже этот самый распакованный файл bootmgr.exe мы и попытаемся «подсунуть» дизассемблеру IDA
.
Выполнение кода bootmgr.exe начинается с основной процедуры модуля, носящей название BmMain. Процедура BmMain вызывает вложенную процедуру BlInitializeLibrary, которая предназначена для инициализации критических структур данных, таких как внутренние переменные, различные физические устройства компьютера. Эта процедура вызывает следующие подпрограммы:
- BlpArchInitialize — инициализация таблиц дескрипторов GDT, IDT и прч.
- BlpFwInitialize — инициализация микрокода (firmware);
- BlpTpmInitialize — инициализация TPM;
- BlpIoInitialize — инициализация файловых систем;
- BlpPltInitialize — инициализация шины PCI;
- BlBdInitialize — инициализация отладчика ядра;
- BlDisplayInitialize — инициализация консоли;
- BlpResourceInitialize — инициализация внутренней секции ресурсов .rsrc;
- BlNetInitialize — Инициализация сети;
Далее:
- на этапе окончания подготовки рабочей среды вызывается процедура BmpInitializeBootStatusDatalog: она записывает состояние загрузки в файл bootstat.dat.
- Исполняется BmpLogBootResolutions.
- Исполняется BlResourceFindXml, которая отвечает за поиск и распаковку файла bootmgr.xsl из ресурсной секции .rsrc. Заданный файл содержит параметры меню загрузки.
- Исполняется BlXmiInitialize: ожидает выбора пользователя (ввод с клавиатуры), либо инициализирует загрузку загрузочной записи, если она единственная.
- Исполняется BlImgQueryCodeIntegrityBootOptions: Проверяет корректность записей загрузки и загружаемых образов.
- Исполняется BmFwVerifySelfIntegrity: проверяет собственную целостность. Для отключения проверки целостности модулей используется функция ImgpValidateImageHash.
- Исполняется BinResumeFromHibernate: проверяет статус гибернации, если находит, то вызывает winresume.exe.
- Исполняется BlUtlRegisterProgressRoutine: процедура проверки/изменения этапа выполнения процесса загрузки.
- Исполняется BlUtlRegisterMulticastRoutine: процедура проверки/изменения этапа выполнения сетевой загрузки.
Функция BlXmiWrite тут вряд ли уместно приводить в составе основной логики функционирования bootmgr (поэтому я его и затенил на рисунке), поскольку это исключительно функция поддержки, которая парсит XML данные и выводит их на консоль.
- Исполняется BlGetBootOptionBoolean: загружает опции приложений из файла BCD.
- Исполняется BlGetBootOptionGuidList: получение списка GUID-идентификаторов из BCD;
- Исполняется BmpGetSelectedBootEntry: получение выбранной записи загрузки из BCD;
- Исполняется BmCloseDataStore: закрытие BCD-файла;
После определения [выбранной/заданной] записи загрузки вызывается процедура BmpLaunchBootEntry, которая и загружает образ, ассоциированный с записью. В основной ветке кода, на завершающей стадии работы, bootmgr.exe проводит загрузку, проверку целостности и передачу управления на модуль следующей стадии загрузки операционной системы — winload.exe.
Windows Boot Manager — загрузчик операционных систем Windows Vista/7/8/10. Естественно поддерживается EFI режим загрузки. И конечно же его можно использовать не только для загрузки Windows.
Для примера скриншот меню одной мультизагрузочной сборки, где в качетсве загрузчика использовался Windows Boot Manger.
Нет поддержки загрузки образов дисков, таких как ISO, IMG и т.д., но данный вопрос решается с помощью загрузчика Grub4Dos, который используется в качестве посредника.
Сам загрузчик состоит из записи MBR (используется только в режиме загрузки BIOS), исполняемого файла загрузчика bootmgr или bootmgfw.efi для EFI, и файла конфигурации BCD (Boot Configuration Data).
Скачать файлы bootmgr и bootmgr.efi, можно из самой операционной системы, по путям
C:\Windows\Boot\PCAT\bootmgr
и
C:\Windows\Boot\EFI\
bootmgfw.efi. Записать MBR на нужный диск можно будет в командной строке Windows, с помощью команды bootsect, или с помощью программы BOOTICE.
Создать и редактировать файл конфигурации BCD, можно либо через командную строку (команда bcdedit), либо более удобно, с помощью программы EasyBCD или BOOTICE.
BOOTMGR is missing в Windows 7 выходит такая ошибка при загрузке операционной системы, ничего не могу с ней поделать, исправляю так как написано везде, загружаюсь с установочного диска Windows 7, выбираю восстановление системы, далее командная строка, команды diskpart и list volume определяю буквы дисковода (D:) и системы (С:) пишу D: далее команда copy bootmgr c:\ и опять загрузится не могу, кошмар какой-то, спасайте люди. Антон.
BOOTMGR is missing в Windows 7
Никогда не догадаетесь как мы исправили ситуацию, дело в том что Антон всё делал правильно. Такая ошибка попадалась мне довольно часто и хочу сказать не всегда виноват удалённый или повреждённый загрузчик операционной системы.
Примечание: Друзья, если данная статья не поможет, попробуйте две другие наши статьи — Восстановление загрузчика Windows 7 и ошибка NTLDR is missing при загрузке Windows 7, в них описаны другие способы восстановления загрузки вашей операционной системы.
Присутствуют ещё несколько причин связанных с железом, к примеру часто на компьютере, который приносят на ремонт с данной неисправностью BOOTMGR is missing в Windows 7, слетают настройки вкладки Boot в BIOS. А это значит, что загрузчик живой и невредимый присутствует на диске с установленной Windows 7, но так как компьютер пытается загрузится не с нужного нам винчестера, мы получаем подобную ошибку. Да что говорить, давайте на конкретных примерах увидим как справится с данной неприятностью.
- Восстановление загрузчика Windows 7 с помощью восстановления запуска.
- Восстановление загрузчика bootmgr в Windows 7, с помощью командной строки.
- В конце статьи мы с вами решим проблему ошибки BOOTMGR is missing в Windows 7, путём изменения настроек в BIOS.
В первую очередь попробуем восстановить загрузчик Windows 7, для этого в самом начале загрузки нажмём клавишу F-8, должно появится меню Дополнительных вариантов загрузки,
в нём мы должны выбрать первый пункт Устранение неполадок компьютера. Если данного меню нет, значит у нас удалён скрытый раздел, содержащий среду восстановления Windows 7, в этом случае мы должны воспользоваться диском восстановления или установочным диском Windows 7. Производим загрузку с установочного диска семёрки, в начальной фазе загрузки компьютера, при появлении предложения загрузиться с диска «Press any key to boot from CD…», жмём на любую клавишу клавиатуры, иначе загрузки с диска не произойдёт
далее выбираем Восстановление системы
Происходит быстрый анализ проблем мешающих нормальной загрузке Windows 7, обнаруженные проблемы в параметрах загрузки этого компьютера среда восстановления предлагает исправить автоматически. Нажмите на «Исправить и перезапустить». В большинстве случаев, такие нехитрые действия приведут к тому, что загрузка Windows 7 будет восстановлена.
Если последующая загрузка Windows 7 также закончится неудачей, опять загрузитесь в среду восстановления и нажмите Далее
и выберите Восстановление запуска, Windows 7 запустит средство восстановления запуска и при обнаружении повреждённых файлов заменит их. Если номер не прошёл, читаем дальше.
Второй способ: в окне Параметры восстановления системы выбираем Командная строка,
Внимание: Чтобы вы лучше могли понять то, что я буду делать дальше, я покажу вам «Управления дисками» моей операционной системы.
Всё как обычно, файлы операционной системы находятся на диске C:, а вот видите этот скрытый раздел без буквы диска, объёмом 100 МБ Зарезервировано системой, так вот, именно в этом разделе хранятся все файлы загрузки Windows 7, в том числе и загрузчик операционной системы файл bootmgr, но его сейчас там нет или он повреждён, поэтому у нас с вами и выходит ошибка при загрузке «BOOTMGR is missing. Press Ctrl+Alt+Del to restart«.
Наша цель скопировать файл bootmgr с установочного диска Windows 7 именно в этот раздел. Давайте проделаем эту простую операцию, но сначала определимся с буквами дисков, так как у вас они могут быть другие.
Набираем в командной строке
diskpart
list volume
Как видим, в командной строке дисководу присвоена буква F:, а моему скрытому разделу Зарезервировано системой, объём 100 МБ, среда восстановления Windows 7 присвоила букву C: (файлы операционной системы с папками Windows и Program Files находятся на диске D:).
Вводим exit
и выходим из diskpart.
В командной строке водим F:, этой командой мы входим в установочный диск Windows 7.
copy bootmgr C:\ то есть копируем загрузчик bootmgr с установочного диска Windows 7 на скрытый раздел Зарезервировано системой C:. Вот и всё.
Перезагрузка и ошибка должна быть устранена.
Друзья, скрытый раздел «Зарезервировано системой» объём 100 МБ, не всегда создаётся при установке Windows 7, в редких случаях его может и не быть, в этом случае копируйте файл bootmgr прямо в корень диска с файлами операционной системы.
Если при копировании файла bootmgr у вас будет выходить ошибка о том, что у вас недостаточно прав, то попробуйте полностью перезаписать хранилище загрузки BCD.
В среде восстановления Windows 7 определитесь с буквами дисков.
Введите команду:
diskpart
далее
list volume
Дисководу присвоена буква F:, а скрытому разделу Зарезервировано системой, объём 100 МБ, среда восстановления Windows 7 присвоила букву C: . Значит файлы операционной системы с папками Windows и Program Files находятся на диске D:.
Вводим
exit
Водим команду
bcdboot.exe D:\Windows
Данная команда перезапишет всё хранилище загрузки BCD (содержимое папки Boot в разделе Зарезервировано системой) и файл bootmgr для Windows 7 находящейся на диске D:.
Успех. Файлы загрузки успешно созданы.
Если опять выдут какие-либо ошибки, то можно загрузиться с LiveCD и удалить всё содержимое скрытого раздела Зарезервировано системой, объём 100 МБ, а затем воссоздать заново уже известной вам командой.
Подробности в этой статье http://remontcompa.ru/421-ntldr-is-missing-v-windows-7.html.
Устранение ошибки BOOTMGR is missing в Windows 7 у нашего читателя. У Антона , как и у меня на компьютере три винчестера, только на одном из них установлена Windows 7, а значит компьютер должен производить загрузку именно с него. Зайдём в BIOS и посмотрим во вкладке BOOT, пункт Boot Device Priority
с нужного ли нам диска происходит загрузка, конечно нет, на первом месте стоит винчестер Western Digital,
на котором находятся только личные данные, а где хард MAXTOR с установленной Windows 7, давайте искать. Почему нарушились настройки в BIOS , причин много, например села батарейка CMOS или некорректно был выключен компьютер. Исправляем ошибку BOOTMGR is missing, нажимаем Esc на клавиатуре и идём во вкладку Hard Disk Drives
именно в ней при наличии нескольких жёстких дисков определяется тот, с которого компьютеру необходимо произвести загрузку операционной системы.
Выставляем на первое место винчестер MAXTOR
далее проверяем в пункте Boot Device Priority, сохраняем настройки и перезагружаемся.
Что ещё ещё можно предпринять при ошибке BOOTMGR is missing в Windows 7
Недавно один мой приятель принёс мне системный блок с жалобой на то что две установленные у него на разных жёстких дисках операционные системы Windows 7 и Windows 8 не загружаются выдавая при загрузке ошибку BOOTMGR is missing в Windows 7.
Пришлось загрузить компьютер с загрузочного диска Acronis Disk Director. Как видим имеются два жёстких диска, первый Диск 1 с установленной Windows 7, а второй Диск 2 с установленной Windows 8. Обратите внимание на два красных флажка, которыми помечены совсем не те разделы, которые нужно. Почему? Красный флажок означает то, что данный раздел активен и с него должна происходить загрузка операционной системы.
Ошибка в том, что у нас на обоих жёстких дисках должны быть отмечены красным флажком первые скрытые разделы System Reserved (Зарезервировано системой), то есть активными должны быть они. На Windows 7 объём такого раздела составляет 100 МБ, а на Windows 8 350 МБ, именно эти разделы носят атрибуты: Система. Активен и именно на этих разделах находятся файлы конфигурации хранилища загрузки (BCD) и файл менеджера загрузки системы (файл bootmgr). А у нас получается эти атрибуты носят другие разделы. Из-за этого Windows 7 и Windows 8 не загружаются.
Примечание: Сделать раздел активным можно с помощью командной строки (смотрите конец статьи), а можно программой Acronis Disk Director.
Что нужно сделать? Выбираем первый жёсткий Диск 1, щёлкаем на первом разделе System Reserved (Зарезервировано системой) правой мышью и выбираем «Отметить как активный»
Том «Зарезервировано системой» будет отмечен как активный. Нажимаем ОК.
То же самое делаем с Диском 2. Программа Acronis Disk Director работает в режиме отложенной операции, чтобы изменения вступили в силу нажимаем кнопку «Применить ожидающие операции»
Продолжить.
Как видим, после наших изменений активными стали те разделы которые нужно.
Выходим из программы и перезагружаемся. Результат работы положительный — поочерёдно загружаются обе операционные системы.
Как сделать раздел активным с помощью командной строки
В системе имеется один жёсткий диск.
Загружаемся в среду восстановления Windows 7 (как это сделать написано ранее в статье) и выбираю командную строку.
Делаем активным скрытый раздел System Reserved (Зарезервировано системой), объём 100 МБ.
DISKPART
list disk — выводятся все имеющиеся в системе жёсткие диски
sel disk 0 — выбираю единственный жёсткий диск 0
list partition — выводятся все имеющиеся разделы на жёстком диске
sel part 1 — выбираю раздел 1 — System Reserved (Зарезервировано системой), объём 100 МБ
active и раздел становится активным.
Введение
Возможно некоторые читатели помнят мою самую первую статью на ресурсе, посвященную загрузке Windows с VHD-образа. Возможно я бы и не вернулся к этой теме, если бы не нашлись люди, попытавшиеся повторить данную технологию на своих домашних машинах. Естественно, с реализацией этого решения возникли проблемы, касающиеся в основном тех ошибок, которые выплевывает bootmgr в тех случаях, когда ему что либо не нравится. Попытки интерпретации ошибок загрузки вроде 0xc03a0003 путем гугления к особо ценным результатам не приводят, а документация Microsoft на этот счет хранит многозначительное молчание. Возникла идея изучить процесс обработки VHD-образов, получив информацию из первых рук, то есть от самого загрузчика.
Если обратится к уже имеющейся в сети информации, то существует замечательный блог «Записки эникейщика о Windows» на страницах которого (раз, два и три) размещены, на мой взгляд, самые ценные сведения, по вопросам устройства bootmgr. Автор подробно рассмотрел процесс загрузки, включая исследования кода MBR и PBR, остановившись на структуре bootmbr, кратко описав происходящие при его работе процессы.
Мы же пойдем дальше — опишем инструментарий, который можно использовать для изучения устройства загрузчика и попытаемся разобраться с некоторыми, интересующими нас алгоритмами. Если такое предложение показалось кому-то интересным, милости прошу под кат
1. Достаем код Bootmgr из системы
Загрузчик Bootmgr появился в операционных системах семейства Windows начиная с Windows Vista. Причиной его разработки послужило то, что старый добрый ntldr, использовавшийся в линейке NT не мог загружать систему, на компьютерах с материнскими платами оснащенными UEFI, в те времена (2005 год) мало распространенными среди широкого круга рядовых пользователей.
По умолчанию, при штатной установке, этот загрузчик помещается в отдельный раздел, расположенный в начале HDD, с размером, достаточным для размещения самого bootmgr а так же файлов его конфигурации. Данный раздел не монтируется в обычном режиме работы системы и буква диска ему не присваивается. В системах с MBR создания этого раздела можно избежать, устанавливая Windows на предварительно размеченный и отформатированный HDD. В этом случае загрузчик помещается в тот же раздел, что и файлы ОС. Системы с EFI + GPT изначально требуют наличия такого раздела, имеющего тип 0xef и отформатированного в FAT.
Таким образом, первая наша задача — добыть bootmgr. Желательно взять его из системы, которая будет выступать в роли подопытной. Для этого установим ОС Windows на виртуальную машину. Это может быть и VirtualBox, и VMware, и QEMU — всё зависит от того, каким инструментарием виртуализации вы располагаете. Я преимущественно работаю в ОС Linux, буду в основном ориентироваться на инструменты применяемые там, хотя уделю внимание и Windows.
Итак, предположим у нас есть виртуальная машина (ВМ) с установленной на ней Windows 7 (x86). Разметка диска выполнена на основе MBR, система установлена в один раздел. Допустим это QEMU, диск на котором установлена подопытная имеет формат raw. то есть обыкновенный двоичный образ. Монтируем этот образ
$ sudo modprobe -r loop
$ sudo modprobe loop max_part=15
$ sudo losetup -f win7.hdd
$ sudo mount /dev/loop0p1 ~/virt-win
$ ls -l ~/virt-win
На смонтированном разделе мы увидим следующее содержимое
итого 5504541
-rwxrwxrwx 1 root root 24 июн 11 2009 autoexec.bat
drwxrwxrwx 1 root root 4096 май 21 09:08 Boot
-rwxrwxrwx 1 root root 391640 июл 21 2015 bootmgr
-rwxrwxrwx 1 root root 8192 май 21 09:08 BOOTSECT.BAK
-rwxrwxrwx 1 root root 10 июн 11 2009 config.sys
lrwxrwxrwx 2 root root 60 июл 14 2009 'Documents and Settings' -> /home/maisvendoo/virt-win/Users
-rwxrwxrwx 1 root root 2415517696 май 21 09:26 hiberfil.sys
-rwxrwxrwx 1 root root 3220692992 май 21 09:26 pagefile.sys
drwxrwxrwx 1 root root 0 июл 14 2009 PerfLogs
drwxrwxrwx 1 root root 4096 май 21 09:14 ProgramData
drwxrwxrwx 1 root root 4096 апр 12 2011 'Program Files'
drwxrwxrwx 1 root root 0 май 21 09:14 Recovery
drwxrwxrwx 1 root root 0 май 21 09:14 '$Recycle.Bin'
drwxrwxrwx 1 root root 4096 май 21 09:09 'System Volume Information'
drwxrwxrwx 1 root root 4096 май 21 09:14 Users
drwxrwxrwx 1 root root 16384 май 21 09:09 Windows
Для нас представляет интерес файл bootmgr. Однако, прежде нам нужен не совсем он, а 32-разрядный образ загрузчика bootmgr.exe, который находится в bootmgr в упакованном виде. Для его распаковки необходимо использовать утилиту bmzip, которая написана в общем-то для Windows (с наскока собрать её под Linux не вышло), поэтому распаковку выполним на виртуальной машине. Бинарную сборку этой утилиты, которая бы работала нормально оказалось довольно трудно найти, несмотря что тут дана ссылка на неё. В итоге, пакет был найден на каком-то из сайтов, посвященных кастомизации bootmgr. Для работы bmzip оказалась необходима библиотека MSCompression.dll. Готовый к работе пакет теперь можно скачать тут.
Создадим на диске ВМ папку utils и скопируем туда bmzip.exe вместе с MSCompression.dll. Отмонтируем образ и запустим ВМ. Запустим командную строку от имени администратора. Чтобы случайно не попортить загрузчик сделаем его копию
C:\ Windows\System32>cd c:\
C:\ xcopy bootmgr utils\bootmgr /h
Файл загрузчика является скрытым и системным, поэтому снимем с него эти атрибуты
C:\ cd utils
C:\ attrib -S -H /s
Распаковываем загрузчик
C:\ bmzip bootmgr bootmgr.exe
В итоге получаем распакованный образ bootmgr.exe
Выключаем ВМ и снова монтируем её диск в линуксе. Создадим какую-нибудь папку, где будем потрошить загрузчик дизассемблером и скопируем туда распакованный образ
$ mkdir -p ~/work/bootmgr/
$ cp ~/virt-win/utils/bootmgr.exe ~/work/bootmgr/
2. Дизассеблируем bootmgr.exe
Теперь скормим полученный «экзешник» дизассемблеру. Например IDA Pro. Запустим «иду» и откроем в ней добытый файл.
IDA верно идентифицирует файл как 32-разрядный исполняемый файл формата PE. Жмем ОК. Теперь, если в IDA Pro установлен плагин для работы с pdb-файлами, по ходу дизасеммблирования нам предложат загрузить отладочные символы, и не откуда нибудь, а сайта Microsoft.
Соглашаемся и получаем такую картину
Ага, слева мы видим прототипы функций, содержащихся в исследуемом файле, благодаря тому что согласились загрузить отладочные символы. Это очень сильно облегчит нам последующую работу. А пока определим точку входа в код загрузчика, и нетрудно догадаться что это будет функция BmMain(). Однако, не принимая это на веру жмем Ctrl + E
убеждаясь что наша догадка верна — BmMain() является точкой входа, расположенной по адресу 0x401000. Жмем ОК и перемещаемся на начало кода
Видим мы заголовок функции BmMain() с внушительным списком локальных переменных, и чуть ниже и сам код функции
Разобраться в мешанине ассемблерного кода довольно трудно, да и не зачем этого делать. Прежде всего определимся с тем, какие функции загрузчика мы хотим изучить. Я что-то там говорил о VHD? Ну так поищем среди кода что-нибудь, касающееся виртуальных дисков. Щелкаем правой кнопкой по списку функций слева и в вывалившемся контекстном меню выбираем «Quick filter» (или перейдя в окно с прототипами жмем Ctrl + F). В строке поиска набираем «vhd» и…
да, таковые функции имеются в количестве 33 штук. Среди них VhdOpen() очевидно будет отвечать за открытие виртуального диска, а вот например VhdiVerifyVhdFooter() как пить дать отвечает за проверку футера VHD-диска на корректность. То есть мы примерно представляем себе, куда будем ставить точки останова в отладчике. Кстати, поговорить об отладке самое время
3. Отладка Bootmgr на связке QEMU + IDA Pro
Запускаем виртуальную машину с ключами -s -S — это включает режим отладки
$ qemu-system-x86_64 ~/VM/qemu/win7-efi/win-x86.hdd -m 4096 -s -S
ВМ запускается и сразу же становится на паузу, ожидая подключения отладчика
Важно! Ни в коем разе не используйте ключ -enable-kvm применяющий аппаратную виртуализацию. При её использовании отладка в QEMU не работает.
Теперь на панели инструментов в IDA выбираем отладчик «Remote GDB debugger»
Ответив «Да» на несколько заданных нам вопросов получим окошко
где вобьем параметры соединения с ВМ: localhost на порту 1234. Жмем ОК. Нам сообщат, что некоторый процесс уже запущен и ожидает подключения отладчика — не хотим ли мы присоединится к нему? Конечно же ходим!
Поэтому отвечаем «Да» и…
мы встаем на паузу где-то в начала bios виртуальной машины. Великолепно, но теперь мы должны добраться до того места, где начинает выполнятся bootmgr. Ставим точку останова на функции BmMain(). Нажимаем на панели инструментов список точек останова, жмем Insert на клавиатуре и указываем на каком адресе мы хотим прервать выполнение кода и перейти в отладку
Вбиваем адрес 0x401000. Если же мы хотим поставить бряк на нужную нам функцию, то идем в главное меню и открываем в сеансе отладки список функций: View -> Open subviews -> Functions. В появившемся списке правой кнопкой мыши вызываем контекстное меню и выбираем Add breakpoint. Теперь жмем F9 и после недолгого ожидания попадаем в самое начало кода загрузчика
Теперь мы можем проходить код по шагам, смотреть значения регистров и стека, отслеживать стек вызовов и так далее. В какой-то степени отладчик, встроенный в IDA удобен и интуитивно понятен.
Возможно меня спросят — а можно ли использовать GDB? Можно, запускаем ВМ в режиме отладки, запускаем gdb в консоли
$ gdb -q
Подключаемся к удаленной сессии ВМ
(gdb) target remote localhost:1234
Включаем отображение дизассемблированных инструкций
(gdb) display/4i $pc
Если вас не устраивает синтаксис AT&T переключаемся на интел
(gdb) set disassembly-flavor intel
Ставим точку останова на BmMain() и запускаем исполнение
(gdb) b *0x401000
Breakpoint 1 at 0x401000
(gdb) c
Continuing.
Breakpoint 1, 0x00401000 in ?? ()
1: x/4i $pc
=> 0x401000: mov edi,edi
0x401002: push ebp
0x401003: mov ebp,esp
0x401005: and esp,0xfffffff8
(gdb)
Пожалуйста, мы видим почти тоже самое, что видели в IDA, располагая при этом всей мощью GDB. Почти, потому что тут мы не сумеем использовать отладочные символы от Microsoft, ибо GDB их не понимает. Но возможности GDB не в пример более широки, чем возможности IDA именно в плане процесса отладки и его автоматизации.
Однако, существует ещё одна возможность отладки, мимо которой пройти нельзя
3. Отладка на связке WinDbg + VirtualBox
Те, кто занимается разработкой драйверов для ОС Windows безусловно знакомы с этим замечательным отладчиком. Замечателен он тем, что имеет возможности сравнимые с возможностями линуксового GDB. Единственным его недостатком является жуткий способ настройки его интерфейса. Но мы опустим эти моменты, а обратимся к возможностям данного отладчика для решаемой нами задачи.
Итак, пускай на у нас имеется ВМ на основе VirtualBox. Создадим для этой ВМ COM-порт со следующими параметрами
Это виртуальный COM-порт, пробрасываемый в именованый канал. Для отладки через последовательный порт виртуальную машину следует настроить соответствующим образом. Загружаем её и запускаем консоль с административными правами. С ней вводим команды настройки загрузчика для отладки
c:\ Windows\system32> bcdedit /bootdebug {bootmgr} on
Эта команда включит возможность отладки загрузчика. Далее настроим порт для отладки
c:\ Windows\system32> bcdedit /dbgsettings serial debugport:1 baudrate:115200
Указываем, что мы используем COM1 со скоростью 115200 бод. Отлично, выключаем ВМ и запускаем отладчик.
Отладчик WinDbg можно скачать официально с сайта Microsoft вместе с комплектом для разработки драйверов. Однако у этой сборки отладчика есть проблема — глюк с отображением значений регистров. Поэтому я использую сборку, которая качается с того же сайта редмодовцев, на которую ведет ссылка из твитера некоего Доминика Вонга. В этой сборке данный баг отсутствует. Запускаем WinDbg следующей командой
c:\Wingdbx86> windbg -b -k com:pipe,port=\\.\pipe\com1,resets=0,reconnect
Откроем настройки интерфейса (File -> Open Workspace in File) в который среди прочих параметров сохранен путь http://msdl.microsoft.com/download/symbols для загрузки отладочных символов с серверов Microsoft. У меня этот путь заранее вбит в настройки (File -> Symbol File Path) и сохранен в теме для WinDbg. Такая настройка позволит нам автоматически получить отладочную информацию для загрузчика.
Теперь запустим ВМ. Практически сразу она встанет на паузу, а в окне отладчика мы увидим следующую картину
Ага, отладчик подключился к ВМ и встал на точке, любезно предоставленной нам майкрософтом. Ну что же, теперь нам доступны все возможности отладки с использованием windbg.
Однако мы останавливаемся не в самом начале кода загрузчика, а чуть дальше. Как показывает пошаговая отладка мы находимся как раз за функцией BlInitializeLibrary() которая обеспечивает начальную инициализацию оборудования
и, при отладке при помощи IDA мы сюда просто не попадаем. Таким образом, при отладке с WinDbg от нас ускользает часть действий bootmgr сразу после его запуска. В этом заключается недостаток использования стандартных средств отладки, предоставленных Microsoft. Однако, недоступный код мы всегда сможем исследовать отдельно с помощью IDA.
Теперь, в качестве примера, посмотрим на то, как bootmgr работает с образами VHD фиксированного размера.
4. Отлаживаем загрузку с VHD
Всё ниже следующее рассматривается на отладчике WinDbg, подключенном к ВМ на VirtualBox, но в равной степени справедливо и для других методов отладки, с учетом их особенностей. ВМ, используемая в данном примере содержит две системы: одна установлена на HDD, другая на VHD образ. Поставим точку останова на функции VhdOpen()
kd> bp VhdOpen
и нажмем F5. Отладчик встанет на указанной функции
Причем, внимание — мы ещё вообще не заходили в меню загрузки и не выбирали загрузку из VHD. А это означает, что проверка VHD происходит задолго до появления меню. Такое же поведение мы и наблюдаем, например если подсунем bootmgr пустой VHD. Меню загрузки нам вообще не покажут, а покажут ошибку с кодом 0xc000000F.
Проходим чуть дальше, нажимая F10 или вводя в комадной строке p и дойдем до вызова VhdiAllocateVhdData() — очевидно это создание в памяти некоторых структур для работы с образом
Чуть ниже расположен вызов VhdiVerifyAndInitializeVhd() — очевидно проверка корректности образа. Это показалось мне интересным и я пошел внутрь (F11)
Ниже, после некоторых подготовительных операций загрузчик читает последние 512 байт образа, в которых содержится так называемый «футер» образа, вызывая функцию VhdiReadVhdInformation(). Не надо ходить к гадалке, чтобы понять — функция возвратит указатель на структуру, содержащую данные футера. Как мне удалось выяснить, этот указатель, после вызова VhdiReadVhdInformation() оказывается в регистре ecx. Его значение равно 0x110098. Посмотрим на память по тому адресу
kd> db 0x110098
Команда читает память по указанному адресу, выводя её в окно отладчика в виде последовательности байт
00110098 63 6f 6e 65 63 74 69 78-00 00 00 02 00 00 01 00 conectix........
001100a8 ff ff ff ff ff ff ff ff-70 5e d3 1e 77 69 6e 20 ........p^..win
001100b8 00 06 00 01 57 69 32 6b-00 00 00 40 06 00 00 00 ....Wi2k...@....
001100c8 00 00 00 40 06 00 00 00-cb 2c 10 3f 02 00 00 00 ...@.....,.?....
001100d8 83 e6 ff ff 75 11 0a 5a-eb 03 c6 43 b9 c9 d6 df ....u..Z...C....
001100e8 24 b6 76 57 00 00 00 00-00 00 00 00 00 00 00 00 $.vW............
001100f8 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
00110108 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
Ага, мы видим знакомое слово — conectix. Это поле предваряет футер VHD образа, носит название cookie и хранит память о том, что Microsoft купила технологию VHD у фирмы Conectix, которая разработала данный формат виртуальных дисков для старых компьютеров Macintosh, Это несомненно футер VHD, мы можем видеть тут сигнатуру операционной системы в которой он был создан (Wi2k) а так же последовательность win указывает на то, что VHD создан средствами Windows. Да, все так и было. Пройдя чуть дальше мы натыкаемся на вызов VhdiVerifyVhdFooter() проверяющий формат футера. В качестве параметра он получает указатель на вышеописанную структуру, почему-то через регистр esi (???)
Этот участок кода интересовал меня больше всего, поэтому где-то с помощью IDA Pro, где-то руками, я преобразовал его в псевдокод на C
signed int __usercall VhdiVerifyVhdFooter(int footer)
{
signed int error_code; // Error code
int cur_checksum; // Actual checksum, writed in VHD
int calc_checksum; // Calculated checksum
int disk_type; // Disk type
int creator_host_os; // Creator host OS
// Error code
error_code = -1069940733; // 0xc03a0003
// Check cookie
if ( RtlCompareMemory((const void *)footer, "conectix", 8) == 8 )
{
// Store actual checksumm
cur_checksum = *(_DWORD *)(footer + 64);
// Write zero to checksum in footer structure
*(_DWORD *)(footer + 64) = 0;
// Calculate check summ
calc_checksum = BlUtlCheckSum(0x40001, 0, footer, 0x200);
// Restore checsum in footer
*(_DWORD *)(footer + 64) = cur_checksum;
// Checksum verify
if ( calc_checksum == cur_checksum )
{
// File type verify
if ( *(_WORD *)(footer + 14) == 1 )
{
// Check disk type
disk_type = *(_DWORD *)(footer + 60);
if ( disk_type == 2 || disk_type == 3 || disk_type == 4 )
{
// Check creator host OS
creator_host_os = *(_DWORD *)(footer + 36);
if ( creator_host_os != 1798465879 && creator_host_os )
{
error_code = -1073741637; // 0xc00000bb
} // Check disk size (by integer sectors count)
else if ( *(_DWORD *)(footer + 48) & 0x1FF || *(_DWORD *)(footer + 40) & 0x1FF )
{
error_code = -1069940718; // 0xc03a0012
}
else
{
error_code = 0;
}
}
else
{
error_code = -1069940732; // 0xc03a0004
}
}
else
{
error_code = -1069940731; // 0xc03a0005
}
}
else
{
error_code = -1069940734; // 0xc03a0002
}
}
return error_code;
}
Футер VHD можно представить в виде следующей структуры (в комментариях указаны смещения от её начала).
//-----------------------------------------------------------------------------
// VHD foother's data
//-----------------------------------------------------------------------------
struct vhd_footer_t
{
char cookie[8]; // +0
uint32_t features; // +8
uint32_t file_format_version; // +12
uint64_t data_offset; // +16
uint32_t time_stamp; // +24
char creator_application[4]; // +28
uint32_t creator_version; // +32
char creator_host_os[4]; // +36
uint64_t original_size; // +40
uint64_t current_size; // +48
vhd_disk_geometry_t disk_geometry; // +56
uint32_t disk_type; // +60
uint32_t checksum; // +64
vhd_uuid_t unique_id; // +68
uint8_t saved_state; // +84
uint8_t reserved[427];
};
Пользуясь этими данными можно сделать вывод о том, какие поля футера проверяет bootmgr и какие ошибки он выбрасывает. При корректном VHD образе данная функция возвращает ноль, в иных случаях расклад таков
0xc03a0003 - Неверный cookie
0xc03a0002 - Неверная контрольная сумма футера
0xc03a0005 - Неверная версия формата файла
0xc03a0004 - Неверный тип виртуального диска
0xc00000bb - Виртуальный диск создан не в Windows
0xc0300012 - Размер диска не кратен 512 (размер сектора в VHD)
Полученная мной информация решила спор возникший с коллегой по форуму, на котором обсуждалась методика загрузки Windows с VHD. Я его проиграл, считая что образы, созданные VirtualBox не будут грузится с помощью bootmgr. VirtualBox, создавая такие образы пишет все поля в соответствии со спецификацией Microsoft, кроме поля creator_application, куда записано win в оригинальном образе и vbox в случае с виртуалбоксом. Но это поле не проверяется bootmgr-ом, так что диски работают, а у меня они не работали по совсем другой причине, которая является предметом совсем другой истории…
Заключение
Возможно, статья несколько сумбурна. Но, она говорит о том, что горшки обжигают не боги, а отладка низкоуровневого кода Windows лишь дело техники. Интересующую вас информацию всегда можно получить, приложив к этому голову и руки. В этом тексте я попытался обобщить разрозненную информацию, собранную мной в сети по вопросам отладки bootmgr. Надеюсь что у меня это получилось, благодарю всех читателей за внимание и…
продолжение следует!
Все способы:
- Причины проблемы и способы её устранения
- Способ 1: «Восстановление запуска»
- Способ 2: Восстановление загрузчика
- Способ 3: Активизация раздела
- Вопросы и ответы: 4
Одной из самых печальных ситуаций, которая может возникнуть при включении компьютера, является появление ошибки «BOOTMGR is missing». Давайте разберемся, что делать, если вместо приветственного окна Виндовс вы увидели такое сообщение после запуска ПК на Виндовс 7.
Читайте также: Восстановление ОС в Виндовс 7
Причины проблемы и способы её устранения
Основным фактором возникновения ошибки «BOOTMGR is missing» является тот факт, что компьютер не может найти загрузчик ОС. Причиной этого может быть то, что загрузчик был удален, поврежден или перемещен. Также вероятна такая ситуация, что раздел HDD, на котором он расположен, был деактивирован или у него имеются повреждения.
Для решения указанной проблемы вы должны подготовить установочный диск/флэшку Виндовс 7 или LiveCD/USB.
Способ 1: «Восстановление запуска»
В области восстановления Виндовс 7 есть инструмент, который специально предназначен для решения подобных проблем. Он так и именуется – «Восстановление запуска».
- Запустите компьютер и немедленно после сигнала запуска BIOS, не дожидаясь, когда отобразиться ошибка «BOOTMGR is missing», зажмите клавишу F8.
- Произойдет переход в оболочку выбора вида запуска. С помощью кнопок «Вниз» и «Вверх» на клавиатуре произведите выбор варианта «Устранение неполадок…». Выполнив это, жмите Enter.
Если открыть таким способом оболочку выбора вида загрузки не получилось, то запуститесь с установочного диска.
- После перехода по пункту «Устранение неполадок…» запустится область восстановления. Из перечня предложенных инструментов выбирайте самый первый — «Восстановление запуска». Затем осуществите нажатие по кнопке Enter.
- Запустится процедура восстановления запуска. По её окончании произойдет перезагрузка компьютера и ОС Виндовс должна запуститься.
Урок: Решение проблем с загрузкой Виндовс 7
Способ 2: Восстановление загрузчика
Одной из первопричин возникновения изучаемой ошибки может являться наличие повреждений в загрузочной записи. Тогда её требуется восстановить из области восстановления.
- Активируйте область восстановления, нажав при попытке активации системы F8 или запустившись с установочного диска. Из перечня выбирайте позицию «Командная строка» и щелкайте Enter.
- Запустится «Командная строка». Вбейте в нее следующее:
Bootrec.exe /FixMbr
Сделайте щелчок по Enter.
- Введите другую команду:
Bootrec.exe /FixBoot
Нажмите снова Enter.
- Операции по перезаписи MBR и созданию загрузочного сектора выполнены. Теперь, чтобы завершить работу утилиты Bootrec.exe, вбейте в «Командную строку» выражение:
exit
После его ввода жмите Enter.
- Далее произведите перезагрузку ПК и если проблема возникновения ошибки была связана с повреждением загрузочной записи, то она должна исчезнуть.
Урок: Восстановление загрузчика в Виндовс 7
Способ 3: Активизация раздела
Тот раздел, с которого производится загрузка, должен быть помечен, как активный. Если по какой-то причине он стал неактивным, это как раз и ведет к возникновению ошибки «BOOTMGR is missing». Давайте попробуем разобраться, как исправить данную ситуацию.
- Данная проблема, как и предыдущая, тоже полностью решается из-под «Командной строки». Но перед тем как произвести активизацию раздела, на котором расположена ОС, нужно выяснить, какое он имеет системное имя. К сожалению, это наименование не всегда соответствует тому, что отображается в «Проводнике». Запустите «Командную строку» из среды восстановления и введите в неё следующую команду:
diskpart
Щелкайте по кнопке Enter.
- Произойдет запуск утилиты Diskpart, с помощью которой мы и определим системное наименование раздела. Для этого введите такую команду:
list disk
Затем нажмите клавишу Enter.
- Откроется список подсоединенных к ПК физических носителей информации с их системным наименованием. В столбце «Диск» будут отображены системные номера подключенных к компьютеру HDD. Если у вас только один диск, то будет отображено одно наименование. Найдите номер того дискового устройства, на котором установлена система.
- Для того чтобы выбрать нужный физический диск, введите команду по такому шаблону:
select disk №
Вместо символа «№» подставьте в команду номер того физического диска, на котором установлена система, а затем нажимайте Enter.
- Теперь нам нужно узнать номер раздела того HDD, на котором стоит ОС. Для этой цели введите команду:
list partition
После ввода, как всегда, применяйте Enter.
- Откроется перечень разделов выбранного диска с их системными номерами. Как же определить, на каком из них стоит Виндовс, ведь мы привыкли видеть наименование разделов в «Проводнике» в буквенном виде, а не в цифровом. Для этого достаточно помнить приблизительный размер своего системного раздела. Найдите в «Командной строке» раздел с таким же размером – он и будет системным.
- Далее введите команду по следующему шаблону:
select partition №
Вместо символа «№» вставьте номер того раздела, который требуется сделать активным. После ввода жмите Enter.
- Раздел будет выбран. Далее для активации просто введите такую команду:
active
Щелкайте по кнопке Enter.
- Теперь системный диск стал активным. Для завершения работы с утилитой Diskpart наберите такую команду:
exit
- Выполните перезапуск ПК, после которого система должна активироваться в стандартном режиме.
Если вы запускаете ПК не через установочный диск, а применяете для исправления проблемы LiveCD/USB, активировать раздел гораздо проще.
- После загрузки системы откройте «Пуск» и перейдите в «Панель управления».
- Далее откройте раздел «Система и безопасность».
- Зайдите в следующий раздел – «Администрирование».
- В перечне инструментов ОС остановите выбор на варианте «Управление компьютером».
- Запускается набор утилит «Управление компьютером». В левом его блоке выполните щелчок по позиции «Управление дисками».
- Отобразится интерфейс инструмента, который позволяет управлять дисковыми устройствами, подключенными к компьютеру. В центральной части отображаются наименования разделов подсоединенных к ПК HDD. Щелкайте правой кнопкой мышки по имени того раздела, на котором находится Виндовс. В меню выберите пункт «Сделать раздел активным».
- После этого произведите перезагрузку компьютера, но в этот раз попытайтесь загрузиться не через LiveCD/USB, а в стандартном режиме, используя установленную на жестком диске ОС. Если проблема с возникновением ошибки состояла только в неактивном разделе, запуск должен пройти нормально.
Урок: Инструмент «Управление дисками» в Виндовс 7
Существует несколько рабочих способов устранения ошибки «BOOTMGR is missing» при загрузке системы. Какой из вариантов действий выбрать, в первую очередь, зависит от причины возникновения проблемы: повреждение загрузчика, деактивация системного раздела диска или наличие других факторов. Также алгоритм действий зависит от того, какой именно инструмент у вас есть для восстановления работоспособности ОС: установочный диск Виндовс или LiveCD/USB. Впрочем, в отдельных случаях получается войти среду восстановления для устранения ошибки и без этих средств.
Наша группа в TelegramПолезные советы и помощь