+/**\r
+ This function parses Form Package to get the efi varstore info according to the request ConfigHdr.\r
+\r
+ @param DataBaseRecord The DataBaseRecord instance contains the found Hii handle and package.\r
+ @param ConfigHdr Request string ConfigHdr. If it is NULL,\r
+ the first found varstore will be as ConfigHdr.\r
+ @retval TRUE This hii package is the reqeust one.\r
+ @retval FALSE This hii package is not the reqeust one.\r
+**/ \r
+BOOLEAN\r
+IsThisPackageList (\r
+ IN HII_DATABASE_RECORD *DataBaseRecord,\r
+ IN EFI_STRING ConfigHdr\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN IfrOffset;\r
+ UINTN PackageOffset;\r
+ EFI_IFR_OP_HEADER *IfrOpHdr;\r
+ CHAR16 *VarStoreName;\r
+ UINT8 *HiiFormPackage;\r
+ UINTN PackageSize;\r
+ EFI_IFR_VARSTORE_EFI *IfrEfiVarStore;\r
+ EFI_HII_PACKAGE_HEADER *PackageHeader;\r
+ EFI_IFR_VARSTORE *IfrVarStore;\r
+ EFI_IFR_VARSTORE_NAME_VALUE *IfrNameValueVarStore;\r
+ BOOLEAN FindVarstore;\r
+\r
+ HiiFormPackage = NULL;\r
+ VarStoreName = NULL;\r
+ Status = EFI_SUCCESS;\r
+ FindVarstore = FALSE;\r
+\r
+ Status = GetFormPackageData(DataBaseRecord, &HiiFormPackage, &PackageSize);\r
+ if (EFI_ERROR (Status)) {\r
+ return FALSE;\r
+ }\r
+\r
+ IfrOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ PackageOffset = IfrOffset;\r
+ PackageHeader = (EFI_HII_PACKAGE_HEADER *) HiiFormPackage;\r
+\r
+ while (IfrOffset < PackageSize) {\r
+ //\r
+ // More than one form packages exist.\r
+ //\r
+ if (PackageOffset >= PackageHeader->Length) {\r
+ //\r
+ // Process the new form package.\r
+ //\r
+ PackageOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ IfrOffset += PackageOffset;\r
+ PackageHeader = (EFI_HII_PACKAGE_HEADER *) (HiiFormPackage + IfrOffset);\r
+ }\r
+\r
+ IfrOpHdr = (EFI_IFR_OP_HEADER *) (HiiFormPackage + IfrOffset);\r
+ IfrOffset += IfrOpHdr->Length;\r
+ PackageOffset += IfrOpHdr->Length;\r
+\r
+ switch (IfrOpHdr->OpCode) {\r
+ \r
+ case EFI_IFR_VARSTORE_OP:\r
+ IfrVarStore = (EFI_IFR_VARSTORE *) IfrOpHdr;\r
+\r
+ VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrVarStore->Name) * sizeof (CHAR16));\r
+ if (VarStoreName == NULL) {\r
+ goto Done;\r
+ }\r
+ AsciiStrToUnicodeStr ((CHAR8 *)IfrVarStore->Name, VarStoreName);\r
+\r
+ if (IsThisVarstore((VOID *)&IfrVarStore->Guid, VarStoreName, ConfigHdr)) {\r
+ FindVarstore = TRUE;\r
+ goto Done;\r
+ }\r
+ break;\r
+\r
+ case EFI_IFR_VARSTORE_EFI_OP:\r
+ IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *) IfrOpHdr;\r
+ VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) * sizeof (CHAR16));\r
+ if (VarStoreName == NULL) {\r
+ goto Done;\r
+ }\r
+ AsciiStrToUnicodeStr ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName);\r
+\r
+ if (IsThisVarstore (&IfrEfiVarStore->Guid, VarStoreName, ConfigHdr)) {\r
+ FindVarstore = TRUE;\r
+ goto Done;\r
+ }\r
+ break;\r
+\r
+ case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
+ IfrNameValueVarStore = (EFI_IFR_VARSTORE_NAME_VALUE *) IfrOpHdr;\r
+\r
+ if (IsThisVarstore (&IfrNameValueVarStore->Guid, NULL, ConfigHdr)) {\r
+ FindVarstore = TRUE;\r
+ goto Done;\r
+ }\r
+ break;\r
+ \r
+ case EFI_IFR_FORM_OP:\r
+ case EFI_IFR_FORM_MAP_OP:\r
+ //\r
+ // No matched varstore is found and directly return.\r
+ //\r
+ goto Done;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+\r
+Done:\r
+ if (HiiFormPackage != NULL) {\r
+ FreePool (HiiFormPackage);\r
+ }\r
+\r
+ if (VarStoreName != NULL) {\r
+ FreePool (VarStoreName);\r
+ }\r
+\r
+ return FindVarstore;\r
+}\r
+\r