+ case EFI_IFR_REF_OP:\r
+ //\r
+ // Ref question is not in IFR Form. This IFR form is not valid. \r
+ //\r
+ if (VarStorageData->Size == 0) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+ //\r
+ // Check whether this question is for the requested varstore.\r
+ //\r
+ IfrRef = (EFI_IFR_REF4 *) IfrOpHdr;\r
+ if (IfrRef->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+ break;\r
+ }\r
+ \r
+ //\r
+ // Get Offset/Width by Question header.\r
+ //\r
+ VarOffset = IfrRef->Question.VarStoreInfo.VarOffset;\r
+ VarWidth = (UINT16) (sizeof (EFI_HII_REF));\r
+ //\r
+ // Check whether this question is in requested block array.\r
+ //\r
+ if (!BlockArrayCheck (RequestBlockArray, VarOffset, VarWidth)) {\r
+ //\r
+ // This question is not in the requested string. Skip it.\r
+ //\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Check this var question is in the var storage \r
+ //\r
+ if ((VarOffset + VarWidth) > VarStorageData->Size) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ goto Done;\r
+ }\r
+ \r
+ //\r
+ // Set Block Data\r
+ //\r
+ BlockData = (IFR_BLOCK_DATA *) AllocateZeroPool (sizeof (IFR_BLOCK_DATA));\r
+ if (BlockData == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Done;\r
+ }\r
+ BlockData->Offset = VarOffset;\r
+ BlockData->Width = VarWidth;\r
+ BlockData->QuestionId = IfrRef->Question.QuestionId;\r
+ BlockData->OpCode = IfrOpHdr->OpCode;\r
+ BlockData->Scope = IfrOpHdr->Scope;\r
+ InitializeListHead (&BlockData->DefaultValueEntry);\r
+ //\r
+ // Add Block Data into VarStorageData BlockEntry\r
+ //\r
+ InsertBlockData (&VarStorageData->BlockEntry, &BlockData);\r
+ break;\r
+\r