Редактирование меню загрузки Windows 7
В новых операционных системах Microsoft, начиная от Windows Vista, для хранения меню загрузки используется изменённый механизм. Теперь его нельзя отредактировать с помощью Блокнота, поскольку файл boot.ini, в котором ранее хранились все данные, просто отсутствует. Для изменения загрузочного меню Windows 7 / 10 / 8.1 можно использовать консольную программу bcdedit. C ней можно без всякого труда настроить все параметры загрузки системы, или восстановить повреждённые записи.
Прежде всего нужно запустить командную строку. Чтобы это сделать, откройте Пуск и в строке поиска введите команду cmd. Кликните на появившейся вверху строке правой кнопкой мыши и выберите «Запуск от имени администратора».
Откроется новое окно, в котором нужно ввести ещё одну команду:
и нажать Enter. Перед вами отобразится список всех элементов загрузчика.
Большинство значений BCD (Boot Configuration Data, данные хранилища загрузки) записаны в фигурных скобках в виде . В скобки заключаются идентификаторы CLSID. Обычно это код, состоящий из букв и цифр, в виде . У некоторых идентификаторов достаточно понятные названия — к примеру , и др.
- default – ID операционной системы, которая загружается по умолчанию; если bcdedit работает в той ОС, которая загружается по умолчанию, то параметр default будет иметь значение ;
- description – название операционной системы, которое отображается в меню загрузки (например «Microsoft Windows 7»)”;
- displayorder – порядок в котором отображаются записи об операционных системах в меню загрузки;
- device – раздел диска, на котором располагаются файлы загрузки;
- locale – язык, используемый в основном либо дополнительном меню загрузки;
- osdevice – раздел, где находятся системные файлы данной операционной системы; чаще всего в параметрах device и osdevice указано одно и то же значение;
- path – если в параметре device указан раздел диска с файлами ОС, то в параметре path располагается путь к загрузчику ОС;
- timeout – время в секундах, по истечению которого автоматически начинается загрузка операционной системы.
Чтобы предотвратить повреждение загрузчика, перед внесением изменений создайте его резервную копию. Создайте на диске C:\ папку с именем BootBackup (или любым другим). Выполните команду:
Для восстановления из резервной копии вы можете использовать команду:
Работа с bcdedit
Предположим, что у вас есть несколько записей в меню загрузки, которые имеют идентификаторы , , .
КАК ИЗМЕНИТЬ ОПЕРАЦИОННУЮ СИСТЕМУ, ЗАГРУЖАЕМУЮ ПО УМОЛЧАНИЮ
Укажите значение /default и идентификатор ОС, что будет загружаться по умолчанию. Например для ОС с идентификатором команда будет выглядеть так:
Теперь ОС с будет сверху в меню загрузки.
КАК ИЗМЕНИТЬ РАЗМЕЩЕНИЕ ЗАПИСЕЙ В МЕНЮ ЗАГРУЗКИ
Записи можно перемещать несколькими способами.
Делаем запись первой в списке:
Делаем запись последней в списке:
Указываем точный порядок записей:
КАК ИЗМЕНИТЬ ЗНАЧЕНИЕ ЗАДЕРЖКИ ЗАГРУЗКИ
КАК ИЗМЕНИТЬ ЯЗЫК МЕНЕДЖЕРА ЗАГРУЗКИ
КАК ИЗМЕНИТЬ ЯЗЫК ДОПОЛНИТЕЛЬНОГО МЕНЮ ЗАГРУЗКИ
КАК ИЗМЕНИТЬ НАЗВАНИЕ ОПЕРАЦИОННОЙ СИСТЕМЫ В МЕНЮ ЗАГРУЗКИ
КАК ИЗМЕНИТЬ БУКВУ РАЗДЕЛА, ГДЕ НАХОДИТСЯ ПАПКА ОС И ЗАГРУЗОЧНЫЕ ФАЙЛЫ
КАК ДОБАВИТЬ НОВУЮ ОПЕРАЦИОННУЮ СИСТЕМУ В МЕНЮ ЗАГРУЗКИ
КАК УДАЛИТЬ ЗАПИСЬ ОБ ОПЕРАЦИОННОЙ СИСТЕМЕ ИЗ МЕНЕДЖЕРА ЗАГРУЗКИ И BCD
Чтобы избавиться от записи в менеджере (и меню) загрузки воспользуйтесь следующей командой:
Если в качестве указывается готовая запись, скажем, , то вам понадобится дополнительно использовать ключ /f.
Статьи и советы
РЕДАКТИРУЕМ ВНЕШНИЙ ВИД МЕНЮ ЗАГРУЗКИ
Отправлено: 14-Дек-2014 13:06
Скриншоты
Редактируем ресурс
Редактируем ресурс, продолжение
Удаление надписи
Удаляем меню Средства
Убираем стрелочки, если не нужны:
Доступна палитра из 16 цветов
Что означает код: RGBI, XXXX и.т.д.
Как сменить фон
Экран загрузки и текст
Если появляется ошибка при запуске
Ну а теперь пример:
Последний раз редактировалось: (2015-03-03 08:54), всего редактировалось 67 раз(а)
Отправлено: 14-Дек-2014 17:51 (спустя 4 часа)
Последний раз редактировалось: (2015-01-08 13:13), всего редактировалось 7 раз(а)
Отправлено: 14-Дек-2014 17:56 (спустя 5 минут)
Отправлено: 14-Дек-2014 18:05 (спустя 9 минут)
Последний раз редактировалось: (2014-12-26 15:50), всего редактировалось 3 раз(а)
Отправлено: 14-Дек-2014 18:10 (спустя 4 минуты)
Скриншот
Последний раз редактировалось: (2015-03-03 08:35), всего редактировалось 4 раз(а)
Отправлено: 14-Дек-2014 18:29 (спустя 19 минут)
Последний раз редактировалось: (2015-01-16 12:36), всего редактировалось 1 раз
Отправлено: 16-Дек-2014 14:19 (спустя 1 день 19 часов)
Отправлено: 16-Дек-2014 14:43 (спустя 24 минуты)
Отправлено: 16-Дек-2014 14:53 (спустя 10 минут)
Отправлено: 16-Дек-2014 22:43 (спустя 7 часов)
Отправлено: 16-Дек-2014 22:49 (спустя 5 минут)
Последний раз редактировалось: (2014-12-25 23:07), всего редактировалось 5 раз(а)
Отправлено: 16-Дек-2014 22:56 (спустя 6 минут)
Отправлено: 17-Дек-2014 10:24 (спустя 11 часов)
Отправлено: 17-Дек-2014 10:56 (спустя 32 минуты)
Отправлено: 17-Дек-2014 11:03 (спустя 7 минут)
BCDEDIT: редактирование загрузчика Windows
Начиная с Windows Vista, корпорация Microsoft усложнила процесс редактирования загрузчика Windows. Мы уже касались утилиты bcdedit.exe. Эта статья посвящена ей подробнее.
Для начала разберемся, почему Microsoft решила отказаться от столь простого понятного текстового файла boot.ini. Дело, как это часто водится, в безопасности.
Для усложнения получения доступа к параметрам загрузчика было придумано специальное хранилище данных конфигурации загрузчика (BCD). В Windows Vista и более поздних версиях данные конфигурации загрузчика хранятся в виде специальных программных объектов, которые уже не являются простыми текстовыми элементами. Каждый объект в хранилище имеет уникальный идентификатор (GUID) и хранится в специальном формате. Каждый идентификатор является уникальным для конкретной копии операционной системы. Для удобства редактирования параметров загрузчика некоторым из объектов помимо идентификаторов присвоены псевдонимы, по которым к ним и можно обращаться посредством утилиты bcdedit.exe. Вот список основных псевдонимов:
| Указание записи диспетчера загрузки Windows. | |
| Указание записи диспетчера загрузки микропрограмм в энергонезависимой ОЗУ, часто используемых в системах с UEFI. | |
| Указание записи приложения диагностики памяти. | |
| Указание на загрузчик Ntldr, используемых в прошлых версиях ОС (до Windows Vista). | |
| Виртуальный идентификатор, обозначающий загрузочную запись запущенной в данной момент операционной системы. | |
| Виртуальный идентификатор, обозначающий используемую по умолчанию загрузочную запись. | |
| Включает в себя параметры диспетчера загрузки при работе с электронными дисками (т.е. располагающимися в оперативной памяти). | |
| Содержит глобальные параметры отладки, которые наследуются любой записью в приложении загрузки. | |
| Содержит глобальные параметры служб аварийного управления, которые наследуются любой записью в приложении загрузки. | |
| Включает в себя общий список дефектов оперативной памяти, который наследуется любой записью в приложении загрузки. | |
| Общие параметры, которые наследуются всеми записями в приложении загрузки. | |
| Набор общих параметров, наследуемых всеми записями приложений загрузки Windows. | |
| Набор общих параметров, наследуемых всеми возобновлениями работы Windows из спящего режима. | |
| Параметры гипервизора, которые могут наследоваться любой записью в приложении загрузки. |
Коснемся команд, доступных в утилите bcdedit.exe. Для получения списка команд запустите командную строку и введите

