-/**\r
- Find HII Handle in the default HII database associated with given Device Path.\r
-\r
- If DevicePath is NULL, then ASSERT.\r
-\r
- @param DevicePath Device Path associated with the HII package list\r
- handle.\r
-\r
- @retval Handle HII package list Handle associated with the Device\r
- Path.\r
- @retval NULL Hii Package list handle is not found.\r
-\r
-**/\r
-EFI_HII_HANDLE\r
-EFIAPI\r
-HiiLibDevicePathToHiiHandle (\r
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;\r
- UINTN BufferSize;\r
- UINTN HandleCount;\r
- UINTN Index;\r
- EFI_HANDLE *Handles;\r
- EFI_HANDLE Handle;\r
- UINTN Size;\r
- EFI_HANDLE DriverHandle;\r
- EFI_HII_HANDLE *HiiHandles;\r
- EFI_HII_HANDLE HiiHandle;\r
-\r
- ASSERT (DevicePath != NULL);\r
-\r
- //\r
- // Locate Device Path Protocol handle buffer\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiDevicePathProtocolGuid,\r
- NULL,\r
- &HandleCount,\r
- &Handles\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Search Driver Handle by Device Path\r
- //\r
- DriverHandle = NULL;\r
- BufferSize = GetDevicePathSize (DevicePath);\r
- for(Index = 0; Index < HandleCount; Index++) {\r
- Handle = Handles[Index];\r
- gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID **) &TmpDevicePath);\r
-\r
- //\r
- // Check whether DevicePath match\r
- //\r
- Size = GetDevicePathSize (TmpDevicePath);\r
- if ((Size == BufferSize) && CompareMem (DevicePath, TmpDevicePath, Size) == 0) {\r
- DriverHandle = Handle;\r
- break;\r
- }\r
- }\r
- FreePool (Handles);\r
-\r
- if (DriverHandle == NULL) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Retrieve all Hii Handles from HII database\r
- //\r
- BufferSize = 0x1000;\r
- HiiHandles = AllocatePool (BufferSize);\r
- ASSERT (HiiHandles != NULL);\r
- Status = gHiiDatabase->ListPackageLists (\r
- gHiiDatabase,\r
- EFI_HII_PACKAGE_TYPE_ALL,\r
- NULL,\r
- &BufferSize,\r
- HiiHandles\r
- );\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- FreePool (HiiHandles);\r
- HiiHandles = AllocatePool (BufferSize);\r
- ASSERT (HiiHandles != NULL);\r
-\r
- Status = gHiiDatabase->ListPackageLists (\r
- gHiiDatabase,\r
- EFI_HII_PACKAGE_TYPE_ALL,\r
- NULL,\r
- &BufferSize,\r
- HiiHandles\r
- );\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- FreePool (HiiHandles);\r
- return NULL;\r
- }\r
-\r
- //\r
- // Search Hii Handle by Driver Handle\r
- //\r
- HiiHandle = NULL;\r
- HandleCount = BufferSize / sizeof (EFI_HII_HANDLE);\r
- for (Index = 0; Index < HandleCount; Index++) {\r
- Status = gHiiDatabase->GetPackageListHandle (\r
- gHiiDatabase,\r
- HiiHandles[Index],\r
- &Handle\r
- );\r
- if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {\r
- HiiHandle = HiiHandles[Index];\r
- break;\r
- }\r
- }\r
-\r
- FreePool (HiiHandles);\r
- return HiiHandle;\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
-HiiLibExportPackageLists (\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
- if (Handle != NULL) {\r
- ASSERT (IsHiiHandleRegistered (Handle));\r
- }\r
-\r
- Size = 0;\r
- PackageListHdr = NULL;\r
- Status = gHiiDatabase->ExportPackageLists (\r
- gHiiDatabase,\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 = gHiiDatabase->ExportPackageLists (\r
- gHiiDatabase,\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
- \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
-HiiLibListPackageLists (\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 = gHiiDatabase->ListPackageLists (\r
- gHiiDatabase,\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 gHiiDatabase->ListPackageLists (\r
- gHiiDatabase,\r
- PackageType,\r
- PackageGuid,\r
- HandleBufferLength,\r
- *HandleBuffer\r
- );\r
- \r
-}\r
-/**\r
- This function check if the Hii Handle is a valid handle registered\r
- in the HII database.\r
-\r
- @param HiiHandle The HII Handle.\r
-\r
- @retval TRUE If it is a valid HII handle.\r
- @retval FALSE If it is a invalid HII handle.\r
-**/\r
-BOOLEAN\r
-IsHiiHandleRegistered (\r
- EFI_HII_HANDLE HiiHandle\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
-\r
- ASSERT (HiiHandle != NULL);\r
-\r
- HiiPackageList = NULL;\r
- BufferSize = 0;\r
-\r
- Status = gHiiDatabase->ExportPackageLists (\r
- gHiiDatabase,\r
- HiiHandle,\r
- &BufferSize,\r
- HiiPackageList\r
- );\r
-\r
- return (BOOLEAN) (Status == EFI_BUFFER_TOO_SMALL);\r
-}\r
-\r
-\r