Efi error 80000000 что делать

Восстановление загрузчика Windows 10 Если после установки второй ОС, попыток воспользоваться свободным местом на скрытых разделах диска или их форматирования, в случае системных сбоев, при экспериментах с EasyBCD и в других случаях вы столкнулись с тем, что Windows 10 не загружается, сообщая «An operating system wasn’t found», «No bootable device found. Insert boot disk […]

Содержание

  1. Восстановление загрузчика Windows 10
  2. Автоматическое восстановление загрузчика
  3. Процедура восстановления вручную
  4. Второй способ восстановить загрузчик Windows 10
  5. Пишем для UEFI BIOS в Visual Studio. Часть 2 – создаем свой первый драйвер и ускоряем отладку
  6. Введение
  7. Подготовка
  8. Использование UEFI Driver Wizard
  9. Добавление модуля в список для компиляции
  10. Очень важное лирическое отступление
  11. Компиляция и запуск драйвера
  12. Добавление своего кода
  13. Ввод текста с клавиатуры и вывод его на экран
  14. Создание и редактирование загрузочного скрипта UEFI Shell
  15. Отладочные сообщения
  16. Вывод отладочной информации в окно OVMF
  17. Небольшой пример
  18. Platform Configuration Database (PCD)
  19. Ускоряем отладку дальше
  20. Еще ускоряемся
  21. Еще тюнинг, на этот раз — интерфейса
  22. На будущее

Восстановление загрузчика Windows 10

Если после установки второй ОС, попыток воспользоваться свободным местом на скрытых разделах диска или их форматирования, в случае системных сбоев, при экспериментах с EasyBCD и в других случаях вы столкнулись с тем, что Windows 10 не загружается, сообщая «An operating system wasn’t found», «No bootable device found. Insert boot disk and press any key», то, возможно, вам требуется восстановление загрузчика Windows 10, о чем и пойдет речь ниже.

Вне зависимости от того, UEFI у вас или BIOS, установлена ли система на GPT диск со скрытым FAT32 разделом EFI загрузки или на MBR с разделом «Зарезервировано системой», действия по восстановлению будут одинаковыми для большинства ситуаций. Если ничто из нижеописанного не помогает, попробуйте Сброс Windows 10 с сохранением данных (третьим способом). Примечание: ошибки, подобные указанным выше, необязательно вызваны поврежденным загрузчиком ОС. Причиной может оказаться вставленный компакт-диск или подключенный USB-накопитель (попробуйте вынуть), новый дополнительный жесткий диск или проблемы с имеющимся жестким диском (прежде всего взгляните, а виден ли он в БИОС).

Автоматическое восстановление загрузчика

Среда восстановления Windows 10 предлагает опцию восстановления при загрузке, которое работает на удивление хорошо и в большинстве случаев оказывается достаточным (но не всегда). Чтобы восстановить загрузчик данным способом, проделайте следующие действия.

  1. Загрузитесь с диска восстановления Windows 10 или загрузочной флешки с Windows 10 в той же разрядности, что и ваша система (диска). Для выбора накопителя для загрузки можно использовать Boot Menu.
  2. В случае загрузки с установочного накопителя, на экране после выбора языка внизу слева нажмите пункт Восстановление системы.
  3. Выберите пункт Поиск и устранение неисправностей, а затем — Восстановление при загрузке. Выберите целевую операционную систему. Дальнейший процесс будет произведен автоматически.

По завершении вы либо увидите сообщение о том, что восстановление не удалось, либо компьютер автоматически перезагрузится (не забудьте вернуть загрузку с жесткого диска в БИОС) уже в восстановленную систему (но не всегда).

Если описанный способ не помог решить проблему, переходим к более результативному, ручному способу.

Процедура восстановления вручную

Для восстановления загрузчика вам потребуется либо дистрибутив Windows 10 (загрузочная флешка или диск), либо диск восстановления Windows 10. Если вы ими не обзавелись, придется воспользоваться другим компьютером для их создания. Подробнее о том, как сделать диск восстановления можно прочитать в статье Восстановление Windows 10.

Следующий этап — загрузиться с указанного носителя, поставив загрузку с него в БИОС (UEFI), либо используя Boot Menu. После загрузки, если это установочная флешка или диск, на экране выбора языка нажмите клавиши Shift + F10 или Shift+Fn+F10 на некоторых ноутбуках (откроется командная строка). Если это диск восстановления в меню выберите Диагностика — Дополнительные параметры — Командная строка.

В командной строке введите по порядку три команды (после каждой нажимаем Enter):

В результате выполнения команды list volume, вы увидите список подключенных томов. Запомните букву того тома, на котором располагаются файлы Windows 10 (в процессе восстановления это может быть не раздел C, а раздел под какой-либо другой буквой).

В большинстве случаев (на компьютере только одна ОС Windows 10, скрытый раздел EFI или MBR в наличии), для того, чтобы восстановить загрузчик, достаточно после этого выполнить одну команду:

bcdboot C:windows (где вместо C может потребоваться указать другую букву, о чем было сказано выше).

Примечание: если на компьютере несколько ОС, например, Windows 10 и 8.1, вы можете выполнить эту команду дважды, в первом случае указав путь к файлам одной ОС, во втором — другой (не сработает для Linux и XP. Для 7-ки зависит от конфигурации).

После выполнения этой команды вы увидите сообщение о том, что файлы загрузки успешно созданы. Можно попробовать перезагрузить компьютер в обычном режиме (вынув загрузочную флешку или диск) и проверить, загружается ли система (после некоторых сбоев загрузка происходит не сразу после восстановления загрузчика, а после проверки HDD или SSD и перезагрузки, также может проявиться ошибка 0xc0000001, которая в этом случае также обычно исправляется простой перезагрузкой).

Второй способ восстановить загрузчик Windows 10

Если вышеописанный способ не сработал, то возвращаемся в командную строку так же, как делали это ранее. Вводим команды diskpart, а потом — list volume. И изучаем подключенные разделы дисков.

Если у вас система с UEFI и GPT, в списке вы должны увидеть скрытый раздел с файловой системой FAT32 и размером 99-300 Мб. Если же BIOS и MBR, то должен обнаружиться раздел размером 500 Мб (после чистой установки Windows 10) или меньше с файловой системой NTFS. Вам требуется номер этого раздела N (Том 0, Том 1 и т.д.). Также обратите внимание на букву, соответствующую разделу, на котором хранятся файлы Windows.

Введите по порядку следующие команды:

  1. select volume N
  2. format fs=fat32 или format fs=ntfs (в зависимости от того, какая файловая система на разделе).
  3. assign letter=Z (присваиваем букву Z этому разделу).
  4. exit (выходим из Diskpart)
  5. bcdboot C:Windows /s Z: /f ALL (где C: — диск с файлами Windows, Z: — буква, которую мы присвоили скрытому разделу).
  6. Если у вас несколько ОС Windows, повторите команду для второй копии (с новым расположением файлов).
  7. diskpart
  8. list volume
  9. select volume N (номер скрытого тома, которому мы присваивали букву)
  10. remove letter=Z (удаляем букву, чтобы том не отображался в системе, когда мы перезагрузимся).
  11. exit

По завершении, закрываем командную строку и перезагружаем компьютер уже не с внешнего загрузочного накопителя, проверяем, загружается ли Windows 10.

Источник

Пишем для UEFI BIOS в Visual Studio. Часть 2 – создаем свой первый драйвер и ускоряем отладку

Введение

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

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

Подготовка

Сразу же сделаем свой каталог для наших упражнений в корне edk2 и назовем его EducationPkg. Все проекты будем создавать внутри него. Можно создавать в корне edk2 и каждый отдельный проект, никаких препятствий для этого нет, но примерно на десятом проекте в корне разведется зоопарк из своих проектов и пакетов фреймворка edk2, что приведет, в лучшем случае, к путанице. Итак, создаем каталог C:FWedk2EducationPkg.

Использование UEFI Driver Wizard

Созание набора файлов для проекта edk2 — большая тема, заслуживающая отдельной статьи. Можно про это почитать, если хочется узнать правду прямо сейчас, в документе EDK II Module Writer’s Guide, глава 3 Module Development – здесь или погуглите. Мы же пока будем использовать для создания набора файлов интеловскую утилиту UEFI Driver Wizard, которая лежит в скачанном каталоге в C:FWUEFIDriverWizard

Запускаем UEFI Driver Wizard, и первое, что надо сделать – указать рабочую среду Workspace C:FWedk2 по команде File → OPEN WORKSPACE. Если этого не сделать вначале, то UEFI Driver Wizard заботливо проведет нас по всем этапам создания, а потом, с извинениями, скажет, что проект драйвера создать не может.

После указания Workspace выбираем File → New UEFI Driver и производим следующие действия:

1. Жмем на кнопку Browse, заходим в каталог C:FWedk2EducationPkg и создаем внутри него свой каталог MyFirstDriver, в котором и будем работать дальше. Имя драйвера примет то же название

2. Выставляем Driver Revision в 1.0. Меньше единицы выставлять не советую — в Wizard ошибка, в результате которой ревизия получается 0.0 после создания файлов проекта.

3. Все остальное оставляем без изменений, так чтобы получилось, как показано на скриншоте

Жмем кнопку Next и переходим к следующему экрану:

Ставим галочки напротив Component Name Protocol и Component Name 2 Protocol, остальное не трогаем:

и после сразу жмем Finish, не трогая другие настройки. Получаем сообщение об успешном создании проекта:


Жмем Ок и закрываем UEFI Driver Wizard, он нам больше не понадобится.

Добавление модуля в список для компиляции

Поскольку в мире ничего идеального нет, нам придется вручную добавить строчку для нашего драйвера в список модулей для компиляции. Тут надо остановиться и дать небольшую справку.

