+}\r
+\r
+/**\r
+ Get variable size and data from HII-type PCDs.\r
+\r
+ @param[in] VariableGuid Guid of variable which stored value of a HII-type PCD.\r
+ @param[in] VariableName Unicode name of variable which stored value of a HII-type PCD.\r
+ @param[out] VariableSize Pointer to variable size got from HII-type PCDs.\r
+ @param[out] VariableData Pointer to variable data got from HII-type PCDs.\r
+\r
+**/\r
+VOID\r
+GetVariableSizeAndDataFromHiiPcd (\r
+ IN EFI_GUID *VariableGuid,\r
+ IN UINT16 *VariableName,\r
+ OUT UINTN *VariableSize,\r
+ OUT VOID *VariableData OPTIONAL\r
+ )\r
+{\r
+ BOOLEAN IsPeiDb;\r
+ PCD_DATABASE_INIT *Database;\r
+ UINTN TokenNumber;\r
+ UINT32 LocalTokenNumber;\r
+ UINTN Offset;\r
+ EFI_GUID *GuidTable;\r
+ UINT8 *StringTable;\r
+ VARIABLE_HEAD *VariableHead;\r
+ EFI_GUID *Guid;\r
+ UINT16 *Name;\r
+ UINTN PcdDataSize;\r
+ UINTN Size;\r
+ UINT8 *VaraiableDefaultBuffer;\r
+ STRING_HEAD StringTableIdx;\r
+\r
+ *VariableSize = 0;\r
+\r
+ //\r
+ // Go through PCD database to find out DynamicHii PCDs.\r
+ //\r
+ for (TokenNumber = 1; TokenNumber <= mPcdTotalTokenCount; TokenNumber++) {\r
+ IsPeiDb = (BOOLEAN)((TokenNumber + 1 < mPeiLocalTokenCount + 1) ? TRUE : FALSE);\r
+ Database = IsPeiDb ? mPcdDatabase.PeiDb : mPcdDatabase.DxeDb;\r
+ LocalTokenNumber = GetLocalTokenNumber (IsPeiDb, TokenNumber);\r
+ if ((LocalTokenNumber & PCD_TYPE_HII) != 0) {\r
+ //\r
+ // Get the Variable Guid and Name pointer.\r
+ //\r
+ Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;\r
+ VariableHead = (VARIABLE_HEAD *)((UINT8 *)Database + Offset);\r
+ StringTable = (UINT8 *)((UINT8 *)Database + Database->StringTableOffset);\r
+ GuidTable = (EFI_GUID *)((UINT8 *)Database + Database->GuidTableOffset);\r
+ Guid = GuidTable + VariableHead->GuidTableIndex;\r
+ Name = (UINT16 *)(StringTable + VariableHead->StringIndex);\r
+ if (CompareGuid (VariableGuid, Guid) && (StrCmp (VariableName, Name) == 0)) {\r
+ //\r
+ // It is the matched DynamicHii PCD.\r
+ //\r
+ PcdDataSize = DxePcdGetSize (TokenNumber);\r
+ Size = VariableHead->Offset + PcdDataSize;\r
+ if (Size > *VariableSize) {\r
+ *VariableSize = Size;\r
+ }\r