Причины возникновения ошибки BOOTMGR is missing
Ошибка Bootmgr is missing связана напрямую с загрузчиком операционной системы, такой небольшой программкой, которая выполняет запуск остальных программ Windows. Иногда, случается так, что по каким-либо причинам BIOS не может найти эту программу, вследствие чего дальнейшая загрузка ОС невозможна и на экран выводится сообщение об ошибке. Причин этому может быть очень много: не корректное выключением компьютера, или настройкой БИОС, повреждением жесткого диска, или даже из-за вредоносной программы.
Для решения этой проблемы, необходимо испробовать несколько вариантов:
- Проверьте настройки в BIOS, возможно у вас выбрано неверное загрузочное устройство;
- Если в БИОСе все выставлено верно, необходимы провести восстановление загрузчика bootmgr. Это проводится в автоматическом режиме;
- Возможно наличие ошибки BOOTMGR is missing, которую можно исправить с помощью обычной командной строки.
Проверяем загрузочные устройства BIOS
Данный шаг выполняется только в том случае, если на вашем персональном компьютере имеется больше одного жесткого диска. Стоит заметить, что говорится именно о «винчестерах», а не разделах на диске, типа С, D, Е и т.п. В противном случае, вы просто пропускаете данный шаг. Если вы пользуетесь загрузочными флешками, то стоит убедиться, что они не подключены к компьютеру. Очень часто бывает, что загрузка происходит с неверного жесткого диска. В этом пунктике нам необходимо выбрать в БИОСе нужный диск и выполнить загрузку с него. В связи с тем, что оболочка BIOS может отличаться у разных производителей, я посвятил этой настройке отдельную, емкую статью.
Исправляем автоматически «BOOTMGR is missing»
Разработчики из компании Microsoft, наконец-таки разработали специально для, так называемою среду восстановления, позволяющую решить проблемы, возникающие при использовании ее ОС. Для запуска данной среды необходимо до непосредственного появления ошибки нажимать кнопку «F8», до того момента, пока на дисплее не возникнет меню на темном фоне.
В случае, если меню так и не появится — необходимо будет искать специальный установочный диск или флеш карту с системой Windows 7, также можно использовать диск восстановления. Загружаем файлы с этого диска или карты, при этом не забываем о том, что необходимо нажать какую угодно клавишу, в случае, если высветится надпись «Press any key to boot from CD or DVD» на черном фоне. В противном случае установка будет выполнена с жесткого диска, и вы снова будете видеть ту ошибку, с которой столкнулись. Выбираем пунктик «Восстановление системы» в самом низу.
Специальная утилита восстановления попробует провести полную диагностику вашей системы и выявить ошибки на подобии Bootmgr is missing, мешающие работе. Пользователю же остается лишь принять предложенные исправления и перезапустить компьютер.
Если никаких видимых изменений не произошло, и проблема с ошибкой остается, нужно будет еще раз загрузить установочный диск, затем выбрать пункт «Восстановление системы» и в списке доступных ОС попросту выбрать кнопку «Далее».
Нажимаем на пункт «Восстановление запуска».
Если все получилось удачно, тогда вас можно поздравить. Неисправность в виде BOOTMGR is missing можно считать побежденной!
Как решить проблему загрузчика посредством командной строки?
Данный процесс можно считать более эффективным, но и одновременно более трудоемким. Как и в предыдущем варианте для начала вам нужно будет загрузить, так называемую среду восстановления, но не выбирайте пункт «Восстановление запуска», а нажмите на вкладку «Командная строка».
Чтобы понять, в чем же тут дело, вам стоит знать, что при установке Windows система автоматически создает специальный 100мб раздел, который резервируется под потребности самой системы. При запуске системы вам не удастся увидеть его символы вроде букв C и D. Но, этот диск играет немаловажную роль, так как на нем лежит специальный файл, а точнее мини-программа bootmgr, необходимая для запуска системы. Если же фал ломается или по какой-то причине не выполняет необходимых функций, тогда и возникает ошибка «BOOTMGR is missing. Press Ctrl Alt Del to restart». И вот тут-то вашей задачей является восстановление данного фала, путем копирования его с установочной карты или диска.
И вот тут-то нам поможет черное окно, запущенное вами, которое и называется командной строкой. В зависимости от конфигурации и кучи других параметров на разных ПК буквы дисков могут отличаться друг от друга, и необходимо будет определиться с какого диска, и на какой вам нудно будет копировать файл.
Проверить, какой именно это диск, можно посредством набора команды:
Смотрите на раздел размер, которого 100мб и определяете: какая именно буква ему присвоена.
Далее вам нужно будет ввести команды:
1. Выход из программы diskpart:
2. Переход на букву CD-ROM’а, для начала вы должны определить, какая буква присвоена этому разделу:
И последним этапом — копируете файл bootmgr на диск, объем которого 100мб:
Как следствие на экране вашего ПК должна появиться надпись, говорящая о том, что один файл скопирован успешно.
Бывают случаи, когда при установке системы на заранее разбитый на части диск вы не сможете найти или вычислить диск объем, которого 100 мб. Тогда вам просто нужно будет скопировать файл bootmgr прямо в корень диска с данными системы. Если вы не хотите морочить себе голову определением того, на каком же именно диске установлена ваша система, попросту скопируйте фал на все диски. На примере это может выглядеть следующим образом:
Перезагружаете, свой ПК и проверяете результат. Сели его нет, то вам нужно ввести следующую команду:
Снова перезагружаете компьютер. Если же ошибка BOOTMGR is missing так и не исчезла, тогда остается лишь один возможный вариант – как «Активный» помечен не верный диск или же раздел.
Как из командной строки сделать диск активным
Важно то, что загрузочный раздел с системой должен помимо содержащегося в нем файла bootmgr быть еще с меткой «Активный», тоисть с которого будет возможна загрузка. Как уже знаем, в случаи ошибочной маркировки диска результат будет печальным.
Делаем данное решение все также из обычной командной строки:
В окошке вы будете наблюдать пронумерованный список жестких дисков, которые подключены к системе. Далее ориентируясь по объему, выбираете диск с установленной операционкой. Когда у вас один не поделенный на разделы диск, соответственно ничего гадать не надо. Вводим следующую команду:
цифры 0 и 1 это номера разделов дисков. После этого, введите в строку команду для вывода имеющихся разделов выбранного диска:
Ищем в списке раздел объемом 100 мб, а если у вас установлена ОС Windows 8, то искать нужно раздел объемом 350 мб. Бывает случаи, что такого раздела нет в списке имеющихся, тогда нужно выбрать первый или второй, в зависимости на какой локальный диск С:\ или D:\ установлена система. Далее с помощью команды выбираете номер раздела:
и делаем раздел активным:
После ввода команды «active», появится надпись, говорящая о том, что раздел стал активный и делаем перезагрузку ПК.
В случаи не устранения ошибки с помощью вышеперечисленных методов, возможно, вам поможет статья об ошибке NTLDR is missing. Эти две распространенные ошибки, между собой очень похожи, и возможно действия, предпринятые по решению проблемы с NTLDR is missing, будут полезны для устранения этой проблемы.
Исправление «BOOTMGR is missing» в Windows 7/10
Одна из самых неприятных, и при этом очень распространённая ошибка, которую можно наблюдать на компьютерах с Windows 7/8/10 – «BOOTMGR is missing Press Ctrl Alt Del to restart». Означает это только одно – не найден загрузчик операционной системы. Не стоит паниковать, компьютер не сломался, просто нужно проделать кое-какие действия чтобы решить проблему.
Для общего понимания ситуации расскажу что случилось. При включении компьютера происходит поиск на жёстком диске мини-программы, которая знает как загрузить операционную систему. Вот эта мини-программа оказывается недоступной или повреждённой. Проблема может появиться по разным причинам: сбой напряжения в электросети, неправильное выключение компьютера, неграмотные манипуляции в BIOS, вирус наконец.
Будем идти от простого к сложному. Итак, возможные пути решения:
- Проверить, правильный ли выбран загрузочный диск в БИОСе
- Восстановление загрузчика Windows – bootmgr в автоматическом режиме
- Исправление ошибки BOOTMGR is missing с помощью командной строки
Автоматическое исправление «BOOTMGR is missing» в Windows 7/10
Нам повезло, Microsoft разработали специальную среду восстановления, из которой можно порешать многие проблемы с операционкой. Чтобы её запустить в Windows 7, нужно до появления ошибки всё время нажимать кнопку «F8» пока не появится меню на чёрном фоне:
Если этого не произойдёт или у вас Windows 8.1/10, то придётся искать диск восстановления или установочный диск с вашей версией Windows (флешка с установкой тоже подойдёт). Загружаемся с этого диска или флешки. Не забудьте нажать ЛЮБУЮ кнопку если появится надпись на чёрном фоне «Press any key to boot from CD or DVD», иначе загрузка пойдёт с жёсткого диска и вы снова увидите свою ошибку. Вместо установки выбираем в самом низу «Восстановление системы»
Утилита восстановления проведёт диагностику жёсткого диска и постарается автоматически определить возможные проблемы. Нам остаётся только принять исправления и перезапуститься
Если ничего не изменилось, то придётся ещё раз загрузиться с установочного диска, выбрать «Восстановление системы» и на списке доступных операционных систем нажать «Далее»
Кликаем по «Восстановление запуска»
Если всё прошло гладко, то можете радоваться – ошибка BOOTMGR is missing исправлена!
Решение проблемы загрузчика с помощью командной строки
Это более трудоёмкий процесс, но эффективный. Вам нужно также загрузить среду восстановления, но в этот раз выбрать не «Восстановление запуска», а «Командная строка»
Тут вот в чём дело. Обычно, при установке Windows создаётся специальный скрытый раздел размером 100-300Мб и резервируется системой. При загруженной Windows он не имеет буквы, например как C, D и т.д. Но на этом разделе лежит мини-программа для загрузки операционной системы и должен быть файл bootmgr. Если он «ломается» или пропадает, то возникает эта самая ошибка «BOOTMGR is missing. Press Ctrl Alt Del to restart». Наша задача – восстановить файл, скопировав его с установочного диска.
Проделать эту операцию нам как раз таки и поможет командная строка – чёрное окно, которое вы уже запустили. Для начала давайте определимся с какого диска и на какой нужно копировать файл, т.к. в зависимости от конфигурации и бог знает чего ещё, буквы дисков могут различаться на разных компьютерах.
Набираем в командной строке команду:
Следом за приветствием набираем вторую команду:
list volume
Смотрим на раздел объёмом 100-300Мб – ему присвоена буква «C», а CD/DVD-ROM находится под буквой «F». Под буквами «D» и «E» — диски с моими данными.
Теперь вводим последовательно команды:
1. Выходим из программы diskpart
2. Переходим на букву CD-ROM’а, в моём случае это «F»
3. Копируем файл bootmgr на диск объёмом 100Мб, в моём случае это диск «C»
copy bootmgr C:\
Вы должны увидеть сообщение, что успешно скопирован один файл. Если пишет «Отказано в доступе» или «Access denied», то это значит что такой файл уже существует. Т.е., тогда сначала его нужно удалить командой «del», но скорей всего проблема вообще в другом.
Ещё иногда, при установке Windows на заранее разбитый на разделы диск вы не найдёте скрытого раздела размером 100Мб. В этом случае копируйте файл bootmgr прямо в корень на диски с данными. Чтобы не усложнять себе жизнь определением на каком из дисков находятся файлы операционной системы, копируем файл на все диски. В моём примере это диски D и E, т.е. это будут две команды:
copy bootmgr D:\
copy bootmgr E:\
Перезагружаемся и смотрим. Никак? Опять открываем командную строку и вводим одну команду:
bootsect /nt60 All
Перезагружаемся. Если ошибка «BOOTMGR is missing» не пропала, то остаётся только один вариант – не тот диск или раздел не помечен как «Активный».
Как сделать диск «Активным» из командной строки
Дело в том, что раздел с загрузчиком ОС должен не только содержать файл bootmgr, но и быть ещё помечен как «Активный», т.е. с которого возможна загрузка в принципе. Когда помечен не тот диск мы получаем печально известный результат. Решается всё также из командной строки. Итак, вводим команды:
list disk
Вы увидите список из пронумерованных физических жёстких дисков, имеющихся в системе. Выберите диск с операционной системой, например ориентируясь по его размеру. Если у вас только один физический диск, то его и выбирайте. Делается это командой:
select disk 0 или 1
где 0 или 1 это номер нужного диска. Далее вводим команду для получения списка разделов данного диска:
list partition
Нужно найти тот самый раздел на 100-300Мб. Данный приём работает и для Windows 8/10, в этом случае раздел нужно искать на 350Мб. Если у вас таких разделов нет, значит выбираем первый или второй раздел, смотря на какой диск C: или D: у вас была установлена операционная система соответственно. Теперь выбираем командой с номером раздела:
select partition 1 или 2
и делаем раздел активным:
Перед командой «exit» должно быть сообщение, типа «Раздел помечен как активный». Перезагружаемся.
Если ошибку так и не удалось побороть описанными здесь методами, то почитайте про решение проблемы NTLDR is missing в Windows XP. Эти ошибки очень похожи и советы оттуда могут пригодиться.
Подведём итоги
Итак, чтобы побороть ошибку «BOOTMGR is missing. Press Ctrl Alt Del to restart» нужно восстанавливать загрузчик Windows 7-10, в частности файл bootmgr. Средство восстановления от Microsoft умеет это делать в автоматическом режиме, а если ничего не получается то в нашем распоряжении есть командная строка. В других случаях, особенно когда установлено два и более жёстких диска, нужно просто проверить настройки БИОСа. В редких случаях выбран «активным» не тот диск.
Напишу я вам сейчас свое решение данной проблемы, при том буквально в несколько кликов и всего за 20 минут.
На компьютере была установлена ОС Windows 7, но ее ставил кто то до меня, по этому наплодил аж целых 4 локальных диска, при том два из них удивительным образом занимали три и четыре гигабайта, я не понимаю зачем это кому то нужно было, но моей задачей было под готовой ОС соединить все разделы, и сделать с 4-ех разделов, два.
После приколов с «Acronis» (это отдельная история про которую я возможно расскажу в следующих статьях), сейчас я разбиваю диски только с инсталлятора Windows, это и безопасней, и на много снижается риск того, что система после разбития дисков, выдаст вам ошибку.
Загрузился с диска ОС Windows, выбрал ОС которая мне нужна, и приступил к удалению разделов.
Всего под оболочкой установки ОС у меня показывало пять разделов.
1. Диск «С» на котором хранится Windows;
2. Диск «D» на котором была вся информация;
3. Диск «E», который занимает 3 ггб;
4. Диск «F», который занимает 4 ггб;
5. Диск «G», диск который по умолчанию создает Windows 7, для нормальной загрузки системы, и без которого система не будет работать (занимает около 200 мб.);
Увидев это разнообразие локальных дисков, я начал чистить разделы, которые занимают меньше всего, и случайным образом отформатировал диск «G». Понятное дело, что после перезагрузки у меня начало выдавать это заветное сообщение: «BOOTMGR is missing».
Далее распишу все пошагово, что бы вы поняли, как же все таки я это исправил:
1. Загружаемся с диска, все с той же ОС Windows 7.
2. Выбираем язык русский, и вместо кнопки «установить», нажимаем на кнопку: «Восстановление системы»:
3. Выбираем в меню строку: «Восстановление запуска»:
4. Выбираем «Восстановление компьютера с помощью созданного ранее образа системы», на что нам сразу же выдаёт окошко, в котором нам нужно нажать: «Исправить и перезапустить»:
5. Windows запускает программу восстановления запуска, и после перезагрузки Windows запускается без всяких проблем.
Второе решение данной проблемы:
Для начала проделываем те же два пункта (см. п.1, п.2), что и в первом решении проблемы и после этого:
3. Выбираем в меню строку «Командная строка»:
4. Далее открывается черное окно «командной строки», куда мы вводим сообщение «diskpаrt»:
5. Вводим команду «list vоlumе», и смотрим, где у нас дисковод, к примеру: у меня G, а ОС располагается в разделе F:
6. Вводим «еxit» и выходим из «diskpаrt». Далее набираем букву нашего дисковода, в данном случае «G»:
7. Вводим команду cоpy boоtmgr F:\, что означает, что мы копируем загрузчик с установочного диска Windоws 7 в раздел с операционной системой в раздел «F»:
8. Если все правильно сделали, нам показывается сообщение о том, что файл скопирован:
>
Изучаем Bootmgr. Часть 1 — инструментарий и основные принципы отладки начальных этапов загрузки ОС Windows
Введение
Возможно некоторые читатели помнят мою самую первую статью на ресурсе, посвященную загрузке 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) в который среди прочих параметров сохранен путь https://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; // +0 uint32_t features; // +8 uint32_t file_format_version; // +12 uint64_t data_offset; // +16 uint32_t time_stamp; // +24 char creator_application; // +28 uint32_t creator_version; // +32 char creator_host_os; // +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; };
Пользуясь этими данными можно сделать вывод о том, какие поля футера проверяет 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. Надеюсь что у меня это получилось, благодарю всех читателей за внимание и…
продолжение следует!
Bootmgr is missing press Ctrl+Alt+Del to restart windows 7. Что делать ?
Большинство пользователей уже не раз встречались с ошибкой bootmgr is missing. При ее возникновении, операционная система Windows вместо того, чтобы загрузиться, поприветствует вас черным экраном с текстом bootmgr is missing press ctrl+alt+del to restart. Многие пользователи впадают в панику и несут свой компьютер мастеру, который предлагает переустановить систему за немаленькие деньги или же выставляет неплохой счет за ремонт комплектующих компьютера. Мы же с вами попробуем решить проблему самостоятельно без переустановки Windows. И если ничего не поможет, то тогда вам дорога в сервисный центр. Давайте рассмотрим все по порядку.
Windows Boot Manager что это?
Windows Boot Manager – специальный менеджер загрузки операционной системы, расположенный в самом маленьком системном разделе, который недоступен для просмотра и редактирования пользователем.
Менеджер загрузки контролирует запуск операционной системы от начала до конца. В его функцию входит запуск важного файла winload.exe, который отвечает за начало загрузки Windows. Использовать BOOTMGR, разработчики компании Microsoft начали со времен Windows Vista, и продолжили его использование в более новых версиях.
Этап появления ошибки bootmgr is missing press Сtrl+Alt+Del to restart
Как я уже говорил выше, ошибка появляется на начальном этапе включения компьютера. В то время, как BIOS не смог найти специальный файл загрузки. При этом прекращается запуск операционной системы и компьютер выводит ошибку на черном фоне BOOTMGR is missing «Нажмите Ctrl+Alt+Del для перезагрузки»
Чаще всего, такую ошибку компьютер выдает из-за серьезной проблемы, и простой перезагрузкой исправить ее не получится. Ошибка будет появляться снова.
Основные причины появления ошибки менеджера загрузки.
Причин появления ошибки «BOOTMGR is missing в Windows 7» множество. Давайте рассмотрим самые распространенные:
- Проблемы в работе жесткого диска компьютера: очень часто, появление сбойных секторов в области диска, где находится файл загрузки приводит к отказу загрузки ОС;
- Повреждение системных файлов Windows 7 : происходит в следствии заражения компьютера вирусами или неправильной работы пользователя;
- Повреждение загрузочной информация на HDD;
- Неправильные настройки BIOS: cбился приоритет загрузки жестких дисков в биос.
Способы устранения ошибки bootmgr.
Проверяем настройки Bios.
Давайте рассмотрим самый простой вариант, решения нашей проблемы. Первым делом, необходимо проверить, не сбились ли настройки очередности загрузки жестких дисков.
Рассмотрим пример: Если на компьютере установлен не один жесткий диск, но при этом операционная система расположена только на одном из них. То бывают случаи, когда сбиваются настройки BIOS и меняется очередность дисков, которые система использует для загрузки. Если первым в список попадет диск без ОС, то система будет думать, что загрузчик поврежден или отсутствует. Из-за этого сразу вывалится ошибка.
Для того, чтобы исключить этот вариант заходим в BIOS материнской платы (зайти можно по нажатию клавиш Del, F2 или других сочетаний). Если стандартные клавиши не подходят, то можно посмотреть какие кнопки жать в руководстве по эксплуатации к материнской плате.
После того, как зашли в БИОС, ищем раздел «BOOT»
Далее ищем пункт «Hard Disk Drive Priorities», если у вас графическое меню в БИОС, то переведите язык интерфейса на русский и ищите пункт «Загрузка».
В открывшемся окне выставляем правильную очередность загрузки винчестеров. Самым первым нужно поставить диск, на котором расположена операционная система. Так же проверьте, не вставлена ли в системный блок загрузочная флешка. Если есть, извлеките её.
Используем средства восстановления Windows.
Если после проверки настроек BIOS не удалось решить нашу проблему, то пробуем загрузить средство восстановления Windows 7. Для этого, после того, как нажали кнопку включения компьютера и до появлении ошибки bootmgr is missing жмем на кнопку F8 для загрузки дополнительных параметров Windows.
Если все сделали правильно, то должно загрузиться окно с вариантами запуска системы.
Нас интересует пункт «Устранение неполадок Windows». После нажатия клавиши «Enter» специальная утилита выполнит поиск неисправностей и возможно устранит нашу проблему.
Важно! Бывают случаи, когда в меню дополнительных параметров нет пункта «Устранение неполадок компьютера». Это происходит из-за серьезного повреждения области загрузки или же из-за проблем с загрузочной записью.
Соответственно данный способ нам с вами не подойдет, поэтому переходим к другим вариантам.
Устраняем проблему с использованием загрузочного диска или флешки с Windows 7.
При помощи, имеющейся загрузочной флешки, можно легко восстановить загрузчик Windows c помощью встроенного инструментария исправления проблем.
Для того, чтобы загрузить операционную систему с загрузочного носителя, нужно зайти в BIOS. В разделе «Boot» выставить первым по списку загрузку с флешки или привода DVD дисков.
Далее, сохраняем настройки, нажав клавишу F10 и перезагружаем компьютер. Если все сделали правильно, то на экране увидите надпись «Press any key…» (нажмите любую кнопку).
Откроется окно «Параметры восстановления системы».
Нам нужно перейти в пункт «Восстановление запуска». Далее система выполнит поиск проблем и предложит их исправить и перезагрузить компьютер.
Обратите внимание! После перезагрузки компьютера, не забудьте извлечь загрузочный носитель. Иначе система снова начнет загружаться с него.
Восстанавливаем BOOTMGR при помощи командной строки.
Начало действий в данном способе, схожи с предыдущими, но теперь в окне «Параметры восстановления» нужно открыть пункт «Командная строка». Находится он в самом низу.
После запуска командной строки попробуем восстановить маленький системный раздел , в котором лежит файл Windows Boot Manager.
Для этого прописываем команду «diskpart» и жмем «Enter»
Далее пишем «list volume» и смотрим какая буква присвоена самому маленькому разделу (размер раздела примерно 100 Мб), а так же какая буква присвоена нашему загрузочному диску.
После, выходим из меню «diskpart» прописав «exit». Следующим шагом, открываем наш загрузочный диск. Пишем «M:» или другую букву, в зависимости какая у вас присвоена диску.
После пишем команду сopy bootmgr C:\ . Таким образом мы скопируем загрузочный файл на системный диск. Проблема должна решиться.
Проверяем жесткий диск на ошибки.
Если проблему вышеописанными способами решить не удалось, то нужно проверить жесткий диск на ошибки. Проверку можно провести разными способами. При наличии под рукой другого компьютер, отцепляем жесткий диск с не загружающейся системой и подключаем к рабочему компьютеру. Далее запускаем программу Victoria, и выполняем проверку диска на ошибки. Как работает программа Victoria вы можете прочитать в статье – Как проверить на исправность жесткий диск.
Если подключить винчестер к другому компьютеру нет возможности. То можно запуститься с Windows Life CD и уже с него проверить диск на ошибки.
Использование стороннего ПО.
Ошибку bootmgr is missing можно исправить при помощи специальной программы Acronis Disk Director. Запустить ее можно так же при помощи Live CD. Но пользоваться данной программой нужно в крайних случаях, так как можно вообще остаться без данных на жестком диске.
Заключение.
Мы с вами рассмотрели самые популярные способы решение проблемы появления ошибки bootmgr is missing press ctrl alt del to restart windows 7. В большинстве случаев получается восстановить работу операционной системы без ее полной переустановки, а так же без обращения в сервисный центр.
Понравилась статья? Поделись с друзьями!