Bootmgr efi что это

Настройка UEFI-загрузчика. Самое краткое руководство в мире

Как устроена загрузка современных ОС? Как при установке системы настроить загрузку посредством UEFI, не утонув в руководствах и ничего не сломав?

Я обещал «самое краткое руководство». Вот оно:

TL;DR не надо прописывать путь к загрузчику в новых загрузочных записях UEFI — надо файл загрузчика расположить по стандартному «пути по-умолчанию», где UEFI его найдет, и вместо загрузочного меню UEFI пользоваться меню загрузчика, которое гораздо проще и безопаснее настраивается

Как делать не надо

Есть, на самом-то деле, несколько способов настроить UEFI-загрузку. Я начну с описания других вариантов — чтобы было понятно, как (и почему) делать не надо. Если вы пришли за руководством — мотайте в самый низ.

Не надо лезть в NVRAM и трогать efivars

Наиболее «популярная» процедура установки загрузчика в систему такова: установщик ОС создаёт специальный раздел, на нём — структуру каталогов и размещает файлы загрузчика. После этого он с помощью особой утилиты (efibootmgr в linux, bcdedit в windows) взаимодействует с прошивкой UEFI-чипа, добавляя в неё загрузочную запись. В этой записи указывается путь к файлу загрузчика (начиная от корня файловой системы) и при необходимости — параметры. После этого в загрузочном меню компьютера появляется опция загрузки ОС. Для linux существует возможность вообще обойтись без загрузчика. В загрузочной записи указывается путь сразу к ядру вместе со всеми параметрами. Ядро должно быть скомпилировано с опцией EFISTUB (что давно является стандартом для большинства дистрибутивов), в этом случае оно содержит в себе заголовок «исполняемого файла EFI», позволяющий прошивке его запускать без внешнего загрузчика.

При старте системы, когда пользователь выбирает нужную ему загрузочную запись, прошивка UEFI сперва ищет на прописанном в этой записи диске особый EFI-раздел, обращается к файловой системе на этом разделе (обязательно FAT или FAT32), и запускает загрузчик. Загрузчик считывает из файла настроек свой конфиг, и либо грузит ОС, либо предоставляет загрузочное меню. Ничего не замечаете? Да, у нас два загрузочных меню — одно на уровне прошивки чипа UEFI, другое — на уровне загрузчика. В реальности о существовании второго пользователи могут даже не догадываться — если в меню всего один пункт, загрузчик Windows начинает его грузить без лишних вопросов. Увидеть экран с этим меню можно, если поставить вторую копию Windows или просто криво её переустановить.

Обычно для управления загрузочными записями руководства в интернете предлагают взаимодействовать с прошивкой UEFI. Есть аж пять основных вариантов, как это можно сделать: efibootmgr под linux, bcdedit в windows, какая-то софтина на «Маках», команда bcfg утилиты uefi shell (запускается из-под UEFI, «на голом железе» и без ОС, поскольку скомпилирована в том самом особом формате) и для особо качественных прошивок — графическими средствами UEFI (говоря популярным языком, «в настройках BIOS»).

За всеми вышенаписанными «многобуков» вы могли легко упустить такую мысль: пользователь, чтобы изменить настройки программной части (например, добавить параметр запуска ОС), вынужден перезаписывать flash-память микросхемы на плате. Есть ли тут подводные камни? О да! Windows иногда способна сделать из ноутбука кирпич, linux тоже, причём разными способами. Качество прошивок часто оставляет желать лучшего — стандарты UEFI либо реализованы криво, либо не реализованы вообще. По логике, прошивка обязана переживать полное удаление всех переменных efivars без последствий, не хранить в них критичных для себя данных и самостоятельно восстанавливать значения по-умолчанию — просто потому что пользователь имеет к ним доступ, и вероятность их полного удаления далека от нуля. Я лично в процессе экспериментов неоднократно (к счастью, обратимо) «кирпичил» свой Lenovo — из загрузочного меню исчезали все пункты, включая опцию «зайти в настройки».

Работа с загрузочными записями UEFI — тоже не сахар. К примеру, утилита efibootmgr не имеет опции «редактировать существующую запись». Если ты хочешь немного изменить параметр ядра — ты удаляешь запись целиком и добавляешь её снова, уже измененную. При этом строка содержит в себе двойные и одинарные кавычки, а также прямые и обратные слеши в не особо очевидном порядке. Когда я наконец заставил эту магию работать — я сохранил её в виде bash-скриптов, которые до сих пор валяются у меня в корневой ФС:

