-/**\r
- Extract device path for given HII handle and class guid.\r
-\r
- @param Handle The HII handle.\r
-\r
- @retval NULL Fail to get the device path string.\r
- @return PathString Get the device path string.\r
-\r
-**/\r
-CHAR16 *\r
-ExtractDevicePathFromHiiHandle (\r
- IN EFI_HII_HANDLE Handle\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HANDLE DriverHandle;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath; \r
- EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *PathToText;\r
- CHAR16 *NewString;\r
-\r
- ASSERT (Handle != NULL);\r
-\r
- if (Handle == NULL) {\r
- return NULL;\r
- }\r
-\r
- Status = gHiiDatabase->GetPackageListHandle (gHiiDatabase, Handle, &DriverHandle);\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Get the device path by the got Driver handle .\r
- //\r
- Status = gBS->HandleProtocol (DriverHandle, &gEfiDevicePathProtocolGuid, (VOID **) &DevicePath);\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
-\r
- Status = gBS->LocateProtocol (\r
- &gEfiDevicePathToTextProtocolGuid,\r
- NULL,\r
- (VOID **) &PathToText\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return NULL;\r
- }\r
-\r
- //\r
- // Get device path string.\r
- //\r
- NewString = PathToText->ConvertDevicePathToText(DevicePath, FALSE, FALSE);\r
-\r
- return NewString;\r
-}\r
-\r
-/**\r
- Extract the displayed formset for given HII handle and class guid.\r
-\r
- @param Handle The HII handle.\r
- @param SetupClassGuid The class guid specifies which form set will be displayed.\r
- @param SkipCount Skip some formsets which has processed before.\r
- @param FormSetTitle Formset title string.\r
- @param FormSetHelp Formset help string.\r
- @param FormSetGuid Formset Guid.\r
-\r
- @retval TRUE The formset for given HII handle will be displayed.\r
- @return FALSE The formset for given HII handle will not be displayed.\r
-\r
-**/\r
-BOOLEAN\r
-ExtractDisplayedHiiFormFromHiiHandle (\r
- IN EFI_HII_HANDLE Handle,\r
- IN EFI_GUID *SetupClassGuid,\r
- IN UINTN SkipCount,\r
- OUT EFI_STRING_ID *FormSetTitle,\r
- OUT EFI_STRING_ID *FormSetHelp,\r
- OUT EFI_GUID *FormSetGuid\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN BufferSize;\r
- EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
- UINT8 *Package;\r
- UINT8 *OpCodeData;\r
- UINT32 Offset;\r
- UINT32 Offset2;\r
- UINT32 PackageListLength;\r
- EFI_HII_PACKAGE_HEADER PackageHeader;\r
- EFI_GUID *ClassGuid;\r
- UINT8 ClassGuidNum;\r
- BOOLEAN FoundAndSkip;\r
-\r
- ASSERT (Handle != NULL);\r
- ASSERT (SetupClassGuid != NULL && FormSetTitle != NULL && FormSetHelp != NULL && FormSetGuid != NULL);\r
-\r
- *FormSetTitle = 0;\r
- *FormSetHelp = 0;\r
- ClassGuidNum = 0;\r
- ClassGuid = NULL;\r
- FoundAndSkip = FALSE;\r
-\r
- //\r
- // Get HII PackageList\r
- //\r
- BufferSize = 0;\r
- HiiPackageList = NULL;\r
- Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- //\r
- // Handle is a invalid handle. Check if Handle is corrupted.\r
- //\r
- ASSERT (Status != EFI_NOT_FOUND);\r
- //\r
- // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.\r
- //\r
- ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
- \r
- HiiPackageList = AllocatePool (BufferSize);\r
- ASSERT (HiiPackageList != NULL);\r
-\r
- Status = gHiiDatabase->ExportPackageLists (gHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
- if (EFI_ERROR (Status)) {\r
- return FALSE;\r
- }\r
-\r
- //\r
- // Get Form package from this HII package List\r
- //\r
- Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
- PackageListLength = ReadUnaligned32 (&HiiPackageList->PackageLength);\r
-\r
- while (Offset < PackageListLength) {\r
- Package = ((UINT8 *) HiiPackageList) + Offset;\r
- CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
- Offset += PackageHeader.Length;\r
-\r
- if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {\r
- //\r
- // Search FormSet Opcode in this Form Package\r
- //\r
- Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
- while (Offset2 < PackageHeader.Length) {\r
- OpCodeData = Package + Offset2;\r
- Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
-\r
- if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
- if (((EFI_IFR_OP_HEADER *) OpCodeData)->Length > OFFSET_OF (EFI_IFR_FORM_SET, Flags)) {\r
- //\r
- // Find FormSet OpCode\r
- //\r
- ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3);\r
- ClassGuid = (EFI_GUID *) (VOID *)(OpCodeData + sizeof (EFI_IFR_FORM_SET));\r
- while (ClassGuidNum-- > 0) {\r
- if (CompareGuid (SetupClassGuid, ClassGuid)) {\r
- //\r
- // Check whether need to skip the formset.\r
- //\r
- if (SkipCount != 0) {\r
- SkipCount--;\r
- FoundAndSkip = TRUE;\r
- break;\r
- }\r
- CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
- CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
- CopyGuid (FormSetGuid, (CONST EFI_GUID *)(&((EFI_IFR_FORM_SET *) OpCodeData)->Guid));\r
- FreePool (HiiPackageList);\r
- return TRUE;\r
- }\r
- ClassGuid ++;\r
- }\r
- if (FoundAndSkip) {\r
- break;\r
- }\r
- } else if (CompareGuid (SetupClassGuid, &gEfiHiiPlatformSetupFormsetGuid)) {\r
- //\r
- // Check whether need to skip the formset.\r
- //\r
- if (SkipCount != 0) {\r
- SkipCount--;\r
- break;\r
- }\r
- CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
- CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
- CopyGuid (FormSetGuid, (CONST EFI_GUID *)(&((EFI_IFR_FORM_SET *) OpCodeData)->Guid));\r
- FreePool (HiiPackageList);\r
- return TRUE;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- FreePool (HiiPackageList);\r
-\r
- return FALSE;\r
-}\r
-\r