Для получения более подробной информации по каждой команде используйте
Для просмотра текущих параметров загрузки Windows достаточно вызвать утилиту в командной строке:
если же Вы хотите сохранить параметры загрузки в текстовый файл, то достаточно ввести
Путь для сохранения и имя можно, конечно, указать и другие.
Если же вместо псевдонимов Вы хотите видеть GUID, то команду можно видоизменить:
Можно использовать и другие форматы для экспорта информации. Например rtf, doc (не docx) или csv. Это позволяет не отвлекаться на проблемы с кодировками.

Перед редактированием загрузчика всегда разумно сделать его резервную копию. Делается это командой:
Путь и имя файла здесь тоже можно выбрать любые. Если в пути встречаются пробелы, в команде надо использовать кавычки:
Восстановление загрузчика производится командой
Разберем изменение основных настроек загрузчика Windows при помощи утилиты bcdedit.exe.
Приведенная выше команда устанавливает время вывода списка загрузки равным 15 секундам.
Если помимо современных версий Windows, на компьютере также установлены старые версии ОС, относящиеся к семейству NT (2000, XP, Server 2003 и пр.), установить такую ОС в качестве загружаемой по умолчанию можно командой
Если же в качестве загружаемой по умолчанию нужно использовать текущую ОС, используйте команду
Вообще, ничто не мешает Вам использовать и GUID системы, для того, чтобы указать её в качестве загружаемой по умолчанию. GUID Вы можете посмотреть в текстовом файле, который мы до этого сохраняли на жесткий диск. Команда в таком случае будет выглядеть следующим образом:
В данном случае в конце должен содержаться GUID в виде набора букв и цифр. Помните, что GUID должен быть заключен в фигурные скобки (<>).
Вы можете также отредактировать местоположение операционных систем в списке загрузки. Делается это следующей командой
В таком примере первой в списке будет отображаться устаревшая версия Windows, затем текущая, из-под которой вводилась эта команда. Вместо псевдонимов можно использовать и GUID систем.
Теперь разберем как создавать новые записи в загрузчике Windows при помощи утилиты bcdedit.exe. В общем виде команда создания новой записи выглядит так:
bcdedit.exe /create [<<ID>>] /d <описание> [/application <тип_приложения> |/inherit [<тип_приложения>] | /inherit DEVICE | /device]
разберем синтаксис команды подробнее.
ID — идентификатор, который будет использоваться для новой записи загрузки. В качестве идентификатора может быть использован GUID или псевдоним;
описание — то, как новая запись загрузки будет отображаться в списке;
application — указание на то, что новая запись является записью приложения, в данном случае тип_приложения может принимать один из следующих вариантов: BOOTSECTOR, OSLOADER, RESUME, STARTUP.
inherit — указание на то, что новая запись является наследуемой записью. тип_приложения может принимать одно из следующих значений: BOOTMGR, BOOTSECTOR, FWBOOTMGR, MEMDIAG, NTLDR, OSLOADER, RESUME. Если тип_приложения не указан, то новая запись может наследоваться от любой записи.
inherit DEVICE — указание на то, что новая запись является наследуемой и может быть унаследована только записью параметров устройства.
device — указание на то, что новая запись является дополнительной записью параметров устройства.
Добавить новую запись загрузки ОС семейства Windows NT данной командой довольно просто. Мы уже знакомы с псевдонимом ntldr , поэтому сгенерировать нужную команду не составит труда.
Прежде чем приступать к созданию новой записи, нам нужно скопировать файлы ntldr, boot.ini, ntdetect.con, bootfont.bin из раздела со старой ОС на тот раздел, где лежит загрузчик Windows. Им может быть как раздел, куда установлена свежая версия Windows, так и отдельный скрытый раздел, который может не отображаться в проводнике, но отображаться в консоли Управление дисками. Такой раздел будет носить описание Зарезервировано системой (System reserved).

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

