UEFI LocateHandleBuffer всегда возвращает "Неверный параметр"

Очень простая программа 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 ответ

Поскольку GCC использует cdecl/SysV ABI в качестве соглашения о вызовах по умолчанию, а x86_64 UEFI требует использования соглашения о вызовах Microsoft x64, в GNU EFI имеется утилита thunk, которая называется uefi_call_wrapper. По сути, он принимает указатель на вызываемую функцию, число аргументов и параметры, и он вызывает эту функцию, используя соответствующее соглашение. Так что, в основном, вместо того, чтобы писать такой код:

Status = gBS->LocateHandleBuffer(
    AllHandles, NULL, NULL,
    &HandleCount, &HandleBuffer);

Вы должны написать что-то вроде этого:

Status = uefi_call_wrapper(
    gBS->LocateHandleBuffer, 5,
    AllHandles, NULL, NULL,
    &HandleCount, &HandleBuffer);
Другие вопросы по тегам