]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Library/EdkGenericPlatformBdsLib/BootMaint/Variable.c
Retiring the ANT/JAVA build and removing the older EDK II packages that required...
[mirror_edk2.git] / EdkModulePkg / Library / EdkGenericPlatformBdsLib / BootMaint / Variable.c
diff --git a/EdkModulePkg/Library/EdkGenericPlatformBdsLib/BootMaint/Variable.c b/EdkModulePkg/Library/EdkGenericPlatformBdsLib/BootMaint/Variable.c
deleted file mode 100644 (file)
index c65f841..0000000
+++ /dev/null
@@ -1,1278 +0,0 @@
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation                                                         \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
-Module Name:\r
-\r
-  Variable.c\r
-\r
-Abstract:\r
-\r
-  Variable operation that will be used by BootMaint\r
-\r
---*/\r
-\r
-#include "Bds.h"\r
-#include "BootMaint.h"\r
-\r
-EFI_STATUS\r
-Var_DelBootOption (\r
-  VOID\r
-  )\r
-/*++\r
-\r
-Routine Description:\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
-Arguments:\r
-  LoadOption -- Pointer to the boot option that to be deleted\r
-\r
-Returns:\r
-  EFI_SUCCESS\r
-  Others\r
-  \r
---*/\r
-{\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-\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
-EFI_STATUS\r
-Var_ChangeBootOrder (\r
-  VOID\r
-  )\r
-/*++\r
-\r
-Routine Description:\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
-Arguments:\r
-\r
-Returns:\r
-  EFI_SUCCESS\r
-  Others\r
-  \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) {\r
-    EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
-    SafeFreePool (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
-EFI_STATUS\r
-Var_DelDriverOption (\r
-  VOID\r
-  )\r
-/*++\r
-\r
-Routine Description:\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
-Arguments:\r
-  LoadOption -- Pointer to the Driver option that to be deleted\r
-\r
-Returns:\r
-  EFI_SUCCESS\r
-  Others\r
-  \r
---*/\r
-{\r
-  BM_MENU_ENTRY   *NewMenuEntry;\r
-  BM_LOAD_CONTEXT *NewLoadContext;\r
-\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
-EFI_STATUS\r
-Var_ChangeDriverOrder (\r
-  VOID\r
-  )\r
-/*++\r
-\r
-Routine Description:\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
-Arguments:\r
-\r
-Returns:\r
-  EFI_SUCCESS\r
-  Others\r
-  \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) {\r
-    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
-    SafeFreePool (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
-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) {\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) {\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) {\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
-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
-  UINT16                    *Temp;\r
-\r
-  ConDevicePath = EfiLibGetVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
-  if (ConDevicePath != NULL) {\r
-    EfiLibDeleteVariable (ConsoleName, &gEfiGlobalVariableGuid);\r
-    SafeFreePool (ConDevicePath);\r
-    ConDevicePath = NULL;\r
-  };\r
-\r
-  //\r
-  // First add all console input device to it from console input menu\r
-  //\r
-  for (Index = 0; Index < ConsoleMenu->MenuNumber; Index++) {\r
-    NewMenuEntry = BOpt_GetMenuEntry (ConsoleMenu, Index);\r
-    if (NULL == NewMenuEntry) {\r
-      return EFI_NOT_FOUND;\r
-    }\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
-    if (NULL == NewMenuEntry) {\r
-      return EFI_NOT_FOUND;\r
-    }\r
-\r
-    NewTerminalContext = (BM_TERMINAL_CONTEXT *) NewMenuEntry->VariableContext;\r
-    if ((NewTerminalContext->IsConIn && (UpdatePageId == FORM_CON_IN_ID)) ||\r
-        (NewTerminalContext->IsConOut && (UpdatePageId == FORM_CON_OUT_ID)) ||\r
-        (NewTerminalContext->IsStdErr && (UpdatePageId == FORM_CON_ERR_ID))\r
-        ) {\r
-      Vendor.Header.Type    = MESSAGING_DEVICE_PATH;\r
-      Vendor.Header.SubType = MSG_VENDOR_DP;\r
-      CopyMem (\r
-        &Vendor.Guid,\r
-        &Guid[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
-      ChangeTerminalDevicePath (TerminalDevicePath, TRUE);\r
-      Temp = DevicePathToStr (TerminalDevicePath);\r
-      ConDevicePath = AppendDevicePathInstance (\r
-                        ConDevicePath,\r
-                        TerminalDevicePath\r
-                        );\r
-    }\r
-  }\r
-\r
-  if (ConDevicePath) {\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
-EFI_STATUS\r
-Var_UpdateConsoleInpOption (\r
-  VOID\r
-  )\r
-{\r
-  return Var_UpdateConsoleOption (L"ConIn", &ConsoleInpMenu, FORM_CON_IN_ID);\r
-}\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
-EFI_STATUS\r
-Var_UpdateErrorOutOption (\r
-  VOID\r
-  )\r
-{\r
-  return Var_UpdateConsoleOption (L"ErrOut", &ConsoleErrMenu, FORM_CON_ERR_ID);\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) + 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
-    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
-  CallbackData->Hii->NewString (\r
-                      CallbackData->Hii,\r
-                      NULL,\r
-                      HiiHandle,\r
-                      &NewMenuEntry->DisplayStringToken,\r
-                      NewMenuEntry->DisplayString\r
-                      );\r
-\r
-  NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
-                                    CallbackData,\r
-                                    DriverOptionHelpStrDepository\r
-                                    );\r
-  CallbackData->Hii->NewString (\r
-                      CallbackData->Hii,\r
-                      NULL,\r
-                      HiiHandle,\r
-                      &NewMenuEntry->HelpStringToken,\r
-                      NewMenuEntry->HelpString\r
-                      );\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
-  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
-  SafeFreePool (DriverOrderList);\r
-  DriverOrderList = NULL;\r
-  SafeFreePool (NewDriverOrderList);\r
-  NewDriverOrderList = NULL;\r
-  InsertTailList (&DriverOptionMenu.Head, &NewMenuEntry->Link);\r
-  DriverOptionMenu.MenuNumber++;\r
-\r
-  *DescriptionData  = 0x0000;\r
-  *OptionalData     = 0x0000;\r
-  return EFI_SUCCESS;\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) + 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
-  CallbackData->Hii->NewString (\r
-                      CallbackData->Hii,\r
-                      NULL,\r
-                      CallbackData->FeHiiHandle,\r
-                      &NewMenuEntry->DisplayStringToken,\r
-                      NewMenuEntry->DisplayString\r
-                      );\r
-\r
-  NewMenuEntry->HelpStringToken = GetStringTokenFromDepository (\r
-                                    CallbackData,\r
-                                    BootOptionHelpStrDepository\r
-                                    );\r
-\r
-  CallbackData->Hii->NewString (\r
-                      CallbackData->Hii,\r
-                      NULL,\r
-                      CallbackData->FeHiiHandle,\r
-                      &NewMenuEntry->HelpStringToken,\r
-                      NewMenuEntry->HelpString\r
-                      );\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
-\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
-  }\r
-\r
-  Status = gRT->SetVariable (\r
-                  L"BootOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  VAR_FLAG,\r
-                  BootOrderListSize + sizeof (UINT16),\r
-                  NewBootOrderList\r
-                  );\r
-\r
-  SafeFreePool (BootOrderList);\r
-  BootOrderList = NULL;\r
-  SafeFreePool (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
-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
-    if (NULL == NewMenuEntry) {\r
-      return EFI_NOT_FOUND;\r
-    }\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
-  if (NULL == NewMenuEntry) {\r
-    return EFI_NOT_FOUND;\r
-  }\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
-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
-  UINT8       *Map;\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) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  Map = AllocateZeroPool (BootOrderListSize / sizeof (UINT16));\r
-  if (!Map) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  //\r
-  // If exists, delete it to hold new BootOrder\r
-  //\r
-  if (BootOrderList) {\r
-    EfiLibDeleteVariable (L"BootOrder", &gEfiGlobalVariableGuid);\r
-  }\r
-\r
-  for (Index = 0; Index < BootOptionMenu.MenuNumber; Index++) {\r
-    NewBootOrderList[Index] = 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
-  SafeFreePool (BootOrderList);\r
-  SafeFreePool (NewBootOrderList);\r
-  SafeFreePool (Map);\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
-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) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  //\r
-  // If exists, delete it to hold new DriverOrder\r
-  //\r
-  if (DriverOrderList) {\r
-    EfiLibDeleteVariable (L"DriverOrder", &gEfiGlobalVariableGuid);\r
-  }\r
-\r
-  for (Index = 0; Index < DriverOrderListSize; Index++) {\r
-    NewDriverOrderList[Index] = 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
-  SafeFreePool (DriverOrderList);\r
-\r
-  BOpt_FreeMenu (&DriverOptionMenu);\r
-  BOpt_GetDriverOptions (CallbackData);\r
-  return EFI_SUCCESS;\r
-}\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
-  UINT16                      FilePathSize;\r
-  UINT8                       *Ptr;\r
-  EFI_STATUS                  Status;\r
-  CHAR16                      DescString[100];\r
-  UINTN                       NewOptionSize;\r
-  UINT8                       *NewOptionPtr;\r
-  UINT8                       *TempPtr;\r
-  UINT32                      *Attribute;\r
-\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 ((EFI_D_ERROR, "DescStr: %s\n", LegacyDeviceContext->Description));\r
-      break;\r
-    }\r
-  }\r
-  //\r
-  // Update the Variable "LegacyDevOrder"\r
-  //\r
-  VarData = (UINT8 *) BdsLibGetVariableAndSize (\r
-                        VarLegacyDevOrder,\r
-                        &EfiLegacyDevOrderGuid,\r
-                        &VarSize\r
-                        );\r
-\r
-  if (NULL == VarData) {\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
-    SafeFreePool (OriginalPtr);\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  NewOrder = (UINT16 *) AllocateZeroPool (DevOrder->Length - sizeof (UINT16));\r
-  if (NULL == NewOrder) {\r
-    SafeFreePool (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)) {\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
-  SafeFreePool (NewOrder);\r
-\r
-  Status = gRT->SetVariable (\r
-                  VarLegacyDevOrder,\r
-                  &EfiLegacyDevOrderGuid,\r
-                  VAR_FLAG,\r
-                  VarSize,\r
-                  OriginalPtr\r
-                  );\r
-\r
-  SafeFreePool (OriginalPtr);\r
-\r
-  //\r
-  // Update Optional Data of Boot####\r
-  //\r
-  BootOptionVar = GetLegacyBootOptionVar (CallbackData->BbsType, &Index, &OptionSize);\r
-\r
-  if (NULL != BootOptionVar) {\r
-    CopyMem (\r
-      DescString,\r
-      LegacyDeviceContext->Description,\r
-      StrSize (LegacyDeviceContext->Description)\r
-      );\r
-\r
-    NewOptionSize = sizeof (UINT32) + sizeof (UINT16) + StrSize (DescString) + 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 (0xFF == LegacyDev[0]) {\r
-      //\r
-      // Disable this legacy boot option\r
-      //\r
-      *Attribute &= ~LOAD_OPTION_ACTIVE;\r
-    }\r
-\r
-    Ptr += sizeof (UINT32);\r
-\r
-    FilePathSize = *(UINT16 *) Ptr;\r
-    Ptr += sizeof (UINT16);\r
-\r
-    NewOptionSize += FilePathSize;\r
-\r
-    NewOptionPtr = AllocateZeroPool (NewOptionSize);\r
-    if (NULL == NewOptionPtr) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-    TempPtr = NewOptionPtr;\r
-\r
-    //\r
-    // Copy previous option data to new option except the description string\r
-    //\r
-    CopyMem (\r
-      TempPtr,\r
-      BootOptionVar,\r
-      sizeof (UINT32) + sizeof (UINT16)\r
-      );\r
-\r
-    TempPtr += (sizeof (UINT32) + sizeof (UINT16));\r
-\r
-    CopyMem (\r
-      TempPtr,\r
-      DescString,\r
-      StrSize (DescString)\r
-      );\r
-\r
-    TempPtr += StrSize (DescString);\r
-\r
-    //\r
-    // Description = (CHAR16 *)Ptr;\r
-    //\r
-    Ptr += StrSize ((CHAR16 *) Ptr);\r
-\r
-    CopyMem (\r
-      TempPtr,\r
-      Ptr,\r
-      FilePathSize\r
-      );\r
-\r
-    TempPtr += FilePathSize;\r
-\r
-    //\r
-    // DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)Ptr;\r
-    //\r
-    Ptr += FilePathSize;\r
-\r
-    //\r
-    // Now Ptr point to optional data, i.e. Bbs Table\r
-    //\r
-    CopyMem (\r
-      TempPtr,\r
-      LegacyDeviceContext->BbsTable,\r
-      sizeof (BBS_TABLE)\r
-      );\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
-    SafeFreePool (NewOptionPtr);\r
-    SafeFreePool (BootOptionVar);\r
-  }\r
-\r
-  BOpt_GetBootOptions (CallbackData);\r
-  return Status;\r
-}\r