Skip to content

Instantly share code, notes, and snippets.

@apage43
Created March 18, 2017 04:17
Show Gist options
  • Save apage43/bf15f62266159d8c3016e691e44f338c to your computer and use it in GitHub Desktop.
Save apage43/bf15f62266159d8c3016e691e44f338c to your computer and use it in GitHub Desktop.
#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