]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
Add support for newly defined Browser action type EFI_BROWSER_ACTION_FORM_OPEN and...
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
index 35ed197a960ba7c7a0165ab44b3e9e535f7c7f95..3285cfe5aae6acc59c1363219affea71f84066ca 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Parser for IFR binary encoding.\r
 \r
-Copyright (c) 2007 - 2008, Intel Corporation\r
+Copyright (c) 2007 - 2009, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -21,12 +21,10 @@ UINT16           mExpressionOpCodeIndex;
 BOOLEAN          mInScopeSubtitle;\r
 BOOLEAN          mInScopeSuppress;\r
 BOOLEAN          mInScopeGrayOut;\r
+BOOLEAN          mInScopeDisable;\r
 FORM_EXPRESSION  *mSuppressExpression;\r
 FORM_EXPRESSION  *mGrayOutExpression;\r
-\r
-EFI_GUID  gTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID  mFrameworkHiiCompatibilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
-\r
+FORM_EXPRESSION  *mDisableExpression;\r
 \r
 /**\r
   Initialize Statement header members.\r
@@ -79,6 +77,11 @@ CreateStatement (
     Statement->GrayOutExpression = mGrayOutExpression;\r
   }\r
 \r
+\r
+  if (mInScopeDisable) {\r
+    Statement->DisableExpression = mDisableExpression;\r
+  }\r
+\r
   Statement->InSubtitle = mInScopeSubtitle;\r
 \r
   //\r
@@ -112,17 +115,15 @@ UpdateCheckBoxStringToken (
 {\r
   CHAR16                  Str[MAXIMUM_VALUE_CHARACTERS];\r
   EFI_STRING_ID           Id;\r
-  EFI_STATUS              Status;\r
 \r
   ASSERT (Statement != NULL);\r
   ASSERT (Statement->Operand == EFI_IFR_NUMERIC_OP);\r
   \r
   UnicodeValueToString (Str, 0, Statement->VarStoreInfo.VarName, MAXIMUM_VALUE_CHARACTERS - 1);\r
-  \r
-  Status = HiiLibNewString (FormSet->HiiHandle, &Id, Str);\r
 \r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  Id = HiiSetString (FormSet->HiiHandle, 0, Str, NULL);\r
+  if (Id == 0) {\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   Statement->VarStoreInfo.VarName = Id;\r
@@ -148,7 +149,7 @@ IsNextOpCodeGuidedVarEqName (
   //\r
   OpCodeData += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
   if (*OpCodeData == EFI_IFR_GUID_OP) {\r
-    if (CompareGuid (&mFrameworkHiiCompatibilityGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
+    if (CompareGuid (&gEfiIfrFrameworkGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
       //\r
       // Specific GUIDed opcodes to support IFR generated from Framework HII VFR \r
       //\r
@@ -208,7 +209,7 @@ CreateQuestion (
   // Take a look at next OpCode to see whether it is a GUIDed opcode to support\r
   // Framework Compatibility\r
   //\r
-  if (FeaturePcdGet (PcdFrameworkHiiCompatibilitySupport)) {\r
+  if (FeaturePcdGet (PcdFrameworkCompatibilitySupport)) {\r
     if ((*OpCodeData == EFI_IFR_NUMERIC_OP) && IsNextOpCodeGuidedVarEqName (OpCodeData)) {\r
       Status = UpdateCheckBoxStringToken (FormSet, Statement);\r
       if (EFI_ERROR (Status)) {\r
@@ -327,40 +328,25 @@ InitializeConfigHdr (
   IN OUT FORMSET_STORAGE   *Storage\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
-  UINTN       StrBufferLen;\r
   CHAR16      *Name;\r
-\r
+  \r
   if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
     Name = Storage->Name;\r
   } else {\r
     Name = NULL;\r
   }\r
-\r
-  StrBufferLen = 0;\r
-  Status = ConstructConfigHdr (\r
-             Storage->ConfigHdr,\r
-             &StrBufferLen,\r
-             &Storage->Guid,\r
-             Name,\r
-             FormSet->DriverHandle\r
-             );\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    Storage->ConfigHdr = AllocateZeroPool (StrBufferLen);\r
-    Status = ConstructConfigHdr (\r
-               Storage->ConfigHdr,\r
-               &StrBufferLen,\r
-               &Storage->Guid,\r
-               Name,\r
-               FormSet->DriverHandle\r
-               );\r
-  }\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  \r
+  Storage->ConfigHdr = HiiConstructConfigHdr (\r
+                         &Storage->Guid,\r
+                         Name,\r
+                         FormSet->DriverHandle\r
+                         );\r
+  \r
+  if (Storage->ConfigHdr == NULL) {\r
+    return EFI_NOT_FOUND;\r
   }\r
 \r
-  Storage->ConfigRequest = AllocateCopyPool (StrBufferLen, Storage->ConfigHdr);\r
+  Storage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr);\r
   Storage->SpareStrLen = 0;\r
 \r
   return EFI_SUCCESS;\r
@@ -824,6 +810,7 @@ ParseOpCodes (
   FORMSET_DEFAULTSTORE    *DefaultStore;\r
   QUESTION_DEFAULT        *CurrentDefault;\r
   QUESTION_OPTION         *CurrentOption;\r
+  UINT8                   Width;\r
   CHAR8                   *AsciiString;\r
   UINT16                  NumberOfStatement;\r
   UINT16                  NumberOfExpression;\r
@@ -831,7 +818,6 @@ ParseOpCodes (
   BOOLEAN                 SuppressForOption;\r
   BOOLEAN                 InScopeOptionSuppress;\r
   FORM_EXPRESSION         *OptionSuppressExpression;\r
-  BOOLEAN                 InScopeDisable;\r
   UINT16                  DepthOfDisable;\r
   BOOLEAN                 OpCodeDisabled;\r
   BOOLEAN                 SingleOpCodeExpression;\r
@@ -843,7 +829,7 @@ ParseOpCodes (
   mInScopeSuppress         = FALSE;\r
   InScopeOptionSuppress    = FALSE;\r
   mInScopeGrayOut          = FALSE;\r
-  InScopeDisable           = FALSE;\r
+  mInScopeDisable          = FALSE;\r
   DepthOfDisable           = 0;\r
   OpCodeDisabled           = FALSE;\r
   SingleOpCodeExpression   = FALSE;\r
@@ -852,6 +838,7 @@ ParseOpCodes (
   CurrentDefault           = NULL;\r
   CurrentOption            = NULL;\r
   OptionSuppressExpression = NULL;\r
+  ImageId                  = NULL;\r
 \r
   //\r
   // Get the number of Statements and Expressions\r
@@ -910,7 +897,7 @@ ParseOpCodes (
 \r
         if (ScopeOpCode == EFI_IFR_DISABLE_IF_OP) {\r
           if (DepthOfDisable == 0) {\r
-            InScopeDisable = FALSE;\r
+            mInScopeDisable = FALSE;\r
             OpCodeDisabled = FALSE;\r
           } else {\r
             DepthOfDisable--;\r
@@ -942,9 +929,9 @@ ParseOpCodes (
         break;\r
 \r
       case EFI_IFR_EQ_ID_LIST_OP:\r
-        CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
-        CopyMem (&ExpressionOpCode->ListLength, &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->ListLength, sizeof (UINT16));\r
-        ExpressionOpCode->ValueList = AllocateCopyPool (ExpressionOpCode->ListLength * sizeof (UINT16), &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->ValueList);\r
+        CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
+        CopyMem (&ExpressionOpCode->ListLength, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->ListLength, sizeof (UINT16));\r
+        ExpressionOpCode->ValueList = AllocateCopyPool (ExpressionOpCode->ListLength * sizeof (UINT16), &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->ValueList);\r
         break;\r
 \r
       case EFI_IFR_TO_STRING_OP:\r
@@ -966,11 +953,12 @@ ParseOpCodes (
         break;\r
 \r
       case EFI_IFR_THIS_OP:\r
+        ASSERT (CurrentStatement != NULL);\r
         ExpressionOpCode->QuestionId = CurrentStatement->QuestionId;\r
         break;\r
 \r
       case EFI_IFR_QUESTION_REF1_OP:\r
-        CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
+        CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
         break;\r
 \r
       case EFI_IFR_QUESTION_REF3_OP:\r
@@ -1032,7 +1020,7 @@ ParseOpCodes (
         break;\r
 \r
       case EFI_IFR_UNDEFINED_OP:\r
-        Value->Type = EFI_IFR_TYPE_OTHER;\r
+        Value->Type = EFI_IFR_TYPE_UNDEFINED;\r
         break;\r
 \r
       case EFI_IFR_VERSION_OP:\r
@@ -1044,6 +1032,7 @@ ParseOpCodes (
         break;\r
       }\r
 \r
+      ASSERT (CurrentExpression != NULL);\r
       InsertTailList (&CurrentExpression->OpCodeListHead, &ExpressionOpCode->Link);\r
 \r
       if (SingleOpCodeExpression) {\r
@@ -1054,14 +1043,15 @@ ParseOpCodes (
         //\r
         SingleOpCodeExpression = FALSE;\r
 \r
-        if (InScopeDisable) {\r
+        if (mInScopeDisable && CurrentForm == NULL) {\r
           //\r
-          // Evaluate DisableIf expression\r
+          // This is DisableIf expression for Form, it should be a constant expression\r
           //\r
           Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
           if (EFI_ERROR (Status)) {\r
             return Status;\r
           }\r
+\r
           if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
             return EFI_INVALID_PARAMETER;\r
           }\r
@@ -1082,7 +1072,7 @@ ParseOpCodes (
 \r
     case EFI_IFR_FORM_SET_OP:\r
       //\r
-      // check the formset GUID\r
+      // Check the formset GUID\r
       //\r
       if (CompareMem (&FormSet->Guid, &((EFI_IFR_FORM_SET *) OpCodeData)->Guid, sizeof (EFI_GUID)) != 0) {\r
         return EFI_INVALID_PARAMETER;\r
@@ -1090,6 +1080,12 @@ ParseOpCodes (
 \r
       CopyMem (&FormSet->FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
       CopyMem (&FormSet->Help,         &((EFI_IFR_FORM_SET *) OpCodeData)->Help,         sizeof (EFI_STRING_ID));\r
+\r
+      //\r
+      // The formset OpCode contains ClassGuid\r
+      //\r
+      FormSet->NumberOfClassGuid = (UINT8) (((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3);\r
+      CopyMem (FormSet->ClassGuid, OpCodeData + sizeof (EFI_IFR_FORM_SET), FormSet->NumberOfClassGuid * sizeof (EFI_GUID));\r
       break;\r
 \r
     case EFI_IFR_FORM_OP:\r
@@ -1191,6 +1187,8 @@ ParseOpCodes (
     //\r
     case EFI_IFR_SUBTITLE_OP:\r
       CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
+      \r
       CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
 \r
       if (Scope != 0) {\r
@@ -1200,15 +1198,24 @@ ParseOpCodes (
 \r
     case EFI_IFR_TEXT_OP:\r
       CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
 \r
       CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
       break;\r
 \r
+    case EFI_IFR_RESET_BUTTON_OP:\r
+      CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
+      CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
+      break;\r
+\r
     //\r
     // Questions\r
     //\r
     case EFI_IFR_ACTION_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+      ASSERT (CurrentStatement != NULL);\r
+      CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_ACTION;\r
 \r
       if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
         //\r
@@ -1220,15 +1227,10 @@ ParseOpCodes (
       }\r
       break;\r
 \r
-    case EFI_IFR_RESET_BUTTON_OP:\r
-      CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
-      CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
-      break;\r
-\r
     case EFI_IFR_REF_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+      ASSERT (CurrentStatement != NULL);\r
+      CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_UNDEFINED;\r
       CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
       if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
         CopyMem (&CurrentStatement->RefQuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
@@ -1246,7 +1248,8 @@ ParseOpCodes (
     case EFI_IFR_ONE_OF_OP:\r
     case EFI_IFR_NUMERIC_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+      ASSERT(CurrentStatement != NULL);\r
+      \r
       CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
       Value = &CurrentStatement->HiiValue;\r
 \r
@@ -1296,19 +1299,12 @@ ParseOpCodes (
 \r
     case EFI_IFR_ORDERED_LIST_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+      ASSERT(CurrentStatement != NULL);\r
+      \r
       CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
       CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
-      CurrentStatement->StorageWidth = (UINT16)(CurrentStatement->MaxContainers * sizeof (UINT8));\r
-      InitializeRequestElement (FormSet, CurrentStatement);\r
 \r
-      //\r
-      // No buffer type is defined in EFI_IFR_TYPE_VALUE, so a Configuration Driver\r
-      // has to use FormBrowser2.Callback() to retrieve the uncommited data for\r
-      // an interactive orderedlist (i.e. with EFI_IFR_FLAG_CALLBACK flag set).\r
-      //\r
-      CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_OTHER;\r
-      CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
+      CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BUFFER;\r
 \r
       if (Scope != 0) {\r
         SuppressForOption = TRUE;\r
@@ -1317,7 +1313,8 @@ ParseOpCodes (
 \r
     case EFI_IFR_CHECKBOX_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+      ASSERT(CurrentStatement != NULL);\r
+      \r
       CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
       CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
@@ -1328,7 +1325,7 @@ ParseOpCodes (
 \r
     case EFI_IFR_STRING_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+      ASSERT (CurrentStatement != NULL);\r
       //\r
       // MinSize is the minimum number of characters that can be accepted for this opcode,\r
       // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
@@ -1347,7 +1344,7 @@ ParseOpCodes (
 \r
     case EFI_IFR_PASSWORD_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+      ASSERT (CurrentStatement != NULL);\r
       //\r
       // MinSize is the minimum number of characters that can be accepted for this opcode,\r
       // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
@@ -1365,7 +1362,8 @@ ParseOpCodes (
 \r
     case EFI_IFR_DATE_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+      ASSERT(CurrentStatement != NULL);\r
+      \r
       CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
 \r
@@ -1384,7 +1382,8 @@ ParseOpCodes (
 \r
     case EFI_IFR_TIME_OP:\r
       CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+      ASSERT(CurrentStatement != NULL);\r
+      \r
       CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
       CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
 \r
@@ -1455,6 +1454,42 @@ ParseOpCodes (
       // Insert to Option list of current Question\r
       //\r
       InsertTailList (&CurrentStatement->OptionListHead, &CurrentOption->Link);\r
+\r
+      //\r
+      // Now we know the Storage width of nested Ordered List\r
+      //\r
+      if ((CurrentStatement->Operand == EFI_IFR_ORDERED_LIST_OP) && (CurrentStatement->BufferValue == NULL)) {\r
+        Width = 1;\r
+        switch (CurrentOption->Value.Type) {\r
+        case EFI_IFR_TYPE_NUM_SIZE_8:\r
+          Width = 1;\r
+          break;\r
+\r
+        case EFI_IFR_TYPE_NUM_SIZE_16:\r
+          Width = 2;\r
+          break;\r
+\r
+        case EFI_IFR_TYPE_NUM_SIZE_32:\r
+          Width = 4;\r
+          break;\r
+\r
+        case EFI_IFR_TYPE_NUM_SIZE_64:\r
+          Width = 8;\r
+          break;\r
+\r
+        default:\r
+          //\r
+          // Invalid type for Ordered List\r
+          //\r
+          break;\r
+        }\r
+\r
+        CurrentStatement->StorageWidth = (UINT16) (CurrentStatement->MaxContainers * Width);\r
+        CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
+        CurrentStatement->ValueType = CurrentOption->Value.Type;\r
+\r
+        InitializeRequestElement (FormSet, CurrentStatement);\r
+      }\r
       break;\r
 \r
     //\r
@@ -1517,8 +1552,16 @@ ParseOpCodes (
       CurrentExpression->Type = EFI_HII_EXPRESSION_DISABLE_IF;\r
       InitializeListHead (&CurrentExpression->OpCodeListHead);\r
 \r
-      InScopeDisable = TRUE;\r
-      OpCodeDisabled = FALSE;\r
+      if (CurrentForm != NULL) {\r
+        //\r
+        // This is DisableIf for Question, enqueue it to Form expression list\r
+        //\r
+        InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
+      }\r
+\r
+      mDisableExpression = CurrentExpression;\r
+      mInScopeDisable    = TRUE;\r
+      OpCodeDisabled     = FALSE;\r
 \r
       //\r
       // Take a look at next OpCode to see whether current expression consists\r
@@ -1546,6 +1589,12 @@ ParseOpCodes (
         //\r
         // If used for a question, then the question will be read-only\r
         //\r
+        //\r
+        // Make sure CurrentStatement is not NULL.\r
+        // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
+        // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.\r
+        //\r
+        ASSERT (CurrentStatement != NULL);\r
         CurrentStatement->ValueExpression = CurrentExpression;\r
       }\r
       break;\r
@@ -1574,6 +1623,7 @@ ParseOpCodes (
         break;\r
 \r
       case EFI_IFR_FORM_OP:\r
+        ASSERT (CurrentForm != NULL);\r
         ImageId = &CurrentForm->ImageId;\r
         break;\r
 \r
@@ -1582,10 +1632,17 @@ ParseOpCodes (
         break;\r
 \r
       default:\r
+        //\r
+        // Make sure CurrentStatement is not NULL.\r
+        // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
+        // file is wrongly generated by tools such as VFR Compiler.\r
+        //\r
+        ASSERT (CurrentStatement != NULL);\r
         ImageId = &CurrentStatement->ImageId;\r
         break;\r
       }\r
 \r
+      ASSERT (ImageId != NULL);\r
       CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
       break;\r
 \r
@@ -1593,6 +1650,7 @@ ParseOpCodes (
     // Refresh\r
     //\r
     case EFI_IFR_REFRESH_OP:\r
+      ASSERT (CurrentStatement != NULL);\r
       CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
       break;\r
 \r
@@ -1600,7 +1658,7 @@ ParseOpCodes (
     // Vendor specific\r
     //\r
     case EFI_IFR_GUID_OP:\r
-      if (CompareGuid (&gTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
+      if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
         //\r
         // Tiano specific GUIDed opcodes\r
         //\r
@@ -1612,9 +1670,12 @@ ParseOpCodes (
           break;\r
 \r
         case EFI_IFR_EXTEND_OP_BANNER:\r
+          //\r
+          // By SubClass to get Banner Data from Front Page\r
+          //\r
           if (FormSet->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
             CopyMem (\r
-              &BannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
+              &gBannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
               ((EFI_IFR_GUID_BANNER *) OpCodeData)->Alignment],\r
               &((EFI_IFR_GUID_BANNER *) OpCodeData)->Title,\r
               sizeof (EFI_STRING_ID)\r
@@ -1694,7 +1755,7 @@ ParseOpCodes (
         break;\r
 \r
       case EFI_IFR_DISABLE_IF_OP:\r
-        InScopeDisable = FALSE;\r
+        mInScopeDisable = FALSE;\r
         OpCodeDisabled = FALSE;\r
         break;\r
 \r
@@ -1709,14 +1770,16 @@ ParseOpCodes (
 \r
       default:\r
         if (IsExpressionOpCode (ScopeOpCode)) {\r
-          if (InScopeDisable) {\r
+          if (mInScopeDisable && CurrentForm == NULL) {\r
             //\r
-            // Evaluate DisableIf expression\r
+            // This is DisableIf expression for Form, it should be a constant expression\r
             //\r
+            ASSERT (CurrentExpression != NULL);\r
             Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
             if (EFI_ERROR (Status)) {\r
               return Status;\r
             }\r
+\r
             if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
               return EFI_INVALID_PARAMETER;\r
             }\r