in OemPkg/BootMenu/BootMenu.c [267:391]
VOID RebuildOrderList (VOID) {
EFI_STATUS Status;
VOID *StartOpCodeHandle;
VOID *EndOpCodeHandle;
VOID *OptionsOpCodeHandle;
EFI_IFR_GUID_LABEL *StartLabel;
EFI_IFR_GUID_LABEL *EndLabel;
EFI_STRING_ID Prompt;
UINTN Index;
UINT32 OptionValue;
UINT8 *OpcodeBuffer;
if (mBootOptions != NULL) {
EfiBootManagerFreeLoadOptions (mBootOptions, mBootOptionCount);
mBootOptions = NULL;
}
ZeroMem (&mOrderConfiguration.OrderOptions, sizeof(mOrderConfiguration.OrderOptions));
//
// Init OpCode Handle and Allocate space for creation of UpdateData Buffer
//
StartOpCodeHandle = HiiAllocateOpCodeHandle ();
ASSERT(StartOpCodeHandle != NULL);
EndOpCodeHandle = HiiAllocateOpCodeHandle ();
ASSERT(EndOpCodeHandle != NULL);
OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
ASSERT(OptionsOpCodeHandle != NULL);
//
// Create Hii Extend Label OpCode as the start opcode
//
StartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof(EFI_IFR_GUID_LABEL));
StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
//
// Create Hii Extend Label OpCode as the end opcode
//
EndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof(EFI_IFR_GUID_LABEL));
EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
StartLabel->Number = LABEL_ORDER_OPTIONS;
EndLabel->Number = LABEL_ORDER_END;
mBootOptions = EfiBootManagerGetLoadOptions (&mBootOptionCount, LoadOptionTypeBoot);
for (Index = 0; Index < mBootOptionLimit; Index++) {
//
// Don't display the hidden/inactive boot options.
//
if (((mBootOptions[Index].Attributes & LOAD_OPTION_HIDDEN) != 0) ||
((mBootOptions[Index].Attributes & LOAD_OPTION_CATEGORY_APP) != 0)) {
continue;
}
ASSERT(mBootOptions[Index].Description != NULL);
Prompt = HiiSetString (
mBootMenuPrivate.HiiHandle,
0,
mBootOptions[Index].Description,
NULL
);
DEBUG((DEBUG_INFO,"%a Indx=%d, Hash=%x, Attr=%x, %s\n",__FUNCTION__, Index, mBootOptions[Index].OptionNumber, mBootOptions[Index].Attributes, mBootOptions[Index].Description));
OptionValue = (UINT32)(mBootOptions[Index].OptionNumber + 1);
if ((mBootOptions[Index].Attributes & LOAD_OPTION_ACTIVE) == LOAD_OPTION_ACTIVE) {
OptionValue |= ORDERED_LIST_CHECKBOX_VALUE_32;
}
if (!IsDefaultBootOption(&mBootOptions[Index])) {
OptionValue |= ORDERED_LIST_ALLOW_DELETE_VALUE_32;
}
OpcodeBuffer = HiiCreateOneOfOptionOpCode (
OptionsOpCodeHandle,
Prompt,
EFI_IFR_FLAG_CALLBACK,
EFI_IFR_TYPE_NUM_SIZE_32,
OptionValue
);
ASSERT (OpcodeBuffer != NULL);
mOrderConfiguration.OrderOptions[Index] = OptionValue;;
}
OpcodeBuffer = HiiCreateOrderedListOpCode (
StartOpCodeHandle,
(EFI_QUESTION_ID)(MS_BOOT_ORDER_QUESTION_ID),
MS_BOOT_ORDER_VARID,
OFFSET_OF(ORDER_MENU_CONFIGURATION, OrderOptions),
STRING_TOKEN(STR_BOOT_ORDER_LIST),
0,
EFI_IFR_FLAG_CALLBACK, // OPTIONS_ONLY is unused - means combo ListBox
EFI_IFR_UNIQUE_SET | EMBEDDED_CHECKBOX | EMBEDDED_DELETE,
EFI_IFR_NUMERIC_SIZE_4,
mBootOptionLimit,
OptionsOpCodeHandle,
NULL // Default Op Code is NULL
);
ASSERT (OpcodeBuffer != NULL);
Status = HiiUpdateForm(
mBootMenuPrivate.HiiHandle,
&gMsBootMenuFormsetGuid,
MS_BOOT_ORDER_FORM_ID,
StartOpCodeHandle,
EndOpCodeHandle
);
if (EFI_ERROR(Status)) {
DEBUG((DEBUG_ERROR, "%a Error in HiiUpdateform. Code=%r\n", __FUNCTION__, Status));
}
if (StartOpCodeHandle != NULL) {
HiiFreeOpCodeHandle(StartOpCodeHandle);
}
if (StartOpCodeHandle != NULL) {
HiiFreeOpCodeHandle(EndOpCodeHandle);
}
if (OptionsOpCodeHandle != NULL) {
HiiFreeOpCodeHandle(OptionsOpCodeHandle);
}
}