/** Create a lit of driver option from global DriverMenu. @param CallbackData The BMM context data. **/ VOID UpdateDrvAddHandlePage ( IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; UINT16 Index; CallbackData->BmmAskSaveOrNot = FALSE; UpdatePageStart (CallbackData); for (Index = 0; Index < DriverMenu.MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (&DriverMenu, Index); HiiCreateGotoOpCode ( mStartOpCodeHandle, FORM_DRV_ADD_HANDLE_DESC_ID, NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, (UINT16) (HANDLE_OPTION_OFFSET + Index) ); } UpdatePageEnd (CallbackData); }
/** Create a list of Goto Opcode for all terminal devices logged by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID. @param CallbackData The BMM context data. **/ VOID UpdateConCOMPage ( IN BMM_CALLBACK_DATA *CallbackData ) { BM_MENU_ENTRY *NewMenuEntry; UINT16 Index; CallbackData->BmmAskSaveOrNot = FALSE; UpdatePageStart (CallbackData); for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index); HiiCreateGotoOpCode ( mStartOpCodeHandle, FORM_CON_COM_SETUP_ID, NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, (UINT16) (TERMINAL_OPTION_OFFSET + Index) ); } UpdatePageEnd (CallbackData); }
/** Update the File Explore page. **/ VOID LibUpdateFileExplorePage ( VOID ) { UINTN Index; MENU_ENTRY *NewMenuEntry; FILE_CONTEXT *NewFileContext; MENU_OPTION *MenuOption; NewMenuEntry = NULL; NewFileContext = NULL; LibRefreshUpdateData (); MenuOption = gFileExplorerPrivate.FsOptionMenu; for (Index = 0; Index < MenuOption->MenuNumber; Index++) { NewMenuEntry = LibGetMenuEntry (MenuOption, Index); NewFileContext = (FILE_CONTEXT *) NewMenuEntry->VariableContext; if (!NewFileContext->IsDir) { // // Create Text opcode for directory, also create Text opcode for file in FileExplorerStateBootFromFile. // HiiCreateActionOpCode ( mLibStartOpCodeHandle, (UINT16) (FILE_OPTION_OFFSET + Index), NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, 0 ); } else { // // Create Goto opcode for file in FileExplorerStateAddBootOption or FileExplorerStateAddDriverOptionState. // HiiCreateGotoOpCode ( mLibStartOpCodeHandle, FORM_FILE_EXPLORER_ID, NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, (UINT16) (FILE_OPTION_OFFSET + Index) ); } } HiiUpdateForm ( gFileExplorerPrivate.FeHiiHandle, &FileExplorerGuid, FORM_FILE_EXPLORER_ID, mLibStartOpCodeHandle, // Label FORM_FILE_EXPLORER_ID mLibEndOpCodeHandle // LABEL_END ); }
/** Add a username item in form. @param[in] User Points to the user profile whose username is added. @param[in] Index The index of the user in the user name list @param[in] OpCodeHandle Points to container for dynamic created opcodes. **/ VOID AddUserToForm ( IN EFI_USER_PROFILE_HANDLE User, IN UINT16 Index, IN VOID *OpCodeHandle ) { EFI_STRING_ID NameId; // // Get user name // NameId = GetUserName (User); if (NameId == 0) { return ; } // // Create user name option. // switch (Index & KEY_FIRST_FORM_MASK) { case KEY_MODIFY_USER: HiiCreateGotoOpCode ( OpCodeHandle, // Container for dynamic created opcodes FORMID_USER_INFO, // Target Form ID NameId, // Prompt text STRING_TOKEN (STR_NULL_STRING), // Help text EFI_IFR_FLAG_CALLBACK, // Question flag Index // Question ID ); break; case KEY_DEL_USER: HiiCreateActionOpCode ( OpCodeHandle, // Container for dynamic created opcodes Index, // Question ID NameId, // Prompt text STRING_TOKEN (STR_NULL_STRING), // Help text EFI_IFR_FLAG_CALLBACK, // Question flag 0 // Action String ID ); break; default: break; } }
/** Add a "Go back to main page" tag in front of the form when there are no "Apply changes" and "Discard changes" tags in the end of the form. @param CallbackData The BMM context data. **/ VOID UpdatePageStart ( IN BMM_CALLBACK_DATA *CallbackData ) { RefreshUpdateData (); mStartLabel->Number = CallbackData->BmmCurrentPageId; if (!(CallbackData->BmmAskSaveOrNot)) { // // Add a "Go back to main page" tag in front of the form when there are no // "Apply changes" and "Discard changes" tags in the end of the form. // HiiCreateGotoOpCode ( mStartOpCodeHandle, FORM_MAIN_ID, STRING_TOKEN (STR_FORM_GOTO_MAIN), STRING_TOKEN (STR_FORM_GOTO_MAIN), 0, FORM_MAIN_ID ); } }
/** Update the File Explore page. **/ VOID LibUpdateFileExplorePage ( VOID ) { UINTN Index; MENU_ENTRY *NewMenuEntry; FILE_CONTEXT *NewFileContext; MENU_OPTION *MenuOption; BOOLEAN CreateNewFile; NewMenuEntry = NULL; NewFileContext = NULL; CreateNewFile = FALSE; LibRefreshUpdateData (); MenuOption = gFileExplorerPrivate.FsOptionMenu; mQuestionIdUpdate += QUESTION_ID_UPDATE_STEP; for (Index = 0; Index < MenuOption->MenuNumber; Index++) { NewMenuEntry = LibGetMenuEntry (MenuOption, Index); NewFileContext = (FILE_CONTEXT *) NewMenuEntry->VariableContext; if (!NewFileContext->IsRoot && !CreateNewFile) { HiiCreateGotoOpCode ( mLibStartOpCodeHandle, FORM_ADD_NEW_FILE_ID, STRING_TOKEN (STR_NEW_FILE), STRING_TOKEN (STR_NEW_FILE_HELP), EFI_IFR_FLAG_CALLBACK, (UINT16) (mNewFileQuestionId++) ); HiiCreateGotoOpCode ( mLibStartOpCodeHandle, FORM_ADD_NEW_FOLDER_ID, STRING_TOKEN (STR_NEW_FOLDER), STRING_TOKEN (STR_NEW_FOLDER_HELP), EFI_IFR_FLAG_CALLBACK, (UINT16) (mNewFolderQuestionId++) ); HiiCreateTextOpCode( mLibStartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), STRING_TOKEN (STR_NULL_STRING), 0 ); CreateNewFile = TRUE; } if (!NewFileContext->IsDir) { // // Create Text opcode for directory, also create Text opcode for file in FileExplorerStateBootFromFile. // HiiCreateActionOpCode ( mLibStartOpCodeHandle, (UINT16) (FILE_OPTION_OFFSET + Index + mQuestionIdUpdate), NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, 0 ); } else { // // Create Goto opcode for file in FileExplorerStateAddBootOption or FileExplorerStateAddDriverOptionState. // HiiCreateGotoOpCode ( mLibStartOpCodeHandle, FORM_FILE_EXPLORER_ID, NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, (UINT16) (FILE_OPTION_OFFSET + Index + mQuestionIdUpdate) ); } } HiiUpdateForm ( gFileExplorerPrivate.FeHiiHandle, &FileExplorerGuid, FORM_FILE_EXPLORER_ID, mLibStartOpCodeHandle, // Label FORM_FILE_EXPLORER_ID mLibEndOpCodeHandle // LABEL_END ); }
/** Update the File Explore page. @param CallbackData The BMM context data. @param MenuOption Pointer to menu options to display. **/ VOID UpdateFileExplorePage ( IN BMM_CALLBACK_DATA *CallbackData, BM_MENU_OPTION *MenuOption ) { UINTN Index; BM_MENU_ENTRY *NewMenuEntry; BM_FILE_CONTEXT *NewFileContext; EFI_FORM_ID FormId; NewMenuEntry = NULL; NewFileContext = NULL; FormId = 0; RefreshUpdateData (); mStartLabel->Number = FORM_FILE_EXPLORER_ID; for (Index = 0; Index < MenuOption->MenuNumber; Index++) { NewMenuEntry = BOpt_GetMenuEntry (MenuOption, Index); NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext; if (NewFileContext->IsBootLegacy) { continue; } if ((NewFileContext->IsDir) || (FileExplorerStateBootFromFile == CallbackData->FeCurrentState)) { // // Create Text opcode for directory, also create Text opcode for file in FileExplorerStateBootFromFile. // HiiCreateActionOpCode ( mStartOpCodeHandle, (UINT16) (FILE_OPTION_OFFSET + Index), NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, 0 ); } else { // // Create Goto opcode for file in FileExplorerStateAddBootOption or FileExplorerStateAddDriverOptionState. // if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) { FormId = FORM_BOOT_ADD_DESCRIPTION_ID; } else if (FileExplorerStateAddDriverOptionState == CallbackData->FeCurrentState) { FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID; } HiiCreateGotoOpCode ( mStartOpCodeHandle, FormId, NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL_STRING), EFI_IFR_FLAG_CALLBACK, (UINT16) (FILE_OPTION_OFFSET + Index) ); } } HiiUpdateForm ( CallbackData->FeHiiHandle, &mFileExplorerGuid, FORM_FILE_EXPLORER_ID, mStartOpCodeHandle, // Label FORM_FILE_EXPLORER_ID mEndOpCodeHandle // LABEL_END ); }
/** Dynamic create Hii information for Device Manager. @param NextShowFormId The FormId which need to be show. **/ VOID CreateDeviceManagerForm( IN EFI_FORM_ID NextShowFormId ) { UINTN Index; EFI_STRING String; EFI_STRING_ID Token; EFI_STRING_ID TokenHelp; EFI_HII_HANDLE *HiiHandles; EFI_HII_HANDLE HiiHandle; EFI_GUID FormSetGuid; VOID *StartOpCodeHandle; VOID *EndOpCodeHandle; EFI_IFR_GUID_LABEL *StartLabel; EFI_IFR_GUID_LABEL *EndLabel; BOOLEAN AddNetworkMenu; UINTN AddItemCount; UINTN NewStringLen; EFI_STRING NewStringTitle; CHAR16 *DevicePathStr; EFI_STRING_ID DevicePathId; EFI_IFR_FORM_SET *Buffer; UINTN BufferSize; UINT8 ClassGuidNum; EFI_GUID *ClassGuid; UINTN TempSize; UINT8 *Ptr; EFI_STATUS Status; TempSize =0; BufferSize = 0; Buffer = NULL; HiiHandle = gDeviceManagerPrivate.HiiHandle; AddNetworkMenu = FALSE; AddItemCount = 0; // // If need show the Network device list form, clear the old save list first. // if ((NextShowFormId == NETWORK_DEVICE_LIST_FORM_ID) && (mMacDeviceList.CurListLen > 0)) { mMacDeviceList.CurListLen = 0; } // // Update the network device form titile. // if (NextShowFormId == NETWORK_DEVICE_FORM_ID) { String = HiiGetString (HiiHandle, STRING_TOKEN (STR_FORM_NETWORK_DEVICE_TITLE), NULL); NewStringLen = StrLen(mSelectedMacAddrString) * 2; NewStringLen += (StrLen(String) + 2) * 2; NewStringTitle = AllocatePool (NewStringLen); UnicodeSPrint (NewStringTitle, NewStringLen, L"%s %s", String, mSelectedMacAddrString); HiiSetString (HiiHandle, STRING_TOKEN (STR_FORM_NETWORK_DEVICE_TITLE), NewStringTitle, NULL); FreePool (String); FreePool (NewStringTitle); } // // Allocate space for creation of UpdateData Buffer // StartOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (StartOpCodeHandle != NULL); EndOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (EndOpCodeHandle != 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; // // According to the next show Form id(mNextShowFormId) to decide which form need to update. // StartLabel->Number = (UINT16) (LABEL_FORM_ID_OFFSET + NextShowFormId); // // 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; EndLabel->Number = LABEL_END; // // Get all the Hii handles // HiiHandles = HiiGetHiiHandles (NULL); ASSERT (HiiHandles != NULL); // // Search for formset of each class type // for (Index = 0; HiiHandles[Index] != NULL; Index++) { Status = HiiGetFormSetFromHiiHandle(HiiHandles[Index], &Buffer,&BufferSize); if (EFI_ERROR (Status)){ continue; } Ptr = (UINT8 *)Buffer; while(TempSize < BufferSize) { TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length; if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){ Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length; continue; } ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3); ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET)); while (ClassGuidNum-- > 0) { if (CompareGuid (&gEfiHiiPlatformSetupFormsetGuid, ClassGuid)== 0) { ClassGuid ++; continue; } String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle, NULL); if (String == NULL) { String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL); ASSERT (String != NULL); } Token = HiiSetString (HiiHandle, 0, String, NULL); FreePool (String); String = HiiGetString (HiiHandles[Index], ((EFI_IFR_FORM_SET *)Ptr)->Help, NULL); if (String == NULL) { String = HiiGetString (HiiHandle, STRING_TOKEN (STR_MISSING_STRING), NULL); ASSERT (String != NULL); } TokenHelp = HiiSetString (HiiHandle, 0, String, NULL); FreePool (String); FormSetGuid = ((EFI_IFR_FORM_SET *)Ptr)->Guid; // // Network device process // if (IsNeedAddNetworkMenu (HiiHandles[Index], NextShowFormId,&AddItemCount)) { if (NextShowFormId == DEVICE_MANAGER_FORM_ID) { // // Only show one menu item "Network Config" in the device manger form. // if (!AddNetworkMenu) { AddNetworkMenu = TRUE; HiiCreateGotoOpCode ( StartOpCodeHandle, NETWORK_DEVICE_LIST_FORM_ID, STRING_TOKEN (STR_FORM_NETWORK_DEVICE_LIST_TITLE), STRING_TOKEN (STR_FORM_NETWORK_DEVICE_LIST_HELP), EFI_IFR_FLAG_CALLBACK, (EFI_QUESTION_ID) QUESTION_NETWORK_DEVICE_ID ); } } else if (NextShowFormId == NETWORK_DEVICE_LIST_FORM_ID) { // // In network device list form, same mac address device only show one menu. // while (AddItemCount > 0) { HiiCreateGotoOpCode ( StartOpCodeHandle, NETWORK_DEVICE_FORM_ID, mMacDeviceList.NodeList[mMacDeviceList.CurListLen - AddItemCount].PromptId, STRING_TOKEN (STR_NETWORK_DEVICE_HELP), EFI_IFR_FLAG_CALLBACK, mMacDeviceList.NodeList[mMacDeviceList.CurListLen - AddItemCount].QuestionId ); AddItemCount -= 1; } } else if (NextShowFormId == NETWORK_DEVICE_FORM_ID) { // // In network device form, only the selected mac address device need to be show. // DevicePathStr = DmExtractDevicePathFromHiiHandle(HiiHandles[Index]); DevicePathId = 0; if (DevicePathStr != NULL){ DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL); FreePool(DevicePathStr); } HiiCreateGotoExOpCode ( StartOpCodeHandle, 0, Token, TokenHelp, 0, (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET), 0, &FormSetGuid, DevicePathId ); } } else { // // Not network device process, only need to show at device manger form. // if (NextShowFormId == DEVICE_MANAGER_FORM_ID) { DevicePathStr = DmExtractDevicePathFromHiiHandle(HiiHandles[Index]); DevicePathId = 0; if (DevicePathStr != NULL){ DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL); FreePool(DevicePathStr); } HiiCreateGotoExOpCode ( StartOpCodeHandle, 0, Token, TokenHelp, 0, (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET), 0, &FormSetGuid, DevicePathId ); } } break; } Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length; } FreePool(Buffer); Buffer = NULL; TempSize = 0; BufferSize = 0; } HiiUpdateForm ( HiiHandle, &mDeviceManagerGuid, NextShowFormId, StartOpCodeHandle, EndOpCodeHandle ); HiiFreeOpCodeHandle (StartOpCodeHandle); HiiFreeOpCodeHandle (EndOpCodeHandle); FreePool (HiiHandles); }
/** Initialize the Boot Maintenance Utitliy. @retval EFI_SUCCESS utility ended successfully @retval others contain some errors **/ EFI_STATUS InitializeBM ( VOID ) { EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; BMM_CALLBACK_DATA *BmmCallbackInfo; EFI_STATUS Status; UINT8 *Ptr; Status = EFI_SUCCESS; // // Create CallbackData structures for Driver Callback // BmmCallbackInfo = AllocateZeroPool (sizeof (BMM_CALLBACK_DATA)); if (BmmCallbackInfo == NULL) { return EFI_OUT_OF_RESOURCES; } // // Create LoadOption in BmmCallbackInfo for Driver Callback // Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) + sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY)); if (Ptr == NULL) { FreePool (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->Signature = BMM_CALLBACK_DATA_SIGNATURE; BmmCallbackInfo->BmmConfigAccess.ExtractConfig = BootMaintExtractConfig; BmmCallbackInfo->BmmConfigAccess.RouteConfig = FakeRouteConfig; BmmCallbackInfo->BmmConfigAccess.Callback = BootMaintCallback; BmmCallbackInfo->BmmPreviousPageId = FORM_MAIN_ID; BmmCallbackInfo->BmmCurrentPageId = FORM_MAIN_ID; BmmCallbackInfo->FeConfigAccess.ExtractConfig = FakeExtractConfig; BmmCallbackInfo->FeConfigAccess.RouteConfig = FakeRouteConfig; BmmCallbackInfo->FeConfigAccess.Callback = FileExplorerCallback; BmmCallbackInfo->FeCurrentState = FileExplorerStateInActive; BmmCallbackInfo->FeDisplayContext = FileExplorerDisplayUnknown; // // Install Device Path Protocol and Config Access protocol to driver handle // Status = gBS->InstallMultipleProtocolInterfaces ( &BmmCallbackInfo->BmmDriverHandle, &gEfiDevicePathProtocolGuid, &mBmmHiiVendorDevicePath, &gEfiHiiConfigAccessProtocolGuid, &BmmCallbackInfo->BmmConfigAccess, NULL ); if (EFI_ERROR (Status)) { goto Exit; } // // Install Device Path Protocol and Config Access protocol to driver handle // Status = gBS->InstallMultipleProtocolInterfaces ( &BmmCallbackInfo->FeDriverHandle, &gEfiDevicePathProtocolGuid, &mFeHiiVendorDevicePath, &gEfiHiiConfigAccessProtocolGuid, &BmmCallbackInfo->FeConfigAccess, NULL ); if (EFI_ERROR (Status)) { goto Exit; } // // Post our Boot Maint VFR binary to the HII database. // BmmCallbackInfo->BmmHiiHandle = HiiAddPackages ( &gBootMaintFormSetGuid, BmmCallbackInfo->BmmDriverHandle, BmBin, BdsDxeStrings, NULL ); ASSERT (BmmCallbackInfo->BmmHiiHandle != NULL); // // Post our File Explorer VFR binary to the HII database. // BmmCallbackInfo->FeHiiHandle = HiiAddPackages ( &gFileExploreFormSetGuid, BmmCallbackInfo->FeDriverHandle, FEBin, BdsDxeStrings, NULL ); ASSERT (BmmCallbackInfo->FeHiiHandle != NULL); // // Init OpCode Handle and Allocate space for creation of Buffer // mStartOpCodeHandle = HiiAllocateOpCodeHandle (); if (mStartOpCodeHandle == NULL) { Status = EFI_OUT_OF_RESOURCES; goto Exit; } mEndOpCodeHandle = HiiAllocateOpCodeHandle (); if (mEndOpCodeHandle == NULL) { Status = EFI_OUT_OF_RESOURCES; goto Exit; } // // Create Hii Extend Label OpCode as the start opcode // mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; // // Create Hii Extend Label OpCode as the end opcode // mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; mEndLabel->Number = LABEL_END; 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); UpdateBootDelPage (BmmCallbackInfo); UpdateDrvDelPage (BmmCallbackInfo); if (TerminalMenu.MenuNumber > 0) { BmmCallbackInfo->CurrentTerminal = 0; UpdateTerminalPage (BmmCallbackInfo); } Status = gBS->LocateProtocol (&gEfiLegacyBiosProtocolGuid, NULL, (VOID **) &LegacyBios); if (!EFI_ERROR (Status)) { RefreshUpdateData (); mStartLabel->Number = FORM_BOOT_LEGACY_DEVICE_ID; // // If LegacyBios Protocol is installed, add 3 tags about legacy boot option // in BootOption form: legacy FD/HD/CD/NET/BEV // HiiCreateGotoOpCode ( mStartOpCodeHandle, FORM_SET_FD_ORDER_ID, STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE), STRING_TOKEN (STR_FORM_SET_FD_ORDER_TITLE), EFI_IFR_FLAG_CALLBACK, FORM_SET_FD_ORDER_ID ); HiiCreateGotoOpCode ( mStartOpCodeHandle, FORM_SET_HD_ORDER_ID, STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE), STRING_TOKEN (STR_FORM_SET_HD_ORDER_TITLE), EFI_IFR_FLAG_CALLBACK, FORM_SET_HD_ORDER_ID ); HiiCreateGotoOpCode ( mStartOpCodeHandle, FORM_SET_CD_ORDER_ID, STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE), STRING_TOKEN (STR_FORM_SET_CD_ORDER_TITLE), EFI_IFR_FLAG_CALLBACK, FORM_SET_CD_ORDER_ID ); HiiCreateGotoOpCode ( mStartOpCodeHandle, FORM_SET_NET_ORDER_ID, STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE), STRING_TOKEN (STR_FORM_SET_NET_ORDER_TITLE), EFI_IFR_FLAG_CALLBACK, FORM_SET_NET_ORDER_ID ); HiiCreateGotoOpCode ( mStartOpCodeHandle, FORM_SET_BEV_ORDER_ID, STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE), STRING_TOKEN (STR_FORM_SET_BEV_ORDER_TITLE), EFI_IFR_FLAG_CALLBACK, FORM_SET_BEV_ORDER_ID ); HiiUpdateForm ( BmmCallbackInfo->BmmHiiHandle, &gBootMaintFormSetGuid, FORM_BOOT_SETUP_ID, mStartOpCodeHandle, // Label FORM_BOOT_LEGACY_DEVICE_ID mEndOpCodeHandle // LABEL_END ); } // // Dispatch BMM main formset and File Explorer formset. // FormSetDispatcher (BmmCallbackInfo); // // Remove our IFR data from HII database // HiiRemovePackages (BmmCallbackInfo->BmmHiiHandle); HiiRemovePackages (BmmCallbackInfo->FeHiiHandle); CleanUpStringDepository (); FreeAllMenu (); Exit: if (mStartOpCodeHandle != NULL) { HiiFreeOpCodeHandle (mStartOpCodeHandle); } if (mEndOpCodeHandle != NULL) { HiiFreeOpCodeHandle (mEndOpCodeHandle); } if (BmmCallbackInfo->FeDriverHandle != NULL) { gBS->UninstallMultipleProtocolInterfaces ( BmmCallbackInfo->FeDriverHandle, &gEfiDevicePathProtocolGuid, &mFeHiiVendorDevicePath, &gEfiHiiConfigAccessProtocolGuid, &BmmCallbackInfo->FeConfigAccess, NULL ); } if (BmmCallbackInfo->BmmDriverHandle != NULL) { gBS->UninstallMultipleProtocolInterfaces ( BmmCallbackInfo->BmmDriverHandle, &gEfiDevicePathProtocolGuid, &mBmmHiiVendorDevicePath, &gEfiHiiConfigAccessProtocolGuid, &BmmCallbackInfo->BmmConfigAccess, NULL ); } FreePool (BmmCallbackInfo->LoadContext); FreePool (BmmCallbackInfo); return Status; }
/** Update the File Explore page. @param[in] HiiHandle Hii Handle of the package to be updated. @param[in] MenuOption The Menu whose string tokens need to be updated. @param[in] FeCurrentState Current file explorer state. **/ VOID UpdateFileExplorePage ( IN EFI_HII_HANDLE HiiHandle, IN SECUREBOOT_MENU_OPTION *MenuOption, IN FILE_EXPLORER_STATE FeCurrentState ) { UINTN Index; SECUREBOOT_MENU_ENTRY *NewMenuEntry; SECUREBOOT_FILE_CONTEXT *NewFileContext; EFI_FORM_ID FormId; EFI_FORM_ID FileFormId; if (FeCurrentState == FileExplorerStateEnrollPkFile) { FormId = SECUREBOOT_ADD_PK_FILE_FORM_ID; FileFormId = FORM_FILE_EXPLORER_ID_PK; } else if (FeCurrentState == FileExplorerStateEnrollKekFile) { FormId = FORMID_ENROLL_KEK_FORM; FileFormId = FORM_FILE_EXPLORER_ID_KEK; } else if (FeCurrentState == FileExplorerStateEnrollSignatureFileToDb) { FormId = SECUREBOOT_ENROLL_SIGNATURE_TO_DB; FileFormId = FORM_FILE_EXPLORER_ID_DB; } else if (FeCurrentState == FileExplorerStateEnrollSignatureFileToDbx) { FormId = SECUREBOOT_ENROLL_SIGNATURE_TO_DBX; FileFormId = FORM_FILE_EXPLORER_ID_DBX; } else if (FeCurrentState == FileExplorerStateEnrollSignatureFileToDbt) { FormId = SECUREBOOT_ENROLL_SIGNATURE_TO_DBT; FileFormId = FORM_FILE_EXPLORER_ID_DBT; } else { return; } NewMenuEntry = NULL; NewFileContext = NULL; RefreshUpdateData (); mStartLabel->Number = FORM_FILE_EXPLORER_ID; for (Index = 0; Index < MenuOption->MenuNumber; Index++) { NewMenuEntry = GetMenuEntry (MenuOption, Index); NewFileContext = (SECUREBOOT_FILE_CONTEXT *) NewMenuEntry->FileContext; if (NewFileContext->IsDir) { // // Create Text opcode for directory. // HiiCreateActionOpCode ( mStartOpCodeHandle, (UINT16) (FILE_OPTION_OFFSET + Index), NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL), EFI_IFR_FLAG_CALLBACK, 0 ); } else { // // Create Goto opcode for file. // HiiCreateGotoOpCode ( mStartOpCodeHandle, FormId, NewMenuEntry->DisplayStringToken, STRING_TOKEN (STR_NULL), EFI_IFR_FLAG_CALLBACK, (UINT16) (FILE_OPTION_GOTO_OFFSET + Index) ); } } HiiUpdateForm ( HiiHandle, &gSecureBootConfigFormSetGuid, FileFormId, mStartOpCodeHandle, // Label FORM_FILE_EXPLORER_ID mEndOpCodeHandle // LABEL_END ); }
/** This function processes changes in user profile configuration. @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. @param Action Specifies the type of action taken by the browser. @param QuestionId A unique value which is sent to the original exporting driver so that it can identify the type of data to expect. @param Type The type of value for the question. @param Value A pointer to the data being sent to the original exporting driver. @param ActionRequest On return, points to the action requested by the callback function. @retval EFI_SUCCESS The callback successfully handled the action. @retval Others Fail to handle the action. **/ EFI_STATUS EFIAPI UserProfileManagerCallback ( IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN EFI_BROWSER_ACTION Action, IN EFI_QUESTION_ID QuestionId, IN UINT8 Type, IN EFI_IFR_TYPE_VALUE *Value, OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest ) { EFI_STATUS Status; EFI_INPUT_KEY Key; UINT32 CurrentAccessRight; CHAR16 *QuestionStr; CHAR16 *PromptStr; VOID *StartOpCodeHandle; VOID *EndOpCodeHandle; EFI_IFR_GUID_LABEL *StartLabel; EFI_IFR_GUID_LABEL *EndLabel; EFI_USER_PROFILE_HANDLE CurrentUser; Status = EFI_SUCCESS; switch (Action) { case EFI_BROWSER_ACTION_FORM_OPEN: { // // Update user manage Form when user manage Form is opened. // This will be done only in FORM_OPEN CallBack of question with QUESTIONID_USER_MANAGE from user manage Form. // if (QuestionId != QUESTIONID_USER_MANAGE) { return EFI_SUCCESS; } // // Get current user // CurrentUser = NULL; mUserManager->Current (mUserManager, &CurrentUser); if (CurrentUser == NULL) { DEBUG ((DEBUG_ERROR, "Error: current user does not exist!\n")); return EFI_NOT_READY; } // // Get current user's right information. // Status = GetAccessRight (&CurrentAccessRight); if (EFI_ERROR (Status)) { CurrentAccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF; } // // Init credential provider information. // Status = InitProviderInfo (); if (EFI_ERROR (Status)) { return Status; } // // Initialize the container for dynamic opcodes. // StartOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (StartOpCodeHandle != NULL); EndOpCodeHandle = HiiAllocateOpCodeHandle (); ASSERT (EndOpCodeHandle != NULL); // // Create Hii Extend Label OpCode. // StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode ( StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL) ); StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; StartLabel->Number = LABEL_USER_MANAGE_FUNC; EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode ( EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL) ); EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; EndLabel->Number = LABEL_END; // // Add user profile option. // if ((CurrentAccessRight == EFI_USER_INFO_ACCESS_MANAGE) || (CurrentAccessRight == EFI_USER_INFO_ACCESS_ENROLL_OTHERS) ) { HiiCreateActionOpCode ( StartOpCodeHandle, // Container for dynamic created opcodes KEY_ADD_USER, // Question ID STRING_TOKEN (STR_ADD_USER_TITLE), // Prompt text STRING_TOKEN (STR_ADD_USER_HELP), // Help text EFI_IFR_FLAG_CALLBACK, // Question flag 0 // Action String ID ); } // // Add modify user profile option. // HiiCreateGotoOpCode ( StartOpCodeHandle, // Container for dynamic created opcodes FORMID_MODIFY_USER, // Target Form ID STRING_TOKEN (STR_MODIFY_USER_TITLE), // Prompt text STRING_TOKEN (STR_MODIFY_USER_HELP), // Help text EFI_IFR_FLAG_CALLBACK, // Question flag KEY_MODIFY_USER // Question ID ); // // Add delete user profile option // if (CurrentAccessRight == EFI_USER_INFO_ACCESS_MANAGE) { HiiCreateGotoOpCode ( StartOpCodeHandle, // Container for dynamic created opcodes FORMID_DEL_USER, // Target Form ID STRING_TOKEN (STR_DELETE_USER_TITLE), // Prompt text STRING_TOKEN (STR_DELETE_USER_HELP), // Help text EFI_IFR_FLAG_CALLBACK, // Question flag KEY_DEL_USER // Question ID ); } HiiUpdateForm ( mCallbackInfo->HiiHandle, // HII handle &gUserProfileManagerGuid, // Formset GUID FORMID_USER_MANAGE, // Form ID StartOpCodeHandle, // Label for where to insert opcodes EndOpCodeHandle // Replace data ); HiiFreeOpCodeHandle (StartOpCodeHandle); HiiFreeOpCodeHandle (EndOpCodeHandle); return EFI_SUCCESS; } break; case EFI_BROWSER_ACTION_FORM_CLOSE: Status = EFI_SUCCESS; break; case EFI_BROWSER_ACTION_CHANGED: { // // Handle the request from form. // if ((Value == NULL) || (ActionRequest == NULL)) { return EFI_INVALID_PARAMETER; } // // Judge first 2 bits. // switch (QuestionId & KEY_FIRST_FORM_MASK) { // // Add user profile operation. // case KEY_ADD_USER: CallAddUser (); break; // // Delete user profile operation. // case KEY_DEL_USER: // // Judge next 2 bits. // switch (QuestionId & KEY_SECOND_FORM_MASK) { // // Delete specified user profile. // case KEY_SELECT_USER: DeleteUser ((UINT8) QuestionId); // // Update select user form after delete a user. // SelectUserToDelete (); break; default: break; } break; // // Modify user profile operation. // case KEY_MODIFY_USER: // // Judge next 2 bits. // switch (QuestionId & KEY_SECOND_FORM_MASK) { // // Enter user profile information form. // case KEY_SELECT_USER: // // Judge next 3 bits. // switch (QuestionId & KEY_MODIFY_INFO_MASK) { // // Modify user name. // case KEY_MODIFY_NAME: ModifyUserName (); // // Update username in parent form. // SelectUserToModify (); break; // // Modify identity policy. // case KEY_MODIFY_IP: // // Judge next 3 bits // switch (QuestionId & KEY_MODIFY_IP_MASK) { // // Change credential provider option. // case KEY_MODIFY_PROV: mProviderChoice = Value->u8; break; // // Change logical connector. // case KEY_MODIFY_CONN: mConncetLogical = Value->u8; break; // // Save option. // case KEY_ADD_IP_OP: AddIdentityPolicyItem (); break; // // Return to user profile information form. // case KEY_IP_RETURN_UIF: SaveIdentityPolicy (); *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT; break; default: break; } break; // // Modify access policy. // case KEY_MODIFY_AP: // // Judge next 3 bits. // switch (QuestionId & KEY_MODIFY_AP_MASK) { // // Change access right choice. // case KEY_MODIFY_RIGHT: mAccessInfo.AccessRight = Value->u8; break; // // Change setup choice. // case KEY_MODIFY_SETUP: mAccessInfo.AccessSetup= Value->u8; break; // // Change boot order choice. // case KEY_MODIFY_BOOT: mAccessInfo.AccessBootOrder = Value->u32; break; // // Return to user profile information form. // case KEY_AP_RETURN_UIF: SaveAccessPolicy (); *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT; break; default: break; } break; default: break; } break; // // Access policy device path modified. // case KEY_MODIFY_AP_DP: // // Judge next 2 bits. // switch (QuestionId & KEY_MODIFY_DP_MASK) { // // Load permit device path modified. // case KEY_LOAD_PERMIT_MODIFY: QuestionStr = GetStringById (STRING_TOKEN (STR_MOVE_TO_FORBID_LIST)); PromptStr = GetStringById (STRING_TOKEN (STR_PRESS_KEY_CONTINUE)); CreatePopUp ( EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, QuestionStr, L"", PromptStr, NULL ); FreePool (QuestionStr); FreePool (PromptStr); if (Key.UnicodeChar != CHAR_CARRIAGE_RETURN) { break; } AddToForbidLoad ((UINT16)(QuestionId & (KEY_MODIFY_DP_MASK - 1))); DisplayLoadPermit (); break; // // Load forbid device path modified. // case KEY_LOAD_FORBID_MODIFY: QuestionStr = GetStringById (STRING_TOKEN (STR_MOVE_TO_PERMIT_LIST)); PromptStr = GetStringById (STRING_TOKEN (STR_PRESS_KEY_CONTINUE)); CreatePopUp ( EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, QuestionStr, L"", PromptStr, NULL ); FreePool (QuestionStr); FreePool (PromptStr); if (Key.UnicodeChar != CHAR_CARRIAGE_RETURN) { break; } DeleteFromForbidLoad ((UINT16)(QuestionId & (KEY_MODIFY_DP_MASK - 1))); DisplayLoadForbid (); break; // // Connect permit device path modified. // case KEY_CONNECT_PERMIT_MODIFY: break; // // Connect forbid device path modified. // case KEY_CONNECT_FORBID_MODIFY: break; default: break; } break; default: break; } break; default: break; } } break; case EFI_BROWSER_ACTION_CHANGING: { // // Handle the request from form. // if (Value == NULL) { return EFI_INVALID_PARAMETER; } // // Judge first 2 bits. // switch (QuestionId & KEY_FIRST_FORM_MASK) { // // Delete user profile operation. // case KEY_DEL_USER: // // Judge next 2 bits. // switch (QuestionId & KEY_SECOND_FORM_MASK) { // // Enter delete user profile form. // case KEY_ENTER_NEXT_FORM: SelectUserToDelete (); break; default: break; } break; // // Modify user profile operation. // case KEY_MODIFY_USER: // // Judge next 2 bits. // switch (QuestionId & KEY_SECOND_FORM_MASK) { // // Enter modify user profile form. // case KEY_ENTER_NEXT_FORM: SelectUserToModify (); break; // // Enter user profile information form. // case KEY_SELECT_USER: // // Judge next 3 bits. // switch (QuestionId & KEY_MODIFY_INFO_MASK) { // // Display user information form. // case KEY_ENTER_NEXT_FORM: ModifyUserInfo ((UINT8) QuestionId); break; // // Modify identity policy. // case KEY_MODIFY_IP: // // Judge next 3 bits // switch (QuestionId & KEY_MODIFY_IP_MASK) { // // Display identity policy modify form. // case KEY_ENTER_NEXT_FORM: ModifyIdentityPolicy (); break; default: break; } break; // // Modify access policy. // case KEY_MODIFY_AP: // // Judge next 3 bits. // switch (QuestionId & KEY_MODIFY_AP_MASK) { // // Display access policy modify form. // case KEY_ENTER_NEXT_FORM: ModidyAccessPolicy (); break; // // Load device path form. // case KEY_MODIFY_LOAD: // // Judge next 2 bits. // switch (QuestionId & KEY_DISPLAY_DP_MASK) { // // Permit load device path. // case KEY_PERMIT_MODIFY: DisplayLoadPermit (); break; // // Forbid load device path. // case KEY_FORBID_MODIFY: DisplayLoadForbid (); break; default: break; } break; // // Connect device path form. // case KEY_MODIFY_CONNECT: // // Judge next 2 bits. // switch (QuestionId & KEY_DISPLAY_DP_MASK) { // // Permit connect device path. // case KEY_PERMIT_MODIFY: DisplayConnectPermit (); break; // // Forbid connect device path. // case KEY_FORBID_MODIFY: DisplayConnectForbid (); break; default: break; } break; default: break; } break; default: break; } break; default: break; } break; default: break; } } break; default: // // All other action return unsupported. // Status = EFI_UNSUPPORTED; break; } return Status; }