]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/UiApp/BootMaint/BootMaint.h
UiApp code split from IntelFrameworkModulePkg/Universal/BdsDxe driver.
[mirror_edk2.git] / MdeModulePkg / Application / UiApp / BootMaint / BootMaint.h
diff --git a/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.h b/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.h
new file mode 100644 (file)
index 0000000..49cbd3e
--- /dev/null
@@ -0,0 +1,1478 @@
+/** @file\r
+  Header file for boot maintenance module.\r
+\r
+Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _BOOT_MAINT_H_\r
+#define _BOOT_MAINT_H_\r
+\r
+#include "Ui.h"\r
+#include "FormGuid.h"\r
+#include "FrontPage.h"\r
+\r
+//\r
+// Constants which are variable names used to access variables\r
+//\r
+\r
+#define VAR_CON_OUT_MODE L"ConOutMode"\r
+\r
+\r
+//\r
+// String Contant\r
+//\r
+#define STR_FLOPPY       L"Floppy Drive #%02x"\r
+#define STR_HARDDISK     L"HardDisk Drive #%02x"\r
+#define STR_CDROM        L"ATAPI CDROM Drive #%02x"\r
+#define STR_NET          L"NET Drive #%02x"\r
+#define STR_BEV          L"BEV Drive #%02x"\r
+#define STR_FLOPPY_HELP   L"Select Floppy Drive #%02x"\r
+#define STR_HARDDISK_HELP L"Select HardDisk Drive #%02x"\r
+#define STR_CDROM_HELP    L"Select ATAPI CDROM Drive #%02x"\r
+#define STR_NET_HELP      L"NET Drive #%02x"\r
+#define STR_BEV_HELP      L"BEV Drive #%02x"\r
+\r
+//\r
+// Variable created with this flag will be "Efi:...."\r
+//\r
+#define VAR_FLAG  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE\r
+\r
+extern EFI_GUID mBootMaintGuid;\r
+extern EFI_GUID mFileExplorerGuid;\r
+extern CHAR16   mFileExplorerStorageName[];\r
+extern CHAR16   mBootMaintStorageName[];\r
+//\r
+// These are the VFR compiler generated data representing our VFR data.\r
+//\r
+extern UINT8    BmBin[];\r
+extern UINT8    FEBin[];\r
+\r
+//\r
+// Below are the number of options in Baudrate, Databits,\r
+// Parity and Stopbits selection for serial ports.\r
+//\r
+#define BM_COM_ATTR_BUADRATE  19\r
+#define BM_COM_ATTR_DATABITS  4\r
+#define BM_COM_ATTR_PARITY    5\r
+#define BM_COM_ATTR_STOPBITS  3\r
+\r
+//\r
+// Callback function helper\r
+//\r
+#define BMM_CALLBACK_DATA_SIGNATURE     SIGNATURE_32 ('C', 'b', 'c', 'k')\r
+#define BMM_CALLBACK_DATA_FROM_THIS(a)  CR (a, BMM_CALLBACK_DATA, BmmConfigAccess, BMM_CALLBACK_DATA_SIGNATURE)\r
+\r
+#define FE_CALLBACK_DATA_FROM_THIS(a)   CR (a, BMM_CALLBACK_DATA, FeConfigAccess, BMM_CALLBACK_DATA_SIGNATURE)\r
+\r
+//\r
+// Enumeration type definition\r
+//\r
+typedef UINT8 BBS_TYPE;\r
+\r
+typedef enum _TYPE_OF_TERMINAL {\r
+  TerminalTypePcAnsi                             = 0,\r
+  TerminalTypeVt100,\r
+  TerminalTypeVt100Plus,\r
+  TerminalTypeVtUtf8\r
+} TYPE_OF_TERMINAL;\r
+\r
+typedef enum _FILE_EXPLORER_STATE {\r
+  FileExplorerStateInActive                      = 0,\r
+  FileExplorerStateBootFromFile,\r
+  FileExplorerStateAddBootOption,\r
+  FileExplorerStateAddDriverOptionState,\r
+  FileExplorerStateUnknown\r
+} FILE_EXPLORER_STATE;\r
+\r
+typedef enum _FILE_EXPLORER_DISPLAY_CONTEXT {\r
+  FileExplorerDisplayFileSystem,\r
+  FileExplorerDisplayDirectory,\r
+  FileExplorerDisplayUnknown\r
+} FILE_EXPLORER_DISPLAY_CONTEXT;\r
+\r
+//\r
+// All of the signatures that will be used in list structure\r
+//\r
+#define BM_MENU_OPTION_SIGNATURE      SIGNATURE_32 ('m', 'e', 'n', 'u')\r
+#define BM_LOAD_OPTION_SIGNATURE      SIGNATURE_32 ('l', 'o', 'a', 'd')\r
+#define BM_CONSOLE_OPTION_SIGNATURE   SIGNATURE_32 ('c', 'n', 's', 'l')\r
+#define BM_FILE_OPTION_SIGNATURE      SIGNATURE_32 ('f', 'i', 'l', 'e')\r
+#define BM_HANDLE_OPTION_SIGNATURE    SIGNATURE_32 ('h', 'n', 'd', 'l')\r
+#define BM_TERMINAL_OPTION_SIGNATURE  SIGNATURE_32 ('t', 'r', 'm', 'l')\r
+#define BM_MENU_ENTRY_SIGNATURE       SIGNATURE_32 ('e', 'n', 't', 'r')\r
+\r
+#define BM_LOAD_CONTEXT_SELECT        0x0\r
+#define BM_CONSOLE_CONTEXT_SELECT     0x1\r
+#define BM_FILE_CONTEXT_SELECT        0x2\r
+#define BM_HANDLE_CONTEXT_SELECT      0x3\r
+#define BM_TERMINAL_CONTEXT_SELECT    0x5\r
+\r
+#define BM_CONSOLE_IN_CONTEXT_SELECT  0x6\r
+#define BM_CONSOLE_OUT_CONTEXT_SELECT 0x7\r
+#define BM_CONSOLE_ERR_CONTEXT_SELECT 0x8\r
+\r
+//\r
+// Buffer size for update data\r
+//\r
+#define UPDATE_DATA_SIZE        0x100000\r
+\r
+//\r
+// Namespace of callback keys used in display and file system navigation\r
+//\r
+#define MAX_BBS_OFFSET          0xE000\r
+#define NET_OPTION_OFFSET       0xD800\r
+#define BEV_OPTION_OFFSET       0xD000\r
+#define FD_OPTION_OFFSET        0xC000\r
+#define HD_OPTION_OFFSET        0xB000\r
+#define CD_OPTION_OFFSET        0xA000\r
+#define FILE_OPTION_OFFSET      0x8000\r
+#define FILE_OPTION_MASK        0x7FFF\r
+#define HANDLE_OPTION_OFFSET    0x7000\r
+#define CONSOLE_OPTION_OFFSET   0x6000\r
+#define TERMINAL_OPTION_OFFSET  0x5000\r
+#define CONFIG_OPTION_OFFSET    0x1200\r
+#define KEY_VALUE_OFFSET        0x1100\r
+#define FORM_ID_OFFSET          0x1000\r
+\r
+//\r
+// VarOffset that will be used to create question\r
+// all these values are computed from the structure\r
+// defined below\r
+//\r
+#define VAR_OFFSET(Field)              ((UINT16) ((UINTN) &(((BMM_FAKE_NV_DATA *) 0)->Field)))\r
+\r
+//\r
+// Question Id of Zero is invalid, so add an offset to it\r
+//\r
+#define QUESTION_ID(Field)             (VAR_OFFSET (Field) + CONFIG_OPTION_OFFSET)\r
+\r
+#define BOOT_TIME_OUT_VAR_OFFSET        VAR_OFFSET (BootTimeOut)\r
+#define BOOT_NEXT_VAR_OFFSET            VAR_OFFSET (BootNext)\r
+#define COM1_BAUD_RATE_VAR_OFFSET       VAR_OFFSET (COM1BaudRate)\r
+#define COM1_DATA_RATE_VAR_OFFSET       VAR_OFFSET (COM1DataRate)\r
+#define COM1_STOP_BITS_VAR_OFFSET       VAR_OFFSET (COM1StopBits)\r
+#define COM1_PARITY_VAR_OFFSET          VAR_OFFSET (COM1Parity)\r
+#define COM1_TERMINAL_VAR_OFFSET        VAR_OFFSET (COM2TerminalType)\r
+#define COM2_BAUD_RATE_VAR_OFFSET       VAR_OFFSET (COM2BaudRate)\r
+#define COM2_DATA_RATE_VAR_OFFSET       VAR_OFFSET (COM2DataRate)\r
+#define COM2_STOP_BITS_VAR_OFFSET       VAR_OFFSET (COM2StopBits)\r
+#define COM2_PARITY_VAR_OFFSET          VAR_OFFSET (COM2Parity)\r
+#define COM2_TERMINAL_VAR_OFFSET        VAR_OFFSET (COM2TerminalType)\r
+#define DRV_ADD_HANDLE_DESC_VAR_OFFSET  VAR_OFFSET (DriverAddHandleDesc)\r
+#define DRV_ADD_ACTIVE_VAR_OFFSET       VAR_OFFSET (DriverAddActive)\r
+#define DRV_ADD_RECON_VAR_OFFSET        VAR_OFFSET (DriverAddForceReconnect)\r
+#define CON_IN_COM1_VAR_OFFSET          VAR_OFFSET (ConsoleInputCOM1)\r
+#define CON_IN_COM2_VAR_OFFSET          VAR_OFFSET (ConsoleInputCOM2)\r
+#define CON_OUT_COM1_VAR_OFFSET         VAR_OFFSET (ConsoleOutputCOM1)\r
+#define CON_OUT_COM2_VAR_OFFSET         VAR_OFFSET (ConsoleOutputCOM2)\r
+#define CON_ERR_COM1_VAR_OFFSET         VAR_OFFSET (ConsoleErrorCOM1)\r
+#define CON_ERR_COM2_VAR_OFFSET         VAR_OFFSET (ConsoleErrorCOM2)\r
+#define CON_MODE_VAR_OFFSET             VAR_OFFSET (ConsoleOutMode)\r
+#define CON_DEVICE_VAR_OFFSET           VAR_OFFSET (ConsoleCheck)\r
+#define BOOT_OPTION_ORDER_VAR_OFFSET    VAR_OFFSET (BootOptionOrder)\r
+#define DRIVER_OPTION_ORDER_VAR_OFFSET  VAR_OFFSET (DriverOptionOrder)\r
+#define BOOT_OPTION_DEL_VAR_OFFSET      VAR_OFFSET (BootOptionDel)\r
+#define DRIVER_OPTION_DEL_VAR_OFFSET    VAR_OFFSET (DriverOptionDel)\r
+#define DRIVER_ADD_OPTION_VAR_OFFSET    VAR_OFFSET (DriverAddHandleOptionalData)\r
+#define COM_BAUD_RATE_VAR_OFFSET        VAR_OFFSET (COMBaudRate)\r
+#define COM_DATA_RATE_VAR_OFFSET        VAR_OFFSET (COMDataRate)\r
+#define COM_STOP_BITS_VAR_OFFSET        VAR_OFFSET (COMStopBits)\r
+#define COM_PARITY_VAR_OFFSET           VAR_OFFSET (COMParity)\r
+#define COM_TERMINAL_VAR_OFFSET         VAR_OFFSET (COMTerminalType)\r
+\r
+#define BOOT_TIME_OUT_QUESTION_ID       QUESTION_ID (BootTimeOut)\r
+#define BOOT_NEXT_QUESTION_ID           QUESTION_ID (BootNext)\r
+#define COM1_BAUD_RATE_QUESTION_ID      QUESTION_ID (COM1BaudRate)\r
+#define COM1_DATA_RATE_QUESTION_ID      QUESTION_ID (COM1DataRate)\r
+#define COM1_STOP_BITS_QUESTION_ID      QUESTION_ID (COM1StopBits)\r
+#define COM1_PARITY_QUESTION_ID         QUESTION_ID (COM1Parity)\r
+#define COM1_TERMINAL_QUESTION_ID       QUESTION_ID (COM2TerminalType)\r
+#define COM2_BAUD_RATE_QUESTION_ID      QUESTION_ID (COM2BaudRate)\r
+#define COM2_DATA_RATE_QUESTION_ID      QUESTION_ID (COM2DataRate)\r
+#define COM2_STOP_BITS_QUESTION_ID      QUESTION_ID (COM2StopBits)\r
+#define COM2_PARITY_QUESTION_ID         QUESTION_ID (COM2Parity)\r
+#define COM2_TERMINAL_QUESTION_ID       QUESTION_ID (COM2TerminalType)\r
+#define DRV_ADD_HANDLE_DESC_QUESTION_ID QUESTION_ID (DriverAddHandleDesc)\r
+#define DRV_ADD_ACTIVE_QUESTION_ID      QUESTION_ID (DriverAddActive)\r
+#define DRV_ADD_RECON_QUESTION_ID       QUESTION_ID (DriverAddForceReconnect)\r
+#define CON_IN_COM1_QUESTION_ID         QUESTION_ID (ConsoleInputCOM1)\r
+#define CON_IN_COM2_QUESTION_ID         QUESTION_ID (ConsoleInputCOM2)\r
+#define CON_OUT_COM1_QUESTION_ID        QUESTION_ID (ConsoleOutputCOM1)\r
+#define CON_OUT_COM2_QUESTION_ID        QUESTION_ID (ConsoleOutputCOM2)\r
+#define CON_ERR_COM1_QUESTION_ID        QUESTION_ID (ConsoleErrorCOM1)\r
+#define CON_ERR_COM2_QUESTION_ID        QUESTION_ID (ConsoleErrorCOM2)\r
+#define CON_MODE_QUESTION_ID            QUESTION_ID (ConsoleOutMode)\r
+#define CON_DEVICE_QUESTION_ID          QUESTION_ID (ConsoleCheck)\r
+#define BOOT_OPTION_ORDER_QUESTION_ID   QUESTION_ID (BootOptionOrder)\r
+#define DRIVER_OPTION_ORDER_QUESTION_ID QUESTION_ID (DriverOptionOrder)\r
+#define BOOT_OPTION_DEL_QUESTION_ID     QUESTION_ID (BootOptionDel)\r
+#define DRIVER_OPTION_DEL_QUESTION_ID   QUESTION_ID (DriverOptionDel)\r
+#define DRIVER_ADD_OPTION_QUESTION_ID   QUESTION_ID (DriverAddHandleOptionalData)\r
+#define COM_BAUD_RATE_QUESTION_ID       QUESTION_ID (COMBaudRate)\r
+#define COM_DATA_RATE_QUESTION_ID       QUESTION_ID (COMDataRate)\r
+#define COM_STOP_BITS_QUESTION_ID       QUESTION_ID (COMStopBits)\r
+#define COM_PARITY_QUESTION_ID          QUESTION_ID (COMParity)\r
+#define COM_TERMINAL_QUESTION_ID        QUESTION_ID (COMTerminalType)\r
+\r
+#define STRING_DEPOSITORY_NUMBER        8\r
+\r
+///\r
+/// Serial Ports attributes, first one is the value for\r
+/// return from callback function, stringtoken is used to\r
+/// display the value properly\r
+///\r
+typedef struct {\r
+  UINTN   Value;\r
+  UINT16  StringToken;\r
+} COM_ATTR;\r
+\r
+typedef struct {\r
+  UINT64                    BaudRate;\r
+  UINT8                     DataBits;\r
+  UINT8                     Parity;\r
+  UINT8                     StopBits;\r
+\r
+  UINT8                     BaudRateIndex;\r
+  UINT8                     DataBitsIndex;\r
+  UINT8                     ParityIndex;\r
+  UINT8                     StopBitsIndex;\r
+\r
+  UINT8                     IsConIn;\r
+  UINT8                     IsConOut;\r
+  UINT8                     IsStdErr;\r
+  UINT8                     TerminalType;\r
+\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+} BM_TERMINAL_CONTEXT;\r
+\r
+typedef struct {\r
+  BOOLEAN                   IsBootNext;\r
+  BOOLEAN                   LoadOptionModified;\r
+  BOOLEAN                   Deleted;\r
+\r
+  BOOLEAN                   IsLegacy;\r
+  BOOLEAN                   IsActive;\r
+  BOOLEAN                   ForceReconnect;\r
+  UINTN                     OptionalDataSize;\r
+\r
+  UINTN                     LoadOptionSize;\r
+  UINT8                     *LoadOption;\r
+\r
+  UINT32                    Attributes;\r
+  UINT16                    FilePathListLength;\r
+  UINT16                    *Description;\r
+  EFI_DEVICE_PATH_PROTOCOL  *FilePathList;\r
+  UINT8                     *OptionalData;\r
+\r
+  UINT16                    BbsIndex;\r
+} BM_LOAD_CONTEXT;\r
+\r
+typedef struct {\r
+\r
+  BOOLEAN                   IsActive;\r
+\r
+  BOOLEAN                   IsTerminal;\r
+\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+} BM_CONSOLE_CONTEXT;\r
+\r
+typedef struct {\r
+  UINTN   Column;\r
+  UINTN   Row;\r
+} CONSOLE_OUT_MODE;\r
+\r
+typedef struct {\r
+  EFI_HANDLE                        Handle;\r
+  EFI_DEVICE_PATH_PROTOCOL          *DevicePath;\r
+  EFI_FILE_HANDLE                   FHandle;\r
+  UINT16                            *FileName;\r
+  EFI_FILE_SYSTEM_VOLUME_LABEL      *Info;\r
+\r
+  BOOLEAN                           IsRoot;\r
+  BOOLEAN                           IsDir;\r
+  BOOLEAN                           IsRemovableMedia;\r
+  BOOLEAN                           IsLoadFile;\r
+  BOOLEAN                           IsBootLegacy;\r
+} BM_FILE_CONTEXT;\r
+\r
+typedef struct {\r
+  EFI_HANDLE                Handle;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+} BM_HANDLE_CONTEXT;\r
+\r
+typedef struct {\r
+  UINTN           Signature;\r
+  LIST_ENTRY      Head;\r
+  UINTN           MenuNumber;\r
+} BM_MENU_OPTION;\r
+\r
+typedef struct {\r
+  UINTN           Signature;\r
+  LIST_ENTRY      Link;\r
+  UINTN           OptionNumber;\r
+  UINT16          *DisplayString;\r
+  UINT16          *HelpString;\r
+  EFI_STRING_ID   DisplayStringToken;\r
+  EFI_STRING_ID   HelpStringToken;\r
+  UINTN           ContextSelection;\r
+  VOID            *VariableContext;\r
+} BM_MENU_ENTRY;\r
+\r
+typedef struct {\r
+  //\r
+  // Shared callback data.\r
+  //\r
+  UINTN                          Signature;\r
+\r
+  BM_MENU_ENTRY                  *MenuEntry;\r
+  BM_HANDLE_CONTEXT              *HandleContext;\r
+  BM_FILE_CONTEXT                *FileContext;\r
+  BM_LOAD_CONTEXT                *LoadContext;\r
+  BM_TERMINAL_CONTEXT            *TerminalContext;\r
+  UINTN                          CurrentTerminal;\r
+  BBS_TYPE                       BbsType;\r
+\r
+  //\r
+  // BMM main formset callback data.\r
+  //\r
+  EFI_HII_HANDLE                 BmmHiiHandle;\r
+  EFI_HANDLE                     BmmDriverHandle;\r
+  EFI_HII_CONFIG_ACCESS_PROTOCOL BmmConfigAccess;\r
+  EFI_FORM_ID                    BmmCurrentPageId;\r
+  EFI_FORM_ID                    BmmPreviousPageId;\r
+  BOOLEAN                        BmmAskSaveOrNot;\r
+  BMM_FAKE_NV_DATA               BmmFakeNvData;\r
+  BMM_FAKE_NV_DATA               BmmOldFakeNVData;\r
+\r
+  //\r
+  // File explorer formset callback data.\r
+  //\r
+  EFI_HII_HANDLE                 FeHiiHandle;\r
+  EFI_HANDLE                     FeDriverHandle;\r
+  EFI_HII_CONFIG_ACCESS_PROTOCOL FeConfigAccess;\r
+  FILE_EXPLORER_STATE            FeCurrentState;\r
+  FILE_EXPLORER_DISPLAY_CONTEXT  FeDisplayContext;\r
+  FILE_EXPLORER_NV_DATA          FeFakeNvData;\r
+} BMM_CALLBACK_DATA;\r
+\r
+typedef struct _STRING_LIST_NODE STRING_LIST_NODE;\r
+\r
+struct _STRING_LIST_NODE {\r
+  EFI_STRING_ID             StringToken;\r
+  STRING_LIST_NODE          *Next;\r
+};\r
+\r
+typedef struct _STRING_DEPOSITORY {\r
+  UINTN             TotalNodeNumber;\r
+  STRING_LIST_NODE  *CurrentNode;\r
+  STRING_LIST_NODE  *ListHead;\r
+} STRING_DEPOSITORY;\r
+\r
+//\r
+// #pragma pack()\r
+//\r
+// For initializing File System menu\r
+//\r
+\r
+/**\r
+  This function build the FsOptionMenu list which records all\r
+  available file system in the system. They includes all instances\r
+  of EFI_SIMPLE_FILE_SYSTEM_PROTOCOL, all instances of EFI_LOAD_FILE_SYSTEM\r
+  and all type of legacy boot device.\r
+\r
+  @param CallbackData    BMM context data\r
+\r
+  @retval  EFI_SUCCESS             Success find the file system\r
+  @retval  EFI_OUT_OF_RESOURCES    Can not create menu entry\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_FindFileSystem (\r
+  IN BMM_CALLBACK_DATA          *CallbackData\r
+  );\r
+\r
+/**\r
+  Find files under current directory\r
+  All files and sub-directories in current directory\r
+  will be stored in DirectoryMenu for future use.\r
+\r
+  @param CallbackData  The BMM context data.\r
+  @param MenuEntry     The Menu Entry.\r
+\r
+  @retval EFI_SUCCESS         Get files from current dir successfully.\r
+  @return Other value if can't get files from current dir.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_FindFiles (\r
+  IN BMM_CALLBACK_DATA          *CallbackData,\r
+  IN BM_MENU_ENTRY              *MenuEntry\r
+  );\r
+\r
+/**\r
+\r
+  Find drivers that will be added as Driver#### variables from handles\r
+  in current system environment\r
+  All valid handles in the system except those consume SimpleFs, LoadFile\r
+  are stored in DriverMenu for future use.\r
+\r
+  @retval EFI_SUCCESS The function complets successfully.\r
+  @return Other value if failed to build the DriverMenu.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_FindDrivers (\r
+  VOID\r
+  );\r
+\r
+/**\r
+\r
+  Build the BootOptionMenu according to BootOrder Variable.\r
+  This Routine will access the Boot#### to get EFI_LOAD_OPTION.\r
+\r
+  @param CallbackData The BMM context data.\r
+\r
+  @return The number of the Var Boot####.\r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_GetBootOptions (\r
+  IN  BMM_CALLBACK_DATA         *CallbackData\r
+  );\r
+\r
+/**\r
+\r
+  Build up all DriverOptionMenu\r
+\r
+  @param CallbackData The BMM context data.\r
+\r
+  @return EFI_SUCESS The functin completes successfully.\r
+  @retval EFI_OUT_OF_RESOURCES Not enough memory to compete the operation.\r
+  \r
+\r
+**/\r
+EFI_STATUS\r
+BOpt_GetDriverOptions (\r
+  IN  BMM_CALLBACK_DATA         *CallbackData\r
+  );\r
+\r
+/**\r
+  Free resources allocated in Allocate Rountine.\r
+\r
+  @param FreeMenu        Menu to be freed\r
+\r
+**/\r
+VOID\r
+BOpt_FreeMenu (\r
+  BM_MENU_OPTION        *FreeMenu\r
+  );\r
+\r
+\r
+/**\r
+\r
+  Append file name to existing file name.\r
+\r
+  @param Str1  The existing file name\r
+  @param Str2  The file name to be appended\r
+\r
+  @return Allocate a new string to hold the appended result.\r
+          Caller is responsible to free the returned string.\r
+\r
+**/\r
+CHAR16*\r
+BOpt_AppendFileName (\r
+  IN  CHAR16  *Str1,\r
+  IN  CHAR16  *Str2\r
+  );\r
+\r
+/**\r
+\r
+  Check whether current FileName point to a valid\r
+  Efi Image File.\r
+\r
+  @param FileName  File need to be checked.\r
+\r
+  @retval TRUE  Is Efi Image\r
+  @retval FALSE Not a valid Efi Image\r
+\r
+**/\r
+BOOLEAN\r
+BOpt_IsEfiImageName (\r
+  IN UINT16  *FileName\r
+  );\r
+\r
+/**\r
+\r
+  Check whether current FileName point to a valid Efi Application\r
+\r
+  @param Dir       Pointer to current Directory\r
+  @param FileName  Pointer to current File name.\r
+\r
+  @retval TRUE      Is a valid Efi Application\r
+  @retval FALSE     not a valid Efi Application\r
+\r
+**/\r
+BOOLEAN\r
+BOpt_IsEfiApp (\r
+  IN EFI_FILE_HANDLE Dir,\r
+  IN UINT16          *FileName\r
+  );\r
+\r
+/**\r
+\r
+  Get the Option Number that has not been allocated for use.\r
+\r
+  @param Type  The type of Option.\r
+\r
+  @return The available Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetOptionNumber (\r
+  CHAR16        *Type\r
+  );\r
+\r
+/**\r
+\r
+  Get the Option Number for Boot#### that does not used.\r
+\r
+  @return The available Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetBootOptionNumber (\r
+  VOID\r
+  );\r
+\r
+/**\r
+\r
+Get the Option Number for Driver#### that does not used.\r
+\r
+@return The unused Option Number.\r
+\r
+**/\r
+UINT16\r
+BOpt_GetDriverOptionNumber (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Create a menu entry give a Menu type.\r
+\r
+  @param MenuType        The Menu type to be created.\r
+\r
+\r
+  @retval NULL           If failed to create the menu.\r
+  @return                The menu.\r
+\r
+**/\r
+BM_MENU_ENTRY                     *\r
+BOpt_CreateMenuEntry (\r
+  UINTN           MenuType\r
+  );\r
+\r
+/**\r
+  Free up all resource allocated for a BM_MENU_ENTRY.\r
+\r
+  @param MenuEntry   A pointer to BM_MENU_ENTRY.\r
+\r
+**/\r
+VOID\r
+BOpt_DestroyMenuEntry (\r
+  BM_MENU_ENTRY         *MenuEntry\r
+  );\r
+\r
+/**\r
+  Get the Menu Entry from the list in Menu Entry List.\r
+\r
+  If MenuNumber is great or equal to the number of Menu\r
+  Entry in the list, then ASSERT.\r
+\r
+  @param MenuOption      The Menu Entry List to read the menu entry.\r
+  @param MenuNumber      The index of Menu Entry.\r
+\r
+  @return The Menu Entry.\r
+\r
+**/\r
+BM_MENU_ENTRY                     *\r
+BOpt_GetMenuEntry (\r
+  BM_MENU_OPTION      *MenuOption,\r
+  UINTN               MenuNumber\r
+  );\r
+\r
+/**\r
+  Get option number according to Boot#### and BootOrder variable. \r
+  The value is saved as #### + 1.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID  \r
+GetBootOrder (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+/**\r
+  Get driver option order from globalc DriverOptionMenu.\r
+\r
+  @param CallbackData    The BMM context data.\r
+  \r
+**/\r
+VOID  \r
+GetDriverOrder (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+//\r
+// Locate all serial io devices for console\r
+//\r
+/**\r
+  Build a list containing all serial devices.\r
+\r
+  @retval EFI_SUCCESS The function complete successfully.\r
+  @retval EFI_UNSUPPORTED No serial ports present.\r
+\r
+**/\r
+EFI_STATUS\r
+LocateSerialIo (\r
+  VOID\r
+  );\r
+\r
+//\r
+// Initializing Console menu\r
+//\r
+/**\r
+  Build up ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
+\r
+  @retval EFI_SUCCESS    The function always complete successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+GetAllConsoles(\r
+  VOID\r
+  );\r
+\r
+//\r
+// Get current mode information\r
+//\r
+/**\r
+  Get mode number according to column and row\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+GetConsoleOutMode (\r
+  IN  BMM_CALLBACK_DATA    *CallbackData\r
+  );\r
+\r
+//\r
+// Cleaning up console menu\r
+//\r
+/**\r
+  Free ConsoleOutMenu, ConsoleInpMenu and ConsoleErrMenu\r
+\r
+  @retval EFI_SUCCESS    The function always complete successfully.\r
+**/\r
+EFI_STATUS\r
+FreeAllConsoles (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Update the device path that describing a terminal device\r
+  based on the new BaudRate, Data Bits, parity and Stop Bits\r
+  set.\r
+\r
+  @param DevicePath     The devicepath protocol instance wanted to be updated.\r
+\r
+**/\r
+VOID\r
+ChangeVariableDevicePath (\r
+  IN OUT EFI_DEVICE_PATH_PROTOCOL  *DevicePath\r
+  );\r
+\r
+/**\r
+  Update the multi-instance device path of Terminal Device based on\r
+  the global TerminalMenu. If ChangeTernimal is TRUE, the terminal \r
+  device path in the Terminal Device in TerminalMenu is also updated.\r
+\r
+  @param DevicePath      The multi-instance device path.\r
+  @param ChangeTerminal  TRUE, then device path in the Terminal Device \r
+                         in TerminalMenu is also updated; FALSE, no update.\r
+\r
+  @return EFI_SUCCESS    The function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+ChangeTerminalDevicePath (\r
+  IN OUT EFI_DEVICE_PATH_PROTOCOL  *DevicePath,\r
+  IN BOOLEAN                   ChangeTerminal\r
+  );\r
+\r
+//\r
+// Variable operation by menu selection\r
+//\r
+/**\r
+  This function create a currently loaded Boot Option from \r
+  the BMM. It then appends this Boot Option to the end of \r
+  the "BootOrder" list. It also append this Boot Opotion to the end\r
+  of BootOptionMenu.\r
+\r
+  @param CallbackData           The BMM context data.\r
+  @param NvRamMap               The file explorer formset internal state.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES  If not enought memory to complete the operation.\r
+  @retval EFI_SUCCESS           If function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootOption (\r
+  IN  BMM_CALLBACK_DATA                   *CallbackData,\r
+  IN  FILE_EXPLORER_NV_DATA               *NvRamMap\r
+  );\r
+\r
+/**\r
+  Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
+  After deleting this boot option, call Var_ChangeBootOrder to\r
+  make sure BootOrder is in valid state.\r
+\r
+  @retval EFI_SUCCESS   If all boot load option EFI Variables corresponding to  \r
+                        BM_LOAD_CONTEXT marked for deletion is deleted\r
+  @return Others        If failed to update the "BootOrder" variable after deletion. \r
+\r
+**/\r
+EFI_STATUS\r
+Var_DelBootOption (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  After any operation on Boot####, there will be a discrepancy in BootOrder.\r
+  Since some are missing but in BootOrder, while some are present but are\r
+  not reflected by BootOrder. Then a function rebuild BootOrder from\r
+  scratch by content from BootOptionMenu is needed.\r
+\r
+  @retval  EFI_SUCCESS  The boot order is updated successfully.\r
+  @return  other than EFI_SUCCESS if failed to change the "BootOrder" EFI Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_ChangeBootOrder (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function create a currently loaded Drive Option from \r
+  the BMM. It then appends this Driver Option to the end of \r
+  the "DriverOrder" list. It append this Driver Opotion to the end\r
+  of DriverOptionMenu.\r
+\r
+  @param CallbackData    The BMM context data.\r
+  @param HiiHandle       The HII handle associated with the BMM formset.\r
+  @param DescriptionData The description of this driver option.\r
+  @param OptionalData    The optional load option.\r
+  @param ForceReconnect  If to force reconnect.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
+  @retval EFI_SUCCESS          If function completes successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateDriverOption (\r
+  IN  BMM_CALLBACK_DATA         *CallbackData,\r
+  IN  EFI_HII_HANDLE            HiiHandle,\r
+  IN  UINT16                    *DescriptionData,\r
+  IN  UINT16                    *OptionalData,\r
+  IN  UINT8                     ForceReconnect\r
+  );\r
+\r
+/**\r
+  Delete Load Option that represent a Deleted state in BootOptionMenu.\r
+  After deleting this Driver option, call Var_ChangeDriverOrder to\r
+  make sure DriverOrder is in valid state.\r
+\r
+  @retval EFI_SUCCESS Load Option is successfully updated.\r
+  @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI\r
+          Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_DelDriverOption (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  After any operation on Driver####, there will be a discrepancy in\r
+  DriverOrder. Since some are missing but in DriverOrder, while some\r
+  are present but are not reflected by DriverOrder. Then a function\r
+  rebuild DriverOrder from scratch by content from DriverOptionMenu is\r
+  needed.\r
+\r
+  @retval  EFI_SUCCESS  The driver order is updated successfully.\r
+  @return  other than EFI_SUCCESS if failed to set the "DriverOrder" EFI Variable.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_ChangeDriverOrder (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function delete and build multi-instance device path ConIn\r
+  console device.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConsoleInpOption (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function delete and build multi-instance device path ConOut console device.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConsoleOutOption (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function delete and build multi-instance device path ErrOut console device.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+**/\r
+EFI_STATUS\r
+Var_UpdateErrorOutOption (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function delete and build Out of Band console device.\r
+  \r
+  @param   MenuIndex   Menu index which user select in the terminal menu list.\r
+  \r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.  \r
+**/\r
+EFI_STATUS\r
+Var_UpdateOutOfBandOption (\r
+  IN  UINT16           MenuIndex\r
+  );\r
+\r
+/**\r
+  Update the device path of "ConOut", "ConIn" and "ErrOut" based on the new BaudRate, Data Bits, \r
+  parity and stop Bits set.\r
+\r
+**/\r
+VOID\r
+Var_UpdateAllConsoleOption (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This function update the "BootNext" EFI Variable. If there is no "BootNex" specified in BMM, \r
+  this EFI Variable is deleted.\r
+  It also update the BMM context data specified the "BootNext" value.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+  @retval EFI_SUCCESS    The function complete successfully.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootNext (\r
+  IN BMM_CALLBACK_DATA            *CallbackData\r
+  );\r
+\r
+/**\r
+  This function update the "BootOrder" EFI Variable based on BMM Formset's NV map. It then refresh \r
+  BootOptionMenu with the new "BootOrder" list.\r
+\r
+  @param CallbackData           The BMM context data.\r
+\r
+  @retval EFI_SUCCESS           The function complete successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  Not enough memory to complete the function.\r
+  @return not The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateBootOrder (\r
+  IN BMM_CALLBACK_DATA            *CallbackData\r
+  );\r
+\r
+/**\r
+  This function update the "DriverOrder" EFI Variable based on\r
+  BMM Formset's NV map. It then refresh DriverOptionMenu\r
+  with the new "DriverOrder" list.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+  @retval EFI_SUCCESS           The function complete successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  Not enough memory to complete the function.\r
+  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateDriverOrder (\r
+  IN BMM_CALLBACK_DATA            *CallbackData\r
+  );\r
+\r
+/**\r
+  Update the Text Mode of Console.\r
+\r
+  @param CallbackData  The context data for BMM.\r
+\r
+  @retval EFI_SUCCSS If the Text Mode of Console is updated.\r
+  @return Other value if the Text Mode of Console is not updated.\r
+\r
+**/\r
+EFI_STATUS\r
+Var_UpdateConMode (\r
+  IN BMM_CALLBACK_DATA            *CallbackData\r
+  );\r
+\r
+//\r
+// Following are page create and refresh functions\r
+//\r
+/**\r
+  Refresh the global UpdateData structure.\r
+\r
+**/\r
+VOID\r
+RefreshUpdateData (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Clean up the dynamic opcode at label and form specified by\r
+  both LabelId. \r
+\r
+  @param LabelId         It is both the Form ID and Label ID for\r
+                         opcode deletion.\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+CleanUpPage (\r
+  IN UINT16                           LabelId,\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create a lit of boot option from global BootOptionMenu. It\r
+  allow user to delete the boot option.\r
+\r
+  @param CallbackData    The BMM context data.\r
+\r
+**/\r
+VOID\r
+UpdateBootDelPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create a lit of driver option from global DriverMenu.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateDrvAddHandlePage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create a lit of driver option from global DriverOptionMenu. It\r
+  allow user to delete the driver option.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateDrvDelPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Prepare the page to allow user to add description for a Driver Option.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateDriverAddHandleDescPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Dispatch the correct update page function to call based on the UpdatePageId.\r
+\r
+  @param UpdatePageId    The form ID.\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdatePageBody (\r
+  IN UINT16                           UpdatePageId,\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create the dynamic page to allow user to set the "BootNext" vaule.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateBootNextPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create the dynamic page to allow user to set the "TimeOut" vaule.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateTimeOutPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create the dynamic page which allows user to set the property such as Baud Rate, Data Bits,\r
+  Parity, Stop Bits, Terminal Type.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateTerminalPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Refresh the text mode page\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateConModePage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Create a list of Goto Opcode for all terminal devices logged\r
+  by TerminaMenu. This list will be inserted to form FORM_CON_COM_SETUP_ID.\r
+\r
+  @param CallbackData    The BMM context data.\r
+**/\r
+VOID\r
+UpdateConCOMPage (\r
+  IN BMM_CALLBACK_DATA                *CallbackData\r
+  );\r
+\r
+/**\r
+  Function opens and returns a file handle to the root directory of a volume.\r
+\r
+  @param DeviceHandle    A handle for a device\r
+  @return A valid file handle or NULL is returned\r
+**/\r
+EFI_FILE_HANDLE\r
+EfiLibOpenRoot (\r
+  IN EFI_HANDLE       DeviceHandle\r
+  );\r
+\r
+/**\r
+  Function gets the file system information from an open file descriptor,\r
+  and stores it in a buffer allocated from pool.\r
+\r
+  @param FHand           The file handle.\r
+\r
+  @return                A pointer to a buffer with file information.\r
+                         NULL is returned if failed to get Vaolume Label Info.\r
+**/\r
+EFI_FILE_SYSTEM_VOLUME_LABEL *\r
+EfiLibFileSystemVolumeLabelInfo (\r
+  IN EFI_FILE_HANDLE      FHand\r
+  );\r
+\r
+/**\r
+\r
+  Function gets the file information from an open file descriptor, and stores it\r
+  in a buffer allocated from pool.\r
+\r
+  @param FHand           File Handle.\r
+\r
+  @return                A pointer to a buffer with file information or NULL is returned\r
+\r
+**/\r
+EFI_FILE_INFO *\r
+EfiLibFileInfo (\r
+  IN EFI_FILE_HANDLE      FHand\r
+  );\r
+\r
+/**\r
+  Find the first instance of this Protocol in the system and return it's interface.\r
+\r
+  @param ProtocolGuid    Provides the protocol to search for\r
+  @param Interface       On return, a pointer to the first interface\r
+                         that matches ProtocolGuid\r
+\r
+  @retval  EFI_SUCCESS      A protocol instance matching ProtocolGuid was found\r
+  @retval  EFI_NOT_FOUND    No protocol instances were found that match ProtocolGuid\r
+\r
+**/\r
+EFI_STATUS\r
+EfiLibLocateProtocol (\r
+  IN  EFI_GUID        *ProtocolGuid,\r
+  OUT VOID            **Interface\r
+  );\r
+\r
+/**\r
+  Adjusts the size of a previously allocated buffer.\r
+\r
+  @param OldPool         A pointer to the buffer whose size is being adjusted.\r
+  @param OldSize         The size of the current buffer.\r
+  @param NewSize         The size of the new buffer.\r
+\r
+  @return   The newly allocated buffer. if NULL, allocation failed.\r
+\r
+**/\r
+VOID*\r
+EfiReallocatePool (\r
+  IN VOID                 *OldPool,\r
+  IN UINTN                OldSize,\r
+  IN UINTN                NewSize\r
+  );\r
+\r
+/**\r
+  Function deletes the variable specified by VarName and VarGuid.\r
+\r
+\r
+  @param VarName            A Null-terminated Unicode string that is\r
+                            the name of the vendor's variable.\r
+                         \r
+  @param VarGuid            A unique identifier for the vendor.\r
+\r
+  @retval  EFI_SUCCESS           The variable was found and removed\r
+  @retval  EFI_UNSUPPORTED       The variable store was inaccessible\r
+  @retval  EFI_OUT_OF_RESOURCES  The temporary buffer was not available\r
+  @retval  EFI_NOT_FOUND         The variable was not found\r
+\r
+**/\r
+EFI_STATUS\r
+EfiLibDeleteVariable (\r
+  IN CHAR16   *VarName,\r
+  IN EFI_GUID *VarGuid\r
+  );\r
+\r
+/**\r
+  Duplicate a string.\r
+\r
+  @param Src             The source.\r
+\r
+  @return A new string which is duplicated copy of the source.\r
+  @retval NULL If there is not enough memory.\r
+\r
+**/\r
+CHAR16                            *\r
+EfiStrDuplicate (\r
+  IN CHAR16   *Src\r
+  );\r
+\r
+/**\r
+  Function is used to determine the number of device path instances\r
+  that exist in a device path.\r
+\r
+\r
+  @param DevicePath      A pointer to a device path data structure.\r
+\r
+  @return This function counts and returns the number of device path instances\r
+          in DevicePath.\r
+\r
+**/\r
+UINTN\r
+EfiDevicePathInstanceCount (\r
+  IN EFI_DEVICE_PATH_PROTOCOL      *DevicePath\r
+  );\r
+\r
+/**\r
+  Create string tokens for a menu from its help strings and display strings\r
+\r
+\r
+  @param CallbackData    The BMM context data.\r
+  @param HiiHandle       Hii Handle of the package to be updated.\r
+  @param MenuOption      The Menu whose string tokens need to be created\r
+\r
+  @retval  EFI_SUCCESS      string tokens created successfully\r
+  @retval  others           contain some errors\r
+\r
+**/\r
+EFI_STATUS\r
+CreateMenuStringToken (\r
+  IN BMM_CALLBACK_DATA                *CallbackData,\r
+  IN EFI_HII_HANDLE                   HiiHandle,\r
+  IN BM_MENU_OPTION                   *MenuOption\r
+  );\r
+\r
+/**\r
+  Get a string from the Data Hub record based on \r
+  a device path.\r
+\r
+  @param DevPath         The device Path.\r
+\r
+  @return A string located from the Data Hub records based on\r
+          the device path.\r
+  @retval NULL  If failed to get the String from Data Hub.\r
+\r
+**/\r
+UINT16 *\r
+EfiLibStrFromDatahub (\r
+  IN EFI_DEVICE_PATH_PROTOCOL                 *DevPath\r
+  );\r
+\r
+/**\r
+  Get the index number (#### in Boot####) for the boot option pointed to a BBS legacy device type\r
+  specified by DeviceType.\r
+\r
+  @param DeviceType      The legacy device type. It can be floppy, network, harddisk, cdrom,\r
+                         etc.\r
+  @param OptionIndex     Returns the index number (#### in Boot####).\r
+  @param OptionSize      Return the size of the Boot### variable.\r
+\r
+**/\r
+VOID *\r
+GetLegacyBootOptionVar (\r
+  IN  UINTN                            DeviceType,\r
+  OUT UINTN                            *OptionIndex,\r
+  OUT UINTN                            *OptionSize\r
+  );\r
+\r
+/**\r
+  Initialize the Boot Maintenance Utitliy.\r
+\r
+**/\r
+VOID\r
+InitializeBM (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Intialize all the string depositories.\r
+\r
+**/\r
+VOID\r
+InitializeStringDepository (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Fetch a usable string node from the string depository and return the string token.\r
+\r
+\r
+  @param CallbackData       The BMM context data.\r
+  @param StringDepository   Pointer of the string depository.\r
+\r
+  @retval  EFI_STRING_ID    String token.\r
+\r
+**/\r
+EFI_STRING_ID\r
+GetStringTokenFromDepository (\r
+  IN   BMM_CALLBACK_DATA     *CallbackData,\r
+  IN   STRING_DEPOSITORY     *StringDepository\r
+  );\r
+\r
+/**\r
+  Reclaim string depositories by moving the current node pointer to list head..\r
+**/\r
+VOID\r
+ReclaimStringDepository (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Release resource for all the string depositories.\r
+\r
+**/\r
+VOID\r
+CleanUpStringDepository (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Function handling request to apply changes for BMM pages.\r
+\r
+  @param Private            Pointer to callback data buffer.\r
+  @param CurrentFakeNVMap   Pointer to buffer holding data of various values used by BMM\r
+  @param FormId             ID of the form which has sent the request to apply change.\r
+\r
+  @retval  EFI_SUCCESS      Change successfully applied.\r
+  @retval  Other            Error occurs while trying to apply changes.\r
+\r
+**/\r
+EFI_STATUS\r
+ApplyChangeHandler (\r
+  IN  BMM_CALLBACK_DATA               *Private,\r
+  IN  BMM_FAKE_NV_DATA                *CurrentFakeNVMap,\r
+  IN  EFI_FORM_ID                     FormId\r
+  );\r
+\r
+/**\r
+  Discard all changes done to the BMM pages such as Boot Order change,\r
+  Driver order change.\r
+\r
+  @param Private         The BMM context data.\r
+  @param CurrentFakeNVMap The current Fack NV Map.\r
+\r
+**/\r
+VOID\r
+DiscardChangeHandler (\r
+  IN  BMM_CALLBACK_DATA               *Private,\r
+  IN  BMM_FAKE_NV_DATA                *CurrentFakeNVMap\r
+  );\r
+\r
+/**\r
+  Dispatch the display to the next page based on NewPageId.\r
+\r
+  @param Private         The BMM context data.\r
+  @param NewPageId       The original page ID.\r
+\r
+**/\r
+VOID\r
+UpdatePageId (\r
+  BMM_CALLBACK_DATA              *Private,\r
+  UINT16                         NewPageId\r
+  );\r
+\r
+/**\r
+  Boot a file selected by user at File Expoloer of BMM.\r
+\r
+  @param FileContext     The file context data, which contains the device path\r
+                         of the file to be boot from.\r
+\r
+  @retval EFI_SUCCESS    The function completed successfull.\r
+  @return                 Other value if the boot from the file fails.\r
+\r
+**/\r
+EFI_STATUS\r
+BootThisFile (\r
+  IN BM_FILE_CONTEXT                   *FileContext\r
+  );\r
+\r
+/**\r
+  Update the file explower page with the refershed file system.\r
+\r
+\r
+  @param CallbackData    BMM context data\r
+  @param KeyValue        Key value to identify the type of data to expect.\r
+\r
+  @retval  TRUE           Inform the caller to create a callback packet to exit file explorer.\r
+  @retval  FALSE          Indicate that there is no need to exit file explorer.\r
+\r
+**/\r
+BOOLEAN\r
+UpdateFileExplorer (\r
+  IN BMM_CALLBACK_DATA            *CallbackData,\r
+  IN UINT16                       KeyValue\r
+  );\r
+\r
+/**\r
+  This function processes the results of changes in configuration.\r
+  When user select a interactive opcode, this callback will be triggered.\r
+  Based on the Question(QuestionId) that triggers the callback, the corresponding\r
+  actions is performed. It handles:\r
+\r
+  1) the addition of boot option.\r
+  2) the addition of driver option.\r
+  3) exit from file browser\r
+  4) update of file content if a dir is selected.\r
+  5) boot the file if a file is selected in "boot from file"\r
+\r
+\r
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param Action          Specifies the type of action taken by the browser.\r
+  @param QuestionId      A unique value which is sent to the original exporting driver\r
+                         so that it can identify the type of data to expect.\r
+  @param Type            The type of value for the question.\r
+  @param Value           A pointer to the data being sent to the original exporting driver.\r
+  @param ActionRequest   On return, points to the action requested by the callback function.\r
+\r
+  @retval  EFI_SUCCESS           The callback successfully handled the action.\r
+  @retval  EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the variable and its data.\r
+  @retval  EFI_DEVICE_ERROR      The variable could not be saved.\r
+  @retval  EFI_UNSUPPORTED       The specified Action is not supported by the callback.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FileExplorerCallback (\r
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
+  IN  EFI_BROWSER_ACTION                     Action,\r
+  IN  EFI_QUESTION_ID                        QuestionId,\r
+  IN  UINT8                                  Type,\r
+  IN  EFI_IFR_TYPE_VALUE                     *Value,\r
+  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
+  );\r
+\r
+/**\r
+  Remove the installed BootMaint and FileExplorer HiiPackages.\r
+\r
+**/\r
+VOID\r
+FreeBMPackage(\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Install BootMaint and FileExplorer HiiPackages.\r
+\r
+**/\r
+VOID\r
+InitBootMaintenance(\r
+  VOID\r
+  );\r
+\r
+//\r
+// Global variable in this program (defined in data.c)\r
+//\r
+extern BM_MENU_OPTION             BootOptionMenu;\r
+extern BM_MENU_OPTION             DriverOptionMenu;\r
+extern BM_MENU_OPTION             FsOptionMenu;\r
+extern BM_MENU_OPTION             ConsoleInpMenu;\r
+extern BM_MENU_OPTION             ConsoleOutMenu;\r
+extern BM_MENU_OPTION             ConsoleErrMenu;\r
+extern BM_MENU_OPTION             DirectoryMenu;\r
+extern BM_MENU_OPTION             DriverMenu;\r
+extern BM_MENU_OPTION             TerminalMenu;\r
+extern UINT16                     TerminalType[];\r
+extern COM_ATTR                   BaudRateList[19];\r
+extern COM_ATTR                   DataBitsList[4];\r
+extern COM_ATTR                   ParityList[5];\r
+extern COM_ATTR                   StopBitsList[3];\r
+extern EFI_GUID                   TerminalTypeGuid[4];\r
+extern STRING_DEPOSITORY          *FileOptionStrDepository;\r
+extern STRING_DEPOSITORY          *ConsoleOptionStrDepository;\r
+extern STRING_DEPOSITORY          *BootOptionStrDepository;\r
+extern STRING_DEPOSITORY          *BootOptionHelpStrDepository;\r
+extern STRING_DEPOSITORY          *DriverOptionStrDepository;\r
+extern STRING_DEPOSITORY          *DriverOptionHelpStrDepository;\r
+extern STRING_DEPOSITORY          *TerminalStrDepository;\r
+extern EFI_DEVICE_PATH_PROTOCOL   EndDevicePath[];\r
+\r
+//\r
+// Shared IFR form update data\r
+//\r
+extern VOID                        *mStartOpCodeHandle;\r
+extern VOID                        *mEndOpCodeHandle;\r
+extern EFI_IFR_GUID_LABEL          *mStartLabel;\r
+extern EFI_IFR_GUID_LABEL          *mEndLabel;\r
+\r
+#endif\r