]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/BdsDxe/BootMaint/Variable.c
Move BdsDxe and GenericBdsLib to IntelFrameworkModulePkg, these modules need dependen...
[mirror_edk2.git] / MdeModulePkg / Universal / BdsDxe / BootMaint / Variable.c
diff --git a/MdeModulePkg/Universal/BdsDxe/BootMaint/Variable.c b/MdeModulePkg/Universal/BdsDxe/BootMaint/Variable.c
deleted file mode 100644 (file)
index 5cc7abc..0000000
+++ /dev/null
@@ -1,1417 +0,0 @@
-/** @file\r
-  Variable operation that will be used by bootmaint\r
-\r
-Copyright (c) 2004 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "BootMaint.h"\r
-\r
-/**\r
-  Delete Boot Option that represent a Deleted state in BootOptionMenu.\r
-  After deleting this boot option, call Var_ChangeBootOrder to\r
-  make sure BootOrder is in valid state.\r
-\r
-  @retval EFI_SUCCESS   If all boot load option EFI Variables corresponding to  \r
-                        BM_LOAD_CONTEXT marked for deletion is deleted.\r
-  @retval EFI_NOT_FOUND If can not find the boot option want to be deleted.\r
-  @return Others        If failed to update the "BootOrder" variable after deletion. \r
-\r
-**/\r
-EFI_STATUS\r
-Var_DelBootOption (\r
-  VOID\r
-  )\r
-{\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  UINT16          BootString[10];\r
-  EFI_STATUS      Status;\r
-  UINTN           Index;\r
-  UINTN           Index2;\r
-\r
-  Status  = EFI_SUCCESS;\r
-  Index2  = 0;\r
-  for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, (Index - Index2));\r
-    if (NULL == NewMenuEntry) {\r
-      return EFI_NOT_FOUND;\r
-    }\r
-\r
-    NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-    if (!NewLoadContext->Deleted) {\r
-      continue;\r
-    }\r
-\r
-    UnicodeSPrint (\r
-      BootString,\r
-      sizeof (BootString),\r
-      L"Boot%04x",\r
-      NewMenuEntry->OptionNumber\r
-      );\r
-\r
-    EfiLibDeleteVariable (BootString, &gEfiGlobalVariableGuid);\r
-    Index2++;\r
-    //\r
-    // If current Load Option is the same as BootNext,\r
-    // must delete BootNext in order to make sure\r
-    // there will be no panic on next boot\r
-    //\r
-    if (NewLoadContext->IsBootNext) {\r
-      EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
-    }\r
-\r
-    RemoveEntryList (&NewMenuEntry->Link);\r
-    BOpt_DestroyMenuEntry (NewMenuEntry);\r
-    NewMenuEntry = NULL;\r
-  }\r
-\r
-  BootOptionMenu.MenuNumber -= Index2;\r
-\r
-  Status = Var_ChangeBootOrder ();\r
-  return Status;\r
-}\r
-\r
-/**\r
-  After any operation on Boot####, there will be a discrepancy in BootOrder.\r
-  Since some are missing but in BootOrder, while some are present but are\r
-  not reflected by BootOrder. Then a function rebuild BootOrder from\r
-  scratch by content from BootOptionMenu is needed.\r
-\r
-\r
-  \r
-\r
-  @retval  EFI_SUCCESS  The boot order is updated successfully.\r
-  @return               EFI_STATUS other than EFI_SUCCESS if failed to\r
-                        Set the "BootOrder" EFI Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_ChangeBootOrder (\r
-  VOID\r
-  )\r
-{\r
-\r
-  EFI_STATUS    Status;\r
-  BM_MENU_ENTRY *NewMenuEntry;\r
-  UINT16        *BootOrderList;\r
-  UINT16        *BootOrderListPtr;\r
-  UINTN         BootOrderListSize;\r
-  UINTN         Index;\r
-\r
-  BootOrderList     = NULL;\r
-  BootOrderListSize = 0;\r
-\r
-  //\r
-  // First check whether BootOrder is present in current configuration\r
-  //\r
-  BootOrderList = BdsLibGetVariableAndSize (\r
-                    L"BootOrder",\r
-                    &gEfiGlobalVariableGuid,\r
-                    &BootOrderListSize\r
-                    );\r
-\r
-  //\r
-  // If exists, delete it to hold new BootOrder\r
-  //\r
-  if (BootOrderList != NULL) {\r
-    EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
-    FreePool (BootOrderList);\r
-    BootOrderList = NULL;\r
-  }\r
-  //\r
-  // Maybe here should be some check method to ensure that\r
-  // no new added boot options will be added\r
-  // but the setup engine now will give only one callback\r
-  // that is to say, user are granted only one chance to\r
-  // decide whether the boot option will be added or not\r
-  // there should be no indictor to show whether this\r
-  // is a "new" boot option\r
-  //\r
-  BootOrderListSize = BootOptionMenu.MenuNumber;\r
-\r
-  if (BootOrderListSize > 0) {\r
-    BootOrderList = AllocateZeroPool (BootOrderListSize * sizeof (UINT16));\r
-    ASSERT (BootOrderList != NULL);\r
-    BootOrderListPtr = BootOrderList;\r
-\r
-    //\r
-    // Get all current used Boot#### from BootOptionMenu.\r
-    // OptionNumber in each BM_LOAD_OPTION is really its\r
-    // #### value.\r
-    //\r
-    for (Index = 0; Index < BootOrderListSize; Index++) {\r
-      NewMenuEntry    = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
-      *BootOrderList  = (UINT16) NewMenuEntry->OptionNumber;\r
-      BootOrderList++;\r
-    }\r
-\r
-    BootOrderList = BootOrderListPtr;\r
-\r
-    //\r
-    // After building the BootOrderList, write it back\r
-    //\r
-    Status = gRT->SetVariable (\r
-                    L"BootOrder",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    BootOrderListSize * sizeof (UINT16),\r
-                    BootOrderList\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Delete Load Option that represent a Deleted state in BootOptionMenu.\r
-  After deleting this Driver option, call Var_ChangeDriverOrder to\r
-  make sure DriverOrder is in valid state.\r
-\r
-  @retval EFI_SUCCESS       Load Option is successfully updated.\r
-  @retval EFI_NOT_FOUND     Fail to find the driver option want to be deleted.\r
-  @return Other value than EFI_SUCCESS if failed to update "Driver Order" EFI\r
-          Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_DelDriverOption (\r
-  VOID\r
-  )\r
-{\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  UINT16          DriverString[12];\r
-  EFI_STATUS      Status;\r
-  UINTN           Index;\r
-  UINTN           Index2;\r
-\r
-  Status  = EFI_SUCCESS;\r
-  Index2  = 0;\r
-  for (Index = 0; Index < DriverOptionMenu.MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (&DriverOptionMenu, (Index - Index2));\r
-    if (NULL == NewMenuEntry) {\r
-      return EFI_NOT_FOUND;\r
-    }\r
-\r
-    NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-    if (!NewLoadContext->Deleted) {\r
-      continue;\r
-    }\r
-\r
-    UnicodeSPrint (\r
-      DriverString,\r
-      sizeof (DriverString),\r
-      L"Driver%04x",\r
-      NewMenuEntry->OptionNumber\r
-      );\r
-\r
-    EfiLibDeleteVariable (DriverString, &gEfiGlobalVariableGuid);\r
-    Index2++;\r
-\r
-    RemoveEntryList (&NewMenuEntry->Link);\r
-    BOpt_DestroyMenuEntry (NewMenuEntry);\r
-    NewMenuEntry = NULL;\r
-  }\r
-\r
-  DriverOptionMenu.MenuNumber -= Index2;\r
-\r
-  Status = Var_ChangeDriverOrder ();\r
-  return Status;\r
-}\r
-\r
-/**\r
-  After any operation on Driver####, there will be a discrepancy in\r
-  DriverOrder. Since some are missing but in DriverOrder, while some\r
-  are present but are not reflected by DriverOrder. Then a function\r
-  rebuild DriverOrder from scratch by content from DriverOptionMenu is\r
-  needed.\r
-\r
-  @retval  EFI_SUCCESS  The driver order is updated successfully.\r
-  @return               EFI_STATUS other than EFI_SUCCESS if failed to\r
-                                 Set the "DriverOrder" EFI Variable.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_ChangeDriverOrder (\r
-  VOID\r
-  )\r
-{\r
-  EFI_STATUS    Status;\r
-  BM_MENU_ENTRY *NewMenuEntry;\r
-  UINT16        *DriverOrderList;\r
-  UINT16        *DriverOrderListPtr;\r
-  UINTN         DriverOrderListSize;\r
-  UINTN         Index;\r
-\r
-  DriverOrderList     = NULL;\r
-  DriverOrderListSize = 0;\r
-\r
-  //\r
-  // First check whether DriverOrder is present in current configuration\r
-  //\r
-  DriverOrderList = BdsLibGetVariableAndSize (\r
-                      L"DriverOrder",\r
-                      &gEfiGlobalVariableGuid,\r
-                      &DriverOrderListSize\r
-                      );\r
-\r
-  //\r
-  // If exists, delete it to hold new DriverOrder\r
-  //\r
-  if (DriverOrderList != NULL) {\r
-    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
-    FreePool (DriverOrderList);\r
-    DriverOrderList = NULL;\r
-  }\r
-\r
-  DriverOrderListSize = DriverOptionMenu.MenuNumber;\r
-\r
-  if (DriverOrderListSize > 0) {\r
-    DriverOrderList = AllocateZeroPool (DriverOrderListSize * sizeof (UINT16));\r
-    ASSERT (DriverOrderList != NULL);\r
-    DriverOrderListPtr = DriverOrderList;\r
-\r
-    //\r
-    // Get all current used Driver#### from DriverOptionMenu.\r
-    // OptionNumber in each BM_LOAD_OPTION is really its\r
-    // #### value.\r
-    //\r
-    for (Index = 0; Index < DriverOrderListSize; Index++) {\r
-      NewMenuEntry      = BOpt_GetMenuEntry (&DriverOptionMenu, Index);\r
-      *DriverOrderList  = (UINT16) NewMenuEntry->OptionNumber;\r
-      DriverOrderList++;\r
-    }\r
-\r
-    DriverOrderList = DriverOrderListPtr;\r
-\r
-    //\r
-    // After building the DriverOrderList, write it back\r
-    //\r
-    Status = gRT->SetVariable (\r
-                    L"DriverOrder",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    DriverOrderListSize * sizeof (UINT16),\r
-                    DriverOrderList\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Update the device path of "ConOut", "ConIn" and "ErrOut" \r
-  based on the new BaudRate, Data Bits, parity and Stop Bits\r
-  set.\r
-\r
-**/\r
-VOID\r
-Var_UpdateAllConsoleOption (\r
-  VOID\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL  *OutDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *InpDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL  *ErrDevicePath;\r
-  EFI_STATUS                Status;\r
-\r
-  OutDevicePath = EfiLibGetVariable (L"ConOut", &gEfiGlobalVariableGuid);\r
-  InpDevicePath = EfiLibGetVariable (L"ConIn", &gEfiGlobalVariableGuid);\r
-  ErrDevicePath = EfiLibGetVariable (L"ErrOut", &gEfiGlobalVariableGuid);\r
-  if (OutDevicePath != NULL) {\r
-    ChangeVariableDevicePath (OutDevicePath);\r
-    Status = gRT->SetVariable (\r
-                    L"ConOut",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    GetDevicePathSize (OutDevicePath),\r
-                    OutDevicePath\r
-                    );\r
-    ASSERT (!EFI_ERROR (Status));\r
-  }\r
-\r
-  if (InpDevicePath != NULL) {\r
-    ChangeVariableDevicePath (InpDevicePath);\r
-    Status = gRT->SetVariable (\r
-                    L"ConIn",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    GetDevicePathSize (InpDevicePath),\r
-                    InpDevicePath\r
-                    );\r
-    ASSERT (!EFI_ERROR (Status));\r
-  }\r
-\r
-  if (ErrDevicePath != NULL) {\r
-    ChangeVariableDevicePath (ErrDevicePath);\r
-    Status = gRT->SetVariable (\r
-                    L"ErrOut",\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    GetDevicePathSize (ErrDevicePath),\r
-                    ErrDevicePath\r
-                    );\r
-    ASSERT (!EFI_ERROR (Status));\r
-  }\r
-}\r
-\r
-/**\r
-  This function delete and build multi-instance device path for\r
-  specified type of console device.\r
-\r
-  This function clear the EFI variable defined by ConsoleName and\r
-  gEfiGlobalVariableGuid. It then build the multi-instance device\r
-  path by appending the device path of the Console (In/Out/Err) instance \r
-  in ConsoleMenu. Then it scan all corresponding console device by\r
-  scanning Terminal (built from device supporting Serial I/O instances)\r
-  devices in TerminalMenu. At last, it save a EFI variable specifed\r
-  by ConsoleName and gEfiGlobalVariableGuid.\r
-\r
-  @param ConsoleName     The name for the console device type. They are\r
-                         usually "ConIn", "ConOut" and "ErrOut".\r
-  @param ConsoleMenu     The console memu which is a list of console devices.\r
-  @param UpdatePageId    The flag specifying which type of console device\r
-                         to be processed.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleOption (\r
-  IN UINT16                     *ConsoleName,\r
-  IN BM_MENU_OPTION             *ConsoleMenu,\r
-  IN UINT16                     UpdatePageId\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL  *ConDevicePath;\r
-  BM_MENU_ENTRY             *NewMenuEntry;\r
-  BM_CONSOLE_CONTEXT        *NewConsoleContext;\r
-  BM_TERMINAL_CONTEXT       *NewTerminalContext;\r
-  EFI_STATUS                Status;\r
-  VENDOR_DEVICE_PATH        Vendor;\r
-  EFI_DEVICE_PATH_PROTOCOL  *TerminalDevicePath;\r
-  UINTN                     Index;\r
-\r
-  ConDevicePath = EfiLibGetVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
-  if (ConDevicePath != NULL) {\r
-    EfiLibDeleteVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
-    FreePool (ConDevicePath);\r
-    ConDevicePath = NULL;\r
-  };\r
-\r
-  //\r
-  // First add all console input device from console input menu\r
-  //\r
-  for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
-\r
-    NewConsoleContext = (BM_CONSOLE_CONTEXT *) NewMenuEntry->VariableContext;\r
-    if (NewConsoleContext->IsActive) {\r
-      ConDevicePath = AppendDevicePathInstance (\r
-                        ConDevicePath,\r
-                        NewConsoleContext->DevicePath\r
-                        );\r
-    }\r
-  }\r
-\r
-  for (Index = 0; Index < TerminalMenu.MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (&TerminalMenu, Index);\r
-\r
-    NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-    if (((NewTerminalContext->IsConIn != 0) && (UpdatePageId == FORM_CON_IN_ID)) ||\r
-        ((NewTerminalContext->IsConOut != 0)  && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
-        ((NewTerminalContext->IsStdErr  != 0) && (UpdatePageId == FORM_CON_ERR_ID))\r
-        ) {\r
-      Vendor.Header.Type    = MESSAGING_DEVICE_PATH;\r
-      Vendor.Header.SubType = MSG_VENDOR_DP;\r
-      \r
-      ASSERT (NewTerminalContext->TerminalType < (sizeof (TerminalTypeGuid) / sizeof (TerminalTypeGuid[0])));\r
-      CopyMem (\r
-        &Vendor.Guid,\r
-        &TerminalTypeGuid[NewTerminalContext->TerminalType],\r
-        sizeof (EFI_GUID)\r
-        );\r
-      SetDevicePathNodeLength (&Vendor.Header, sizeof (VENDOR_DEVICE_PATH));\r
-      TerminalDevicePath = AppendDevicePathNode (\r
-                            NewTerminalContext->DevicePath,\r
-                            (EFI_DEVICE_PATH_PROTOCOL *) &Vendor\r
-                            );\r
-      ASSERT (TerminalDevicePath != NULL);\r
-      ChangeTerminalDevicePath (TerminalDevicePath, TRUE);\r
-      ConDevicePath = AppendDevicePathInstance (\r
-                        ConDevicePath,\r
-                        TerminalDevicePath\r
-                        );\r
-    }\r
-  }\r
-\r
-  if (ConDevicePath != NULL) {\r
-    Status = gRT->SetVariable (\r
-                    ConsoleName,\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    GetDevicePathSize (ConDevicePath),\r
-                    ConDevicePath\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-\r
-}\r
-\r
-/**\r
-  This function delete and build multi-instance device path ConIn\r
-  console device.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleInpOption (\r
-  VOID\r
-  )\r
-{\r
-  return Var_UpdateConsoleOption (L"ConIn", &ConsoleInpMenu, FORM_CON_IN_ID);\r
-}\r
-\r
-/**\r
-  This function delete and build multi-instance device path ConOut\r
-  console device.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConsoleOutOption (\r
-  VOID\r
-  )\r
-{\r
-  return Var_UpdateConsoleOption (L"ConOut", &ConsoleOutMenu, FORM_CON_OUT_ID);\r
-}\r
-\r
-/**\r
-  This function delete and build multi-instance device path ErrOut\r
-  console device.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.  \r
-**/\r
-EFI_STATUS\r
-Var_UpdateErrorOutOption (\r
-  VOID\r
-  )\r
-{\r
-  return Var_UpdateConsoleOption (L"ErrOut", &ConsoleErrMenu, FORM_CON_ERR_ID);\r
-}\r
-\r
-/**\r
-  This function create a currently loaded Drive Option from \r
-  the BMM. It then appends this Driver Option to the end of \r
-  the "DriverOrder" list. It append this Driver Opotion to the end\r
-  of DriverOptionMenu.\r
-\r
-  @param CallbackData    The BMM context data.\r
-  @param HiiHandle       The HII handle associated with the BMM formset.\r
-  @param DescriptionData The description of this driver option.\r
-  @param OptionalData    The optional load option.\r
-  @param ForceReconnect  If to force reconnect.\r
-\r
-  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
-  @retval EFI_SUCCESS          If function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateDriverOption (\r
-  IN  BMM_CALLBACK_DATA         *CallbackData,\r
-  IN  EFI_HII_HANDLE            HiiHandle,\r
-  IN  UINT16                    *DescriptionData,\r
-  IN  UINT16                    *OptionalData,\r
-  IN  UINT8                     ForceReconnect\r
-  )\r
-{\r
-  UINT16          Index;\r
-  UINT16          *DriverOrderList;\r
-  UINT16          *NewDriverOrderList;\r
-  UINT16          DriverString[12];\r
-  UINTN           DriverOrderListSize;\r
-  VOID            *Buffer;\r
-  UINTN           BufferSize;\r
-  UINT8           *Ptr;\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  BOOLEAN         OptionalDataExist;\r
-  EFI_STATUS      Status;\r
-\r
-  OptionalDataExist = FALSE;\r
-\r
-  Index             = BOpt_GetDriverOptionNumber ();\r
-  UnicodeSPrint (\r
-    DriverString,\r
-    sizeof (DriverString),\r
-    L"Driver%04x",\r
-    Index\r
-    );\r
-\r
-  if (*DescriptionData == 0x0000) {\r
-    StrCpy (DescriptionData, DriverString);\r
-  }\r
-\r
-  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescriptionData);\r
-  BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
-  if (*OptionalData != 0x0000) {\r
-    OptionalDataExist = TRUE;\r
-    BufferSize += StrSize (OptionalData);\r
-  }\r
-\r
-  Buffer = AllocateZeroPool (BufferSize);\r
-  if (NULL == Buffer) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
-  if (NULL == NewMenuEntry) {\r
-    FreePool (Buffer);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  NewLoadContext                  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-  NewLoadContext->Deleted         = FALSE;\r
-  NewLoadContext->LoadOptionSize  = BufferSize;\r
-  Ptr = (UINT8 *) Buffer;\r
-  NewLoadContext->LoadOption = Ptr;\r
-  *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE | (ForceReconnect << 1);\r
-  NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
-  NewLoadContext->IsActive = TRUE;\r
-  NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
-  Ptr += sizeof (UINT32);\r
-  *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-  NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
-\r
-  Ptr += sizeof (UINT16);\r
-  CopyMem (\r
-    Ptr,\r
-    DescriptionData,\r
-    StrSize (DescriptionData)\r
-    );\r
-\r
-  NewLoadContext->Description = AllocateZeroPool (StrSize (DescriptionData));\r
-  ASSERT (NewLoadContext->Description != NULL);\r
-  NewMenuEntry->DisplayString = NewLoadContext->Description;\r
-  CopyMem (\r
-    NewLoadContext->Description,\r
-    (VOID *) Ptr,\r
-    StrSize (DescriptionData)\r
-    );\r
-\r
-  Ptr += StrSize (DescriptionData);\r
-  CopyMem (\r
-    Ptr,\r
-    CallbackData->LoadContext->FilePathList,\r
-    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
-    );\r
-\r
-  NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
-  ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
-  CopyMem (\r
-    NewLoadContext->FilePathList,\r
-    (VOID *) Ptr,\r
-    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
-    );\r
-\r
-  NewMenuEntry->HelpString    = DevicePathToStr (NewLoadContext->FilePathList);\r
-  NewMenuEntry->OptionNumber  = Index;\r
-  NewMenuEntry->DisplayStringToken = GetStringTokenFromDepository (\r
-                                      CallbackData,\r
-                                      DriverOptionStrDepository\r
-                                      );\r
-  HiiLibNewString (HiiHandle, &NewMenuEntry->DisplayStringToken, NewMenuEntry->DisplayString);\r
-\r
-  NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
-                                    CallbackData,\r
-                                    DriverOptionHelpStrDepository\r
-                                    );\r
-  HiiLibNewString (HiiHandle, &NewMenuEntry->HelpStringToken, NewMenuEntry->HelpString);\r
-\r
-  if (OptionalDataExist) {\r
-    Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
-    CopyMem (\r
-      Ptr,\r
-      OptionalData,\r
-      StrSize (OptionalData)\r
-      );\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  DriverString,\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BufferSize,\r
-                  Buffer\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-  DriverOrderList = BdsLibGetVariableAndSize (\r
-                      L"DriverOrder",\r
-                      &gEfiGlobalVariableGuid,\r
-                      &DriverOrderListSize\r
-                      );\r
-  NewDriverOrderList = AllocateZeroPool (DriverOrderListSize + sizeof (UINT16));\r
-  ASSERT (NewDriverOrderList != NULL);\r
-  CopyMem (NewDriverOrderList, DriverOrderList, DriverOrderListSize);\r
-  NewDriverOrderList[DriverOrderListSize / sizeof (UINT16)] = Index;\r
-  if (DriverOrderList != NULL) {\r
-    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  L"DriverOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  DriverOrderListSize + sizeof (UINT16),\r
-                  NewDriverOrderList\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-  if (DriverOrderList != NULL) {\r
-    FreePool (DriverOrderList);\r
-  }\r
-  DriverOrderList = NULL;\r
-  FreePool (NewDriverOrderList);\r
-  InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
-  DriverOptionMenu.MenuNumber++;\r
-\r
-  *DescriptionData  = 0x0000;\r
-  *OptionalData     = 0x0000;\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  This function create a currently loaded Boot Option from \r
-  the BMM. It then appends this Boot Option to the end of \r
-  the "BootOrder" list. It also append this Boot Opotion to the end\r
-  of BootOptionMenu.\r
-\r
-  @param CallbackData    The BMM context data.\r
-  @param NvRamMap        The file explorer formset internal state.\r
-\r
-  @retval EFI_OUT_OF_RESOURCES If not enought memory to complete the operation.\r
-  @retval EFI_SUCCESS          If function completes successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootOption (\r
-  IN  BMM_CALLBACK_DATA                   *CallbackData,\r
-  IN  FILE_EXPLORER_NV_DATA               *NvRamMap\r
-  )\r
-{\r
-  UINT16          *BootOrderList;\r
-  UINT16          *NewBootOrderList;\r
-  UINTN           BootOrderListSize;\r
-  UINT16          BootString[10];\r
-  VOID            *Buffer;\r
-  UINTN           BufferSize;\r
-  UINT8           *Ptr;\r
-  UINT16          Index;\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-  BOOLEAN         OptionalDataExist;\r
-  EFI_STATUS      Status;\r
-\r
-  OptionalDataExist = FALSE;\r
-\r
-  Index = BOpt_GetBootOptionNumber () ;\r
-  UnicodeSPrint (BootString, sizeof (BootString), L"Boot%04x", Index);\r
-\r
-  if (NvRamMap->DescriptionData[0] == 0x0000) {\r
-    StrCpy (NvRamMap->DescriptionData, BootString);\r
-  }\r
-\r
-  BufferSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (NvRamMap->DescriptionData);\r
-  BufferSize += GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
-  if (NvRamMap->OptionalData[0] != 0x0000) {\r
-    OptionalDataExist = TRUE;\r
-    BufferSize += StrSize (NvRamMap->OptionalData);\r
-  }\r
-\r
-  Buffer = AllocateZeroPool (BufferSize);\r
-  if (NULL == Buffer) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  NewMenuEntry = BOpt_CreateMenuEntry (BM_LOAD_CONTEXT_SELECT);\r
-  if (NULL == NewMenuEntry) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  NewLoadContext                  = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-  NewLoadContext->Deleted         = FALSE;\r
-  NewLoadContext->LoadOptionSize  = BufferSize;\r
-  Ptr = (UINT8 *) Buffer;\r
-  NewLoadContext->LoadOption = Ptr;\r
-  *((UINT32 *) Ptr) = LOAD_OPTION_ACTIVE;\r
-  NewLoadContext->Attributes = *((UINT32 *) Ptr);\r
-  NewLoadContext->IsActive = TRUE;\r
-  NewLoadContext->ForceReconnect = (BOOLEAN) (NewLoadContext->Attributes & LOAD_OPTION_FORCE_RECONNECT);\r
-\r
-  Ptr += sizeof (UINT32);\r
-  *((UINT16 *) Ptr) = (UINT16) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-  NewLoadContext->FilePathListLength = *((UINT16 *) Ptr);\r
-  Ptr += sizeof (UINT16);\r
-\r
-  CopyMem (\r
-    Ptr,\r
-    NvRamMap->DescriptionData,\r
-    StrSize (NvRamMap->DescriptionData)\r
-    );\r
-\r
-  NewLoadContext->Description = AllocateZeroPool (StrSize (NvRamMap->DescriptionData));\r
-  ASSERT (NewLoadContext->Description != NULL);\r
-\r
-  NewMenuEntry->DisplayString = NewLoadContext->Description;\r
-  CopyMem (\r
-    NewLoadContext->Description,\r
-    (VOID *) Ptr,\r
-    StrSize (NvRamMap->DescriptionData)\r
-    );\r
-\r
-  Ptr += StrSize (NvRamMap->DescriptionData);\r
-  CopyMem (\r
-    Ptr,\r
-    CallbackData->LoadContext->FilePathList,\r
-    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
-    );\r
-\r
-  NewLoadContext->FilePathList = AllocateZeroPool (GetDevicePathSize (CallbackData->LoadContext->FilePathList));\r
-  ASSERT (NewLoadContext->FilePathList != NULL);\r
-\r
-  CopyMem (\r
-    NewLoadContext->FilePathList,\r
-    (VOID *) Ptr,\r
-    GetDevicePathSize (CallbackData->LoadContext->FilePathList)\r
-    );\r
-\r
-  NewMenuEntry->HelpString    = DevicePathToStr (NewLoadContext->FilePathList);\r
-  NewMenuEntry->OptionNumber  = Index;\r
-  NewMenuEntry->DisplayStringToken = GetStringTokenFromDepository (\r
-                                      CallbackData,\r
-                                      BootOptionStrDepository\r
-                                      );\r
-  HiiLibNewString (CallbackData->FeHiiHandle, &NewMenuEntry->DisplayStringToken, NewMenuEntry->DisplayString);\r
-\r
-  NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
-                                    CallbackData,\r
-                                    BootOptionHelpStrDepository\r
-                                    );\r
-  HiiLibNewString (CallbackData->FeHiiHandle, &NewMenuEntry->HelpStringToken, NewMenuEntry->HelpString);\r
-\r
-  if (OptionalDataExist) {\r
-    Ptr += (UINT8) GetDevicePathSize (CallbackData->LoadContext->FilePathList);\r
-\r
-    CopyMem (Ptr, NvRamMap->OptionalData, StrSize (NvRamMap->OptionalData));\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  BootString,\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BufferSize,\r
-                  Buffer\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  BootOrderList = BdsLibGetVariableAndSize (\r
-                    L"BootOrder",\r
-                    &gEfiGlobalVariableGuid,\r
-                    &BootOrderListSize\r
-                    );\r
-\r
-  NewBootOrderList = AllocateZeroPool (BootOrderListSize + sizeof (UINT16));\r
-  ASSERT (NewBootOrderList != NULL);\r
-  CopyMem (NewBootOrderList, BootOrderList, BootOrderListSize);\r
-  NewBootOrderList[BootOrderListSize / sizeof (UINT16)] = Index;\r
-\r
-  if (BootOrderList != NULL) {\r
-    EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
-    FreePool (BootOrderList);\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  L"BootOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BootOrderListSize + sizeof (UINT16),\r
-                  NewBootOrderList\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  FreePool (NewBootOrderList);\r
-  NewBootOrderList = NULL;\r
-  InsertTailList (&BootOptionMenu.Head, &NewMenuEntry->Link);\r
-  BootOptionMenu.MenuNumber++;\r
-\r
-  NvRamMap->DescriptionData[0]  = 0x0000;\r
-  NvRamMap->OptionalData[0]     = 0x0000;\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  This function update the "BootNext" EFI Variable. If there is \r
-  no "BootNex" specified in BMM, this EFI Variable is deleted.\r
-  It also update the BMM context data specified the "BootNext"\r
-  vaule.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-  @retval EFI_SUCCESS    The function complete successfully.\r
-  @return                The EFI variable can be saved. See gRT->SetVariable \r
-                         for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootNext (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  )\r
-{\r
-  BM_MENU_ENTRY     *NewMenuEntry;\r
-  BM_LOAD_CONTEXT   *NewLoadContext;\r
-  BMM_FAKE_NV_DATA  *CurrentFakeNVMap;\r
-  UINT16            Index;\r
-  EFI_STATUS        Status;\r
-\r
-  Status            = EFI_SUCCESS;\r
-  CurrentFakeNVMap  = &CallbackData->BmmFakeNvData;\r
-  for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (&BootOptionMenu, Index);\r
-    ASSERT (NULL != NewMenuEntry);\r
-\r
-    NewLoadContext              = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-    NewLoadContext->IsBootNext  = FALSE;\r
-  }\r
-\r
-  if (CurrentFakeNVMap->BootNext == BootOptionMenu.MenuNumber) {\r
-    EfiLibDeleteVariable (L"BootNext", &gEfiGlobalVariableGuid);\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  NewMenuEntry = BOpt_GetMenuEntry (\r
-                  &BootOptionMenu,\r
-                  CurrentFakeNVMap->BootNext\r
-                  );\r
-  ASSERT (NewMenuEntry != NULL);\r
-\r
-  NewLoadContext = (BM_LOAD_CONTEXT *) NewMenuEntry->VariableContext;\r
-  Status = gRT->SetVariable (\r
-                  L"BootNext",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  sizeof (UINT16),\r
-                  &NewMenuEntry->OptionNumber\r
-                  );\r
-  NewLoadContext->IsBootNext              = TRUE;\r
-  CallbackData->BmmOldFakeNVData.BootNext = CurrentFakeNVMap->BootNext;\r
-  return Status;\r
-}\r
-\r
-/**\r
-  This function update the "BootOrder" EFI Variable based on\r
-  BMM Formset's NV map. It then refresh BootOptionMenu\r
-  with the new "BootOrder" list.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-  @retval EFI_SUCCESS             The function complete successfully.\r
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to complete the function.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBootOrder (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINT16      Index;\r
-  UINT16      *BootOrderList;\r
-  UINT16      *NewBootOrderList;\r
-  UINTN       BootOrderListSize;\r
-\r
-  BootOrderList     = NULL;\r
-  BootOrderListSize = 0;\r
-\r
-  //\r
-  // First check whether BootOrder is present in current configuration\r
-  //\r
-  BootOrderList = BdsLibGetVariableAndSize (\r
-                    L"BootOrder",\r
-                    &gEfiGlobalVariableGuid,\r
-                    &BootOrderListSize\r
-                    );\r
-\r
-  NewBootOrderList = AllocateZeroPool (BootOrderListSize);\r
-  if (NewBootOrderList == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  //\r
-  // If exists, delete it to hold new BootOrder\r
-  //\r
-  if (BootOrderList != NULL) {\r
-    EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
-    FreePool (BootOrderList);\r
-  }\r
-\r
-  ASSERT (BootOptionMenu.MenuNumber <= (sizeof (CallbackData->BmmFakeNvData.OptionOrder) / sizeof (CallbackData->BmmFakeNvData.OptionOrder[0])));\r
-  for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
-    NewBootOrderList[Index] = (UINT16) (CallbackData->BmmFakeNvData.OptionOrder[Index] - 1);\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  L"BootOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BootOrderListSize,\r
-                  NewBootOrderList\r
-                  );\r
-  FreePool (NewBootOrderList);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  BOpt_FreeMenu (&BootOptionMenu);\r
-  BOpt_GetBootOptions (CallbackData);\r
-\r
-  return EFI_SUCCESS;\r
-\r
-}\r
-\r
-/**\r
-  This function update the "DriverOrder" EFI Variable based on\r
-  BMM Formset's NV map. It then refresh DriverOptionMenu\r
-  with the new "DriverOrder" list.\r
-\r
-  @param CallbackData    The BMM context data.\r
-\r
-  @retval EFI_SUCCESS           The function complete successfully.\r
-  @retval EFI_OUT_OF_RESOURCES  Not enough memory to complete the function.\r
-  @return The EFI variable can not be saved. See gRT->SetVariable for detail return information.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateDriverOrder (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINT16      Index;\r
-  UINT16      *DriverOrderList;\r
-  UINT16      *NewDriverOrderList;\r
-  UINTN       DriverOrderListSize;\r
-\r
-  DriverOrderList     = NULL;\r
-  DriverOrderListSize = 0;\r
-\r
-  //\r
-  // First check whether DriverOrder is present in current configuration\r
-  //\r
-  DriverOrderList = BdsLibGetVariableAndSize (\r
-                      L"DriverOrder",\r
-                      &gEfiGlobalVariableGuid,\r
-                      &DriverOrderListSize\r
-                      );\r
-\r
-  NewDriverOrderList = AllocateZeroPool (DriverOrderListSize);\r
-\r
-  if (NewDriverOrderList == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  //\r
-  // If exists, delete it to hold new DriverOrder\r
-  //\r
-  if (DriverOrderList != NULL) {\r
-    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
-    FreePool (DriverOrderList);\r
-  }\r
-\r
-  ASSERT (DriverOrderListSize <= (sizeof (CallbackData->BmmFakeNvData.OptionOrder) / sizeof (CallbackData->BmmFakeNvData.OptionOrder[0])));\r
-  for (Index = 0; Index < DriverOrderListSize; Index++) {\r
-    NewDriverOrderList[Index] = (UINT16) (CallbackData->BmmFakeNvData.OptionOrder[Index] - 1);\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  L"DriverOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  DriverOrderListSize,\r
-                  NewDriverOrderList\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  BOpt_FreeMenu (&DriverOptionMenu);\r
-  BOpt_GetDriverOptions (CallbackData);\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Update the legacy BBS boot option. L"LegacyDevOrder" and EfiLegacyDevOrderGuid EFI Variable\r
-  is udpated with the new Legacy Boot order. The EFI Variable of "Boot####" and gEfiGlobalVariableGuid\r
-  is also updated.\r
-\r
-  @param CallbackData    The context data for BMM.\r
-\r
-  @return EFI_SUCCESS           The function completed successfully.\r
-  @retval EFI_NOT_FOUND         If L"LegacyDevOrder" and EfiLegacyDevOrderGuid EFI Variable can be found.\r
-  @retval EFI_OUT_OF_RESOURCES  Fail to allocate memory resource\r
-**/\r
-EFI_STATUS\r
-Var_UpdateBBSOption (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  )\r
-{\r
-  UINTN                       Index;\r
-  UINTN                       Index2;\r
-  VOID                        *BootOptionVar;\r
-  CHAR16                      VarName[100];\r
-  UINTN                       OptionSize;\r
-  UINT8                       *Ptr;\r
-  EFI_STATUS                  Status;\r
-  CHAR16                      DescString[100];\r
-  CHAR8                       DescAsciiString[100];\r
-  UINTN                       NewOptionSize;\r
-  UINT8                       *NewOptionPtr;\r
-  UINT8                       *TempPtr;\r
-  UINT32                      *Attribute;\r
-  BM_MENU_OPTION              *OptionMenu;\r
-  BM_LEGACY_DEVICE_CONTEXT    *LegacyDeviceContext;\r
-  UINT8                       *LegacyDev;\r
-  UINT8                       *VarData;\r
-  UINTN                       VarSize;\r
-  BM_MENU_ENTRY               *NewMenuEntry;\r
-  BM_LEGACY_DEV_ORDER_CONTEXT *DevOrder;\r
-  UINT8                       *OriginalPtr;\r
-  UINT8                       *DisMap;\r
-  UINTN                       Pos;\r
-  UINTN                       Bit;\r
-  UINT16                      *NewOrder;\r
-  UINT16                      Tmp;\r
-\r
-  LegacyDeviceContext = NULL;\r
-  DisMap              = NULL;\r
-  NewOrder            = NULL;\r
-\r
-  if (FORM_SET_FD_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
-    OptionMenu            = (BM_MENU_OPTION *) &LegacyFDMenu;\r
-    LegacyDev             = CallbackData->BmmFakeNvData.LegacyFD;\r
-    CallbackData->BbsType = BBS_FLOPPY;\r
-  } else {\r
-    if (FORM_SET_HD_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
-      OptionMenu            = (BM_MENU_OPTION *) &LegacyHDMenu;\r
-      LegacyDev             = CallbackData->BmmFakeNvData.LegacyHD;\r
-      CallbackData->BbsType = BBS_HARDDISK;\r
-    } else {\r
-      if (FORM_SET_CD_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
-        OptionMenu            = (BM_MENU_OPTION *) &LegacyCDMenu;\r
-        LegacyDev             = CallbackData->BmmFakeNvData.LegacyCD;\r
-        CallbackData->BbsType = BBS_CDROM;\r
-      } else {\r
-        if (FORM_SET_NET_ORDER_ID == CallbackData->BmmPreviousPageId) {\r
-          OptionMenu            = (BM_MENU_OPTION *) &LegacyNETMenu;\r
-          LegacyDev             = CallbackData->BmmFakeNvData.LegacyNET;\r
-          CallbackData->BbsType = BBS_EMBED_NETWORK;\r
-        } else {\r
-          OptionMenu            = (BM_MENU_OPTION *) &LegacyBEVMenu;\r
-          LegacyDev             = CallbackData->BmmFakeNvData.LegacyBEV;\r
-          CallbackData->BbsType = BBS_BEV_DEVICE;\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  DisMap  = CallbackData->BmmOldFakeNVData.DisableMap;\r
-  Status  = EFI_SUCCESS;\r
-\r
-  //\r
-  // Find the first device's context\r
-  // If all devices are disabled( 0xFF == LegacyDev[0]), LegacyDeviceContext can be set to any VariableContext\r
-  // because we just use it to fill the desc string, and user can not see the string in UI\r
-  //\r
-  for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
-    NewMenuEntry        = BOpt_GetMenuEntry (OptionMenu, Index);\r
-    LegacyDeviceContext = (BM_LEGACY_DEVICE_CONTEXT *) NewMenuEntry->VariableContext;\r
-    if (0xFF != LegacyDev[0] && LegacyDev[0] == LegacyDeviceContext->Index) {\r
-      DEBUG ((DEBUG_ERROR, "DescStr: %s\n", LegacyDeviceContext->Description));\r
-      break;\r
-    }\r
-  }\r
-  //\r
-  // Update the Variable "LegacyDevOrder"\r
-  //\r
-  VarData = (UINT8 *) BdsLibGetVariableAndSize (\r
-                        VAR_LEGACY_DEV_ORDER,\r
-                        &EfiLegacyDevOrderGuid,\r
-                        &VarSize\r
-                        );\r
-\r
-  if (VarData == NULL) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  OriginalPtr = VarData;\r
-  DevOrder    = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
-\r
-  while (VarData < VarData + VarSize) {\r
-    if (DevOrder->BbsType == CallbackData->BbsType) {\r
-      break;\r
-    }\r
-\r
-    VarData += sizeof (BBS_TYPE);\r
-    VarData += *(UINT16 *) VarData;\r
-    DevOrder = (BM_LEGACY_DEV_ORDER_CONTEXT *) VarData;\r
-  }\r
-\r
-  if (VarData >= VarData + VarSize) {\r
-    FreePool (OriginalPtr);\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  NewOrder = (UINT16 *) AllocateZeroPool (DevOrder->Length - sizeof (UINT16));\r
-  if (NewOrder == NULL) {\r
-    FreePool (VarData);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  for (Index = 0; Index < OptionMenu->MenuNumber; Index++) {\r
-    if (0xFF == LegacyDev[Index]) {\r
-      break;\r
-    }\r
-\r
-    NewOrder[Index] = LegacyDev[Index];\r
-  }\r
-  //\r
-  // Only the enable/disable state of each boot device with same device type can be changed,\r
-  // so we can count on the index information in DevOrder.\r
-  // DisMap bit array is the only reliable source to check a device's en/dis state,\r
-  // so we use DisMap to set en/dis state of each item in NewOrder array\r
-  //\r
-  for (Index2 = 0; Index2 < OptionMenu->MenuNumber; Index2++) {\r
-    Tmp = *(UINT16 *) ((UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16) + Index2 * sizeof (UINT16));\r
-    Tmp &= 0xFF;\r
-    Pos = Tmp / 8;\r
-    Bit = 7 - (Tmp % 8);\r
-    if ((DisMap[Pos] & (1 << Bit)) != 0) {\r
-      NewOrder[Index] = (UINT16) (0xFF00 | Tmp);\r
-      Index++;\r
-    }\r
-  }\r
-\r
-  CopyMem (\r
-    (UINT8 *) DevOrder + sizeof (BBS_TYPE) + sizeof (UINT16),\r
-    NewOrder,\r
-    DevOrder->Length - sizeof (UINT16)\r
-    );\r
-  FreePool (NewOrder);\r
-\r
-  Status = gRT->SetVariable (\r
-                  VAR_LEGACY_DEV_ORDER,\r
-                  &EfiLegacyDevOrderGuid,\r
-                  VAR_FLAG,\r
-                  VarSize,\r
-                  OriginalPtr\r
-                  );\r
-\r
-  FreePool (OriginalPtr);\r
-\r
-  //\r
-  // Update Optional Data of Boot####\r
-  //\r
-  BootOptionVar = GetLegacyBootOptionVar (CallbackData->BbsType, &Index, &OptionSize);\r
-\r
-  if (BootOptionVar != NULL) {\r
-    CopyMem (\r
-      DescString,\r
-      LegacyDeviceContext->Description,\r
-      StrSize (LegacyDeviceContext->Description)\r
-      );\r
-\r
-       UnicodeStrToAsciiStr((CONST CHAR16*)&DescString, (CHAR8 *)&DescAsciiString);\r
-\r
-    NewOptionSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescString) +\r
-                    sizeof (BBS_BBS_DEVICE_PATH);\r
-    NewOptionSize += AsciiStrLen (DescAsciiString) +\r
-                    END_DEVICE_PATH_LENGTH + sizeof (BBS_TABLE) + sizeof (UINT16);\r
-\r
-    UnicodeSPrint (VarName, 100, L"Boot%04x", Index);\r
-\r
-    Ptr       = BootOptionVar;\r
-\r
-    Attribute = (UINT32 *) Ptr;\r
-    *Attribute |= LOAD_OPTION_ACTIVE;\r
-    if (LegacyDev[0] == 0xFF) {\r
-      //\r
-      // Disable this legacy boot option\r
-      //\r
-      *Attribute &= ~LOAD_OPTION_ACTIVE;\r
-    }\r
-\r
-    Ptr += sizeof (UINT32);\r
-\r
-    Ptr += sizeof (UINT16);\r
-    Ptr += StrSize ((CHAR16 *) Ptr);\r
-\r
-    NewOptionPtr = AllocateZeroPool (NewOptionSize);\r
-    if (NewOptionPtr == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-    TempPtr = NewOptionPtr;\r
-\r
-    //\r
-    // Attribute\r
-    //\r
-    CopyMem (\r
-      TempPtr,\r
-      BootOptionVar,\r
-      sizeof (UINT32)\r
-      );\r
-\r
-    TempPtr += sizeof (UINT32);\r
-\r
-    //\r
-    // BBS device path Length\r
-    //\r
-    *((UINT16 *) TempPtr) = (UINT16) (sizeof (BBS_BBS_DEVICE_PATH) +\r
-                         AsciiStrLen (DescAsciiString) +\r
-                         END_DEVICE_PATH_LENGTH);\r
-\r
-    TempPtr += sizeof (UINT16);\r
-\r
-    //\r
-    // Description string\r
-    //\r
-    CopyMem (\r
-      TempPtr,\r
-      DescString,\r
-      StrSize (DescString)\r
-      );\r
-\r
-    TempPtr += StrSize (DescString);\r
-\r
-    //\r
-    // BBS device path\r
-    //\r
-    CopyMem (\r
-      TempPtr,\r
-      Ptr,\r
-      sizeof (BBS_BBS_DEVICE_PATH)\r
-      );\r
-\r
-    CopyMem (\r
-      ((BBS_BBS_DEVICE_PATH*) TempPtr)->String,\r
-      DescAsciiString,\r
-      AsciiStrSize (DescAsciiString)\r
-      );\r
-\r
-    SetDevicePathNodeLength (\r
-          (EFI_DEVICE_PATH_PROTOCOL *) TempPtr,\r
-          sizeof (BBS_BBS_DEVICE_PATH) + AsciiStrLen (DescAsciiString)\r
-          );\r
-\r
-    TempPtr += sizeof (BBS_BBS_DEVICE_PATH) + AsciiStrLen (DescAsciiString);\r
-\r
-    //\r
-    // End node\r
-    //\r
-    CopyMem (\r
-      TempPtr,\r
-      EndDevicePath,\r
-      END_DEVICE_PATH_LENGTH\r
-      );\r
-    TempPtr += END_DEVICE_PATH_LENGTH;\r
-\r
-    //\r
-    // Now TempPtr point to optional data, i.e. Bbs Table\r
-    //\r
-    CopyMem (\r
-      TempPtr,\r
-      LegacyDeviceContext->BbsTable,\r
-      sizeof (BBS_TABLE)\r
-      );\r
-\r
-    //\r
-    // Now TempPtr point to BBS index\r
-    //\r
-    TempPtr += sizeof (BBS_TABLE);\r
-    *((UINT16 *) TempPtr) = (UINT16) LegacyDeviceContext->Index;\r
-\r
-    Status = gRT->SetVariable (\r
-                    VarName,\r
-                    &gEfiGlobalVariableGuid,\r
-                    VAR_FLAG,\r
-                    NewOptionSize,\r
-                    NewOptionPtr\r
-                    );\r
-\r
-    FreePool (NewOptionPtr);\r
-    FreePool (BootOptionVar);\r
-  }\r
-\r
-  BOpt_GetBootOptions (CallbackData);\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Update the Text Mode of Console.\r
-\r
-  @param CallbackData  The context data for BMM.\r
-\r
-  @retval EFI_SUCCSS If the Text Mode of Console is updated.\r
-  @return Other value if the Text Mode of Console is not updated.\r
-\r
-**/\r
-EFI_STATUS\r
-Var_UpdateConMode (\r
-  IN BMM_CALLBACK_DATA            *CallbackData\r
-  )\r
-{\r
-  EFI_STATUS        Status;\r
-  UINTN             Mode;\r
-  CONSOLE_OUT_MODE  ModeInfo;\r
-\r
-  Mode = CallbackData->BmmFakeNvData.ConsoleOutMode;\r
-\r
-  Status = gST->ConOut->QueryMode (gST->ConOut, Mode, &(ModeInfo.Column), &(ModeInfo.Row));\r
-  if (EFI_ERROR(Status)) {\r
-    ModeInfo.Column = 80;\r
-    ModeInfo.Row = 25;\r
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  VAR_CON_OUT_MODE,\r
-                  &gEfiGenericPlatformVariableGuid,\r
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
-                  sizeof (CONSOLE_OUT_MODE),\r
-                  &ModeInfo\r
-                  );\r
-\r
-  return Status;\r
-}\r