Запуск приложения в UEFI

У меня есть приложение UEFI, которому необходимо загрузить (TFTP) файл «bootmgfw.efi», который является загрузчиком Windows EFI. Я могу успешно вызвать Mtftp(), LoadImage() и StartImage() для загрузки и выполнения образа. Однако загрузчик Microsoft определяет, что он выполняется локально, а не по сети, и ищет необходимые файлы локально, а не загружает их через TFTP. Как создать приложение, чтобы оно знало, что оно из сети?

У меня есть две идеи, но пока я не смог реализовать ни одну из них.

  1. После вызова LoadImage(), но перед вызовом StartImage() мне нужно получить EFI_LOADED_IMAGE для нового изображения и изменить его. Я думаю, что мне нужно изменить DevicePath, чтобы указать, что он загружается из сети, но я не знаю, как это сделать.

  2. Пропустите Mtftp() и вызовите LoadImage() с TRUE для BootPolicy. Я считаю, что это загрузит и загрузит файл, но я не знаю, как сказать, какой файл загружать. Я предполагаю, что DevicePath, переданный в LoadImage(), будет содержать это, но я не знаю, как создать DevicePath.

У нас был разработчик UEFI, который написал это приложение, но он ушел из компании, не завершив работу. Поэтому я вынужден взять эту кодовую базу и изучить UEFI, чтобы попытаться завершить это. Спасибо за любую помощь!


person user2124642    schedule 17.11.2015    source источник
comment
Вы уверены, что bootmgfw.efi достаточно «умен» для работы с TFTP? Есть ли у него код для загрузки необходимых файлов по TFPT?   -  person s_b    schedule 19.07.2016


Ответы (1)


Поведение bootmgfw.efi заключается в том, что он всегда ищет файлы, которые ему нужно загрузить, по тому же пути, по которому он сам был загружен из него. Итак, чтобы заставить его загружать свои файлы через TFTP, вам нужно сделать следующее:

  1. В вашем загрузочном приложении новый протокол LoadFile, который получает файлы, используя TFTP за кулисами, вызывая Mtftp()
  2. Создайте путь к виртуальному устройству и свяжите его с этим протоколом LoadFile.
  3. Загрузите bootmgfw.efi, используя виртуальный путь, вместо прямого вызова Mtftp()

Если вы сделаете это, bootmgfw.efi, когда он попытается загрузить свои собственные файлы, будет использовать путь виртуального устройства и, следовательно, загрузит их через TFTP.

Вы можете создать виртуальный путь с помощью DevicePathUtilitiesProtocol. Вы можете использовать путь устройства вашего собственного приложения в качестве базового пути, а затем добавить к нему некоторый подпуть с помощью devicePathUtilities::AppendDevicePath().

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

EFI_LOADED_IMAGE_PROTOCOL* loadedImage;
EFI_DEVICE_PATH_PROTOCOL *thisImageFilePath;
EFI_DEVICE_PATH_UTILITIES_PROTOCOL *devPathUtilities;

bootServices->OpenProtocol(imageHandle, &gEfiLoadedImageProtocolGuid, &loadedImage, imageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
bootServices->OpenProtocol(loadedImage->DeviceHandle, &gEfiDevicePathProtocolGuid, &thisImageFilePath, imageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);

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

Чтобы создать новый протокол LoadFile, обратитесь к спецификации UEFI.

person Frederick The Fool    schedule 08.10.2020