2

我有一个 UEFI 应用程序需要下载(TFTP)文件“bootmgfw.efi”,它是 Windows EFI 引导加载程序。我可以成功调用 Mtftp()、LoadImage() 和 StartImage() 来下载和执行图像。但是,Microsoft 引导加载程序确定它是在本地而不是通过网络执行,并在本地查找所需的文件,而不是通过 TFTP 下载它们。如何生成一个应用程序,使其知道它来自网络?

我有两个想法,但到目前为止我都无法实现。

  1. 在调用 LoadImage() 但在调用 StartImage() 之前,我需要获取新图像的 EFI_LOADED_IMAGE 并对其进行修改。我我需要修改 DevicePath 以表明它是网络加载的,但我不知道该怎么做。

  2. 跳过 Mtftp() 并使用 TRUE 调用 LoadImage() 以获取 BootPolicy。我相信这会下载并加载文件,但我不知道如何告诉它要加载什么文件。我的猜测是传递给 LoadImage() 的 DevicePath 会包含这个,但我不知道如何构造 DevicePath。

我们有一位 UEFI 开发人员编写了这个应用程序,但他在完成工作之前就离开了公司。所以我不得不拿起这个代码库并学习 UEFI 来尝试完成它。谢谢你的帮助!

4

1 回答 1

0

的行为是它总是在它自己从它加载的同一路径上bootmgfw.efi查找它需要加载的文件。因此,要使其通过 TFTP 下载文件,您需要执行以下操作:

  1. 在您的启动应用程序中,一个新的 LoadFile 协议通过调用在后台使用 TFTP 获取文件Mtftp()
  2. 创建一个“虚拟”设备路径并将其与此 LoadFile 协议相关联
  3. 使用虚拟路径加载而不是直接bootmgfw.efi调用Mtftp()

如果您这样做bootmgfw.efi,当它尝试加载自己的文件时,将使用虚拟设备路径这样做,因此最终会通过 TFTP 下载它们。

您可以使用 DevicePathUtilitiesProtocol 创建虚拟路径。您可以使用自己的应用程序的设备路径作为基本路径,然后使用devicePathUtilities::AppendDevicePath().

您可以通过在其上打开 LoadedImage 协议然后在 loadedImage 的 DeviceHandle 上打开 DevicePathProtocol 来获取您自己的应用程序的设备路径,如下所示:

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 规范。

于 2020-10-08T02:02:50.663 回答