BOOLEAN UpdateFileExplorer ( IN BMM_CALLBACK_DATA *CallbackData, IN UINT16 KeyValue ) /*++ Routine Description: Update the file explower page with the refershed file system. Arguments: CallbackData - BMM context data KeyValue - Key value to identify the type of data to expect. Returns: TRUE - Inform the caller to create a callback packet to exit file explorer. FALSE - Indicate that there is no need to exit file explorer. --*/ { UINT16 FileOptionMask; BM_MENU_ENTRY *NewMenuEntry; BM_FILE_CONTEXT *NewFileContext; FORM_ID FormId; BOOLEAN ExitFileExplorer; EFI_STATUS Status; NewMenuEntry = NULL; NewFileContext = NULL; ExitFileExplorer = FALSE; FileOptionMask = (UINT16) (FILE_OPTION_MASK & KeyValue); if (UNKNOWN_CONTEXT == CallbackData->FeDisplayContext) { // // First in, display file system. // BOpt_FreeMenu (&FsOptionMenu); BOpt_FindFileSystem (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &FsOptionMenu); UpdateFileExplorePage (CallbackData, &FsOptionMenu); CallbackData->FeDisplayContext = FILE_SYSTEM; } else { if (FILE_SYSTEM == CallbackData->FeDisplayContext) { NewMenuEntry = BOpt_GetMenuEntry (&FsOptionMenu, FileOptionMask); } else if (DIRECTORY == CallbackData->FeDisplayContext) { NewMenuEntry = BOpt_GetMenuEntry (&DirectoryMenu, FileOptionMask); } NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext; if (NewFileContext->IsDir ) { CallbackData->FeDisplayContext = DIRECTORY; RemoveEntryList (&NewMenuEntry->Link); BOpt_FreeMenu (&DirectoryMenu); Status = BOpt_FindFiles (CallbackData, NewMenuEntry); if (EFI_ERROR (Status)) { ExitFileExplorer = TRUE; goto exit; } CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &DirectoryMenu); BOpt_DestroyMenuEntry (NewMenuEntry); UpdateFileExplorePage (CallbackData, &DirectoryMenu); } else { switch (CallbackData->FeCurrentState) { case BOOT_FROM_FILE_STATE: // // Here boot from file // BootThisFile (NewFileContext); ExitFileExplorer = TRUE; break; case ADD_BOOT_OPTION_STATE: case ADD_DRIVER_OPTION_STATE: if (ADD_BOOT_OPTION_STATE == CallbackData->FeCurrentState) { FormId = FORM_BOOT_ADD_DESCRIPTION_ID; } else { FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID; } CallbackData->MenuEntry = NewMenuEntry; CallbackData->LoadContext->FilePathList = ((BM_FILE_CONTEXT *) (CallbackData->MenuEntry->VariableContext))->DevicePath; // // Clean up file explore page. // RefreshUpdateData (FALSE, 0, FALSE, 0, 1); // // Remove the Subtitle op-code. // CallbackData->Hii->UpdateForm ( CallbackData->Hii, CallbackData->FeHiiHandle, FormId, FALSE, UpdateData ); // // Create Subtitle op-code for the display string of the option. // RefreshUpdateData (TRUE, (EFI_PHYSICAL_ADDRESS) (UINTN) CallbackData->FeCallbackHandle, FALSE, 0, 1); CreateSubTitleOpCode ( NewMenuEntry->DisplayStringToken, &UpdateData->Data ); CallbackData->Hii->UpdateForm ( CallbackData->Hii, CallbackData->FeHiiHandle, FormId, TRUE, UpdateData ); break; default: break; } } } exit: return ExitFileExplorer; }
/** Update the file explower page with the refershed file system. @param CallbackData BMM context data @param KeyValue Key value to identify the type of data to expect. @retval TRUE Inform the caller to create a callback packet to exit file explorer. @retval FALSE Indicate that there is no need to exit file explorer. **/ BOOLEAN UpdateFileExplorer ( IN BMM_CALLBACK_DATA *CallbackData, IN UINT16 KeyValue ) { UINT16 FileOptionMask; BM_MENU_ENTRY *NewMenuEntry; BM_FILE_CONTEXT *NewFileContext; EFI_FORM_ID FormId; BOOLEAN ExitFileExplorer; EFI_STATUS Status; NewMenuEntry = NULL; NewFileContext = NULL; ExitFileExplorer = FALSE; FileOptionMask = (UINT16) (FILE_OPTION_MASK & KeyValue); if (FileExplorerDisplayUnknown == CallbackData->FeDisplayContext) { // // First in, display file system. // BOpt_FreeMenu (&FsOptionMenu); BOpt_FindFileSystem (CallbackData); CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &FsOptionMenu); UpdateFileExplorePage (CallbackData, &FsOptionMenu); CallbackData->FeDisplayContext = FileExplorerDisplayFileSystem; } else { if (FileExplorerDisplayFileSystem == CallbackData->FeDisplayContext) { NewMenuEntry = BOpt_GetMenuEntry (&FsOptionMenu, FileOptionMask); } else if (FileExplorerDisplayDirectory == CallbackData->FeDisplayContext) { NewMenuEntry = BOpt_GetMenuEntry (&DirectoryMenu, FileOptionMask); } NewFileContext = (BM_FILE_CONTEXT *) NewMenuEntry->VariableContext; if (NewFileContext->IsDir ) { CallbackData->FeDisplayContext = FileExplorerDisplayDirectory; RemoveEntryList (&NewMenuEntry->Link); BOpt_FreeMenu (&DirectoryMenu); Status = BOpt_FindFiles (CallbackData, NewMenuEntry); if (EFI_ERROR (Status)) { ExitFileExplorer = TRUE; goto exit; } CreateMenuStringToken (CallbackData, CallbackData->FeHiiHandle, &DirectoryMenu); BOpt_DestroyMenuEntry (NewMenuEntry); UpdateFileExplorePage (CallbackData, &DirectoryMenu); } else { switch (CallbackData->FeCurrentState) { case FileExplorerStateBootFromFile: // // Here boot from file // BootThisFile (NewFileContext); ExitFileExplorer = TRUE; break; case FileExplorerStateAddBootOption: case FileExplorerStateAddDriverOptionState: if (FileExplorerStateAddBootOption == CallbackData->FeCurrentState) { FormId = FORM_BOOT_ADD_DESCRIPTION_ID; } else { FormId = FORM_DRIVER_ADD_FILE_DESCRIPTION_ID; } CallbackData->MenuEntry = NewMenuEntry; CallbackData->LoadContext->FilePathList = ((BM_FILE_CONTEXT *) (CallbackData->MenuEntry->VariableContext))->DevicePath; // // Create Subtitle op-code for the display string of the option. // RefreshUpdateData (); mStartLabel->Number = FormId; HiiCreateSubTitleOpCode ( mStartOpCodeHandle, NewMenuEntry->DisplayStringToken, 0, 0, 0 ); HiiUpdateForm ( CallbackData->FeHiiHandle, &mFileExplorerGuid, FormId, mStartOpCodeHandle, // Label FormId mEndOpCodeHandle // LABEL_END ); break; default: break; } } } exit: return ExitFileExplorer; }
/** Update the file explorer page with the refreshed file system. @param[in] PrivateData Module private data. @param[in] KeyValue Key value to identify the type of data to expect. @retval TRUE Inform the caller to create a callback packet to exit file explorer. @retval FALSE Indicate that there is no need to exit file explorer. **/ BOOLEAN UpdateFileExplorer ( IN SECUREBOOT_CONFIG_PRIVATE_DATA *PrivateData, IN UINT16 KeyValue ) { UINT16 FileOptionMask; SECUREBOOT_MENU_ENTRY *NewMenuEntry; SECUREBOOT_FILE_CONTEXT *NewFileContext; EFI_FORM_ID FormId; BOOLEAN ExitFileExplorer; EFI_STATUS Status; EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath; NewMenuEntry = NULL; NewFileContext = NULL; ExitFileExplorer = FALSE; FileOptionMask = (UINT16) (FILE_OPTION_MASK & KeyValue); if (PrivateData->FeDisplayContext == FileExplorerDisplayUnknown) { // // First in, display file system. // FreeMenu (&FsOptionMenu); FindFileSystem (); CreateMenuStringToken (PrivateData->HiiHandle, &FsOptionMenu); UpdateFileExplorePage (PrivateData->HiiHandle, &FsOptionMenu, PrivateData->FeCurrentState); PrivateData->FeDisplayContext = FileExplorerDisplayFileSystem; } else { if (PrivateData->FeDisplayContext == FileExplorerDisplayFileSystem) { NewMenuEntry = GetMenuEntry (&FsOptionMenu, FileOptionMask); } else if (PrivateData->FeDisplayContext == FileExplorerDisplayDirectory) { NewMenuEntry = GetMenuEntry (&DirectoryMenu, FileOptionMask); } NewFileContext = (SECUREBOOT_FILE_CONTEXT *) NewMenuEntry->FileContext; if (NewFileContext->IsDir ) { PrivateData->FeDisplayContext = FileExplorerDisplayDirectory; RemoveEntryList (&NewMenuEntry->Link); FreeMenu (&DirectoryMenu); Status = FindFiles (NewMenuEntry); if (EFI_ERROR (Status)) { ExitFileExplorer = TRUE; goto OnExit; } CreateMenuStringToken (PrivateData->HiiHandle, &DirectoryMenu); DestroyMenuEntry (NewMenuEntry); UpdateFileExplorePage (PrivateData->HiiHandle, &DirectoryMenu, PrivateData->FeCurrentState); } else { if (PrivateData->FeCurrentState == FileExplorerStateEnrollPkFile) { FormId = SECUREBOOT_ADD_PK_FILE_FORM_ID; } else if (PrivateData->FeCurrentState == FileExplorerStateEnrollKekFile) { FormId = FORMID_ENROLL_KEK_FORM; } else if (PrivateData->FeCurrentState == FileExplorerStateEnrollSignatureFileToDb) { FormId = SECUREBOOT_ENROLL_SIGNATURE_TO_DB; } else if (PrivateData->FeCurrentState == FileExplorerStateEnrollSignatureFileToDbx) { FormId = SECUREBOOT_ENROLL_SIGNATURE_TO_DBX; } else if (PrivateData->FeCurrentState == FileExplorerStateEnrollSignatureFileToDbt) { FormId = SECUREBOOT_ENROLL_SIGNATURE_TO_DBT; } else { return FALSE; } PrivateData->MenuEntry = NewMenuEntry; PrivateData->FileContext->FileName = NewFileContext->FileName; TmpDevicePath = NewFileContext->DevicePath; OpenFileByDevicePath ( &TmpDevicePath, &PrivateData->FileContext->FHandle, EFI_FILE_MODE_READ, 0 ); // // Create Subtitle op-code for the display string of the option. // RefreshUpdateData (); mStartLabel->Number = FormId; HiiCreateSubTitleOpCode ( mStartOpCodeHandle, NewMenuEntry->DisplayStringToken, 0, 0, 0 ); HiiUpdateForm ( PrivateData->HiiHandle, &gSecureBootConfigFormSetGuid, FormId, mStartOpCodeHandle, // Label FormId mEndOpCodeHandle // LABEL_END ); } } OnExit: return ExitFileExplorer; }