Все модули в edk2 входят в т.н. рackages – группы модулей, которые объединены между собой по какому-то общему признаку. Чтобы включить новый модуль в состав какого-либо package, нам необходимо добавить путь к исходникам модуля в файл PackageName.dsc (dsc – сокращение от Description), и этот модуль будет компилироваться в составе Package. UEFI Wizard Driver наш драйвер для компиляции добавить автоматически, увы, не может по объективным причинам (ну откуда ему знать, что за свой новый package вы создали (или с каким из существующих намерены работать?). Поэтому – прописываем ручками.

Просьба понимать, что наш EducationPkg — пока не package, а всего лишь набор проектов, и не более того.

Открываем файл C:FWedk2Nt32PkgNt32Pkg.dsc, ищем в нем строчку

# Add new modules here

и после этой строки прописываем путь к файлу MyFirstDriver.inf нашего драйвера относительно C:FWedk2. Должно получиться вот так:

Очень важное лирическое отступление

Теперь вы уныло думаете, что придется снова настраивать проект в Visual Studio, и совершенно напрасно. Вспомните, мы в первой статье нигде не указали, о каком именно проекте идет речь. Поэтому править ничего не надо, компиляция после добавления в Nt32Pkg нашего inf-файла пойдет и так. Это приводит нас к очень важному следствию: мы можем добавить в уже имеющийся проект Visual Studio, например, NT32, файлы любого проекта из огромного дерева edk2 и все они будут доступны на редактирование и – это главное – постановку контрольных точек, просмотра Watch и всех остальных возможностей, которые предлагает Visual Studio. Собственно, в этом и состоит одно из наиболее интересных преимуществ данного подхода к работе в UEFI с помощью Visual Studio. И при нажатии на F5 перед началом компиляции будет произведено автосохранение измененных исходников, добавленных в проект. Мы, правда, платим за этот подход увеличенным временем компиляции, но дальше разберемся и с этой проблемой.

Давайте проделаем то, о чем только что говорили, для нашего проекта. Щелкаем в Visual Studio правой клавишей на проекте NT32 (не забыв переключить его в проект по умолчанию в Solution), выбираем Add → Existing Item, переходим в наш каталог

выделяем мышкой все файлы и жмем на Add, добавляя их в наш проект NT32.

Компиляция и запуск драйвера

Жмем в Visual Studio на F5 или кнопку Debugging, ждем загрузки Shell, в ней вводим:

fs0:
load MyFirstDriver.efi

И затем смотрим на сообщение об успешной загрузке нашего драйвера. Он ничего не делает, что совсем не удивительно – никакую функциональность в него мы еще не добавляли. Нам надо лишь проверить, что мы правильно добавили наш драйвер в среду edk2, и не более того.
Вот то, что мы должны видеть (адрес может быть любой):


Закрываем окно нажатим кнопки Stop Debugging, или Shift + F5 в Visual Studio.

Добавление своего кода

Открываем в Visual Studio файл MyFirstDriver.c из получившегося дерева проекта и добавляем в него наш код. Но вначале немного теории, перед тем, как перейдем к практике.

В UEFI BIOS все взаимодействие с «железом» — в нашем случае, его эмуляцией на виртуальной машине – происходит через протоколы, вот прямо так взять и записать определенный байт в определенный порт — нельзя. В очень упрощенном виде можно рассматривать протокол как имя “класса”, экземпляр которого создается для работы с устройством при его регистрации в системе. Как и обычный экземпляр класса, протокол содержит данные и функции, и вся работа с аппаратурой обеспечивается вызовом соответствующих приватных функций класса.

При работе в UEFI используются таблицы, в которых содержатся указатели на все экземпляры «классов». Этих таблиц несколько, в случае с нашим драйвером мы используем System Table, используя уже объявленный указатель gST. Иерархия этих таблиц довольно проста: есть основная таблица System Table, в которой содержатся (среди прочего) ссылки на таблицы Boot Services и Runtime Services. Впрочем, наверное, будет проще показать код:

По названиям переменных: gST расшифровывается как:
g — означает, что переменная глобальная
ST, как вы уже догадались, означает System Table

Итак, наша задача – послать на устройство вывода (в нашем случае – дисплей) строку I have written my first UEFI driver. Хорошо бы, конечно, при этом в unix-style использовать ту же printf и просто указать разные потоки, но увы – с использованием printf в UEFI есть очень серьезные ограничения, поэтому пока давайте оставим ее в сторонке, до лучших времен.

Вставим вывод нашей строки в функцию EntryPoint() нашего драйвера. Добавляем в области объявления переменных нашу переменную типа CHAR16 (используется двухбайтовая кодировка символов UCS-2) в функции MyFirstDriverDriverEntryPoint() в MyFirstDriver.c:

После, в самом конце функции MyFirstDriverDriverEntryPoint() вставьте код вывода нашей текстовой переменной на консоль вывода (экран по дефолту, в нашем случае):

Жмем на F5, вводим fs0:, load MyFirstDriver.efi, и получаем нашу строку на экране:

Первая программа с нуля написана и работает. Можем себя поздравить.

Разберем сейчас эту нашу строчку:

В ней:
gST – указатель на таблицу System Table
ConOutпротокол, или, как мы его условно обозвали, «класс» вывода текста
OutputString – сама функция вывода. Первый параметр в ней, как легко догадаться – this для нашего протокола EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.

Давайте переформулируем вышесказанное в другом виде, для лучшего понимания. Вот иерархия главной таблицы System Table, получена в окне Watch при останове на breakpoint в Visual Studio. Подсвечена используемая нами функция OutputString. Обратите также внимание на элементы BootServices и RuntimeServices в нижней части таблицы, о чем шла речь ранее:

Ввод текста с клавиатуры и вывод его на экран

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

Сделаем еще один скриншот той же gST, но уже в части ConIn. Выглядит он вот так:


В нашем следующем примере будем запоминать вводимый с клавиатуры пароль, отображая вводимые символы разноцветными звездочками в новогоднем (или наркоманском, как заметил один товарищ) стиле, а после нажатия Enter — выводить пароль в следующей строке. Это всего лишь учебный пример, замещение вводимого пароля звездочками уже реализовано в HII API, равно как и повторный ввод пароля, и проверка совпадения повторного ввода.

Вначале добавим локальные переменные в функции MyFirstDriverDriverEntryPoint() вместо нашей ранее добавленной переменной MyString.

Теперь вводим текст программы, заместив ранее добавленную нами функцию

Жмем F5 и устраиваемся в уже ставшей привычной позе на пару минут:

После приглашения Shell, как всегда, вводим fs0: и load MyFirstDriver (или load my и затем два раза жмем на Tab, ибо Shell). Получаем такую вот картинку (разумеется, текст будет тот, что вы ввели сами):

Жмем Shift+F5, чтобы закрыть отладку, после того, как налюбовались.

Дальше в статье будем знакомиться ближе со средой UEFI Shell, PCD и отладочными сообщениями — без этого двигаться дальше нельзя. Но знакомиться будем не абстрактно, а в полезном процессе ускорения и автоматизации запуска драйвера на отладку.

Создание и редактирование загрузочного скрипта UEFI Shell

Теперь, поскольку вы, вероятно, уже перекомпилировали программу не раз и не два, то морально дозрели до того, чтобы сократить это раздражающее время ожидания загрузки UEFI Shell и вбивания каждый раз одних и тех же команд для загрузки нашего драйвера. Начнем с того, что уберем весь ручной ввод текста в Shell написанием соответствующего скрипта. Писать скрипт будем прямо в Shell. С точки зрения здравого смысла, лучше открыть файл скрипта в Far Manager и отредактировать его там, но мало ли какими судьбами в будущем вас выбросит в Shell реальной машины, а не виртуалки с доступом к ее файловой системе с хоста. Поэтому один раз создадим скрипт в редакторе Shell и запишем его, чтобы получить соответствующий навык.

Файл скрипта, исполняемый при старте (подобный autoexec.bat или bashrc) для UEFI Shell, называется startup.nsh, тот самый, что Shell каждый раз предлагает нам пропустить при загрузке. Загрузитесь в UEFI Shell, нажав в Visual Studio клавишу F5, и введите fs0:, чтобы перейти в нашу файловую систему. Теперь из Shell введем команду

и в открывшемся редакторе введем, с переводом строки по Enter:

Дальше жмем F2, затем Enter для записи и затем F3 для выхода из редактора обратно в Shell.

Перекомпилять все заново на этот раз не будем, поскольку мы в программе ничего не меняли. Наберем в Shell команду Exit, и в открывшемся текстовом окне a-la BIOS Setup, а в терминах UEFIMain Form, выберем пункт Continue. После этого нас снова выбросит в Shell, но в этот раз исполнится созданный нами скрипт startup.nsh и автоматом запустится наш драйвер.

Отладочные сообщения

Пока мы можем писать отладочные сообщения на экран, но когда будем работать с формами HII (Human Interface Infrastructure) – такой возможности не представится, экран будет занят формами конфигурирования аппаратуры. Что делать в этом случае?

В самом начале после получения новой платы с завода не всегда, ох, не всегда бывает доступна дисплейная консоль вывода отладки. По вероятности возможных ошибок подключения дисплей идет сильно впереди последовательного порта, в котором напортачить можно разве что с направлением RX-TX. Поэтому существует также и вывод в последовательный порт, полностью аналогичный выводу на экран, с заменой ConOut на StdErr. Т.е. функция

будет выводить “Test string” на дисплей, а функция

будет выводить тестовое сообщение в последовательный порт. Попробуйте. Позднее мы будем перенаправлять вывод в виртуальной машине из последовательного порта в лог-файл, что может оказаться полезным в будущем — писать логи на флешку, вставленную в USB порт, на реальном железе.

Вывод отладочной информации в окно OVMF

Для вывода информации в окно OVMF есть макрос DEBUG”, который обычно используется следующим образом:

Где первый аргумент – некий аналог линуксового уровня сообщений об ошибках ERROR_LEVEL, а второй, как можно догадаться, указатель на строку, которую надо вывести в OVMF консоль.

Первый аргумент может принимать следующие значения:

#define EFI_D_INIT 0x00000001 // Initialization style messages
#define EFI_D_WARN 0x00000002 // Warnings
#define EFI_D_LOAD 0x00000004 // Load events
#define EFI_D_FS 0x00000008 // EFI File system
#define EFI_D_POOL 0x00000010 // Alloc & Free’s
#define EFI_D_PAGE 0x00000020 // Alloc & Free’s
#define EFI_D_INFO 0x00000040 // Informational debug messages
#define EFI_D_VARIABLE 0x00000100 // Variable
#define EFI_D_BM 0x00000400 // Boot Manager (BDS)
#define EFI_D_BLKIO 0x00001000 // BlkIo Driver
#define EFI_D_NET 0x00004000 // SNI Driver
#define EFI_D_UNDI 0x00010000 // UNDI Driver
#define EFI_D_LOADFILE 0x00020000 // UNDI Driver
#define EFI_D_EVENT 0x00080000 // Event messages
#define EFI_D_VERBOSE 0x00400000 // Detailed debug messages that may significantly impact boot performance
#define EFI_D_ERROR 0x80000000 // Error

Регулируя уровень появления этих сообщений в логе, мы можем выдержать требуемый баланс между уровнем логгирования и производительностью системы в целом.

1. Его вывод имеет форматирование и работает как форматирование printf. Для отладки очень полезен формат %r, который выводит диагностическую переменную Status не в виде 32-битного числа в HEX, а в виде человекочитаемой строки типа Supported, Invalid Argument и т.п.

2. Этот макрос автоматически отключается при смене Debug на Release, поэтому не спешите его комментировать или обвешивать ifndef-ами – все уже сделано за нас.

3. Двойные скобки там действительно нужны. Попробуйте убрать и посмотреть, что получится.

Небольшой пример

Чтобы проиллюстрировать написанное, добавим в функцию MyFirstDriverDriverEntryPoint(), сразу после объявления переменных, вывод текста из нескольких сообщений в лог с разными уровнями отладки и посмотрим, какие из них выведутся, а какие будут отфильтрованы:

Запускаем на отладку и смотрим в окно OVMF:

Видно, что сообщения с уровнем EFI_D_INFO и EFI_D_ERROR попали в лог, а с уровнем EFI_D_WARN – не попало.

Механизм регулирования уровней отладки достаточно прост: как мы видим в списке выше, каждый уровень характеризуется одним битом в 32-битном слове. Чтобы отфильтровать ненужные нам в данный момент сообщения, мы ставим битовую маску на значение уровня, который отсекает биты, не попадающие в данную маску. В нашем случае маска была 0x80000040, поскольку уровень EFI_D_WARN со значением 0x00000002 отфильтровался и не попал в вывод, а уровень EFI_D_INFO со значением 0x00000040, и EFI_D_ERROR с его значением 0x80000000 попали в маску и соответствующие сообщения были выведены.

Сейчас не будем дальше углубляться в рассмотрение реализации механизма настройки уровня вывода отладки, рассмотрим только способы его изменения на практике. Их два, первый из них быстрый, а второй – правильный. Начнем, понятно, с быстрого. Открываем файл c:FWNt32PkgNt32Pkg.dsc и ищем в нем строку, содержащую PcdDebugPrintErrorLevel. Вот она:

Изменяем значение маски на 0x80000042 и запускаем на построение и отладку снова.

Поскольку мы изменили конфигурационный файл, edk2 будет снова долго пересобирать все-все-все бинарники для Nt32Pkg, но этот процесс конечен, и вот мы видим в логе закономерные все три строчки, что и требовалось доказать:

Как сделать быстро, разобрались. Теперь сделаем правильно.

Platform Configuration Database (PCD)

Проблема предыдущего подхода в том, что дерево edk2 и пакет Nt32Pkg у нас единственные, и менять системные настройки ради единственного проекта – прямой путь в преисподнюю, ибо в лучшем случае через неделю вы про это изменение забудете напрочь и будете проклинать исчадье ада под названием edk2, что месяц назад исправно создавало из оттестированных исходников под версионным контролем именно то, что надо, а сейчас выдает нечто совершенно другое. Поэтому в edk2 реализован механизм изменения системных настроек под единственный проект, чтобы локализовать изменения этих настроек только для данного проекта. Называется этот механизм PCDPlatform Configuration Database, и позволяет очень многое. Вообще, хорошим стилем в edk2 считается выносить из исходников в PCD любой параметр, который может быть изменен в будущем. Объем статьи не позволяет остановиться на описании PCD подробнее, поэтому лучше подробности про PCD посмотреть вот здесь в п.3.7.3 или вот здесь. На первое время вполне достаточно ограничиться прочтением файла C:FWedk2MdeModulePkgUniversalPCDDxePcd.inf

С точки зрения практики, конфигурирование при помощи PCD производится вот так: в том же самом файле c:FWNt32PkgNt32Pkg.dsc изменяем уровень показа сообщений в окне OVMF:

Не спешите сразу записывать файл. Вначале поправьте обратно 0x80000042 к дефолтному значению 0x80000040 в строчке, которую мы редактировали ранее:

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

Ускоряем отладку дальше

Уберем еще пару раздражающих задержек при запуске на отладку. Очевидно, первый кандидат – это ожидание тех самых 5 сек перед запуском скрипта startup.nsh. Оно, конечно, можно и на пробел нажать, но любой уважающий себя лентяй программист должен автоматизировать ручные операции насколько возможно.

Теперь придется противоречить тому, что было сказано ранее. Проблема состоит в том, что в эти 5 секунд задержки прописываются не через PCD, а вопреки фэн-шуй, напрямую, в исходниках Shell. Поэтому и нам, хотим мы того или нет, придется поступить аналогично: откроем файл C:FWedk2ShellPkgApplicationShellShell.c и поменяем в инициализации значение «5» на «1»

Можно было бы и в 0 выставить, но мало ли… Забудем поменять на реальной аппаратной системе, а возможности перекомпилировать потом не будет.

Жмем F5 и радуемся 1 сек. задержки вместо 5.

Если кто-то знает, как выставить это значение задержки правильно, через PCD и без правки исходников Shell — дайте знать в личку или в комменты, я поправлю.

Еще ускоряемся

Вспоминаем про строку прогресса, а на самом деле – просто таймера ожидания выбора опции загрузки. Вот так это выглядит на основном экране:

А в окне запуска OVMF это смотрится несколько иначе:

Как говорил Винни-Пух, «Это ж-ж-ж – неспроста!» Надо найти источник и также уменьшить до 1 сек.

Запускаем поиск по всем файлам с расширением *.c строки Zzzzz, находим эту строку в исходнике C:FWMdeModulePkgUniversalBdsDxeBdsEntry.c и видим там вот такой блок кода:

Соответственно, понятно, что переменная TimeoutRemain читается из конфигурационной базы PCD, в параметре PcdPlatformBootTimeOut. Ок, открываем наш конфигурационный файл c:FWNt32PkgNt32Pkg.dsc, ищем там строку с PcdPlatformBootTimeOut:

Здесь уже вариант, как ранее, с конфигурацией PcdDebugPrintErrorLevel исключительно для нашего драйвера, не получится – в данном случае задержка будет выполняться задолго до того, как наш модуль MyFirstDriver будет загружен стартовым скриптом startup.nsh, поэтому придется менять глобально, хотим мы этого или нет. В данном случае — хотим, потому что эта задержка в процессе разработки драйверов обычно ни к чему. Меняем 10 на 1 в нашем конфигурационном файле, жмем F5 и радуемся быстрой загрузке. На моей машине это занимает теперь 23 секунды.

Еще тюнинг, на этот раз — интерфейса

Убираем второй дисплей, который нам незачем пока что, а раздражать уже начал. Правим строки в нашем любимом конфигурационном файле c:FWNt32PkgNt32Pkg.dsc, открыв его и убрав !My EDK II 2 и !UGA Window 2 в двух строчках, чтобы получилось:

Можно, разумеется, и саму надпись в заголовке окна UGA Window 1 поменять на что-то духовно более близкое вам лично, но это уже на ваше усмотрение.

На будущее

Есть еще один большой резерв сокращения времени компиляции и запуска проекта (в разы) – компилировать не весь edk2, а только наш модуль. Но об этом, как говорится – в следующей серии. Можете пока попробовать сделать это сами, решение элементарное, как убедитесь чуть позже.

Вам, возможно, сейчас кажется излишеством — уделение такого большого внимания сокращению сроков компиляции и запуска, но поверьте — когда начнете писать свои программы, разница между целевыми 10 сек до запуска, к которым мы придем, и 2 мин, которые были вначале — огромна. Потраченное сейчас время очень быстро окупится — третья статья не за горами, а в ней отлаживаться придется много.

Источник

В этой статье мы разберемся, как восстановить загрузчик Windows 10 или 11 на современном компьютере, на котором используется UEFI интерфейс вместо классического BIOS и таблица разделов диска GPT (вместо MBR). Повреждение загрузчика Windows может быть вызвано установкой второй ОС (Dual Boot — конфигурация), повреждением файловой систему, некорректным восстановлении Windows после сбоя, удалением скрытых разделов, вирусом-вымогателем и рядом других причин.

Данная статья содержит подробную пошаговую процедуру восстановления поврежденного или удаленного загрузчика ОС в Windows 11/10/8.1 и Windows Server 2022/2019/2016/2012R2 на компьютерах, которые работают в нативном (не legacy) режиме UEFI. Инструкцию можно использовать как для восстановления бинарных файлов загрузчика Windows, так и конфигурационного файла загрузчика EFIMicrosoftBootBCD (в случаях, когда Windows не загружается из-за отсутствия или повреждения файла конфигурацией загрузка BCD.

Содержание:

  • Не загружается Windows: Boot configuration data is missing EFIMicrosoftBootBCD
  • Автоматическое восстановление загрузчика Windows
  • Ручное восстановление загрузчика Windows с помощью BCDBoot

Не загружается Windows: Boot configuration data is missing EFIMicrosoftBootBCD

UEFI компьютер с Windows, установленной в наивном режиме, не сможет загрузиться при повреждении EFI загрузчика Windows. При попытке загрузиться с диска с повреждённым или отсутствующим EFI загрузчиком появится BSOD (синий экран смерти) с ошибкой:

Ошибка загрузки Windows 8: The boot configuration data for your PC is missing or contains errors. File :EFIMicrosoftBootBCD Error code: 0xc000000f

The boot configuration data for your PC is missing or contains errors.
File :EFIMicrosoftBootBCD
Error code: 0xc000000f

или

Error code: 0xc000014c

В русской версии Windows ошибка может быть такая:

Ваш компьютер нуждается в ремонте Данные конфигурации загрузки для вашего ПК отсутствуют или содержат ошибки Файл:EFIMicrosoftBootBCD  

Код ошибки: 0xc000000f

Эта ошибка говорит о повреждении или даже полном удалении конфигурации загрузчика Windows — Boot Configuration Data (BCD). Если вы попытаетесь восстановить загрузчик на UEFI компьютере с помощью утилиты
bcdedit
, вы получите такую ошибку:

The boot configuration data store could not be found.
The requested system device cannot be found.

Дело в том, что если Windows 10/11 установлена в нативном режиме UEFI на GPT диск, то EFI загрузчик Windows (Windows Boot Manager) хранит программу управления загрузкой и конфигурацию BCD на отдельном скрытом разделе EFI (размером 100 мб с файловой системой FAT32). Утилита bcdedit не видит этот EFI раздел, и соответственно не может управлять конфигурацией загрузчика на нем.

Если при загрузке Windows появляется только черный экран с надписью “Operating System not found”, скорее всего у вас полностью удален загрузчик Windows. Следуйте инструкции по ссылке.

Автоматическое восстановление загрузчика Windows

Процедура автоматического восстановления загрузчика, зашитая в среду восстановления Windows (WinRe), как правило, в таких случаях бессильна. Но попробовать все-же стоит:

  1. Загрузитесь с диска загрузочного диска, диска восстановления или установочной флешки с Windows 10 или 11;
  2. На экране установки нажмите кнопку Восстановление системы;
  3. Затем выберите пункт Поиск и устранение неисправностей -> Восстановление при загрузке и выберите ОС, загрузчик которой нужно попытаться восстановить;Автоматическое восстановление при загрузке
  4. Но скорее всего результат будет отрицательный: Восстановление при загрузке не удалось восстановить компьютервосстановить загрузчик автоматически не удалось

Ручное восстановление загрузчика Windows с помощью BCDBoot

Перейдем к процедуре ручного восстановления EFI загрузчика Windows на UEFI компьютере.

Для восстановления конфигурации загрузчика (BCD), вам нужно загрузить компьютер с оригинального установочного диска с Windows (диска восстановления или специально подготовленной установочной USB флешки с Windows ). После загрузки в среде восстановления нужно открыть окно командной строки: выберите Восстановление системы -> Диагностика -> Командная строка (System Restore -> Troubleshoot -> Command Prompt).

Командную строку также можно запустить, если у вас под рукой есть только установочный диск с Windows. Для этого достаточно на самом первом этапе установки Windows (при выборе языка и раскладки клавиатуры) нажать комбинацию клавиш Shift+F10 (или Shift+Fn+F10 на некоторых моделях ноутбуков).

Коммандная строка восстановление системы Windows 8

В открывшейся командной строке выполните запустите утилиту управления дисками, набрав команду:

diskpart

Выведите список дисков в системе:

list disk

На этом этапе очень важно определить тип таблицы разделов на диске, на котором установлена Windows: MBR или GPT. Дело в том, что EFI загрузчик используется только на дисках с GPT разметкой.

Если у диска в столбце Gpt указана звездочка (
*
), тогда на диске используется таблица разделов GPT, если нет – MBR.

какая таблица разделов на диске gpt или mbr?

Если с помощью diskpart вы определили, что на вашем диске используется GPT разметка, следуйте дальнейшим шагам инструкции по восстановлению загрузчика.

Если у вас разметка MBR, тогда данная инструкция не применима к вашему компьютеру. Скорее всего у вас компьютер с BIOS, или в настройках UEFI включен режим совместимости Legacy/Compatibility Support Module/CSM.

На MBR дисках загрузчик хранится на отдельном разделе System Reserved, а не на EFI разделе (ни в коем случае не конвертируйте таблицу разделов MBR в GPT, пока не исправите загрузчик!!) Используйте другую инструкцию по восстановлению BCD загрузчика на MBR (Master Boot Record) диске.

Выберите диск, на котором установлена ваша Windows (если жесткий диск в системе один, его индекс должен быть равен 0):

sel disk 0

Выведите список томов и разделов в системе:

list partition
list volume

загрузочный efi и msr разделы в windows10

В нашем примере видно, что загрузочный раздел EFI имеет индекс Partition2 (он же Volume 5 с меткой Hidden). Проще всего определить EFI размер по файловой системе FAT32, размеру 100 Мб (это стандартный минимальный размер для Windows компьютеров, в редких случая размер раздела может быть). Чаще всего для него используется метка — System EFI или ESP/ EFI System Partion).

В нашем примере основной раздел, на который установлена Windows, имеет индекс volume 2, отформатирован в файловая система NTFS и ему назначена буква C:.

В вашем случае назначенная буква диске может отличаться. Это зависит, как вы загрузили свой компьютер в среде WinPE. Проще всего определить его по размеру. Если вы не уверены, нужно проверить что на этом диске есть каталог Windows. Выйдите из утилиты diskpart (команда exit) и выполните команду:

dir C:

Убедитесь, что на этом диске есть каталоги
Windows
,
Program Files
,
Users
и прочие.

определить диск с установленной windows в winpe

Если этих каталогов нет, значит вашему диску с Windows назначена другая буква диска. Проверьте содержимоет дисков с другими буквами.

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

В таблице также обязательно должен быть раздел MSR (Microsoft System Reserved) размером 16 мб в Windows 10/11 (или 128 Мб в Windows 8.1).

Назначьте скрытому EFI разделу произвольную букву диска (например, M:):

select volume 5
assign letter M:

Должна появится строка, свидетельствующая об успешном назначении буквы диска разделу EFI:

DiskPart successfully assigned the drive letter or mount point.

Завершите работу с diskpart:

exit

Перейдите в каталог с загрузчиком на скрытом разделе:

cd /d m:efimicrosoftboot

В данном случае M: это буква диска, присвоенная разделу EFI чуть выше. Если каталог EFIMicrosoftBoot отсутствует
The system cannot find the path specified
), попробуйте следующие команды:

