Revision: 18111
          http://sourceforge.net/p/edk2/code/18111
Author:   ydong10
Date:     2015-07-30 03:41:35 +0000 (Thu, 30 Jul 2015)
Log Message:
-----------
UiApp code split from   IntelFrameworkModulePkg/Universal/BdsDxe driver.

This is the UI part of the old BdsDxe driver, also remove the legacy boot 
option related code.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <[email protected]>
Reviewed-by: Ruiyu Ni <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/MdeModulePkg.dec
    trunk/edk2/MdeModulePkg/MdeModulePkg.dsc

Added Paths:
-----------
    trunk/edk2/MdeModulePkg/Application/UiApp/
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/Bm.vfr
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/BmLib.c
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/Bmstring.uni
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.c
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.h
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/BootOption.c
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/ConsoleOption.c
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/Data.c
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/FE.vfr
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/FileExplorer.c
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/FormGuid.h
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/UpdatePage.c
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/Variable.c
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMngr/
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMngr/BootManager.c
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMngr/BootManager.h
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMngr/BootManagerStrings.uni
    trunk/edk2/MdeModulePkg/Application/UiApp/BootMngr/BootManagerVfr.Vfr
    trunk/edk2/MdeModulePkg/Application/UiApp/DeviceMngr/
    trunk/edk2/MdeModulePkg/Application/UiApp/DeviceMngr/DeviceManager.c
    trunk/edk2/MdeModulePkg/Application/UiApp/DeviceMngr/DeviceManager.h
    
trunk/edk2/MdeModulePkg/Application/UiApp/DeviceMngr/DeviceManagerStrings.uni
    trunk/edk2/MdeModulePkg/Application/UiApp/DeviceMngr/DeviceManagerVfr.Vfr
    trunk/edk2/MdeModulePkg/Application/UiApp/DeviceMngr/DriverHealthVfr.Vfr
    trunk/edk2/MdeModulePkg/Application/UiApp/FormsetGuid.h
    trunk/edk2/MdeModulePkg/Application/UiApp/FrontPage.c
    trunk/edk2/MdeModulePkg/Application/UiApp/FrontPage.h
    trunk/edk2/MdeModulePkg/Application/UiApp/FrontPageStrings.uni
    trunk/edk2/MdeModulePkg/Application/UiApp/FrontPageVfr.Vfr
    trunk/edk2/MdeModulePkg/Application/UiApp/Language.c
    trunk/edk2/MdeModulePkg/Application/UiApp/Language.h
    trunk/edk2/MdeModulePkg/Application/UiApp/String.c
    trunk/edk2/MdeModulePkg/Application/UiApp/String.h
    trunk/edk2/MdeModulePkg/Application/UiApp/Strings.uni
    trunk/edk2/MdeModulePkg/Application/UiApp/Ui.h
    trunk/edk2/MdeModulePkg/Application/UiApp/UiApp.inf
    trunk/edk2/MdeModulePkg/Include/Guid/HiiBootMaintenanceFormset.h

Added: trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/Bm.vfr
===================================================================
--- trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/Bm.vfr                  
        (rev 0)
+++ trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/Bm.vfr  2015-07-30 
03:41:35 UTC (rev 18111)
@@ -0,0 +1,352 @@
+///** @file
+//  
+//    Boot Maintenance Utility Formset
+//  
+//  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+//  This program and the accompanying materials
+//  are licensed and made available under the terms and conditions of the BSD 
License
+//  which accompanies this distribution.  The full text of the license may be 
found at
+//  http://opensource.org/licenses/bsd-license.php
+//  
+//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.
+//  
+//**/
+
+#include "FormGuid.h"
+
+formset
+  guid = BOOT_MAINT_FORMSET_GUID,
+  title = STRING_TOKEN(STR_FORM_MAIN_TITLE),
+  help = STRING_TOKEN(STR_NULL_STRING),
+  classguid = BOOT_MAINT_FORMSET_GUID,
+
+  varstore BMM_FAKE_NV_DATA,
+    varid = VARSTORE_ID_BOOT_MAINT,
+    name = BmmData,
+    guid = BOOT_MAINT_FORMSET_GUID;
+
+  form formid = FORM_MAIN_ID,
+       title = STRING_TOKEN(STR_FORM_MAIN_TITLE);
+
+    goto FORM_BOOT_SETUP_ID,
+         prompt = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE),
+         help = STRING_TOKEN(STR_FORM_BOOT_SETUP_HELP),
+         flags = INTERACTIVE,
+         key = FORM_BOOT_SETUP_ID;
+
+    subtitle text = STRING_TOKEN(STR_NULL_STRING);
+
+    goto FORM_DRIVER_SETUP_ID,
+         prompt = STRING_TOKEN(STR_FORM_DRIVER_SETUP_TITLE),
+         help = STRING_TOKEN(STR_FORM_DRIVER_SETUP_HELP),
+         flags = INTERACTIVE,
+         key = FORM_DRIVER_SETUP_ID;
+
+    subtitle text = STRING_TOKEN(STR_NULL_STRING);
+
+    goto FORM_CON_MAIN_ID,
+         prompt = STRING_TOKEN(STR_FORM_CON_MAIN_TITLE),
+         help = STRING_TOKEN(STR_FORM_CON_MAIN_HELP),
+         flags = INTERACTIVE,
+         key = FORM_CON_MAIN_ID;
+
+    subtitle text = STRING_TOKEN(STR_NULL_STRING);
+
+    goto
+         formsetguid = FILE_EXPLORE_FORMSET_GUID,
+         formid = 0,
+         question = 0,
+         prompt = STRING_TOKEN(STR_BOOT_FROM_FILE),
+         help   = STRING_TOKEN(STR_BOOT_FROM_FILE_HELP),
+         flags  = INTERACTIVE,
+         key    = KEY_VALUE_BOOT_FROM_FILE;
+
+    subtitle text = STRING_TOKEN(STR_NULL_STRING);
+
+//    label FORM_MAIN_ID;
+
+    goto FORM_BOOT_NEXT_ID,
+         prompt = STRING_TOKEN(STR_FORM_BOOT_NEXT_TITLE),
+         help = STRING_TOKEN(STR_FORM_BOOT_NEXT_HELP),
+         flags = INTERACTIVE,
+         key = FORM_BOOT_NEXT_ID;
+
+    goto FORM_TIME_OUT_ID,
+         prompt = STRING_TOKEN(STR_FORM_TIME_OUT_TITLE),
+         help = STRING_TOKEN(STR_FORM_TIME_OUT_HELP),
+         flags = INTERACTIVE,
+         key = FORM_TIME_OUT_ID;
+         
+    label LABEL_BMM_PLATFORM_INFORMATION;
+    //
+    // This is where we will dynamically add a Action type op-code to show 
+    // the platform information.
+    //
+    
+    //
+    // This is where we will dynamically add a Action type op-code to show 
+    // the advanced menu.
+    //
+    
+    //
+    // This is where we will dynamically add a Action type op-code to show 
+    // the intel test menu.
+    //
+    label LABEL_END; 
+  endform;
+
+  form formid = FORM_BOOT_SETUP_ID,
+       title = STRING_TOKEN(STR_FORM_BOOT_SETUP_TITLE);
+
+       goto FORM_MAIN_ID,
+            prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),
+            help = STRING_TOKEN(STR_FORM_GOTO_MAIN);
+            //flags = INTERACTIVE,
+            //key = FORM_MAIN_ID;
+
+       goto
+            formsetguid = FILE_EXPLORE_FORMSET_GUID,
+            formid = 0,
+            question = 0,
+            prompt = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE),
+            help = STRING_TOKEN(STR_FORM_BOOT_ADD_HELP),
+            flags = INTERACTIVE,
+            key = FORM_BOOT_ADD_ID;
+
+       goto FORM_BOOT_DEL_ID,
+            prompt = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE),
+            help = STRING_TOKEN(STR_FORM_BOOT_IMMEDIATE_HELP),
+            flags = INTERACTIVE,
+            key = FORM_BOOT_DEL_ID;
+
+       goto FORM_BOOT_CHG_ID,
+            prompt = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE),
+            help = STRING_TOKEN(STR_FORM_BOOT_IMMEDIATE_HELP),
+            flags = INTERACTIVE,
+            key = FORM_BOOT_CHG_ID;
+  endform;
+
+  form formid = FORM_DRIVER_SETUP_ID,
+       title = STRING_TOKEN(STR_FORM_DRIVER_SETUP_TITLE);
+
+       goto FORM_MAIN_ID,
+            prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),
+            help = STRING_TOKEN(STR_FORM_GOTO_MAIN);
+            //help = STRING_TOKEN(STR_FORM_GOTO_MAIN),
+            //flags = INTERACTIVE,
+            //key = FORM_MAIN_ID;
+
+       goto FORM_DRV_ADD_ID,
+            prompt = STRING_TOKEN(STR_FORM_DRV_ADD_TITLE),
+            help = STRING_TOKEN(STR_FORM_DRV_ADD_HELP),
+            flags = INTERACTIVE,
+            key = FORM_DRV_ADD_ID;
+
+       goto FORM_DRV_DEL_ID,
+            prompt = STRING_TOKEN(STR_FORM_DRV_DEL_TITLE),
+            help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),
+            flags = INTERACTIVE,
+            key = FORM_DRV_DEL_ID;
+
+       goto FORM_DRV_CHG_ID,
+            prompt = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE),
+            help = STRING_TOKEN(STR_FORM_NEXT_BOOT_HELP),
+            flags = INTERACTIVE,
+            key = FORM_DRV_CHG_ID;
+  endform;
+
+  form formid = FORM_BOOT_DEL_ID,
+       title = STRING_TOKEN(STR_FORM_BOOT_DEL_TITLE);
+
+       label FORM_BOOT_DEL_ID;
+       label LABEL_END;
+  endform;
+
+  form formid = FORM_BOOT_CHG_ID,
+       title = STRING_TOKEN(STR_FORM_BOOT_CHG_TITLE);
+
+       label FORM_BOOT_CHG_ID;
+       label LABEL_END;
+
+  endform;
+
+  form formid = FORM_BOOT_NEXT_ID,
+       title = STRING_TOKEN(STR_FORM_BOOT_NEXT_TITLE);
+
+       label FORM_BOOT_NEXT_ID;
+       label LABEL_END;
+  endform;
+
+  form formid = FORM_TIME_OUT_ID,
+       title = STRING_TOKEN(STR_FORM_TIME_OUT_TITLE);
+
+       label FORM_TIME_OUT_ID;
+       label LABEL_END;
+  endform;
+
+  form formid = FORM_MEMORY_CHECK_ID,
+       title = STRING_TOKEN(STR_FORM_MEMORY_CHECK_TITLE);
+
+       label FORM_MEMORY_CHECK_ID;
+       label LABEL_END;
+  endform;
+
+  form formid = FORM_UEFI_OPTIMIZED_BOOT_ID,
+       title = STRING_TOKEN(STR_FORM_UEFI_OPTIMIZED_BOOT_TITLE);
+
+       label FORM_UEFI_OPTIMIZED_BOOT_ID;
+       label LABEL_END;
+  endform;
+
+  form formid = FORM_DRV_ADD_ID,
+       title = STRING_TOKEN(STR_FORM_DRV_ADD_TITLE);
+
+       goto FORM_MAIN_ID,
+            prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),
+            help = STRING_TOKEN(STR_FORM_GOTO_MAIN);
+            //flags = INTERACTIVE,
+            //key = FORM_MAIN_ID;
+
+       goto
+            formsetguid = FILE_EXPLORE_FORMSET_GUID,
+            formid = 0,
+            question = 0,
+            prompt = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE),
+            help = STRING_TOKEN(STR_FORM_DRV_ADD_FILE_TITLE),
+            flags = INTERACTIVE,
+            key = FORM_DRV_ADD_FILE_ID;
+
+  endform;
+
+  form formid = FORM_DRV_DEL_ID,
+       title = STRING_TOKEN(STR_FORM_DRV_DEL_TITLE);
+
+       label FORM_DRV_DEL_ID;
+       label LABEL_END;
+
+  endform;
+
+  form formid = FORM_DRV_CHG_ID,
+       title = STRING_TOKEN(STR_FORM_DRV_CHG_TITLE);
+
+       label FORM_DRV_CHG_ID;
+       label LABEL_END;
+
+  endform;
+
+  form formid = FORM_CON_MAIN_ID,
+       title = STRING_TOKEN(STR_FORM_CON_MAIN_TITLE);
+
+       goto FORM_MAIN_ID,
+       prompt = STRING_TOKEN(STR_FORM_GOTO_MAIN),
+       help = STRING_TOKEN(STR_FORM_GOTO_MAIN);
+       //flags = INTERACTIVE,
+       //key = FORM_MAIN_ID;
+
+       goto FORM_CON_IN_ID,
+       prompt = STRING_TOKEN(STR_FORM_CON_IN_TITLE),
+       help = STRING_TOKEN(STR_FORM_CON_IN_HELP),
+       flags = INTERACTIVE,
+       key = FORM_CON_IN_ID;
+
+       goto FORM_CON_OUT_ID,
+       prompt = STRING_TOKEN(STR_FORM_CON_OUT_TITLE),
+       help = STRING_TOKEN(STR_FORM_CON_OUT_HELP),
+       flags = INTERACTIVE,
+       key = FORM_CON_OUT_ID;
+
+       goto FORM_CON_ERR_ID,
+       prompt = STRING_TOKEN(STR_FORM_STD_ERR_TITLE),
+       help = STRING_TOKEN(STR_FORM_STD_ERR_HELP),
+       flags = INTERACTIVE,
+       key = FORM_CON_ERR_ID;
+
+       goto FORM_CON_MODE_ID,
+       prompt = STRING_TOKEN(STR_FORM_MODE_TITLE),
+       help = STRING_TOKEN(STR_FORM_MODE_HELP),
+       flags = INTERACTIVE,
+       key = FORM_CON_MODE_ID;
+
+       goto FORM_CON_COM_ID,
+       prompt = STRING_TOKEN(STR_FORM_COM_TITLE),
+       help = STRING_TOKEN(STR_FORM_COM_HELP),
+       flags = INTERACTIVE,
+       key = FORM_CON_COM_ID;
+  endform;
+
+  form formid = FORM_CON_MODE_ID,
+       title = STRING_TOKEN(STR_FORM_MODE_TITLE);
+
+       label FORM_CON_MODE_ID;
+       label LABEL_END;
+  endform;
+
+  form formid = FORM_CON_COM_ID,
+       title = STRING_TOKEN(STR_FORM_COM_TITLE);
+
+       label FORM_CON_COM_ID;
+       label LABEL_END;
+  endform;
+
+  form formid = FORM_CON_COM_SETUP_ID,
+       title = STRING_TOKEN(STR_CON_COM_SETUP);
+
+       label FORM_CON_COM_SETUP_ID;
+       label LABEL_END;
+  endform;
+
+  form formid = FORM_FILE_SEEK_ID,
+       title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);
+
+       label FORM_FILE_SEEK_ID;
+       label LABEL_END;
+  endform;
+
+  form formid = FORM_FILE_NEW_SEEK_ID,
+       title = STRING_TOKEN(STR_FORM_BOOT_ADD_TITLE);
+
+       label FORM_FILE_NEW_SEEK_ID;
+       label LABEL_END;
+  endform;
+
+  form formid = FORM_DRV_ADD_HANDLE_ID,
+       title = STRING_TOKEN(STR_FORM_DRV_ADD_HANDLE_TITLE);
+
+       label FORM_DRV_ADD_HANDLE_ID;
+       label LABEL_END;
+  endform;
+
+  form formid = FORM_DRV_ADD_HANDLE_DESC_ID,
+       title = STRING_TOKEN(STR_FORM_DRV_ADD_DESC_TITLE);
+
+       label FORM_DRV_ADD_HANDLE_DESC_ID;
+       label LABEL_END;
+
+  endform;
+
+  form formid = FORM_CON_IN_ID,
+       title = STRING_TOKEN(STR_FORM_CON_IN_TITLE);
+
+       label FORM_CON_IN_ID;
+       label LABEL_END;
+
+  endform;
+
+  form formid = FORM_CON_OUT_ID,
+       title = STRING_TOKEN(STR_FORM_CON_OUT_TITLE);
+
+       label FORM_CON_OUT_ID;
+       label LABEL_END;
+
+  endform;
+
+  form formid = FORM_CON_ERR_ID,
+       title = STRING_TOKEN(STR_FORM_STD_ERR_TITLE);
+
+       label FORM_CON_ERR_ID;
+       label LABEL_END;
+
+  endform;
+
+endformset;

