+\r
+ Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Get all VarStoreId and build the the QuestionId map.\r
+ // EFI_IFR_QUESTION_HEADER.VarStoreInfo.VarOffset -> Framework Question ID\r
+ // EFI_IFR_QUESTION_HEADER.QuestionId -> UEFI Question ID\r
+ //\r
+\r
+ //\r
+ // Skip the package list header.\r
+ //\r
+ Package = (EFI_HII_PACKAGE_HEADER *) (List + 1);\r
+\r
+ while (Package->Type != EFI_HII_PACKAGE_END) {\r
+\r
+ if (Package->Type == EFI_HII_PACKAGE_FORM) {\r
+\r
+ //\r
+ // Skip the package header\r
+ //\r
+ Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+ while (Offset < Package->Length) {\r
+ OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
+\r
+ switch (OpCode->OpCode) {\r
+ case EFI_IFR_FORM_SET_OP:\r
+ FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
+ ThunkContext->FormSetTitle = FormSet->FormSetTitle;\r
+ ThunkContext->FormSetHelp = FormSet->Help;\r
+ break;\r
+ \r
+ case EFI_IFR_VARSTORE_OP:\r
+ //\r
+ // IFR built from Framework VFR only has UEFI Buffer Type Storage\r
+ //\r
+ VarStore = (EFI_IFR_VARSTORE *) OpCode;\r
+ IdMap = AllocateZeroPool (sizeof (QUESTION_ID_MAP));\r
+ ASSERT (IdMap != NULL);\r
+ \r
+ IdMap->Signature = QUESTION_ID_MAP_SIGNATURE;\r
+ IdMap->VarStoreId = VarStore->VarStoreId;\r
+ IdMap->VarSize = VarStore->Size;\r
+ InitializeListHead (&IdMap->MapEntryListHead);\r
+ InsertTailList (&ThunkContext->QuestionIdMapListHead, &IdMap->Link);\r
+ break;\r
+\r
+ case EFI_IFR_NUMERIC_OP:\r
+ case EFI_IFR_CHECKBOX_OP:\r
+ case EFI_IFR_ONE_OF_OP:\r
+ case EFI_IFR_ORDERED_LIST_OP:\r
+ case EFI_IFR_STRING_OP:\r
+ //case EFI_IFR_PASSWORD_OP:\r
+ Question = (EFI_IFR_QUESTION_HEADER *)(OpCode + 1);\r
+ QuestionIdMapEntryListHead = GetMapEntryListHead (ThunkContext, Question->VarStoreId);\r
+\r
+ if (QuestionIdMapEntryListHead != NULL) {\r
+ //\r
+ // If the Question is using Buffer (EFI_IFR_VARSTORE_OP) type VarStore.\r
+ //\r
+ IdMapEntry = AllocateZeroPool (sizeof (QUESTION_ID_MAP_ENTRY));\r
+ ASSERT (IdMapEntry != NULL);\r
+\r
+ IdMapEntry->FwQId = Question->VarStoreInfo.VarOffset;\r
+ IdMapEntry->UefiQid = Question->QuestionId;\r
+ IdMapEntry->Signature = QUESTION_ID_MAP_ENTRY_SIGNATURE;\r
+\r
+ InsertTailList (QuestionIdMapEntryListHead, &IdMapEntry->Link);\r
+ }\r
+\r
+ if (OpCode->OpCode == EFI_IFR_ONE_OF_OP) {\r
+ OneOfOpcode = (EFI_IFR_ONE_OF *) OpCode;\r
+ OneOfType = OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE;\r
+ }\r
+\r
+ break;\r
+ \r
+ case EFI_IFR_GUID_OP:\r
+ OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCode;\r
+ if (CompareMem (&OptionMap->Guid, &gFrameworkHiiCompatbilityGuid, sizeof (EFI_GUID)) == 0) {\r
+ if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
+ OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (ThunkContext, OptionMap->QuestionId);\r
+ if (OneOfOptinMapEntryListHead == NULL) {\r
+ OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
+ ASSERT (OneOfOptionMap != NULL);\r
+\r
+ OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
+ OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
+\r
+ //\r
+ // Make sure OneOfType is initialized.\r
+ //\r
+ ASSERT (OneOfType != (UINT8) -1);\r
+ OneOfOptionMap->ValueType = OneOfType;\r
+ InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
+ OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
+ InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
+ }\r
+ OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
+ ASSERT (OneOfOptionMapEntry != NULL);\r
+\r
+ OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
+ OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
+ CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
+ \r
+ InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
+ }\r
+ } else if (CompareMem (&OptionMap->Guid, &gTianoHiiIfrGuid, sizeof (EFI_GUID)) == 0) {\r
+ Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
+\r
+ switch (Class->ExtendOpCode) {\r
+ case EFI_IFR_EXTEND_OP_CLASS:\r
+ ThunkContext->FormSetClass = Class->Class;\r
+ break;\r
+ case EFI_IFR_EXTEND_OP_SUBCLASS:\r
+ SubClass = (EFI_IFR_GUID_SUBCLASS *) OpCode;\r
+ ThunkContext->FormSetSubClass = SubClass->SubClass;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+ \r
+ default:\r
+ break;\r
+ \r
+ }\r
+\r
+ Offset += OpCode->Length;\r
+ }\r
+ //\r
+ // Only Form Package is in a Package List.\r
+ //\r
+ break;\r
+ }\r
+\r
+ Package = (EFI_HII_PACKAGE_HEADER *) (UINT8 *) Package + Package->Length;\r
+ }\r
+\r
+ FreePool (List);\r
+ return EFI_SUCCESS;\r