cd /d M:Boot

или

cd /d M:ESDWindowsEFIMicrosoftBoot

На этом этапе многие рекомендуют выполнить следующие команды, которые должны перезаписать загрузочную запись раздела, найти установленные Windows и добавить их в BCD:

bootrec /fixboot
bootrec /scanos
bootrec /rebuildbcd

или даже:

bootrec /FixMbr
(восстановление MBR записи для GPT диска выглядит странным)

Все эти команды применимы только для дисков с MBR. Если ваш компьютер загружается в UEFI режиме, то на нем обязательно используется таблица разделов GPT (как раз наш случай). Поэтому при запуске команд
bootrec
вы увидите ошибку:
access is denied

Для исправления загрузочных записей на EFI разделе нужно использовать утилиту
BCDBoot
, а не bootrec.

Утилита BCDBoot позволяет восстановить файлы загрузчика на EFI разделе, скопировав их системного каталога на разделе с Windows. Конфигурация загрузчика BCD пересоздается с помощью шаблона %WINDIR%System32ConfigBCD-Template.

С помощью команды
attrib
снимите атрибуты скрытый, read-only и системный с файла BCD:

attrib BCD -s -h -r

Удалите текущий файл с конфигурацией BCD, переименовав его (так вы сохраните старую конфигурацию в качестве резервной копии):

ren BCD BCD.bak

С помощью утилиты bcdboot.exe нужно скопировать из системного каталога критические файлы среды загрузки UEFI в загрузочный EFI раздел и пересоздать конфигурацию загрузчика в хранилище BCD:

bcdboot C:Windows /l en-us /s M: /f ALL

где,

  • C:Windows – путь к корневому системному каталогу Windows на диске (это ваш диск, на который была установлена ваша Windows, мы узнали его ранее с помощью команды diskpart);
  • /f ALL – означает, что необходимо скопировать файлы среды загрузки Windows, включая файлы для компьютеров с UEFI и BIOS (теоретическая возможность загружаться на EFI и BIOS системах). Чтобы скопировать только EFI загрузчик, используйте команду /f UEFI;
  • /l en-us — определяет языковой стандарт, который используется при инициализации хранилища BCD. По умолчанию используется en-US — английский язык (США);
  • /s M: — скопировать файлы EFI загрузчика на указанный раздел;
  • – эта новая опция BCDBoot в Windows 10, которая позволяет перезатереть имеющиеся загрузочные записи при создании нового хранилища (в том числе debugsettings). Используйте этот параметр, чтобы игнорировать старые настройки и создать полностью чистую конфигурацию BCD загрузчика;
  • /v – используется для включения режима вывода подробной информации BCDBoot..

Теперь, если выполнить команду bcdedit, вы увидите следующую картину:

В секции диспетчера загрузки Windows (Windows Boot Manager) должна появится запись, указывающая на полный путь к файлу управления загрузкой UEFI. В этом примере он находится на разделе 2 (
partition=DeviceHarddiskVolume2
), путь
EFIMICROSOFTBOOTBOOTMGFW.EFI
.

bcdedit вывод конфигурации windows boot manager файл bootmgfw.efi

