]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/HiiDatabaseDxe/Database.c
Add the definition of new format of IPv4 device path node, FibreEx device path node.
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / Database.c
index 2a6ec0dfecbb139572c37a3318b6dbe125efc901..f82842cac1c9dd175c142231e22719f4c5c6ae19 100644 (file)
@@ -1,9 +1,8 @@
 /** @file\r
 Implementation for EFI_HII_DATABASE_PROTOCOL.\r
 \r
-\r
-Copyright (c) 2007 - 2008, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 http://opensource.org/licenses/bsd-license.php\r
@@ -58,7 +57,7 @@ GenerateHiiDatabaseRecord (
 \r
   DatabaseRecord->PackageList = AllocateZeroPool (sizeof (HII_DATABASE_PACKAGE_LIST_INSTANCE));\r
   if (DatabaseRecord->PackageList == NULL) {\r
-    SafeFreePool (DatabaseRecord);\r
+    FreePool (DatabaseRecord);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
@@ -78,8 +77,8 @@ GenerateHiiDatabaseRecord (
   //\r
   HiiHandle = (HII_HANDLE *) AllocateZeroPool (sizeof (HII_HANDLE));\r
   if (HiiHandle == NULL) {\r
-    SafeFreePool (DatabaseRecord->PackageList);\r
-    SafeFreePool (DatabaseRecord);\r
+    FreePool (DatabaseRecord->PackageList);\r
+    FreePool (DatabaseRecord);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
   HiiHandle->Signature = HII_HANDLE_SIGNATURE;\r
@@ -87,7 +86,7 @@ GenerateHiiDatabaseRecord (
   // Backup the number of Hii handles\r
   //\r
   Private->HiiHandleCount++;\r
-  HiiHandle->Key = Private->HiiHandleCount;\r
+  HiiHandle->Key = (UINTN) Private->HiiHandleCount;\r
   //\r
   // Insert the handle to hii handle list of the whole database.\r
   //\r
@@ -195,7 +194,7 @@ InvokeRegisteredFunction (
     Package = (EFI_HII_PACKAGE_HEADER *) (((HII_GUID_PACKAGE_INSTANCE *) PackageInstance)->GuidPkg);\r
     break;\r
 \r
-  case EFI_HII_PACKAGE_FORM:\r
+  case EFI_HII_PACKAGE_FORMS:\r
     BufferSize = ((HII_IFR_PACKAGE_INSTANCE *) PackageInstance)->FormPkgHdr.Length;\r
     Buffer = (UINT8 *) AllocateZeroPool (BufferSize);\r
     ASSERT (Buffer != NULL);\r
@@ -340,8 +339,9 @@ InvokeRegisteredFunction (
     }\r
   }\r
 \r
-  SafeFreePool (Buffer);\r
-  Buffer = NULL;\r
+  if (Buffer != NULL) {\r
+    FreePool (Buffer);\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -390,7 +390,7 @@ InsertGuidPackage (
   }\r
   GuidPackage->GuidPkg = (UINT8 *) AllocateZeroPool (PackageHeader.Length);\r
   if (GuidPackage->GuidPkg == NULL) {\r
-    SafeFreePool (GuidPackage);\r
+    FreePool (GuidPackage);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
@@ -524,8 +524,8 @@ RemoveGuidPackages (
     RemoveEntryList (&Package->GuidEntry);\r
     CopyMem (&PackageHeader, Package->GuidPkg, sizeof (EFI_HII_PACKAGE_HEADER));\r
     PackageList->PackageListHdr.PackageLength -= PackageHeader.Length;\r
-    SafeFreePool (Package->GuidPkg);\r
-    SafeFreePool (Package);\r
+    FreePool (Package->GuidPkg);\r
+    FreePool (Package);\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -579,7 +579,7 @@ InsertFormPackage (
 \r
   FormPackage->IfrData = (UINT8 *) AllocateZeroPool (PackageHeader.Length - sizeof (EFI_HII_PACKAGE_HEADER));\r
   if (FormPackage->IfrData == NULL) {\r
-    SafeFreePool (FormPackage);\r
+    FreePool (FormPackage);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
@@ -658,7 +658,7 @@ ExportFormPackages (
   for (Link = PackageList->FormPkgHdr.ForwardLink; Link != &PackageList->FormPkgHdr; Link = Link->ForwardLink) {\r
     FormPackage = CR (Link, HII_IFR_PACKAGE_INSTANCE, IfrEntry, HII_IFR_PACKAGE_SIGNATURE);\r
     PackageLength += FormPackage->FormPkgHdr.Length;\r
-    if (PackageLength + *ResultSize + UsedSize <= BufferSize) {\r
+    if ((Buffer != NULL) && (PackageLength + *ResultSize + UsedSize <= BufferSize)) {\r
       //\r
       // Invoke registered notification if exists\r
       //\r
@@ -666,7 +666,7 @@ ExportFormPackages (
                  Private,\r
                  EFI_HII_DATABASE_NOTIFY_EXPORT_PACK,\r
                  (VOID *) FormPackage,\r
-                 EFI_HII_PACKAGE_FORM,\r
+                 EFI_HII_PACKAGE_FORMS,\r
                  Handle\r
                  );\r
       ASSERT_EFI_ERROR (Status);\r
@@ -729,7 +729,7 @@ RemoveFormPackages (
                Private,\r
                EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
                (VOID *) Package,\r
-               EFI_HII_PACKAGE_FORM,\r
+               EFI_HII_PACKAGE_FORMS,\r
                Handle\r
                );\r
     if (EFI_ERROR (Status)) {\r
@@ -738,8 +738,8 @@ RemoveFormPackages (
 \r
     RemoveEntryList (&Package->IfrEntry);\r
     PackageList->PackageListHdr.PackageLength -= Package->FormPkgHdr.Length;\r
-    SafeFreePool (Package->IfrData);\r
-    SafeFreePool (Package);\r
+    FreePool (Package->IfrData);\r
+    FreePool (Package);\r
 \r
   }\r
 \r
@@ -775,7 +775,6 @@ InsertStringPackage (
   IN     EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType,\r
   IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
   OUT    HII_STRING_PACKAGE_INSTANCE        **Package\r
-\r
   )\r
 {\r
   HII_STRING_PACKAGE_INSTANCE *StringPackage;\r
@@ -808,12 +807,12 @@ InsertStringPackage (
   AsciiStrCpy (Language, (CHAR8 *) PackageHdr + HeaderSize - LanguageSize);\r
   for (Link = PackageList->StringPkgHdr.ForwardLink; Link != &PackageList->StringPkgHdr; Link = Link->ForwardLink) {\r
     StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
-    if (R8_EfiLibCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) {\r
-      SafeFreePool (Language);\r
+    if (HiiCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) {\r
+      FreePool (Language);\r
       return EFI_UNSUPPORTED;\r
     }\r
   }\r
-  SafeFreePool (Language);\r
+  FreePool (Language);\r
 \r
   //\r
   // Create a String package node\r
@@ -857,7 +856,7 @@ InsertStringPackage (
   //\r
   // Collect all font block info\r
   //\r
-  Status = FindStringBlock (Private, StringPackage, (EFI_STRING_ID) (-1), NULL, NULL, NULL, NULL);\r
+  Status = FindStringBlock (Private, StringPackage, (EFI_STRING_ID) (-1), NULL, NULL, NULL, &StringPackage->MaxStringId, NULL);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -876,13 +875,96 @@ InsertStringPackage (
 \r
 Error:\r
 \r
-  SafeFreePool (StringPackage->StringBlock);\r
-  SafeFreePool (StringPackage->StringPkgHdr);\r
-  SafeFreePool (StringPackage);\r
+  if (StringPackage != NULL) {\r
+    if (StringPackage->StringBlock != NULL) {\r
+      FreePool (StringPackage->StringBlock);\r
+    }\r
+    if (StringPackage->StringPkgHdr != NULL) {\r
+      FreePool (StringPackage->StringPkgHdr);\r
+    }\r
+    FreePool (StringPackage);\r
+  }\r
   return Status;\r
 \r
 }\r
 \r
+/**\r
+ Adjust all string packages in a single package list to have the same max string ID.\r
\r
+ @param  PackageList        Pointer to a package list which will be adjusted.\r
+\r
+ @retval EFI_SUCCESS  Adjust all string packages successfully.\r
+ @retval others       Can't adjust string packges.\r
+\r
+**/\r
+EFI_STATUS\r
+AdjustStringPackage (\r
+  IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList\r
+)\r
+{\r
+  LIST_ENTRY                  *Link;\r
+  HII_STRING_PACKAGE_INSTANCE *StringPackage;\r
+  UINT32                      Skip2BlockSize;\r
+  UINT32                      OldBlockSize;\r
+  UINT8                       *StringBlock;\r
+  UINT8                       *BlockPtr;\r
+  EFI_STRING_ID               MaxStringId;\r
+  UINT16                      SkipCount;\r
+\r
+  MaxStringId = 0;\r
+  for (Link = PackageList->StringPkgHdr.ForwardLink;\r
+       Link != &PackageList->StringPkgHdr;\r
+       Link = Link->ForwardLink\r
+      ) {\r
+    StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
+    if (MaxStringId < StringPackage->MaxStringId) {\r
+      MaxStringId = StringPackage->MaxStringId;\r
+    }\r
+  }\r
+\r
+  for (Link = PackageList->StringPkgHdr.ForwardLink;\r
+       Link != &PackageList->StringPkgHdr;\r
+       Link = Link->ForwardLink\r
+      ) {\r
+    StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
+    if (StringPackage->MaxStringId < MaxStringId) {\r
+      OldBlockSize = StringPackage->StringPkgHdr->Header.Length - StringPackage->StringPkgHdr->HdrSize;\r
+      //\r
+      // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCKs to reserve the missing string IDs.\r
+      //\r
+      SkipCount      = (UINT16) (MaxStringId - StringPackage->MaxStringId);\r
+      Skip2BlockSize = (UINT32) sizeof (EFI_HII_SIBT_SKIP2_BLOCK);\r
+\r
+      StringBlock = (UINT8 *) AllocateZeroPool (OldBlockSize + Skip2BlockSize);\r
+      if (StringBlock == NULL) {\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+      //\r
+      // Copy original string blocks, except the EFI_HII_SIBT_END.\r
+      //\r
+      CopyMem (StringBlock, StringPackage->StringBlock, OldBlockSize - sizeof (EFI_HII_SIBT_END_BLOCK));\r
+      //\r
+      // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCK blocks\r
+      //\r
+      BlockPtr  = StringBlock + OldBlockSize - sizeof (EFI_HII_SIBT_END_BLOCK);\r
+      *BlockPtr = EFI_HII_SIBT_SKIP2;\r
+      CopyMem (BlockPtr + 1, &SkipCount, sizeof (UINT16));\r
+      BlockPtr  += sizeof (EFI_HII_SIBT_SKIP2_BLOCK);\r
+\r
+      //\r
+      // Append a EFI_HII_SIBT_END block to the end.\r
+      //\r
+      *BlockPtr = EFI_HII_SIBT_END;\r
+      FreePool (StringPackage->StringBlock);\r
+      StringPackage->StringBlock = StringBlock;\r
+      StringPackage->StringPkgHdr->Header.Length += Skip2BlockSize;\r
+      PackageList->PackageListHdr.PackageLength += Skip2BlockSize;\r
+      StringPackage->MaxStringId = MaxStringId;\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
 \r
 /**\r
   This function exports String packages to a buffer.\r
@@ -1014,8 +1096,8 @@ RemoveStringPackages (
 \r
     RemoveEntryList (&Package->StringEntry);\r
     PackageList->PackageListHdr.PackageLength -= Package->StringPkgHdr->Header.Length;\r
-    SafeFreePool (Package->StringBlock);\r
-    SafeFreePool (Package->StringPkgHdr);\r
+    FreePool (Package->StringBlock);\r
+    FreePool (Package->StringPkgHdr);\r
     //\r
     // Delete font information\r
     //\r
@@ -1027,10 +1109,10 @@ RemoveStringPackages (
                    HII_FONT_INFO_SIGNATURE\r
                    );\r
       RemoveEntryList (&FontInfo->Entry);\r
-      SafeFreePool (FontInfo);\r
+      FreePool (FontInfo);\r
     }\r
 \r
-    SafeFreePool (Package);\r
+    FreePool (Package);\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -1169,11 +1251,21 @@ InsertFontPackage (
 \r
 Error:\r
 \r
-  SafeFreePool (FontPkgHdr);\r
-  SafeFreePool (FontInfo);\r
-  SafeFreePool (FontPackage->GlyphBlock);\r
-  SafeFreePool (FontPackage);\r
-  SafeFreePool (GlobalFont);\r
+  if (FontPkgHdr != NULL) {\r
+    FreePool (FontPkgHdr);\r
+  }\r
+  if (FontInfo != NULL) {\r
+    FreePool (FontInfo);\r
+  }\r
+  if (FontPackage != NULL) {\r
+    if (FontPackage->GlyphBlock != NULL) {\r
+      FreePool (FontPackage->GlyphBlock);\r
+    }\r
+    FreePool (FontPackage);\r
+  }\r
+  if (GlobalFont != NULL) {\r
+    FreePool (GlobalFont);\r
+  }\r
 \r
   return Status;\r
 \r
@@ -1313,8 +1405,11 @@ RemoveFontPackages (
 \r
     RemoveEntryList (&Package->FontEntry);\r
     PackageList->PackageListHdr.PackageLength -= Package->FontPkgHdr->Header.Length;\r
-    SafeFreePool (Package->GlyphBlock);\r
-    SafeFreePool (Package->FontPkgHdr);\r
+\r
+    if (Package->GlyphBlock != NULL) {\r
+      FreePool (Package->GlyphBlock);\r
+    }\r
+    FreePool (Package->FontPkgHdr);\r
     //\r
     // Delete default character cell information\r
     //\r
@@ -1326,7 +1421,7 @@ RemoveFontPackages (
                     HII_GLYPH_INFO_SIGNATURE\r
                     );\r
       RemoveEntryList (&GlyphInfo->Entry);\r
-      SafeFreePool (GlyphInfo);\r
+      FreePool (GlyphInfo);\r
     }\r
 \r
     //\r
@@ -1336,13 +1431,13 @@ RemoveFontPackages (
       GlobalFont = CR (Link, HII_GLOBAL_FONT_INFO, Entry, HII_GLOBAL_FONT_INFO_SIGNATURE);\r
       if (GlobalFont->FontPackage == Package) {\r
         RemoveEntryList (&GlobalFont->Entry);\r
-        SafeFreePool (GlobalFont->FontInfo);\r
-        SafeFreePool (GlobalFont);\r
+        FreePool (GlobalFont->FontInfo);\r
+        FreePool (GlobalFont);\r
         break;\r
       }\r
     }\r
 \r
-    SafeFreePool (Package);\r
+    FreePool (Package);\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -1430,7 +1525,7 @@ InsertImagePackage (
 \r
     ImagePackage->PaletteBlock = (UINT8 *) AllocateZeroPool (PaletteSize);\r
     if (ImagePackage->PaletteBlock == NULL) {\r
-      SafeFreePool (ImagePackage);\r
+      FreePool (ImagePackage);\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
     CopyMem (\r
@@ -1450,8 +1545,8 @@ InsertImagePackage (
                 sizeof (EFI_HII_IMAGE_PACKAGE_HDR) - PaletteSize;\r
     ImagePackage->ImageBlock = (UINT8 *) AllocateZeroPool (ImageSize);\r
     if (ImagePackage->ImageBlock == NULL) {\r
-      SafeFreePool (ImagePackage->PaletteBlock);\r
-      SafeFreePool (ImagePackage);\r
+      FreePool (ImagePackage->PaletteBlock);\r
+      FreePool (ImagePackage);\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
     CopyMem (\r
@@ -1611,9 +1706,11 @@ RemoveImagePackages (
 \r
   PackageList->PackageListHdr.PackageLength -= Package->ImagePkgHdr.Header.Length;\r
 \r
-  SafeFreePool (Package->ImageBlock);\r
-  SafeFreePool (Package->PaletteBlock);\r
-  SafeFreePool (Package);\r
+  FreePool (Package->ImageBlock);\r
+  if (Package->PaletteBlock != NULL) {\r
+    FreePool (Package->PaletteBlock);\r
+  }\r
+  FreePool (Package);\r
 \r
   PackageList->ImagePkg = NULL;\r
 \r
@@ -1691,8 +1788,12 @@ InsertSimpleFontPackage (
 \r
 Error:\r
 \r
-  SafeFreePool (SimpleFontPackage->SimpleFontPkgHdr);\r
-  SafeFreePool (SimpleFontPackage);\r
+  if (SimpleFontPackage != NULL) {\r
+    if (SimpleFontPackage->SimpleFontPkgHdr != NULL) {\r
+      FreePool (SimpleFontPackage->SimpleFontPkgHdr);\r
+    }\r
+    FreePool (SimpleFontPackage);\r
+  }\r
   return Status;\r
 }\r
 \r
@@ -1817,8 +1918,8 @@ RemoveSimpleFontPackages (
 \r
     RemoveEntryList (&Package->SimpleFontEntry);\r
     PackageList->PackageListHdr.PackageLength -= Package->SimpleFontPkgHdr->Header.Length;\r
-    SafeFreePool (Package->SimpleFontPkgHdr);\r
-    SafeFreePool (Package);\r
+    FreePool (Package->SimpleFontPkgHdr);\r
+    FreePool (Package);\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -2003,7 +2104,7 @@ RemoveDevicePathPackage (
   CopyMem (&Header, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
   PackageList->PackageListHdr.PackageLength -= Header.Length;\r
 \r
-  SafeFreePool (Package);\r
+  FreePool (Package);\r
 \r
   PackageList->DevicePathPkg = NULL;\r
 \r
@@ -2132,8 +2233,13 @@ InsertKeyboardLayoutPackage (
 \r
 Error:\r
 \r
-  SafeFreePool (KeyboardLayoutPackage->KeyboardPkg);\r
-  SafeFreePool (KeyboardLayoutPackage);\r
+\r
+  if (KeyboardLayoutPackage != NULL) {\r
+    if (KeyboardLayoutPackage->KeyboardPkg != NULL) {\r
+      FreePool (KeyboardLayoutPackage->KeyboardPkg);\r
+    }\r
+    FreePool (KeyboardLayoutPackage);\r
+  }\r
 \r
   return Status;\r
 }\r
@@ -2265,8 +2371,8 @@ RemoveKeyboardLayoutPackages (
     RemoveEntryList (&Package->KeyboardEntry);\r
     CopyMem (&PackageHeader, Package->KeyboardPkg, sizeof (EFI_HII_PACKAGE_HEADER));\r
     PackageList->PackageListHdr.PackageLength -= PackageHeader.Length;\r
-    SafeFreePool (Package->KeyboardPkg);\r
-    SafeFreePool (Package);\r
+    FreePool (Package->KeyboardPkg);\r
+    FreePool (Package);\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -2312,10 +2418,12 @@ AddPackages (
   EFI_HII_PACKAGE_HEADER               *PackageHdrPtr;\r
   EFI_HII_PACKAGE_HEADER               PackageHeader;\r
   UINT32                               OldPackageListLen;\r
+  BOOLEAN                              StringPkgIsAdd;\r
 \r
   //\r
   // Initialize Variables\r
   //\r
+  StringPkgIsAdd = FALSE;\r
   FontPackage = NULL;\r
 \r
   //\r
@@ -2356,7 +2464,7 @@ AddPackages (
                  DatabaseRecord->Handle\r
                  );\r
       break;\r
-    case EFI_HII_PACKAGE_FORM:\r
+    case EFI_HII_PACKAGE_FORMS:\r
       Status = InsertFormPackage (\r
                  PackageHdrPtr,\r
                  NotifyType,\r
@@ -2410,6 +2518,7 @@ AddPackages (
                  (UINT8) (PackageHeader.Type),\r
                  DatabaseRecord->Handle\r
                  );\r
+      StringPkgIsAdd = TRUE;\r
       break;\r
     case EFI_HII_PACKAGE_FONTS:\r
       Status = InsertFontPackage (\r
@@ -2487,6 +2596,13 @@ AddPackages (
     PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHdrPtr + PackageHeader.Length);\r
     CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
   }\r
+  \r
+  //\r
+  // Adjust String Package to make sure all string packages have the same max string ID.\r
+  //\r
+  if (!EFI_ERROR (Status) && StringPkgIsAdd) {\r
+    Status = AdjustStringPackage (DatabaseRecord->PackageList);\r
+  }\r
 \r
   return Status;\r
 }\r
@@ -2525,7 +2641,7 @@ ExportPackageList (
   UINTN                               ResultSize;\r
   EFI_HII_PACKAGE_HEADER              EndofPackageList;\r
 \r
-  ASSERT (Private != NULL || PackageList != NULL || UsedSize != NULL);\r
+  ASSERT (Private != NULL && PackageList != NULL && UsedSize != NULL);\r
   ASSERT (Private->Signature == HII_DATABASE_PRIVATE_DATA_SIGNATURE);\r
   ASSERT (IsHiiHandleValid (Handle));\r
 \r
@@ -2669,6 +2785,8 @@ ExportPackageList (
   @param  PackageList            A pointer to an EFI_HII_PACKAGE_LIST_HEADER\r
                                  structure.\r
   @param  DriverHandle           Associate the package list with this EFI handle.\r
+                                 If a NULL is specified, this data will not be associate\r
+                                 with any drivers and cannot have a callback induced.\r
   @param  Handle                 A pointer to the EFI_HII_HANDLE instance.\r
 \r
   @retval EFI_SUCCESS            The package list associated with the Handle was\r
@@ -2684,7 +2802,7 @@ EFIAPI
 HiiNewPackageList (\r
   IN CONST EFI_HII_DATABASE_PROTOCOL    *This,\r
   IN CONST EFI_HII_PACKAGE_LIST_HEADER  *PackageList,\r
-  IN CONST EFI_HANDLE                   DriverHandle,\r
+  IN CONST EFI_HANDLE                   DriverHandle, OPTIONAL\r
   OUT EFI_HII_HANDLE                    *Handle\r
   )\r
 {\r
@@ -2709,9 +2827,8 @@ HiiNewPackageList (
     DatabaseRecord = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
     if (CompareGuid (\r
           &(DatabaseRecord->PackageList->PackageListHdr.PackageListGuid),\r
-          &PackageListGuid\r
-          )\r
-        ) {\r
+          &PackageListGuid) && \r
+        DatabaseRecord->DriverHandle == DriverHandle) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
   }\r
@@ -2850,9 +2967,9 @@ HiiRemovePackageList (
       ASSERT (Private->HiiHandleCount >= 0);\r
 \r
       HiiHandle->Signature = 0;\r
-      SafeFreePool (HiiHandle);\r
-      SafeFreePool (Node->PackageList);\r
-      SafeFreePool (Node);\r
+      FreePool (HiiHandle);\r
+      FreePool (Node->PackageList);\r
+      FreePool (Node);\r
 \r
       return EFI_SUCCESS;\r
     }\r
@@ -2927,7 +3044,7 @@ HiiUpdatePackageList (
         case EFI_HII_PACKAGE_TYPE_GUID:\r
           Status = RemoveGuidPackages (Private, Handle, OldPackageList);\r
           break;\r
-        case EFI_HII_PACKAGE_FORM:\r
+        case EFI_HII_PACKAGE_FORMS:\r
           Status = RemoveFormPackages (Private, Handle, OldPackageList);\r
           break;\r
         case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
@@ -3057,7 +3174,7 @@ HiiListPackageLists (
           }\r
         }\r
         break;\r
-      case EFI_HII_PACKAGE_FORM:\r
+      case EFI_HII_PACKAGE_FORMS:\r
         if (!IsListEmpty (&PackageList->FormPkgHdr)) {\r
           Matched = TRUE;\r
         }\r
@@ -3170,13 +3287,13 @@ HiiExportPackageLists (
   HII_DATABASE_RECORD                 *Node;\r
   UINTN                               UsedSize;\r
 \r
-  if (This == NULL || BufferSize == NULL || Handle == NULL) {\r
+  if (This == NULL || BufferSize == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
   if (*BufferSize > 0 && Buffer == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
-  if (!IsHiiHandleValid (Handle)) {\r
+  if ((Handle != NULL) && (!IsHiiHandleValid (Handle))) {\r
     return EFI_NOT_FOUND;\r
   }\r
 \r
@@ -3198,8 +3315,7 @@ HiiExportPackageLists (
                  (EFI_HII_PACKAGE_LIST_HEADER *)((UINT8 *) Buffer + UsedSize)\r
                  );\r
       ASSERT_EFI_ERROR (Status);\r
-    }\r
-    else if (Handle != NULL && Node->Handle == Handle) {\r
+    } else if (Handle != NULL && Node->Handle == Handle) {\r
       Status = ExportPackageList (\r
                  Private,\r
                  Handle,\r
@@ -3387,8 +3503,7 @@ HiiUnregisterPackageNotify (
                       NULL\r
                       );\r
       ASSERT_EFI_ERROR (Status);\r
-      SafeFreePool (Notify);\r
-      Notify = NULL;\r
+      FreePool (Notify);\r
 \r
       return EFI_SUCCESS;\r
     }\r
@@ -3670,7 +3785,9 @@ HiiSetKeyboardLayout (
   // Backup current keyboard layout.\r
   //\r
   CopyMem (&Private->CurrentLayoutGuid, KeyGuid, sizeof (EFI_GUID));\r
-  SafeFreePool(Private->CurrentLayout);\r
+  if (Private->CurrentLayout != NULL) {\r
+    FreePool(Private->CurrentLayout);\r
+  }\r
   Private->CurrentLayout = KeyboardLayout;\r
 \r
   //\r