我正在编写 UEFI 'chainloader' 以了解有关它如何工作的更多信息。我正在使用 gnu-efi,并尝试加载和启动 EFI 映像。我希望我的 main.efi 加载并运行位于同一个 ESP 中的 hello.efi。我只是不明白该调用什么以及如何调用它。这是我的代码:
#include <efi.h> // EFI header
#include <efilib.h> // EFI library header
int DisableTimeout(EFI_SYSTEM_TABLE *SystemTable); // Allows us to call in efi_main
EFI_STATUS EFIAPI efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
InitializeLib(ImageHandle, SystemTable);
EFI_STATUS Status;
EFI_HANDLE ImageHandle2 = NULL;
const CHAR16 *FileName = L"HELLO.efi";
EFI_DEVICE_PATH_PROTOCOL *FilePath;
uefi_call_wrapper(SystemTable->ConOut->SetAttribute, 1, SystemTable->ConOut, 0x0F); // Set text to white
uefi_call_wrapper(SystemTable->ConOut->ClearScreen, 1, SystemTable->ConOut); // Clear screen
Print(L"Begin boot process.\nBooting from system with ");
Print(SystemTable->FirmwareVendor);
Print(L" firmware.\n");
Status = DisableTimeout(SystemTable); // Pass system table so it can shut off timer
Status = SystemTable->BootServices->LoadImage(TRUE, ImageHandle, FilePath, NULL, 0, &ImageHandle2);
Status = SystemTable->BootServices->StartImage(ImageHandle2, NULL, NULL);
Print(L"Boot complete.\n");
WaitForSingleEvent(SystemTable->ConIn->WaitForKey, 0); // Wait for keypress
return EFI_SUCCESS;
}
DisableTimeout() 是我制作的一个函数。
对不起,我对 UEFI 开发很陌生。