Не надо использовать GRUB

Это чёртов мастодонт, 90% функциональности которого предназначено для дисков с MBR. Для настройки необходимо отредактировать ряд файлов, после чего выполнить команду генерации конфига. На выходе получается огромная малопонятная нормальному человеку простыня. В составе — гора исполняемых файлов. Ставится командой, которую просто так из головы не возьмешь — надо обязательно лезть в документацию

Для сравнения — самый простенький UEFI-bootloader, который есть в составе пакета systemd, ставится командой

Эта команда делает ровно две вещи: копирует исполняемый файл загрузчика на EFI-раздел и добавляет свою загрузочную запись в прошивку. А конфиг для неё занимает ровно СЕМЬ строчек.

«Самое краткое руководство» — чуть более подробно

Загрузочное меню надо реализовывать на уровне загрузчика — править текстовые конфиги гораздо проще и безопасней.

Загрузочная запись нам не нужна — дело в том, что при выставлении в настройках BIOS загрузки с диска прошивка UEFI сначала ищет на нём EFI-раздел, а затем пытается исполнить файл по строго фиксированному адресу на этом разделе: /EFI/Boot/BOOTX64.EFI

Что такое «EFI-раздел»? В теории, он должен иметь особый тип «EFI System» (ef00). На практике, годится первый раздел на GPT-диске, отформатированный в FAT32 и имеющий достаточно места, чтобы разместить загрузчик и вспомогательные файлы (если есть).

Пункт 3: «Скачиваем из интернета любой UEFI-загрузчик». Что это значит? Загрузчик — это просто исполняемый файл определенного формата, к которому в комплекте идет конфиг. К примеру, если у вас есть под рукой установленный пакет с systemd — файл загрузчика можно найти по адресу /usr/lib/systemd/boot/efi/systemd-bootx64.efi, переименовать его в bootx64.efi и скопировать в /EFI/Boot/ на EFI-разделе. Нет под рукой systemd? Скачайте архив с сайта Archlinux. Или с репозитария Ubuntu. Или Debian. Есть под рукой система с Windows? Возьмите виндовый загрузчик оттуда, тоже сгодится )) Если сумеете настроить, я честно говоря не пробовал.

Пункт 4: «Настроить конфиг». Как и обычная программа, когда загрузчик запускается — он ожидает найти по определенным путям файлы конфигурации. Обычно эту информацию легко найти в интернете. Для загрузчика systemd-boot нам необходимо в корне EFI-раздела создать каталог «loader», а в нём файл «loader.conf» с тремя строчками (привожу свои):

Параметр editor отвечает за возможность отредактировать пункт загрузочного меню перед запуском.

Рядом с loader.conf необходимо создать каталог entries — один файл в нём будет отвечать за одну загрузочную запись в boot-меню. У меня там один файл arch.conf с таким содержанием:

Я не упомянул, но довольно очевидно — ядро и initramfs должны лежать в одной файловой системе с загрузчиком, то есть на EFI-разделе. Пути к ним в конфигах отсчитываются от корня этой ФС.

Другие загрузчики

systemd-boot очень простой и предоставляет спартанского вида чёрно-белое меню. Есть варианты красивей, если душа просит красоты.

rEFind — очень красивый загрузчик. Скачать можно тут в виде deb-пакета. Использую на своём ноуте. Умеет создавать загрузочное меню автоматически, без конфига — просто сканируя файлы.

Clover. Позволяет выставлять нативное разрешение экрана, имеет поддержку мыши на экране загрузки, разные темы оформления. Дефолтная тема ужасна, конфиг в виде xml нечитаем, настроить не смог.

Различные неочевидные последствия

Вы можете легко попробовать эту схему в работе. Берёте USB-флешку, форматируете в таблицу разделов GPT, создаете FAT-раздел и копируете туда загрузчик. Комп сможет с неё стартовать.

Если просто скопировать на такую флешку boot-раздел установленного linux — система будет спокойно загружаться с флешки, не видя разницы.

Источник

Изучаем 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. то есть обыкновенный двоичный образ. Монтируем этот образ

На смонтированном разделе мы увидим следующее содержимое

