]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/HiiLib/HiiLib.c
1) Cleanup HiiLib, IfrSupportLib.
[mirror_edk2.git] / MdePkg / Library / HiiLib / HiiLib.c
index ef86f5da24832fa54cd3be11a359cd255f0d232a..e2153f307d79f22762af2831f9d98abbbd8f105f 100644 (file)
 \r
 **/\r
 \r
-\r
-#include <PiDxe.h>\r
-\r
-#include <Protocol/HiiDatabase.h>\r
-#include <Protocol/HiiString.h>\r
-#include <Protocol/DevicePath.h>\r
-\r
-#include <Guid/GlobalVariable.h>\r
-\r
-#include <Library/BaseLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/HiiLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/UefiRuntimeServicesTableLib.h>\r
-#include <Library/PcdLib.h>\r
-\r
-#include <MdeModuleHii.h>\r
-\r
 #include "InternalHiiLib.h"\r
 \r
-\r
 EFI_HII_DATABASE_PROTOCOL   *mHiiDatabaseProt;\r
 EFI_HII_STRING_PROTOCOL     *mHiiStringProt;\r
 \r
-//\r
-// Hii vendor device path template\r
-//\r
-HII_VENDOR_DEVICE_PATH  mHiiVendorDevicePathTemplate = {\r
-  {\r
-    {\r
-      {\r
-        HARDWARE_DEVICE_PATH,\r
-        HW_VENDOR_DP,\r
-        {\r
-          (UINT8) (sizeof (HII_VENDOR_DEVICE_PATH_NODE)),\r
-          (UINT8) ((sizeof (HII_VENDOR_DEVICE_PATH_NODE)) >> 8)\r
-        }\r
-      },\r
-      EFI_IFR_TIANO_GUID\r
-    },\r
-    0\r
-  },\r
-  {\r
-    END_DEVICE_PATH_TYPE,\r
-    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
-    { \r
-      END_DEVICE_PATH_LENGTH\r
-    }\r
-  }\r
-};\r
+/**\r
+  The constructor function of Hii Library.\r
+  \r
+  The constructor function caches the value of default HII protocol instances.\r
 \r
+  @param  ImageHandle   The firmware allocated handle for the EFI image.\r
+  @param  SystemTable   A pointer to the EFI System Table.\r
+  \r
+  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 UefiHiiLibConstructor (\r
@@ -93,166 +56,6 @@ UefiHiiLibConstructor (
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
-HiiLibGetCurrentLanguage (\r
-  OUT     CHAR8               *Lang\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Determine what is the current language setting\r
-\r
-Arguments:\r
-  Lang      - Pointer of system language\r
-\r
-Returns:\r
-  Status code\r
-\r
---*/\r
-{\r
-  EFI_STATUS  Status;\r
-  UINTN       Size;\r
-\r
-  //\r
-  // Get current language setting\r
-  //\r
-  Size = RFC_3066_ENTRY_SIZE;\r
-  Status = gRT->GetVariable (\r
-                  L"PlatformLang",\r
-                  &gEfiGlobalVariableGuid,\r
-                  NULL,\r
-                  &Size,\r
-                  Lang\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    AsciiStrCpy (Lang, (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang));\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-VOID\r
-HiiLibGetNextLanguage (\r
-  IN OUT CHAR8      **LangCode,\r
-  OUT CHAR8         *Lang\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Get next language from language code list (with separator ';').\r
-\r
-Arguments:\r
-  LangCode - On input: point to first language in the list. On output: point to\r
-             next language in the list, or NULL if no more language in the list.\r
-  Lang     - The first language in the list.\r
-\r
-Returns:\r
-  None.\r
-\r
---*/\r
-{\r
-  UINTN  Index;\r
-  CHAR8  *StringPtr;\r
-\r
-  if (LangCode == NULL || *LangCode == NULL) {\r
-    *Lang = 0;\r
-    return;\r
-  }\r
-\r
-  Index = 0;\r
-  StringPtr = *LangCode;\r
-  while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {\r
-    Index++;\r
-  }\r
-\r
-  CopyMem (Lang, StringPtr, Index);\r
-  Lang[Index] = 0;\r
-\r
-  if (StringPtr[Index] == ';') {\r
-    Index++;\r
-  }\r
-  *LangCode = StringPtr + Index;\r
-}\r
-\r
-CHAR8 *\r
-HiiLibGetSupportedLanguages (\r
-  IN EFI_HII_HANDLE           HiiHandle\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  This function returns the list of supported languages, in the format specified\r
-  in UEFI specification Appendix M.\r
-\r
-Arguments:\r
-  HiiHandle  - The HII package list handle.\r
-\r
-Returns:\r
-  The supported languages.\r
-\r
---*/\r
-{\r
-  EFI_STATUS  Status;\r
-  UINTN       BufferSize;\r
-  CHAR8       *LanguageString;\r
-\r
-  //\r
-  // Collect current supported Languages for given HII handle\r
-  //\r
-  BufferSize = 0x1000;\r
-  LanguageString = AllocatePool (BufferSize);\r
-  Status = mHiiStringProt->GetLanguages (mHiiStringProt, HiiHandle, LanguageString, &BufferSize);\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    gBS->FreePool (LanguageString);\r
-    LanguageString = AllocatePool (BufferSize);\r
-    Status = mHiiStringProt->GetLanguages (mHiiStringProt, HiiHandle, LanguageString, &BufferSize);\r
-  }\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    LanguageString = NULL;\r
-  }\r
-\r
-  return LanguageString;\r
-}\r
-\r
-UINT16\r
-HiiLibGetSupportedLanguageNumber (\r
-  IN EFI_HII_HANDLE           HiiHandle\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  This function returns the number of supported languages\r
-\r
-Arguments:\r
-  HiiHandle  - The HII package list handle.\r
-\r
-Returns:\r
-  The  number of supported languages.\r
-\r
---*/\r
-{\r
-  CHAR8   *Languages;\r
-  CHAR8   *LanguageString;\r
-  UINT16  LangNumber;\r
-  CHAR8   Lang[RFC_3066_ENTRY_SIZE];\r
-\r
-  Languages = HiiLibGetSupportedLanguages (HiiHandle);\r
-  if (Languages == NULL) {\r
-    return 0;\r
-  }\r
-\r
-  LangNumber = 0;\r
-  LanguageString = Languages;\r
-  while (*LanguageString != 0) {\r
-    HiiLibGetNextLanguage (&LanguageString, Lang);\r
-    LangNumber++;\r
-  }\r
-  gBS->FreePool (Languages);\r
-\r
-  return LangNumber;\r
-}\r
 \r
 \r
 EFI_HII_PACKAGE_LIST_HEADER *\r
@@ -318,23 +121,12 @@ HiiLibPreparePackageList (
   IN CONST EFI_GUID           *GuidId,\r
   ...\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Assemble EFI_HII_PACKAGE_LIST according to the passed in packages.\r
-\r
-Arguments:\r
-  NumberOfPackages  -  Number of packages.\r
-  GuidId            -  Package GUID.\r
-\r
-Returns:\r
-  Pointer of EFI_HII_PACKAGE_LIST_HEADER.\r
-\r
---*/\r
 {\r
   EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
   VA_LIST                     Marker;\r
 \r
+  ASSERT (GuidId != NULL);\r
+\r
   VA_START (Marker, GuidId);\r
   PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Marker);\r
   VA_END (Marker);\r
@@ -343,28 +135,9 @@ Returns:
 }\r
 \r
 \r
-/**\r
-  This function allocates pool for an EFI_HII_PACKAGE_LIST structure\r
-  with additional space that is big enough to host all packages described by the variable \r
-  argument list of package pointers.  The allocated structure is initialized using NumberOfPackages, \r
-  GuidId,  and the variable length argument list of package pointers.\r
-\r
-  Then, EFI_HII_PACKAGE_LIST will be register to the default System HII Database. The\r
-  Handle to the newly registered Package List is returned throught HiiHandle.\r
-\r
-  @param  NumberOfPackages  The number of HII packages to register.\r
-  @param  GuidId                    Package List GUID ID.\r
-  @param  HiiHandle                The ID used to retrieve the Package List later.\r
-  @param  ...                          The variable argument list describing all HII Package.\r
-\r
-  @return\r
-  The allocated and initialized packages.\r
-\r
-**/\r
-\r
 EFI_STATUS\r
 EFIAPI\r
-HiiLibAddPackagesToHiiDatabase (\r
+HiiLibAddPackages (\r
   IN       UINTN               NumberOfPackages,\r
   IN CONST EFI_GUID            *GuidId,\r
   IN       EFI_HANDLE          DriverHandle, OPTIONAL\r
@@ -376,6 +149,7 @@ HiiLibAddPackagesToHiiDatabase (
   EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
   EFI_STATUS                Status;\r
 \r
+  ASSERT (HiiHandle != NULL);\r
 \r
   VA_START (Args, HiiHandle);\r
   PackageListHeader = InternalHiiLibPreparePackages (NumberOfPackages, GuidId, Args);\r
@@ -410,7 +184,7 @@ HiiLibAddFontPackageToHiiDatabase (
   UINT8                                *Package;\r
 \r
   //\r
-  // Add 4 bytes to the header for entire length for PreparePackageList use only.\r
+  // Add 4 bytes to the header for entire length for HiiLibPreparePackageList use only.\r
   // Looks ugly. Might be updated when font tool is ready.\r
   //\r
   PackageLength   = sizeof (EFI_HII_SIMPLE_FONT_PACKAGE_HDR) + FontSize + 4;\r
@@ -439,361 +213,238 @@ HiiLibAddFontPackageToHiiDatabase (
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS\r
+VOID\r
 EFIAPI\r
-HiiLibRemovePackagesFromHiiDatabase (\r
+HiiLibRemovePackages (\r
   IN      EFI_HII_HANDLE      HiiHandle\r
   )\r
 {\r
-  return mHiiDatabaseProt->RemovePackageList (mHiiDatabaseProt, HiiHandle);\r
+  EFI_STATUS Status;\r
+\r
+  ASSERT (HiiHandle != NULL);\r
+  Status = mHiiDatabaseProt->RemovePackageList (mHiiDatabaseProt, HiiHandle);\r
+  ASSERT_EFI_ERROR (Status);\r
 }\r
 \r
+\r
 EFI_STATUS\r
 EFIAPI\r
-HiiLibCreateString (\r
-  IN  EFI_HII_HANDLE                  PackageList,\r
-  OUT EFI_STRING_ID                   *StringId,\r
-  IN  CONST EFI_STRING                String\r
+HiiLibGetHiiHandles (\r
+  IN OUT UINTN                     *HandleBufferLength,\r
+  OUT    EFI_HII_HANDLE            **HiiHandleBuffer\r
   )\r
 {\r
+  UINTN       BufferLength;\r
   EFI_STATUS  Status;\r
-  CHAR8       *Languages;\r
-  CHAR8       *LangStrings;\r
-  CHAR8       Lang[RFC_3066_ENTRY_SIZE];\r
-\r
-  Status = EFI_SUCCESS;\r
 \r
-  Languages = HiiLibGetSupportedLanguages (PackageList);\r
+  ASSERT (HandleBufferLength != NULL);\r
+  ASSERT (HiiHandleBuffer != NULL);\r
 \r
-  LangStrings = Languages;\r
-  while (*LangStrings != 0) {\r
-    HiiLibGetNextLanguage (&LangStrings, Lang);\r
+  BufferLength = 0;\r
 \r
-    Status = mHiiStringProt->NewString (\r
-                                 mHiiStringProt,\r
-                                 PackageList,\r
-                                 StringId,\r
-                                 Lang,\r
+  //\r
+  // Try to find the actual buffer size for HiiHandle Buffer.\r
+  //\r
+  Status = mHiiDatabaseProt->ListPackageLists (\r
+                                 mHiiDatabaseProt,\r
+                                 EFI_HII_PACKAGE_TYPE_ALL,\r
                                  NULL,\r
-                                 String,\r
-                                 NULL\r
+                                 &BufferLength,\r
+                                 *HiiHandleBuffer\r
                                  );\r
-    if (EFI_ERROR (Status)) {\r
-      break;\r
-    }\r
-  }\r
-\r
-  FreePool (Languages);\r
-\r
-  return Status;\r
-  \r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibUpdateString (\r
-  IN  EFI_HII_HANDLE                  PackageList,\r
-  IN  EFI_STRING_ID                   StringId,\r
-  IN  CONST EFI_STRING                String\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  CHAR8       *Languages;\r
-  CHAR8       *LangStrings;\r
-  CHAR8       Lang[RFC_3066_ENTRY_SIZE];\r
 \r
-  Status = EFI_SUCCESS;\r
-\r
-  Languages = HiiLibGetSupportedLanguages (PackageList);\r
-\r
-  LangStrings = Languages;\r
-  while (*LangStrings != 0) {\r
-    HiiLibGetNextLanguage (&LangStrings, Lang);\r
-\r
-    Status = mHiiStringProt->SetString (\r
-                                 mHiiStringProt,\r
-                                 PackageList,\r
-                                 StringId,\r
-                                 Lang,\r
-                                 String,\r
-                                 NULL\r
-                                 );\r
-    if (EFI_ERROR (Status)) {\r
-      break;\r
-    }\r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+      *HiiHandleBuffer = AllocateZeroPool (BufferLength);\r
+      Status = mHiiDatabaseProt->ListPackageLists (\r
+                                     mHiiDatabaseProt,\r
+                                     EFI_HII_PACKAGE_TYPE_ALL,\r
+                                     NULL,\r
+                                     &BufferLength,\r
+                                     *HiiHandleBuffer\r
+                                     );\r
+      //\r
+      // we should not fail here.\r
+      //\r
+      ASSERT_EFI_ERROR (Status);\r
   }\r
 \r
-  FreePool (Languages);\r
+  *HandleBufferLength = BufferLength;\r
 \r
   return Status;\r
 }\r
 \r
-//                                                                                      //\r
-// //////////////////////////////////////////////////\r
-//                                                                                    //\r
-\r
-//\r
-// This function is Implementation Specifc. HII_VENDOR_DEVICE_PATH\r
-// This should be moved to MdeModulepkg.\r
-//\r
 EFI_STATUS\r
 EFIAPI\r
-HiiLibCreateHiiDriverHandle (\r
-  OUT EFI_HANDLE               *DriverHandle\r
+HiiLibExtractGuidFromHiiHandle (\r
+  IN      EFI_HII_HANDLE      Handle,\r
+  OUT     EFI_GUID            *Guid\r
   )\r
 {\r
   EFI_STATUS                   Status;\r
-  HII_VENDOR_DEVICE_PATH_NODE  *VendorDevicePath;\r
-  UINT64                       MonotonicCount;\r
+  UINTN                        BufferSize;\r
+  EFI_HII_PACKAGE_LIST_HEADER  *HiiPackageList;\r
 \r
-  VendorDevicePath = AllocateCopyPool (sizeof (HII_VENDOR_DEVICE_PATH), &mHiiVendorDevicePathTemplate);\r
-  if (VendorDevicePath == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
+  ASSERT (Guid != NULL);\r
 \r
-  gBS->GetNextMonotonicCount (&MonotonicCount);\r
-  VendorDevicePath->MonotonicCount = (UINT32) MonotonicCount;\r
+  //\r
+  // Get HII PackageList\r
+  //\r
+  BufferSize = 0;\r
+  HiiPackageList = NULL;\r
+  Status = mHiiDatabaseProt->ExportPackageLists (mHiiDatabaseProt, Handle, &BufferSize, HiiPackageList);\r
+  ASSERT (Status != EFI_NOT_FOUND);\r
+  \r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    HiiPackageList = AllocatePool (BufferSize);\r
+    ASSERT (HiiPackageList != NULL);\r
 \r
-  *DriverHandle = NULL;\r
-  Status = gBS->InstallProtocolInterface (\r
-                  DriverHandle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  VendorDevicePath\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    Status = mHiiDatabaseProt->ExportPackageLists (mHiiDatabaseProt, Handle, &BufferSize, HiiPackageList);\r
   }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-HiiLibDestroyHiiDriverHandle (\r
-  IN EFI_HANDLE               DriverHandle\r
-  )\r
-{\r
-  EFI_STATUS                   Status;\r
-  EFI_DEVICE_PATH_PROTOCOL     *DevicePath;\r
-\r
-  Status = gBS->HandleProtocol (\r
-                  DriverHandle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  (VOID **) &DevicePath\r
-                  );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
 \r
-  Status = gBS->UninstallProtocolInterface (\r
-                  DriverHandle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  DevicePath\r
-                  );\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-HiiLibExtractDefault(\r
-  IN VOID                         *Buffer,\r
-  IN UINTN                        *BufferSize,\r
-  UINTN                           Number,\r
-  ...\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-\r
-    Configure the buffer accrording to ConfigBody strings.\r
-\r
-  Arguments:\r
-    DefaultId             - the ID of default.\r
-    Buffer                - the start address of buffer.\r
-    BufferSize            - the size of buffer.\r
-    Number                - the number of the strings.\r
-\r
-  Returns:\r
-    EFI_BUFFER_TOO_SMALL  - the BufferSize is too small to operate.\r
-    EFI_INVALID_PARAMETER - Buffer is NULL or BufferSize is 0.\r
-    EFI_SUCCESS           - Operation successful.\r
-\r
---*/\r
-{\r
-  VA_LIST                         Args;\r
-  UINTN                           Index;\r
-  UINT32                          TotalLen;\r
-  UINT8                           *BufCfgArray;\r
-  UINT8                           *BufferPos;\r
-  UINT16                          Offset;\r
-  UINT16                          Width;\r
-  UINT8                           *Value;\r
-\r
-  if ((Buffer == NULL) || (BufferSize == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Offset = 0;\r
-  Width  = 0;\r
-  Value  = NULL;\r
-\r
-  VA_START (Args, Number);\r
-  for (Index = 0; Index < Number; Index++) {\r
-    BufCfgArray = (UINT8 *) VA_ARG (Args, VOID *);\r
-    CopyMem (&TotalLen, BufCfgArray, sizeof (UINT32));\r
-    BufferPos = BufCfgArray + sizeof (UINT32);\r
-\r
-    while ((UINT32)(BufferPos - BufCfgArray) < TotalLen) {\r
-      CopyMem (&Offset, BufferPos, sizeof (UINT16));\r
-      BufferPos += sizeof (UINT16);\r
-      CopyMem (&Width, BufferPos, sizeof (UINT16));\r
-      BufferPos += sizeof (UINT16);\r
-      Value = BufferPos;\r
-      BufferPos += Width;\r
-\r
-      if ((UINTN)(Offset + Width) > *BufferSize) {\r
-        return EFI_BUFFER_TOO_SMALL;\r
-      }\r
-\r
-      CopyMem ((UINT8 *)Buffer + Offset, Value, Width);\r
-    }\r
-  }\r
-  VA_END (Args);\r
+  //\r
+  // Extract GUID\r
+  //\r
+  CopyMem (Guid, &HiiPackageList->PackageListGuid, sizeof (EFI_GUID));\r
 \r
-  *BufferSize = (UINTN)Offset;\r
+  gBS->FreePool (HiiPackageList);\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
-STATIC EFI_GUID mIfrVendorGuid = EFI_IFR_TIANO_GUID;\r
-\r
-EFI_STATUS\r
-HiiLibExtractClassFromHiiHandle (\r
-  IN      EFI_HII_HANDLE      Handle,\r
-  OUT     UINT16              *Class,\r
-  OUT     EFI_STRING_ID       *FormSetTitle,\r
-  OUT     EFI_STRING_ID       *FormSetHelp\r
+EFI_HII_HANDLE\r
+EFIAPI\r
+HiiLibDevicePathToHiiHandle (\r
+  IN EFI_DEVICE_PATH_PROTOCOL   *DevicePath\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Extract formset class for given HII handle.\r
-\r
-Arguments:\r
-  HiiHandle       - Hii handle\r
-  Class           - Class of the formset\r
-  FormSetTitle    - Formset title string\r
-  FormSetHelp     - Formset help string\r
-\r
-Returns:\r
-  EFI_SUCCESS     - Successfully extract Class for specified Hii handle.\r
-\r
---*/\r
 {\r
-  EFI_STATUS                   Status;\r
-  UINTN                        BufferSize;\r
-  EFI_HII_DATABASE_PROTOCOL    *HiiDatabase;\r
-  EFI_HII_PACKAGE_LIST_HEADER  *HiiPackageList;\r
-  UINT8                        *Package;\r
-  UINT8                        *OpCodeData;\r
-  UINT32                       Offset;\r
-  UINT32                       Offset2;\r
-  UINT32                       PackageListLength;\r
-  EFI_HII_PACKAGE_HEADER       PackageHeader;\r
+  EFI_STATUS                  Status;\r
+  EFI_DEVICE_PATH_PROTOCOL    *TmpDevicePath;\r
+  UINTN                       BufferSize;\r
+  UINTN                       HandleCount;\r
+  UINTN                       Index;\r
+  EFI_HANDLE                  *Handles;\r
+  EFI_HANDLE                  Handle;\r
+  UINTN                       Size;\r
+  EFI_HANDLE                  DriverHandle;\r
+  EFI_HII_HANDLE              *HiiHandles;\r
+  EFI_HII_HANDLE              HiiHandle;\r
 \r
-  *Class = EFI_NON_DEVICE_CLASS;\r
-  *FormSetTitle = 0;\r
-  *FormSetHelp = 0;\r
+  ASSERT (DevicePath != NULL);\r
 \r
   //\r
-  // Locate HII Database protocol\r
+  // Locate Device Path Protocol handle buffer\r
   //\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiHiiDatabaseProtocolGuid,\r
+  Status = gBS->LocateHandleBuffer (\r
+                  ByProtocol,\r
+                  &gEfiDevicePathProtocolGuid,\r
                   NULL,\r
-                  (VOID **) &HiiDatabase\r
+                  &HandleCount,\r
+                  &Handles\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    return NULL;\r
   }\r
 \r
   //\r
-  // Get HII PackageList\r
+  // Search Driver Handle by Device Path\r
   //\r
-  BufferSize = 0;\r
-  HiiPackageList = NULL;\r
-  Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    HiiPackageList = AllocatePool (BufferSize);\r
-    ASSERT (HiiPackageList != NULL);\r
-\r
-    Status = HiiDatabase->ExportPackageLists (HiiDatabase, Handle, &BufferSize, HiiPackageList);\r
+  DriverHandle = NULL;\r
+  BufferSize = GetDevicePathSize (DevicePath);\r
+  for(Index = 0; Index < HandleCount; Index++) {\r
+    Handle = Handles[Index];\r
+    gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID **) &TmpDevicePath);\r
+\r
+    //\r
+    // Check whether DevicePath match\r
+    //\r
+    Size = GetDevicePathSize (TmpDevicePath);\r
+    if ((Size == BufferSize) && CompareMem (DevicePath, TmpDevicePath, Size) == 0) {\r
+      DriverHandle = Handle;\r
+      break;\r
+    }\r
   }\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  gBS->FreePool (Handles);\r
+\r
+  if (DriverHandle == NULL) {\r
+    return NULL;\r
   }\r
 \r
   //\r
-  // Get Form package from this HII package List\r
+  // Retrieve all Hii Handles from HII database\r
   //\r
-  Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
-  Offset2 = 0;\r
-  CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));\r
+  BufferSize = 0x1000;\r
+  HiiHandles = AllocatePool (BufferSize);\r
+  ASSERT (HiiHandles != NULL);\r
+  Status = mHiiDatabaseProt->ListPackageLists (\r
+                          mHiiDatabaseProt,\r
+                          EFI_HII_PACKAGE_TYPE_ALL,\r
+                          NULL,\r
+                          &BufferSize,\r
+                          HiiHandles\r
+                          );\r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    gBS->FreePool (HiiHandles);\r
+    HiiHandles = AllocatePool (BufferSize);\r
+    ASSERT (HiiHandles != NULL);\r
+\r
+    Status = mHiiDatabaseProt->ListPackageLists (\r
+                            mHiiDatabaseProt,\r
+                            EFI_HII_PACKAGE_TYPE_ALL,\r
+                            NULL,\r
+                            &BufferSize,\r
+                            HiiHandles\r
+                            );\r
+  }\r
 \r
-  while (Offset < PackageListLength) {\r
-    Package = ((UINT8 *) HiiPackageList) + Offset;\r
-    CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
+  if (EFI_ERROR (Status)) {\r
+    gBS->FreePool (HiiHandles);\r
+    return NULL;\r
+  }\r
 \r
-    if (PackageHeader.Type == EFI_HII_PACKAGE_FORM) {\r
-      //\r
-      // Search Class Opcode in this Form Package\r
-      //\r
-      Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
-      while (Offset2 < PackageHeader.Length) {\r
-        OpCodeData = Package + Offset2;\r
-\r
-        if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
-          //\r
-          // Find FormSet OpCode\r
-          //\r
-          CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
-          CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
-        }\r
-\r
-        if ((((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_GUID_OP) &&\r
-             CompareGuid (&mIfrVendorGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER))) &&\r
-            (((EFI_IFR_GUID_CLASS *) OpCodeData)->ExtendOpCode == EFI_IFR_EXTEND_OP_CLASS)\r
-           ) {\r
-          //\r
-          // Find GUIDed Class OpCode\r
-          //\r
-          CopyMem (Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
-\r
-          //\r
-          // Till now, we ought to have found the formset Opcode\r
-          //\r
-          break;\r
-        }\r
-\r
-        Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
-      }\r
-\r
-      if (Offset2 < PackageHeader.Length) {\r
-        //\r
-        // Target formset found\r
-        //\r
-        break;\r
-      }\r
+  //\r
+  // Search Hii Handle by Driver Handle\r
+  //\r
+  HiiHandle = NULL;\r
+  HandleCount = BufferSize / sizeof (EFI_HII_HANDLE);\r
+  for (Index = 0; Index < HandleCount; Index++) {\r
+    Status = mHiiDatabaseProt->GetPackageListHandle (\r
+                            mHiiDatabaseProt,\r
+                            HiiHandles[Index],\r
+                            &Handle\r
+                            );\r
+    if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {\r
+      HiiHandle = HiiHandles[Index];\r
+      break;\r
     }\r
-\r
-    Offset += PackageHeader.Length;\r
   }\r
 \r
-  gBS->FreePool (HiiPackageList);\r
+  gBS->FreePool (HiiHandles);\r
+  return HiiHandle;\r
+}\r
 \r
-  return EFI_SUCCESS;\r
+BOOLEAN\r
+IsHiiHandleRegistered (\r
+  EFI_HII_HANDLE    HiiHandle\r
+  )\r
+{\r
+  EFI_STATUS                   Status;\r
+  UINTN                        BufferSize;\r
+  EFI_HII_PACKAGE_LIST_HEADER  *HiiPackageList;\r
+\r
+  ASSERT (HiiHandle != NULL);\r
+\r
+  HiiPackageList = NULL;\r
+  BufferSize = 0;\r
+  Status = mHiiDatabaseProt->ExportPackageLists (\r
+             mHiiDatabaseProt,\r
+             HiiHandle,\r
+             &BufferSize,\r
+             HiiPackageList\r
+             );\r
+\r
+  return (BOOLEAN) (Status == EFI_BUFFER_TOO_SMALL);\r
 }\r
 \r