1

非常简单的 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);
}
4

1 回答 1

1

因为 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);
于 2018-07-22T20:13:01.713 回答