14af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** @file 24af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Provide boot option support for Application "BootMaint" 34af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 44af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Include file system navigation, system handle selection 54af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 64af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Boot option manipulation 74af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 84af04335ac9aeb1802b995b102117b6f9de46809Dandan BiCopyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR> 94af04335ac9aeb1802b995b102117b6f9de46809Dandan BiThis program and the accompanying materials 104af04335ac9aeb1802b995b102117b6f9de46809Dandan Biare licensed and made available under the terms and conditions of the BSD License 114af04335ac9aeb1802b995b102117b6f9de46809Dandan Biwhich accompanies this distribution. The full text of the license may be found at 124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bihttp://opensource.org/licenses/bsd-license.php 134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 144af04335ac9aeb1802b995b102117b6f9de46809Dandan BiTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 154af04335ac9aeb1802b995b102117b6f9de46809Dandan BiWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi#include "BootMaintenanceManager.h" 204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/// 224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/// Define the maximum characters that will be accepted. 234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/// 244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi#define MAX_CHAR 480 254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Create a menu entry by given menu type. 284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param MenuType The Menu type to be created. 304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @retval NULL If failed to create the menu. 324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @return the new menu entry. 334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 354af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBM_MENU_ENTRY * 364af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_CreateMenuEntry ( 374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN MenuType 384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_ENTRY *MenuEntry; 414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN ContextSize; 424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Get context size according to menu type 454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi switch (MenuType) { 474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi case BM_LOAD_CONTEXT_SELECT: 484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ContextSize = sizeof (BM_LOAD_CONTEXT); 494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi case BM_FILE_CONTEXT_SELECT: 524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ContextSize = sizeof (BM_FILE_CONTEXT); 534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi case BM_CONSOLE_CONTEXT_SELECT: 564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ContextSize = sizeof (BM_CONSOLE_CONTEXT); 574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi case BM_TERMINAL_CONTEXT_SELECT: 604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ContextSize = sizeof (BM_TERMINAL_CONTEXT); 614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi case BM_HANDLE_CONTEXT_SELECT: 644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ContextSize = sizeof (BM_HANDLE_CONTEXT); 654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi default: 684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ContextSize = 0; 694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (ContextSize == 0) { 734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return NULL; 744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Create new menu entry 784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi MenuEntry = AllocateZeroPool (sizeof (BM_MENU_ENTRY)); 804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (MenuEntry == NULL) { 814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return NULL; 824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi MenuEntry->VariableContext = AllocateZeroPool (ContextSize); 854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (MenuEntry->VariableContext == NULL) { 864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (MenuEntry); 874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return NULL; 884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi MenuEntry->Signature = BM_MENU_ENTRY_SIGNATURE; 914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi MenuEntry->ContextSelection = MenuType; 924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return MenuEntry; 934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Free up all resource allocated for a BM_MENU_ENTRY. 974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param MenuEntry A pointer to BM_MENU_ENTRY. 994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 1014af04335ac9aeb1802b995b102117b6f9de46809Dandan BiVOID 1024af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_DestroyMenuEntry ( 1034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_ENTRY *MenuEntry 1044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 1054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 1064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_LOAD_CONTEXT *LoadContext; 1074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_FILE_CONTEXT *FileContext; 1084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_CONSOLE_CONTEXT *ConsoleContext; 1094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_TERMINAL_CONTEXT *TerminalContext; 1104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_HANDLE_CONTEXT *HandleContext; 1114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 1134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Select by the type in Menu entry for current context type 1144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 1154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi switch (MenuEntry->ContextSelection) { 1164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi case BM_LOAD_CONTEXT_SELECT: 1174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadContext = (BM_LOAD_CONTEXT *) MenuEntry->VariableContext; 1184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (LoadContext->FilePathList); 1194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (LoadContext->LoadOption); 1204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (LoadContext->OptionalData != NULL) { 1214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (LoadContext->OptionalData); 1224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 1234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (LoadContext); 1244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 1254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi case BM_FILE_CONTEXT_SELECT: 1274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FileContext = (BM_FILE_CONTEXT *) MenuEntry->VariableContext; 1284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (!FileContext->IsRoot) { 1304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (FileContext->DevicePath); 1314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } else { 1324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (FileContext->FHandle != NULL) { 1334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FileContext->FHandle->Close (FileContext->FHandle); 1344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 1354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 1364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (FileContext->FileName != NULL) { 1384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (FileContext->FileName); 1394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 1404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (FileContext->Info != NULL) { 1414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (FileContext->Info); 1424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 1434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (FileContext); 1444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 1454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi case BM_CONSOLE_CONTEXT_SELECT: 1474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ConsoleContext = (BM_CONSOLE_CONTEXT *) MenuEntry->VariableContext; 1484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (ConsoleContext->DevicePath); 1494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (ConsoleContext); 1504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 1514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi case BM_TERMINAL_CONTEXT_SELECT: 1534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi TerminalContext = (BM_TERMINAL_CONTEXT *) MenuEntry->VariableContext; 1544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (TerminalContext->DevicePath); 1554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (TerminalContext); 1564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 1574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi case BM_HANDLE_CONTEXT_SELECT: 1594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi HandleContext = (BM_HANDLE_CONTEXT *) MenuEntry->VariableContext; 1604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (HandleContext); 1614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 1624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi default: 1644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 1654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 1664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (MenuEntry->DisplayString); 1684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (MenuEntry->HelpString != NULL) { 1694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (MenuEntry->HelpString); 1704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 1714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (MenuEntry); 1734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 1744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 1764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Get the Menu Entry from the list in Menu Entry List. 1774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi If MenuNumber is great or equal to the number of Menu 1794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Entry in the list, then ASSERT. 1804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param MenuOption The Menu Entry List to read the menu entry. 1824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param MenuNumber The index of Menu Entry. 1834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @return The Menu Entry. 1854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 1874af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBM_MENU_ENTRY * 1884af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_GetMenuEntry ( 1894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_OPTION *MenuOption, 1904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN MenuNumber 1914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 1924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 1934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_ENTRY *NewMenuEntry; 1944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN Index; 1954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LIST_ENTRY *List; 1964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ASSERT (MenuNumber < MenuOption->MenuNumber); 1984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi List = MenuOption->Head.ForwardLink; 2004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi for (Index = 0; Index < MenuNumber; Index++) { 2014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi List = List->ForwardLink; 2024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 2034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 2044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry = CR (List, BM_MENU_ENTRY, Link, BM_MENU_ENTRY_SIGNATURE); 2054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 2064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return NewMenuEntry; 2074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 2084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 2094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 2104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Free resources allocated in Allocate Rountine. 2114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 2124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param FreeMenu Menu to be freed 2134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 2144af04335ac9aeb1802b995b102117b6f9de46809Dandan BiVOID 2154af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_FreeMenu ( 2164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_OPTION *FreeMenu 2174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 2184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 2194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_ENTRY *MenuEntry; 2204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi while (!IsListEmpty (&FreeMenu->Head)) { 2214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi MenuEntry = CR ( 2224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreeMenu->Head.ForwardLink, 2234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_ENTRY, 2244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Link, 2254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_ENTRY_SIGNATURE 2264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ); 2274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi RemoveEntryList (&MenuEntry->Link); 2284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BOpt_DestroyMenuEntry (MenuEntry); 2294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 2304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreeMenu->MenuNumber = 0; 2314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 2324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 2334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 2344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 2354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Build the BootOptionMenu according to BootOrder Variable. 2364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi This Routine will access the Boot#### to get EFI_LOAD_OPTION. 2374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 2384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param CallbackData The BMM context data. 2394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 2404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @return EFI_NOT_FOUND Fail to find "BootOrder" variable. 2414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @return EFI_SUCESS Success build boot option menu. 2424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 2434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 2444af04335ac9aeb1802b995b102117b6f9de46809Dandan BiEFI_STATUS 2454af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_GetBootOptions ( 2464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi IN BMM_CALLBACK_DATA *CallbackData 2474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 2484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 2494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN Index; 2504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT16 BootString[10]; 2514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT8 *LoadOptionFromVar; 2524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT8 *LoadOption; 2534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN BootOptionSize; 2544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BOOLEAN BootNextFlag; 2554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT16 *BootOrderList; 2564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN BootOrderListSize; 2574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT16 *BootNext; 2584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN BootNextSize; 2594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_ENTRY *NewMenuEntry; 2604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_LOAD_CONTEXT *NewLoadContext; 2614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT8 *LoadOptionPtr; 2624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN StringSize; 2634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN OptionalDataSize; 2644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT8 *LoadOptionEnd; 2654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi EFI_DEVICE_PATH_PROTOCOL *DevicePath; 2664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN MenuCount; 2674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT8 *Ptr; 2684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi EFI_BOOT_MANAGER_LOAD_OPTION *BootOption; 2694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN BootOptionCount; 2704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 2714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi MenuCount = 0; 2724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BootOrderListSize = 0; 2734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BootNextSize = 0; 2744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BootOrderList = NULL; 2754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BootNext = NULL; 2764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionFromVar = NULL; 2774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BOpt_FreeMenu (&BootOptionMenu); 2784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi InitializeListHead (&BootOptionMenu.Head); 2794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 2804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 2814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Get the BootOrder from the Var 2824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 2834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi GetEfiGlobalVariable2 (L"BootOrder", (VOID **) &BootOrderList, &BootOrderListSize); 2844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (BootOrderList == NULL) { 2854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return EFI_NOT_FOUND; 2864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 2874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 2884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 2894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Get the BootNext from the Var 2904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 2914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi GetEfiGlobalVariable2 (L"BootNext", (VOID **) &BootNext, &BootNextSize); 2924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (BootNext != NULL) { 2934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (BootNextSize != sizeof (UINT16)) { 2944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (BootNext); 2954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BootNext = NULL; 2964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 2974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 2984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BootOption = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot); 2994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi for (Index = 0; Index < BootOrderListSize / sizeof (UINT16); Index++) { 3004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Don't display the hidden/inactive boot option 3024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (((BootOption[Index].Attributes & LOAD_OPTION_HIDDEN) != 0) || ((BootOption[Index].Attributes & LOAD_OPTION_ACTIVE) == 0)) { 3044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi continue; 3054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 3064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", BootOrderList[Index]); 3084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Get all loadoptions from the VAR 3104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi GetEfiGlobalVariable2 (BootString, (VOID **) &LoadOptionFromVar, &BootOptionSize); 3124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (LoadOptionFromVar == NULL) { 3134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi continue; 3144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 3154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOption = AllocateZeroPool (BootOptionSize); 3174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (LoadOption == NULL) { 3184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi continue; 3194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 3204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CopyMem (LoadOption, LoadOptionFromVar, BootOptionSize); 3224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (LoadOptionFromVar); 3234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (BootNext != NULL) { 3254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BootNextFlag = (BOOLEAN) (*BootNext == BootOrderList[Index]); 3264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } else { 3274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BootNextFlag = FALSE; 3284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 3294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT); 3314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ASSERT (NULL != NewMenuEntry); 3324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; 3344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionPtr = LoadOption; 3364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionEnd = LoadOption + BootOptionSize; 3374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->OptionNumber = BootOrderList[Index]; 3394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->LoadOptionModified = FALSE; 3404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->Deleted = FALSE; 3414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->IsBootNext = BootNextFlag; 3424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Is a Legacy Device? 3454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Ptr = (UINT8 *) LoadOption; 3474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Attribute = *(UINT32 *)Ptr; 3504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Ptr += sizeof (UINT32); 3524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // FilePathSize = *(UINT16 *)Ptr; 3554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Ptr += sizeof (UINT16); 3574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Description = (CHAR16 *)Ptr; 3604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Ptr += StrSize ((CHAR16 *) Ptr); 3624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Now Ptr point to Device Path 3654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Ptr; 3674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if ((BBS_DEVICE_PATH == DevicePath->Type) && (BBS_BBS_DP == DevicePath->SubType)) { 3684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->IsLegacy = TRUE; 3694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } else { 3704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->IsLegacy = FALSE; 3714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 3724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // LoadOption is a pointer type of UINT8 3744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // for easy use with following LOAD_OPTION 3754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // embedded in this struct 3764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 3774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->LoadOption = LoadOption; 3784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->LoadOptionSize = BootOptionSize; 3794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->Attributes = *(UINT32 *) LoadOptionPtr; 3814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->IsActive = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE); 3824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT); 3844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionPtr += sizeof (UINT32); 3864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr; 3884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionPtr += sizeof (UINT16); 3894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi StringSize = StrSize((UINT16*)LoadOptionPtr); 3914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->Description = AllocateZeroPool (StrSize((UINT16*)LoadOptionPtr)); 3934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ASSERT (NewLoadContext->Description != NULL); 3944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi StrCpyS (NewLoadContext->Description, StrSize((UINT16*)LoadOptionPtr) / sizeof (UINT16), (UINT16*)LoadOptionPtr); 3954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 3964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ASSERT (NewLoadContext->Description != NULL); 3974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->DisplayString = NewLoadContext->Description; 3984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL); 3994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionPtr += StringSize; 4014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength); 4034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ASSERT (NewLoadContext->FilePathList != NULL); 4044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CopyMem ( 4054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->FilePathList, 4064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr, 4074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->FilePathListLength 4084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ); 4094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList); 4114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL); 4124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionPtr += NewLoadContext->FilePathListLength; 4144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (LoadOptionPtr < LoadOptionEnd) { 4164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi OptionalDataSize = BootOptionSize - 4174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi sizeof (UINT32) - 4184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi sizeof (UINT16) - 4194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi StringSize - 4204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->FilePathListLength; 4214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize); 4234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ASSERT (NewLoadContext->OptionalData != NULL); 4244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CopyMem ( 4254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->OptionalData, 4264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionPtr, 4274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi OptionalDataSize 4284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ); 4294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->OptionalDataSize = OptionalDataSize; 4314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 4324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link); 4344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi MenuCount++; 4354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 4364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount); 4374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (BootNext != NULL) { 4394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (BootNext); 4404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 4414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (BootOrderList != NULL) { 4424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (BootOrderList); 4434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 4444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BootOptionMenu.MenuNumber = MenuCount; 4454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return EFI_SUCCESS; 4464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 4474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 4494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Find drivers that will be added as Driver#### variables from handles 4514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi in current system environment 4524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi All valid handles in the system except those consume SimpleFs, LoadFile 4534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi are stored in DriverMenu for future use. 4544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @retval EFI_SUCCESS The function complets successfully. 4564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @return Other value if failed to build the DriverMenu. 4574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 4594af04335ac9aeb1802b995b102117b6f9de46809Dandan BiEFI_STATUS 4604af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_FindDrivers ( 4614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi VOID 4624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 4634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 4644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN NoDevicePathHandles; 4654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi EFI_HANDLE *DevicePathHandle; 4664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN Index; 4674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi EFI_STATUS Status; 4684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_ENTRY *NewMenuEntry; 4694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_HANDLE_CONTEXT *NewHandleContext; 4704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi EFI_HANDLE CurHandle; 4714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN OptionNumber; 4724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs; 4734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi EFI_LOAD_FILE_PROTOCOL *LoadFile; 4744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi SimpleFs = NULL; 4764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadFile = NULL; 4774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi InitializeListHead (&DriverMenu.Head); 4794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 4814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // At first, get all handles that support Device Path 4824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // protocol which is the basic requirement for 4834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Driver#### 4844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 4854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Status = gBS->LocateHandleBuffer ( 4864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ByProtocol, 4874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi &gEfiDevicePathProtocolGuid, 4884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NULL, 4894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi &NoDevicePathHandles, 4904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi &DevicePathHandle 4914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ); 4924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (EFI_ERROR (Status)) { 4934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return Status; 4944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 4954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 4964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi OptionNumber = 0; 4974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi for (Index = 0; Index < NoDevicePathHandles; Index++) { 4984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CurHandle = DevicePathHandle[Index]; 4994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Status = gBS->HandleProtocol ( 5014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CurHandle, 5024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi &gEfiSimpleFileSystemProtocolGuid, 5034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi (VOID **) &SimpleFs 5044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ); 5054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (Status == EFI_SUCCESS) { 5064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi continue; 5074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 5084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Status = gBS->HandleProtocol ( 5104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CurHandle, 5114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi &gEfiLoadFileProtocolGuid, 5124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi (VOID **) &LoadFile 5134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ); 5144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (Status == EFI_SUCCESS) { 5154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi continue; 5164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 5174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry = BOpt_CreateMenuEntry (BM_HANDLE_CONTEXT_SELECT); 5194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (NULL == NewMenuEntry) { 5204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (DevicePathHandle); 5214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return EFI_OUT_OF_RESOURCES; 5224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 5234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewHandleContext = (BM_HANDLE_CONTEXT *) NewMenuEntry->VariableContext; 5254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewHandleContext->Handle = CurHandle; 5264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewHandleContext->DevicePath = DevicePathFromHandle (CurHandle); 5274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->DisplayString = UiDevicePathToStr (NewHandleContext->DevicePath); 5284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->DisplayStringToken = HiiSetString (mBmmCallbackInfo->BmmHiiHandle,0,NewMenuEntry->DisplayString,NULL); 5294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->HelpString = NULL; 5304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken; 5314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->OptionNumber = OptionNumber; 5324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi OptionNumber++; 5334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi InsertTailList (&DriverMenu.Head, &NewMenuEntry->Link); 5344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 5364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (DevicePathHandle != NULL) { 5384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (DevicePathHandle); 5394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 5404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DriverMenu.MenuNumber = OptionNumber; 5424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return EFI_SUCCESS; 5434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 5444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 5464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Get the Option Number that has not been allocated for use. 5484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param Type The type of Option. 5504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @return The available Option Number. 5524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 5544af04335ac9aeb1802b995b102117b6f9de46809Dandan BiUINT16 5554af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_GetOptionNumber ( 5564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CHAR16 *Type 5574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 5584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 5594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT16 *OrderList; 5604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN OrderListSize; 5614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN Index; 5624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CHAR16 StrTemp[20]; 5634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT16 *OptionBuffer; 5644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT16 OptionNumber; 5654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN OptionSize; 5664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi OrderListSize = 0; 5684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi OrderList = NULL; 5694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi OptionNumber = 0; 5704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Index = 0; 5714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%sOrder", Type); 5734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi GetEfiGlobalVariable2 (StrTemp, (VOID **) &OrderList, &OrderListSize); 5754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi for (OptionNumber = 0; ; OptionNumber++) { 5764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (OrderList != NULL) { 5774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi for (Index = 0; Index < OrderListSize / sizeof (UINT16); Index++) { 5784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (OptionNumber == OrderList[Index]) { 5794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 5804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 5814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 5824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 5834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 5844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (Index < OrderListSize / sizeof (UINT16)) { 5854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 5864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // The OptionNumber occurs in the OrderList, continue to use next one 5874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 5884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi continue; 5894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 5904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UnicodeSPrint (StrTemp, sizeof (StrTemp), L"%s%04x", Type, (UINTN) OptionNumber); 5914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DEBUG((EFI_D_ERROR,"Option = %s\n", StrTemp)); 5924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi GetEfiGlobalVariable2 (StrTemp, (VOID **) &OptionBuffer, &OptionSize); 5934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (NULL == OptionBuffer) { 5944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 5954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // The Boot[OptionNumber] / Driver[OptionNumber] NOT occurs, we found it 5964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 5974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi break; 5984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 5994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 6004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return OptionNumber; 6024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 6034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 6054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Get the Option Number for Boot#### that does not used. 6074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @return The available Option Number. 6094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 6114af04335ac9aeb1802b995b102117b6f9de46809Dandan BiUINT16 6124af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_GetBootOptionNumber ( 6134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi VOID 6144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 6154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 6164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return BOpt_GetOptionNumber (L"Boot"); 6174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 6184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 6204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Get the Option Number for Driver#### that does not used. 6224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @return The unused Option Number. 6244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 6264af04335ac9aeb1802b995b102117b6f9de46809Dandan BiUINT16 6274af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_GetDriverOptionNumber ( 6284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi VOID 6294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 6304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 6314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return BOpt_GetOptionNumber (L"Driver"); 6324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 6334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 6354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Build up all DriverOptionMenu 6374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param CallbackData The BMM context data. 6394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @retval EFI_SUCESS The functin completes successfully. 6414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation. 6424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @retval EFI_NOT_FOUND Fail to get "DriverOrder" variable. 6434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 6454af04335ac9aeb1802b995b102117b6f9de46809Dandan BiEFI_STATUS 6464af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOpt_GetDriverOptions ( 6474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi IN BMM_CALLBACK_DATA *CallbackData 6484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 6494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 6504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN Index; 6514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT16 DriverString[12]; 6524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT8 *LoadOptionFromVar; 6534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT8 *LoadOption; 6544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN DriverOptionSize; 6554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT16 *DriverOrderList; 6574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN DriverOrderListSize; 6584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_ENTRY *NewMenuEntry; 6594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_LOAD_CONTEXT *NewLoadContext; 6604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT8 *LoadOptionPtr; 6614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN StringSize; 6624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN OptionalDataSize; 6634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT8 *LoadOptionEnd; 6644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DriverOrderListSize = 0; 6664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DriverOrderList = NULL; 6674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DriverOptionSize = 0; 6684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionFromVar = NULL; 6694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BOpt_FreeMenu (&DriverOptionMenu); 6704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi InitializeListHead (&DriverOptionMenu.Head); 6714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 6724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Get the DriverOrder from the Var 6734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 6744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi GetEfiGlobalVariable2 (L"DriverOrder", (VOID **) &DriverOrderList, &DriverOrderListSize); 6754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (DriverOrderList == NULL) { 6764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return EFI_NOT_FOUND; 6774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 6784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi for (Index = 0; Index < DriverOrderListSize / sizeof (UINT16); Index++) { 6804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UnicodeSPrint ( 6814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DriverString, 6824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi sizeof (DriverString), 6834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi L"Driver%04x", 6844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DriverOrderList[Index] 6854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ); 6864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 6874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Get all loadoptions from the VAR 6884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 6894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi GetEfiGlobalVariable2 (DriverString, (VOID **) &LoadOptionFromVar, &DriverOptionSize); 6904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (LoadOptionFromVar == NULL) { 6914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi continue; 6924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 6934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOption = AllocateZeroPool (DriverOptionSize); 6954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (LoadOption == NULL) { 6964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi continue; 6974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 6984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 6994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CopyMem (LoadOption, LoadOptionFromVar, DriverOptionSize); 7004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (LoadOptionFromVar); 7014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT); 7034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (NULL == NewMenuEntry) { 7044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return EFI_OUT_OF_RESOURCES; 7054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 7064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; 7084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionPtr = LoadOption; 7094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionEnd = LoadOption + DriverOptionSize; 7104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->OptionNumber = DriverOrderList[Index]; 7114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->LoadOptionModified = FALSE; 7124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->Deleted = FALSE; 7134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->IsLegacy = FALSE; 7144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 7164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // LoadOption is a pointer type of UINT8 7174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // for easy use with following LOAD_OPTION 7184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // embedded in this struct 7194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 7204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->LoadOption = LoadOption; 7214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->LoadOptionSize = DriverOptionSize; 7224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->Attributes = *(UINT32 *) LoadOptionPtr; 7244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->IsActive = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_ACTIVE); 7254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT); 7274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionPtr += sizeof (UINT32); 7294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->FilePathListLength = *(UINT16 *) LoadOptionPtr; 7314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionPtr += sizeof (UINT16); 7324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi StringSize = StrSize ((UINT16 *) LoadOptionPtr); 7344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->Description = AllocateZeroPool (StringSize); 7354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ASSERT (NewLoadContext->Description != NULL); 7364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CopyMem ( 7374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->Description, 7384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi (UINT16 *) LoadOptionPtr, 7394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi StringSize 7404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ); 7414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->DisplayString = NewLoadContext->Description; 7424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->DisplayStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->DisplayString, NULL); 7434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionPtr += StringSize; 7454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->FilePathList = AllocateZeroPool (NewLoadContext->FilePathListLength); 7474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ASSERT (NewLoadContext->FilePathList != NULL); 7484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CopyMem ( 7494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->FilePathList, 7504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi (EFI_DEVICE_PATH_PROTOCOL *) LoadOptionPtr, 7514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->FilePathListLength 7524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ); 7534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->HelpString = UiDevicePathToStr (NewLoadContext->FilePathList); 7554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry->HelpStringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, NewMenuEntry->HelpString, NULL); 7564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionPtr += NewLoadContext->FilePathListLength; 7584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (LoadOptionPtr < LoadOptionEnd) { 7604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi OptionalDataSize = DriverOptionSize - 7614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi sizeof (UINT32) - 7624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi sizeof (UINT16) - 7634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi StringSize - 7644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->FilePathListLength; 7654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->OptionalData = AllocateZeroPool (OptionalDataSize); 7674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ASSERT (NewLoadContext->OptionalData != NULL); 7684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CopyMem ( 7694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->OptionalData, 7704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionPtr, 7714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi OptionalDataSize 7724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ); 7734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext->OptionalDataSize = OptionalDataSize; 7754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 7764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link); 7784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 7804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (DriverOrderList != NULL) { 7824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool (DriverOrderList); 7834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 7844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DriverOptionMenu.MenuNumber = Index; 7854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return EFI_SUCCESS; 7864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 7884af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7894af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 7904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Get option number according to Boot#### and BootOrder variable. 7914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi The value is saved as #### + 1. 7924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 7934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param CallbackData The BMM context data. 7944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 7954af04335ac9aeb1802b995b102117b6f9de46809Dandan BiVOID 7964af04335ac9aeb1802b995b102117b6f9de46809Dandan BiGetBootOrder ( 7974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi IN BMM_CALLBACK_DATA *CallbackData 7984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 7994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 8004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BMM_FAKE_NV_DATA *BmmConfig; 8014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT16 Index; 8024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT16 OptionOrderIndex; 8034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN DeviceType; 8044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_ENTRY *NewMenuEntry; 8054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_LOAD_CONTEXT *NewLoadContext; 8064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ASSERT (CallbackData != NULL); 8084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DeviceType = (UINTN) -1; 8104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BmmConfig = &CallbackData->BmmFakeNvData; 8114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ZeroMem (BmmConfig->BootOptionOrder, sizeof (BmmConfig->BootOptionOrder)); 8124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi for (Index = 0, OptionOrderIndex = 0; ((Index < BootOptionMenu.MenuNumber) && 8144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi (OptionOrderIndex < (sizeof (BmmConfig->BootOptionOrder) / sizeof (BmmConfig->BootOptionOrder[0])))); 8154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Index++) { 8164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index); 8174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; 8184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (NewLoadContext->IsLegacy) { 8204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) { 8214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType; 8224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } else { 8234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 8244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Only show one legacy boot option for the same device type 8254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // assuming the boot options are grouped by the device type 8264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 8274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi continue; 8284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 8294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 8304af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BmmConfig->BootOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1); 8314af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 8324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 8334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 8354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Get driver option order from globalc DriverOptionMenu. 8364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param CallbackData The BMM context data. 8384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 8404af04335ac9aeb1802b995b102117b6f9de46809Dandan BiVOID 8414af04335ac9aeb1802b995b102117b6f9de46809Dandan BiGetDriverOrder ( 8424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi IN BMM_CALLBACK_DATA *CallbackData 8434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 8444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 8454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BMM_FAKE_NV_DATA *BmmConfig; 8464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT16 Index; 8474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINT16 OptionOrderIndex; 8484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UINTN DeviceType; 8494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_MENU_ENTRY *NewMenuEntry; 8504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BM_LOAD_CONTEXT *NewLoadContext; 8514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ASSERT (CallbackData != NULL); 8544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DeviceType = (UINTN) -1; 8564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BmmConfig = &CallbackData->BmmFakeNvData; 8574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ZeroMem (BmmConfig->DriverOptionOrder, sizeof (BmmConfig->DriverOptionOrder)); 8584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi for (Index = 0, OptionOrderIndex = 0; ((Index < DriverOptionMenu.MenuNumber) && 8604af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi (OptionOrderIndex < (sizeof (BmmConfig->DriverOptionOrder) / sizeof (BmmConfig->DriverOptionOrder[0])))); 8614af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Index++) { 8624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, Index); 8634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext; 8644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (NewLoadContext->IsLegacy) { 8664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi if (((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType != DeviceType) { 8674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi DeviceType = ((BBS_BBS_DEVICE_PATH *) NewLoadContext->FilePathList)->DeviceType; 8684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } else { 8694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 8704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Only show one legacy boot option for the same device type 8714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // assuming the boot options are grouped by the device type 8724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 8734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi continue; 8744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 8754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 8764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BmmConfig->DriverOptionOrder[OptionOrderIndex++] = (UINT32) (NewMenuEntry->OptionNumber + 1); 8774af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi } 8784af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 8794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 8814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Boot the file specified by the input file path info. 8824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param FilePath Point to the file path. 8844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8854af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @retval TRUE Exit caller function. 8864af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @retval FALSE Not exit caller function. 8874af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 8884af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOOLEAN 8894af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBootFromFile ( 8904af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi IN EFI_DEVICE_PATH_PROTOCOL *FilePath 8914af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 8924af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 8934af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi EFI_BOOT_MANAGER_LOAD_OPTION BootOption; 8944af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi CHAR16 *FileName; 8954af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 8964af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FileName = ExtractFileNameFromDevicePath(FilePath); 8974af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi EfiBootManagerInitializeLoadOption ( 8984af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi &BootOption, 8994af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 0, 9004af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LoadOptionTypeBoot, 9014af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi LOAD_OPTION_ACTIVE, 9024af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FileName, 9034af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FilePath, 9044af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NULL, 9054af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 0 9064af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ); 9074af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 9084af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // Since current no boot from removable media directly is allowed */ 9094af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi // 9104af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi gST->ConOut->ClearScreen (gST->ConOut); 9114af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9124af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BmmBdsSetConsoleMode (FALSE); 9134af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi EfiBootManagerBoot (&BootOption); 9144af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi BmmBdsSetConsoleMode (TRUE); 9154af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9164af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FreePool(FileName); 9174af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9184af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi EfiBootManagerFreeLoadOption (&BootOption); 9194af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9204af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return FALSE; 9214af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 9224af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9234af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 9244af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Display the form base on the selected file. 9254af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9264af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param FilePath Point to the file path. 9274af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param FormId The form need to display. 9284af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9294af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 9304af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOOLEAN 9314af04335ac9aeb1802b995b102117b6f9de46809Dandan BiReSendForm( 9324af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi IN EFI_DEVICE_PATH_PROTOCOL *FilePath, 9334af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi IN EFI_FORM_ID FormId 9344af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 9354af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 9364af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi gBootMaintenancePrivate.LoadContext->FilePathList = FilePath; 9374af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9384af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi UpdateOptionPage(&gBootMaintenancePrivate, FormId, FilePath); 9394af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9404af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi gBootMaintenancePrivate.FormBrowser2->SendForm ( 9414af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi gBootMaintenancePrivate.FormBrowser2, 9424af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi &gBootMaintenancePrivate.BmmHiiHandle, 9434af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 1, 9444af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi &mBootMaintGuid, 9454af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi FormId, 9464af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NULL, 9474af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi NULL 9484af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ); 9494af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return TRUE; 9504af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 9514af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9524af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 9534af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Create boot option base on the input file path info. 9544af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9554af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param FilePath Point to the file path. 9564af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9574af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @retval TRUE Exit caller function. 9584af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @retval FALSE Not exit caller function. 9594af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 9604af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOOLEAN 9614af04335ac9aeb1802b995b102117b6f9de46809Dandan BiCreateBootOptionFromFile ( 9624af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi IN EFI_DEVICE_PATH_PROTOCOL *FilePath 9634af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 9644af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 9654af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return ReSendForm(FilePath, FORM_BOOT_ADD_ID); 9664af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 9674af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9684af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi/** 9694af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi Create driver option base on the input file path info. 9704af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9714af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @param FilePath Point to the file path. 9724af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9734af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @retval TRUE Exit caller function. 9744af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi @retval FALSE Not exit caller function. 9754af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 9764af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi**/ 9774af04335ac9aeb1802b995b102117b6f9de46809Dandan BiBOOLEAN 9784af04335ac9aeb1802b995b102117b6f9de46809Dandan BiCreateDriverOptionFromFile ( 9794af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi IN EFI_DEVICE_PATH_PROTOCOL *FilePath 9804af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi ) 9814af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi{ 9824af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi return ReSendForm(FilePath, FORM_DRV_ADD_FILE_ID); 9834af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi} 9844af04335ac9aeb1802b995b102117b6f9de46809Dandan Bi 985