]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Application/PlatOverMngr/PlatOverMngr.c
HII Library Class interface refine.
[mirror_edk2.git] / MdeModulePkg / Application / PlatOverMngr / PlatOverMngr.c
index 11b3d32f4c6873fec9e0a6d5639ab079749deaca..018917fd0aec687acc3cb45f8a39f3cba627946b 100644 (file)
@@ -1,5 +1,17 @@
 /** @file\r
 \r
+  A UI application to offer a UI interface in device manager to let user configure\r
+  platform override protocol to override the default algorithm for matching\r
+  drivers to controllers.\r
+\r
+  The main flow:\r
+  1. The UI application dynamicly locate all controller device path.\r
+  2. The UI application dynamicly locate all drivers which support binding protocol.\r
+  3. The UI application export and dynamicly update two menu to let user select the\r
+     mapping between drivers to controllers.\r
+  4. The UI application save all the mapping info in NV variables which will be consumed\r
+     by platform override protocol driver to publish the platform override protocol.\r
+\r
 Copyright (c) 2007 - 2008, 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
@@ -9,258 +21,198 @@ http://opensource.org/licenses/bsd-license.php
 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
-  PlatOverMngr.c\r
-\r
-Abstract:\r
-\r
-  A UI driver to offer a UI interface in device manager to let user configue\r
-  platform override protocol to override the default algorithm for matching\r
-  drivers to controllers.\r
-\r
-  The main flow:\r
-  1. The UI driver dynamicly locate all controller device path.\r
-  2. The UI driver dynamicly locate all drivers which support binding protocol.\r
-  3. The UI driver export and dynamicly update two  menu to let user select the\r
-     mapping between drivers to controllers.\r
-  4. The UI driver save all the mapping info in NV variables which will be consumed\r
-     by platform override protocol driver to publish the platform override protocol.\r
-\r
 **/\r
 \r
-#include "PlatOverMngr.h"\r
-\r
-STATIC  EFI_GUID      mPlatformOverridesManagerGuid = PLAT_OVER_MNGR_GUID;\r
+#include <PiDxe.h>\r
+\r
+#include <Protocol/HiiConfigAccess.h>\r
+#include <Protocol/HiiConfigRouting.h>\r
+#include <Protocol/HiiDatabase.h>\r
+#include <Protocol/FormBrowser2.h>\r
+#include <Protocol/LoadedImage.h>\r
+#include <Protocol/FirmwareVolume2.h>\r
+#include <Protocol/PciIo.h>\r
+#include <Protocol/BusSpecificDriverOverride.h>\r
+#include <Protocol/ComponentName2.h>\r
+#include <Protocol/ComponentName.h>\r
+#include <Protocol/DriverBinding.h>\r
+#include <Protocol/DevicePathToText.h>\r
+#include <Protocol/DevicePath.h>\r
+#include <Guid/MdeModuleHii.h>\r
+\r
+#include <Library/DevicePathLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/UefiApplicationEntryPoint.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/PlatformDriverOverrideLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/DevicePathLib.h>\r
+#include <Library/HiiLib.h>\r
 \r
-STATIC  LIST_ENTRY    mMappingDataBase = INITIALIZE_LIST_HEAD_VARIABLE (mMappingDataBase);\r
-\r
-STATIC  EFI_HANDLE    *mDevicePathHandleBuffer;\r
-STATIC  EFI_HANDLE    *mDriverImageHandleBuffer;\r
-STATIC  EFI_HANDLE    mSelectedCtrDPHandle;\r
-\r
-STATIC CFG_PROTOCOL_INVOKER_CHOICE mChoice[MAX_CHOICE_NUM];\r
+#include "PlatOverMngr.h"\r
 \r
-STATIC UINTN         mSelectedCtrIndex;\r
-STATIC EFI_STRING_ID mControllerToken[MAX_CHOICE_NUM];\r
+#define EFI_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('C', 'l', 'b', 'k')\r
+#define EFI_CALLBACK_INFO_FROM_THIS(a)  CR (a, EFI_CALLBACK_INFO, ConfigAccess, EFI_CALLBACK_INFO_SIGNATURE)\r
+\r
+typedef struct {\r
+  UINTN                           Signature;\r
+  EFI_HANDLE                      DriverHandle;\r
+  EFI_HII_HANDLE                  RegisteredHandle;\r
+  PLAT_OVER_MNGR_DATA             FakeNvData;\r
+  EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
+  EFI_HII_CONFIG_ACCESS_PROTOCOL  ConfigAccess;\r
+} EFI_CALLBACK_INFO;\r
+\r
+#pragma pack(1)\r
+\r
+///\r
+/// HII specific Vendor Device Path definition.\r
+///\r
+typedef struct {\r
+  VENDOR_DEVICE_PATH             VendorDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL       End;\r
+} HII_VENDOR_DEVICE_PATH;\r
+\r
+#pragma pack()\r
+\r
+//\r
+// uni string and Vfr Binary data.\r
+//\r
+extern UINT8  VfrBin[];\r
+extern UINT8  PlatOverMngrStrings[];\r
+\r
+//\r
+// module global data\r
+//\r
+EFI_GUID                     mPlatformOverridesManagerGuid = PLAT_OVER_MNGR_GUID;\r
+CHAR16                       mVariableName[] = L"Data";\r
+LIST_ENTRY                   mMappingDataBase = INITIALIZE_LIST_HEAD_VARIABLE (mMappingDataBase);\r
+\r
+EFI_HANDLE                   *mDevicePathHandleBuffer;\r
+EFI_HANDLE                   *mDriverImageHandleBuffer;\r
+\r
+INTN                         mSelectedCtrIndex;\r
+EFI_STRING_ID                mControllerToken[MAX_CHOICE_NUM];\r
+UINTN                        mDriverImageHandleCount;\r
+EFI_STRING_ID                mDriverImageToken[MAX_CHOICE_NUM];\r
+EFI_STRING_ID                mDriverImageFilePathToken[MAX_CHOICE_NUM];\r
+EFI_LOADED_IMAGE_PROTOCOL    *mDriverImageProtocol[MAX_CHOICE_NUM];\r
+EFI_DEVICE_PATH_PROTOCOL     *mControllerDevicePathProtocol[MAX_CHOICE_NUM];\r
+UINTN                        mSelectedDriverImageNum;\r
+UINTN                        mLastSavedDriverImageNum;\r
+UINT16                       mCurrentPage;\r
+EFI_CALLBACK_INFO           *mCallbackInfo;\r
+\r
+HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath = {\r
+  {\r
+    {\r
+      HARDWARE_DEVICE_PATH,\r
+      HW_VENDOR_DP,\r
+      {\r
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+      }\r
+    },\r
+    EFI_CALLER_ID_GUID\r
+  },\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    { \r
+      (UINT8) (END_DEVICE_PATH_LENGTH),\r
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+    }\r
+  }\r
+};\r
 \r
-STATIC UINTN                        mDriverImageHandleCount;\r
-STATIC EFI_STRING_ID                mDriverImageToken[MAX_CHOICE_NUM];\r
-STATIC EFI_STRING_ID                mDriverImageFilePathToken[MAX_CHOICE_NUM];\r
-STATIC EFI_LOADED_IMAGE_PROTOCOL    *mDriverImageProtocol[MAX_CHOICE_NUM];\r
-STATIC EFI_DEVICE_PATH_PROTOCOL     *mControllerDevicePathProtocol[MAX_CHOICE_NUM];\r
-STATIC UINTN                        mSelectedDriverImageNum;\r
-STATIC UINTN                        mLastSavedDriverImageNum;\r
-STATIC CHAR8                        mLanguage[RFC_3066_ENTRY_SIZE];\r
-STATIC UINT16                       mCurrentPage;\r
+/**\r
+  Converting a given device to an unicode string. \r
+  \r
+  This function will dependent on gEfiDevicePathToTextProtocolGuid, if protocol\r
+  does not installed, then return unknown device path L"?" directly.\r
+  \r
+  @param    DevPath     Given device path instance\r
+  \r
+  @return   Converted string from given device path.\r
+  @retval   L"?"  Can not locate gEfiDevicePathToTextProtocolGuid protocol for converting.\r
+**/\r
+CHAR16 *\r
+DevicePathToStr (\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *DevPath\r
+  );\r
 \r
 /**\r
-  The driver Entry Point. The funciton will export a disk device class formset and\r
-  its callback function to hii database.\r
+  Worker function to get the driver name by ComponentName or ComponentName2 protocol \r
+  according to the driver binding handle.\r
 \r
-  @param  ImageHandle    The firmware allocated handle for the EFI image.\r
-  @param  SystemTable    A pointer to the EFI System Table.\r
+  @param  DriverBindingHandle  The Handle of DriverBinding.\r
+  @param  ProtocolGuid         The pointer to Component Name (2) protocol GUID.\r
+  @param  VariableName         The name of the RFC 4646 or ISO 639-2 language variable.\r
 \r
-  @retval EFI_SUCCESS    The entry point is executed successfully.\r
-  @retval other          Some error occurs when executing this entry point.\r
+  @retval !NULL               Pointer into the image name if the image name is found,\r
+  @retval NULL                Pointer to NULL if the image name is not found.\r
 \r
 **/\r