Added: trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/BmLib.c
===================================================================
--- trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/BmLib.c                 
        (rev 0)
+++ trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/BmLib.c 2015-07-30 
03:41:35 UTC (rev 18111)
@@ -0,0 +1,369 @@
+/** @file
+  Utility routines used by boot maintenance modules.
+
+Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD 
License
+which accompanies this distribution.  The full text of the license may be 
found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "BootMaint.h"
+
+/**
+
+  Find the first instance of this Protocol
+  in the system and return it's interface.
+
+
+  @param ProtocolGuid    Provides the protocol to search for
+  @param Interface       On return, a pointer to the first interface
+                         that matches ProtocolGuid
+
+  @retval  EFI_SUCCESS      A protocol instance matching ProtocolGuid was found
+  @retval  EFI_NOT_FOUND    No protocol instances were found that match 
ProtocolGuid
+
+**/
+EFI_STATUS
+EfiLibLocateProtocol (
+  IN  EFI_GUID    *ProtocolGuid,
+  OUT VOID        **Interface
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = gBS->LocateProtocol (
+                  ProtocolGuid,
+                  NULL,
+                  (VOID **) Interface
+                  );
+  return Status;
+}
+
+/**
+
+  Function opens and returns a file handle to the root directory of a volume.
+
+  @param DeviceHandle    A handle for a device
+
+  @return A valid file handle or NULL is returned
+
+**/
+EFI_FILE_HANDLE
+EfiLibOpenRoot (
+  IN EFI_HANDLE                   DeviceHandle
+  )
+{
+  EFI_STATUS                      Status;
+  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Volume;
+  EFI_FILE_HANDLE                 File;
+
+  File = NULL;
+
+  //
+  // File the file system interface to the device
+  //
+  Status = gBS->HandleProtocol (
+                  DeviceHandle,
+                  &gEfiSimpleFileSystemProtocolGuid,
+                  (VOID *) &Volume
+                  );
+
+  //
+  // Open the root directory of the volume
+  //
+  if (!EFI_ERROR (Status)) {
+    Status = Volume->OpenVolume (
+                      Volume,
+                      &File
+                      );
+  }
+  //
+  // Done
+  //
+  return EFI_ERROR (Status) ? NULL : File;
+}
+
+/**
+
+  Helper function called as part of the code needed
+  to allocate the proper sized buffer for various
+  EFI interfaces.
+
+
+  @param Status          Current status
+  @param Buffer          Current allocated buffer, or NULL
+  @param BufferSize      Current buffer size needed
+
+  @retval  TRUE  if the buffer was reallocated and the caller
+                 should try the API again.
+  @retval  FALSE The caller should not call this function again.
+
+**/
+BOOLEAN
+EfiGrowBuffer (
+  IN OUT EFI_STATUS   *Status,
+  IN OUT VOID         **Buffer,
+  IN UINTN            BufferSize
+  )
+{
+  BOOLEAN TryAgain;
+
+  //
+  // If this is an initial request, buffer will be null with a new buffer size
+  //
+  if ((*Buffer == NULL) && (BufferSize != 0)) {
+    *Status = EFI_BUFFER_TOO_SMALL;
+  }
+  //
+  // If the status code is "buffer too small", resize the buffer
+  //
+  TryAgain = FALSE;
+  if (*Status == EFI_BUFFER_TOO_SMALL) {
+
+    if (*Buffer != NULL) {
+      FreePool (*Buffer);
+    }
+
+    *Buffer = AllocateZeroPool (BufferSize);
+
+    if (*Buffer != NULL) {
+      TryAgain = TRUE;
+    } else {
+      *Status = EFI_OUT_OF_RESOURCES;
+    }
+  }
+  //
+  // If there's an error, free the buffer
+  //
+  if (!TryAgain && EFI_ERROR (*Status) && (*Buffer != NULL)) {
+    FreePool (*Buffer);
+    *Buffer = NULL;
+  }
+
+  return TryAgain;
+}
+
+
+/**
+  Function deletes the variable specified by VarName and VarGuid.
+
+  @param VarName           A Null-terminated Unicode string that is
+                           the name of the vendor's variable.
+                         
+  @param VarGuid           A unique identifier for the vendor.
+
+  @retval  EFI_SUCCESS           The variable was found and removed
+  @retval  EFI_UNSUPPORTED       The variable store was inaccessible
+  @retval  EFI_NOT_FOUND         The variable was not found
+
+**/
+EFI_STATUS
+EfiLibDeleteVariable (
+  IN CHAR16   *VarName,
+  IN EFI_GUID *VarGuid
+  )
+{
+  return gRT->SetVariable (
+                VarName,
+                VarGuid,
+                0,
+                0,
+                NULL
+                );
+}
+
+/**
+
+  Function gets the file system information from an open file descriptor,
+  and stores it in a buffer allocated from pool.
+
+
+  @param FHand           The file handle.
+
+  @return                A pointer to a buffer with file information.
+  @retval                NULL is returned if failed to get Vaolume Label Info.
+
+**/
+EFI_FILE_SYSTEM_VOLUME_LABEL *
+EfiLibFileSystemVolumeLabelInfo (
+  IN EFI_FILE_HANDLE      FHand
+  )
+{
+  EFI_STATUS                        Status;
+  EFI_FILE_SYSTEM_VOLUME_LABEL      *Buffer;
+  UINTN                             BufferSize;
+  //
+  // Initialize for GrowBuffer loop
+  //
+  Buffer      = NULL;
+  BufferSize  = SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL + 200;
+
+  //
+  // Call the real function
+  //
+  while (EfiGrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {
+    Status = FHand->GetInfo (
+                      FHand,
+                      &gEfiFileSystemVolumeLabelInfoIdGuid,
+                      &BufferSize,
+                      Buffer
+                      );
+  }
+
+  return Buffer;
+}
+
+/**
+  Duplicate a string.
+
+  @param Src             The source.
+
+  @return A new string which is duplicated copy of the source.
+  @retval NULL If there is not enough memory.
+
+**/
+CHAR16 *
+EfiStrDuplicate (
+  IN CHAR16   *Src
+  )
+{
+  CHAR16  *Dest;
+  UINTN   Size;
+
+  Size  = StrSize (Src);
+  Dest  = AllocateZeroPool (Size);
+  ASSERT (Dest != NULL);
+  if (Dest != NULL) {
+    CopyMem (Dest, Src, Size);
+  }
+
+  return Dest;
+}
+
+/**
+
+  Function gets the file information from an open file descriptor, and stores 
it
+  in a buffer allocated from pool.
+
+  @param FHand           File Handle.
+
+  @return                A pointer to a buffer with file information or NULL 
is returned
+
+**/
+EFI_FILE_INFO *
+EfiLibFileInfo (
+  IN EFI_FILE_HANDLE      FHand
+  )
+{
+  EFI_STATUS    Status;
+  EFI_FILE_INFO *Buffer;
+  UINTN         BufferSize;
+
+  //
+  // Initialize for GrowBuffer loop
+  //
+  Buffer      = NULL;
+  BufferSize  = SIZE_OF_EFI_FILE_INFO + 200;
+
+  //
+  // Call the real function
+  //
+  while (EfiGrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) {
+    Status = FHand->GetInfo (
+                      FHand,
+                      &gEfiFileInfoGuid,
+                      &BufferSize,
+                      Buffer
+                      );
+  }
+
+  return Buffer;
+}
+
+/**
+  Function is used to determine the number of device path instances
+  that exist in a device path.
+
+
+  @param DevicePath      A pointer to a device path data structure.
+
+  @return This function counts and returns the number of device path instances
+          in DevicePath.
+
+**/
+UINTN
+EfiDevicePathInstanceCount (
+  IN EFI_DEVICE_PATH_PROTOCOL      *DevicePath
+  )
+{
+  UINTN Count;
+  UINTN Size;
+
+  Count = 0;
+  while (GetNextDevicePathInstance (&DevicePath, &Size) != NULL) {
+    Count += 1;
+  }
+
+  return Count;
+}
+
+/**
+  Adjusts the size of a previously allocated buffer.
+
+
+  @param OldPool         - A pointer to the buffer whose size is being 
adjusted.
+  @param OldSize         - The size of the current buffer.
+  @param NewSize         - The size of the new buffer.
+
+  @return   The newly allocated buffer.
+  @retval   NULL  Allocation failed.
+
+**/
+VOID *
+EfiReallocatePool (
+  IN VOID                 *OldPool,
+  IN UINTN                OldSize,
+  IN UINTN                NewSize
+  )
+{
+  VOID  *NewPool;
+
+  NewPool = NULL;
+  if (NewSize != 0) {
+    NewPool = AllocateZeroPool (NewSize);
+  }
+
+  if (OldPool != NULL) {
+    if (NewPool != NULL) {
+      CopyMem (NewPool, OldPool, OldSize < NewSize ? OldSize : NewSize);
+    }
+
+    FreePool (OldPool);
+  }
+
+  return NewPool;
+}
+
+/**
+  Get a string from the Data Hub record based on 
+  a device path.
+
+  @param DevPath         The device Path.
+
+  @return A string located from the Data Hub records based on
+          the device path.
+  @retval NULL  If failed to get the String from Data Hub.
+
+**/
+UINT16 *
+EfiLibStrFromDatahub (
+  IN EFI_DEVICE_PATH_PROTOCOL                 *DevPath
+  )
+{
+  return NULL;
+}

Added: trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/Bmstring.uni
===================================================================
(Binary files differ)

Index: trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/Bmstring.uni
===================================================================
--- trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/Bmstring.uni    
2015-07-29 16:17:27 UTC (rev 18110)
+++ trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/Bmstring.uni    
2015-07-30 03:41:35 UTC (rev 18111)

Property changes on: 
trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/Bmstring.uni
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.c
===================================================================
--- trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.c             
                (rev 0)
+++ trunk/edk2/MdeModulePkg/Application/UiApp/BootMaint/BootMaint.c     
2015-07-30 03:41:35 UTC (rev 18111)
@@ -0,0 +1,1407 @@
+/** @file
+  The functions for Boot Maintainence Main menu.
+
+Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD 
License
+which accompanies this distribution.  The full text of the license may be 
found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "BootMaint.h"
+
+EFI_DEVICE_PATH_PROTOCOL  EndDevicePath[] = {
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    {
+      END_DEVICE_PATH_LENGTH,
+      0
+    }
+  }
+};
+
+HII_VENDOR_DEVICE_PATH  mBmmHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {165A028F-0BB2-4b5f-8747-77592E3F6499}
+    //
+    { 0x165a028f, 0xbb2, 0x4b5f, { 0x87, 0x47, 0x77, 0x59, 0x2e, 0x3f, 0x64, 
0x99 } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
+HII_VENDOR_DEVICE_PATH  mFeHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    //
+    // {91DB4238-B0C8-472e-BBCF-F3A6541010F4}
+    //
+    { 0x91db4238, 0xb0c8, 0x472e, { 0xbb, 0xcf, 0xf3, 0xa6, 0x54, 0x10, 0x10, 
0xf4 } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    { 
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
+EFI_GUID mBootMaintGuid          = BOOT_MAINT_FORMSET_GUID;
+EFI_GUID mFileExplorerGuid       = FILE_EXPLORE_FORMSET_GUID;
+
+CHAR16  mBootMaintStorageName[]     = L"BmmData";
+CHAR16  mFileExplorerStorageName[]  = L"FeData";
+BMM_CALLBACK_DATA *mBmmCallbackInfo = NULL;
+BOOLEAN  mAllMenuInit               = FALSE;
+BOOLEAN  mEnterFileExplorer         = FALSE;
+
+/**
+  Init all memu.
+
+  @param CallbackData    The BMM context data.
+
+**/
+VOID
+InitAllMenu (
+  IN  BMM_CALLBACK_DATA    *CallbackData
+  );
+
+/**
+  Free up all Menu Option list.
+
+**/
+VOID
+FreeAllMenu (
+  VOID
+  );
+
+/**
+  Create string tokens for a menu from its help strings and display strings
+
+  @param CallbackData       The BMM context data.
+  @param HiiHandle          Hii Handle of the package to be updated.
+  @param MenuOption         The Menu whose string tokens need to be created
+
+  @retval  EFI_SUCCESS      String tokens created successfully
+  @retval  others           contain some errors
+**/
+EFI_STATUS
+CreateMenuStringToken (
+  IN BMM_CALLBACK_DATA                *CallbackData,
+  IN EFI_HII_HANDLE                   HiiHandle,
+  IN BM_MENU_OPTION                   *MenuOption
+  )
+{
+  BM_MENU_ENTRY *NewMenuEntry;
+  UINTN         Index;
+
+  for (Index = 0; Index < MenuOption->MenuNumber; Index++) {
+    NewMenuEntry = BOpt_GetMenuEntry (MenuOption, Index);
+
+    NewMenuEntry->DisplayStringToken = HiiSetString (
+                                         HiiHandle,
+                                         0,
+                                         NewMenuEntry->DisplayString,
+                                         NULL
+                                         );
+
+    if (NULL == NewMenuEntry->HelpString) {
+      NewMenuEntry->HelpStringToken = NewMenuEntry->DisplayStringToken;
+    } else {
+      NewMenuEntry->HelpStringToken = HiiSetString (
+                                        HiiHandle,
+                                        0,
+                                        NewMenuEntry->HelpString,
+                                        NULL
+                                        );
+    }
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  This function allows a caller to extract the current configuration for one
+  or more named elements from the target driver.
+
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Request         A null-terminated Unicode string in <ConfigRequest> 
format.
+  @param Progress        On return, points to a character in the Request 
string.
+                         Points to the string's null terminator if request was 
successful.
+                         Points to the most recent '&' before the first 
failing name/value
+                         pair (or the beginning of the string if the failure 
is in the
+                         first name/value pair) if the request was not 
successful.
+  @param Results         A null-terminated Unicode string in <ConfigAltResp> 
format which
+                         has all values filled in for the names in the Request 
string.
+                         String to be allocated by the called function.
+
+  @retval  EFI_SUCCESS            The Results is filled with the requested 
values.
+  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.
+  @retval  EFI_INVALID_PARAMETER  Request is NULL, illegal syntax, or unknown 
name.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in 
this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+BootMaintExtractConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Request,
+  OUT EFI_STRING                             *Progress,
+  OUT EFI_STRING                             *Results
+  )
+{
+  EFI_STATUS         Status;
+  UINTN              BufferSize;
+  BMM_CALLBACK_DATA  *Private;
+  EFI_STRING                       ConfigRequestHdr;
+  EFI_STRING                       ConfigRequest;
+  BOOLEAN                          AllocatedRequest;
+  UINTN                            Size;
+
+  if (Progress == NULL || Results == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  *Progress = Request;
+  if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &mBootMaintGuid, 
mBootMaintStorageName)) {
+    return EFI_NOT_FOUND;
+  }
+
+  ConfigRequestHdr = NULL;
+  ConfigRequest    = NULL;
+  AllocatedRequest = FALSE;
+  Size             = 0;
+
+  Private = BMM_CALLBACK_DATA_FROM_THIS (This);
+  //
+  // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
+  //
+  BufferSize = sizeof (BMM_FAKE_NV_DATA);
+  ConfigRequest = Request;
+  if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
+    //
+    // Request has no request element, construct full request string.
+    // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
+    // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a 
Null-terminator
+    //
+    ConfigRequestHdr = HiiConstructConfigHdr (&mBootMaintGuid, 
mBootMaintStorageName, Private->BmmDriverHandle);
+    Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
+    ConfigRequest = AllocateZeroPool (Size);
+    ASSERT (ConfigRequest != NULL);
+    AllocatedRequest = TRUE;
+    UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", 
ConfigRequestHdr, (UINT64)BufferSize);
+    FreePool (ConfigRequestHdr);
+  }
+
+  Status = gHiiConfigRouting->BlockToConfig (
+                                gHiiConfigRouting,
+                                ConfigRequest,
+                                (UINT8 *) &Private->BmmFakeNvData,
+                                BufferSize,
+                                Results,
+                                Progress
+                                );
+  //
+  // Free the allocated config request string.
+  //
+  if (AllocatedRequest) {
+    FreePool (ConfigRequest);
+    ConfigRequest = NULL;
+  }
+  //
+  // Set Progress string to the original request string.
+  //
+  if (Request == NULL) {
+    *Progress = NULL;
+  } else if (StrStr (Request, L"OFFSET") == NULL) {
+    *Progress = Request + StrLen (Request);
+  }
+
+  return Status;
+}
+
+/**
+  This function applies changes in a driver's configuration.
+  Input is a Configuration, which has the routing data for this
+  driver followed by name / value configuration pairs. The driver
+  must apply those pairs to its configurable storage. If the
+  driver's configuration is stored in a linear block of data
+  and the driver's name / value pairs are in <BlockConfig>
+  format, it may use the ConfigToBlock helper function (above) to
+  simplify the job. Currently not implemented.
+
+  @param[in]  This                Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param[in]  Configuration       A null-terminated Unicode string in
+                                  <ConfigString> format.   
+  @param[out] Progress            A pointer to a string filled in with the
+                                  offset of the most recent '&' before the
+                                  first failing name / value pair (or the
+                                  beginn ing of the string if the failure
+                                  is in the first name / value pair) or
+                                  the terminating NULL if all was
+                                  successful.
+
+  @retval EFI_SUCCESS             The results have been distributed or are
+                                  awaiting distribution.  
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the
+                                  parts of the results that must be
+                                  stored awaiting possible future
+                                  protocols.
+  @retval EFI_INVALID_PARAMETERS  Passing in a NULL for the
+                                  Results parameter would result
+                                  in this type of error.
+  @retval EFI_NOT_FOUND           Target for the specified routing data
+                                  was not found.
+**/
+EFI_STATUS
+EFIAPI
+BootMaintRouteConfig (
+  IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
+  IN CONST EFI_STRING                     Configuration,
+  OUT EFI_STRING                          *Progress
+  )
+{
+  EFI_STATUS                      Status;
+  UINTN                           BufferSize;
+  EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;
+  BMM_FAKE_NV_DATA                *NewBmmData;
+  BMM_FAKE_NV_DATA                *OldBmmData;
+  BM_MENU_ENTRY                   *NewMenuEntry;
+  BM_LOAD_CONTEXT                 *NewLoadContext;
+  UINT16                          Index;  
+  BMM_CALLBACK_DATA               *Private; 
+
+  if (Progress == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+  *Progress = Configuration;
+
+  if (Configuration == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  //
+  // Check routing data in <ConfigHdr>.
+  // Note: there is no name for Name/Value storage, only GUID will be checked
+  //
+  if (!HiiIsConfigHdrMatch (Configuration, &mBootMaintGuid, 
mBootMaintStorageName)) {
+    return EFI_NOT_FOUND;
+  }
+
+  Status = gBS->LocateProtocol (
+                  &gEfiHiiConfigRoutingProtocolGuid, 
+                  NULL, 
+                  (VOID **)&ConfigRouting
+                  );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  
+  Private = BMM_CALLBACK_DATA_FROM_THIS (This);  
+  //
+  // Get Buffer Storage data from EFI variable
+  //
+  BufferSize = sizeof (BMM_FAKE_NV_DATA);
+  OldBmmData = &Private->BmmOldFakeNVData;
+  NewBmmData = &Private->BmmFakeNvData;
+  //
+  // Convert <ConfigResp> to buffer data by helper function ConfigToBlock()
+  //
+  Status = ConfigRouting->ConfigToBlock (
+                            ConfigRouting,
+                            Configuration,
+                            (UINT8 *) NewBmmData,
+                            &BufferSize,
+                            Progress
+                            );
+  ASSERT_EFI_ERROR (Status);    
+  //
+  // Compare new and old BMM configuration data and only do action for 
modified item to 
+  // avoid setting unnecessary non-volatile variable
+  //
+  
+  //
+  // Check data which located in BMM main page and save the settings if need
+  //         
+  if (CompareMem (&NewBmmData->BootNext, &OldBmmData->BootNext, sizeof 
(NewBmmData->BootNext)) != 0) {
+    Status = Var_UpdateBootNext (Private);
+  }
+  
+  //
+  // Check data which located in Boot Options Menu and save the settings if 
need
+  //      
+  if (CompareMem (NewBmmData->BootOptionDel, OldBmmData->BootOptionDel, sizeof 
(NewBmmData->BootOptionDel)) != 0) {  
+    for (Index = 0; 
+         ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof 
(NewBmmData->BootOptionDel) / sizeof (NewBmmData->BootOptionDel[0])))); 
+         Index ++) {
+      NewMenuEntry            = BOpt_GetMenuEntry (&BootOptionMenu, Index);
+      NewLoadContext          = (BM_LOAD_CONTEXT *) 
NewMenuEntry->VariableContext;
+      NewLoadContext->Deleted = NewBmmData->BootOptionDel[Index];
+      NewBmmData->BootOptionDel[Index] = FALSE;
+    }
+    
+    Var_DelBootOption ();
+  }
+  
+  if (CompareMem (NewBmmData->BootOptionOrder, OldBmmData->BootOptionOrder, 
sizeof (NewBmmData->BootOptionOrder)) != 0) {  
+    Status = Var_UpdateBootOrder (Private);
+  } 
+
+  //
+  // Check data which located in Driver Options Menu and save the settings if 
need
+  //              
+  if (CompareMem (NewBmmData->DriverOptionDel, OldBmmData->DriverOptionDel, 
sizeof (NewBmmData->DriverOptionDel)) != 0) {       
+    for (Index = 0; 
+         ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof 
(NewBmmData->DriverOptionDel) / sizeof (NewBmmData->DriverOptionDel[0])))); 
+         Index++) {
+      NewMenuEntry            = BOpt_GetMenuEntry (&DriverOptionMenu, Index);
+      NewLoadContext          = (BM_LOAD_CONTEXT *) 
NewMenuEntry->VariableContext;
+      NewLoadContext->Deleted = NewBmmData->DriverOptionDel[Index];
+      NewBmmData->DriverOptionDel[Index] = FALSE;
+    }
+    Var_DelDriverOption ();  
+  }
+  
+  if (CompareMem (NewBmmData->DriverOptionOrder, 
OldBmmData->DriverOptionOrder, sizeof (NewBmmData->DriverOptionOrder)) != 0) {  
+    Status = Var_UpdateDriverOrder (Private);
+  }      
+
+  //
+  // After user do the save action, need to update OldBmmData.
+  //
+  CopyMem (OldBmmData, NewBmmData, sizeof (BMM_FAKE_NV_DATA));
+
+  return EFI_SUCCESS;
+}
+
+/**
+  This function processes the results of changes in configuration.
+
+
+  @param This               Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Action             Specifies the type of action taken by the browser.
+  @param QuestionId         A unique value which is sent to the original 
exporting driver
+                            so that it can identify the type of data to expect.
+  @param Type               The type of value for the question.
+  @param Value              A pointer to the data being sent to the original 
exporting driver.
+  @param ActionRequest      On return, points to the action requested by the 
callback function.
+
+  @retval EFI_SUCCESS           The callback successfully handled the action.
+  @retval EFI_OUT_OF_RESOURCES  Not enough storage is available to hold the 
variable and its data.
+  @retval EFI_DEVICE_ERROR      The variable could not be saved.
+  @retval EFI_UNSUPPORTED       The specified Action is not supported by the 
callback.
+  @retval EFI_INVALID_PARAMETER The parameter of Value or ActionRequest is 
invalid.
+**/
+EFI_STATUS
+EFIAPI
+BootMaintCallback (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL         *This,
+  IN        EFI_BROWSER_ACTION                     Action,
+  IN        EFI_QUESTION_ID                        QuestionId,
+  IN        UINT8                                  Type,
+  IN        EFI_IFR_TYPE_VALUE                     *Value,
+  OUT       EFI_BROWSER_ACTION_REQUEST             *ActionRequest
+  )
+{
+  BMM_CALLBACK_DATA *Private;
+  BM_MENU_ENTRY     *NewMenuEntry;
+  BMM_FAKE_NV_DATA  *CurrentFakeNVMap;
+  EFI_STATUS        Status;
+  UINTN             OldValue;
+  UINTN             NewValue;
+  UINTN             Number;
+  UINTN             Index;
+
+  //
+  //Chech whether exit from FileExplorer and reenter BM,if yes,reclaim string 
depositories
+  //
+  if (Action == EFI_BROWSER_ACTION_FORM_OPEN){
+    if(mEnterFileExplorer ){
+      ReclaimStringDepository();
+      mEnterFileExplorer = FALSE;
+    }
+  }
+
+  if (Action != EFI_BROWSER_ACTION_CHANGING && Action != 
EFI_BROWSER_ACTION_CHANGED) {
+    //
+    // Do nothing for other UEFI Action. Only do call back when data is 
changed.
+    //
+    return EFI_UNSUPPORTED;
+  }
+
+  OldValue       = 0;
+  NewValue       = 0;
+  Number         = 0;
+
+  Private        = BMM_CALLBACK_DATA_FROM_THIS (This);
+
+  //
+  // Retrive uncommitted data from Form Browser
+  //
+  CurrentFakeNVMap = &Private->BmmFakeNvData;
+  HiiGetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof 
(BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap);
+
+  if (Action == EFI_BROWSER_ACTION_CHANGING) {
+    if (Value == NULL) {
+      return EFI_INVALID_PARAMETER;
+    }
+    
+    UpdatePageId (Private, QuestionId);
+
+    if (QuestionId < FILE_OPTION_OFFSET) {
+      if (QuestionId < CONFIG_OPTION_OFFSET) {
+        switch (QuestionId) {
+        case FORM_BOOT_ADD_ID:
+          // Leave Bm and enter FileExplorer.
+          Private->FeCurrentState = FileExplorerStateAddBootOption;
+          Private->FeDisplayContext = FileExplorerDisplayUnknown;
+          ReclaimStringDepository (); 
+          UpdateFileExplorer(Private, 0);
+          mEnterFileExplorer = TRUE;
+          break;
+
+        case FORM_DRV_ADD_FILE_ID:
+          // Leave Bm and enter FileExplorer.
+          Private->FeCurrentState = FileExplorerStateAddDriverOptionState;
+          Private->FeDisplayContext = FileExplorerDisplayUnknown;
+          ReclaimStringDepository ();
+          UpdateFileExplorer(Private, 0);
+          mEnterFileExplorer = TRUE;
+          break;
+
+        case FORM_DRV_ADD_HANDLE_ID:
+          CleanUpPage (FORM_DRV_ADD_HANDLE_ID, Private);
+          UpdateDrvAddHandlePage (Private);
+          break;
+
+        case FORM_BOOT_DEL_ID:
+          CleanUpPage (FORM_BOOT_DEL_ID, Private);
+          UpdateBootDelPage (Private);
+          break;
+
+        case FORM_BOOT_CHG_ID:
+        case FORM_DRV_CHG_ID:
+          UpdatePageBody (QuestionId, Private);
+          break;
+
+        case FORM_DRV_DEL_ID:
+          CleanUpPage (FORM_DRV_DEL_ID, Private);
+          UpdateDrvDelPage (Private);
+          break;
+
+        case FORM_BOOT_NEXT_ID:
+          CleanUpPage (FORM_BOOT_NEXT_ID, Private);
+          UpdateBootNextPage (Private);
+          break;
+
+        case FORM_TIME_OUT_ID:
+          CleanUpPage (FORM_TIME_OUT_ID, Private);
+          UpdateTimeOutPage (Private);
+          break;
+
+        case FORM_CON_IN_ID:
+        case FORM_CON_OUT_ID:
+        case FORM_CON_ERR_ID:
+          UpdatePageBody (QuestionId, Private);
+          break;
+
+        case FORM_CON_MODE_ID:
+          CleanUpPage (FORM_CON_MODE_ID, Private);
+          UpdateConModePage (Private);
+          break;
+
+        case FORM_CON_COM_ID:
+          CleanUpPage (FORM_CON_COM_ID, Private);
+          UpdateConCOMPage (Private);
+          break;
+
+        default:
+          break;
+        }
+      } else if ((QuestionId >= TERMINAL_OPTION_OFFSET) && (QuestionId < 
CONSOLE_OPTION_OFFSET)) {
+        Index                  = (UINT16) (QuestionId - 
TERMINAL_OPTION_OFFSET);
+        Private->CurrentTerminal  = Index;
+
+        CleanUpPage (FORM_CON_COM_SETUP_ID, Private);
+        UpdateTerminalPage (Private);
+
+      } else if (QuestionId >= HANDLE_OPTION_OFFSET) {
+        Index                  = (UINT16) (QuestionId - HANDLE_OPTION_OFFSET);
+
+        NewMenuEntry            = BOpt_GetMenuEntry (&DriverMenu, Index);
+        ASSERT (NewMenuEntry != NULL);
+        Private->HandleContext  = (BM_HANDLE_CONTEXT *) 
NewMenuEntry->VariableContext;
+
+        CleanUpPage (FORM_DRV_ADD_HANDLE_DESC_ID, Private);
+
+        Private->MenuEntry                  = NewMenuEntry;
+        Private->LoadContext->FilePathList  = 
Private->HandleContext->DevicePath;
+
+        UpdateDriverAddHandleDescPage (Private);
+      }
+    }
+    if (QuestionId == KEY_VALUE_BOOT_FROM_FILE){
+      // Leave Bm and enter FileExplorer.
+      Private->FeCurrentState = FileExplorerStateBootFromFile;
+      Private->FeDisplayContext = FileExplorerDisplayUnknown;
+      ReclaimStringDepository ();
+      UpdateFileExplorer(Private, 0);
+      mEnterFileExplorer = TRUE;
+    }
+  } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
+    if ((Value == NULL) || (ActionRequest == NULL)) {
+      return EFI_INVALID_PARAMETER;
+    }
+
+    switch (QuestionId) {
+    case KEY_VALUE_SAVE_AND_EXIT:
+    case KEY_VALUE_NO_SAVE_AND_EXIT:
+      if (QuestionId == KEY_VALUE_SAVE_AND_EXIT) {
+        Status = ApplyChangeHandler (Private, CurrentFakeNVMap, 
Private->BmmPreviousPageId);
+        if (EFI_ERROR (Status)) {
+          return Status;
+        }
+      } else if (QuestionId == KEY_VALUE_NO_SAVE_AND_EXIT) {
+        DiscardChangeHandler (Private, CurrentFakeNVMap);
+      }
+
+      //
+      // Tell browser not to ask for confirmation of changes,
+      // since we have already applied or discarded.
+      //
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;
+
+      break;
+
+    default:
+      break;
+    }
+  }
+
+  //
+  // Pass changed uncommitted data back to Form Browser
+  //
+  HiiSetBrowserData (&mBootMaintGuid, mBootMaintStorageName, sizeof 
(BMM_FAKE_NV_DATA), (UINT8 *) CurrentFakeNVMap, NULL);
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Function handling request to apply changes for BMM pages.
+
+  @param Private            Pointer to callback data buffer.
+  @param CurrentFakeNVMap   Pointer to buffer holding data of various values 
used by BMM
+  @param FormId             ID of the form which has sent the request to apply 
change.
+
+  @retval  EFI_SUCCESS       Change successfully applied.
+  @retval  Other             Error occurs while trying to apply changes.
+
+**/
+EFI_STATUS
+ApplyChangeHandler (
+  IN  BMM_CALLBACK_DATA               *Private,
+  IN  BMM_FAKE_NV_DATA                *CurrentFakeNVMap,
+  IN  EFI_FORM_ID                     FormId
+  )
+{
+  BM_CONSOLE_CONTEXT  *NewConsoleContext;
+  BM_TERMINAL_CONTEXT *NewTerminalContext;
+  BM_LOAD_CONTEXT     *NewLoadContext;
+  BM_MENU_ENTRY       *NewMenuEntry;
+  EFI_STATUS          Status;
+  UINT16              Index;
+
+  Status = EFI_SUCCESS;
+
+  switch (FormId) {
+  case FORM_BOOT_DEL_ID:
+    for (Index = 0; 
+         ((Index < BootOptionMenu.MenuNumber) && (Index < (sizeof 
(CurrentFakeNVMap->BootOptionDel) / sizeof 
(CurrentFakeNVMap->BootOptionDel[0])))); 
+         Index ++) {
+      NewMenuEntry            = BOpt_GetMenuEntry (&BootOptionMenu, Index);
+      NewLoadContext          = (BM_LOAD_CONTEXT *) 
NewMenuEntry->VariableContext;
+      NewLoadContext->Deleted = CurrentFakeNVMap->BootOptionDel[Index];
+      CurrentFakeNVMap->BootOptionDel[Index] = FALSE;
+    }
+
+    Var_DelBootOption ();
+    break;
+
+  case FORM_DRV_DEL_ID:
+    for (Index = 0; 
+         ((Index < DriverOptionMenu.MenuNumber) && (Index < (sizeof 
(CurrentFakeNVMap->DriverOptionDel) / sizeof 
(CurrentFakeNVMap->DriverOptionDel[0])))); 
+         Index++) {
+      NewMenuEntry            = BOpt_GetMenuEntry (&DriverOptionMenu, Index);
+      NewLoadContext          = (BM_LOAD_CONTEXT *) 
NewMenuEntry->VariableContext;
+      NewLoadContext->Deleted = CurrentFakeNVMap->DriverOptionDel[Index];
+      CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;
+    }
+
+    Var_DelDriverOption ();
+    break;
+
+  case FORM_BOOT_CHG_ID:
+    Status = Var_UpdateBootOrder (Private);
+    break;
+
+  case FORM_DRV_CHG_ID:
+    Status = Var_UpdateDriverOrder (Private);
+    break;
+
+  case FORM_TIME_OUT_ID:
+    Status = gRT->SetVariable (
+                    L"Timeout",
+                    &gEfiGlobalVariableGuid,
+                    EFI_VARIABLE_BOOTSERVICE_ACCESS | 
EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+                    sizeof (UINT16),
+                    &(CurrentFakeNVMap->BootTimeOut)
+                    );
+    ASSERT_EFI_ERROR(Status);
+
+    Private->BmmOldFakeNVData.BootTimeOut = CurrentFakeNVMap->BootTimeOut;
+    break;
+
+  case FORM_BOOT_NEXT_ID:
+    Status = Var_UpdateBootNext (Private);
+    break;
+
+  case FORM_CON_MODE_ID:
+    Status = Var_UpdateConMode (Private);
+    break;
+
+  case FORM_CON_COM_SETUP_ID:
+    NewMenuEntry                      = BOpt_GetMenuEntry (&TerminalMenu, 
Private->CurrentTerminal);
+
+    ASSERT (NewMenuEntry != NULL);
+
+    NewTerminalContext                = (BM_TERMINAL_CONTEXT *) 
NewMenuEntry->VariableContext;
+
+    NewTerminalContext->BaudRateIndex = CurrentFakeNVMap->COMBaudRate;
+    ASSERT (CurrentFakeNVMap->COMBaudRate < (sizeof (BaudRateList) / sizeof 
(BaudRateList[0])));
+    NewTerminalContext->BaudRate      = 
BaudRateList[CurrentFakeNVMap->COMBaudRate].Value;
+    NewTerminalContext->DataBitsIndex = CurrentFakeNVMap->COMDataRate;
+    ASSERT (CurrentFakeNVMap->COMDataRate < (sizeof (DataBitsList) / sizeof 
(DataBitsList[0])));
+    NewTerminalContext->DataBits      = (UINT8) 
DataBitsList[CurrentFakeNVMap->COMDataRate].Value;
+    NewTerminalContext->StopBitsIndex = CurrentFakeNVMap->COMStopBits;
+    ASSERT (CurrentFakeNVMap->COMStopBits < (sizeof (StopBitsList) / sizeof 
(StopBitsList[0])));
+    NewTerminalContext->StopBits      = (UINT8) 
StopBitsList[CurrentFakeNVMap->COMStopBits].Value;
+    NewTerminalContext->ParityIndex   = CurrentFakeNVMap->COMParity;
+    ASSERT (CurrentFakeNVMap->COMParity < (sizeof (ParityList) / sizeof 
(ParityList[0])));
+    NewTerminalContext->Parity        = (UINT8) 
ParityList[CurrentFakeNVMap->COMParity].Value;
+    NewTerminalContext->TerminalType  = CurrentFakeNVMap->COMTerminalType;
+
+    ChangeTerminalDevicePath (
+      NewTerminalContext->DevicePath,
+      FALSE
+      );
+
+    Var_UpdateConsoleInpOption ();
+    Var_UpdateConsoleOutOption ();
+    Var_UpdateErrorOutOption ();
+    break;
+
+  case FORM_CON_IN_ID:
+    for (Index = 0; Index < ConsoleInpMenu.MenuNumber; Index++) {
+      NewMenuEntry                = BOpt_GetMenuEntry (&ConsoleInpMenu, Index);
+      NewConsoleContext           = (BM_CONSOLE_CONTEXT *) 
NewMenuEntry->VariableContext;
+      ASSERT (Index < MAX_MENU_NUMBER);
+      NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];
+    }
+
+    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
+      NewMenuEntry                = BOpt_GetMenuEntry (&TerminalMenu, Index);
+      NewTerminalContext          = (BM_TERMINAL_CONTEXT *) 
NewMenuEntry->VariableContext;
+      ASSERT (Index + ConsoleInpMenu.MenuNumber < MAX_MENU_NUMBER);
+      NewTerminalContext->IsConIn = CurrentFakeNVMap->ConsoleCheck[Index + 
ConsoleInpMenu.MenuNumber];
+    }
+
+    Var_UpdateConsoleInpOption ();
+    break;
+
+  case FORM_CON_OUT_ID:
+    for (Index = 0; Index < ConsoleOutMenu.MenuNumber; Index++) {
+      NewMenuEntry                = BOpt_GetMenuEntry (&ConsoleOutMenu, Index);
+      NewConsoleContext           = (BM_CONSOLE_CONTEXT *) 
NewMenuEntry->VariableContext;
+      ASSERT (Index < MAX_MENU_NUMBER);
+      NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];
+    }
+
+    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
+      NewMenuEntry                  = BOpt_GetMenuEntry (&TerminalMenu, Index);
+      NewTerminalContext            = (BM_TERMINAL_CONTEXT *) 
NewMenuEntry->VariableContext;
+      ASSERT (Index + ConsoleOutMenu.MenuNumber < MAX_MENU_NUMBER);
+      NewTerminalContext->IsConOut  = CurrentFakeNVMap->ConsoleCheck[Index + 
ConsoleOutMenu.MenuNumber];
+    }
+
+    Var_UpdateConsoleOutOption ();
+    break;
+
+  case FORM_CON_ERR_ID:
+    for (Index = 0; Index < ConsoleErrMenu.MenuNumber; Index++) {
+      NewMenuEntry                = BOpt_GetMenuEntry (&ConsoleErrMenu, Index);
+      NewConsoleContext           = (BM_CONSOLE_CONTEXT *) 
NewMenuEntry->VariableContext;
+      ASSERT (Index < MAX_MENU_NUMBER);
+      NewConsoleContext->IsActive = CurrentFakeNVMap->ConsoleCheck[Index];
+    }
+
+    for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {
+      NewMenuEntry                  = BOpt_GetMenuEntry (&TerminalMenu, Index);
+      NewTerminalContext            = (BM_TERMINAL_CONTEXT *) 
NewMenuEntry->VariableContext;
+      ASSERT (Index + ConsoleErrMenu.MenuNumber < MAX_MENU_NUMBER);
+      NewTerminalContext->IsStdErr  = CurrentFakeNVMap->ConsoleCheck[Index + 
ConsoleErrMenu.MenuNumber];
+    }
+
+    Var_UpdateErrorOutOption ();
+    break;
+
+  case FORM_DRV_ADD_HANDLE_DESC_ID:
+    Status = Var_UpdateDriverOption (
+               Private,
+               Private->BmmHiiHandle,
+               CurrentFakeNVMap->DriverAddHandleDesc,
+               CurrentFakeNVMap->DriverAddHandleOptionalData,
+               CurrentFakeNVMap->DriverAddForceReconnect
+               );
+    if (EFI_ERROR (Status)) {
+      goto Error;
+    }
+
+    BOpt_GetDriverOptions (Private);
+    CreateMenuStringToken (Private, Private->BmmHiiHandle, &DriverOptionMenu);
+    break;
+
+  default:
+    break;
+  }
+
+Error:
+  return Status;
+}
+
+/**
+  Discard all changes done to the BMM pages such as Boot Order change,
+  Driver order change.
+
+  @param Private            The BMM context data.
+  @param CurrentFakeNVMap   The current Fack NV Map.
+
+**/
+VOID
+DiscardChangeHandler (
+  IN  BMM_CALLBACK_DATA               *Private,
+  IN  BMM_FAKE_NV_DATA                *CurrentFakeNVMap
+  )
+{
+  UINT16  Index;
+
+  switch (Private->BmmPreviousPageId) {
+  case FORM_BOOT_CHG_ID:
+    CopyMem (CurrentFakeNVMap->BootOptionOrder, 
Private->BmmOldFakeNVData.BootOptionOrder, sizeof 
(CurrentFakeNVMap->BootOptionOrder));
+    break;
+       
+  case FORM_DRV_CHG_ID:
+    CopyMem (CurrentFakeNVMap->DriverOptionOrder, 
Private->BmmOldFakeNVData.DriverOptionOrder, sizeof 
(CurrentFakeNVMap->DriverOptionOrder));
+    break;
+
+  case FORM_BOOT_DEL_ID:
+    ASSERT (BootOptionMenu.MenuNumber <= (sizeof 
(CurrentFakeNVMap->BootOptionDel) / sizeof 
(CurrentFakeNVMap->BootOptionDel[0])));
+    for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {
+      CurrentFakeNVMap->BootOptionDel[Index] = FALSE;
+    }
+    break;
+
+  case FORM_DRV_DEL_ID:
+    ASSERT (DriverOptionMenu.MenuNumber <= (sizeof 
(CurrentFakeNVMap->DriverOptionDel) / sizeof 
(CurrentFakeNVMap->DriverOptionDel[0])));
+    for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {
+      CurrentFakeNVMap->DriverOptionDel[Index] = FALSE;
+    }
+    break;
+
+  case FORM_BOOT_NEXT_ID:
+    CurrentFakeNVMap->BootNext = Private->BmmOldFakeNVData.BootNext;
+    break;
+
+  case FORM_TIME_OUT_ID:
+    CurrentFakeNVMap->BootTimeOut = Private->BmmOldFakeNVData.BootTimeOut;
+    break;
+
+  case FORM_DRV_ADD_HANDLE_DESC_ID:
+  case FORM_DRV_ADD_FILE_ID:
+  case FORM_DRV_ADD_HANDLE_ID:
+    CurrentFakeNVMap->DriverAddHandleDesc[0]          = 0x0000;
+    CurrentFakeNVMap->DriverAddHandleOptionalData[0]  = 0x0000;
+    break;
+
+  default:
+    break;
+  }
+}
+
+
+/**
+  Create dynamic code for BMM.
+
+  @param  BmmCallbackInfo        The BMM context data.
+
+**/
+VOID
+InitializeDrivers(
+  IN BMM_CALLBACK_DATA        *BmmCallbackInfo
+  )
+{
+  EFI_HII_HANDLE              HiiHandle;
+  VOID                        *StartOpCodeHandle;
+  VOID                        *EndOpCodeHandle;
+  EFI_IFR_GUID_LABEL          *StartLabel;
+  EFI_IFR_GUID_LABEL          *EndLabel;
+  UINTN                       Index;  
+  EFI_STRING_ID               FormSetTitle;
+  EFI_STRING_ID               FormSetHelp;  
+  EFI_STRING                  String;
+  EFI_STRING_ID               Token;
+  EFI_STRING_ID               TokenHelp;  
+  EFI_HII_HANDLE              *HiiHandles;
+  UINTN                       SkipCount;
+  EFI_GUID                    FormSetGuid;
+  CHAR16                      *DevicePathStr;
+  EFI_STRING_ID               DevicePathId;
+
+  HiiHandle = BmmCallbackInfo->BmmHiiHandle;
+  //
+  // Allocate space for creation of UpdateData Buffer
+  //
+  StartOpCodeHandle = HiiAllocateOpCodeHandle ();
+  ASSERT (StartOpCodeHandle != NULL);
+
+  EndOpCodeHandle = HiiAllocateOpCodeHandle ();
+  ASSERT (EndOpCodeHandle != NULL);
+
+  //
+  // Create Hii Extend Label OpCode as the start opcode
+  //
+  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, 
&gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
+  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
+  StartLabel->Number       = LABEL_BMM_PLATFORM_INFORMATION;
+
+  //
+  // Create Hii Extend Label OpCode as the end opcode
+  //
+  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, 
&gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
+  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
+  EndLabel->Number       = LABEL_END;
+
+  //
+  // Get all the Hii handles
+  //
+  HiiHandles = HiiGetHiiHandles (NULL);
+  ASSERT (HiiHandles != NULL);
+
+  //
+  // Search for formset of each class type
+  //
+  SkipCount = 0;
+  for (Index = 0; HiiHandles[Index] != NULL; Index++) {
+    if (!ExtractDisplayedHiiFormFromHiiHandle (HiiHandles[Index], 
&gEfiIfrBootMaintenanceGuid, SkipCount, &FormSetTitle, &FormSetHelp, 
&FormSetGuid)) {
+      SkipCount = 0;
+      continue;
+    }
+    String = HiiGetString (HiiHandles[Index], FormSetTitle, NULL);
+    if (String == NULL) {
+      String = HiiGetString (HiiHandle, STR_MISSING_STRING, NULL);
+      ASSERT (String != NULL);
+    }
+    Token = HiiSetString (HiiHandle, 0, String, NULL);
+    FreePool (String);
+
+    String = HiiGetString (HiiHandles[Index], FormSetHelp, NULL);
+    if (String == NULL) {
+      String = HiiGetString (HiiHandle, STR_MISSING_STRING, NULL);
+      ASSERT (String != NULL);
+    }
+    TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);
+    FreePool (String);
+
+    DevicePathStr = ExtractDevicePathFromHiiHandle(HiiHandles[Index]);
+    DevicePathId  = 0;
+    if (DevicePathStr != NULL){
+      DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);
+      FreePool (DevicePathStr);
+    }
+
+    HiiCreateGotoExOpCode (
+      StartOpCodeHandle,
+      0,
+      Token,
+      TokenHelp,
+      0,
+      (EFI_QUESTION_ID) (Index + FRONT_PAGE_KEY_OFFSET),
+      0,
+      &FormSetGuid,
+      DevicePathId
+      );
+    //
+    //One packagelist may has more than one form package,
+    //Index-- means keep current HiiHandle and still extract from the 
packagelist, 
+    //SkipCount++ means skip the formset which was found before in the same 
form package. 
+    //
+    SkipCount++;
+    Index--;
+  }
+
+  HiiUpdateForm (
+    HiiHandle,
+    &mBootMaintGuid,
+    FORM_MAIN_ID,
+    StartOpCodeHandle,
+    EndOpCodeHandle
+    );
+
+  HiiFreeOpCodeHandle (StartOpCodeHandle);
+  HiiFreeOpCodeHandle (EndOpCodeHandle);  
+  FreePool (HiiHandles);
+}
+
+
+/**
+  Create dynamic code for BMM.
+
+  @param  BmmCallbackInfo        The BMM context data.
+
+**/
+VOID
+InitializeBmmConfig(
+  IN BMM_CALLBACK_DATA        *BmmCallbackInfo
+  )
+{
+  UpdateBootDelPage (BmmCallbackInfo);
+  UpdateDrvDelPage (BmmCallbackInfo);
+
+  if (TerminalMenu.MenuNumber > 0) {
+    BmmCallbackInfo->CurrentTerminal = 0;
+    UpdateTerminalPage (BmmCallbackInfo);
+  }
+
+  InitializeDrivers (BmmCallbackInfo);
+}
+
+/**
+  Initialize the Boot Maintenance Utitliy.
+
+**/
+VOID
+InitializeBM (
+  VOID
+  )
+{
+  BMM_CALLBACK_DATA           *BmmCallbackInfo;
+
+  BmmCallbackInfo = mBmmCallbackInfo;
+  BmmCallbackInfo->BmmPreviousPageId             = FORM_MAIN_ID;
+  BmmCallbackInfo->BmmCurrentPageId              = FORM_MAIN_ID;
+  BmmCallbackInfo->FeCurrentState                = FileExplorerStateInActive;
+  BmmCallbackInfo->FeDisplayContext              = FileExplorerDisplayUnknown;
+
+  InitAllMenu (BmmCallbackInfo);
+
+  CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, 
&ConsoleInpMenu);
+  CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, 
&ConsoleOutMenu);
+  CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, 
&ConsoleErrMenu);
+  CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, 
&BootOptionMenu);
+  CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, 
&DriverOptionMenu);
+  CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, 
&TerminalMenu);
+  CreateMenuStringToken (BmmCallbackInfo, BmmCallbackInfo->BmmHiiHandle, 
&DriverMenu);
+
+  InitializeBmmConfig(BmmCallbackInfo);
+}
+
+/**
+  Initialized all Menu Option List.
+
+  @param CallbackData    The BMM context data.
+
+**/
+VOID
+InitAllMenu (
+  IN  BMM_CALLBACK_DATA    *CallbackData
+  )
+{
+  InitializeListHead (&BootOptionMenu.Head);
+  InitializeListHead (&DriverOptionMenu.Head);
+  BOpt_GetBootOptions (CallbackData);
+  BOpt_GetDriverOptions (CallbackData);
+  InitializeListHead (&FsOptionMenu.Head);
+  BOpt_FindDrivers ();
+  InitializeListHead (&DirectoryMenu.Head);
+  InitializeListHead (&ConsoleInpMenu.Head);
+  InitializeListHead (&ConsoleOutMenu.Head);
+  InitializeListHead (&ConsoleErrMenu.Head);
+  InitializeListHead (&TerminalMenu.Head);
+  LocateSerialIo ();
+  GetAllConsoles ();
+  mAllMenuInit = TRUE;
+}
+
+/**
+  Free up all Menu Option list.
+
+**/
+VOID
+FreeAllMenu (
+  VOID
+  )
+{
+  if (!mAllMenuInit){
+    return;
+  }
+  BOpt_FreeMenu (&DirectoryMenu);
+  BOpt_FreeMenu (&FsOptionMenu);
+  BOpt_FreeMenu (&BootOptionMenu);
+  BOpt_FreeMenu (&DriverOptionMenu);
+  BOpt_FreeMenu (&DriverMenu);
+  FreeAllConsoles ();
+  mAllMenuInit = FALSE;
+}
+
+/**
+  Initialize all the string depositories.
+
+**/
+VOID
+InitializeStringDepository (
+  VOID
+  )
+{
+  STRING_DEPOSITORY *StringDepository;
+  StringDepository              = AllocateZeroPool (sizeof (STRING_DEPOSITORY) 
* STRING_DEPOSITORY_NUMBER);
+  FileOptionStrDepository       = StringDepository++;
+  ConsoleOptionStrDepository    = StringDepository++;
+  BootOptionStrDepository       = StringDepository++;
+  BootOptionHelpStrDepository   = StringDepository++;
+  DriverOptionStrDepository     = StringDepository++;
+  DriverOptionHelpStrDepository = StringDepository++;
+  TerminalStrDepository         = StringDepository;
+}
+
+/**
+  Fetch a usable string node from the string depository and return the string 
token.
+
+  @param CallbackData       The BMM context data.
+  @param StringDepository   The string repository.
+
+  @retval  EFI_STRING_ID           String token.
+
+**/
+EFI_STRING_ID
+GetStringTokenFromDepository (
+  IN   BMM_CALLBACK_DATA     *CallbackData,
+  IN   STRING_DEPOSITORY     *StringDepository
+  )
+{
+  STRING_LIST_NODE  *CurrentListNode;
+  STRING_LIST_NODE  *NextListNode;
+
+  CurrentListNode = StringDepository->CurrentNode;
+
+  if ((NULL != CurrentListNode) && (NULL != CurrentListNode->Next)) {
+    //
+    // Fetch one reclaimed node from the list.
+    //
+    NextListNode = StringDepository->CurrentNode->Next;
+  } else {
+    //
+    // If there is no usable node in the list, update the list.
+    //
+    NextListNode = AllocateZeroPool (sizeof (STRING_LIST_NODE));
+    ASSERT (NextListNode != NULL);
+    NextListNode->StringToken = HiiSetString (CallbackData->BmmHiiHandle, 0, 
L" ", NULL);
+    ASSERT (NextListNode->StringToken != 0);
+
+    StringDepository->TotalNodeNumber++;
+
+    if (NULL == CurrentListNode) {
+      StringDepository->ListHead = NextListNode;
+    } else {
+      CurrentListNode->Next = NextListNode;
+    }
+  }
+
+  StringDepository->CurrentNode = NextListNode;
+
+  return StringDepository->CurrentNode->StringToken;
+}
+
+/**
+  Reclaim string depositories by moving the current node pointer to list head..
+
+**/
+VOID
+ReclaimStringDepository (
+  VOID
+  )
+{
+  UINTN             DepositoryIndex;
+  STRING_DEPOSITORY *StringDepository;
+
+  StringDepository = FileOptionStrDepository;
+  for (DepositoryIndex = 0; DepositoryIndex < STRING_DEPOSITORY_NUMBER; 
DepositoryIndex++) {
+    StringDepository->CurrentNode = StringDepository->ListHead;
+    StringDepository++;
+  }
+}
+
+/**
+  Release resource for all the string depositories.
+
+**/
+VOID
+CleanUpStringDepository (
+  VOID
+  )
+{
+  UINTN             NodeIndex;
+  UINTN             DepositoryIndex;
+  STRING_LIST_NODE  *CurrentListNode;
+  STRING_LIST_NODE  *NextListNode;
+  STRING_DEPOSITORY *StringDepository;
+
+  //
+  // Release string list nodes.
+  //
+  StringDepository = FileOptionStrDepository;
+  for (DepositoryIndex = 0; DepositoryIndex < STRING_DEPOSITORY_NUMBER; 
DepositoryIndex++) {
+    CurrentListNode = StringDepository->ListHead;
+    for (NodeIndex = 0; NodeIndex < StringDepository->TotalNodeNumber; 
NodeIndex++) {
+      NextListNode = CurrentListNode->Next;
+      FreePool (CurrentListNode);
+      CurrentListNode = NextListNode;
+    }
+
+    StringDepository++;
+  }
+  //
+  // Release string depository.
+  //
+  FreePool (FileOptionStrDepository);
+}
+
+/**
+  Install BootMaint and FileExplorer HiiPackages.
+
+**/
+VOID
+InitBootMaintenance(
+  VOID
+  )
+{
+  BMM_CALLBACK_DATA        *BmmCallbackInfo;
+  EFI_STATUS               Status;
+  UINT8                    *Ptr;
+
+  Status = EFI_SUCCESS;
+
+  if (!gConnectAllHappened){
+    EfiBootManagerConnectAll();
+    gConnectAllHappened = TRUE;
+  }
+
+  EfiBootManagerRefreshAllBootOption ();
+
+  //
+  // Create CallbackData structures for Driver Callback
+  //
+  BmmCallbackInfo = AllocateZeroPool (sizeof (BMM_CALLBACK_DATA));
+  ASSERT (BmmCallbackInfo != NULL);
+
+  //
+  // Create LoadOption in BmmCallbackInfo for Driver Callback
+  //
+  Ptr = AllocateZeroPool (sizeof (BM_LOAD_CONTEXT) + sizeof (BM_FILE_CONTEXT) 
+ sizeof (BM_HANDLE_CONTEXT) + sizeof (BM_MENU_ENTRY));
+  ASSERT (Ptr != NULL);
+
+  //
+  // Initialize Bmm callback data.
+  //
+  BmmCallbackInfo->LoadContext = (BM_LOAD_CONTEXT *) Ptr;
+  Ptr += sizeof (BM_LOAD_CONTEXT);
+
+  BmmCallbackInfo->FileContext = (BM_FILE_CONTEXT *) Ptr;
+  Ptr += sizeof (BM_FILE_CONTEXT);
+
+  BmmCallbackInfo->HandleContext = (BM_HANDLE_CONTEXT *) Ptr;
+  Ptr += sizeof (BM_HANDLE_CONTEXT);
+
+  BmmCallbackInfo->MenuEntry     = (BM_MENU_ENTRY *) Ptr;
+
+  BmmCallbackInfo->Signature                     = BMM_CALLBACK_DATA_SIGNATURE;
+  BmmCallbackInfo->BmmConfigAccess.ExtractConfig = BootMaintExtractConfig;
+  BmmCallbackInfo->BmmConfigAccess.RouteConfig   = BootMaintRouteConfig;
+  BmmCallbackInfo->BmmConfigAccess.Callback      = BootMaintCallback;
+  BmmCallbackInfo->BmmPreviousPageId             = FORM_MAIN_ID;
+  BmmCallbackInfo->BmmCurrentPageId              = FORM_MAIN_ID;
+  BmmCallbackInfo->FeConfigAccess.ExtractConfig  = FakeExtractConfig;
+  BmmCallbackInfo->FeConfigAccess.RouteConfig    = FakeRouteConfig;
+  BmmCallbackInfo->FeConfigAccess.Callback       = FileExplorerCallback;
+  BmmCallbackInfo->FeCurrentState                = FileExplorerStateInActive;
+  BmmCallbackInfo->FeDisplayContext              = FileExplorerDisplayUnknown;
+
+  //
+  // Install Device Path Protocol and Config Access protocol to driver handle
+  //
+  Status = gBS->InstallMultipleProtocolInterfaces (
+                  &BmmCallbackInfo->BmmDriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mBmmHiiVendorDevicePath,
+                  &gEfiHiiConfigAccessProtocolGuid,
+                  &BmmCallbackInfo->BmmConfigAccess,
+                  NULL
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // Install Device Path Protocol and Config Access protocol to driver handle
+  //
+  Status = gBS->InstallMultipleProtocolInterfaces (
+                  &BmmCallbackInfo->FeDriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mFeHiiVendorDevicePath,
+                  &gEfiHiiConfigAccessProtocolGuid,
+                  &BmmCallbackInfo->FeConfigAccess,
+                  NULL
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+  //
+  // Post our Boot Maint VFR binary to the HII database.
+  //
+  BmmCallbackInfo->BmmHiiHandle = HiiAddPackages (
+                                    &mBootMaintGuid,
+                                    BmmCallbackInfo->BmmDriverHandle,
+                                    BmBin,
+                                    UiAppStrings,
+                                    NULL
+                                    );
+  ASSERT (BmmCallbackInfo->BmmHiiHandle != NULL);
+
+  //
+  // Post our File Explorer VFR binary to the HII database.
+  //
+  BmmCallbackInfo->FeHiiHandle = HiiAddPackages (
+                                   &mFileExplorerGuid,
+                                   BmmCallbackInfo->FeDriverHandle,
+                                   FEBin,
+                                   UiAppStrings,
+                                   NULL
+                                   );
+  ASSERT (BmmCallbackInfo->FeHiiHandle != NULL);
+
+  //
+  // Init OpCode Handle and Allocate space for creation of Buffer
+  //
+  mStartOpCodeHandle = HiiAllocateOpCodeHandle ();
+  ASSERT (mStartOpCodeHandle != NULL);
+
+  mEndOpCodeHandle = HiiAllocateOpCodeHandle ();
+  ASSERT (mEndOpCodeHandle != NULL);
+
+  //
+  // Create Hii Extend Label OpCode as the start opcode
+  //
+  mStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode 
(mStartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
+  mStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
+
+  //
+  // Create Hii Extend Label OpCode as the end opcode
+  //
+  mEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (mEndOpCodeHandle, 
&gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
+  mEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
+  mEndLabel->Number       = LABEL_END;
+
+  mBmmCallbackInfo = BmmCallbackInfo;
+
+  InitializeStringDepository ();
+
+}
+
+/**
+  Remove the installed BootMaint and FileExplorer HiiPackages.
+
+**/
+
+VOID
+FreeBMPackage(
+  VOID
+  )
+{
+  BMM_CALLBACK_DATA         *BmmCallbackInfo;
+
+  if (mStartOpCodeHandle != NULL) {
+    HiiFreeOpCodeHandle (mStartOpCodeHandle);
+  }
+
+  if (mEndOpCodeHandle != NULL) {
+    HiiFreeOpCodeHandle (mEndOpCodeHandle);
+  }
+
+  FreeAllMenu ();
+  CleanUpStringDepository ();
+
+  BmmCallbackInfo = mBmmCallbackInfo;
+
+  //
+  // Remove our IFR data from HII database
+  //
+  HiiRemovePackages (BmmCallbackInfo->BmmHiiHandle);
+  HiiRemovePackages (BmmCallbackInfo->FeHiiHandle);
+
+  gBS->UninstallMultipleProtocolInterfaces (
+         BmmCallbackInfo->FeDriverHandle,
+         &gEfiDevicePathProtocolGuid,
+         &mFeHiiVendorDevicePath,
+         &gEfiHiiConfigAccessProtocolGuid,
+         &BmmCallbackInfo->FeConfigAccess,
+         NULL
+         );
+
+  gBS->UninstallMultipleProtocolInterfaces (
+         BmmCallbackInfo->BmmDriverHandle,
+         &gEfiDevicePathProtocolGuid,
+         &mBmmHiiVendorDevicePath,
+         &gEfiHiiConfigAccessProtocolGuid,
+         &BmmCallbackInfo->BmmConfigAccess,
+         NULL
+         );
+
+  FreePool (BmmCallbackInfo->LoadContext);
+  FreePool (BmmCallbackInfo);
+}
+

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

@@ Diff output truncated at 100000 characters. @@

------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to