CONST EFI_GUID gZeroGuid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};\r
CONST CHAR16 FrameworkReservedVarstoreName[] = FRAMEWORK_RESERVED_VARSTORE_NAME;\r
\r
+/**\r
+ \r
+ This function returns a list of the package handles of the \r
+ specified type that are currently active in the HII database. The \r
+ pseudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package \r
+ handles to be listed.\r
+\r
+ If HandleBufferLength is NULL, then ASSERT.\r
+ If HandleBuffer is NULL, the ASSERT.\r
+ If PackageType is EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is\r
+ NULL, then ASSERT.\r
+ If PackageType is not EFI_HII_PACKAGE_TYPE_GUID and PackageGuid is not\r
+ NULL, then ASSERT.\r
+ \r
+ \r
+ @param PackageType Specifies the package type of the packages\r
+ to list or EFI_HII_PACKAGE_TYPE_ALL for\r
+ all packages to be listed.\r
+ \r
+ @param PackageGuid If PackageType is\r
+ EFI_HII_PACKAGE_TYPE_GUID, then this is\r
+ the pointer to the GUID which must match\r
+ the Guid field of\r
+ EFI_HII_PACKAGE_GUID_HEADER. Otherwise, it\r
+ must be NULL.\r
+ \r
+ @param HandleBufferLength On output, the length of the handle buffer\r
+ that is required for the handles found.\r
+\r
+ @param HandleBuffer On output, an array of EFI_HII_HANDLE instances returned.\r
+ The caller is responcible to free this pointer allocated.\r
+\r
+ @retval EFI_SUCCESS The matching handles are outputed successfully.\r
+ HandleBufferLength is updated with the actual length.\r
+ @retval EFI_OUT_OF_RESOURCES Not enough resource to complete the operation.\r
+ @retval EFI_NOT_FOUND No matching handle could not be found in database.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ListPackageLists (\r
+ IN UINT8 PackageType,\r
+ IN CONST EFI_GUID *PackageGuid,\r
+ IN OUT UINTN *HandleBufferLength,\r
+ OUT EFI_HII_HANDLE **HandleBuffer\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ \r
+ ASSERT (HandleBufferLength != NULL);\r
+ ASSERT (HandleBuffer != NULL);\r
+ \r
+ *HandleBufferLength = 0;\r
+ *HandleBuffer = NULL;\r
+\r
+ if (PackageType == EFI_HII_PACKAGE_TYPE_GUID) {\r
+ ASSERT (PackageGuid != NULL);\r
+ } else {\r
+ ASSERT (PackageGuid == NULL);\r
+ }\r
+\r
+ Status = mHiiDatabase->ListPackageLists (\r
+ mHiiDatabase,\r
+ PackageType,\r
+ PackageGuid,\r
+ HandleBufferLength,\r
+ *HandleBuffer\r
+ );\r
+ if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
+ //\r
+ // No packages is registered to UEFI HII Database, just return.\r
+ // \r
+ //\r
+ return Status;\r
+ }\r
+\r
+ *HandleBuffer = AllocateZeroPool (*HandleBufferLength);\r
+ \r
+ if (*HandleBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ \r
+ return mHiiDatabase->ListPackageLists (\r
+ mHiiDatabase,\r
+ PackageType,\r
+ PackageGuid,\r
+ HandleBufferLength,\r
+ *HandleBuffer\r
+ );\r
+ \r
+}\r
+\r
+/**\r
+ Exports the contents of one or all package lists in the HII database into a buffer.\r
+\r
+ If Handle is not NULL and not a valid EFI_HII_HANDLE registered in the database, \r
+ then ASSERT.\r
+ If PackageListHeader is NULL, then ASSERT.\r
+ If PackageListSize is NULL, then ASSERT.\r
+\r
+ @param Handle The HII Handle.\r
+ @param PackageListHeader A pointer to a buffer that will contain the results of \r
+ the export function.\r
+ @param PackageListSize On output, the length of the buffer that is required for the exported data.\r
+\r
+ @retval EFI_SUCCESS Package exported.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES Not enought memory to complete the operations.\r
+\r
+**/\r
+EFI_STATUS \r
+EFIAPI\r
+ExportPackageLists (\r
+ IN EFI_HII_HANDLE Handle,\r
+ OUT EFI_HII_PACKAGE_LIST_HEADER **PackageListHeader,\r
+ OUT UINTN *PackageListSize\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN Size;\r
+ EFI_HII_PACKAGE_LIST_HEADER *PackageListHdr;\r
+\r
+ ASSERT (PackageListSize != NULL);\r
+ ASSERT (PackageListHeader != NULL);\r
+\r
+ Size = 0;\r
+ PackageListHdr = NULL;\r
+ Status = mHiiDatabase->ExportPackageLists (\r
+ mHiiDatabase,\r
+ Handle,\r
+ &Size,\r
+ PackageListHdr\r
+ );\r
+ ASSERT_EFI_ERROR (Status != EFI_BUFFER_TOO_SMALL);\r
+ \r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ PackageListHdr = AllocateZeroPool (Size);\r
+ \r
+ if (PackageListHeader == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ } else {\r
+ Status = mHiiDatabase->ExportPackageLists (\r
+ mHiiDatabase,\r
+ Handle,\r
+ &Size,\r
+ PackageListHdr\r
+ );\r
+ }\r
+ }\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ *PackageListHeader = PackageListHdr;\r
+ *PackageListSize = Size;\r
+ } else {\r
+ FreePool (PackageListHdr);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+/**\r
+ Extract Hii package list GUID for given HII handle.\r
+\r
+ If HiiHandle could not be found in the HII database, then ASSERT.\r
+ If Guid is NULL, then ASSERT.\r
+\r
+ @param Handle Hii handle\r
+ @param Guid Package list GUID\r
+\r
+ @retval EFI_SUCCESS Successfully extract GUID from Hii database.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ExtractGuidFromHiiHandle (\r
+ IN EFI_HII_HANDLE Handle,\r
+ OUT EFI_GUID *Guid\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN BufferSize;\r
+ EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
+\r
+ ASSERT (Guid != NULL);\r
+ ASSERT (Handle != NULL);\r
+\r
+ //\r
+ // Get HII PackageList\r
+ //\r
+ BufferSize = 0;\r
+ HiiPackageList = NULL;\r
+\r
+ Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, 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
+ Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
+ }\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (HiiPackageList);\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Extract GUID\r
+ //\r
+ CopyGuid (Guid, &HiiPackageList->PackageListGuid);\r
+\r
+ FreePool (HiiPackageList);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
\r
/**\r
Find the corressponding UEFI HII Handle from a Framework HII Handle given.\r
\r
ThunkContext->UefiHiiHandle = UefiHiiHandle;\r
\r
- Status = HiiLibExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
+ Status = ExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
ASSERT_EFI_ERROR (Status);\r
\r
CopyGuid(&ThunkContext->TagGuid, &PackageGuid);\r