Чтение переменной UEFI с помощью RT->GetVariable

Я новичок в кодировании. Поэтому я стараюсь, чтобы это было максимально просто. Моя цель - прочитать переменные uefi, такие как поставщик/серийный номер, и распечатать их обратно. Мой код не будет работать должным образом. Я использую gnu-efi.

include "efi.h"
include "efilib.h"

CHAR16*         name;
EFI_GUID*       vendorguid = EFI_GLOBAL_VARIABLE;
UINT32*         attributes;
UINTN*          datasize;
VOID*           data;

EFI_STATUS
EFIAPI
efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable){
        InitializeLib(ImageHandle, SystemTable);

        uefi_call_wrapper(ST->ConOut->SetMode, 2, ST->ConOut, 0);
        uefi_call_wrapper(ST->ConOut->SetAttribute, 2, ST->ConOut, EFI_WHITE | EFI_BACKGROUND_RED);
        uefi_call_wrapper(ST->ConOut->ClearScreen, 2, ST->ConOut);

        RT->GetVariable(L"Product", vendorguid, attributes, datasize, data);
        Print(L"-> %s", data);

        for(;;) __asm__("hlt");

return EFI_SUCCESS;
}

Я получил кучу предупреждений компилятора, но он будет скомпилирован:

test.c:79:25: note: in expansion of macro 'EFI_GLOBAL_VARIABLE'
 EFI_GUID* vendorguid  = EFI_GLOBAL_VARIABLE;
                         ^~~~~~~~~~~~~~~~~~~
/usr/include/efi/efiapi.h:210:35: warning: excess elements in scalar initializer
     { 0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C} }
                                   ^
test.c:79:25: note: in expansion of macro 'EFI_GLOBAL_VARIABLE'
 EFI_GUID* vendorguid  = EFI_GLOBAL_VARIABLE;
                         ^~~~~~~~~~~~~~~~~~~
/usr/include/efi/efiapi.h:210:35: note: (near initialization for 'vendorguid')
     { 0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C} }
                                   ^
test.c:79:25: note: in expansion of macro 'EFI_GLOBAL_VARIABLE'
 EFI_GUID* vendorguid  = EFI_GLOBAL_VARIABLE;
                         ^~~~~~~~~~~~~~~~~~~

Если я выполняю это на устройстве, экран становится правильным красным, но данные из переменной не печатаются. Только "->"


person KingBonecrusher    schedule 27.01.2017    source источник
comment
Каким образом это не работает? Ошибки компилятора? Неожиданное поведение во время выполнения? Пожалуйста, предоставьте более подробную информацию.   -  person RhinoDevel    schedule 27.01.2017
comment
И что возвращает RT->GetVariable()?   -  person unixsmurf    schedule 30.01.2017


Ответы (1)


Вы используете указатели вместо типов для vendorguid, атрибутов и размера данных и пытаетесь записать в нераспределенный буфер. Пример кода для справки.

person CodeRush    schedule 28.01.2017
comment
Благодарю вас! Кажется, работает... Мне нужно найти способ преобразовать данные в юникод, чтобы распечатать их правильно. Код продукта и такие вещи, как серийный номер, хранятся внутри данных smbios, это будет следующей темой... ;-) - person KingBonecrusher; 30.01.2017
comment
Используйте APrint вместо Print для работы с данными ASCII. - person CodeRush; 30.01.2017