-EFI_STATUS\r
-EFIAPI\r
-PlatOverMngrInit (\r
-  IN EFI_HANDLE                   ImageHandle,\r
-  IN EFI_SYSTEM_TABLE             *SystemTable\r
+CHAR16 *\r
+GetComponentNameWorker (\r
+  IN EFI_HANDLE                      DriverBindingHandle,\r
+  IN EFI_GUID                        *ProtocolGuid,\r
+  IN CONST CHAR16                    *VariableName\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  EFI_HII_DATABASE_PROTOCOL   *HiiDatabase;\r
-  EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
-  EFI_CALLBACK_INFO           *CallbackInfo;\r
-  EFI_HANDLE                  DriverHandle;\r
-  EFI_FORM_BROWSER2_PROTOCOL       *FormBrowser2;\r
+  EFI_STATUS                         Status;\r
+  EFI_COMPONENT_NAME_PROTOCOL        *ComponentName;\r
+  CHAR16                             *DriverName;\r
+  CHAR8                              *Language;\r
+  CHAR8                              *BestLanguage;\r
 \r
-  //\r
-  // There should only be one HII protocol\r
-  //\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiHiiDatabaseProtocolGuid,\r
+  Status = gBS->OpenProtocol (\r
+                  DriverBindingHandle,\r
+                  ProtocolGuid,\r
+                  (VOID *) &ComponentName,\r
                   NULL,\r
-                  (VOID **) &HiiDatabase\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status ;\r
-  }\r
-\r
-\r
-  //\r
-  // There should only be one Form Configuration protocol\r
-  //\r
-  Status = gBS->LocateProtocol (\r
-                 &gEfiFormBrowser2ProtocolGuid,\r
-                 NULL,\r
-                 (VOID **) &FormBrowser2\r
-                 );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;;\r
-  }\r
-\r
-\r
-  CallbackInfo = AllocateZeroPool (sizeof (EFI_CALLBACK_INFO));\r
-  if (CallbackInfo == NULL) {\r
-    return EFI_BAD_BUFFER_SIZE;\r
-  }\r
-\r
-  CallbackInfo->Signature = EFI_CALLBACK_INFO_SIGNATURE;\r
-  CallbackInfo->ConfigAccess.ExtractConfig = PlatOverMngrExtractConfig;\r
-  CallbackInfo->ConfigAccess.RouteConfig   = PlatOverMngrRouteConfig;\r
-  CallbackInfo->ConfigAccess.Callback      = PlatOverMngrCallback;\r
-\r
-  //\r
-  // Create driver handle used by HII database\r
-  //\r
-  Status = HiiLibCreateHiiDriverHandle (&DriverHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  CallbackInfo->DriverHandle = DriverHandle;\r
-\r
-  //\r
-  // Install Config Access protocol to driver handle\r
-  //\r
-  Status = gBS->InstallProtocolInterface (\r
-                  &DriverHandle,\r
-                  &gEfiHiiConfigAccessProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &CallbackInfo->ConfigAccess\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Publish our HII data\r
-  //\r
-  PackageList = HiiLibPreparePackageList (\r
-                  2,\r
-                  &mPlatformOverridesManagerGuid,\r
-                  VfrBin,\r
-                  PlatOverMngrStrings\r
-                  );\r
-  ASSERT (PackageList != NULL);\r
-\r
-  Status = HiiDatabase->NewPackageList (\r
-                           HiiDatabase,\r
-                           PackageList,\r
-                           DriverHandle,\r
-                           &CallbackInfo->RegisteredHandle\r
-                           );\r
-  gBS->FreePool (PackageList);\r
-\r
-  //\r
-  // Locate ConfigRouting protocol\r
-  //\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiHiiConfigRoutingProtocolGuid,\r
                   NULL,\r
-                  (VOID **) &CallbackInfo->HiiConfigRouting\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    return NULL;\r
   }\r
 \r
   //\r
-  // Clear all the globle variable\r
+  // Find the best matching language.\r
   //\r
-  mDriverImageHandleCount = 0;\r
-  mCurrentPage = 0;\r
-  ZeroMem (mDriverImageToken, MAX_CHOICE_NUM * sizeof (EFI_STRING_ID));\r
-  ZeroMem (mDriverImageFilePathToken, MAX_CHOICE_NUM * sizeof (EFI_STRING_ID));\r
-  ZeroMem (mControllerToken, MAX_CHOICE_NUM * sizeof (EFI_STRING_ID));\r
-  ZeroMem (mDriverImageProtocol, MAX_CHOICE_NUM * sizeof (EFI_LOADED_IMAGE_PROTOCOL *));\r
-\r
-  //\r
-  // Show the page\r
-  //\r
-  Status = FormBrowser2->SendForm (\r
-                           FormBrowser2,\r
-                           &CallbackInfo->RegisteredHandle,\r
-                           1,\r
-                           NULL,\r
-                           0,\r
-                           NULL,\r
-                           NULL\r
-                           );\r
-\r
-  Status = HiiDatabase->RemovePackageList (HiiDatabase, CallbackInfo->RegisteredHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Do some convertion for the ComponentName2 supported language. It do\r
-  the convertion just for english language code currently.\r
-\r
-  @param ComponentName    Pointer to the ComponentName2 protocl pointer.\r
-  @param Language         The language string.\r
-\r
-  @return   Return the duplication of Language if it is not english otherwise return\r
-            the supported english language code.\r
-\r
-**/\r
-CHAR8 *\r
-ConvertComponentName2SupportLanguage (\r
-  IN EFI_COMPONENT_NAME2_PROTOCOL    *ComponentName,\r
-  IN CHAR8                           *Language\r
-  )\r
-{\r
-  CHAR8                              *SupportedLanguages;\r
-  CHAR8                              *LangCode;\r
-  UINTN                              Index;\r
-\r
-  LangCode           = NULL;\r
-  SupportedLanguages = NULL;\r
+  Language = GetEfiGlobalVariable (VariableName);\r
+  BestLanguage = GetBestLanguage (\r
+                   ComponentName->SupportedLanguages,\r
+                   (BOOLEAN) (ProtocolGuid == &gEfiComponentNameProtocolGuid),\r
+                   Language,\r
+                   NULL\r
+                   );\r
 \r
-  //\r
-  // treat all the english language code (en-xx or eng) equally\r
-  //\r
-  if ((AsciiStrnCmp (Language, "en-", 3) == 0) || (AsciiStrCmp (Language, "eng") == 0)) {\r
-    SupportedLanguages = AsciiStrStr (ComponentName->SupportedLanguages, "en");\r
-    if (SupportedLanguages == NULL) {\r
-      SupportedLanguages = AsciiStrStr (ComponentName->SupportedLanguages, "eng");\r
-    }\r
+  DriverName = NULL;\r
+  if (BestLanguage != NULL) {\r
+    ComponentName->GetDriverName (\r
+                     ComponentName,\r
+                     BestLanguage,\r
+                     &DriverName\r
+                     );\r
+    FreePool (BestLanguage);\r
   }\r
 \r
-  //\r
-  // duplicate the Language if it is not english\r
-  //\r
-  if (SupportedLanguages == NULL) {\r
-    SupportedLanguages = Language;\r
+  if (Language != NULL) {\r
+    FreePool (Language);\r
   }\r
 \r
-  //\r
-  // duplicate the returned language code.\r
-  //\r
-  if (AsciiStrStr (SupportedLanguages, "-") != NULL) {\r
-    LangCode = AllocateZeroPool(32);\r
-    for(Index = 0; (Index < 31) && (SupportedLanguages[Index] != '\0') && (SupportedLanguages[Index] != ';'); Index++) {\r
-      LangCode[Index] = SupportedLanguages[Index];\r
-    }\r
-    LangCode[Index] = '\0';\r
-  } else {\r
-    LangCode = AllocateZeroPool(4);\r
-    for(Index = 0; (Index < 3) && (SupportedLanguages[Index] != '\0'); Index++) {\r
-      LangCode[Index] = SupportedLanguages[Index];\r
-    }\r
-    LangCode[Index] = '\0';\r
-  }\r
-  return LangCode;\r
+  return DriverName;\r
 }\r
 \r
+\r
 /**\r
-  Get the ComponentName or ComponentName2 protocol according to the driver binding handle\r
+  Get the driver name by ComponentName or ComponentName2 protocol \r
+  according to the driver binding handle\r
 \r
   @param DriverBindingHandle  The Handle of DriverBinding.\r
 \r
@@ -273,116 +225,79 @@ GetComponentName (
   IN EFI_HANDLE                      DriverBindingHandle\r
   )\r
 {\r
-  EFI_STATUS                   Status;\r
-  EFI_COMPONENT_NAME_PROTOCOL  *ComponentName;\r
-  EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;\r
-  CHAR8                        *SupportedLanguage;\r
-  CHAR16                       *DriverName;\r
-\r
-  ComponentName  = NULL;\r
-  ComponentName2 = NULL;\r
-  Status = gBS->OpenProtocol (\r
-                 DriverBindingHandle,\r
-                 &gEfiComponentName2ProtocolGuid,\r
-                 (VOID **) &ComponentName2,\r
-                 NULL,\r
-                 NULL,\r
-                 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                 );\r
-  if (EFI_ERROR(Status)) {\r
-    Status = gBS->OpenProtocol (\r
-                   DriverBindingHandle,\r
-                   &gEfiComponentNameProtocolGuid,\r
-                   (VOID **) &ComponentName,\r
-                   NULL,\r
-                   NULL,\r
-                   EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                   );\r
-  }\r
+  CHAR16                    *DriverName;\r
 \r
-  Status     = EFI_SUCCESS;\r
-  DriverName = NULL;\r
-  if (ComponentName != NULL) {\r
-    if (ComponentName->GetDriverName != NULL) {\r
-      Status = ComponentName->GetDriverName (\r
-                                ComponentName,\r
-                                mLanguage,\r
-                                &DriverName\r
-                                );\r
-    }\r
-  } else if (ComponentName2 != NULL) {\r
-    if (ComponentName2->GetDriverName != NULL) {\r
-      SupportedLanguage = ConvertComponentName2SupportLanguage (ComponentName2, mLanguage);\r
-      Status = ComponentName2->GetDriverName (\r
-                                 ComponentName2,\r
-                                 SupportedLanguage,\r
-                                 &DriverName\r
-                                 );\r
-        gBS->FreePool (SupportedLanguage);\r
-    }\r
-  }\r
-  if (EFI_ERROR (Status)) {\r
-    return NULL;\r
+  //\r
+  // Try RFC 4646 Component Name 2 protocol first.\r
+  //\r
+  DriverName = GetComponentNameWorker (DriverBindingHandle, &gEfiComponentName2ProtocolGuid, L"PlatformLang");\r
+  if (DriverName == NULL) {\r
+    //\r
+    // If we can not get driver name from Component Name 2 protocol, we can try ISO 639-2 Component Name protocol. \r
+    //\r
+    DriverName = GetComponentNameWorker (DriverBindingHandle, &gEfiComponentNameProtocolGuid, L"Lang");\r
   }\r
 \r
   return DriverName;\r
 }\r
 \r
 /**\r
-  Get the image name\r
+  Get the image name from EFI UI section.\r
+  Get FV protocol by its loaded image protocol to abstract EFI UI section.\r
 \r
-  @param Image            Image to search.\r
+  @param Image            Pointer to the loaded image protocol\r
 \r
-  @retval !NULL           Pointer into the image name if the image name is found,\r
-  @retval NULL            Pointer to NULL if the image name is not found.\r
+  @retval !NULL           Pointer to the image name if the image name is found,\r
+  @retval NULL            NULL if the image name is not found.\r
 \r
 **/\r
 CHAR16 *\r
 GetImageName (\r
-  EFI_LOADED_IMAGE_PROTOCOL *Image\r
+  IN EFI_LOADED_IMAGE_PROTOCOL *Image\r
   )\r
 {\r
   EFI_STATUS                        Status;\r
-  EFI_DEVICE_PATH_PROTOCOL          *DevPath;\r
   EFI_DEVICE_PATH_PROTOCOL          *DevPathNode;\r
+  EFI_DEVICE_PATH_PROTOCOL          *AlignedDevPathNode;\r
   MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFilePath;\r
   VOID                              *Buffer;\r
   UINTN                             BufferSize;\r
   UINT32                            AuthenticationStatus;\r
   EFI_GUID                          *NameGuid;\r
-  EFI_FIRMWARE_VOLUME2_PROTOCOL     *FV2;\r
+  EFI_FIRMWARE_VOLUME2_PROTOCOL     *Fv2;\r
 \r
-  FV2         = NULL;\r
+  Fv2         = NULL;\r
   Buffer      = NULL;\r
   BufferSize  = 0;\r
 \r
   if (Image->FilePath == NULL) {\r
     return NULL;\r
   }\r
-\r
-  DevPath     = UnpackDevicePath (Image->FilePath);\r
-\r
-  if (DevPath == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  DevPathNode = DevPath;\r
+  DevPathNode  = Image->FilePath;\r
 \r
   while (!IsDevicePathEnd (DevPathNode)) {\r
+    //\r
+    // Make sure device path node is aligned when accessing it's FV Name Guid field.\r
+    //\r
+    AlignedDevPathNode = AllocateCopyPool (DevicePathNodeLength(DevPathNode), DevPathNode);\r
+    \r
     //\r
     // Find the Fv File path\r
     //\r
-    NameGuid = EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)DevPathNode);\r
+    NameGuid = EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)AlignedDevPathNode);\r
     if (NameGuid != NULL) {\r
-      FvFilePath = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) DevPathNode;\r
+      FvFilePath = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) AlignedDevPathNode;\r
       Status = gBS->HandleProtocol (\r
                     Image->DeviceHandle,\r
                     &gEfiFirmwareVolume2ProtocolGuid,\r
-                    (VOID **) &FV2\r
+                    (VOID **) &Fv2\r
                     );\r
+      //\r
+      // Locate Image EFI UI section to get the image name.\r
+      //\r
       if (!EFI_ERROR (Status)) {\r
-        Status = FV2->ReadSection (\r
-                        FV2,\r
+        Status = Fv2->ReadSection (\r
+                        Fv2,\r
                         &FvFilePath->FvFileName,\r
                         EFI_SECTION_USER_INTERFACE,\r
                         0,\r
@@ -391,24 +306,29 @@ GetImageName (
                         &AuthenticationStatus\r
                         );\r
         if (!EFI_ERROR (Status)) {\r
+          FreePool (AlignedDevPathNode);\r
           break;\r
         }\r
         Buffer = NULL;\r
       }\r
     }\r
+    \r
+    FreePool (AlignedDevPathNode);\r
+    \r
     //\r
     // Next device path node\r
     //\r
     DevPathNode = NextDevicePathNode (DevPathNode);\r
   }\r
 \r
-    gBS->FreePool (DevPath);\r
   return Buffer;\r
 }\r
 \r
 /**\r
   Prepare the first page to let user select the device controller which need to\r
-  add mapping drivers.\r
+  add mapping drivers if user select 'Refresh' in first page.\r
+  During first page, user will see all currnet controller device path in system,\r
+  select any device path will go to second page to select its overrides drivers.\r
 \r
   @param  Private        Pointer to EFI_CALLBACK_INFO.\r
   @param  KeyValue       The callback key value of device controller item in first page.\r
@@ -424,9 +344,7 @@ UpdateDeviceSelectPage (
   IN PLAT_OVER_MNGR_DATA              *FakeNvData\r
   )\r
 {\r
-  EFI_HII_UPDATE_DATA                       UpdateData;\r
   EFI_STATUS                                Status;\r
-  UINTN                                     LangSize;\r
   UINTN                                     Index;\r
   UINTN                                     DevicePathHandleCount;\r
   CHAR16                                    *NewString;\r
@@ -436,66 +354,76 @@ UpdateDeviceSelectPage (
   EFI_PCI_IO_PROTOCOL                       *PciIo;\r
   EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride;\r
   UINTN                                     Len;\r
+  VOID                                      *StartOpCodeHandle;\r
+  VOID                                      *EndOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL                        *StartLabel;\r
+  EFI_IFR_GUID_LABEL                        *EndLabel;  \r
 \r
-  mCurrentPage = FORM_ID_DEVICE;\r
   //\r
-  // Following code will be run if user select 'Refresh' in first page\r
-  // During first page, user will see all currnet controller device path in system,\r
-  // select any device path will go to second page to select its overrides drivers\r
+  // Set current page form ID.\r
   //\r
-\r
-  LangSize = RFC_3066_ENTRY_SIZE;\r
-  Status = gRT->GetVariable (\r
-              L"PlatformLang",\r
-              &gEfiGlobalVariableGuid,\r
-              NULL,\r
-              &LangSize,\r
-              mLanguage\r
-              );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
+  mCurrentPage = FORM_ID_DEVICE;  \r
+  \r
   //\r
   // Initial the mapping database in memory\r
   //\r
   FreeMappingDatabase (&mMappingDataBase);\r
-  Status = InitOverridesMapping (&mMappingDataBase);\r
+  InitOverridesMapping (&mMappingDataBase);\r
+\r
+  //\r
+  // Init OpCode Handle\r
+  //\r
+  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (StartOpCodeHandle != NULL);\r
+\r
+  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (EndOpCodeHandle != NULL);\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the start opcode\r
+  //\r
+  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  StartLabel->Number = FORM_ID_DEVICE;\r
 \r
   //\r
-  // Clear all the content in the first page\r
+  // Create Hii Extend Label OpCode as the end opcode\r
   //\r
-  UpdateData.BufferSize = UPDATE_DATA_SIZE;\r
-  UpdateData.Offset = 0;\r
-  UpdateData.Data = AllocateZeroPool (UPDATE_DATA_SIZE);\r
-  ASSERT (UpdateData.Data != NULL);\r
+  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  EndLabel->Number       = LABEL_END;\r
+\r
   //\r
   // Clear first page form\r
   //\r
-  IfrLibUpdateForm (\r
+  HiiUpdateForm (\r
     Private->RegisteredHandle,\r
     &mPlatformOverridesManagerGuid,\r
     FORM_ID_DEVICE,\r
-    FORM_ID_DEVICE,\r
-    FALSE,\r
-    &UpdateData\r
+    StartOpCodeHandle, // Label FORM_ID_DEVICE\r
+    EndOpCodeHandle    // LABEL_END\r
     );\r
 \r
   //\r
   // When user enter the page at first time, the 'first refresh' string is given to notify user to refresh all the drivers,\r
-  // then the 'first refresh' string will be replaced by the 'refresh' string, and the two strings content are  same after the replacement\r
+  // then the 'first refresh' string will be replaced by the 'refresh' string, and the two strings content are same after the replacement\r
   //\r
   NewStringToken = STRING_TOKEN (STR_FIRST_REFRESH);\r
-  HiiLibGetStringFromHandle (Private->RegisteredHandle, STRING_TOKEN (STR_REFRESH), &NewString);\r
+  NewString = HiiGetString (Private->RegisteredHandle, STRING_TOKEN (STR_REFRESH), NULL);\r
   ASSERT (NewString != NULL);\r
-  Status = HiiLibSetString (Private->RegisteredHandle, NewStringToken, NewString);\r
-  ASSERT_EFI_ERROR (Status);\r
-  gBS->FreePool (NewString);\r
+  if (HiiSetString (Private->RegisteredHandle, NewStringToken, NewString, NULL) == 0) {\r
+    ASSERT (FALSE);\r
+  }\r
+  FreePool (NewString);\r
 \r
   NewStringToken = STRING_TOKEN (STR_FIRST_REFRESH_HELP);\r
-  HiiLibGetStringFromHandle (Private->RegisteredHandle, STRING_TOKEN (STR_REFRESH_HELP), &NewString);\r
+  NewString = HiiGetString (Private->RegisteredHandle, STRING_TOKEN (STR_REFRESH_HELP), NULL);\r
   ASSERT (NewString != NULL);\r
-  Status = HiiLibSetString (Private->RegisteredHandle, NewStringToken, NewString);\r
-  ASSERT_EFI_ERROR (Status);\r
-  gBS->FreePool (NewString);\r
+  if (HiiSetString (Private->RegisteredHandle, NewStringToken, NewString, NULL) == 0) {\r
+    ASSERT (FALSE);\r
+  }\r
+  FreePool (NewString);\r
+\r
   //\r
   // created needed controller device item in first page\r
   //\r
@@ -570,6 +498,7 @@ UpdateDeviceSelectPage (
     //\r
     Len = StrSize (ControllerName);\r
     NewString = AllocateZeroPool (Len + StrSize (L"--"));\r
+    ASSERT (NewString != NULL);\r
     if (EFI_ERROR (CheckMapping (ControllerDevicePath,NULL, &mMappingDataBase, NULL, NULL))) {\r
       StrCat (NewString, L"--");\r
     } else {\r
@@ -577,51 +506,116 @@ UpdateDeviceSelectPage (
     }\r
     StrCat (NewString, ControllerName);\r
 \r
-    NewStringToken = mControllerToken[Index];\r
-    if (NewStringToken == 0) {\r
-      Status = HiiLibNewString (Private->RegisteredHandle, &NewStringToken, NewString);\r
-    } else {\r
-      Status = HiiLibSetString (Private->RegisteredHandle, NewStringToken, NewString);\r
-    }\r
-    ASSERT_EFI_ERROR (Status);\r
-    gBS->FreePool (NewString);\r
+    NewStringToken = HiiSetString (Private->RegisteredHandle, mControllerToken[Index], NewString, NULL);\r
+    ASSERT (NewStringToken != 0);\r
+    FreePool (NewString);\r
     //\r
     // Save the device path string toke for next access use\r
     //\r
     mControllerToken[Index] = NewStringToken;\r
-\r
-    CreateGotoOpCode (\r
+      \r
+    HiiCreateGotoOpCode (\r
+      StartOpCodeHandle,\r
       FORM_ID_DRIVER,\r
       NewStringToken,\r
       STRING_TOKEN (STR_GOTO_HELP_DRIVER),\r
       EFI_IFR_FLAG_CALLBACK,\r
-      (UINT16) (Index + KEY_VALUE_DEVICE_OFFSET),\r
-      &UpdateData\r
+      (UINT16) (Index + KEY_VALUE_DEVICE_OFFSET)\r
       );\r
   }\r
 \r
   //\r
   // Update first page form\r
   //\r
-  IfrLibUpdateForm (\r
+  HiiUpdateForm (\r
     Private->RegisteredHandle,\r
     &mPlatformOverridesManagerGuid,\r
     FORM_ID_DEVICE,\r
-    FORM_ID_DEVICE,\r
-    FALSE,\r
-    &UpdateData\r
+    StartOpCodeHandle, // Label FORM_ID_DEVICE\r
+    EndOpCodeHandle    // LABEL_END\r
     );\r
 \r
-  gBS->FreePool (UpdateData.Data);\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Get the first Driver Binding handle which has the specific image handle.\r
+\r
+  @param  ImageHandle          The Image handle\r
+\r
+  @return                      Handle to Driver binding\r
+  @retval NULL                 The paramter is not valid or the driver binding handle is not found.\r
+\r
+**/\r
+EFI_HANDLE\r
+GetDriverBindingHandleFromImageHandle (\r
+  IN  EFI_HANDLE   ImageHandle\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  UINTN                             Index;\r
+  UINTN                             DriverBindingHandleCount;\r
+  EFI_HANDLE                        *DriverBindingHandleBuffer;\r
+  EFI_DRIVER_BINDING_PROTOCOL       *DriverBindingInterface;\r
+  EFI_HANDLE                        DriverBindingHandle;\r
+\r
+  DriverBindingHandle = NULL;\r
+\r
+  if (ImageHandle == NULL) {\r
+    return NULL;\r
+  }\r
+  //\r
+  // Get all drivers which support driver binding protocol\r
+  //\r
+  DriverBindingHandleCount  = 0;\r
+  Status = gBS->LocateHandleBuffer (\r
+                  ByProtocol,\r
+                  &gEfiDriverBindingProtocolGuid,\r
+                  NULL,\r
+                  &DriverBindingHandleCount,\r
+                  &DriverBindingHandleBuffer\r
+                  );\r
+  if (EFI_ERROR (Status) || (DriverBindingHandleCount == 0)) {\r
+    return NULL;\r
+  }\r
+  \r
+  //\r
+  // Get the first Driver Binding handle which has the specific image handle.\r
+  //\r
+  for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r
+    DriverBindingInterface = NULL;\r
+    Status = gBS->OpenProtocol (\r
+                    DriverBindingHandleBuffer[Index],\r
+                    &gEfiDriverBindingProtocolGuid,\r
+                    (VOID **) &DriverBindingInterface,\r
+                    NULL,\r
+                    NULL,\r
+                    EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      continue;\r
+    }\r
+\r
+    if (DriverBindingInterface->ImageHandle == ImageHandle) {\r
+      DriverBindingHandle = DriverBindingHandleBuffer[Index];\r
+      break;\r
+    }\r
+  }\r
+\r
+  FreePool (DriverBindingHandleBuffer);\r
+  return DriverBindingHandle;\r
+}\r
+\r
 /**\r
   Prepare to let user select the drivers which need mapping with the device controller\r
   selected in first page.\r
 \r
   @param  Private        Pointer to EFI_CALLBACK_INFO.\r
   @param  KeyValue       The callback key value of device controller item in first page.\r
+                         KeyValue is larger than or equal to KEY_VALUE_DEVICE_OFFSET.\r
   @param  FakeNvData     Pointer to PLAT_OVER_MNGR_DATA.\r
 \r
   @retval EFI_SUCCESS    Always returned.\r
@@ -634,23 +628,23 @@ UpdateBindingDriverSelectPage (
   IN PLAT_OVER_MNGR_DATA              *FakeNvData\r
   )\r
 {\r
-  EFI_HII_UPDATE_DATA                       UpdateData;\r
   EFI_STATUS                                Status;\r
   UINTN                                     Index;\r
-\r
   CHAR16                                    *NewString;\r
   EFI_STRING_ID                             NewStringToken;\r
   EFI_STRING_ID                             NewStringHelpToken;\r
   UINTN                                     DriverImageHandleCount;\r
-\r
-  EFI_DRIVER_BINDING_PROTOCOL               *DriverBindingInterface;\r
   EFI_LOADED_IMAGE_PROTOCOL                 *LoadedImage;\r
   CHAR16                                    *DriverName;\r
   BOOLEAN                                   FreeDriverName;\r
-\r
   EFI_DEVICE_PATH_PROTOCOL                  *LoadedImageDevicePath;\r
   EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride;\r
   EFI_HANDLE                                DriverBindingHandle;\r
+  VOID                                      *StartOpCodeHandle;\r
+  VOID                                      *EndOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL                        *StartLabel;\r
+  EFI_IFR_GUID_LABEL                        *EndLabel;\r
+\r
   //\r
   // If user select a controller item in the first page  the following code will be run.\r
   // During second page, user will see all currnet driver bind protocol driver, the driver name and its device path will be shown\r
@@ -664,26 +658,43 @@ UpdateBindingDriverSelectPage (
   //\r
   // Switch the item callback key value to its NO. in mDevicePathHandleBuffer\r
   //\r
-  mSelectedCtrIndex = KeyValue - 0x100;\r
+  mSelectedCtrIndex = KeyValue - KEY_VALUE_DEVICE_OFFSET;\r
   ASSERT (mSelectedCtrIndex < MAX_CHOICE_NUM);\r
+\r
   mLastSavedDriverImageNum = 0;\r
+\r
   //\r
-  // Clear all the content in dynamic page\r
+  // Init OpCode Handle\r
   //\r
-  UpdateData.BufferSize = UPDATE_DATA_SIZE;\r
-  UpdateData.Offset = 0;\r
-  UpdateData.Data = AllocateZeroPool (UPDATE_DATA_SIZE);\r
-  ASSERT (UpdateData.Data != NULL);\r
+  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (StartOpCodeHandle != NULL);\r
+\r
+  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (EndOpCodeHandle != NULL);\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the start opcode\r
+  //\r
+  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  StartLabel->Number       = FORM_ID_DRIVER;\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the end opcode\r
+  //\r
+  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  EndLabel->Number       = LABEL_END;\r
+\r
   //\r
   // Clear second page form\r
   //\r
-  IfrLibUpdateForm (\r
+  HiiUpdateForm (\r
     Private->RegisteredHandle,\r
     &mPlatformOverridesManagerGuid,\r
     FORM_ID_DRIVER,\r
-    FORM_ID_DRIVER,\r
-    FALSE,\r
-    &UpdateData\r
+    StartOpCodeHandle,\r
+    EndOpCodeHandle\r
     );\r
 \r
   //\r
@@ -728,13 +739,8 @@ UpdateBindingDriverSelectPage (
     //\r
     // Find its related driver binding protocol\r
     //\r
-    DriverBindingInterface = NULL;\r
-    DriverBindingHandle = NULL;\r
-    DriverBindingInterface = GetBindingProtocolFromImageHandle (\r
-                                mDriverImageHandleBuffer[Index],\r
-                                &DriverBindingHandle\r
-                                );\r
-    if (DriverBindingInterface == NULL) {\r
+    DriverBindingHandle = GetDriverBindingHandleFromImageHandle (mDriverImageHandleBuffer[Index]);\r
+    if (DriverBindingHandle == NULL) {\r
       FakeNvData->DriSelection[Index] = 0x00;\r
       continue;\r
     }\r
@@ -790,7 +796,7 @@ UpdateBindingDriverSelectPage (
       //\r
       // give a default name\r
       //\r
-      HiiLibGetStringFromHandle (Private->RegisteredHandle, STRING_TOKEN (STR_DRIVER_DEFAULT_NAME), &DriverName);\r
+      DriverName = HiiGetString (Private->RegisteredHandle, STRING_TOKEN (STR_DRIVER_DEFAULT_NAME), NULL);\r
       ASSERT (DriverName != NULL);\r
       FreeDriverName = TRUE;  // the DriverName string need to free pool\r
     }\r
@@ -804,6 +810,7 @@ UpdateBindingDriverSelectPage (
     // First create the driver image name\r
     //\r
     NewString = AllocateZeroPool (StrSize (DriverName));\r
+    ASSERT (NewString != NULL); \r
     if (EFI_ERROR (CheckMapping (mControllerDevicePathProtocol[mSelectedCtrIndex], LoadedImageDevicePath, &mMappingDataBase, NULL, NULL))) {\r
       FakeNvData->DriSelection[Index] = 0x00;\r
     } else {\r
@@ -811,17 +818,12 @@ UpdateBindingDriverSelectPage (
       mLastSavedDriverImageNum++;\r
     }\r
     StrCat (NewString, DriverName);\r
-    NewStringToken = mDriverImageToken[Index];\r
-    if (NewStringToken == 0) {\r
-      Status = HiiLibNewString (Private->RegisteredHandle, &NewStringToken, NewString);\r
-    } else {\r
-      Status = HiiLibSetString (Private->RegisteredHandle, NewStringToken, NewString);\r
-    }\r
+    NewStringToken = HiiSetString (Private->RegisteredHandle, mDriverImageToken[Index], NewString, NULL);\r
+    ASSERT (NewStringToken != 0);\r
     mDriverImageToken[Index] = NewStringToken;\r
-    ASSERT_EFI_ERROR (Status);\r
-    gBS->FreePool (NewString);\r
+    FreePool (NewString);\r
     if (FreeDriverName) {\r
-      gBS->FreePool (DriverName);\r
+      FreePool (DriverName);\r
     }\r
 \r
     //\r
@@ -830,19 +832,16 @@ UpdateBindingDriverSelectPage (
     DriverName = DevicePathToStr (LoadedImageDevicePath);\r
 \r
     NewString = AllocateZeroPool (StrSize (DriverName));\r
+    ASSERT (NewString != NULL); \r
     StrCat (NewString, DriverName);\r
-    NewStringHelpToken = mDriverImageFilePathToken[Index];\r
-    if (NewStringHelpToken == 0) {\r
-      Status = HiiLibNewString (Private->RegisteredHandle, &NewStringHelpToken, NewString);\r
-    } else {\r
-      Status = HiiLibSetString (Private->RegisteredHandle, NewStringHelpToken, NewString);\r
-    }\r
+    NewStringHelpToken = HiiSetString (Private->RegisteredHandle, mDriverImageFilePathToken[Index], NewString, NULL);\r
+    ASSERT (NewStringHelpToken != 0);\r
     mDriverImageFilePathToken[Index] = NewStringHelpToken;\r
-    ASSERT_EFI_ERROR (Status);\r
-    gBS->FreePool (NewString);\r
-    gBS->FreePool (DriverName);\r
+    FreePool (NewString);\r
+    FreePool (DriverName);\r
 \r
-    CreateCheckBoxOpCode (\r
+    HiiCreateCheckBoxOpCode (\r
+      StartOpCodeHandle,\r
       (UINT16) (DRIVER_SELECTION_QUESTION_ID + Index),\r
       VARSTORE_ID_PLAT_OVER_MNGR,\r
       (UINT16) (DRIVER_SELECTION_VAR_OFFSET + Index),\r
@@ -850,23 +849,23 @@ UpdateBindingDriverSelectPage (
       NewStringHelpToken,\r
       0,\r
       0,\r
-      &UpdateData\r
+      NULL\r
       );\r
   }\r
 \r
   //\r
   // Update second page form\r
   //\r
-  IfrLibUpdateForm (\r
+  HiiUpdateForm (\r
     Private->RegisteredHandle,\r
     &mPlatformOverridesManagerGuid,\r
     FORM_ID_DRIVER,\r
-    FORM_ID_DRIVER,\r
-    FALSE,\r
-    &UpdateData\r
+    StartOpCodeHandle, // Label FORM_ID_DRIVER\r
+    EndOpCodeHandle    // LABEL_END\r
     );\r
 \r
-  gBS->FreePool (UpdateData.Data);\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -888,17 +887,19 @@ UpdatePrioritySelectPage (
   IN PLAT_OVER_MNGR_DATA              *FakeNvData\r
   )\r
 {\r
-  EFI_HII_UPDATE_DATA                       UpdateData;\r
   UINTN                                     Index;\r
-\r
   EFI_DEVICE_PATH_PROTOCOL                  *LoadedImageDevicePath;\r
-\r
-  IFR_OPTION                                *IfrOptionList;\r
   UINTN                                     SelectedDriverImageNum;\r
   UINT32                                    DriverImageNO;\r
   UINTN                                     MinNO;\r
   UINTN                                     Index1;\r
   UINTN                                     TempNO[100];\r
+  UINTN                                     OrderNO[100];\r
+  VOID                                      *StartOpCodeHandle;\r
+  VOID                                      *EndOpCodeHandle;\r
+  VOID                                      *OptionsOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL                        *StartLabel;\r
+  EFI_IFR_GUID_LABEL                        *EndLabel;\r
 \r
   //\r
   // Following code will be run if user select 'order ... priority' item in second page\r
@@ -906,20 +907,38 @@ UpdatePrioritySelectPage (
   //\r
   mCurrentPage = FORM_ID_ORDER;\r
 \r
-  UpdateData.BufferSize = UPDATE_DATA_SIZE;\r
-  UpdateData.Offset = 0;\r
-  UpdateData.Data = AllocateZeroPool (UPDATE_DATA_SIZE);\r
-  ASSERT (UpdateData.Data != NULL);\r
+  //\r
+  // Init OpCode Handle\r
+  //\r
+  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (StartOpCodeHandle != NULL);\r
+\r
+  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (EndOpCodeHandle != NULL);\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the start opcode\r
+  //\r
+  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  StartLabel->Number       = FORM_ID_ORDER;\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the end opcode\r
+  //\r
+  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  EndLabel->Number       = LABEL_END;\r
+\r
   //\r
   // Clear third page form\r
   //\r
-  IfrLibUpdateForm (\r
+  HiiUpdateForm (\r
     Private->RegisteredHandle,\r
     &mPlatformOverridesManagerGuid,\r
     FORM_ID_ORDER,\r
-    FORM_ID_ORDER,\r
-    FALSE,\r
-    &UpdateData\r
+    StartOpCodeHandle,\r
+    EndOpCodeHandle\r
     );\r
 \r
   //\r
@@ -937,20 +956,25 @@ UpdatePrioritySelectPage (
     return EFI_SUCCESS;\r
   }\r
 \r
-  IfrOptionList = AllocateZeroPool (0x200);\r
-  ASSERT_EFI_ERROR (IfrOptionList != NULL);\r
+  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (OptionsOpCodeHandle != NULL);\r
+\r
   //\r
   // Create order list for those selected drivers\r
   //\r
   SelectedDriverImageNum = 0;\r
   for (Index = 0; Index < mDriverImageHandleCount; Index++) {\r
     if (FakeNvData->DriSelection[Index] != 0) {\r
-      IfrOptionList[SelectedDriverImageNum].StringToken = mDriverImageToken[Index];\r
       //\r
       // Use the NO. in driver binding buffer as value, will use it later\r
       //\r
-      IfrOptionList[SelectedDriverImageNum].Value.u8 = (UINT8) (Index + 1);\r
-      IfrOptionList[SelectedDriverImageNum].Flags = 0;\r
+      HiiCreateOneOfOptionOpCode (\r
+        OptionsOpCodeHandle,\r
+        mDriverImageToken[Index],\r
+        0,\r
+        EFI_IFR_NUMERIC_SIZE_1,\r
+        Index + 1\r
+        );\r
 \r
       //\r
       // Get the EFI Loaded Image Device Path Protocol\r
@@ -979,6 +1003,7 @@ UpdatePrioritySelectPage (
         mLastSavedDriverImageNum++;\r
       }\r
       TempNO[SelectedDriverImageNum] = DriverImageNO;\r
+      OrderNO[SelectedDriverImageNum] = Index + 1;\r
       SelectedDriverImageNum ++;\r
     }\r
   }\r
@@ -987,7 +1012,7 @@ UpdatePrioritySelectPage (
   //\r
   // NvRamMap Must be clear firstly\r
   //\r
-  ZeroMem (FakeNvData->DriOrder, 100);\r
+  ZeroMem (FakeNvData->DriOrder, sizeof (FakeNvData->DriOrder));\r
 \r
   //\r
   // Order the selected drivers according to the info already in mapping database\r
@@ -1006,11 +1031,15 @@ UpdatePrioritySelectPage (
     //\r
     // the IfrOptionList[MinNO].Value = the driver NO. in driver binding buffer\r
     //\r
-    FakeNvData->DriOrder[Index] =IfrOptionList[MinNO].Value.u8;\r
-    TempNO[MinNO] = 101;\r
+    FakeNvData->DriOrder[Index] = (UINT8) OrderNO[MinNO];\r
+    TempNO[MinNO] = MAX_CHOICE_NUM + 1;\r
   }\r
-\r
-  CreateOrderedListOpCode (\r
+  \r
+  //\r
+  // Create Order List OpCode\r
+  //\r
+  HiiCreateOrderedListOpCode (\r
+    StartOpCodeHandle,\r
     (UINT16) DRIVER_ORDER_QUESTION_ID,\r
     VARSTORE_ID_PLAT_OVER_MNGR,\r
     (UINT16) DRIVER_ORDER_VAR_OFFSET,\r
@@ -1019,26 +1048,26 @@ UpdatePrioritySelectPage (
     EFI_IFR_FLAG_RESET_REQUIRED,\r
     0,\r
     EFI_IFR_NUMERIC_SIZE_1,\r
-    100,\r
-    IfrOptionList,\r
-    SelectedDriverImageNum,\r
-    &UpdateData\r
+    (UINT8) MAX_CHOICE_NUM,\r
+    OptionsOpCodeHandle,\r
+    NULL\r
     );\r
 \r
   //\r
   // Update third page form\r
   //\r
-  IfrLibUpdateForm (\r
+  HiiUpdateForm (\r
     Private->RegisteredHandle,\r
     &mPlatformOverridesManagerGuid,\r
     FORM_ID_ORDER,\r
-    FORM_ID_ORDER,\r
-    FALSE,\r
-    &UpdateData\r
+    StartOpCodeHandle, // Label FORM_ID_ORDER\r
+    EndOpCodeHandle    // LABEL_END\r
     );\r
 \r
-  gBS->FreePool (IfrOptionList);\r
-  gBS->FreePool (UpdateData.Data);\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
+  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1121,7 +1150,7 @@ CommintChanges (
 EFI_STATUS\r
 EFIAPI\r
 PlatOverMngrExtractConfig (\r
- IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
 IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
   IN  CONST EFI_STRING                       Request,\r
   OUT EFI_STRING                             *Progress,\r
   OUT EFI_STRING                             *Results\r
@@ -1130,6 +1159,10 @@ PlatOverMngrExtractConfig (
   EFI_STATUS                       Status;\r
   EFI_CALLBACK_INFO                *Private;\r
   EFI_HII_CONFIG_ROUTING_PROTOCOL  *HiiConfigRouting;\r
+  \r
+  if (Request == NULL) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
 \r
   Private = EFI_CALLBACK_INFO_FROM_THIS (This);\r
   HiiConfigRouting = Private->HiiConfigRouting;\r
@@ -1151,12 +1184,12 @@ PlatOverMngrExtractConfig (
 /**\r
   This function processes the results of changes in configuration.\r
 \r
-  @param  This         Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
-  @param  Request      A null-terminated Unicode string in <ConfigRequest> format.\r
-  @param  Progress     A pointer to a string filled in with the offset of the most\r
-                       recent '&' before the first failing name/value pair (or the\r
-                       beginning of the string if the failure is in the first\r
-                       name/value pair) or the terminating NULL if all was successful.\r
+  @param  This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+  @param  Configuration   A null-terminated Unicode string in <ConfigRequest> format.\r
+  @param  Progress        A pointer to a string filled in with the offset of the most\r
+                          recent '&' before the first failing name/value pair (or the\r
+                          beginning of the string if the failure is in the first\r
+                          name/value pair) or the terminating NULL if all was successful.\r
 \r
   @retval EFI_SUCCESS            The Results is processed successfully.\r
   @retval EFI_INVALID_PARAMETER  Configuration is NULL.\r
@@ -1172,18 +1205,13 @@ PlatOverMngrRouteConfig (
   )\r
 {\r
   EFI_CALLBACK_INFO                         *Private;\r
-  EFI_STATUS                                Status;\r
   UINT16                                    KeyValue;\r
-  UINTN                                     BufferSize;\r
   PLAT_OVER_MNGR_DATA                       *FakeNvData;\r
 \r
-  Private     = EFI_CALLBACK_INFO_FROM_THIS (This);\r
-\r
-  FakeNvData = &Private->FakeNvData;\r
-  BufferSize = sizeof (PLAT_OVER_MNGR_DATA);\r
-  Status = GetBrowserData (NULL, NULL, &BufferSize, (UINT8 *) FakeNvData);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  Private    = EFI_CALLBACK_INFO_FROM_THIS (This);\r
+  FakeNvData = (PLAT_OVER_MNGR_DATA *) HiiGetBrowserData (&mPlatformOverridesManagerGuid, mVariableName, sizeof (PLAT_OVER_MNGR_DATA));\r
+  if (FakeNvData == NULL) {\r
+    return EFI_NOT_FOUND;\r
   }\r
 \r
   if (mCurrentPage == FORM_ID_DRIVER) {\r
@@ -1202,6 +1230,11 @@ PlatOverMngrRouteConfig (
     KeyValue = KEY_VALUE_ORDER_SAVE_AND_EXIT;\r
     CommintChanges (Private, KeyValue, FakeNvData);\r
   }\r
+\r
+  if (FakeNvData != NULL) {\r
+    FreePool (FakeNvData);\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1240,17 +1273,13 @@ PlatOverMngrCallback (
   EFI_CALLBACK_INFO                         *Private;\r
   EFI_STATUS                                Status;\r
   EFI_STRING_ID                             NewStringToken;\r
-  UINTN                                     BufferSize;\r
-  PLAT_OVER_MNGR_DATA                       *FakeNvData;\r
   EFI_INPUT_KEY                             Key;\r
-\r
+  PLAT_OVER_MNGR_DATA                       *FakeNvData;\r
+  \r
   Private = EFI_CALLBACK_INFO_FROM_THIS (This);\r
-\r
-  FakeNvData = &Private->FakeNvData;\r
-  BufferSize = sizeof (PLAT_OVER_MNGR_DATA);\r
-  Status = GetBrowserData (NULL, NULL, &BufferSize, (UINT8 *) FakeNvData);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  FakeNvData = (PLAT_OVER_MNGR_DATA *) HiiGetBrowserData (&mPlatformOverridesManagerGuid, mVariableName, sizeof (PLAT_OVER_MNGR_DATA));\r
+  if (FakeNvData == NULL) {\r
+    return EFI_NOT_FOUND;\r
   }\r
 \r
   if (KeyValue == KEY_VALUE_DEVICE_REFRESH ||\r
@@ -1262,21 +1291,23 @@ PlatOverMngrCallback (
     // Update page title string\r
     //\r
     NewStringToken = STRING_TOKEN (STR_TITLE);\r
-    Status = HiiLibSetString (Private->RegisteredHandle, NewStringToken, L"First, Select the controller by device path");\r
-    ASSERT_EFI_ERROR (Status);\r
+    if (HiiSetString (Private->RegisteredHandle, NewStringToken, L"First, Select the controller by device path", NULL) == 0) {\r
+      ASSERT (FALSE);\r
+    }\r
   }\r
 \r
-  if (((KEY_VALUE_DEVICE_OFFSET <= KeyValue) && (KeyValue < KEY_VALUE_DEVICE_MAX)) || (KeyValue == KEY_VALUE_ORDER_GOTO_PREVIOUS)) {\r
+  if (((KeyValue >= KEY_VALUE_DEVICE_OFFSET) && (KeyValue < KEY_VALUE_DEVICE_MAX)) || (KeyValue == KEY_VALUE_ORDER_GOTO_PREVIOUS)) {\r
     if (KeyValue == KEY_VALUE_ORDER_GOTO_PREVIOUS) {\r
-      KeyValue = (EFI_QUESTION_ID) (mSelectedCtrIndex + 0x100);\r
+      KeyValue = (EFI_QUESTION_ID) (mSelectedCtrIndex + KEY_VALUE_DEVICE_OFFSET);\r
     }\r
     UpdateBindingDriverSelectPage (Private, KeyValue, FakeNvData);\r
     //\r
     // Update page title string\r
     //\r
     NewStringToken = STRING_TOKEN (STR_TITLE);\r
-    Status = HiiLibSetString (Private->RegisteredHandle, NewStringToken, L"Second, Select drivers for the previous selected controller");\r
-    ASSERT_EFI_ERROR (Status);\r
+    if (HiiSetString (Private->RegisteredHandle, NewStringToken, L"Second, Select drivers for the previous selected controller", NULL) == 0) {\r
+      ASSERT (FALSE);\r
+    }\r
   }\r
 \r
   if (KeyValue == KEY_VALUE_DRIVER_GOTO_ORDER) {\r
@@ -1285,15 +1316,16 @@ PlatOverMngrCallback (
     // Update page title string\r
     //\r
     NewStringToken = STRING_TOKEN (STR_TITLE);\r
-    Status = HiiLibSetString (Private->RegisteredHandle, NewStringToken, L"Finally, Set the priority order for the drivers and save them");\r
-    ASSERT_EFI_ERROR (Status);\r
+    if (HiiSetString (Private->RegisteredHandle, NewStringToken, L"Finally, Set the priority order for the drivers and save them", NULL) == 0) {\r
+      ASSERT (FALSE);\r
+    }\r
   }\r
 \r
   if (KeyValue == KEY_VALUE_ORDER_SAVE_AND_EXIT) {\r
     Status = CommintChanges (Private, KeyValue, FakeNvData);\r
     *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
     if (EFI_ERROR (Status)) {\r
-      IfrLibCreatePopUp (1, &Key, L"Single Override Info too large, Saving Error!");\r
+      CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Single Override Info too large, Saving Error!", NULL);\r
       return EFI_DEVICE_ERROR;\r
     }\r
   }\r
@@ -1309,88 +1341,159 @@ PlatOverMngrCallback (
   //\r
   // Pass changed uncommitted data back to Form Browser\r
   //\r
-  BufferSize = sizeof (PLAT_OVER_MNGR_DATA);\r
-  Status = SetBrowserData (NULL, NULL, BufferSize, (UINT8 *) FakeNvData, NULL);\r
+  HiiSetBrowserData (&mPlatformOverridesManagerGuid, mVariableName, sizeof (PLAT_OVER_MNGR_DATA), (UINT8 *) FakeNvData, NULL);\r
+  \r
+  //\r
+  // Update local configuration buffer.\r
+  //\r
+  CopyMem (&Private->FakeNvData, FakeNvData, sizeof (PLAT_OVER_MNGR_DATA));\r
+  if (FakeNvData != NULL) {\r
+    FreePool (FakeNvData);\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
-  Function unpacks a device path data structure so that all the nodes\r
-  of a device path are naturally aligned.\r
+  The driver Entry Point. The funciton will export a disk device class formset and\r
+  its callback function to hii database.\r
 \r
-  @param  DevPath  A pointer to a device path data structure\r
+  @param  ImageHandle    The firmware allocated handle for the EFI image.\r
+  @param  SystemTable    A pointer to the EFI System Table.\r
 \r
-  @return If the memory for the device path is successfully allocated, then a\r
-  @return pointer to the new device path is returned.  Otherwise, NULL is returned.\r
+  @retval EFI_SUCCESS    The entry point is executed successfully.\r
+  @retval other          Some error occurs when executing this entry point.\r
 \r
 **/\r
-EFI_DEVICE_PATH_PROTOCOL *\r
-UnpackDevicePath (\r
-  IN EFI_DEVICE_PATH_PROTOCOL  *DevPath\r
+EFI_STATUS\r
+EFIAPI\r
+PlatOverMngrInit (\r
+  IN EFI_HANDLE                   ImageHandle,\r
+  IN EFI_SYSTEM_TABLE             *SystemTable\r
   )\r
 {\r
-  EFI_DEVICE_PATH_PROTOCOL  *Src;\r
-  EFI_DEVICE_PATH_PROTOCOL  *Dest;\r
-  EFI_DEVICE_PATH_PROTOCOL  *NewPath;\r
-  UINTN                     Size;\r
+  EFI_STATUS                  Status;\r
+  EFI_FORM_BROWSER2_PROTOCOL  *FormBrowser2;\r
+  \r
+  //\r
+  // There should only be one Form Configuration protocol\r
+  //\r
+  Status = gBS->LocateProtocol (\r
+                 &gEfiFormBrowser2ProtocolGuid,\r
+                 NULL,\r
+                 (VOID **) &FormBrowser2\r
+                 );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  mCallbackInfo = AllocateZeroPool (sizeof (EFI_CALLBACK_INFO));\r
+  if (mCallbackInfo == NULL) {\r
+    return EFI_BAD_BUFFER_SIZE;\r
+  }\r
+\r
+  mCallbackInfo->Signature = EFI_CALLBACK_INFO_SIGNATURE;\r
+  mCallbackInfo->ConfigAccess.ExtractConfig = PlatOverMngrExtractConfig;\r
+  mCallbackInfo->ConfigAccess.RouteConfig   = PlatOverMngrRouteConfig;\r
+  mCallbackInfo->ConfigAccess.Callback      = PlatOverMngrCallback;\r
 \r
   //\r
-  // Walk device path and round sizes to valid boundries\r
+  // Install Device Path Protocol and Config Access protocol to driver handle\r
   //\r
-  Src   = DevPath;\r
-  Size  = 0;\r
-  for (;;) {\r
-    Size += DevicePathNodeLength (Src);\r
-    Size += ALIGN_SIZE (Size);\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &mCallbackInfo->DriverHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  &mHiiVendorDevicePath,\r
+                  &gEfiHiiConfigAccessProtocolGuid,\r
+                  &mCallbackInfo->ConfigAccess,\r
+                  NULL\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto Finish;\r
+  }\r
 \r
-    if (IsDevicePathEnd (Src)) {\r
-      break;\r
-    }\r
+  //\r
+  // Publish our HII data\r
+  //\r
+  mCallbackInfo->RegisteredHandle = HiiAddPackages (\r
+                                     &mPlatformOverridesManagerGuid,\r
+                                     mCallbackInfo->DriverHandle,\r
+                                     VfrBin,\r
+                                     PlatOverMngrStrings,\r
+                                     NULL\r
+                                     );\r
+  if (mCallbackInfo->RegisteredHandle == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Finish;\r
+  }\r
 \r
-    Src = NextDevicePathNode (Src);\r
+  //\r
+  // Locate ConfigRouting protocol\r
+  //\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiHiiConfigRoutingProtocolGuid,\r
+                  NULL,\r
+                  (VOID **) &mCallbackInfo->HiiConfigRouting\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto Finish;\r
   }\r
+\r
   //\r
-  // Allocate space for the unpacked path\r
+  // Clear all the globle variable\r
   //\r
-  NewPath = AllocateZeroPool (Size);\r
-  if (NewPath) {\r
+  mDriverImageHandleCount = 0;\r
+  mCurrentPage = 0;\r
+  ZeroMem (mDriverImageToken, MAX_CHOICE_NUM * sizeof (EFI_STRING_ID));\r
+  ZeroMem (mDriverImageFilePathToken, MAX_CHOICE_NUM * sizeof (EFI_STRING_ID));\r
+  ZeroMem (mControllerToken, MAX_CHOICE_NUM * sizeof (EFI_STRING_ID));\r
+  ZeroMem (mDriverImageProtocol, MAX_CHOICE_NUM * sizeof (EFI_LOADED_IMAGE_PROTOCOL *));\r
 \r
-    ASSERT (((UINTN) NewPath) % MIN_ALIGNMENT_SIZE == 0);\r
+  //\r
+  // Show the page\r
+  //\r
+  Status = FormBrowser2->SendForm (\r
+                           FormBrowser2,\r
+                           &mCallbackInfo->RegisteredHandle,\r
+                           1,\r
+                           NULL,\r
+                           0,\r
+                           NULL,\r
+                           NULL\r
+                           );\r
 \r
-    //\r
-    // Copy each node\r
-    //\r
-    Src   = DevPath;\r
-    Dest  = NewPath;\r
-    for (;;) {\r
-      Size = DevicePathNodeLength (Src);\r
-      CopyMem (Dest, Src, Size);\r
-      Size += ALIGN_SIZE (Size);\r
-      SetDevicePathNodeLength (Dest, Size);\r
-      Dest->Type |= EFI_DP_TYPE_UNPACKED;\r
-      Dest = (EFI_DEVICE_PATH_PROTOCOL *) (((UINT8 *) Dest) + Size);\r
-\r
-      if (IsDevicePathEnd (Src)) {\r
-        break;\r
-      }\r
+  HiiRemovePackages (mCallbackInfo->RegisteredHandle);\r
+  Status = EFI_SUCCESS;\r
+\r
+Finish:\r
+  if (mCallbackInfo->DriverHandle != NULL) {\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+           mCallbackInfo->DriverHandle,\r
+           &gEfiDevicePathProtocolGuid,\r
+           &mHiiVendorDevicePath,\r
+           &gEfiHiiConfigAccessProtocolGuid,\r
+           &mCallbackInfo->ConfigAccess,\r
+           NULL\r
+           );\r
+  }\r
 \r
-      Src = NextDevicePathNode (Src);\r
-    }\r
+  if (mCallbackInfo != NULL) {\r
+    FreePool (mCallbackInfo);\r
   }\r
 \r
-  return NewPath;\r
+  return Status;\r
 }\r
 \r
-\r
 /**\r
-  Get the description string by device path.\r
-\r
-  @param  DevPath     The input device path.\r
-\r
-  @retval !NULL       The description string retured.\r
-  @retval  NULL       The description string cannot be found.\r
-\r
+  Converting a given device to an unicode string. \r
+  \r
+  This function will dependent on gEfiDevicePathToTextProtocolGuid, if protocol\r
+  does not installed, then return unknown device path L"?" directly.\r
+  \r
+  @param    DevPath     Given device path instance\r
+  \r
+  @return   Converted string from given device path.\r
+  @retval   L"?"  Can not locate gEfiDevicePathToTextProtocolGuid protocol for converting.\r
 **/\r
 CHAR16 *\r
 DevicePathToStr (\r
@@ -1398,13 +1501,13 @@ DevicePathToStr (
   )\r
 {\r
   EFI_STATUS                       Status;\r
-  CHAR16                           *ToText;\r
   EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevPathToText;\r
-\r
+  CHAR16                           *ToText;\r
+  \r
   if (DevPath == NULL) {\r
-    return NULL;\r
+    return L"";\r
   }\r
-\r
+    \r
   Status = gBS->LocateProtocol (\r
                   &gEfiDevicePathToTextProtocolGuid,\r
                   NULL,\r
@@ -1420,5 +1523,5 @@ DevicePathToStr (
     return ToText;\r
   }\r
 \r
-  return NULL;\r
+  return L"?";\r
 }\r