MCPcopy Create free account
hub / github.com/CloverHackyColor/CloverBootloader / SetBootCurrent

Function SetBootCurrent

rEFIt_UEFI/Platform/Settings.cpp:343–446  ·  view source on GitHub ↗

check if this entry corresponds to Boot# variable and then set BootCurrent

Source from the content-addressed store, hash-verified

341// check if this entry corresponds to Boot# variable and then set BootCurrent
342//
343VOID
344SetBootCurrent(REFIT_MENU_ITEM_BOOTNUM *Entry)
345{
346 EFI_STATUS Status;
347 BO_BOOT_OPTION BootOption;
348 XStringW VarName;
349 UINTN VarSize = 0;
350 UINT8 *BootVariable;
351 UINTN NameSize;
352 UINT8 *Data;
353 UINT16 *BootOrder;
354 UINT16 *BootOrderNew;
355 UINT16 *Ptr;
356 UINTN BootOrderSize;
357 INTN BootIndex = 0, Index;
358
359
360 VarName = SWPrintf("Boot%04llX", Entry->BootNum);
361 BootVariable = (UINT8*)GetNvramVariable(VarName.wc_str(), &gEfiGlobalVariableGuid, NULL, &VarSize);
362 if ((BootVariable == NULL) || (VarSize == 0)) {
363 DBG("Boot option %ls not found\n", VarName.wc_str());
364 return;
365 }
366
367 //decode the variable
368 BootOption.Variable = BootVariable;
369 BootOption.VariableSize = VarSize;
370 ParseBootOption (&BootOption);
371
372 if ((BootOption.OptionalDataSize == 0) ||
373 (BootOption.OptionalData == NULL) ||
374 (*(UINT32*)BootOption.OptionalData != CLOVER_SIGN)) {
375 DBG("BootVariable of the entry is empty\n");
376 FreePool(BootVariable);
377 return;
378 }
379
380 Data = BootOption.OptionalData + 4;
381 NameSize = *(UINT16*)Data;
382 Data += 2;
383 if (StriCmp((CHAR16*)Data, Entry->Volume->VolName.wc_str()) != 0) {
384 DBG("Boot option %llu has other volume name %ls\n", Entry->BootNum, (CHAR16*)Data);
385 FreePool(BootVariable);
386 return;
387 }
388
389 if (VarSize > NameSize + 6) {
390 Data += NameSize;
391 if (StriCmp((CHAR16*)Data, Basename(Entry->LoaderPath.wc_str())) != 0) {
392 DBG("Boot option %llu has other loader name %ls\n", Entry->BootNum, (CHAR16*)Data);
393 FreePool(BootVariable);
394 return;
395 }
396 }
397
398 FreePool(BootVariable);
399 //all check passed, save the number
400 Status = SetNvramVariable (L"BootCurrent",

Callers 1

RefitMainFunction · 0.85

Calls 11

SWPrintfFunction · 0.85
GetNvramVariableFunction · 0.85
ParseBootOptionFunction · 0.85
BasenameFunction · 0.85
SetNvramVariableFunction · 0.85
PrintBootOrderFunction · 0.85
FreePoolFunction · 0.50
StriCmpFunction · 0.50
efiStrErrorFunction · 0.50
AllocatePoolFunction · 0.50
wc_strMethod · 0.45

Tested by

no test coverage detected