updatepage.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 1,279 行 · 第 1/3 页
C
1,279 行
IN BMM_CALLBACK_DATA *CallbackData
)
{
BM_MENU_ENTRY *NewMenuEntry;
BM_CONSOLE_CONTEXT *NewConsoleContext;
BM_TERMINAL_CONTEXT *NewTerminalContext;
UINT16 Index;
UINT16 Index2;
UINT8 *Location;
UINT8 CheckFlags;
EFI_STATUS Status;
VOID *Interface;
Location = (UINT8 *) &UpdateData->Data;
CallbackData->BmmAskSaveOrNot = TRUE;
UpdatePageStart (CallbackData, &Location);
for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);
NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;
CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
if (NewConsoleContext->IsActive) {
CheckFlags |= EFI_IFR_FLAG_DEFAULT;
CallbackData->BmmFakeNvData->ConsoleCheck[Index] = TRUE;
} else {
CallbackData->BmmFakeNvData->ConsoleCheck[Index] = FALSE;
}
CreateCheckBoxOpCode (
(UINT16) (CON_DEVICE_QUESTION_ID + Index),
(UINT8) 1,
NewMenuEntry->DisplayStringToken,
NewMenuEntry->HelpStringToken,
CheckFlags,
(UINT16) (CONSOLE_OPTION_OFFSET + Index),
Location
);
Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
UpdateData->DataCount++;
}
Status = EfiLibLocateProtocol (&gTerminalDriverGuid, &Interface);
if (!EFI_ERROR (Status)) {
for (Index2 = 0; Index2 < TerminalMenu.MenuNumber; Index2++) {
CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index2);
NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
if ((NewTerminalContext->IsConIn && (UpdatePageId == FORM_CON_IN_ID)) ||
(NewTerminalContext->IsConOut && (UpdatePageId == FORM_CON_OUT_ID)) ||
(NewTerminalContext->IsStdErr && (UpdatePageId == FORM_CON_ERR_ID))
) {
CheckFlags |= EFI_IFR_FLAG_DEFAULT;
CallbackData->BmmFakeNvData->ConsoleCheck[Index] = TRUE;
} else {
CallbackData->BmmFakeNvData->ConsoleCheck[Index] = FALSE;
}
CreateCheckBoxOpCode (
(UINT16) (CON_DEVICE_QUESTION_ID + Index),
(UINT8) 1,
NewMenuEntry->DisplayStringToken,
NewMenuEntry->HelpStringToken,
CheckFlags,
(UINT16) (CONSOLE_OPTION_OFFSET + Index),
Location
);
Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
UpdateData->DataCount++;
Index++;
}
}
UpdatePageEnd (CallbackData, Location);
}
VOID
UpdateOrderPage (
IN UINT16 UpdatePageId,
IN BM_MENU_OPTION *OptionMenu,
IN BMM_CALLBACK_DATA *CallbackData
)
{
BM_MENU_ENTRY *NewMenuEntry;
UINT16 Index;
UINT8 *Location;
IFR_OPTION *IfrOptionList;
Location = (UINT8 *) &UpdateData->Data;
CallbackData->BmmAskSaveOrNot = TRUE;
UpdatePageStart (CallbackData, &Location);
CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, OptionMenu);
EfiZeroMem (CallbackData->BmmFakeNvData->OptionOrder, 100);
IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * OptionMenu->MenuNumber);
if (NULL == IfrOptionList) {
return ;
}
for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (OptionMenu, Index);
IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
IfrOptionList[Index].Value = (UINT16) (NewMenuEntry->OptionNumber + 1);
IfrOptionList[Index].OptionString = NULL;
CallbackData->BmmFakeNvData->OptionOrder[Index] = (UINT8) (IfrOptionList[Index].Value);
}
if (OptionMenu->MenuNumber > 0) {
CreateOrderedListOpCode (
(UINT16) OPTION_ORDER_QUESTION_ID,
(UINT8) 100,
STRING_TOKEN (STR_CHANGE_ORDER),
STRING_TOKEN (STR_CHANGE_ORDER),
IfrOptionList,
OptionMenu->MenuNumber,
Location
);
for (Index = 0; Index < OptionMenu->MenuNumber + 2; Index++) {
Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
}
UpdateData->DataCount = (UINT16) (UpdateData->DataCount + OptionMenu->MenuNumber + 2);
}
SafeFreePool (IfrOptionList);
UpdatePageEnd (CallbackData, Location);
EfiCopyMem (
CallbackData->BmmOldFakeNVData.OptionOrder,
CallbackData->BmmFakeNvData->OptionOrder,
100
);
}
VOID
UpdateBootNextPage (
IN BMM_CALLBACK_DATA *CallbackData
)
{
UINT8 *Location;
BM_MENU_ENTRY *NewMenuEntry;
BM_LOAD_CONTEXT *NewLoadContext;
IFR_OPTION *IfrOptionList;
UINTN NumberOfOptions;
UINT16 Index;
Location = (UINT8 *) &UpdateData->Data;
IfrOptionList = NULL;
NumberOfOptions = BootOptionMenu.MenuNumber;
CallbackData->BmmAskSaveOrNot = TRUE;
UpdatePageStart (CallbackData, &Location);
CreateMenuStringToken (CallbackData, CallbackData->BmmHiiHandle, &BootOptionMenu);
if (NumberOfOptions > 0) {
UpdateData->DataCount = (UINT8) (UpdateData->DataCount + NumberOfOptions);
IfrOptionList = EfiAllocateZeroPool ((NumberOfOptions + 1) * sizeof (IFR_OPTION));
ASSERT (IfrOptionList);
CallbackData->BmmFakeNvData->BootNext = (UINT16) (BootOptionMenu.MenuNumber);
for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
if (NewLoadContext->IsBootNext) {
IfrOptionList[Index].Flags = EFI_IFR_FLAG_DEFAULT | EFI_IFR_FLAG_INTERACTIVE;
CallbackData->BmmFakeNvData->BootNext = Index;
} else {
IfrOptionList[Index].Flags = EFI_IFR_FLAG_INTERACTIVE;
}
IfrOptionList[Index].Key = (UINT16) KEY_VALUE_MAIN_BOOT_NEXT;
IfrOptionList[Index].Value = Index;
IfrOptionList[Index].StringToken = NewMenuEntry->DisplayStringToken;
IfrOptionList[Index].OptionString = NULL;
}
IfrOptionList[Index].Key = (UINT16) KEY_VALUE_MAIN_BOOT_NEXT;
IfrOptionList[Index].Value = Index;
IfrOptionList[Index].StringToken = STRING_TOKEN (STR_NONE);
IfrOptionList[Index].Flags = EFI_IFR_FLAG_INTERACTIVE;
if (CallbackData->BmmFakeNvData->BootNext == Index) {
IfrOptionList[Index].Flags |= EFI_IFR_FLAG_DEFAULT;
}
IfrOptionList[Index].OptionString = NULL;
CreateOneOfOpCode (
(UINT16) BOOT_NEXT_QUESTION_ID,
(UINT8) 2,
STRING_TOKEN (STR_BOOT_NEXT),
STRING_TOKEN (STR_BOOT_NEXT_HELP),
IfrOptionList,
(UINTN) (NumberOfOptions + 1),
Location
);
Location = Location + (NumberOfOptions + 2) * ((EFI_IFR_OP_HEADER *) Location)->Length;
Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
UpdateData->DataCount += 3;
SafeFreePool (IfrOptionList);
IfrOptionList = NULL;
}
UpdatePageEnd (CallbackData, Location);
}
VOID
UpdateTimeOutPage (
IN BMM_CALLBACK_DATA *CallbackData
)
{
UINT8 *Location;
UINT16 BootTimeOut;
Location = (UINT8 *) &UpdateData->Data;
CallbackData->BmmAskSaveOrNot = TRUE;
UpdatePageStart (CallbackData, &Location);
BootTimeOut = BdsLibGetTimeout ();
CreateNumericOpCode (
(UINT16) BOOT_TIME_OUT_QUESTION_ID,
(UINT8) 2,
STRING_TOKEN (STR_NUM_AUTO_BOOT),
STRING_TOKEN (STR_HLP_AUTO_BOOT),
0,
65535,
0,
10,
0,
0,
Location
);
CallbackData->BmmFakeNvData->BootTimeOut = (UINT16) BootTimeOut;
UpdateData->DataCount++;
Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
UpdatePageEnd (CallbackData, Location);
}
VOID
UpdateTerminalPage (
IN BMM_CALLBACK_DATA *CallbackData
)
{
UINT16 Index;
UINT8 *Location;
UINT8 CheckFlags;
IFR_OPTION *IfrOptionList;
BM_MENU_ENTRY *NewMenuEntry;
BM_TERMINAL_CONTEXT *NewTerminalContext;
EfiZeroMem (UpdateData, UPDATE_DATA_SIZE);
Location = (UINT8 *) &UpdateData->Data;
UpdatePageStart (CallbackData, &Location);
NewMenuEntry = BOpt_GetMenuEntry (
&TerminalMenu,
CallbackData->CurrentTerminal
);
if (!NewMenuEntry) {
return ;
}
NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * 19);
if (!IfrOptionList) {
return ;
}
for (Index = 0; Index < 19; Index++) {
CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
if (NewTerminalContext->BaudRate == (UINT64) (BaudRateList[Index].Value)) {
CheckFlags |= EFI_IFR_FLAG_DEFAULT;
NewTerminalContext->BaudRateIndex = (UINT8) Index;
CallbackData->BmmFakeNvData->COMBaudRate = NewTerminalContext->BaudRateIndex;
}
IfrOptionList[Index].Flags = CheckFlags;
IfrOptionList[Index].Key = KEY_VALUE_COM_SET_BAUD_RATE;
IfrOptionList[Index].StringToken = BaudRateList[Index].StringToken;
IfrOptionList[Index].Value = Index;
}
CreateOneOfOpCode (
(UINT16) COM_BAUD_RATE_QUESTION_ID,
(UINT8) 1,
STRING_TOKEN (STR_COM_BAUD_RATE),
STRING_TOKEN (STR_COM_BAUD_RATE),
IfrOptionList,
19,
Location
);
Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
UpdateData->DataCount += 2;
SafeFreePool (IfrOptionList);
IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * 4);
if (!IfrOptionList) {
return ;
}
for (Index = 0; Index < 4; Index++) {
CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
if (NewTerminalContext->DataBits == DataBitsList[Index].Value) {
NewTerminalContext->DataBitsIndex = (UINT8) Index;
CallbackData->BmmFakeNvData->COMDataRate = NewTerminalContext->DataBitsIndex;
CheckFlags |= EFI_IFR_FLAG_DEFAULT;
}
IfrOptionList[Index].Flags = CheckFlags;
IfrOptionList[Index].Key = KEY_VALUE_COM_SET_DATA_BITS;
IfrOptionList[Index].StringToken = DataBitsList[Index].StringToken;
IfrOptionList[Index].Value = Index;
}
CreateOneOfOpCode (
(UINT16) COM_DATA_RATE_QUESTION_ID,
(UINT8) 1,
STRING_TOKEN (STR_COM_DATA_BITS),
STRING_TOKEN (STR_COM_DATA_BITS),
IfrOptionList,
4,
Location
);
Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
UpdateData->DataCount += 2;
SafeFreePool (IfrOptionList);
IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * 5);
if (!IfrOptionList) {
return ;
}
for (Index = 0; Index < 5; Index++) {
CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
if (NewTerminalContext->Parity == ParityList[Index].Value) {
CheckFlags |= EFI_IFR_FLAG_DEFAULT;
NewTerminalContext->ParityIndex = (UINT8) Index;
CallbackData->BmmFakeNvData->COMParity = NewTerminalContext->ParityIndex;
}
IfrOptionList[Index].Flags = CheckFlags;
IfrOptionList[Index].Key = KEY_VALUE_COM_SET_PARITY;
IfrOptionList[Index].StringToken = ParityList[Index].StringToken;
IfrOptionList[Index].Value = Index;
}
CreateOneOfOpCode (
(UINT16) COM_PARITY_QUESTION_ID,
(UINT8) 1,
STRING_TOKEN (STR_COM_PARITY),
STRING_TOKEN (STR_COM_PARITY),
IfrOptionList,
5,
Location
);
Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
UpdateData->DataCount += 2;
SafeFreePool (IfrOptionList);
IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * 3);
if (!IfrOptionList) {
return ;
}
for (Index = 0; Index < 3; Index++) {
CheckFlags = EFI_IFR_FLAG_INTERACTIVE;
if (NewTerminalContext->StopBits == StopBitsList[Index].Value) {
CheckFlags |= EFI_IFR_FLAG_DEFAULT;
NewTerminalContext->StopBitsIndex = (UINT8) Index;
CallbackData->BmmFakeNvData->COMStopBits = NewTerminalContext->StopBitsIndex;
}
IfrOptionList[Index].Flags = CheckFlags;
IfrOptionList[Index].Key = KEY_VALUE_COM_SET_STOP_BITS;
IfrOptionList[Index].StringToken = StopBitsList[Index].StringToken;
IfrOptionList[Index].Value = Index;
}
CreateOneOfOpCode (
(UINT16) COM_STOP_BITS_QUESTION_ID,
(UINT8) 1,
STRING_TOKEN (STR_COM_STOP_BITS),
STRING_TOKEN (STR_COM_STOP_BITS),
IfrOptionList,
3,
Location
);
Location = Location + (Index + 1) * ((EFI_IFR_OP_HEADER *) Location)->Length;
Location = Location + ((EFI_IFR_OP_HEADER *) Location)->Length;
UpdateData->DataCount = (UINT8) (UpdateData->DataCount + Index);
UpdateData->DataCount += 2;
SafeFreePool (IfrOptionList);
IfrOptionList = EfiAllocateZeroPool (sizeof (IFR_OPTION) * 4);
if (!IfrOptionList) {
return ;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?