EFI_STATUS update_boot_order(void) { UINTN size; UINTN len = 0; EFI_GUID global = EFI_GLOBAL_VARIABLE; CHAR16 *newbootorder = NULL; EFI_STATUS rc; size = nbootorder * sizeof(CHAR16); newbootorder = AllocateZeroPool(size); if (!newbootorder) return EFI_OUT_OF_RESOURCES; CopyMem(newbootorder, bootorder, size); #ifdef DEBUG_FALLBACK Print(L"nbootorder: %d\nBootOrder: ", size / sizeof (CHAR16)); UINTN j; for (j = 0 ; j < size / sizeof (CHAR16); j++) Print(L"%04x ", newbootorder[j]); Print(L"\n"); #endif rc = uefi_call_wrapper(RT->GetVariable, 5, L"BootOrder", &global, NULL, &len, NULL); if (rc == EFI_BUFFER_TOO_SMALL) LibDeleteVariable(L"BootOrder", &global); rc = uefi_call_wrapper(RT->SetVariable, 5, L"BootOrder", &global, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, size, newbootorder); FreePool(newbootorder); return rc; }
EFI_STATUS update_boot_order(void) { CHAR16 *oldbootorder; UINTN size; EFI_GUID global = EFI_GLOBAL_VARIABLE; CHAR16 *newbootorder = NULL; oldbootorder = LibGetVariableAndSize(L"BootOrder", &global, &size); if (oldbootorder) { int n = size / sizeof (CHAR16) + nbootorder; newbootorder = AllocateZeroPool(n * sizeof (CHAR16)); if (!newbootorder) return EFI_OUT_OF_RESOURCES; CopyMem(newbootorder, bootorder, nbootorder * sizeof (CHAR16)); CopyMem(newbootorder + nbootorder, oldbootorder, size); size = n * sizeof (CHAR16); } else { size = nbootorder * sizeof(CHAR16); newbootorder = AllocateZeroPool(size); if (!newbootorder) return EFI_OUT_OF_RESOURCES; CopyMem(newbootorder, bootorder, size); } #ifdef DEBUG_FALLBACK Print(L"nbootorder: %d\nBootOrder: ", size / sizeof (CHAR16)); int j; for (j = 0 ; j < size / sizeof (CHAR16); j++) Print(L"%04x ", newbootorder[j]); Print(L"\n"); #endif if (oldbootorder) { LibDeleteVariable(L"BootOrder", &global); FreePool(oldbootorder); } EFI_STATUS rc; rc = uefi_call_wrapper(RT->SetVariable, 5, L"BootOrder", &global, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, size, newbootorder); FreePool(newbootorder); return rc; }