Далее достаточно нажать Добавить и выбрать подходящую букву.

После копирования файлов создаем новую запись загрузки:
Создаем параметры передачи загрузчику Windows NT:
x в данном случае это имя раздела, где лежит загрузчик Windows NT. Если раздел является скрытым и не имеет буквы, то его нужно указать в том виде, в котором он отображается в текущей конфигурации ОС, например:
Далее требуется указать путь к загрузчику ntldr:
И добавить этот пункт в конец списка загрузки:
Но и это еще не всё. Ведь нам надо убедиться, что загрузчик ntldr находит ОС. Если что-то идет не так, то первым делом убедитесь, что в файле boot.ini прописаны верные пути к ядру Windows NT. Например, если речь идет о первом разделе второго жесткого диска, то путь будет выглядеть так:
multi(0)disk(0)rdisk(1)partition(1)\WINDOWS=»ОС семейства Windows NT» /fastdetect
Помните, что нумерация дисков в загрузчике ntldr начинается с нуля, а разделов с единицы.
Разберем синтаксис команды удаления записи загрузки.
bcdedit.exe [/store <файл_хранилища>] /delete <<ID>>[/f] [/cleanup | /nocleanup]
файл_хранилища — указание на используемое хранилище. Если параметр не задан явно, используется хранилище текущей ОС;
ID — идентификатор записи, которую требуется удалить. В качестве идентификатора может быть использован GUID или псевдоним;
f — параметр удаления указанной записи. Без этого параметра утилита bcdedit.exe не удаляет записи, имеющие известные псевдоним;
cleanup — удаление записи загрузки с удаление также и из списка загрузки. Кроме того, будет удалены и все ссылки на данную запись из хранилища. Параметр используется по умолчанию, если не задан nocleanup;
nocleanup — удаление записи загрузки без удаления из списка загрузки.
Например, загрузчик ОС семейства Windows NT имеет известный нам псевдоним ntldr , а потому запись загрузки не удалится без параметра f . Пример удаления:
Если у записи нет псевдонима, а только GUID, то достаточно указать его в фигурных скобках и не дописывать параметр f .
Введение
Возможно некоторые читатели помнят мою самую первую статью на ресурсе, посвященную загрузке 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. то есть обыкновенный двоичный образ. Монтируем этот образ
На смонтированном разделе мы увидим следующее содержимое
Для нас представляет интерес файл bootmgr. Однако, прежде нам нужен не совсем он, а 32-разрядный образ загрузчика bootmgr.exe, который находится в bootmgr в упакованном виде. Для его распаковки необходимо использовать утилиту bmzip, которая написана в общем-то для Windows (с наскока собрать её под Linux не вышло), поэтому распаковку выполним на виртуальной машине. Бинарную сборку этой утилиты, которая бы работала нормально оказалось довольно трудно найти, несмотря что тут дана ссылка на неё. В итоге, пакет был найден на каком-то из сайтов, посвященных кастомизации bootmgr. Для работы bmzip оказалась необходима библиотека MSCompression.dll. Готовый к работе пакет теперь можно скачать тут.
Создадим на диске ВМ папку utils и скопируем туда bmzip.exe вместе с MSCompression.dll. Отмонтируем образ и запустим ВМ. Запустим командную строку от имени администратора. Чтобы случайно не попортить загрузчик сделаем его копию
Файл загрузчика является скрытым и системным, поэтому снимем с него эти атрибуты
В итоге получаем распакованный образ bootmgr.exe

Выключаем ВМ и снова монтируем её диск в линуксе. Создадим какую-нибудь папку, где будем потрошить загрузчик дизассемблером и скопируем туда распакованный образ
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 — это включает режим отладки
ВМ запускается и сразу же становится на паузу, ожидая подключения отладчика
Важно! Ни в коем разе не используйте ключ -enable-kvm применяющий аппаратную виртуализацию. При её использовании отладка в QEMU не работает.
Теперь на панели инструментов в IDA выбираем отладчик «Remote GDB debugger»

Ответив «Да» на несколько заданных нам вопросов получим окошко

где вобьем параметры соединения с ВМ: localhost на порту 1234. Жмем ОК. Нам сообщат, что некоторый процесс уже запущен и ожидает подключения отладчика — не хотим ли мы присоединится к нему? Конечно же ходим!

Поэтому отвечаем «Да» и.

мы встаем на паузу где-то в начала bios виртуальной машины. Великолепно, но теперь мы должны добраться до того места, где начинает выполнятся bootmgr. Ставим точку останова на функции BmMain(). Нажимаем на панели инструментов список точек останова, жмем Insert на клавиатуре и указываем на каком адресе мы хотим прервать выполнение кода и перейти в отладку

Вбиваем адрес 0x401000. Если же мы хотим поставить бряк на нужную нам функцию, то идем в главное меню и открываем в сеансе отладки список функций: View -> Open subviews -> Functions. В появившемся списке правой кнопкой мыши вызываем контекстное меню и выбираем Add breakpoint. Теперь жмем F9 и после недолгого ожидания попадаем в самое начало кода загрузчика

Теперь мы можем проходить код по шагам, смотреть значения регистров и стека, отслеживать стек вызовов и так далее. В какой-то степени отладчик, встроенный в IDA удобен и интуитивно понятен.
Возможно меня спросят — а можно ли использовать GDB? Можно, запускаем ВМ в режиме отладки, запускаем gdb в консоли
Подключаемся к удаленной сессии ВМ
Включаем отображение дизассемблированных инструкций
Если вас не устраивает синтаксис AT&T переключаемся на интел
Ставим точку останова на BmMain() и запускаем исполнение
Пожалуйста, мы видим почти тоже самое, что видели в IDA, располагая при этом всей мощью GDB. Почти, потому что тут мы не сумеем использовать отладочные символы от Microsoft, ибо GDB их не понимает. Но возможности GDB не в пример более широки, чем возможности IDA именно в плане процесса отладки и его автоматизации.
Однако, существует ещё одна возможность отладки, мимо которой пройти нельзя
3. Отладка на связке WinDbg + VirtualBox
Те, кто занимается разработкой драйверов для ОС Windows безусловно знакомы с этим замечательным отладчиком. Замечателен он тем, что имеет возможности сравнимые с возможностями линуксового GDB. Единственным его недостатком является жуткий способ настройки его интерфейса. Но мы опустим эти моменты, а обратимся к возможностям данного отладчика для решаемой нами задачи.
Итак, пускай на у нас имеется ВМ на основе VirtualBox. Создадим для этой ВМ COM-порт со следующими параметрами

