非常简单的UEFI程序:
LocateHandleBuffer()
始终返回8000000000000002
,这是"无效参数。 EFI文档说,唯一的原因应该是,如果我传递的两个指针中的一个是NULL,它们显然不是。
它不会比这简单得多。我最初使用ByProtocol
尝试了一个特殊的GUID - 但它始终失败并出现相同的错误。
知道问题是什么吗?
#include <efi.h>
#include <efilib.h>
EFI_STATUS EFIAPI efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
EFI_STATUS Status;
UINTN HandleCount;
EFI_HANDLE *HandleBuffer;
EFI_BOOT_SERVICES *gBS = SystemTable-> BootServices;
InitializeLib(ImageHandle, SystemTable);
Print(L"test2 built on " __DATE__ " at " __TIME__ "\n");
Status = gBS->LocateHandleBuffer (
AllHandles, NULL, NULL,
&HandleCount, &HandleBuffer);
Print(L"Test AllHandles returned status %llx count %d\n",Status,HandleCount);
return (Status);
}
答案 0 :(得分:1)
由于GCC使用cdecl / SysV ABI作为其默认调用约定,并且x86_64 UEFI要求使用Microsoft x64调用约定,因此GNU EFI中有一个名为uefi_call_wrapper的实用程序。基本上,它的作用是使用一个指向要调用的函数的指针,参数和参数的数量,并使用适当的约定来调用此函数。因此,基本上,而不是像这样编写代码:
Status = gBS->LocateHandleBuffer(
AllHandles, NULL, NULL,
&HandleCount, &HandleBuffer);
您应该这样写:
Status = uefi_call_wrapper(
gBS->LocateHandleBuffer, 5,
AllHandles, NULL, NULL,
&HandleCount, &HandleBuffer);