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