Created
March 18, 2017 04:17
-
-
Save apage43/bf15f62266159d8c3016e691e44f338c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <efi.h> | |
#include <efilib.h> | |
#define EFI_TRY(X) \ | |
status = X; \ | |
if (EFI_ERROR(status)) { \ | |
Print(L"Error on line %d (%s): %r", __LINE__, L ## #X, status); \ | |
goto cleanup; \ | |
} | |
typedef struct HiiDbExportVar { | |
UINT32 length; | |
UINT32 pointer; | |
} exportvar_t; | |
#define EFI_HII_DATABASE_PROTOCOL_GUID \ | |
{ 0xef9fc172, 0xa1b2, 0x4693, { 0xb3, 0x27, 0x6d, 0x32, 0xfc, 0x41, 0x60, 0x42 } } | |
typedef struct _EFI_HII_DATABASE_PROTOCOL EFI_HII_DATABASE_PROTOCOL; | |
typedef | |
EFI_STATUS | |
(EFIAPI *EFI_HII_DATABASE_EXPORT_PACKS)( | |
IN CONST EFI_HII_DATABASE_PROTOCOL *This, | |
// originally EFI_HII_HANDLE | |
IN void* Handle, | |
IN OUT UINTN *BufferSize, | |
// originally EFI_HII_PACKAGE_LIST_HEADER | |
OUT void *Buffer | |
); | |
struct _EFI_HII_DATABASE_PROTOCOL { | |
void* /* EFI_HII_DATABASE_NEW_PACK */ NewPackageList; | |
void* /* EFI_HII_DATABASE_REMOVE_PACK */ RemovePackageList; | |
void* /* EFI_HII_DATABASE_UPDATE_PACK */ UpdatePackageList; | |
void* /* EFI_HII_DATABASE_LIST_PACKS */ ListPackageLists; | |
EFI_HII_DATABASE_EXPORT_PACKS ExportPackageLists; | |
void* /* EFI_HII_DATABASE_REGISTER_NOTIFY */ RegisterPackageNotify; | |
void* /* EFI_HII_DATABASE_UNREGISTER_NOTIFY */ UnregisterPackageNotify; | |
void* /* EFI_HII_FIND_KEYBOARD_LAYOUTS */ FindKeyboardLayouts; | |
void* /* EFI_HII_GET_KEYBOARD_LAYOUT */ GetKeyboardLayout; | |
void* /* EFI_HII_SET_KEYBOARD_LAYOUT */ SetKeyboardLayout; | |
void* /* EFI_HII_DATABASE_GET_PACK_HANDLE */ GetPackageListHandle; | |
}; | |
EFI_STATUS | |
efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { | |
EFI_GUID HiiDatabaseGuid = EFI_HII_DATABASE_PROTOCOL_GUID; | |
EFI_HII_DATABASE_PROTOCOL *HiiDb = NULL; | |
EFI_STATUS status = EFI_SUCCESS; | |
InitializeLib(image, systab); | |
void* existing_var = LibGetVariable(L"HiiDb", &HiiDatabaseGuid); | |
if (existing_var != NULL) { | |
Print(L"HII Export Exists, nothing to do!\n"); | |
FreePool(existing_var); | |
goto cleanup; | |
} | |
EFI_TRY(LibLocateProtocol(&HiiDatabaseGuid, (void**) &HiiDb)); | |
UINTN exportsize = 0; | |
void* exportbuf = NULL; | |
HiiDb->ExportPackageLists(HiiDb, NULL, &exportsize, exportbuf); | |
if (exportsize == 0) { | |
Print(L"Couldn't get size for ExportPackageLists"); | |
goto cleanup; | |
} | |
EFI_TRY(BS->AllocatePool(EfiRuntimeServicesData, exportsize, &exportbuf)); | |
EFI_TRY(HiiDb->ExportPackageLists(HiiDb, NULL, &exportsize, exportbuf)); | |
exportvar_t var = { | |
.length = exportsize, | |
.pointer = (UINT32) (UINT64) exportbuf, | |
}; | |
EFI_TRY(RT->SetVariable(L"HiiDb", &HiiDatabaseGuid, | |
EFI_VARIABLE_RUNTIME_ACCESS | | |
EFI_VARIABLE_BOOTSERVICE_ACCESS, | |
sizeof(var), &var)); | |
Print(L"Exported HII Packages, var HiiDb-%g\n", &HiiDatabaseGuid); | |
cleanup: | |
return EFI_SUCCESS; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment