EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) { EFI_STATUS status; CHAR16 name[256], *val, fmt[20]; EFI_GUID vendor; UINTN size; InitializeLib(image, systab); name[0] = 0; vendor = NullGuid; Print(L"GUID Variable Name Value\n"); Print(L"=================================== ==================== ========\n"); StrCpy(fmt, L"%.-35g %.-20s %s\n"); while (1) { size = sizeof(name); status = uefi_call_wrapper(RT->GetNextVariableName, 3, &size, name, &vendor); if (status != EFI_SUCCESS) break; val = LibGetVariable(name, &vendor); Print(fmt, &vendor, name, val); FreePool(val); } return EFI_SUCCESS; }
EFI_STATUS LibDeleteVariable ( IN CHAR16 *VarName, IN EFI_GUID *VarGuid ) { VOID *VarBuf; EFI_STATUS Status; VarBuf = LibGetVariable(VarName,VarGuid); Status = EFI_NOT_FOUND; if (VarBuf) { // // Delete variable from Storage // Status = uefi_call_wrapper( RT->SetVariable, 5, VarName, VarGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, 0, NULL ); ASSERT (!EFI_ERROR(Status)); FreePool(VarBuf); } return (Status); }
EFI_STATUS add_boot_option(EFI_DEVICE_PATH *hddp, EFI_DEVICE_PATH *fulldp, CHAR16 *filename, CHAR16 *label, CHAR16 *arguments) { static int i = 0; CHAR16 varname[] = L"Boot0000"; CHAR16 hexmap[] = L"0123456789ABCDEF"; EFI_GUID global = EFI_GLOBAL_VARIABLE; EFI_STATUS rc; for(; i <= 0xffff; i++) { varname[4] = hexmap[(i & 0xf000) >> 12]; varname[5] = hexmap[(i & 0x0f00) >> 8]; varname[6] = hexmap[(i & 0x00f0) >> 4]; varname[7] = hexmap[(i & 0x000f) >> 0]; void *var = LibGetVariable(varname, &global); if (!var) { int size = sizeof(UINT32) + sizeof (UINT16) + StrLen(label)*2 + 2 + DevicePathSize(hddp) + StrLen(arguments) * 2; CHAR8 *data = AllocateZeroPool(size + 2); CHAR8 *cursor = data; *(UINT32 *)cursor = LOAD_OPTION_ACTIVE; cursor += sizeof (UINT32); *(UINT16 *)cursor = DevicePathSize(hddp); cursor += sizeof (UINT16); StrCpy((CHAR16 *)cursor, label); cursor += StrLen(label)*2 + 2; CopyMem(cursor, hddp, DevicePathSize(hddp)); cursor += DevicePathSize(hddp); StrCpy((CHAR16 *)cursor, arguments); Print(L"Creating boot entry \"%s\" with label \"%s\" " L"for file \"%s\"\n", varname, label, filename); if (!first_new_option) { first_new_option = DuplicateDevicePath(fulldp); first_new_option_args = arguments; first_new_option_size = StrLen(arguments) * sizeof (CHAR16); } rc = uefi_call_wrapper(RT->SetVariable, 5, varname, &global, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, size, data); FreePool(data); if (EFI_ERROR(rc)) { Print(L"Could not create variable: %d\n", rc); return rc; } CHAR16 *newbootorder = AllocateZeroPool(sizeof (CHAR16) * (nbootorder + 1)); if (!newbootorder) return EFI_OUT_OF_RESOURCES; int j = 0; newbootorder[0] = i & 0xffff; if (nbootorder) { for (j = 0; j < nbootorder; j++) newbootorder[j+1] = bootorder[j]; FreePool(bootorder); } bootorder = newbootorder; nbootorder += 1; #ifdef DEBUG_FALLBACK Print(L"nbootorder: %d\nBootOrder: ", nbootorder); for (j = 0 ; j < nbootorder ; j++) Print(L"%04x ", bootorder[j]); Print(L"\n"); #endif return EFI_SUCCESS; } } return EFI_OUT_OF_RESOURCES; }