X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FHiiDatabaseDxe%2FDatabase.c;h=e5194f1f45d08070b858197a61893bfac23f05f9;hb=c06ad33ed2fbbacdba42baf07f5d3fd41b36781d;hp=3ee8b4ca349348a5ccd5f3bea1f316182b10a652;hpb=6c46a5abbabc89d50d4e01bcd027c7f9bcf2f7eb;p=mirror_edk2.git diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c index 3ee8b4ca34..e5194f1f45 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c @@ -1,6 +1,7 @@ /** @file +Implementation for EFI_HII_DATABASE_PROTOCOL. -Copyright (c) 2007, Intel Corporation +Copyright (c) 2007 - 2010, Intel Corporation All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -9,17 +10,6 @@ http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -Module Name: - - Database.c - -Abstract: - - Implementation for EFI_HII_DATABASE_PROTOCOL. - -Revision History - - **/ @@ -28,14 +18,15 @@ Revision History // // Global variables // -STATIC EFI_GUID mHiiDatabaseNotifyGuid = HII_DATABASE_NOTIFY_GUID; +EFI_GUID mHiiDatabaseNotifyGuid = HII_DATABASE_NOTIFY_GUID; /** This function generates a HII_DATABASE_RECORD node and adds into hii database. + This is a internal function. @param Private hii database private structure - @param DatabaseRecord HII_DATABASE_RECORD node which is used to store a + @param DatabaseNode HII_DATABASE_RECORD node which is used to store a package list @retval EFI_SUCCESS A database record is generated successfully. @@ -44,7 +35,6 @@ STATIC EFI_GUID mHiiDatabaseNotifyGuid = HII_DATABASE_NOTIFY_GUID; @retval EFI_INVALID_PARAMETER Private is NULL or DatabaseRecord is NULL. **/ -STATIC EFI_STATUS GenerateHiiDatabaseRecord ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -67,7 +57,7 @@ GenerateHiiDatabaseRecord ( DatabaseRecord->PackageList = AllocateZeroPool (sizeof (HII_DATABASE_PACKAGE_LIST_INSTANCE)); if (DatabaseRecord->PackageList == NULL) { - SafeFreePool (DatabaseRecord); + FreePool (DatabaseRecord); return EFI_OUT_OF_RESOURCES; } @@ -87,8 +77,8 @@ GenerateHiiDatabaseRecord ( // HiiHandle = (HII_HANDLE *) AllocateZeroPool (sizeof (HII_HANDLE)); if (HiiHandle == NULL) { - SafeFreePool (DatabaseRecord->PackageList); - SafeFreePool (DatabaseRecord); + FreePool (DatabaseRecord->PackageList); + FreePool (DatabaseRecord); return EFI_OUT_OF_RESOURCES; } HiiHandle->Signature = HII_HANDLE_SIGNATURE; @@ -118,6 +108,7 @@ GenerateHiiDatabaseRecord ( /** This function checks whether a handle is a valid EFI_HII_HANDLE + This is a internal function. @param Handle Pointer to a EFI_HII_HANDLE @@ -148,6 +139,7 @@ IsHiiHandleValid ( /** This function invokes the matching registered function. + This is a internal function. @param Private HII Database driver private structure. @param NotifyType The type of change concerning the database. @@ -162,7 +154,6 @@ IsHiiHandleValid ( @retval EFI_INVALID_PARAMETER Any input parameter is not valid. **/ -STATIC EFI_STATUS InvokeRegisteredFunction ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -203,7 +194,7 @@ InvokeRegisteredFunction ( Package = (EFI_HII_PACKAGE_HEADER *) (((HII_GUID_PACKAGE_INSTANCE *) PackageInstance)->GuidPkg); break; - case EFI_HII_PACKAGE_FORM: + case EFI_HII_PACKAGE_FORMS: BufferSize = ((HII_IFR_PACKAGE_INSTANCE *) PackageInstance)->FormPkgHdr.Length; Buffer = (UINT8 *) AllocateZeroPool (BufferSize); ASSERT (Buffer != NULL); @@ -348,8 +339,9 @@ InvokeRegisteredFunction ( } } - SafeFreePool (Buffer); - Buffer = NULL; + if (Buffer != NULL) { + FreePool (Buffer); + } return EFI_SUCCESS; } @@ -357,6 +349,7 @@ InvokeRegisteredFunction ( /** This function insert a GUID package to a package list node. + This is a internal function. @param PackageHdr Pointer to a buffer stored with GUID package information. @@ -371,7 +364,6 @@ InvokeRegisteredFunction ( @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL. **/ -STATIC EFI_STATUS InsertGuidPackage ( IN VOID *PackageHdr, @@ -398,7 +390,7 @@ InsertGuidPackage ( } GuidPackage->GuidPkg = (UINT8 *) AllocateZeroPool (PackageHeader.Length); if (GuidPackage->GuidPkg == NULL) { - SafeFreePool (GuidPackage); + FreePool (GuidPackage); return EFI_OUT_OF_RESOURCES; } @@ -417,6 +409,7 @@ InsertGuidPackage ( /** This function exports GUID packages to a buffer. + This is a internal function. @param Private Hii database private structure. @param Handle Identification of a package list. @@ -431,7 +424,6 @@ InsertGuidPackage ( @retval EFI_INVALID_PARAMETER Any input parameter is invalid. **/ -STATIC EFI_STATUS ExportGuidPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -485,6 +477,7 @@ ExportGuidPackages ( /** This function deletes all GUID packages from a package list node. + This is a internal function. @param Private Hii database private data. @param Handle Handle of the package list which contains the to @@ -496,7 +489,6 @@ ExportGuidPackages ( @retval EFI_INVALID_PARAMETER Any input parameter is not valid. **/ -STATIC EFI_STATUS RemoveGuidPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -532,8 +524,8 @@ RemoveGuidPackages ( RemoveEntryList (&Package->GuidEntry); CopyMem (&PackageHeader, Package->GuidPkg, sizeof (EFI_HII_PACKAGE_HEADER)); PackageList->PackageListHdr.PackageLength -= PackageHeader.Length; - SafeFreePool (Package->GuidPkg); - SafeFreePool (Package); + FreePool (Package->GuidPkg); + FreePool (Package); } return EFI_SUCCESS; @@ -542,6 +534,7 @@ RemoveGuidPackages ( /** This function insert a Form package to a package list node. + This is a internal function. @param PackageHdr Pointer to a buffer stored with Form package information. @@ -556,7 +549,6 @@ RemoveGuidPackages ( @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL. **/ -STATIC EFI_STATUS InsertFormPackage ( IN VOID *PackageHdr, @@ -587,7 +579,7 @@ InsertFormPackage ( FormPackage->IfrData = (UINT8 *) AllocateZeroPool (PackageHeader.Length - sizeof (EFI_HII_PACKAGE_HEADER)); if (FormPackage->IfrData == NULL) { - SafeFreePool (FormPackage); + FreePool (FormPackage); return EFI_OUT_OF_RESOURCES; } @@ -618,6 +610,7 @@ InsertFormPackage ( /** This function exports Form packages to a buffer. + This is a internal function. @param Private Hii database private structure. @param Handle Identification of a package list. @@ -632,7 +625,6 @@ InsertFormPackage ( @retval EFI_INVALID_PARAMETER Any input parameter is invalid. **/ -STATIC EFI_STATUS ExportFormPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -666,7 +658,7 @@ ExportFormPackages ( for (Link = PackageList->FormPkgHdr.ForwardLink; Link != &PackageList->FormPkgHdr; Link = Link->ForwardLink) { FormPackage = CR (Link, HII_IFR_PACKAGE_INSTANCE, IfrEntry, HII_IFR_PACKAGE_SIGNATURE); PackageLength += FormPackage->FormPkgHdr.Length; - if (PackageLength + *ResultSize + UsedSize <= BufferSize) { + if ((Buffer != NULL) && (PackageLength + *ResultSize + UsedSize <= BufferSize)) { // // Invoke registered notification if exists // @@ -674,7 +666,7 @@ ExportFormPackages ( Private, EFI_HII_DATABASE_NOTIFY_EXPORT_PACK, (VOID *) FormPackage, - EFI_HII_PACKAGE_FORM, + EFI_HII_PACKAGE_FORMS, Handle ); ASSERT_EFI_ERROR (Status); @@ -701,6 +693,7 @@ ExportFormPackages ( /** This function deletes all Form packages from a package list node. + This is a internal function. @param Private Hii database private data. @param Handle Handle of the package list which contains the to @@ -712,7 +705,6 @@ ExportFormPackages ( @retval EFI_INVALID_PARAMETER Any input parameter is not valid. **/ -STATIC EFI_STATUS RemoveFormPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -737,7 +729,7 @@ RemoveFormPackages ( Private, EFI_HII_DATABASE_NOTIFY_REMOVE_PACK, (VOID *) Package, - EFI_HII_PACKAGE_FORM, + EFI_HII_PACKAGE_FORMS, Handle ); if (EFI_ERROR (Status)) { @@ -746,8 +738,8 @@ RemoveFormPackages ( RemoveEntryList (&Package->IfrEntry); PackageList->PackageListHdr.PackageLength -= Package->FormPkgHdr.Length; - SafeFreePool (Package->IfrData); - SafeFreePool (Package); + FreePool (Package->IfrData); + FreePool (Package); } @@ -758,6 +750,7 @@ RemoveFormPackages ( /** This function insert a String package to a package list node. + This is a internal function. @param Private Hii database private structure. @param PackageHdr Pointer to a buffer stored with String package @@ -775,7 +768,6 @@ RemoveFormPackages ( exists in current package list. **/ -STATIC EFI_STATUS InsertStringPackage ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -783,7 +775,6 @@ InsertStringPackage ( IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType, IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList, OUT HII_STRING_PACKAGE_INSTANCE **Package - ) { HII_STRING_PACKAGE_INSTANCE *StringPackage; @@ -816,12 +807,12 @@ InsertStringPackage ( AsciiStrCpy (Language, (CHAR8 *) PackageHdr + HeaderSize - LanguageSize); for (Link = PackageList->StringPkgHdr.ForwardLink; Link != &PackageList->StringPkgHdr; Link = Link->ForwardLink) { StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); - if (R8_EfiLibCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) { - SafeFreePool (Language); + if (HiiCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) { + FreePool (Language); return EFI_UNSUPPORTED; } } - SafeFreePool (Language); + FreePool (Language); // // Create a String package node @@ -865,7 +856,7 @@ InsertStringPackage ( // // Collect all font block info // - Status = FindStringBlock (Private, StringPackage, (EFI_STRING_ID) (-1), NULL, NULL, NULL, NULL); + Status = FindStringBlock (Private, StringPackage, (EFI_STRING_ID) (-1), NULL, NULL, NULL, &StringPackage->MaxStringId); if (EFI_ERROR (Status)) { return Status; } @@ -884,16 +875,100 @@ InsertStringPackage ( Error: - SafeFreePool (StringPackage->StringBlock); - SafeFreePool (StringPackage->StringPkgHdr); - SafeFreePool (StringPackage); + if (StringPackage != NULL) { + if (StringPackage->StringBlock != NULL) { + FreePool (StringPackage->StringBlock); + } + if (StringPackage->StringPkgHdr != NULL) { + FreePool (StringPackage->StringPkgHdr); + } + FreePool (StringPackage); + } return Status; } +/** + Adjust all string packages in a single package list to have the same max string ID. + + @param PackageList Pointer to a package list which will be adjusted. + + @retval EFI_SUCCESS Adjust all string packages successfully. + @retval others Can't adjust string packges. + +**/ +EFI_STATUS +AdjustStringPackage ( + IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList +) +{ + LIST_ENTRY *Link; + HII_STRING_PACKAGE_INSTANCE *StringPackage; + UINT32 Skip2BlockSize; + UINT32 OldBlockSize; + UINT8 *StringBlock; + UINT8 *BlockPtr; + EFI_STRING_ID MaxStringId; + UINT16 SkipCount; + + MaxStringId = 0; + for (Link = PackageList->StringPkgHdr.ForwardLink; + Link != &PackageList->StringPkgHdr; + Link = Link->ForwardLink + ) { + StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); + if (MaxStringId < StringPackage->MaxStringId) { + MaxStringId = StringPackage->MaxStringId; + } + } + + for (Link = PackageList->StringPkgHdr.ForwardLink; + Link != &PackageList->StringPkgHdr; + Link = Link->ForwardLink + ) { + StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); + if (StringPackage->MaxStringId < MaxStringId) { + OldBlockSize = StringPackage->StringPkgHdr->Header.Length - StringPackage->StringPkgHdr->HdrSize; + // + // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCKs to reserve the missing string IDs. + // + SkipCount = (UINT16) (MaxStringId - StringPackage->MaxStringId); + Skip2BlockSize = (UINT32) sizeof (EFI_HII_SIBT_SKIP2_BLOCK); + + StringBlock = (UINT8 *) AllocateZeroPool (OldBlockSize + Skip2BlockSize); + if (StringBlock == NULL) { + return EFI_OUT_OF_RESOURCES; + } + // + // Copy original string blocks, except the EFI_HII_SIBT_END. + // + CopyMem (StringBlock, StringPackage->StringBlock, OldBlockSize - sizeof (EFI_HII_SIBT_END_BLOCK)); + // + // Create SKIP2 EFI_HII_SIBT_SKIP2_BLOCK blocks + // + BlockPtr = StringBlock + OldBlockSize - sizeof (EFI_HII_SIBT_END_BLOCK); + *BlockPtr = EFI_HII_SIBT_SKIP2; + CopyMem (BlockPtr + 1, &SkipCount, sizeof (UINT16)); + BlockPtr += sizeof (EFI_HII_SIBT_SKIP2_BLOCK); + + // + // Append a EFI_HII_SIBT_END block to the end. + // + *BlockPtr = EFI_HII_SIBT_END; + FreePool (StringPackage->StringBlock); + StringPackage->StringBlock = StringBlock; + StringPackage->StringPkgHdr->Header.Length += Skip2BlockSize; + PackageList->PackageListHdr.PackageLength += Skip2BlockSize; + StringPackage->MaxStringId = MaxStringId; + } + } + + return EFI_SUCCESS; +} /** This function exports String packages to a buffer. + This is a internal function. @param Private Hii database private structure. @param Handle Identification of a package list. @@ -908,7 +983,6 @@ Error: @retval EFI_INVALID_PARAMETER Any input parameter is invalid. **/ -STATIC EFI_STATUS ExportStringPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -976,6 +1050,7 @@ ExportStringPackages ( /** This function deletes all String packages from a package list node. + This is a internal function. @param Private Hii database private data. @param Handle Handle of the package list which contains the to @@ -987,7 +1062,6 @@ ExportStringPackages ( @retval EFI_INVALID_PARAMETER Any input parameter is not valid. **/ -STATIC EFI_STATUS RemoveStringPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -1022,8 +1096,8 @@ RemoveStringPackages ( RemoveEntryList (&Package->StringEntry); PackageList->PackageListHdr.PackageLength -= Package->StringPkgHdr->Header.Length; - SafeFreePool (Package->StringBlock); - SafeFreePool (Package->StringPkgHdr); + FreePool (Package->StringBlock); + FreePool (Package->StringPkgHdr); // // Delete font information // @@ -1035,10 +1109,10 @@ RemoveStringPackages ( HII_FONT_INFO_SIGNATURE ); RemoveEntryList (&FontInfo->Entry); - SafeFreePool (FontInfo); + FreePool (FontInfo); } - SafeFreePool (Package); + FreePool (Package); } return EFI_SUCCESS; @@ -1047,6 +1121,7 @@ RemoveStringPackages ( /** This function insert a Font package to a package list node. + This is a internal function. @param Private Hii database private structure. @param PackageHdr Pointer to a buffer stored with Font package @@ -1064,7 +1139,6 @@ RemoveStringPackages ( exists in current hii database. **/ -STATIC EFI_STATUS InsertFontPackage ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -1177,11 +1251,21 @@ InsertFontPackage ( Error: - SafeFreePool (FontPkgHdr); - SafeFreePool (FontInfo); - SafeFreePool (FontPackage->GlyphBlock); - SafeFreePool (FontPackage); - SafeFreePool (GlobalFont); + if (FontPkgHdr != NULL) { + FreePool (FontPkgHdr); + } + if (FontInfo != NULL) { + FreePool (FontInfo); + } + if (FontPackage != NULL) { + if (FontPackage->GlyphBlock != NULL) { + FreePool (FontPackage->GlyphBlock); + } + FreePool (FontPackage); + } + if (GlobalFont != NULL) { + FreePool (GlobalFont); + } return Status; @@ -1190,6 +1274,7 @@ Error: /** This function exports Font packages to a buffer. + This is a internal function. @param Private Hii database private structure. @param Handle Identification of a package list. @@ -1204,7 +1289,6 @@ Error: @retval EFI_INVALID_PARAMETER Any input parameter is invalid. **/ -STATIC EFI_STATUS ExportFontPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -1273,6 +1357,7 @@ ExportFontPackages ( /** This function deletes all Font packages from a package list node. + This is a internal function. @param Private Hii database private data. @param Handle Handle of the package list which contains the to @@ -1284,7 +1369,6 @@ ExportFontPackages ( @retval EFI_INVALID_PARAMETER Any input parameter is not valid. **/ -STATIC EFI_STATUS RemoveFontPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -1321,8 +1405,11 @@ RemoveFontPackages ( RemoveEntryList (&Package->FontEntry); PackageList->PackageListHdr.PackageLength -= Package->FontPkgHdr->Header.Length; - SafeFreePool (Package->GlyphBlock); - SafeFreePool (Package->FontPkgHdr); + + if (Package->GlyphBlock != NULL) { + FreePool (Package->GlyphBlock); + } + FreePool (Package->FontPkgHdr); // // Delete default character cell information // @@ -1334,7 +1421,7 @@ RemoveFontPackages ( HII_GLYPH_INFO_SIGNATURE ); RemoveEntryList (&GlyphInfo->Entry); - SafeFreePool (GlyphInfo); + FreePool (GlyphInfo); } // @@ -1344,13 +1431,13 @@ RemoveFontPackages ( GlobalFont = CR (Link, HII_GLOBAL_FONT_INFO, Entry, HII_GLOBAL_FONT_INFO_SIGNATURE); if (GlobalFont->FontPackage == Package) { RemoveEntryList (&GlobalFont->Entry); - SafeFreePool (GlobalFont->FontInfo); - SafeFreePool (GlobalFont); + FreePool (GlobalFont->FontInfo); + FreePool (GlobalFont); break; } } - SafeFreePool (Package); + FreePool (Package); } return EFI_SUCCESS; @@ -1359,6 +1446,7 @@ RemoveFontPackages ( /** This function insert a Image package to a package list node. + This is a internal function. @param PackageHdr Pointer to a buffer stored with Image package information. @@ -1373,7 +1461,6 @@ RemoveFontPackages ( @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL. **/ -STATIC EFI_STATUS InsertImagePackage ( IN VOID *PackageHdr, @@ -1438,7 +1525,7 @@ InsertImagePackage ( ImagePackage->PaletteBlock = (UINT8 *) AllocateZeroPool (PaletteSize); if (ImagePackage->PaletteBlock == NULL) { - SafeFreePool (ImagePackage); + FreePool (ImagePackage); return EFI_OUT_OF_RESOURCES; } CopyMem ( @@ -1458,8 +1545,8 @@ InsertImagePackage ( sizeof (EFI_HII_IMAGE_PACKAGE_HDR) - PaletteSize; ImagePackage->ImageBlock = (UINT8 *) AllocateZeroPool (ImageSize); if (ImagePackage->ImageBlock == NULL) { - SafeFreePool (ImagePackage->PaletteBlock); - SafeFreePool (ImagePackage); + FreePool (ImagePackage->PaletteBlock); + FreePool (ImagePackage); return EFI_OUT_OF_RESOURCES; } CopyMem ( @@ -1484,6 +1571,7 @@ InsertImagePackage ( /** This function exports Image packages to a buffer. + This is a internal function. @param Private Hii database private structure. @param Handle Identification of a package list. @@ -1498,7 +1586,6 @@ InsertImagePackage ( @retval EFI_INVALID_PARAMETER Any input parameter is invalid. **/ -STATIC EFI_STATUS ExportImagePackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -1575,6 +1662,7 @@ ExportImagePackages ( /** This function deletes Image package from a package list node. + This is a internal function. @param Private Hii database private data. @param Handle Handle of the package list which contains the to @@ -1586,7 +1674,6 @@ ExportImagePackages ( @retval EFI_INVALID_PARAMETER Any input parameter is not valid. **/ -STATIC EFI_STATUS RemoveImagePackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -1619,9 +1706,11 @@ RemoveImagePackages ( PackageList->PackageListHdr.PackageLength -= Package->ImagePkgHdr.Header.Length; - SafeFreePool (Package->ImageBlock); - SafeFreePool (Package->PaletteBlock); - SafeFreePool (Package); + FreePool (Package->ImageBlock); + if (Package->PaletteBlock != NULL) { + FreePool (Package->PaletteBlock); + } + FreePool (Package); PackageList->ImagePkg = NULL; @@ -1631,6 +1720,7 @@ RemoveImagePackages ( /** This function insert a Simple Font package to a package list node. + This is a internal function. @param PackageHdr Pointer to a buffer stored with Simple Font package information. @@ -1645,7 +1735,6 @@ RemoveImagePackages ( @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL. **/ -STATIC EFI_STATUS InsertSimpleFontPackage ( IN VOID *PackageHdr, @@ -1699,14 +1788,19 @@ InsertSimpleFontPackage ( Error: - SafeFreePool (SimpleFontPackage->SimpleFontPkgHdr); - SafeFreePool (SimpleFontPackage); + if (SimpleFontPackage != NULL) { + if (SimpleFontPackage->SimpleFontPkgHdr != NULL) { + FreePool (SimpleFontPackage->SimpleFontPkgHdr); + } + FreePool (SimpleFontPackage); + } return Status; } /** This function exports SimpleFont packages to a buffer. + This is a internal function. @param Private Hii database private structure. @param Handle Identification of a package list. @@ -1721,7 +1815,6 @@ Error: @retval EFI_INVALID_PARAMETER Any input parameter is invalid. **/ -STATIC EFI_STATUS ExportSimpleFontPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -1780,6 +1873,7 @@ ExportSimpleFontPackages ( /** This function deletes all Simple Font packages from a package list node. + This is a internal function. @param Private Hii database private data. @param Handle Handle of the package list which contains the to @@ -1791,7 +1885,6 @@ ExportSimpleFontPackages ( @retval EFI_INVALID_PARAMETER Any input parameter is not valid. **/ -STATIC EFI_STATUS RemoveSimpleFontPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -1825,8 +1918,8 @@ RemoveSimpleFontPackages ( RemoveEntryList (&Package->SimpleFontEntry); PackageList->PackageListHdr.PackageLength -= Package->SimpleFontPkgHdr->Header.Length; - SafeFreePool (Package->SimpleFontPkgHdr); - SafeFreePool (Package); + FreePool (Package->SimpleFontPkgHdr); + FreePool (Package); } return EFI_SUCCESS; @@ -1835,6 +1928,7 @@ RemoveSimpleFontPackages ( /** This function insert a Device path package to a package list node. + This is a internal function. @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol instance @@ -1848,7 +1942,6 @@ RemoveSimpleFontPackages ( @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL. **/ -STATIC EFI_STATUS InsertDevicePathPackage ( IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, @@ -1895,6 +1988,7 @@ InsertDevicePathPackage ( /** This function exports device path package to a buffer. + This is a internal function. @param Private Hii database private structure. @param Handle Identification of a package list. @@ -1909,7 +2003,6 @@ InsertDevicePathPackage ( @retval EFI_INVALID_PARAMETER Any input parameter is invalid. **/ -STATIC EFI_STATUS ExportDevicePathPackage ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -1966,6 +2059,7 @@ ExportDevicePathPackage ( /** This function deletes Device Path package from a package list node. + This is a internal function. @param Private Hii database private data. @param Handle Handle of the package list. @@ -1976,7 +2070,6 @@ ExportDevicePathPackage ( @retval EFI_INVALID_PARAMETER Any input parameter is not valid. **/ -STATIC EFI_STATUS RemoveDevicePathPackage ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -2011,7 +2104,7 @@ RemoveDevicePathPackage ( CopyMem (&Header, Package, sizeof (EFI_HII_PACKAGE_HEADER)); PackageList->PackageListHdr.PackageLength -= Header.Length; - SafeFreePool (Package); + FreePool (Package); PackageList->DevicePathPkg = NULL; @@ -2022,6 +2115,7 @@ RemoveDevicePathPackage ( /** This function will insert a device path package to package list firstly then invoke notification functions if any. + This is a internal function. @param Private Hii database private structure. @param NotifyType The type of change concerning the database. @@ -2036,7 +2130,6 @@ RemoveDevicePathPackage ( @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL. **/ -STATIC EFI_STATUS AddDevicePathPackage ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -2078,6 +2171,7 @@ AddDevicePathPackage ( /** This function insert a Keyboard Layout package to a package list node. + This is a internal function. @param PackageHdr Pointer to a buffer stored with Keyboard Layout package information. @@ -2092,7 +2186,6 @@ AddDevicePathPackage ( @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL. **/ -STATIC EFI_STATUS InsertKeyboardLayoutPackage ( IN VOID *PackageHdr, @@ -2140,8 +2233,13 @@ InsertKeyboardLayoutPackage ( Error: - SafeFreePool (KeyboardLayoutPackage->KeyboardPkg); - SafeFreePool (KeyboardLayoutPackage); + + if (KeyboardLayoutPackage != NULL) { + if (KeyboardLayoutPackage->KeyboardPkg != NULL) { + FreePool (KeyboardLayoutPackage->KeyboardPkg); + } + FreePool (KeyboardLayoutPackage); + } return Status; } @@ -2149,6 +2247,7 @@ Error: /** This function exports Keyboard Layout packages to a buffer. + This is a internal function. @param Private Hii database private structure. @param Handle Identification of a package list. @@ -2164,7 +2263,6 @@ Error: @retval EFI_INVALID_PARAMETER Any input parameter is invalid. **/ -STATIC EFI_STATUS ExportKeyboardLayoutPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -2225,6 +2323,7 @@ ExportKeyboardLayoutPackages ( /** This function deletes all Keyboard Layout packages from a package list node. + This is a internal function. @param Private Hii database private data. @param Handle Handle of the package list which contains the to @@ -2237,7 +2336,6 @@ ExportKeyboardLayoutPackages ( @retval EFI_INVALID_PARAMETER Any input parameter is not valid. **/ -STATIC EFI_STATUS RemoveKeyboardLayoutPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -2273,8 +2371,8 @@ RemoveKeyboardLayoutPackages ( RemoveEntryList (&Package->KeyboardEntry); CopyMem (&PackageHeader, Package->KeyboardPkg, sizeof (EFI_HII_PACKAGE_HEADER)); PackageList->PackageListHdr.PackageLength -= PackageHeader.Length; - SafeFreePool (Package->KeyboardPkg); - SafeFreePool (Package); + FreePool (Package->KeyboardPkg); + FreePool (Package); } return EFI_SUCCESS; @@ -2286,6 +2384,8 @@ RemoveKeyboardLayoutPackages ( invoke notification functions if any. It is the worker function of HiiNewPackageList and HiiUpdatePackageList. + This is a internal function. + @param Private Hii database private structure. @param NotifyType The type of change concerning the database. @param PackageList Pointer to a package list. @@ -2299,7 +2399,6 @@ RemoveKeyboardLayoutPackages ( @retval EFI_INVALID_PARAMETER Any input parameter is invalid. **/ -STATIC EFI_STATUS AddPackages ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -2319,10 +2418,12 @@ AddPackages ( EFI_HII_PACKAGE_HEADER *PackageHdrPtr; EFI_HII_PACKAGE_HEADER PackageHeader; UINT32 OldPackageListLen; + BOOLEAN StringPkgIsAdd; // // Initialize Variables // + StringPkgIsAdd = FALSE; FontPackage = NULL; // @@ -2363,7 +2464,7 @@ AddPackages ( DatabaseRecord->Handle ); break; - case EFI_HII_PACKAGE_FORM: + case EFI_HII_PACKAGE_FORMS: Status = InsertFormPackage ( PackageHdrPtr, NotifyType, @@ -2417,6 +2518,7 @@ AddPackages ( (UINT8) (PackageHeader.Type), DatabaseRecord->Handle ); + StringPkgIsAdd = TRUE; break; case EFI_HII_PACKAGE_FONTS: Status = InsertFontPackage ( @@ -2494,6 +2596,13 @@ AddPackages ( PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHdrPtr + PackageHeader.Length); CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER)); } + + // + // Adjust String Package to make sure all string packages have the same max string ID. + // + if (!EFI_ERROR (Status) && StringPkgIsAdd) { + Status = AdjustStringPackage (DatabaseRecord->PackageList); + } return Status; } @@ -2503,6 +2612,8 @@ AddPackages ( This function exports a package list to a buffer. It is the worker function of HiiExportPackageList. + This is a internal function. + @param Private Hii database private structure. @param Handle Identification of a package list. @param PackageList Pointer to a package list which will be exported. @@ -2516,7 +2627,6 @@ AddPackages ( @retval EFI_INVALID_PARAMETER Any input parameter is invalid. **/ -STATIC EFI_STATUS ExportPackageList ( IN HII_DATABASE_PRIVATE_DATA *Private, @@ -2531,7 +2641,7 @@ ExportPackageList ( UINTN ResultSize; EFI_HII_PACKAGE_HEADER EndofPackageList; - ASSERT (Private != NULL || PackageList != NULL || UsedSize != NULL); + ASSERT (Private != NULL && PackageList != NULL && UsedSize != NULL); ASSERT (Private->Signature == HII_DATABASE_PRIVATE_DATA_SIGNATURE); ASSERT (IsHiiHandleValid (Handle)); @@ -2675,6 +2785,8 @@ ExportPackageList ( @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER structure. @param DriverHandle Associate the package list with this EFI handle. + If a NULL is specified, this data will not be associate + with any drivers and cannot have a callback induced. @param Handle A pointer to the EFI_HII_HANDLE instance. @retval EFI_SUCCESS The package list associated with the Handle was @@ -2690,7 +2802,7 @@ EFIAPI HiiNewPackageList ( IN CONST EFI_HII_DATABASE_PROTOCOL *This, IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageList, - IN CONST EFI_HANDLE DriverHandle, + IN CONST EFI_HANDLE DriverHandle, OPTIONAL OUT EFI_HII_HANDLE *Handle ) { @@ -2715,9 +2827,8 @@ HiiNewPackageList ( DatabaseRecord = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE); if (CompareGuid ( &(DatabaseRecord->PackageList->PackageListHdr.PackageListGuid), - &PackageListGuid - ) - ) { + &PackageListGuid) && + DatabaseRecord->DriverHandle == DriverHandle) { return EFI_INVALID_PARAMETER; } } @@ -2771,8 +2882,7 @@ HiiNewPackageList ( @retval EFI_SUCCESS The data associated with the Handle was removed from the HII database. - @retval EFI_NOT_FOUND The specified PackageList could not be found in - database. + @retval EFI_NOT_FOUND The specified andle is not in database. @retval EFI_INVALID_PARAMETER The Handle was not valid. **/ @@ -2790,10 +2900,14 @@ HiiRemovePackageList ( HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList; HII_HANDLE *HiiHandle; - if (This == NULL || !IsHiiHandleValid (Handle)) { + if (This == NULL) { return EFI_INVALID_PARAMETER; } + if (!IsHiiHandleValid (Handle)) { + return EFI_NOT_FOUND; + } + Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This); // @@ -2853,9 +2967,9 @@ HiiRemovePackageList ( ASSERT (Private->HiiHandleCount >= 0); HiiHandle->Signature = 0; - SafeFreePool (HiiHandle); - SafeFreePool (Node->PackageList); - SafeFreePool (Node); + FreePool (HiiHandle); + FreePool (Node->PackageList); + FreePool (Node); return EFI_SUCCESS; } @@ -2879,9 +2993,8 @@ HiiRemovePackageList ( @retval EFI_SUCCESS The HII database was successfully updated. @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated database. - @retval EFI_INVALID_PARAMETER Handle or PackageList was NULL. - @retval EFI_NOT_FOUND The Handle was not valid or could not be found in - database. + @retval EFI_INVALID_PARAMETER PackageList was NULL. + @retval EFI_NOT_FOUND The specified Handle is not in database. **/ EFI_STATUS @@ -2900,7 +3013,7 @@ HiiUpdatePackageList ( HII_DATABASE_PACKAGE_LIST_INSTANCE *OldPackageList; EFI_HII_PACKAGE_HEADER PackageHeader; - if (This == NULL || PackageList == NULL || Handle == NULL) { + if (This == NULL || PackageList == NULL) { return EFI_INVALID_PARAMETER; } @@ -2931,7 +3044,7 @@ HiiUpdatePackageList ( case EFI_HII_PACKAGE_TYPE_GUID: Status = RemoveGuidPackages (Private, Handle, OldPackageList); break; - case EFI_HII_PACKAGE_FORM: + case EFI_HII_PACKAGE_FORMS: Status = RemoveFormPackages (Private, Handle, OldPackageList); break; case EFI_HII_PACKAGE_KEYBOARD_LAYOUT: @@ -2993,12 +3106,17 @@ HiiUpdatePackageList ( @param Handle An array of EFI_HII_HANDLE instances returned. @retval EFI_SUCCESS The matching handles are outputed successfully. + HandleBufferLength is updated with the actual length. @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that Handle is too small to support the number of handles. HandleBufferLength is updated with a value that will enable the data to fit. @retval EFI_NOT_FOUND No matching handle could not be found in database. @retval EFI_INVALID_PARAMETER Handle or HandleBufferLength was NULL. + + @retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but + PackageGuid is not NULL, PackageType is a EFI_HII_ + PACKAGE_TYPE_GUID but PackageGuid is NULL. **/ EFI_STATUS @@ -3056,7 +3174,7 @@ HiiListPackageLists ( } } break; - case EFI_HII_PACKAGE_FORM: + case EFI_HII_PACKAGE_FORMS: if (!IsListEmpty (&PackageList->FormPkgHdr)) { Matched = TRUE; } @@ -3197,8 +3315,7 @@ HiiExportPackageLists ( (EFI_HII_PACKAGE_LIST_HEADER *)((UINT8 *) Buffer + UsedSize) ); ASSERT_EFI_ERROR (Status); - } - else if (Handle != NULL && Node->Handle == Handle) { + } else if (Handle != NULL && Node->Handle == Handle) { Status = ExportPackageList ( Private, Handle, @@ -3329,7 +3446,7 @@ HiiRegisterPackageNotify ( @param This A pointer to the EFI_HII_DATABASE_PROTOCOL instance. - @param NotifyHandle The handle of the notification function being + @param NotificationHandle The handle of the notification function being unregistered. @retval EFI_SUCCESS Notification is unregistered successfully. @@ -3350,10 +3467,14 @@ HiiUnregisterPackageNotify ( LIST_ENTRY *Link; EFI_STATUS Status; - if (This == NULL || NotificationHandle == NULL) { + if (This == NULL) { return EFI_INVALID_PARAMETER; } + if (NotificationHandle == NULL) { + return EFI_NOT_FOUND; + } + Status = gBS->OpenProtocol ( NotificationHandle, &mHiiDatabaseNotifyGuid, @@ -3363,7 +3484,7 @@ HiiUnregisterPackageNotify ( EFI_OPEN_PROTOCOL_TEST_PROTOCOL ); if (EFI_ERROR (Status)) { - return EFI_INVALID_PARAMETER; + return EFI_NOT_FOUND; } Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This); @@ -3382,8 +3503,7 @@ HiiUnregisterPackageNotify ( NULL ); ASSERT_EFI_ERROR (Status); - SafeFreePool (Notify); - Notify = NULL; + FreePool (Notify); return EFI_SUCCESS; } @@ -3474,7 +3594,7 @@ HiiFindKeyboardLayouts ( for (Index = 0; Index < LayoutCount; Index++) { ResultSize += sizeof (EFI_GUID); if (ResultSize <= *KeyGuidBufferLength) { - CopyMem (KeyGuidBuffer + Index, Layout + sizeof (UINT16), sizeof (EFI_GUID)); + CopyMem (KeyGuidBuffer + (ResultSize / sizeof (EFI_GUID) - 1), Layout + sizeof (UINT16), sizeof (EFI_GUID)); CopyMem (&LayoutLength, Layout, sizeof (UINT16)); Layout = Layout + LayoutLength; } @@ -3665,7 +3785,9 @@ HiiSetKeyboardLayout ( // Backup current keyboard layout. // CopyMem (&Private->CurrentLayoutGuid, KeyGuid, sizeof (EFI_GUID)); - SafeFreePool(Private->CurrentLayout); + if (Private->CurrentLayout != NULL) { + FreePool(Private->CurrentLayout); + } Private->CurrentLayout = KeyboardLayout; //