2017-01-27 1 views
0

Iam nouveau dans le codage. Donc, j'essaie de garder le plus simple possible. Mon but est de lire les variables uefi comme vendeur/série et de les imprimer. Mon code ne fonctionnera pas comme il le devrait. J'utilise gnu-efi.UEFI lire variable avec RT-> GetVariable

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

j'ai eu un tas d'avertissements du compilateur, mais il sera compilé:

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; 
         ^~~~~~~~~~~~~~~~~~~ 

Si j'excute sur l'appareil l'écran devient correct rouge, mais les données de la varaible ne sont pas imprimé. Seul le "->"

+0

Comment cela ne fonctionne-t-il pas? Erreurs du compilateur? Comportement inattendu lors de l'exécution? S'il vous plaît fournir plus de détails. – RhinoDevel

+0

Et que retourne RT-> GetVariable()? – unixsmurf

Répondre

0

Vous utilisez des pointeurs au lieu de types pour vendorguid, attributs et datasize, et en essayant d'écrire dans un tampon non alloué. Sample code for reference.

+0

Merci! Semble fonctionner ... J'ai besoin de trouver un moyen de convertir les données en Unicode pour l'imprimer correctement. Le code de produit et d'autres choses comme la série sont stockés dans les données de smbios, ce sera le sujet suivant ... ;-) – KingBonecrusher

+0

Utilisez APrint au lieu de Print pour travailler avec des données ASCII. – CodeRush