Для нас представляет интерес файл bootmgr. Однако, прежде нам нужен не совсем он, а 32-разрядный образ загрузчика bootmgr.exe, который находится в bootmgr в упакованном виде. Для его распаковки необходимо использовать утилиту bmzip, которая написана в общем-то для Windows (с наскока собрать её под Linux не вышло), поэтому распаковку выполним на виртуальной машине. Бинарную сборку этой утилиты, которая бы работала нормально оказалось довольно трудно найти, несмотря что тут дана ссылка на неё. В итоге, пакет был найден на каком-то из сайтов, посвященных кастомизации bootmgr. Для работы bmzip оказалась необходима библиотека MSCompression.dll. Готовый к работе пакет теперь можно скачать тут.

Создадим на диске ВМ папку utils и скопируем туда bmzip.exe вместе с MSCompression.dll. Отмонтируем образ и запустим ВМ. Запустим командную строку от имени администратора. Чтобы случайно не попортить загрузчик сделаем его копию

Файл загрузчика является скрытым и системным, поэтому снимем с него эти атрибуты

В итоге получаем распакованный образ bootmgr.exe

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

Выключаем ВМ и снова монтируем её диск в линуксе. Создадим какую-нибудь папку, где будем потрошить загрузчик дизассемблером и скопируем туда распакованный образ

2. Дизассеблируем bootmgr.exe

Теперь скормим полученный «экзешник» дизассемблеру. Например IDA Pro. Запустим «иду» и откроем в ней добытый файл.

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

IDA верно идентифицирует файл как 32-разрядный исполняемый файл формата PE. Жмем ОК. Теперь, если в IDA Pro установлен плагин для работы с pdb-файлами, по ходу дизасеммблирования нам предложат загрузить отладочные символы, и не откуда нибудь, а сайта Microsoft.

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

Соглашаемся и получаем такую картину

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

Ага, слева мы видим прототипы функций, содержащихся в исследуемом файле, благодаря тому что согласились загрузить отладочные символы. Это очень сильно облегчит нам последующую работу. А пока определим точку входа в код загрузчика, и нетрудно догадаться что это будет функция BmMain(). Однако, не принимая это на веру жмем Ctrl + E

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

убеждаясь что наша догадка верна — BmMain() является точкой входа, расположенной по адресу 0x401000. Жмем ОК и перемещаемся на начало кода

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

Видим мы заголовок функции BmMain() с внушительным списком локальных переменных, и чуть ниже и сам код функции

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

Разобраться в мешанине ассемблерного кода довольно трудно, да и не зачем этого делать. Прежде всего определимся с тем, какие функции загрузчика мы хотим изучить. Я что-то там говорил о VHD? Ну так поищем среди кода что-нибудь, касающееся виртуальных дисков. Щелкаем правой кнопкой по списку функций слева и в вывалившемся контекстном меню выбираем «Quick filter» (или перейдя в окно с прототипами жмем Ctrl + F). В строке поиска набираем «vhd» и…

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

да, таковые функции имеются в количестве 33 штук. Среди них VhdOpen() очевидно будет отвечать за открытие виртуального диска, а вот например VhdiVerifyVhdFooter() как пить дать отвечает за проверку футера VHD-диска на корректность. То есть мы примерно представляем себе, куда будем ставить точки останова в отладчике. Кстати, поговорить об отладке самое время

3. Отладка Bootmgr на связке QEMU + IDA Pro

ВМ запускается и сразу же становится на паузу, ожидая подключения отладчика

Важно! Ни в коем разе не используйте ключ -enable-kvm применяющий аппаратную виртуализацию. При её использовании отладка в QEMU не работает.

Теперь на панели инструментов в IDA выбираем отладчик «Remote GDB debugger»

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

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

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

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

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

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

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

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

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

Теперь мы можем проходить код по шагам, смотреть значения регистров и стека, отслеживать стек вызовов и так далее. В какой-то степени отладчик, встроенный в IDA удобен и интуитивно понятен.

Возможно меня спросят — а можно ли использовать GDB? Можно, запускаем ВМ в режиме отладки, запускаем gdb в консоли

Подключаемся к удаленной сессии ВМ

Включаем отображение дизассемблированных инструкций

Если вас не устраивает синтаксис AT&T переключаемся на интел

Ставим точку останова на BmMain() и запускаем исполнение

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

Однако, существует ещё одна возможность отладки, мимо которой пройти нельзя

3. Отладка на связке WinDbg + VirtualBox