Windows Boot Manager
--------------------
identifier              {bootmgr}
device                  partition=DeviceHarddiskVolume2
path                    EFIMicrosoftBootbootmgfw.efi
description             Windows Boot Manager
locale                  en-US
inherit                 {globalsettings}
bootshutdowndisabled    Yes
default                 {CURRENT}
resumeobject            {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
displayorder            {default}
toolsdisplayorder       {memdiag}
timeout                 30
Windows Boot Loader
-------------------
identifier              {current}
device                  partition=C:
path                    Windowssystem32winload.efi
description             Windows Server 10
locale                  en-US
inherit                 {bootloadersettings}
recoverysequence       {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
recoveryenabled         Yes
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              Windows
resumeobject            {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

В секции Windows Boot Manager должен быть указан путь к EFI разделу (
=DeviceHarddiskVolume2
), путь к файлу управления загрузкой (bootmgfw.efi). В секции Windows Boot Loader указан раздел Windows и путь к EFI загрузчику Windows (
Windowssystem32winload.efi
). При включении компьютер передаст управление диспетчеру загрузки EFI, который запустит загрузчик Windows.

Возможные ошибки:

Перезагрузите компьютер, отключите загрузочный диск. Если вы все сделали правильно, в выборе устройств загрузки должен появиться пункт Windows Boot Manager в котором можно выбрать загрузку нужной операционной системы. Ваш EFI загрузчик и конфигурация BCD успешно восстановлены!

В некоторых случаях после восстановления BCD загрузчика, при загрузке Windows появляется ошибка
BAD SYSTEM CONFIG INFO
. Чтобы исправить ошибку:

Убедитесь, что вы не вносили недавно изменения в настройки UEFI

Загрузитесь с установочной/загрузочной флешки и измените конфигурацию загрузчика командами:

  • bcdedit /deletevalue {default} numproc
  • bcdedit /deletevalue {default} truncatememory

На чтение 3 мин. Просмотров 29.8k. Опубликовано 03.09.2019

Bootloops и BSOD – это то, с чем сталкивается каждый пользователь ПК. Важно не паниковать и не пытаться определить причину проблемы. В этом случае некоторые пользователи застряли в EFI Shell после перезагрузки компьютера.

Для некоторых ошибка предшествовала внезапному отключению, в то время как другие не испытывали ничего необычного до ошибки EFI Shell. Мы нашли 3 возможных решения этой проблемы и поместили их ниже.

Содержание

  1. Как исправить ошибки EFI Shell при загрузке ПК
  2. Решение 1. Подключите жесткий диск к другому порту
  3. Решение 2. Отключите MSI Fast Boot или UEFI Boot в BIOS
  4. Решение 3 – Удалить батарею CMOS

Как исправить ошибки EFI Shell при загрузке ПК

  1. Подключите жесткий диск в другой порт
  2. Отключить MSI Fast Boot или UEFI Boot в BIOS
  3. Удалить CMOS аккумулятор

Решение 1. Подключите жесткий диск к другому порту

Первый шаг, с которым мы сталкиваемся как возможное решение, – это изменение порта жесткого диска. По-видимому, переключая порты SATA, некоторым пользователям удалось получить EFI (Extensible Firmware Interface). Это, конечно, указывает на некоторые аппаратные проблемы, поэтому, даже если ваш компьютер может загрузиться в систему, всегда есть страх перед HDD или, что менее вероятно, проблемами с материнской платой.

Кроме того, если вы застряли в цикле загрузки, попробуйте выключить компьютер и переключить слоты оперативной памяти. Если у вас есть две RAM-карты, поменяйте их местами. Также рекомендуется отключить все USB-устройства, за исключением клавиатуры.

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

Решение 2. Отключите MSI Fast Boot или UEFI Boot в BIOS

Каждый OEM материнской платы имеет несколько конкретных настроек. Хотя некоторые из них являются уловками, такие функции, как MSI Fast Boot, часто используются для ускорения загрузки в систему.

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

Кроме того, если у вас UEFI загружается где-то в настройках EFI, отключите его. Это еще одна возможная причина проблемы. Кроме того, попробуйте сбросить настройки EFI до заводских настроек по умолчанию. Таким образом, вы будете уверены, что никаких изменений не было.

  • ОТНОСИТЕЛЬНО: 5 лучших программ для восстановления загрузки Windows 10, чтобы оживить ваш компьютер в 2019 году

Решение 3 – Удалить батарею CMOS

Наконец, если ни один из предыдущих шагов не вывел вас из EFI Shell, мы можем предложить только одно решение. А именно, конфигурация BIOS/UEFI может быть повреждена, и единственный реальный способ решить эту проблему в этом текущем состоянии – извлечь батарею CMOS.

Таким образом, вся кэшированная конфигурация будет сброшена, и вы сможете загрузить систему. Конечно, это означает, что все жесткие диски работоспособны.

Это не совсем сложно. Просто выключите компьютер и удалите все кабели. Получите доступ к внутренней части корпуса, и где-то посередине материнской платы вы увидите батарею для ручных часов. Удалите его и вставьте снова. Подключи все и попробуй еще раз. Если жесткий диск распознан и установлен в качестве первого варианта загрузки, рассмотрите возможность переустановки системы. Просто не забудьте сделать резервную копию ваших файлов.

Если у вас есть альтернативные решения, о которых мы забыли упомянуть, обязательно сообщите нам об этом в разделе комментариев ниже.

В данной статье вы узнаете, что делать если после покупки нового ноутбука (Acer, Asus, Dell, Lenovo и др) который вы берете без предустановленной операционной системы Windows c целью экономии денег, а придя домой втыкаете загрузочную флешку с Windows 10, но на мониторе вместо установочного экрана у вас светится желто-белые надписи :

EFI shell version 2.60 current running mode 1.1.2  или EFI shell version 2.70 – что делать?

Всем добрый ночи! из-за большой загрузки никак не могу часто обновлять и добавлять на блог новый контент, но сегодня особый случай) Ночью позвонил коллега с работы который купил себе на день рождение ноутбук Acer, но с целью экономии выбрал системы без установленного Windows 10, что я считаю правильным решением ибо нафиг оно там надо)

но статья не об этом, а о том, что производители дабы отбить желание своих покупателей от таких ноутов создают им подлянку в виде UEFI shell которая встречает радостного владельца кучей текста в котором только НЕО из матрицы может быстро считать, что этой системе надо)))

EFI shell version 2.60 current running mode 1.1.2

Я если честно с такой штуковиной никогда не сталкивался и сразу полез искать пути решения и прокалупались мы где то мин 20-30 пока я читал хелпы

В итоге данная фигня лечится очень просто!!!

Необходимо просто набрать команду: Exit и нажать энтер

Вот и все) у вас система закроет этот EFI shell и пойдет грузиться дальше)))

Чувак ты бог, спасибо большое! )

24.27%

Проголосовало: 2456

Если Вам не помогла эта статья, читайте мою новую статью актуальную на 2021-2022 год, где я показываю как выйти из EFI Shell

Единственное с чем Вы сталкнетесь когда закроете биос и будете с вожделением ждать установку Windows у вас на экране появится вот такой замок)

ERROR - Secutity Boot Fail

но это из-за того, что нужно отключить Security Boot в биосе, но это вы уже можете прочитать в этой статье – Ошибка Security boot fail 

или посмотреть мое видео:

В данной статье мы разобрали вопросы:

  1. Ошибка при первом включении компьютера/ноутбука efi shell version 2.70
  2. UEFI Shell: Что делать если не загружается ОС?
  3. как выйти из оболочки EFI при включении компьютера?
  4. Efi shell как установить виндовс 10 с флешки?
  5. При запуске ПК efi shell version?

Введение

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

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

Те, кто заинтересовался — добро пожаловать под кат.

Подготовка

Сразу же сделаем свой каталог для наших упражнений в корне edk2 и назовем его EducationPkg. Все проекты будем создавать внутри него. Можно создавать в корне edk2 и каждый отдельный проект, никаких препятствий для этого нет, но примерно на десятом проекте в корне разведется зоопарк из своих проектов и пакетов фреймворка edk2, что приведет, в лучшем случае, к путанице. Итак, создаем каталог C:FWedk2EducationPkg.

Использование UEFI Driver Wizard

Созание набора файлов для проекта edk2 — большая тема, заслуживающая отдельной статьи. Можно про это почитать, если хочется узнать правду прямо сейчас, в документе EDK II Module Writer’s Guide, глава 3 Module Development – здесь или погуглите. Мы же пока будем использовать для создания набора файлов интеловскую утилиту UEFI Driver Wizard, которая лежит в скачанном каталоге в C:FWUEFIDriverWizard

Запускаем UEFI Driver Wizard, и первое, что надо сделать – указать рабочую среду Workspace C:FWedk2 по команде File → OPEN WORKSPACE. Если этого не сделать вначале, то UEFI Driver Wizard заботливо проведет нас по всем этапам создания, а потом, с извинениями, скажет, что проект драйвера создать не может.

После указания Workspace выбираем File → New UEFI Driver и производим следующие действия:

1. Жмем на кнопку Browse, заходим в каталог C:FWedk2EducationPkg и создаем внутри него свой каталог MyFirstDriver, в котором и будем работать дальше. Имя драйвера примет то же название

2. Выставляем Driver Revision в 1.0. Меньше единицы выставлять не советую — в Wizard ошибка, в результате которой ревизия получается 0.0 после создания файлов проекта.

3. Все остальное оставляем без изменений, так чтобы получилось, как показано на скриншоте

Жмем кнопку Next и переходим к следующему экрану:

Ставим галочки напротив Component Name Protocol и Component Name 2 Protocol, остальное не трогаем:

и после сразу жмем Finish, не трогая другие настройки. Получаем сообщение об успешном создании проекта:


Жмем Ок и закрываем UEFI Driver Wizard, он нам больше не понадобится.

Добавление модуля в список для компиляции

Поскольку в мире ничего идеального нет, нам придется вручную добавить строчку для нашего драйвера в список модулей для компиляции. Тут надо остановиться и дать небольшую справку.