Это виртуальный COM-порт, пробрасываемый в именованый канал. Для отладки через последовательный порт виртуальную машину следует настроить соответствующим образом. Загружаем её и запускаем консоль с административными правами. С ней вводим команды настройки загрузчика для отладки
Эта команда включит возможность отладки загрузчика. Далее настроим порт для отладки
Указываем, что мы используем COM1 со скоростью 115200 бод. Отлично, выключаем ВМ и запускаем отладчик.
Отладчик WinDbg можно скачать официально с сайта Microsoft вместе с комплектом для разработки драйверов. Однако у этой сборки отладчика есть проблема — глюк с отображением значений регистров. Поэтому я использую сборку, которая качается с того же сайта редмодовцев, на которую ведет ссылка из твитера некоего Доминика Вонга. В этой сборке данный баг отсутствует. Запускаем WinDbg следующей командой
Откроем настройки интерфейса (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()
и нажмем F5. Отладчик встанет на указанной функции

Причем, внимание — мы ещё вообще не заходили в меню загрузки и не выбирали загрузку из VHD. А это означает, что проверка VHD происходит задолго до появления меню. Такое же поведение мы и наблюдаем, например если подсунем bootmgr пустой VHD. Меню загрузки нам вообще не покажут, а покажут ошибку с кодом 0xc000000F.
Проходим чуть дальше, нажимая F10 или вводя в комадной строке p и дойдем до вызова VhdiAllocateVhdData() — очевидно это создание в памяти некоторых структур для работы с образом

Чуть ниже расположен вызов VhdiVerifyAndInitializeVhd() — очевидно проверка корректности образа. Это показалось мне интересным и я пошел внутрь (F11)

Ниже, после некоторых подготовительных операций загрузчик читает последние 512 байт образа, в которых содержится так называемый «футер» образа, вызывая функцию VhdiReadVhdInformation(). Не надо ходить к гадалке, чтобы понять — функция возвратит указатель на структуру, содержащую данные футера. Как мне удалось выяснить, этот указатель, после вызова VhdiReadVhdInformation() оказывается в регистре ecx. Его значение равно 0x110098. Посмотрим на память по тому адресу
Команда читает память по указанному адресу, выводя её в окно отладчика в виде последовательности байт
Ага, мы видим знакомое слово — conectix. Это поле предваряет футер VHD образа, носит название cookie и хранит память о том, что Microsoft купила технологию VHD у фирмы Conectix, которая разработала данный формат виртуальных дисков для старых компьютеров Macintosh, Это несомненно футер VHD, мы можем видеть тут сигнатуру операционной системы в которой он был создан (Wi2k) а так же последовательность win указывает на то, что VHD создан средствами Windows. Да, все так и было. Пройдя чуть дальше мы натыкаемся на вызов VhdiVerifyVhdFooter() проверяющий формат футера. В качестве параметра он получает указатель на вышеописанную структуру, почему-то через регистр esi (. )

Этот участок кода интересовал меня больше всего, поэтому где-то с помощью IDA Pro, где-то руками, я преобразовал его в псевдокод на C
Футер VHD можно представить в виде следующей структуры (в комментариях указаны смещения от её начала).
Пользуясь этими данными можно сделать вывод о том, какие поля футера проверяет bootmgr и какие ошибки он выбрасывает. При корректном VHD образе данная функция возвращает ноль, в иных случаях расклад таков
Полученная мной информация решила спор возникший с коллегой по форуму, на котором обсуждалась методика загрузки Windows с VHD. Я его проиграл, считая что образы, созданные VirtualBox не будут грузится с помощью bootmgr. VirtualBox, создавая такие образы пишет все поля в соответствии со спецификацией Microsoft, кроме поля creator_application, куда записано win в оригинальном образе и vbox в случае с виртуалбоксом. Но это поле не проверяется bootmgr-ом, так что диски работают, а у меня они не работали по совсем другой причине, которая является предметом совсем другой истории.
Заключение
Возможно, статья несколько сумбурна. Но, она говорит о том, что горшки обжигают не боги, а отладка низкоуровневого кода Windows лишь дело техники. Интересующую вас информацию всегда можно получить, приложив к этому голову и руки. В этом тексте я попытался обобщить разрозненную информацию, собранную мной в сети по вопросам отладки bootmgr. Надеюсь что у меня это получилось, благодарю всех читателей за внимание и.