bootmaint.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 1,330 行 · 第 1/3 页
C
1,330 行
CleanUpPage (FORM_CON_COM_SETUP_ID, Private);
UpdateTerminalPage (Private);
} else if (KeyValue >= HANDLE_OPTION_OFFSET) {
Index2 = (UINT16) (KeyValue - HANDLE_OPTION_OFFSET);
NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index2);
ASSERT (NewMenuEntry != NULL);
Private->HandleContext = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext;
CleanUpPage (FORM_DRV_ADD_HANDLE_DESC_ID, Private);
Private->MenuEntry = NewMenuEntry;
Private->LoadContext->FilePathList = Private->HandleContext->DevicePath;
UpdateDriverAddHandleDescPage (Private);
}
}
return EFI_SUCCESS;
}
EFI_STATUS
ApplyChangeHandler (
IN BMM_CALLBACK_DATA *Private,
IN BMM_FAKE_NV_DATA *CurrentFakeNVMap,
IN FORM_ID FormId
)
/*++
Routine Description:
Function handling request to apply changes for BMM pages.
Arguments:
Private - Pointer to callback data buffer.
CurrentFakeNVMap - Pointer to buffer holding data of various values used by BMM
FormId - ID of the form which has sent the request to apply change.
Returns:
EFI_SUCCESS - Change successfully applied.
Other - Error occurs while trying to apply changes.
--*/
{
BM_CONSOLE_CONTEXT *NewConsoleContext;
BM_TERMINAL_CONTEXT *NewTerminalContext;
BM_LOAD_CONTEXT *NewLoadContext;
BM_MENU_ENTRY *NewMenuEntry;
EFI_STATUS Status;
UINT16 Index;
Status = EFI_SUCCESS;
switch (FormId) {
case FORM_SET_FD_ORDER_ID:
case FORM_SET_HD_ORDER_ID:
case FORM_SET_CD_ORDER_ID:
case FORM_SET_NET_ORDER_ID:
case FORM_SET_BEV_ORDER_ID:
Var_UpdateBBSOption (Private);
break;
case FORM_BOOT_DEL_ID:
for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
NewLoadContext->Deleted = CurrentFakeNVMap->BootOptionDel[Index];
}
Var_DelBootOption ();
break;
case FORM_DRV_DEL_ID:
for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index);
NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;
NewLoadContext->Deleted = CurrentFakeNVMap->DriverOptionDel[Index];
}
Var_DelDriverOption ();
break;
case FORM_BOOT_CHG_ID:
Status = Var_UpdateBootOrder (Private);
break;
case FORM_DRV_CHG_ID:
Status = Var_UpdateDriverOrder (Private);
break;
case FORM_TIME_OUT_ID:
Status = gRT->SetVariable (
L"Timeout",
&gEfiGlobalVariableGuid,
VAR_FLAG,
sizeof (UINT16),
&(CurrentFakeNVMap->BootTimeOut)
);
if (EFI_ERROR (Status)) {
goto Error;
}
Private->BmmOldFakeNVData.BootTimeOut = CurrentFakeNVMap->BootTimeOut;
break;
case FORM_BOOT_NEXT_ID:
Status = Var_UpdateBootNext (Private);
break;
case FORM_CON_COM_ID:
NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Private->CurrentTerminal);
ASSERT (NewMenuEntry != NULL);
NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate;
NewTerminalContext->BaudRate = BaudRateList[CurrentFakeNVMap->COMBaudRate].Value;
NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate;
NewTerminalContext->DataBits = (UINT8) DataBitsList[CurrentFakeNVMap->COMDataRate].Value;
NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits;
NewTerminalContext->StopBits = (UINT8) StopBitsList[CurrentFakeNVMap->COMStopBits].Value;
NewTerminalContext->ParityIndex = CurrentFakeNVMap->COMParity;
NewTerminalContext->Parity = (UINT8) ParityList[CurrentFakeNVMap->COMParity].Value;
NewTerminalContext->TerminalType = CurrentFakeNVMap->COMTerminalType;
ChangeTerminalDevicePath (
NewTerminalContext->DevicePath,
FALSE
);
Var_UpdateConsoleInpOption ();
Var_UpdateConsoleOutOption ();
Var_UpdateErrorOutOption ();
break;
case FORM_CON_IN_ID:
for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);
NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;
NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];
}
for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);
NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
NewTerminalContext->IsConIn = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleInpMenu.MenuNumber];
}
Var_UpdateConsoleInpOption ();
break;
case FORM_CON_OUT_ID:
for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);
NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;
NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];
}
for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);
NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
NewTerminalContext->IsConOut = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleOutMenu.MenuNumber];
}
Var_UpdateConsoleOutOption ();
break;
case FORM_CON_ERR_ID:
for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);
NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;
NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];
}
for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);
NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;
NewTerminalContext->IsStdErr = CurrentFakeNVMap->ConsoleCheck[Index + ConsoleErrMenu.MenuNumber];
}
Var_UpdateErrorOutOption ();
break;
case FORM_DRV_ADD_HANDLE_DESC_ID:
Status = Var_UpdateDriverOption (
Private,
Private->BmmHiiHandle,
CurrentFakeNVMap->DriverAddHandleDesc,
CurrentFakeNVMap->DriverAddHandleOptionalData,
CurrentFakeNVMap->DriverAddForceReconnect
);
if (EFI_ERROR (Status)) {
goto Error;
}
BOpt_GetDriverOptions (Private);
CreateMenuStringToken (Private, Private->BmmHiiHandle, &DriverOptionMenu);
break;
default:
break;
}
Error:
return Status;
}
VOID
DiscardChangeHandler (
IN BMM_CALLBACK_DATA *Private,
IN BMM_FAKE_NV_DATA *CurrentFakeNVMap
)
{
UINT16 Index;
switch (Private->BmmPreviousPageId) {
case FORM_BOOT_CHG_ID:
case FORM_DRV_CHG_ID:
EfiCopyMem (CurrentFakeNVMap->OptionOrder, Private->BmmOldFakeNVData.OptionOrder, 100);
break;
case FORM_BOOT_DEL_ID:
for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
CurrentFakeNVMap->BootOptionDel[Index] = 0x00;
}
break;
case FORM_DRV_DEL_ID:
for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {
CurrentFakeNVMap->DriverOptionDel[Index] = 0x00;
}
break;
case FORM_BOOT_NEXT_ID:
CurrentFakeNVMap->BootNext = Private->BmmOldFakeNVData.BootNext;
break;
case FORM_TIME_OUT_ID:
CurrentFakeNVMap->BootTimeOut = Private->BmmOldFakeNVData.BootTimeOut;
break;
case FORM_DRV_ADD_HANDLE_DESC_ID:
case FORM_DRV_ADD_FILE_ID:
case FORM_DRV_ADD_HANDLE_ID:
CurrentFakeNVMap->DriverAddHandleDesc[0] = 0x0000;
CurrentFakeNVMap->DriverAddHandleOptionalData[0] = 0x0000;
break;
default:
break;
}
}
EFI_STATUS
EFIAPI
NvWrite (
IN EFI_FORM_CALLBACK_PROTOCOL *This,
IN CHAR16 *VariableName,
IN EFI_GUID *VendorGuid,
OUT UINT32 Attributes OPTIONAL,
IN OUT UINTN DataSize,
OUT VOID *Buffer,
OUT BOOLEAN *ResetRequired
)
{
//
// Do nothing here. Just to catch the F10, we use "Apply Changes" tag to save.
//
return EFI_SUCCESS;
}
EFI_STATUS
InitializeBM (
VOID
)
/*++
Routine Description:
Initialize the Boot Maintenance Utitliy
Arguments:
ImageHandle - caller provided handle
SystemTable - caller provided system tables
Returns:
EFI_SUCCESS - utility ended successfully
others - contain some errors
--*/
{
EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
EFI_HII_PACKAGES *PackageList;
BMM_CALLBACK_DATA *BmmCallbackInfo;
EFI_HII_PROTOCOL *Hii;
EFI_HII_HANDLE HiiHandle;
EFI_STATUS Status;
EFI_HANDLE Handle;
UINT8 *Ptr;
UINT8 *Location;
Status = EFI_SUCCESS;
UpdateData = NULL;
//
// Initialize EfiUtilityLib and EfiDriverLib
// Since many functions in UtilityLib must be used and
// SetupBrowser use DriverLib
//
//
// There should be only one EFI_HII_PROTOCOL Image
//
Status = EfiLibLocateProtocol (&gEfiHiiProtocolGuid, &Hii);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Create CallbackData structures for Driver Callback
//
BmmCallbackInfo = EfiAllocateZeroPool (sizeof (BMM_CALLBACK_DATA));
if (!BmmCallbackInfo) {
return EFI_OUT_OF_RESOURCES;
}
//
// Create LoadOption in BmmCallbackInfo for Driver Callback
//
Ptr = EfiAllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY));
if (!Ptr) {
SafeFreePool (BmmCallbackInfo);
return EFI_OUT_OF_RESOURCES;
}
//
// Initialize Bmm callback data.
//
BmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;
Ptr += sizeof (BM_LOAD_CONTEXT);
BmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;
Ptr += sizeof (BM_FILE_CONTEXT);
BmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;
Ptr += sizeof (BM_HANDLE_CONTEXT);
BmmCallbackInfo->MenuEntry = (BM_MENU_ENTRY *) Ptr;
BmmCallbackInfo->BmmFakeNvData = &BmmCallbackInfo->BmmOldFakeNVData;
EfiZeroMem (BmmCallbackInfo->BmmFakeNvData, sizeof (BMM_FAKE_NV_DATA));
BmmCallbackInfo->Signature = BMM_CALLBACK_DATA_SIGNATURE;
BmmCallbackInfo->Hii = Hii;
BmmCallbackInfo->BmmDriverCallback.NvRead = NULL;
BmmCallbackInfo->BmmDriverCallback.NvWrite = NvWrite;
BmmCallbackInfo->BmmDriverCallback.Callback = DriverCallback;
BmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID;
BmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID;
BmmCallbackInfo->FeDriverCallback.NvRead = NULL;
BmmCallbackInfo->FeDriverCallback.NvWrite = NvWrite;
BmmCallbackInfo->FeDriverCallback.Callback = FileExplorerCallback;
BmmCallbackInfo->FeCurrentState = INACTIVE_STATE;
BmmCallbackInfo->FeDisplayContext = UNKNOWN_CONTEXT;
//
// Install bmm callback protocol interface
//
Handle = NULL;
Status = gBS->InstallProtocolInterface (
&Handle,
&gEfiFormCallbackProtocolGuid,
EFI_NATIVE_INTERFACE,
&BmmCallbackInfo->BmmDriverCallback
);
if (EFI_ERROR (Status)) {
return Status;
}
BmmCallbackInfo->BmmCallbackHandle = Handle;
//
// Install file explorer callback protocol interface
//
Handle = NULL;
Status = gBS->InstallProtocolInterface (
&Handle,
&gEfiFormCallbackProtocolGuid,
EFI_NATIVE_INTERFACE,
&BmmCallbackInfo->FeDriverCallback
);
if (EFI_ERROR (Status)) {
return Status;
}
BmmCallbackInfo->FeCallbackHandle = Handle;
//
// Post our VFR to the HII database.
//
PackageList = PreparePackages (1, &gBdsStringPackGuid, bmBin);
Status = Hii->NewPack (Hii, PackageList, &HiiHandle);
gBS->FreePool (PackageList);
BmmCallbackInfo->BmmHiiHandle = HiiHandle;
PackageList = PreparePackages (1, &gBdsStringPackGuid, FEBin);
Status = Hii->NewPack (Hii, PackageList, &HiiHandle);
gBS->FreePool (PackageList);
BmmCallbackInfo->FeHiiHandle = HiiHandle;
//
// Allocate space for creation of Buffer
//
UpdateData = EfiAllocateZeroPool (UPDATE_DATA_SIZE);
if (!UpdateData) {
SafeFreePool (BmmCallbackInfo->LoadContext);
SafeFreePool (BmmCallbackInfo);
return EFI_OUT_OF_RESOURCES;
}
//
// Initialize UpdateData structure
//
RefreshUpdateData (TRUE, (EFI_PHYSICAL_ADDRESS) (UINTN) BmmCallbackInfo->BmmCallbackHandle, FALSE, 0, 0);
Location = (UINT8 *) &UpdateData->Data;
InitializeStringDepository ();
InitAllMenu (BmmCallbackInfo);
CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleInpMenu);
CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleOutMenu);
CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &ConsoleErrMenu);
CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &BootOptionMenu);
CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverOptionMenu);
CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &TerminalMenu);
CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, &DriverMenu);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?