Все модули в edk2 входят в т.н. рackages – группы модулей, которые объединены между собой по какому-то общему признаку. Чтобы включить новый модуль в состав какого-либо package, нам необходимо добавить путь к исходникам модуля в файл PackageName.dsc (dsc – сокращение от Description), и этот модуль будет компилироваться в составе Package. UEFI Wizard Driver наш драйвер для компиляции добавить автоматически, увы, не может по объективным причинам (ну откуда ему знать, что за свой новый package вы создали (или с каким из существующих намерены работать?). Поэтому – прописываем ручками.

Просьба понимать, что наш EducationPkg — пока не package, а всего лишь набор проектов, и не более того.

Открываем файл C:FWedk2Nt32PkgNt32Pkg.dsc, ищем в нем строчку

# Add new modules here

и после этой строки прописываем путь к файлу MyFirstDriver.inf нашего драйвера относительно C:FWedk2. Должно получиться вот так:

# Add new modules here
EducationPkg/MyFirstDriver/MyFirstDriver.inf
##############################################################################

Очень важное лирическое отступление

Теперь вы уныло думаете, что придется снова настраивать проект в Visual Studio, и совершенно напрасно. Вспомните, мы в первой статье нигде не указали, о каком именно проекте идет речь. Поэтому править ничего не надо, компиляция после добавления в Nt32Pkg нашего inf-файла пойдет и так. Это приводит нас к очень важному следствию: мы можем добавить в уже имеющийся проект Visual Studio, например, NT32, файлы любого проекта из огромного дерева edk2 и все они будут доступны на редактирование и – это главное – постановку контрольных точек, просмотра Watch и всех остальных возможностей, которые предлагает Visual Studio. Собственно, в этом и состоит одно из наиболее интересных преимуществ данного подхода к работе в UEFI с помощью Visual Studio. И при нажатии на F5 перед началом компиляции будет произведено автосохранение измененных исходников, добавленных в проект. Мы, правда, платим за этот подход увеличенным временем компиляции, но дальше разберемся и с этой проблемой.

Давайте проделаем то, о чем только что говорили, для нашего проекта. Щелкаем в Visual Studio правой клавишей на проекте NT32 (не забыв переключить его в проект по умолчанию в Solution), выбираем Add → Existing Item, переходим в наш каталог

C:FWedk2EducationPkgMyFirstDriver

выделяем мышкой все файлы и жмем на Add, добавляя их в наш проект NT32.

Компиляция и запуск драйвера

Жмем в Visual Studio на F5 или кнопку Debugging, ждем загрузки Shell, в ней вводим:

fs0:
load MyFirstDriver.efi

И затем смотрим на сообщение об успешной загрузке нашего драйвера. Он ничего не делает, что совсем не удивительно – никакую функциональность в него мы еще не добавляли. Нам надо лишь проверить, что мы правильно добавили наш драйвер в среду edk2, и не более того.
Вот то, что мы должны видеть (адрес может быть любой):


Закрываем окно нажатим кнопки Stop Debugging, или Shift + F5 в Visual Studio.

Добавление своего кода

Открываем в Visual Studio файл MyFirstDriver.c из получившегося дерева проекта и добавляем в него наш код. Но вначале немного теории, перед тем, как перейдем к практике.

В UEFI BIOS все взаимодействие с «железом» — в нашем случае, его эмуляцией на виртуальной машине – происходит через протоколы, вот прямо так взять и записать определенный байт в определенный порт — нельзя. В очень упрощенном виде можно рассматривать протокол как имя “класса”, экземпляр которого создается для работы с устройством при его регистрации в системе. Как и обычный экземпляр класса, протокол содержит данные и функции, и вся работа с аппаратурой обеспечивается вызовом соответствующих приватных функций класса.

При работе в UEFI используются таблицы, в которых содержатся указатели на все экземпляры «классов». Этих таблиц несколько, в случае с нашим драйвером мы используем System Table, используя уже объявленный указатель gST. Иерархия этих таблиц довольно проста: есть основная таблица System Table, в которой содержатся (среди прочего) ссылки на таблицы Boot Services и Runtime Services. Впрочем, наверное, будет проще показать код:

gST = *SystemTable; 
gBS = gST->BootServices; 
gRT = gST->RuntimeServices;

По названиям переменных: gST расшифровывается как:
g — означает, что переменная глобальная
ST, как вы уже догадались, означает System Table

Итак, наша задача – послать на устройство вывода (в нашем случае – дисплей) строку I have written my first UEFI driver. Хорошо бы, конечно, при этом в unix-style использовать ту же printf и просто указать разные потоки, но увы – с использованием printf в UEFI есть очень серьезные ограничения, поэтому пока давайте оставим ее в сторонке, до лучших времен.

Вставим вывод нашей строки в функцию EntryPoint() нашего драйвера. Добавляем в области объявления переменных нашу переменную типа CHAR16 (используется двухбайтовая кодировка символов UCS-2) в функции MyFirstDriverDriverEntryPoint() в MyFirstDriver.c:

CHAR16 *MyString = L"I have written my first UEFI driverrn";

Лирическое отступление

edk2 не прощает Warning-ов, для него все едино – что Warning, что Error – он посылает на, хм, исправление в обоих случаях, так опции компилятора в edk2 настроены по дефолту. Он, таким образом, неявно говорит «Пионэрам здесь не место». Отключить эту опцию в конфигах, разумеется, можно, но не стоит здесь объяснять, как это сделать – если вы сможете ее отключить, то и убрать источники Warning-ов в коде тоже сможете, и вам это не нужно. Поэтому приводите типы явно и комментируйте неиспользуемые переменные. Иногда, в случае использования сторонних исходников, полное подавление ошибок может оказаться довольно непростой задачей.

После, в самом конце функции MyFirstDriverDriverEntryPoint() вставьте код вывода нашей текстовой переменной на консоль вывода (экран по дефолту, в нашем случае):

gST->ConOut->OutputString(gST->ConOut, MyString);

Жмем на F5, вводим fs0:, load MyFirstDriver.efi, и получаем нашу строку на экране:

Первая программа с нуля написана и работает. Можем себя поздравить.

Разберем сейчас эту нашу строчку:

gST->ConOut->OutputString(gST->ConOut, MyString);

В ней:
gST – указатель на таблицу System Table
ConOutпротокол, или, как мы его условно обозвали, «класс» вывода текста
OutputString – сама функция вывода. Первый параметр в ней, как легко догадаться – this для нашего протокола EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.

Давайте переформулируем вышесказанное в другом виде, для лучшего понимания. Вот иерархия главной таблицы System Table, получена в окне Watch при останове на breakpoint в Visual Studio. Подсвечена используемая нами функция OutputString. Обратите также внимание на элементы BootServices и RuntimeServices в нижней части таблицы, о чем шла речь ранее:

Ввод текста с клавиатуры и вывод его на экран

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

Сделаем еще один скриншот той же gST, но уже в части ConIn. Выглядит он вот так:


В нашем следующем примере будем запоминать вводимый с клавиатуры пароль, отображая вводимые символы разноцветными звездочками в новогоднем (или наркоманском, как заметил один товарищ) стиле, а после нажатия Enter — выводить пароль в следующей строке. Это всего лишь учебный пример, замещение вводимого пароля звездочками уже реализовано в HII API, равно как и повторный ввод пароля, и проверка совпадения повторного ввода.

Дисклаймер

По фэн-шуй надо бы сделать «упрощающий» указатель *ConOut = gST->ConOut, но в целях обучения – оставим как есть, чтобы не вспоминать, к какой из таблиц обращаемся в данный момент.

Вначале добавим локальные переменные в функции MyFirstDriverDriverEntryPoint() вместо нашей ранее добавленной переменной MyString.

  UINTN					EventIndex;
  UINTN					Index = 0;
  EFI_INPUT_KEY				Keys;
  CHAR16		        	PasswordString[256];

Теперь вводим текст программы, заместив ранее добавленную нами функцию

gST->ConOut->OutputString(gST->ConOut, MyString);

на следующее:

gST->ConOut->ClearScreen(gST->ConOut); // Надеюсь, понятно
gST->ConOut->SetCursorPosition(gST->ConOut, 3, 10); // Ставим курсор в 10-ю строку, 3-ю позицию
gST->ConOut->OutputString(gST->ConOut, L"Enter password up to 255 characters lenght, then press 'Enter' to continuern"); //Выводим нашу строку с вышеуказанной позиции
	do {
                //ждем нажатия на клавишу
		gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
                // считываем код нажатия на клавишу 
		gST->ConIn->ReadKeyStroke (gST->ConIn, &Keys);
                //Изменяем цвета шрифта и фона	
		gST->ConOut->SetAttribute(gST->ConOut, Index & 0x7F);  
                // формируем строку для вывода
		PasswordString[Index++] = (Keys.UnicodeChar); 
                // Заменяем текст на звездочки – пароль же, враги рыщут повсюду 
		gST->ConOut->OutputString(gST->ConOut, L"*");
	} //пока не нажали Enter или пока не ввели 255 символов, заполняем текстовый массив вводимыми буквами
           while (!(Keys.UnicodeChar == CHAR_LINEFEED || Keys.UnicodeChar == CHAR_CARRIAGE_RETURN || Index == 254)); 
// Терминация текстовой строки, занимает 1 элемент массива
PasswordString[Index++] = '';
// Возвращаем исходные цвета шрифта и фона
gST->ConOut->SetAttribute(gST->ConOut, 0x0F);
// Дальше понятно, уже проходили
gST->ConOut->OutputString(gST->ConOut, L"rnEntered password is: rn"); 
gST->ConOut->OutputString(gST->ConOut, PasswordString);
gST->ConOut->OutputString(gST->ConOut, L"rn"); 

Жмем F5 и устраиваемся в уже ставшей привычной позе на пару минут:

После приглашения Shell, как всегда, вводим fs0: и load MyFirstDriver (или load my и затем два раза жмем на Tab, ибо Shell). Получаем такую вот картинку (разумеется, текст будет тот, что вы ввели сами):

Жмем Shift+F5, чтобы закрыть отладку, после того, как налюбовались.

Дальше в статье будем знакомиться ближе со средой UEFI Shell, PCD и отладочными сообщениями — без этого двигаться дальше нельзя. Но знакомиться будем не абстрактно, а в полезном процессе ускорения и автоматизации запуска драйвера на отладку.

Создание и редактирование загрузочного скрипта UEFI Shell

Теперь, поскольку вы, вероятно, уже перекомпилировали программу не раз и не два, то морально дозрели до того, чтобы сократить это раздражающее время ожидания загрузки UEFI Shell и вбивания каждый раз одних и тех же команд для загрузки нашего драйвера. Начнем с того, что уберем весь ручной ввод текста в Shell написанием соответствующего скрипта. Писать скрипт будем прямо в Shell. С точки зрения здравого смысла, лучше открыть файл скрипта в Far Manager и отредактировать его там, но мало ли какими судьбами в будущем вас выбросит в Shell реальной машины, а не виртуалки с доступом к ее файловой системе с хоста. Поэтому один раз создадим скрипт в редакторе Shell и запишем его, чтобы получить соответствующий навык.

Файл скрипта, исполняемый при старте (подобный autoexec.bat или bashrc) для UEFI Shell, называется startup.nsh, тот самый, что Shell каждый раз предлагает нам пропустить при загрузке. Загрузитесь в UEFI Shell, нажав в Visual Studio клавишу F5, и введите fs0:, чтобы перейти в нашу файловую систему. Теперь из Shell введем команду

edit startup.nsh

и в открывшемся редакторе введем, с переводом строки по Enter:

FS0:
load MyFirstDriver.efi

Дальше жмем F2, затем Enter для записи и затем F3 для выхода из редактора обратно в Shell.

Перекомпилять все заново на этот раз не будем, поскольку мы в программе ничего не меняли. Наберем в Shell команду Exit, и в открывшемся текстовом окне a-la BIOS Setup, а в терминах UEFIMain Form, выберем пункт Continue. После этого нас снова выбросит в Shell, но в этот раз исполнится созданный нами скрипт startup.nsh и автоматом запустится наш драйвер.

Отладочные сообщения

Пока мы можем писать отладочные сообщения на экран, но когда будем работать с формами HII (Human Interface Infrastructure) – такой возможности не представится, экран будет занят формами конфигурирования аппаратуры. Что делать в этом случае?

Несколько отвлеченная тема

В самом начале после получения новой платы с завода не всегда, ох, не всегда бывает доступна дисплейная консоль вывода отладки. По вероятности возможных ошибок подключения дисплей идет сильно впереди последовательного порта, в котором напортачить можно разве что с направлением RX-TX. Поэтому существует также и вывод в последовательный порт, полностью аналогичный выводу на экран, с заменой ConOut на StdErr. Т.е. функция

gST->ConOut->OutputString(gST->ConOut, L”Test string”);

будет выводить “Test string” на дисплей, а функция

gST->StdErr->OutputString(gST->StdErr, L”Test string”);

будет выводить тестовое сообщение в последовательный порт. Попробуйте. Позднее мы будем перенаправлять вывод в виртуальной машине из последовательного порта в лог-файл, что может оказаться полезным в будущем — писать логи на флешку, вставленную в USB порт, на реальном железе.

Вывод отладочной информации в окно OVMF

Для вывода информации в окно OVMF есть макрос DEBUG”, который обычно используется следующим образом:

DEBUG((EFI_D_INFO, "Test message is: %srn", Message));

Где первый аргумент – некий аналог линуксового уровня сообщений об ошибках ERROR_LEVEL, а второй, как можно догадаться, указатель на строку, которую надо вывести в OVMF консоль.

Первый аргумент может принимать следующие значения:

#define EFI_D_INIT 0x00000001 // Initialization style messages
#define EFI_D_WARN 0x00000002 // Warnings
#define EFI_D_LOAD 0x00000004 // Load events
#define EFI_D_FS 0x00000008 // EFI File system
#define EFI_D_POOL 0x00000010 // Alloc & Free's
#define EFI_D_PAGE 0x00000020 // Alloc & Free's
#define EFI_D_INFO 0x00000040 // Informational debug messages
#define EFI_D_VARIABLE 0x00000100 // Variable
#define EFI_D_BM 0x00000400 // Boot Manager (BDS)
#define EFI_D_BLKIO 0x00001000 // BlkIo Driver
#define EFI_D_NET 0x00004000 // SNI Driver
#define EFI_D_UNDI 0x00010000 // UNDI Driver
#define EFI_D_LOADFILE 0x00020000 // UNDI Driver
#define EFI_D_EVENT 0x00080000 // Event messages
#define EFI_D_VERBOSE 0x00400000 // Detailed debug messages that may significantly impact boot performance
#define EFI_D_ERROR 0x80000000 // Error

Регулируя уровень появления этих сообщений в логе, мы можем выдержать требуемый баланс между уровнем логгирования и производительностью системы в целом.

Еще немного о макросе DEBUG

1. Его вывод имеет форматирование и работает как форматирование printf. Для отладки очень полезен формат %r, который выводит диагностическую переменную Status не в виде 32-битного числа в HEX, а в виде человекочитаемой строки типа Supported, Invalid Argument и т.п.

2. Этот макрос автоматически отключается при смене Debug на Release, поэтому не спешите его комментировать или обвешивать ifndef-ами – все уже сделано за нас.

3. Двойные скобки там действительно нужны. Попробуйте убрать и посмотреть, что получится.

Небольшой пример

Чтобы проиллюстрировать написанное, добавим в функцию MyFirstDriverDriverEntryPoint(), сразу после объявления переменных, вывод текста из нескольких сообщений в лог с разными уровнями отладки и посмотрим, какие из них выведутся, а какие будут отфильтрованы:

DEBUG((EFI_D_INFO, "Informational debug messagesrn"));
DEBUG((EFI_D_ERROR, "Error messagesrn"));
DEBUG((EFI_D_WARN, "Warning messagesrn"));

Запускаем на отладку и смотрим в окно OVMF:

Видно, что сообщения с уровнем EFI_D_INFO и EFI_D_ERROR попали в лог, а с уровнем EFI_D_WARN – не попало.

Механизм регулирования уровней отладки достаточно прост: как мы видим в списке выше, каждый уровень характеризуется одним битом в 32-битном слове. Чтобы отфильтровать ненужные нам в данный момент сообщения, мы ставим битовую маску на значение уровня, который отсекает биты, не попадающие в данную маску. В нашем случае маска была 0x80000040, поскольку уровень EFI_D_WARN со значением 0x00000002 отфильтровался и не попал в вывод, а уровень EFI_D_INFO со значением 0x00000040, и EFI_D_ERROR с его значением 0x80000000 попали в маску и соответствующие сообщения были выведены.

Сейчас не будем дальше углубляться в рассмотрение реализации механизма настройки уровня вывода отладки, рассмотрим только способы его изменения на практике. Их два, первый из них быстрый, а второй – правильный. Начнем, понятно, с быстрого. Открываем файл c:FWNt32PkgNt32Pkg.dsc и ищем в нем строку, содержащую PcdDebugPrintErrorLevel. Вот она:

gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000040

Изменяем значение маски на 0x80000042 и запускаем на построение и отладку снова.

Поскольку мы изменили конфигурационный файл, edk2 будет снова долго пересобирать все-все-все бинарники для Nt32Pkg, но этот процесс конечен, и вот мы видим в логе закономерные все три строчки, что и требовалось доказать:

Как сделать быстро, разобрались. Теперь сделаем правильно.

Platform Configuration Database (PCD)

Проблема предыдущего подхода в том, что дерево edk2 и пакет Nt32Pkg у нас единственные, и менять системные настройки ради единственного проекта – прямой путь в преисподнюю, ибо в лучшем случае через неделю вы про это изменение забудете напрочь и будете проклинать исчадье ада под названием edk2, что месяц назад исправно создавало из оттестированных исходников под версионным контролем именно то, что надо, а сейчас выдает нечто совершенно другое. Поэтому в edk2 реализован механизм изменения системных настроек под единственный проект, чтобы локализовать изменения этих настроек только для данного проекта. Называется этот механизм PCDPlatform Configuration Database, и позволяет очень многое. Вообще, хорошим стилем в edk2 считается выносить из исходников в PCD любой параметр, который может быть изменен в будущем. Объем статьи не позволяет остановиться на описании PCD подробнее, поэтому лучше подробности про PCD посмотреть вот здесь в п.3.7.3 или вот здесь. На первое время вполне достаточно ограничиться прочтением файла C:FWedk2MdeModulePkgUniversalPCDDxePcd.inf

С точки зрения практики, конфигурирование при помощи PCD производится вот так: в том же самом файле c:FWNt32PkgNt32Pkg.dsc изменяем уровень показа сообщений в окне OVMF:

EducationPkg/MyFirstDriver/MyFirstDriver.inf {
  <PcdsFixedAtBuild>
    gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000042
 } 

Не спешите сразу записывать файл. Вначале поправьте обратно 0x80000042 к дефолтному значению 0x80000040 в строчке, которую мы редактировали ранее:

gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000042

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

Ускоряем отладку дальше

Уберем еще пару раздражающих задержек при запуске на отладку. Очевидно, первый кандидат – это ожидание тех самых 5 сек перед запуском скрипта startup.nsh. Оно, конечно, можно и на пробел нажать, но любой

уважающий себя лентяй

программист должен автоматизировать ручные операции насколько возможно.

Теперь придется противоречить тому, что было сказано ранее. Проблема состоит в том, что в эти 5 секунд задержки прописываются не через PCD, а вопреки фэн-шуй, напрямую, в исходниках Shell. Поэтому и нам, хотим мы того или нет, придется поступить аналогично: откроем файл C:FWedk2ShellPkgApplicationShellShell.c и поменяем в инициализации значение «5» на «1»

ShellInfoObject.ShellInitSettings.Delay = 1;//5;

Можно было бы и в 0 выставить, но мало ли… Забудем поменять на реальной аппаратной системе, а возможности перекомпилировать потом не будет.

Жмем F5 и радуемся 1 сек. задержки вместо 5.

Если кто-то знает, как выставить это значение задержки правильно, через PCD и без правки исходников Shell — дайте знать в личку или в комменты, я поправлю.

Еще ускоряемся

Вспоминаем про строку прогресса, а на самом деле – просто таймера ожидания выбора опции загрузки. Вот так это выглядит на основном экране:

А в окне запуска OVMF это смотрится несколько иначе:

Как говорил Винни-Пух, «Это ж-ж-ж – неспроста!» Надо найти источник и также уменьшить до 1 сек.

Запускаем поиск по всем файлам с расширением *.c строки Zzzzz, находим эту строку в исходнике C:FWMdeModulePkgUniversalBdsDxeBdsEntry.c и видим там вот такой блок кода:

  DEBUG ((EFI_D_INFO, "[Bds]BdsWait ...Zzzzzzzzzzzz...n"));
  TimeoutRemain = PcdGet16 (PcdPlatformBootTimeOut);
  while (TimeoutRemain != 0) {
    DEBUG ((EFI_D_INFO, "[Bds]BdsWait(%d)..Zzzz...n", (UINTN) TimeoutRemain));
    PlatformBootManagerWaitCallback (TimeoutRemain);

Соответственно, понятно, что переменная TimeoutRemain читается из конфигурационной базы PCD, в параметре PcdPlatformBootTimeOut. Ок, открываем наш конфигурационный файл c:FWNt32PkgNt32Pkg.dsc, ищем там строку с PcdPlatformBootTimeOut:

  gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|L"Timeout"|gEfiGlobalVariableGuid|0x0|10

Здесь уже вариант, как ранее, с конфигурацией PcdDebugPrintErrorLevel исключительно для нашего драйвера, не получится – в данном случае задержка будет выполняться задолго до того, как наш модуль MyFirstDriver будет загружен стартовым скриптом startup.nsh, поэтому придется менять глобально, хотим мы этого или нет. В данном случае — хотим, потому что эта задержка в процессе разработки драйверов обычно ни к чему. Меняем 10 на 1 в нашем конфигурационном файле, жмем F5 и радуемся быстрой загрузке. На моей машине это занимает теперь 23 секунды.

Еще тюнинг, на этот раз — интерфейса

Убираем второй дисплей, который нам незачем пока что, а раздражать уже начал. Правим строки в нашем любимом конфигурационном файле c:FWNt32PkgNt32Pkg.dsc, открыв его и убрав !My EDK II 2 и !UGA Window 2 в двух строчках, чтобы получилось:

gEfiNt32PkgTokenSpaceGuid.PcdWinNtGop|L"UGA Window 1"|VOID|52

и

gEfiNt32PkgTokenSpaceGuid.PcdWinNtUga|L"UGA Window 1"|VOID|52

Можно, разумеется, и саму надпись в заголовке окна UGA Window 1 поменять на что-то духовно более близкое вам лично, но это уже на ваше усмотрение.

На будущее

Есть еще один большой резерв сокращения времени компиляции и запуска проекта (в разы) – компилировать не весь edk2, а только наш модуль. Но об этом, как говорится – в следующей серии. Можете пока попробовать сделать это сами, решение элементарное, как убедитесь чуть позже.

Вам, возможно, сейчас кажется излишеством — уделение такого большого внимания сокращению сроков компиляции и запуска, но поверьте — когда начнете писать свои программы, разница между целевыми 10 сек до запуска, к которым мы придем, и 2 мин, которые были вначале — огромна. Потраченное сейчас время очень быстро окупится — третья статья не за горами, а в ней отлаживаться придется много.

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

Выделение в статье ключевых слов жирным шрифтом…


78.33%
Полезно, улучшает восприятие текста статьи
47


5%
Не нужно и только отвлекает внимание
3

Проголосовали 60 пользователей.

Воздержались 18 пользователей.

Содержание

  1. Как исправить критическую ошибку Winload EFI на Windows 7 и Windows 10?
  2. Методы решения BSoD Winload EFI
  3. Метод №1 Отключение безопасной загрузки (Secure Boot)
  4. Метод №2 Восстановление загрузочной записи
  5. Метод №3 Утилита BCDBoot
  6. Метод №4 Отключение антивредоносной защиты
  7. Ошибка Windowssystem32winload.efi в Windows 10
  8. Исправить ошибку Winload.efi
  9. 1. Восстановить BCD
  10. 2. Отключить безопасную загрузку
  11. 3. Проверка системных файлов
  12. 4. Отключить раннюю защиту от вредоносных программ
  13. Исправить отсутствующую ошибку Winload.efi в Windows 10
  14. Исправлена ​​ошибка пропуска файла Winload.efi.

Как исправить критическую ошибку Winload EFI на Windows 7 и Windows 10?

Критическая ошибка Winload EFI — ее название уже подсказывает, какие из компонентов операционной системы Windows начали работать некорректно либо и вовсе вышли из строя. Для непросвещенных пользователей: в данном случае виновниками BSoDов могут быть загрузочная запись (MBR) и неправильная конфигурация загрузки ОС.

Вот пример этой ошибки на Windows 10:

Не удалось загрузить приложение или операционную систему, так как необходимый файл отсутствует или содержит ошибки.

Файл: windowssystem32winload.efi
Код ошибки: 0xc*******

Вам потребуются средства восстановления на установочном носителе. Если установочный носитель (например, диск или USB-устройство) отсутствует, обратитесь к администратору или производителю компьютера.

В сегодняшней статье мы посмотрим с вами, как избавиться от критической ошибки Winload EFI, причем в довольно короткие сроки.

Методы решения BSoD Winload EFI

Метод №1 Отключение безопасной загрузки (Secure Boot)

Если ваша материнская плата работает на UEFI, а не на традиционном BIOS, то проблема может заключаться в такой особой функции, как «Безопасная загрузка» (Secure Boot). Работая неправильно, эта функция может буквально препятствовать вашему компьютеру получить доступ к файлу Winload EFI. На Windows 8 и более поздних версиях ОС Майкрософт функция безопасной загрузки активирована по умолчанию.

  1. Пройти в BIOS/UEFI своей материнской платы.
  2. Перейти в раздел/вкладку с конфигурацией системы или ее загрузки.
  3. Найти в списке функцию «Secure Boot» (функция может быть перефразирована в вашем случае) и отключить ее, выставив соответствующий пункт.
  4. Сохранить внесенные изменения и перезагрузить компьютер.

Попробуйте зайти в операционную систему и проверьте, исчезла ли ошибка с файлом Winload EFI.

Метод №2 Восстановление загрузочной записи

Давайте попробуем с вами восстановить загрузочную запись вашей операционной системы. Первым делом вам нужно обзавестись установочным носителем с вашей версией ОС Windows. Можете воспользоваться следующим материалом от самих Майкрософт, чтобы создать подобную вещицу. Как только у вас на руках будет установочный носитель, сделайте вот что:

  • загрузитесь с установочного носителя;
  • доберитесь до окошка с установкой Windows;
  • выберите пункт «Восстановление системы»;
  • далее выберите пункты «Поиск и устранение неполадок→Дополнительные параметры→Командная строка»;
  • добравшись до системной консоли, выполните в ней следующий ряд команд:
    • bootrec /fixboot
    • bootrec /scanos
    • bootrec /fixmbr
    • bootrec /rebuildbcd
  • перезагрузите компьютер.

Не забудьте отключить установочный носитель от своего ПК, чтобы постоянно не загружаться через него. Проверьте наличие ошибки Winload EFI.

Метод №3 Утилита BCDBoot

Воспользуйтесь вышеуказанными шагами, чтобы добраться до командной строки в среде восстановления Windows. Попав в командную строку, сделайте в ней следующее:

  • выполните команды diskpart и list volume;
  • запомните букву системного тома, например, C или D, и выполните команду exit;
  • далее пропишите команду bcdboot C:windows, где C — буква системного тома, и нажмите Enter.

Перед вами должно возникнуть сообщение о том, что файлы загрузки ОС были успешно созданы. Перезагрузите компьютер и попытайтесь зайти в систему привычным образом. Ок, а что делать, если команды не помогли и вы все еще не можете нормально запустить свой ПК? Что же, снова возвращаемся к командной строке в среде восстановления и делаем вот что:

  • вводим команды diskpart и list volume;
  • хорошенько исследуем список; если у вас BIOS и MBR, то запоминаем номер тома NTFS-раздела размером в

500 Мб, а если у вас UEFI и GPT — номер тома FAT-раздела размером в

100 Мб;

  • также запоминаем букву раздела, на котором располагается ваша ОС;
  • теперь выполняем следующий ряд команд:
    • select volume S (где S — номер скрытого раздела);
    • format fs=fat32 (или format fs=ntfs);
    • assign letter=W (или любая другая незанятая буква);
    • exit;
    • bcdboot C:Windows /s W: /f ALL;
    • diskpart;
    • list volume;
    • select volume S;
    • remove letter=W;
    • exit.
  • еще раз перезагружаем компьютер и проверяем, была ли устранена критическая ошибка Winload EFI.
  • Метод №4 Отключение антивредоносной защиты

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

    • Поиск и устранение неисправностей↓;
    • Дополнительные параметры↓;
    • Параметры загрузки↓;
    • Перезагрузить↓;
    • нажмите на кнопку F8, оказавшись на соответствующем экране, чтобы отключить ранний запуск антивредоносного драйвера.

    Вам наконец-то удалось зайти в операционную систему? Поздравляем, однако, возможно, проблема решена лишь от части. Рекомендуем установить все отложенные обновления для своей ОС Windows, а также провести дотошное сканирование системы на наличие вирусов и вредоносных программ. Надеемся, наш материал помог вам избавиться от BSoD с Winload EFI.

    Ошибка Windowssystem32winload.efi в Windows 10

    Winload.efi — это файл интерфейса EFI или расширяемого микропрограммного обеспечения. Эти файлы являются исполняемыми для встроенного программного обеспечения компьютеров, которые основаны главным образом на UEFI и выполняют задачи загрузки файлов в загрузчик компьютера. Эти файлы используются для определенного набора задач, таких как включение компьютера, перезагрузка компьютера, установка Windows, перезагрузка компьютера и другие. Следовательно, Winload.efi становится действительно важным файлом. В случае, если этот файл отсутствует или поврежден, то операционная система Windows не сможет продолжить работу.

    Ошибки показываются в разных видах:

    • Отсутствует winload.efi.
    • winload.efi не может быть найден.
    • winload.efi отсутствует или содержит ошибки.
    • Эта программа не может запуститься, потому что на вашем компьютере отсутствует winload.efi.
    • Для этого приложения требуется файл winload.efi, который не был найден в этой системе.
    • При запуске winload.efi возникла проблема. Указанный модуль не может быть найден.

    Сопровождаемые коды:

    Исправить ошибку Winload.efi

    В первую очередь что вам нужно сделать это попробовать откатить систему назад с помощью точки восстановления . Если у вас нет привычки создавать точку восстановления системы, то рекомендую это делать. А теперь давайте разберем способы, чтобы исправить досадную проблему на синем экране.

    1. Восстановить BCD

    Вам нужно создать установочную флешку Windows 10 и загрузится с нее в дополнительные параметры. Дойдите до пункта «Установить» и ниже нажмите на «Восстановление системы«.

    Далее вас перекинет в дополнительные параметры системы, где перейдите по настройкам «Устранение неполадок» > «Дополнительные параметры» > «Командная строка«.

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

    • bootrec /repairbcd
    • bootrec /osscan
    • bootrec /repairmbr

    2. Отключить безопасную загрузку

    Нужно попробовать отключить Secure Boot в BIOS, если он включен. Для начало зайдите в «Центр обновления Windows» и обновите все предлагаемые драйвера для устройств, если они там имеются. Secure Boot — это своего рода шифратор ключей для проверки сигнатур загрузочного кода. Если подписи не совпадают, то загрузка будет не удачной.

    Чтобы зайти в BIOS перезагрузите ПК или ноутбук, и при включении сразу нажимайте кнопку DEL, F2 или Esc, чтобы попасть в параметры BIOS. У каждого производителя разные кнопки для входа в БИОС . BIOS и UEFI куча разновидностей, я могу лишь примерно показать эту настройку. Рекомендую вбить вашу марку материнской платы в Google или Yandex и поискать в картинках, как отключить Socure boot.

    Примерно в БИОС вы должны пройти по настройкам «Security», «Boot» или «Authentication». Далее вы увидите, что Socure boot (Enable) Включен. Выберите Disable, чтобы отключить. Нажмите F10, чтобы сохранить изменения и перезагрузите ПК.

    3. Проверка системных файлов

    Запустите командную строку от имени администратора и введите команду sfc /scannow . Эта команда проверить системные файлы на повреждения и попытается восстановить их, если таковы имеются. Перезагрузите систему после завершения сканирования.

    4. Отключить раннюю защиту от вредоносных программ

    Вам нужно попасть в дополнительные параметры Windows. Для этого зажмите «Shift«, выберите в меню пуск «Выключение» и «Перезагрузка«.

    Далее идем по параметрам «Поиск и устранение неисправностей» > «Дополнительные параметры» > «Параметры загрузки» > «Перезагрузить» > «Отключить ранний запуск антивирусной защиты«. Нужно нажать F8.

    Исправить отсутствующую ошибку Winload.efi в Windows 10

    Winload.efi – это файл интерфейса EFI или расширяемого микропрограммного обеспечения. Эти файлы являются исполняемыми файлами для прошивки компьютеров, которые основаны главным образом на UEFI и выполняют задачи по загрузке файлов в загрузчик компьютера. Эти файлы используются для определенного набора задач, таких как включение компьютера, перезагрузка компьютера, установка Windows, перезагрузка компьютера и другие. Следовательно, Winload.efi становится действительно важным файлом. Если этот файл потерян, поврежден или поврежден, операционная система Windows не сможет продолжить работу.

    Некоторые из сообщений об ошибках, которые этот файл выдает, когда пропадает или поврежден:

    • отсутствует winload.efi
    • winload.efi не может быть найден
    • winload.efi отсутствует или содержит ошибки
    • Эта программа не может быть запущена, потому что на вашем компьютере отсутствует файл winload.efi
    • Для этого приложения требуется файл winload.efi, который не был найден в этой системе.
    • При запуске [path] winload.efi возникла проблема. Указанный модуль не может быть найден.

    Коды ошибок 0xc0000225 , 0xc00000e и 0xc0000001 связаны с ошибкой Winload.efi file not found .

    Исправлена ​​ошибка пропуска файла Winload.efi.

    Если вы обычно создаете точку восстановления системы, вы можете попытаться отменить любые изменения на вашем компьютере, выполнив восстановление системы, а затем попытаться снова запустить обновление. В случае, если у вас нет привычки создавать точку восстановления системы; Я предлагаю вам начать делать это, потому что это очень сильная функция, которая позволит вам исправить ваш компьютер в ряде сценариев.

    Чтобы исправить эту ошибку, мы будем выполнять следующие исправления:

    1. Восстановить BCD.
    2. Отключить безопасную загрузку.
    3. Запустите проверку системных файлов.
    4. Отключите раннюю защиту от вредоносных программ.

    1] Восстановить BCD

    Чтобы это исправление работало, вам нужно создать загрузочный USB-накопитель Windows 10, а затем загрузить компьютер с его помощью. Затем, когда вы увидите экран приветствия, нажмите Далее , а затем нажмите Восстановить компьютер в левой нижней части окна.

    Затем нажмите Устранение неполадок.

    После этого выберите Дополнительные параметры. А затем Командная строка.

    Теперь, когда у вас открыто окно командной строки, введите следующие команды одну за другой в последовательности, которую они дают для восстановления BCD и восстановления MBR:

    Наконец, введите exit , чтобы закрыть окно командной строки.

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

    2] Отключить безопасную загрузку

    Я бы порекомендовал отключить Secure Boot в настройках BIOS. Сначала загрузите компьютер в Windows 10. Затем перейдите в «Настройки»> «Центр обновления Windows» и проверьте, есть ли у вас что-либо для загрузки, и установите, если вы видите какие-либо предлагаемые обновления. OEM-производители отправляют и обновляют список надежного оборудования, драйверов и операционных систем для вашего ПК.

    После этого вам нужно перейти в BIOS вашего ПК.

    Перейдите в Настройки> Обновление и безопасность> Дополнительные параметры запуска. Когда вы нажмете Перезагрузить сейчас , он перезагрузит ваш компьютер и предложит вам все эти дополнительные параметры.

    Выберите «Устранение неполадок»> «Дополнительные параметры». На этом экране предлагаются дополнительные параметры, в том числе восстановление системы, восстановление при загрузке, возврат к предыдущей версии, командная строка, восстановление образа системы и параметры прошивки UEFI.

    Каждый OEM имеет свой способ реализации опций. Безопасная загрузка обычно доступна на вкладке «Безопасность»> «Загрузка»> «Аутентификация». Установите его на Отключено.

    Также установите для Legacy Support значение «Вкл.» Или «Включено».

    Сохранить изменения и выйти. ПК теперь перезагрузится.

    3] Использование средства проверки системных файлов

    Начните с нажатия кнопки WINKEY + X или правой кнопкой мыши на кнопке «Пуск» и нажмите Командная строка (администратор) или просто найдите cmd . в окне поиска Cortana щелкните правой кнопкой мыши значок командной строки и выберите Запуск от имени администратора. Нажмите Да , чтобы получить приглашение UAC или Контроль учетных записей пользователей. Затем окно командной строки будет наконец открыто. Теперь введите следующую команду для запуска средства проверки системных файлов и нажмите Enter.

    Перезагрузите систему после завершения сканирования.

    Вы также можете использовать нашу бесплатную программу FixWin для запуска утилиты проверки системных файлов одним щелчком мыши.

    4] Отключите раннюю защиту от вредоносных программ

    Это довольно простое решение. Начните с выбора Перезагрузить в меню «Пуск», одновременно нажимая и удерживая клавишу Shift на клавиатуре.

    Это перезагрузит ваш компьютер в Параметры запуска.

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

    Теперь нажмите клавишу F8 , поскольку упомянутая выше опция указана под номером 8.

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

    Сообщите нам, помогло ли вам это сообщение или у вас есть другие предложения.

    Содержание

    1. Как исправить критическую ошибку Winload EFI на Windows 7 и Windows 10?
    2. Методы решения BSoD Winload EFI
    3. Метод №1 Отключение безопасной загрузки (Secure Boot)
    4. Метод №2 Восстановление загрузочной записи
    5. Метод №3 Утилита BCDBoot
    6. Метод №4 Отключение антивредоносной защиты
    7. Содержание:
    8. ↑ Восстановление загрузчика Windows 10
    9. ↑ Как восстановить загрузчик Windows 10
    10. ↑ Способ №1 Подходит для всех без исключения компьютеров и новых ноутбуков с БИОСом UEFI
    11. ↑ Способ №2 Подходит только для новых ноутбуков с БИОСом UEFI или ПК с включённым интерфейсом EFI
    12. ↑ Способ №3 Подходит только для новых ноутбуков с БИОСом UEFI или ПК с включённым интерфейсом EFI
    13. ↑ Способ №4 Подходит только для обычных компьютеров (так как скрытый раздел System Reserved форматируем в файловую систему NTFS)
    14. ↑ Способ №5 Подходит только для обычных компьютеров (так как скрытый раздел System Reserved форматируем в файловую систему NTFS)
    15. Восстановление загрузчика
    16. Автоматическое восстановление загрузчика.
    17. Процедура восстановления загрузчика вручную
    18. Восстановление загрузчика Windows 10 с помощью командной строки
    19. Восстановление загрузчика Windows 10 с помощью командной строки способ второй
    20. Чистим систему от вредоносного программного обеспечения до восстановления загрузчика
    21. Причины неполадок загрузчика
    22. Видеоинструкция
    23. Восстановление удаленного загрузочного EFI раздела в Windows 10
    24. Структура разделов GPT диска для Windows
    25. Что будет, если в Windows 10 отсутствует раздел EFI?
    26. Как вручную создать EFI и MSR разделы на GPT диске?
    27. Восстановление EFI загрузчика и BCD в Windows
    28. Отсутствует или содержит ошибки файл windowssystem32 winload.efi в Windows 10
    29. Включите режим совместимости CSM и отключите Secure Boot
    30. Автоматическое восстановление загрузчика Windows
    31. Отключите функцию защиты ELAM
    32. Выполните проверку дисков на ошибки и целостность системных файлов
    33. Восстановление BCD загрузчика и файла winload.efi для UEFI системы
    34. Пересоздание загрузочных записей в хранилище BCD с помощью bootrec и bcdedit

    Как исправить критическую ошибку Winload EFI на Windows 7 и Windows 10?

    Критическая ошибка Winload EFI — ее название уже подсказывает, какие из компонентов операционной системы Windows начали работать некорректно либо и вовсе вышли из строя. Для непросвещенных пользователей: в данном случае виновниками BSoDов могут быть загрузочная запись (MBR) и неправильная конфигурация загрузки ОС.

    Вот пример этой ошибки на Windows 10:

    Не удалось загрузить приложение или операционную систему, так как необходимый файл отсутствует или содержит ошибки.

    Файл: windowssystem32winload.efi
    Код ошибки: 0xc*******

    Вам потребуются средства восстановления на установочном носителе. Если установочный носитель (например, диск или USB-устройство) отсутствует, обратитесь к администратору или производителю компьютера.

    В сегодняшней статье мы посмотрим с вами, как избавиться от критической ошибки Winload EFI, причем в довольно короткие сроки.

    Методы решения BSoD Winload EFI

    Метод №1 Отключение безопасной загрузки (Secure Boot)

    Если ваша материнская плата работает на UEFI, а не на традиционном BIOS, то проблема может заключаться в такой особой функции, как «Безопасная загрузка» (Secure Boot). Работая неправильно, эта функция может буквально препятствовать вашему компьютеру получить доступ к файлу Winload EFI. На Windows 8 и более поздних версиях ОС Майкрософт функция безопасной загрузки активирована по умолчанию.

    lazy placeholder

    Попробуйте зайти в операционную систему и проверьте, исчезла ли ошибка с файлом Winload EFI.

    Метод №2 Восстановление загрузочной записи

    Давайте попробуем с вами восстановить загрузочную запись вашей операционной системы. Первым делом вам нужно обзавестись установочным носителем с вашей версией ОС Windows. Можете воспользоваться следующим материалом от самих Майкрософт, чтобы создать подобную вещицу. Как только у вас на руках будет установочный носитель, сделайте вот что:

    lazy placeholder

    Не забудьте отключить установочный носитель от своего ПК, чтобы постоянно не загружаться через него. Проверьте наличие ошибки Winload EFI.

    Метод №3 Утилита BCDBoot

    Воспользуйтесь вышеуказанными шагами, чтобы добраться до командной строки в среде восстановления Windows. Попав в командную строку, сделайте в ней следующее:

    lazy placeholder

    Перед вами должно возникнуть сообщение о том, что файлы загрузки ОС были успешно созданы. Перезагрузите компьютер и попытайтесь зайти в систему привычным образом. Ок, а что делать, если команды не помогли и вы все еще не можете нормально запустить свой ПК? Что же, снова возвращаемся к командной строке в среде восстановления и делаем вот что:

    500 Мб, а если у вас UEFI и GPT — номер тома FAT-раздела размером в

    Метод №4 Отключение антивредоносной защиты

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

    lazy placeholder

    Вам наконец-то удалось зайти в операционную систему? Поздравляем, однако, возможно, проблема решена лишь от части. Рекомендуем установить все отложенные обновления для своей ОС Windows, а также провести дотошное сканирование системы на наличие вирусов и вредоносных программ. Надеемся, наш материал помог вам избавиться от BSoD с Winload EFI.

    Источник

    Содержание:

    1445259319 31

    ↑ Восстановление загрузчика Windows 10

    1445260389 1

    Данный раздел не имеет буквы и чтобы посмотреть находящиеся на нём файлы нужно запустить командную строку от имени администратора и ввести команды :

    lis vol (выводим в список все разделы на жёстком диске).

    sel vol 5 (этой командой выбираем Том 5, так как именно он является скрытым шифрованном (EFI) системным разделом FAT32, размер 260 Мб).

    assign (этой командой разделу присваивается буква)

    exit (выходим из diskpart)

    1445262517 6

    1445266892 7

    Войти в него всё равно не получится, но посмотреть содержимое можно так:

    Запускаем командную строку и вводим команду:

    dir I :efimicrosoftboot (где I:, буква присвоенная скрытому разделу),

    открывается содержимое папки EFIMicrosoftBoot, видим в ней файлы загрузчика Windows 10, в том числе и файл данных конфигурации загрузки (BCD). Именно с этим файлом проблемы у нашего читателя, судя по его ошибке.

    1445267651 1

    1445267645 2

    Посмотреть файлы загрузчика Windows 10 можно не только в командной строке, но и с помощью файлового менеджера Total Commander. Запустите его и откройте Конфигурацию—>Настройка,

    1445268280 4

    1445268223 5

    Выберите букву диска скрытого раздела, в нашем случае (I:) и вы увидите все файлы загрузчика Windows 10 в графическом отображении.

    1445268588 3

    Вы даже можете посмотреть содержимое файла данных конфигурации загрузки (BCD), для этого нужно просто ввести в командной строке, запущенной от администратора, команду bcdedit.

    1445362280 15

    ↑ Как восстановить загрузчик Windows 10

    ↑ Способ №1 Подходит для всех без исключения компьютеров и новых ноутбуков с БИОСом UEFI

    1445276271 2

    открывается окно командной строки.

    1445277118 3

    В некоторых случаях у вас может выйти ошибка при вводе последней команды, тогда нужно поступить по другому, просто взять и форматировать скрытый шифрованный (EFI) системный раздел, затем определённой командой записать на него файлы загрузки Windows 10 заново, подробно об этом написано в способе №2.

    ↑ Способ №2 Подходит только для новых ноутбуков с БИОСом UEFI или ПК с включённым интерфейсом EFI

    list vol (выводит список всех доступных томов)

    sel vol 5 (выбираем Том 5 (файловая система FAT32, размер 260 МБ) шифрованный (EFI) системный раздел, содержащий все файлы загрузчика Windows 10

    format fs=FAT32 (производим форматирование выбранного тома в файловую систему FAT32 )

    exit (выходим из командной строки).

    Создаём для Windows 10 новые файлы загрузки командой.

    bcdboot.exe C:Windows (Осторожно! У вас вместо C: может быть другая буква, смотрите букву раздела с файлами операционной системы).

    Файлы загрузки успешно созданы!

    1445277035 5

    ↑ Способ №3 Подходит только для новых ноутбуков с БИОСом UEFI или ПК с включённым интерфейсом EFI

    Друзья, при определённых обстоятельствах при вводе последней команды bcdboot.exe C:Windows, где (C:) раздел с установленной операционной системой Windows 10 у вас может выйти ошибка « Сбой при копировании файлов загрузки »,

    1445278450 32

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

    ↑ Способ №4 Подходит только для обычных компьютеров (так как скрытый раздел System Reserved форматируем в файловую систему NTFS)

    Форматируем скрытый раздел System Reserved (Зарезервировано системой, объём 350 МБ) и создаём его заново.

    sel vol 1 (Том 1, это и есть наш скрытый раздел System Reserved, выбираем его этой командой).
    format fs=NTFS (форматируем его в файловую систему NTFS).
    exit
    bcdboot D:Windows (создаём заново файлы загрузки на скрытом разделе System Reserved для Windows 10, так как буква диска операционной системы в среде восстановления (D:)).
    Файлы загрузки успешно созданы.

    1442866378 76

    ↑ Способ №5 Подходит только для обычных компьютеров (так как скрытый раздел System Reserved форматируем в файловую систему NTFS)

    Удаляем скрытый раздел System Reserved (Зарезервировано системой, объём 350 МБ) и создаём его заново.

    В некоторых случаях форматирование скрытого раздела System Reserved с файлами загрузки системы не поможет, тогда его нужно удалить и создать заново.

    Загружаемся в среду восстановления и вводим команды:

    lis vol (выводим все разделы накопителей подключенных к компьютеру в список).

    sel vol 1 (Том 1, это и есть наш скрытый раздел System Reserved, выбираем его этой командой).

    del vol (удаляем его образуя нераспределённое пространство на жёстком диске)

    lis dis (выводим список дисков подключенных к компьютеру)

    sel dis 0 (выбираем единственный Диск 0)

    c reate par primary size=350 (создаём заново скрытый раздел System Reserved).

    format fs=NTFS (форматируем его в файловую систему NTFS).

    activ (делаем активным).

    assign (присваиваем букву).

    lis vol (выводим все разделы накопителей подключенных к компьютеру в список).

    bcdboot D:Windows (создаём заново файлы загрузки на скрытом разделе System Reserved для Windows 10, так как буква диска операционной системы в среде восстановления (D:)).

    Источник

    Восстановление загрузчика

    Рассмотрим, как восстановить загрузочный сектор, предварительно почистив ОС от вирусного ПО. Разберём несколько наиболее эффективных вариантов – от простого к сложному.

    Автоматическое восстановление загрузчика.

    Восстановить загрузку (если отсутствует winload и т. д.) можно через отдельную многофункциональную среду – обычно возможностей этого инструмента оказывается достаточно:

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

    Процедура восстановления загрузчика вручную

    Сразу отметим, что потребуется загрузочный накопитель – создавать его и запустить Windows 10 с флешки поможет официальное бесплатное средство. Восстановление загрузчика Windows 10 выполняется так:

    В случае успеха утилита уведомит о формировании файлов загрузки Windows 10. OS можно тестировать, Boot Manager должен восстановиться. Подобные операции восстановления легко проводятся и через специальное ПО – например, EasyBSD, FixBootFull, Bootice.

    Рассматривать процесс взаимодействия с подобными инструментами не будем – это тема для отдельного материала.

    Восстановление загрузчика Windows 10 с помощью командной строки

    Если разобранный способ восстановления загрузчика к успеху не привёл, и «Восстановление при загрузке» (Repair) тоже, вернитесь в CMD (алгоритм остаётся прежним) и постарайтесь выполнить такую последовательность действий:

    Следующая загрузка ОС должна выполнится без казусов. Восстановление загрузочного сектора выполнено. Выполняйте предложенные запросы последовательно, дожидайтесь ответа от интерфейса.

    Восстановление загрузчика Windows 10 с помощью командной строки способ второй

    Восстановить загрузчик Windows 10 способна bootrec.exe, для запуска используется всё то же средство. Запустите его способом, описанным ранее (с загрузочного диска). Выполните «bootrec.exe» (не путайте с bcdedit), чтобы получить список доступных запросов. Попробуйте запустить «bootrec.exe /fixmbr».

    При неудаче запустите «bootrec.exe /fixboot», чтобы создать загрузочную запись на системном разделе. Команда помогает, если загрузочный сектор повреждён.
    11

    При успехе восстановления загрузчика, инструмент выводит соответствующее оповещение. Работает максимально быстро, не требует выполнения трудоёмких операций.

    Чистим систему от вредоносного программного обеспечения до восстановления загрузчика

    Вероятным источником возникновения проблем способна стать активность вирусов. Их нужно убрать заблаговременно (потом проверять, как восстановить загрузчик). Осилить задачу может программа от Dr.Web – скачивается с безопасных ресурсов разработчика, распространяется бесплатно, можно установить на любой носитель.

    Запустившись с Dr. Web (создание рассматривать не будем), запустите сканирование – работа будет вестись из Linux-интерфейса. Дальше восстанавливаем Windows-загрузчик.

    12

    Такая ОС способна выходить в интернет через Mozilla Firefox – этим можно воспользоваться, чтобы найти недостающую информацию или скачать дополнительные инструменты.

    Причины неполадок загрузчика

    В Windows 10 восстановление загрузчика может потребоваться по следующим причинам:

    Видеоинструкция

    Источник

    Восстановление удаленного загрузочного EFI раздела в Windows 10

    В этой статье мы покажем, как вручную восстановить случайно удаленный загрузочный EFI раздел Windows на компьютере с UEFI. Мы рассмотрим простой способ ручного пересоздания загрузочного EFI и MSR разделов в Windows, который позволит вам загрузить ОС после случайного форматирования или удаления EFI раздела. Инструкции в статье актуальны для всех версий Windows, начиная с Win 7 и до Windows 10.

    Итак, предположим, что каким-то образом случайно (или не очень случайно, например при попытке удалить с диска OEM разделы производителя) был удален или отформатирован загрузочный EFI раздел на компьютере с UEFI (не BIOS), в результате чего Windows 10 / 8.1 / 7 перестала загружаться, циклически предлагая выбрать загрузочное устройство (Reboot and select proper boot device or insert boot media in selected). Разберемся можно ли восстановить работоспособность Windows при удалении раздела с загрузчиком Boot Manager без переустановки ОС.

    Структура разделов GPT диска для Windows

    Рассмотрим, как должна выглядеть таблица разделов загрузочного жесткого диска с GPT разметкой на UEFI системе. Как минимум должны присутствовать следующие разделы:

    default uefi disk partitions

    Это именно минимальная конфигурация. Эти разделы создает установщик Windows при чистой установке системы на неразмеченный диск. Производители ПК или сами пользователи могут дополнительно создавать собственные разделы, содержащие, к примеру среду восстановления Windows в файле winre.wim (Windows RE), раздел с резервным образом системы от производителя (позволяет откатится к исходному состоянию компьютера), пользовательские разделы и т.д.

    На основном разделе находится установленная Windows, программы и данные пользователя. Могут присуствовать дополнительные разделы с данными.

    Что будет, если в Windows 10 отсутствует раздел EFI?

    На EFI разделе (по аналогии с разделом System Reserved на дисках с MBR разметкой) хранитмя хранилище конфигурации загрузки (BCD) и ряд файлов, необходимых для загрузки Windows. При загрузке компьютера среда UEFI загружает загрузчик (EFIMicrosoftBootbootmgfw.efi) с раздела EFI (ESP) и передает управление ему. Исполняемый файл bootmgfw.efi выполняет запуск основного загрузчика Windows Boot Manager, который загружает данные конфигурации из BCD. После загрузки BCD начинается загрузка Windows через winload.efi.

    Также вы не сможете загрузить Windows, если EFI раздел отформатирован в файловой системе NTFS. Даже при чистой установке Windows в таком случае вы получите ошибку:

    Как вручную создать EFI и MSR разделы на GPT диске?

    Т.к. ОС не загружается корректно, нам понадобится установочный диск с Windows 10 (Win 8 или 7) или любой другой загрузочный диск. Итак, загрузитесь с установочного диска и на экране начала установки нажмите комбинацию клавиш Shift+F10. Должно открыться окно командной строки:

    shift f10 cmdЗапустите утилиту управления дисками и разделами:

    Выведите список жестких дисков в системе (в этом примере он один, disk . Звездочка (*) в столбце Gpt означает, что диск использует GPT таблицу разделов).

    Выберите этот диск:

    Выведите список разделов на диске:

    В нашем примере в системе осталось всего 2 раздела:

    Как вы видите, раздел EFI отсутствует (удален).

    deleted efi partition

    Наша задача удалить оставшийся MSR раздел, так чтобы на диске осталось неразмечено как минимум 228 Мб свободного места (для разделов MSR и EFI). Удалить оставшийся раздел можно с помощью графической GParted или непосредственно из командной строки (именно так и поступим).

    Выберите раздел для удаления:

    Select partition 1
    И удалите его:
    Delete partition override

    Убедитесь, что остался только раздел с Windows размером 9 Гб (в нашем случае):

    delete msr partitionТеперь вы можете ручную пересоздать разделы EFI и MSR для размещения загрузчиков. Для этого в контексте утилиты diskpart последовательно выполните команды:

    Создайте EFI раздел размером 100 Мб, отформатируйте его в файловой системе FAT32 и назначьте ему букву диска:

    create partition efi size=100

    Убедитесь, что в diskpart выбран раздел 100 Мб (звездочка напротив строки Partition 1):

    list partition
    select partition 1
    format quick fs=fat32 label=»System»
    assign letter=G

    Теперь нужно создать MSR раздел размером 128 мб (в Windows 10 размер MSR раздела можно сделать всего 16 Мб).

    create partition msr size=128
    list partition
    list vol

    В нашем случае основному разделу с Windows уже назначена буква диска C:, если это не так, назначьте ему букву следующим образом:

    select vol 1
    assign letter=C
    exit

    recreate windows partiton

    Восстановление EFI загрузчика и BCD в Windows

    После того, как вы создали минимальную структуру разделов для GPT диска на компьютере с UEFI, можно переходить к копированию загрузочных файлов EFI на диск и созданию конфигурационного файла загрузчика (BCD).

    Скопируйте загрузочные файлы среды EFI из каталога вашего диска, на который установлена ваша Windows:

    xcopy /s C:WindowsBootEFI*.* G:EFIMicrosoftBoot

    copy efi boot files

    Пересоздайте конфигурацию загрузчика Windows:

    g:
    cd EFIMicrosoftBoot
    bcdedit /createstore BCD
    bcdedit /store BCD /create /d “Windows Boot Manager”
    bcdedit /store BCD /create /d “Windows 7” /application osloader

    Вы можете заменить надпись “My Windows 10”, на любую другую.

    Команда возвращает GUID созданной записи. Этот GUID нужно подставить в следующей команде вместо .

    create bcd
    bcdedit /store BCD /set default
    bcdedit /store BCD /set path EFIMicrosoftBootbootmgfw.efi
    bcdedit /store BCD /set displayorder

    bcdedit bootmgrДальнейшие команды bcdedit выполняются в контексте :

    bcdedit /store BCD /set device partition=c:
    bcdedit /store BCD /set osdevice partition=c:
    bcdedit /store BCD /set path WindowsSystem32winload.efi
    bcdedit /store BCD /set systemroot Windows
    exit

    bcdedit default

    Перезагрузите компьютер … В нашем случае с первого раза он не загрузился, пришлось дополнительно поплясать с бубном:

    Затем в нашем случае (тестирование проводилось на виртуальной машине VMWare с UEFI средой) пришлось добавить новый загрузочный пункт меню, выбрав файл EFIMicrosoftBootbootmgrfw.efi на EFI разделе.

    efi boot options

    В некоторых UEFI меню по аналогии нужно изменить приоритет загрузочных разделов.

    После всех рассмотренных манипуляций Windows должна загрузиться корректно.

    Источник

    Отсутствует или содержит ошибки файл windowssystem32 winload.efi в Windows 10

    Рассмотрим еще одну распространенную ошибку загрузки Windows 10, вызванную повреждением или отсутствием файла winload.efi. Проблема проявляется следующим образом: Windows 10 перестает загружаться с ошибкой BSOD и следующим сообщением на экране загрузки:

    winload efi otsutstvuet ili povrezhden win10

    Данная проблема связана с отсутствием или повреждением файла загрузчика windowssystem32winload.efi. Эта проблема появляется чаще всего после некорректного обновления системы, при повреждении диска или файловой системы, при переразбивке диска сторонними утилитами, обновлении антивируса, после переноса (клонирования) установленного образа Windows на новый диск, замене материнской платы компьютера и прочими вмешательствами.

    Решение проблемы зависит от того, использовался ли у вас режим загрузки UEFI или Legacy до возникновения проблемы. Далее рассмотрим основные шаги, которые помогут исправить данную ошибку и корректно загрузить Windows 10/Windows Server 2016.

    Включите режим совместимости CSM и отключите Secure Boot

    Большинство компьютеров с поддержкой UEFI могут загружаться как с дисков с таблицей разделов GPT, так и с MBR дисков старого формата в режиме совместимости (Legacy).

    Перезагрузите компьютер и войдите в меню настройки UEFI. Клавиша входа в меню UEFI зависит от производителя компьютера, как правило, это клавиши F2, F8, Del или Esc. Либо на нажмите кнопку ESC прямо на экране с ошибкой.

    dell uefi f2

    Автоматическое восстановление загрузчика Windows

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

    Если установочного диска с Windows под рукой нет, следует три раза перезагрузить компьютер нажатием на кнопку питания (Power) до тех пор, пока не появится экран консоли восстановления WinRe. Выберите пункт See advanced repair options (Дополнительные варианты восстановления). Далее все аналогично.

    recovery mode see advanced repair mode

    Отключите функцию защиты ELAM

    Если предыдущие методы не исправили ошибку с загрузкой winload.efi, попробуйте отключить технологию ранней защиты от вредоносного ПО — ELAM (Early-launch Anti-Malware), которая по умолчанию активна для загрузчика Windows.

    disable elam

    Выполните проверку дисков на ошибки и целостность системных файлов

    Проверьте свои диски на наличие ошибок, возможно имеются ошибки диска или файловой системы на разделе с файлом winload.efi. Чтобы проверить все диски на наличие ошибок и исправить их, выполните команду:

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

    Bcdedit /enum | find «osdevice»

    Предположим, в вашем случае это диск D:. Команда проверки системных файлов будет выглядеть так:

    sfc /scannow /offboot=d: /offwindir=d:windows

    sfc scannow offboot

    Также нужно выполнить офлайн проверку хранилища компонентов Windows с помощью DISM. Нужно сравнить ваш образ с оригинальным установочным wim файлом вашего билда Windows 10 (предположим, оригинальный wim образ лежите на диске E:):

    Dism /image:D: /Cleanup-Image /RestoreHealth /Source:E:sourcesinstall.wim

    Восстановление BCD загрузчика и файла winload.efi для UEFI системы

    Загрузитесь с загрузочного диска и запустите командную строку:

    Пересоздание загрузочных записей в хранилище BCD с помощью bootrec и bcdedit

    Если у вас система установлена не в режиме UEFI, тогда вы можете восстановить пересоздать загрузочные записи и сам MBR загрузчик Windows с помощью утилиты bootrec.

    Если предбудущий способ не помог, нужно пересоздать файл конфигурации загрузки для MBR в командной строке консоли восстановления или загрузочного диска:

    bcdedit /set device boot
    bcdedit /set device boot
    bcdedit /set osdevice boot
    bcdedit /set device partition=c:
    bcdedit /set osdevice partition=c:
    bcdedit /set path windowssystem32winload.efi

    Перезагрузите компьютер и проверьте, исправлена ли проблема.

    Источник

    Понравилась статья? Поделить с друзьями:

    Читайте также:

  • Ediabas error 113
  • Efaflex ошибка f752
  • Edge ошибка профиля некоторые функции могут быть недоступны
  • Efaflex ворота коды ошибок
  • Edge код ошибки status access violation

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии