]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/HiiDatabaseDxe/Database.c
Roll back changes to apply GetBestLanguage() in HiiDataBase. Exact language match...
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / Database.c
index 3ee8b4ca349348a5ccd5f3bea1f316182b10a652..918559e54490b4c875dba51e27ff89bad0872646 100644 (file)
@@ -1,6 +1,8 @@
 /** @file\r
+Implementation for EFI_HII_DATABASE_PROTOCOL.\r
 \r
-Copyright (c) 2007, Intel Corporation\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
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -9,17 +11,6 @@ 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
-    Database.c\r
-\r
-Abstract:\r
-\r
-    Implementation for EFI_HII_DATABASE_PROTOCOL.\r
-\r
-Revision History\r
-\r
-\r
 **/\r
 \r
 \r
@@ -28,14 +19,15 @@ Revision History
 //\r
 // Global variables\r
 //\r
-STATIC EFI_GUID mHiiDatabaseNotifyGuid = HII_DATABASE_NOTIFY_GUID;\r
+EFI_GUID mHiiDatabaseNotifyGuid = HII_DATABASE_NOTIFY_GUID;\r
 \r
 \r
 /**\r
   This function generates a HII_DATABASE_RECORD node and adds into hii database.\r
+  This is a internal function.\r
 \r
   @param  Private                hii database private structure\r
-  @param  DatabaseRecord         HII_DATABASE_RECORD node which is used to store a\r
+  @param  DatabaseNode           HII_DATABASE_RECORD node which is used to store a\r
                                  package list\r
 \r
   @retval EFI_SUCCESS            A database record is generated successfully.\r
@@ -44,7 +36,6 @@ STATIC EFI_GUID mHiiDatabaseNotifyGuid = HII_DATABASE_NOTIFY_GUID;
   @retval EFI_INVALID_PARAMETER  Private is NULL or DatabaseRecord is NULL.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 GenerateHiiDatabaseRecord (\r
   IN  HII_DATABASE_PRIVATE_DATA *Private,\r
@@ -67,7 +58,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
@@ -87,8 +78,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
@@ -118,6 +109,7 @@ GenerateHiiDatabaseRecord (
 \r
 /**\r
   This function checks whether a handle is a valid EFI_HII_HANDLE\r
+  This is a internal function.\r
 \r
   @param  Handle                 Pointer to a EFI_HII_HANDLE\r
 \r
@@ -148,6 +140,7 @@ IsHiiHandleValid (
 \r
 /**\r
   This function invokes the matching registered function.\r
+  This is a internal function.\r
 \r
   @param  Private                HII Database driver private structure.\r
   @param  NotifyType             The type of change concerning the database.\r
@@ -162,7 +155,6 @@ IsHiiHandleValid (
   @retval EFI_INVALID_PARAMETER  Any input parameter is not valid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 InvokeRegisteredFunction (\r
   IN HII_DATABASE_PRIVATE_DATA    *Private,\r
@@ -203,7 +195,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
@@ -348,8 +340,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
@@ -357,6 +350,7 @@ InvokeRegisteredFunction (
 \r
 /**\r
   This function insert a GUID package to a package list node.\r
+  This is a internal function.\r
 \r
   @param  PackageHdr             Pointer to a buffer stored with GUID package\r
                                  information.\r
@@ -371,7 +365,6 @@ InvokeRegisteredFunction (
   @retval EFI_INVALID_PARAMETER  PackageHdr is NULL or PackageList is NULL.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 InsertGuidPackage (\r
   IN     VOID                               *PackageHdr,\r
@@ -398,7 +391,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
@@ -417,6 +410,7 @@ InsertGuidPackage (
 \r
 /**\r
   This function exports GUID packages to a buffer.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private structure.\r
   @param  Handle                 Identification of a package list.\r
@@ -431,7 +425,6 @@ InsertGuidPackage (
   @retval EFI_INVALID_PARAMETER  Any input parameter is invalid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 ExportGuidPackages (\r
   IN HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -485,6 +478,7 @@ ExportGuidPackages (
 \r
 /**\r
   This function deletes all GUID packages from a package list node.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private data.\r
   @param  Handle                 Handle of the package list which contains the to\r
@@ -496,7 +490,6 @@ ExportGuidPackages (
   @retval EFI_INVALID_PARAMETER  Any input parameter is not valid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 RemoveGuidPackages (\r
   IN     HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -532,8 +525,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
@@ -542,6 +535,7 @@ RemoveGuidPackages (
 \r
 /**\r
   This function insert a Form package to a package list node.\r
+  This is a internal function.\r
 \r
   @param  PackageHdr             Pointer to a buffer stored with Form package\r
                                  information.\r
@@ -556,7 +550,6 @@ RemoveGuidPackages (
   @retval EFI_INVALID_PARAMETER  PackageHdr is NULL or PackageList is NULL.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 InsertFormPackage (\r
   IN     VOID                               *PackageHdr,\r
@@ -587,7 +580,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
@@ -618,6 +611,7 @@ InsertFormPackage (
 \r
 /**\r
   This function exports Form packages to a buffer.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private structure.\r
   @param  Handle                 Identification of a package list.\r
@@ -632,7 +626,6 @@ InsertFormPackage (
   @retval EFI_INVALID_PARAMETER  Any input parameter is invalid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 ExportFormPackages (\r
   IN HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -666,7 +659,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
@@ -674,7 +667,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
@@ -701,6 +694,7 @@ ExportFormPackages (
 \r
 /**\r
   This function deletes all Form packages from a package list node.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private data.\r
   @param  Handle                 Handle of the package list which contains the to\r
@@ -712,7 +706,6 @@ ExportFormPackages (
   @retval EFI_INVALID_PARAMETER  Any input parameter is not valid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 RemoveFormPackages (\r
   IN     HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -737,7 +730,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
@@ -746,8 +739,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
@@ -758,6 +751,7 @@ RemoveFormPackages (
 \r
 /**\r
   This function insert a String package to a package list node.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private structure.\r
   @param  PackageHdr             Pointer to a buffer stored with String package\r
@@ -775,7 +769,6 @@ RemoveFormPackages (
                                  exists in current package list.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 InsertStringPackage (\r
   IN     HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -816,12 +809,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
@@ -884,9 +877,15 @@ 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
@@ -894,6 +893,7 @@ Error:
 \r
 /**\r
   This function exports String packages to a buffer.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private structure.\r
   @param  Handle                 Identification of a package list.\r
@@ -908,7 +908,6 @@ Error:
   @retval EFI_INVALID_PARAMETER  Any input parameter is invalid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 ExportStringPackages (\r
   IN HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -976,6 +975,7 @@ ExportStringPackages (
 \r
 /**\r
   This function deletes all String packages from a package list node.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private data.\r
   @param  Handle                 Handle of the package list which contains the to\r
@@ -987,7 +987,6 @@ ExportStringPackages (
   @retval EFI_INVALID_PARAMETER  Any input parameter is not valid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 RemoveStringPackages (\r
   IN     HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -1022,8 +1021,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
@@ -1035,10 +1034,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
@@ -1047,6 +1046,7 @@ RemoveStringPackages (
 \r
 /**\r
   This function insert a Font package to a package list node.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private structure.\r
   @param  PackageHdr             Pointer to a buffer stored with Font package\r
@@ -1064,7 +1064,6 @@ RemoveStringPackages (
                                  exists in current hii database.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 InsertFontPackage (\r
   IN     HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -1177,11 +1176,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
@@ -1190,6 +1199,7 @@ Error:
 \r
 /**\r
   This function exports Font packages to a buffer.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private structure.\r
   @param  Handle                 Identification of a package list.\r
@@ -1204,7 +1214,6 @@ Error:
   @retval EFI_INVALID_PARAMETER  Any input parameter is invalid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 ExportFontPackages (\r
   IN HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -1273,6 +1282,7 @@ ExportFontPackages (
 \r
 /**\r
   This function deletes all Font packages from a package list node.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private data.\r
   @param  Handle                 Handle of the package list which contains the to\r
@@ -1284,7 +1294,6 @@ ExportFontPackages (
   @retval EFI_INVALID_PARAMETER  Any input parameter is not valid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 RemoveFontPackages (\r
   IN     HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -1321,8 +1330,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
@@ -1334,7 +1346,7 @@ RemoveFontPackages (
                     HII_GLYPH_INFO_SIGNATURE\r
                     );\r
       RemoveEntryList (&GlyphInfo->Entry);\r
-      SafeFreePool (GlyphInfo);\r
+      FreePool (GlyphInfo);\r
     }\r
 \r
     //\r
@@ -1344,13 +1356,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
@@ -1359,6 +1371,7 @@ RemoveFontPackages (
 \r
 /**\r
   This function insert a Image package to a package list node.\r
+  This is a internal function.\r
 \r
   @param  PackageHdr             Pointer to a buffer stored with Image package\r
                                  information.\r
@@ -1373,7 +1386,6 @@ RemoveFontPackages (
   @retval EFI_INVALID_PARAMETER  PackageHdr is NULL or PackageList is NULL.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 InsertImagePackage (\r
   IN     VOID                               *PackageHdr,\r
@@ -1438,7 +1450,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
@@ -1458,8 +1470,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
@@ -1484,6 +1496,7 @@ InsertImagePackage (
 \r
 /**\r
   This function exports Image packages to a buffer.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private structure.\r
   @param  Handle                 Identification of a package list.\r
@@ -1498,7 +1511,6 @@ InsertImagePackage (
   @retval EFI_INVALID_PARAMETER  Any input parameter is invalid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 ExportImagePackages (\r
   IN HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -1575,6 +1587,7 @@ ExportImagePackages (
 \r
 /**\r
   This function deletes Image package from a package list node.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private data.\r
   @param  Handle                 Handle of the package list which contains the to\r
@@ -1586,7 +1599,6 @@ ExportImagePackages (
   @retval EFI_INVALID_PARAMETER  Any input parameter is not valid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 RemoveImagePackages (\r
   IN     HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -1619,9 +1631,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
@@ -1631,6 +1645,7 @@ RemoveImagePackages (
 \r
 /**\r
   This function insert a Simple Font package to a package list node.\r
+  This is a internal function.\r
 \r
   @param  PackageHdr             Pointer to a buffer stored with Simple Font\r
                                  package information.\r
@@ -1645,7 +1660,6 @@ RemoveImagePackages (
   @retval EFI_INVALID_PARAMETER  PackageHdr is NULL or PackageList is NULL.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 InsertSimpleFontPackage (\r
   IN     VOID                               *PackageHdr,\r
@@ -1699,14 +1713,19 @@ 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
 \r
 /**\r
   This function exports SimpleFont packages to a buffer.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private structure.\r
   @param  Handle                 Identification of a package list.\r
@@ -1721,7 +1740,6 @@ Error:
   @retval EFI_INVALID_PARAMETER  Any input parameter is invalid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 ExportSimpleFontPackages (\r
   IN HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -1780,6 +1798,7 @@ ExportSimpleFontPackages (
 \r
 /**\r
   This function deletes all Simple Font packages from a package list node.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private data.\r
   @param  Handle                 Handle of the package list which contains the to\r
@@ -1791,7 +1810,6 @@ ExportSimpleFontPackages (
   @retval EFI_INVALID_PARAMETER  Any input parameter is not valid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 RemoveSimpleFontPackages (\r
   IN     HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -1825,8 +1843,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
@@ -1835,6 +1853,7 @@ RemoveSimpleFontPackages (
 \r
 /**\r
   This function insert a Device path package to a package list node.\r
+  This is a internal function.\r
 \r
   @param  DevicePath             Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol\r
                                  instance\r
@@ -1848,7 +1867,6 @@ RemoveSimpleFontPackages (
   @retval EFI_INVALID_PARAMETER  DevicePath is NULL or PackageList is NULL.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 InsertDevicePathPackage (\r
   IN     EFI_DEVICE_PATH_PROTOCOL           *DevicePath,\r
@@ -1895,6 +1913,7 @@ InsertDevicePathPackage (
 \r
 /**\r
   This function exports device path package to a buffer.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private structure.\r
   @param  Handle                 Identification of a package list.\r
@@ -1909,7 +1928,6 @@ InsertDevicePathPackage (
   @retval EFI_INVALID_PARAMETER  Any input parameter is invalid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 ExportDevicePathPackage (\r
   IN HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -1966,6 +1984,7 @@ ExportDevicePathPackage (
 \r
 /**\r
   This function deletes Device Path package from a package list node.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private data.\r
   @param  Handle                 Handle of the package list.\r
@@ -1976,7 +1995,6 @@ ExportDevicePathPackage (
   @retval EFI_INVALID_PARAMETER  Any input parameter is not valid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 RemoveDevicePathPackage (\r
   IN     HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -2011,7 +2029,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
@@ -2022,6 +2040,7 @@ RemoveDevicePathPackage (
 /**\r
   This function will insert a device path package to package list firstly then\r
   invoke notification functions if any.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private structure.\r
   @param  NotifyType             The type of change concerning the database.\r
@@ -2036,7 +2055,6 @@ RemoveDevicePathPackage (
   @retval EFI_INVALID_PARAMETER  DevicePath is NULL or PackageList is NULL.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 AddDevicePathPackage (\r
   IN HII_DATABASE_PRIVATE_DATA        *Private,\r
@@ -2078,6 +2096,7 @@ AddDevicePathPackage (
 \r
 /**\r
   This function insert a Keyboard Layout package to a package list node.\r
+  This is a internal function.\r
 \r
   @param  PackageHdr             Pointer to a buffer stored with Keyboard Layout\r
                                  package information.\r
@@ -2092,7 +2111,6 @@ AddDevicePathPackage (
   @retval EFI_INVALID_PARAMETER  PackageHdr is NULL or PackageList is NULL.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 InsertKeyboardLayoutPackage (\r
   IN     VOID                               *PackageHdr,\r
@@ -2140,8 +2158,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
@@ -2149,6 +2172,7 @@ Error:
 \r
 /**\r
   This function exports Keyboard Layout packages to a buffer.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private structure.\r
   @param  Handle                 Identification of a package list.\r
@@ -2164,7 +2188,6 @@ Error:
   @retval EFI_INVALID_PARAMETER  Any input parameter is invalid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 ExportKeyboardLayoutPackages (\r
   IN HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -2225,6 +2248,7 @@ ExportKeyboardLayoutPackages (
 \r
 /**\r
   This function deletes all Keyboard Layout packages from a package list node.\r
+  This is a internal function.\r
 \r
   @param  Private                Hii database private data.\r
   @param  Handle                 Handle of the package list which contains the to\r
@@ -2237,7 +2261,6 @@ ExportKeyboardLayoutPackages (
   @retval EFI_INVALID_PARAMETER  Any input parameter is not valid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 RemoveKeyboardLayoutPackages (\r
   IN     HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -2273,8 +2296,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
@@ -2286,6 +2309,8 @@ RemoveKeyboardLayoutPackages (
   invoke notification functions if any. It is the worker function of\r
   HiiNewPackageList and HiiUpdatePackageList.\r
 \r
+  This is a internal function.\r
+\r
   @param  Private                Hii database private structure.\r
   @param  NotifyType             The type of change concerning the database.\r
   @param  PackageList            Pointer to a package list.\r
@@ -2299,7 +2324,6 @@ RemoveKeyboardLayoutPackages (
   @retval EFI_INVALID_PARAMETER  Any input parameter is invalid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 AddPackages (\r
   IN HII_DATABASE_PRIVATE_DATA         *Private,\r
@@ -2363,7 +2387,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
@@ -2503,6 +2527,8 @@ AddPackages (
   This function exports a package list to a buffer. It is the worker function\r
   of HiiExportPackageList.\r
 \r
+  This is a internal function.\r
+\r
   @param  Private                Hii database private structure.\r
   @param  Handle                 Identification of a package list.\r
   @param  PackageList            Pointer to a package list which will be exported.\r
@@ -2516,7 +2542,6 @@ AddPackages (
   @retval EFI_INVALID_PARAMETER  Any input parameter is invalid.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 ExportPackageList (\r
   IN HII_DATABASE_PRIVATE_DATA          *Private,\r
@@ -2531,7 +2556,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
@@ -2771,8 +2796,7 @@ HiiNewPackageList (
 \r
   @retval EFI_SUCCESS            The data associated with the Handle was removed\r
                                  from  the HII database.\r
-  @retval EFI_NOT_FOUND          The specified PackageList could not be found in\r
-                                 database.\r
+  @retval EFI_NOT_FOUND          The specified andle is not in database.\r
   @retval EFI_INVALID_PARAMETER  The Handle was not valid.\r
 \r
 **/\r
@@ -2790,10 +2814,14 @@ HiiRemovePackageList (
   HII_DATABASE_PACKAGE_LIST_INSTANCE  *PackageList;\r
   HII_HANDLE                          *HiiHandle;\r
 \r
-  if (This == NULL || !IsHiiHandleValid (Handle)) {\r
+  if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  if (!IsHiiHandleValid (Handle)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
   Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   //\r
@@ -2853,9 +2881,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
@@ -2879,9 +2907,8 @@ HiiRemovePackageList (
   @retval EFI_SUCCESS            The HII database was successfully updated.\r
   @retval EFI_OUT_OF_RESOURCES   Unable to allocate enough memory for the updated\r
                                  database.\r
-  @retval EFI_INVALID_PARAMETER  Handle or PackageList was NULL.\r
-  @retval EFI_NOT_FOUND          The Handle was not valid or could not be found in\r
-                                 database.\r
+  @retval EFI_INVALID_PARAMETER  PackageList was NULL.\r
+  @retval EFI_NOT_FOUND          The specified Handle is not in database.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -2900,7 +2927,7 @@ HiiUpdatePackageList (
   HII_DATABASE_PACKAGE_LIST_INSTANCE  *OldPackageList;\r
   EFI_HII_PACKAGE_HEADER              PackageHeader;\r
 \r
-  if (This == NULL || PackageList == NULL || Handle == NULL) {\r
+  if (This == NULL || PackageList == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
@@ -2931,7 +2958,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
@@ -2993,12 +3020,17 @@ HiiUpdatePackageList (
   @param  Handle                 An array of EFI_HII_HANDLE instances returned.\r
 \r
   @retval EFI_SUCCESS            The matching handles are outputed successfully.\r
+                                               HandleBufferLength is updated with the actual length.\r
   @retval EFI_BUFFER_TO_SMALL    The HandleBufferLength parameter indicates that\r
                                  Handle is too small to support the number of\r
                                  handles. HandleBufferLength is updated with a\r
                                  value that will  enable the data to fit.\r
   @retval EFI_NOT_FOUND          No matching handle could not be found in database.\r
   @retval EFI_INVALID_PARAMETER  Handle or HandleBufferLength was NULL.\r
+  \r
+  @retval EFI_INVALID_PARAMETER  PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but\r
+                                                     PackageGuid is not NULL, PackageType is a EFI_HII_\r
+                                                     PACKAGE_TYPE_GUID but PackageGuid is NULL.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -3056,7 +3088,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
@@ -3197,8 +3229,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
@@ -3329,7 +3360,7 @@ HiiRegisterPackageNotify (
 \r
   @param  This                   A pointer to the EFI_HII_DATABASE_PROTOCOL\r
                                  instance.\r
-  @param  NotifyHandle           The handle of the notification function being\r
+  @param  NotificationHandle     The handle of the notification function being\r
                                  unregistered.\r
 \r
   @retval EFI_SUCCESS            Notification is unregistered successfully.\r
@@ -3350,10 +3381,14 @@ HiiUnregisterPackageNotify (
   LIST_ENTRY                          *Link;\r
   EFI_STATUS                          Status;\r
 \r
-  if (This == NULL || NotificationHandle == NULL) {\r
+  if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  if (NotificationHandle == NULL) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
   Status = gBS->OpenProtocol (\r
                   NotificationHandle,\r
                   &mHiiDatabaseNotifyGuid,\r
@@ -3363,7 +3398,7 @@ HiiUnregisterPackageNotify (
                   EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    return EFI_INVALID_PARAMETER;\r
+    return EFI_NOT_FOUND;\r
   }\r
 \r
   Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
@@ -3382,8 +3417,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
@@ -3474,7 +3508,7 @@ HiiFindKeyboardLayouts (
       for (Index = 0; Index < LayoutCount; Index++) {\r
         ResultSize += sizeof (EFI_GUID);\r
         if (ResultSize <= *KeyGuidBufferLength) {\r
-          CopyMem (KeyGuidBuffer + Index, Layout + sizeof (UINT16), sizeof (EFI_GUID));\r
+          CopyMem (KeyGuidBuffer + (ResultSize / sizeof (EFI_GUID) - 1), Layout + sizeof (UINT16), sizeof (EFI_GUID));\r
           CopyMem (&LayoutLength, Layout, sizeof (UINT16));\r
           Layout = Layout + LayoutLength;\r
         }\r
@@ -3665,7 +3699,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