UEFI LocateHandleBuffer始终返回"无效参数"

时间:2017-10-25 16:57:57

标签: x86-64 uefi gnu-efi

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

1 个答案:

答案 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);