Те, кто занимается разработкой драйверов для ОС Windows безусловно знакомы с этим замечательным отладчиком. Замечателен он тем, что имеет возможности сравнимые с возможностями линуксового GDB. Единственным его недостатком является жуткий способ настройки его интерфейса. Но мы опустим эти моменты, а обратимся к возможностям данного отладчика для решаемой нами задачи.

Итак, пускай на у нас имеется ВМ на основе VirtualBox. Создадим для этой ВМ COM-порт со следующими параметрами

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

Это виртуальный COM-порт, пробрасываемый в именованый канал. Для отладки через последовательный порт виртуальную машину следует настроить соответствующим образом. Загружаем её и запускаем консоль с административными правами. С ней вводим команды настройки загрузчика для отладки

Эта команда включит возможность отладки загрузчика. Далее настроим порт для отладки

Указываем, что мы используем COM1 со скоростью 115200 бод. Отлично, выключаем ВМ и запускаем отладчик.

Отладчик WinDbg можно скачать официально с сайта Microsoft вместе с комплектом для разработки драйверов. Однако у этой сборки отладчика есть проблема — глюк с отображением значений регистров. Поэтому я использую сборку, которая качается с того же сайта редмодовцев, на которую ведет ссылка из твитера некоего Доминика Вонга. В этой сборке данный баг отсутствует. Запускаем WinDbg следующей командой

Теперь запустим ВМ. Практически сразу она встанет на паузу, а в окне отладчика мы увидим следующую картину

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

Ага, отладчик подключился к ВМ и встал на точке, любезно предоставленной нам майкрософтом. Ну что же, теперь нам доступны все возможности отладки с использованием windbg.

Однако мы останавливаемся не в самом начале кода загрузчика, а чуть дальше. Как показывает пошаговая отладка мы находимся как раз за функцией BlInitializeLibrary() которая обеспечивает начальную инициализацию оборудования

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

и, при отладке при помощи IDA мы сюда просто не попадаем. Таким образом, при отладке с WinDbg от нас ускользает часть действий bootmgr сразу после его запуска. В этом заключается недостаток использования стандартных средств отладки, предоставленных Microsoft. Однако, недоступный код мы всегда сможем исследовать отдельно с помощью IDA.

Теперь, в качестве примера, посмотрим на то, как bootmgr работает с образами VHD фиксированного размера.

4. Отлаживаем загрузку с VHD

Всё ниже следующее рассматривается на отладчике WinDbg, подключенном к ВМ на VirtualBox, но в равной степени справедливо и для других методов отладки, с учетом их особенностей. ВМ, используемая в данном примере содержит две системы: одна установлена на HDD, другая на VHD образ. Поставим точку останова на функции VhdOpen()

и нажмем F5. Отладчик встанет на указанной функции

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

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

Проходим чуть дальше, нажимая F10 или вводя в комадной строке p и дойдем до вызова VhdiAllocateVhdData() — очевидно это создание в памяти некоторых структур для работы с образом

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

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

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

Ниже, после некоторых подготовительных операций загрузчик читает последние 512 байт образа, в которых содержится так называемый «футер» образа, вызывая функцию VhdiReadVhdInformation(). Не надо ходить к гадалке, чтобы понять — функция возвратит указатель на структуру, содержащую данные футера. Как мне удалось выяснить, этот указатель, после вызова VhdiReadVhdInformation() оказывается в регистре ecx. Его значение равно 0x110098. Посмотрим на память по тому адресу

Команда читает память по указанному адресу, выводя её в окно отладчика в виде последовательности байт

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

Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это

Этот участок кода интересовал меня больше всего, поэтому где-то с помощью IDA Pro, где-то руками, я преобразовал его в псевдокод на C

Футер VHD можно представить в виде следующей структуры (в комментариях указаны смещения от её начала).

Пользуясь этими данными можно сделать вывод о том, какие поля футера проверяет bootmgr и какие ошибки он выбрасывает. При корректном VHD образе данная функция возвращает ноль, в иных случаях расклад таков

Полученная мной информация решила спор возникший с коллегой по форуму, на котором обсуждалась методика загрузки Windows с VHD. Я его проиграл, считая что образы, созданные VirtualBox не будут грузится с помощью bootmgr. VirtualBox, создавая такие образы пишет все поля в соответствии со спецификацией Microsoft, кроме поля creator_application, куда записано win в оригинальном образе и vbox в случае с виртуалбоксом. Но это поле не проверяется bootmgr-ом, так что диски работают, а у меня они не работали по совсем другой причине, которая является предметом совсем другой истории.

