]> 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 c46ff8d4c03105541c6fab07b7c1d90365df4b12..018917fd0aec687acc3cb45f8a39f3cba627946b 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-  A UI application to offer a UI interface in device manager to let user configue\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
@@ -37,22 +37,21 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Protocol/ComponentName.h>\r
 #include <Protocol/DriverBinding.h>\r
 #include <Protocol/DevicePathToText.h>\r
-#include <Guid/GlobalVariable.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/HiiLib.h>\r
-#include <Library/IfrSupportLib.h>\r
-#include <Library/ExtendedHiiLib.h>\r
-#include <Library/ExtendedIfrSupportLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
-#include <Library/UefiRuntimeServicesTableLib.h>\r
 #include <Library/DevicePathLib.h>\r
+#include <Library/HiiLib.h>\r
+\r
 #include "PlatOverMngr.h"\r
 \r
 #define EFI_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('C', 'l', 'b', 'k')\r
@@ -67,6 +66,18 @@ typedef struct {
   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
@@ -77,6 +88,7 @@ extern UINT8  PlatOverMngrStrings[];
 // 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
@@ -91,8 +103,30 @@ EFI_LOADED_IMAGE_PROTOCOL    *mDriverImageProtocol[MAX_CHOICE_NUM];
 EFI_DEVICE_PATH_PROTOCOL     *mControllerDevicePathProtocol[MAX_CHOICE_NUM];\r
 UINTN                        mSelectedDriverImageNum;\r
 UINTN                        mLastSavedDriverImageNum;\r
-CHAR8                        mLanguage[RFC_3066_ENTRY_SIZE];\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
 /**\r
   Converting a given device to an unicode string. \r
@@ -111,55 +145,71 @@ DevicePathToStr (
   );\r
 \r
 /**\r
-  Do string convertion for the ComponentName supported language. It do\r
-  the convertion just for english language code from RFC 3066 to ISO 639-2.\r
-  Then it will check whether the converted language is in the supported language list.\r
-  If not supported, NULL is returned.\r
-  If Language is not english, NULL is returned.\r
+  Worker function to get the driver name by ComponentName or ComponentName2 protocol \r
+  according to the driver binding handle.\r
 \r
-  @param SupportedLanguages        Pointer to ComponentName supported language string list. ISO 639-2 language\r
-  @param Language                  The language string. RFC 3066 language\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
-  @return  English language string (ISO 639-2)\r
-  @return  NULL if the conertion is not successful.\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
-CHAR8 *\r
-ConvertComponentNameSupportLanguage (\r
-  IN CHAR8                           *SupportedLanguages,\r
-  IN CHAR8                           *Language\r
+CHAR16 *\r
+GetComponentNameWorker (\r
+  IN EFI_HANDLE                      DriverBindingHandle,\r
+  IN EFI_GUID                        *ProtocolGuid,\r
+  IN CONST CHAR16                    *VariableName\r
   )\r
 {\r
-  CHAR8    *LangCode;\r
-  LangCode = NULL;\r
+  EFI_STATUS                         Status;\r
+  EFI_COMPONENT_NAME_PROTOCOL        *ComponentName;\r
+  CHAR16                             *DriverName;\r
+  CHAR8                              *Language;\r
+  CHAR8                              *BestLanguage;\r
 \r
-  //\r
-  // Check the input language is English\r
-  //\r
-  if (AsciiStrnCmp (Language, "en-", 3) != 0) {\r
+  Status = gBS->OpenProtocol (\r
+                  DriverBindingHandle,\r
+                  ProtocolGuid,\r
+                  (VOID *) &ComponentName,\r
+                  NULL,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
     return NULL;\r
   }\r
-  \r
+\r
   //\r
-  // Check SupportedLanguages format\r
+  // Find the best matching language.\r
   //\r
-  if (AsciiStrStr (SupportedLanguages, "en-") != NULL) {\r
-    //\r
-    // Create RFC 3066 language\r
-    //\r
-    LangCode = AllocateZeroPool(AsciiStrSize (Language));\r
-    AsciiStrCpy (LangCode, Language);\r
-  } else if (AsciiStrStr (SupportedLanguages, "en") != NULL) {\r
-    //\r
-    // Create ISO 639-2 Language\r
-    //\r
-    LangCode = AllocateZeroPool(4);\r
-    AsciiStrCpy (LangCode, "eng");    \r
+  Language = GetEfiGlobalVariable (VariableName);\r
+  BestLanguage = GetBestLanguage (\r
+                   ComponentName->SupportedLanguages,\r
+                   (BOOLEAN) (ProtocolGuid == &gEfiComponentNameProtocolGuid),\r
+                   Language,\r
+                   NULL\r
+                   );\r
+\r
+  DriverName = NULL;\r
+  if (BestLanguage != NULL) {\r
+    ComponentName->GetDriverName (\r
+                     ComponentName,\r
+                     BestLanguage,\r
+                     &DriverName\r
+                     );\r
+    FreePool (BestLanguage);\r
   }\r
-  \r
-  return LangCode;\r
+\r
+  if (Language != NULL) {\r
+    FreePool (Language);\r
+  }\r
+\r
+  return DriverName;\r
 }\r
 \r
+\r
 /**\r
   Get the driver name by ComponentName or ComponentName2 protocol \r
   according to the driver binding handle\r
@@ -175,59 +225,17 @@ 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
-      SupportedLanguage = ConvertComponentNameSupportLanguage (ComponentName->SupportedLanguages, mLanguage);\r
-      if (SupportedLanguage != NULL) {\r
-        Status = ComponentName->GetDriverName (\r
-                                  ComponentName,\r
-                                  SupportedLanguage,\r
-                                  &DriverName\r
-                                  );\r
-        FreePool (SupportedLanguage);\r
-      }\r
-    }\r
-  } else if (ComponentName2 != NULL) {\r
-    if (ComponentName2->GetDriverName != NULL) {\r
-      Status = ComponentName2->GetDriverName (\r
-                                 ComponentName2,\r
-                                 mLanguage,\r
-                                 &DriverName\r
-                                 );\r
-    }\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
@@ -235,7 +243,7 @@ GetComponentName (
 \r
 /**\r
   Get the image name from EFI UI section.\r
-  Get FV protocol by its loaded image protoocl to abastract EFI UI section.\r
+  Get FV protocol by its loaded image protocol to abstract EFI UI section.\r
 \r
   @param Image            Pointer to the loaded image protocol\r
 \r
@@ -336,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
@@ -348,48 +354,54 @@ UpdateDeviceSelectPage (
   EFI_PCI_IO_PROTOCOL                       *PciIo;\r
   EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride;\r
   UINTN                                     Len;\r
-  \r
+  VOID                                      *StartOpCodeHandle;\r
+  VOID                                      *EndOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL                        *StartLabel;\r
+  EFI_IFR_GUID_LABEL                        *EndLabel;  \r
+\r
   //\r
-  // set current page form ID.\r
+  // Set current page form ID.\r
   //\r
   mCurrentPage = FORM_ID_DEVICE;  \r
   \r
   //\r
-  // Get Platform supported Language (RFC_3066 format)\r
+  // Initial the mapping database in memory\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
+  FreeMappingDatabase (&mMappingDataBase);\r
+  InitOverridesMapping (&mMappingDataBase);\r
 \r
   //\r
-  // Initial the mapping database in memory\r
+  // Init OpCode Handle\r
   //\r
-  FreeMappingDatabase (&mMappingDataBase);\r
-  Status = InitOverridesMapping (&mMappingDataBase);\r
+  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (StartOpCodeHandle != NULL);\r
+\r
+  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (EndOpCodeHandle != NULL);\r
 \r
   //\r
-  // Clear all the content in the first page\r
+  // Create Hii Extend Label OpCode as the start 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
+  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
+  // 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 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
@@ -397,17 +409,19 @@ UpdateDeviceSelectPage (
   // 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
+  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
+  if (HiiSetString (Private->RegisteredHandle, NewStringToken, NewString, NULL) == 0) {\r
+    ASSERT (FALSE);\r
+  }\r
   FreePool (NewString);\r
 \r
   //\r
@@ -492,42 +506,38 @@ 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
+    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
-  FreePool (UpdateData.Data);\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -618,7 +628,6 @@ UpdateBindingDriverSelectPage (
   IN PLAT_OVER_MNGR_DATA              *FakeNvData\r
   )\r
 {\r
-  EFI_HII_UPDATE_DATA                       UpdateData;\r
   EFI_STATUS                                Status;\r
   UINTN                                     Index;\r
   CHAR16                                    *NewString;\r
@@ -631,6 +640,10 @@ UpdateBindingDriverSelectPage (
   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
@@ -646,26 +659,42 @@ UpdateBindingDriverSelectPage (
   // Switch the item callback key value to its NO. in mDevicePathHandleBuffer\r
   //\r
   mSelectedCtrIndex = KeyValue - KEY_VALUE_DEVICE_OFFSET;\r
-  ASSERT (mSelectedCtrIndex > 0 && mSelectedCtrIndex < MAX_CHOICE_NUM);\r
+  ASSERT (mSelectedCtrIndex < MAX_CHOICE_NUM);\r
 \r
   mLastSavedDriverImageNum = 0;\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
-  // Clear all the content in dynamic page\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
-  UpdateData.BufferSize = UPDATE_DATA_SIZE;\r
-  UpdateData.Offset = 0;\r
-  UpdateData.Data = AllocateZeroPool (UPDATE_DATA_SIZE);\r
-  ASSERT (UpdateData.Data != NULL);\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
@@ -767,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
@@ -789,14 +818,9 @@ 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
     FreePool (NewString);\r
     if (FreeDriverName) {\r
       FreePool (DriverName);\r
@@ -810,18 +834,14 @@ UpdateBindingDriverSelectPage (
     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
     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
@@ -829,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
-  FreePool (UpdateData.Data);\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -867,15 +887,19 @@ UpdatePrioritySelectPage (
   IN PLAT_OVER_MNGR_DATA              *FakeNvData\r
   )\r
 {\r
-  EFI_HII_UPDATE_DATA                       UpdateData;\r
   UINTN                                     Index;\r
   EFI_DEVICE_PATH_PROTOCOL                  *LoadedImageDevicePath;\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
@@ -883,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
@@ -913,21 +955,26 @@ UpdatePrioritySelectPage (
   if (SelectedDriverImageNum == 0) {\r
     return EFI_SUCCESS;\r
   }\r
-  \r
-  IfrOptionList = AllocateZeroPool (sizeof (IFR_OPTION) * mSelectedDriverImageNum);\r
-  ASSERT (IfrOptionList != NULL);\r
+\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
@@ -956,6 +1003,7 @@ UpdatePrioritySelectPage (
         mLastSavedDriverImageNum++;\r
       }\r
       TempNO[SelectedDriverImageNum] = DriverImageNO;\r
+      OrderNO[SelectedDriverImageNum] = Index + 1;\r
       SelectedDriverImageNum ++;\r
     }\r
   }\r
@@ -983,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
+    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
@@ -997,25 +1049,25 @@ UpdatePrioritySelectPage (
     0,\r
     EFI_IFR_NUMERIC_SIZE_1,\r
     (UINT8) MAX_CHOICE_NUM,\r
-    IfrOptionList,\r
-    SelectedDriverImageNum,\r
-    &UpdateData\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
-  FreePool (IfrOptionList);\r
-  FreePool (UpdateData.Data);\r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
+  HiiFreeOpCodeHandle (OptionsOpCodeHandle);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1107,7 +1159,7 @@ PlatOverMngrExtractConfig (
   EFI_STATUS                       Status;\r
   EFI_CALLBACK_INFO                *Private;\r
   EFI_HII_CONFIG_ROUTING_PROTOCOL  *HiiConfigRouting;\r
-\r
+  \r
   if (Request == NULL) {\r
     return EFI_NOT_FOUND;\r
   }\r
@@ -1153,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
@@ -1183,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
@@ -1221,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
@@ -1243,8 +1291,9 @@ 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 (((KeyValue >= KEY_VALUE_DEVICE_OFFSET) && (KeyValue < KEY_VALUE_DEVICE_MAX)) || (KeyValue == KEY_VALUE_ORDER_GOTO_PREVIOUS)) {\r
@@ -1256,8 +1305,9 @@ PlatOverMngrCallback (
     // 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
@@ -1266,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
@@ -1290,8 +1341,15 @@ 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
@@ -1315,24 +1373,8 @@ PlatOverMngrInit (
   )\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_FORM_BROWSER2_PROTOCOL  *FormBrowser2;\r
   \r
-  //\r
-  // There should only be one HII protocol\r
-  //\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiHiiDatabaseProtocolGuid,\r
-                  NULL,\r
-                  (VOID **) &HiiDatabase\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
   //\r
   // There should only be one Form Configuration protocol\r
   //\r
@@ -1345,33 +1387,26 @@ PlatOverMngrInit (
     return Status;\r
   }\r
 \r
-  CallbackInfo = AllocateZeroPool (sizeof (EFI_CALLBACK_INFO));\r
-  if (CallbackInfo == NULL) {\r
+  mCallbackInfo = AllocateZeroPool (sizeof (EFI_CALLBACK_INFO));\r
+  if (mCallbackInfo == 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
+  mCallbackInfo->Signature = EFI_CALLBACK_INFO_SIGNATURE;\r
+  mCallbackInfo->ConfigAccess.ExtractConfig = PlatOverMngrExtractConfig;\r
+  mCallbackInfo->ConfigAccess.RouteConfig   = PlatOverMngrRouteConfig;\r
+  mCallbackInfo->ConfigAccess.Callback      = PlatOverMngrCallback;\r
 \r
   //\r
-  // Create driver handle used by HII database\r
+  // Install Device Path Protocol and Config Access protocol to driver handle\r
   //\r
-  Status = HiiLibCreateHiiDriverHandle (&DriverHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    goto Finish;\r
-  }\r
-  CallbackInfo->DriverHandle = DriverHandle;\r
-\r
-  //\r
-  // Install Config Access protocol to driver handle\r
-  //\r
-  Status = gBS->InstallProtocolInterface (\r
-                  &DriverHandle,\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &mCallbackInfo->DriverHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  &mHiiVendorDevicePath,\r
                   &gEfiHiiConfigAccessProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &CallbackInfo->ConfigAccess\r
+                  &mCallbackInfo->ConfigAccess,\r
+                  NULL\r
                   );\r
   if (EFI_ERROR (Status)) {\r
     goto Finish;\r
@@ -1380,23 +1415,15 @@ PlatOverMngrInit (
   //\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
-  FreePool (PackageList);\r
-\r
-  if (EFI_ERROR (Status)) {\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
@@ -1406,7 +1433,7 @@ PlatOverMngrInit (
   Status = gBS->LocateProtocol (\r
                   &gEfiHiiConfigRoutingProtocolGuid,\r
                   NULL,\r
-                  (VOID **) &CallbackInfo->HiiConfigRouting\r
+                  (VOID **) &mCallbackInfo->HiiConfigRouting\r
                   );\r
   if (EFI_ERROR (Status)) {\r
     goto Finish;\r
@@ -1427,30 +1454,31 @@ PlatOverMngrInit (
   //\r
   Status = FormBrowser2->SendForm (\r
                            FormBrowser2,\r
-                           &CallbackInfo->RegisteredHandle,\r
+                           &mCallbackInfo->RegisteredHandle,\r
                            1,\r
                            NULL,\r
                            0,\r
                            NULL,\r
                            NULL\r
                            );\r
-  if (EFI_ERROR (Status)) {\r
-    goto Finish;\r
-  }\r
 \r
-  Status = HiiDatabase->RemovePackageList (HiiDatabase, CallbackInfo->RegisteredHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    goto Finish;\r
-  }\r
-  \r
-  return EFI_SUCCESS;\r
+  HiiRemovePackages (mCallbackInfo->RegisteredHandle);\r
+  Status = EFI_SUCCESS;\r
 \r
 Finish:\r
-  if (CallbackInfo->DriverHandle != NULL) {\r
-    HiiLibDestroyHiiDriverHandle (CallbackInfo->DriverHandle);\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
-  if (CallbackInfo != NULL) {\r
-    FreePool (CallbackInfo);\r
+\r
+  if (mCallbackInfo != NULL) {\r
+    FreePool (mCallbackInfo);\r
   }\r
 \r
   return Status;\r
@@ -1497,4 +1525,3 @@ DevicePathToStr (
 \r
   return L"?";\r
 }\r
-  
\ No newline at end of file