在UEFI中启动应用程序

时间:2015-11-17 23:15:26

标签: uefi

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

我有两个想法,但到目前为止,我无法做任何工作。

  1. 调用LoadImage()之后但在调用StartImage()之前,我需要获取新图像的EFI_LOADED_IMAGE并进行修改。我我需要修改DevicePath以表明它是网络加载的,但我不知道如何做到这一点。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

您可以通过打开应用程序的设备路径来获取自己的应用程序的设备路径,然后像这样在打开的设备的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规范。