非常简单的UEFI程序,例如:
LocateHandleBuffer()
总是返回8000000000000002
,它是"无效参数"。EFI文档说,唯一的原因应该是如果我传递的两个指针中有一个是NULL,而它们显然不是。
再简单不过了。我最初尝试使用具有特定GUID的ByProtocol
,但它总是以相同的错误失败。
你知道问题可能是什么吗?
#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 %dn",Status,HandleCount);
return (Status);
}
由于GCC使用cdecl/SysV ABI作为其默认调用约定,并且x86_64 UEFI需要使用Microsoft x64调用约定,因此GNU EFI中有一个名为UEFI_call_wrapper的实用程序thunk。基本上,它所做的是获取一个指向要调用的函数、参数数量和参数的指针,并使用适当的约定调用该函数。所以,基本上,与其写这样的代码:
Status = gBS->LocateHandleBuffer(
AllHandles, NULL, NULL,
&HandleCount, &HandleBuffer);
你应该写这样的东西:
Status = uefi_call_wrapper(
gBS->LocateHandleBuffer, 5,
AllHandles, NULL, NULL,
&HandleCount, &HandleBuffer);