Заключение

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

Источник

Загрузка в режим UEFI или устаревший режим BIOS

в общем случае установите Windows с использованием более нового режима UEFI, так как он включает больше функций безопасности, чем устаревший режим BIOS. При загрузке с сети, которая поддерживает только BIOS, необходимо загрузить устаревший режим BIOS.

после установки Windows устройство загружается автоматически, используя тот же режим, с которым он был установлен.

Для загрузки с UEFI или BIOS:

Откройте меню встроенного по. Можно использовать любой из следующих методов.

Загрузите компьютер и нажмите клавишу изготовителя, чтобы открыть меню. Используются общие ключи: ESC, DELETE, F1, F2, F10, F11 или F12. На планшетных ПК распространенные кнопки — это громкое уменьшение или громкость (Поиск более общих ключей и кнопок). Во время запуска часто возникает экран, в котором упоминается ключ. Если это не так или если экран слишком быстро отображается, проверьте сайт изготовителя.

если Windows уже установлен, на экране входа или в меню выберите пункт электропитания (Bootmgr efi что это. Смотреть фото Bootmgr efi что это. Смотреть картинку Bootmgr efi что это. Картинка про Bootmgr efi что это. Фото Bootmgr efi что это) и удерживайте клавишу Shift во время выбора перезагрузки. Выберите Устранение неполадок Дополнительные параметры > Параметры встроенного по UEFI.

В меню встроенного по выполните загрузку на диск или сеть в режиме UEFI или BIOS:

В меню загрузочное устройство выберите команду, определяющую режим микропрограммы и устройство. Например, выберите UEFI: USB-диск или BIOS: сеть/сеть.

Для одного устройства могут отображаться отдельные команды. Например, вы можете увидеть USB-накопитель UEFI и USB-накопитель в BIOS. Каждая команда использует одно и то же устройство и носитель, но загружает компьютер в другом режиме микропрограммы.

Некоторые устройства поддерживают только один режим (UEFI или BIOS). Другие устройства позволяют загружаться в режиме BIOS только путем отключения функций безопасности UEFI вручную. Чтобы отключить функции безопасности, перейдите в раздел Безопасность Безопасная загрузка и отключите эту функцию.

некоторые старые пк (Windows 7-эры или более ранней версии) поддерживают UEFI, но для этого требуется перейти к файлу загрузки. В меню встроенного по найдите параметр: «Загрузка из файла», а затем перейдите к \EFI\BOOT\BOOTX64.. EFI на Windows PE или программа установки Windows носителе.

Режимы UEFI и BIOS в WinPE

Обнаружение загрузки WinPE в режиме BIOS или UEFI

Запросите реестр, чтобы определить, в каком режиме находится устройство. Это можно сделать в командной строке:

Код возвратаРежим встроенного по
0x1BIOS
0x2UEFI

Используйте его в скрипте:

Обратите внимание, что между delims= и » %%A находится вкладка, за которой следует пробел.

Вы всегда должны загружаться в нужный режим каждый раз.

Вот несколько способов, которые можно использовать для загрузки в правильном режиме микропрограммы при каждом запуске компьютера.

Используйте предварительно отформатированные жесткие диски и используйте метод, который не форматирует диск автоматически.

Если вы хотите убедиться, что диск загружается в определенный режим, используйте диски, предварительно форматированные с помощью формата GPT для режима UEFI, или формат файла MBR для режима BIOS. при запуске установки, если компьютер загружен в неправильном режиме, Windows установка завершится сбоем. Чтобы устранить эту проблему, перезапустите компьютер в правильном режиме микропрограммы.

Удаление загрузочных файлов UEFI или BIOS

если требуется, чтобы компьютер загружался только в определенный режим, можно удалить файлы, которые Windows PE или программа установки Windows использовать для загрузки в режиме UEFI или BIOS. Удалите следующие файлы в зависимости от режима, в котором требуется выполнить загрузку.

Загрузка только в режиме UEFI

удалите файл bootmgr из корневого каталога Windows PE или программа установки Windows носителя. Это предотвращает запуск устройства в режиме BIOS.

Загрузка только в режиме BIOS

удалите папку efi из корня Windows PE или программа установки Windows носителя. Это предотвращает запуск устройства в режиме UEFI.

Источник

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

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