]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
Update Browser to provide the customization possibilities.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
index 87924792a7d57cd3c8e254943f7d027ba861a1e7..1c3ab2bedca4e1e45b6160c7b1ce027827a4501e 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Parser for IFR binary encoding.\r
 \r
-Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>\r
 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
@@ -16,15 +16,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 UINT16           mStatementIndex;\r
 UINT16           mExpressionOpCodeIndex;\r
-\r
+EFI_QUESTION_ID  mUsedQuestionId;\r
 BOOLEAN          mInScopeSubtitle;\r
-BOOLEAN          mInScopeSuppress;\r
-BOOLEAN          mInScopeGrayOut;\r
-BOOLEAN          mInScopeDisable;\r
-FORM_EXPRESSION  *mSuppressExpression;\r
-FORM_EXPRESSION  *mGrayOutExpression;\r
-FORM_EXPRESSION  *mDisableExpression;\r
-\r
+extern LIST_ENTRY      gBrowserStorageList;\r
 /**\r
   Initialize Statement header members.\r
 \r
@@ -44,12 +38,13 @@ CreateStatement (
 {\r
   FORM_BROWSER_STATEMENT    *Statement;\r
   EFI_IFR_STATEMENT_HEADER  *StatementHdr;\r
+  INTN                      ConditionalExprCount; \r
 \r
   if (Form == NULL) {\r
     //\r
-    // We are currently not in a Form Scope, so just skip this Statement\r
+    // Only guid op may out side the form level.\r
     //\r
-    return NULL;\r
+    ASSERT (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_GUID_OP);\r
   }\r
 \r
   Statement = &FormSet->StatementBuffer[mStatementIndex];\r
@@ -63,22 +58,24 @@ CreateStatement (
   Statement->Signature = FORM_BROWSER_STATEMENT_SIGNATURE;\r
 \r
   Statement->Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
+  Statement->OpCode  = (EFI_IFR_OP_HEADER *) OpCodeData;\r
 \r
   StatementHdr = (EFI_IFR_STATEMENT_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
   CopyMem (&Statement->Prompt, &StatementHdr->Prompt, sizeof (EFI_STRING_ID));\r
   CopyMem (&Statement->Help, &StatementHdr->Help, sizeof (EFI_STRING_ID));\r
 \r
-  if (mInScopeSuppress) {\r
-    Statement->SuppressExpression = mSuppressExpression;\r
-  }\r
-\r
-  if (mInScopeGrayOut) {\r
-    Statement->GrayOutExpression = mGrayOutExpression;\r
-  }\r
-\r
-\r
-  if (mInScopeDisable) {\r
-    Statement->DisableExpression = mDisableExpression;\r
+  ConditionalExprCount = GetConditionalExpressionCount(ExpressStatement);\r
+  if (ConditionalExprCount > 0) {\r
+    //\r
+    // Form is inside of suppressif\r
+    //\r
+    \r
+    Statement->Expression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
+                                             (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
+    ASSERT (Statement->Expression != NULL);\r
+    Statement->Expression->Count     = (UINTN) ConditionalExprCount;\r
+    Statement->Expression->Signature = FORM_EXPRESSION_LIST_SIGNATURE;\r
+    CopyMem (Statement->Expression->Expression, GetConditionalExpressionList(ExpressStatement), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
   }\r
 \r
   Statement->InSubtitle = mInScopeSubtitle;\r
@@ -86,8 +83,11 @@ CreateStatement (
   //\r
   // Insert this Statement into current Form\r
   //\r
-  InsertTailList (&Form->StatementListHead, &Statement->Link);\r
-\r
+  if (Form == NULL) {\r
+    InsertTailList (&FormSet->StatementListOSF, &Statement->Link);\r
+  } else {\r
+    InsertTailList (&Form->StatementListHead, &Statement->Link);\r
+  }\r
   return Statement;\r
 }\r
 \r
@@ -184,6 +184,7 @@ CreateQuestion (
   FORMSET_STORAGE          *Storage;\r
   NAME_VALUE_NODE          *NameValueNode;\r
   EFI_STATUS               Status;\r
+  BOOLEAN                  Find;\r
 \r
   Statement = CreateStatement (OpCodeData, FormSet, Form);\r
   if (Statement == NULL) {\r
@@ -225,7 +226,7 @@ CreateQuestion (
     Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
 \r
     if (Storage->VarStoreId == Statement->VarStoreId) {\r
-      Statement->Storage = Storage;\r
+      Statement->Storage = Storage->BrowserStorage;\r
       break;\r
     }\r
 \r
@@ -243,19 +244,39 @@ CreateQuestion (
 \r
     if (Statement->Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
       //\r
-      // Insert to Name/Value varstore list\r
+      // Check whether old string node already exist.\r
       //\r
-      NameValueNode = AllocateZeroPool (sizeof (NAME_VALUE_NODE));\r
-      ASSERT (NameValueNode != NULL);\r
-      NameValueNode->Signature = NAME_VALUE_NODE_SIGNATURE;\r
-      NameValueNode->Name = AllocateCopyPool (StrSize (Statement->VariableName), Statement->VariableName);\r
-      ASSERT (NameValueNode->Name != NULL);\r
-      NameValueNode->Value = AllocateZeroPool (0x10);\r
-      ASSERT (NameValueNode->Value != NULL);\r
-      NameValueNode->EditValue = AllocateZeroPool (0x10);\r
-      ASSERT (NameValueNode->EditValue != NULL);\r
+      Find = FALSE;\r
+      if (!IsListEmpty(&Statement->Storage->NameValueListHead)) {  \r
+        Link = GetFirstNode (&Statement->Storage->NameValueListHead);\r
+        while (!IsNull (&Statement->Storage->NameValueListHead, Link)) {\r
+          NameValueNode = NAME_VALUE_NODE_FROM_LINK (Link);\r
 \r
-      InsertTailList (&Statement->Storage->NameValueListHead, &NameValueNode->Link);\r
+          if (StrCmp (Statement->VariableName, NameValueNode->Name) == 0) {\r
+            Find = TRUE;\r
+            break;\r
+          }\r
+\r
+          Link = GetNextNode (&Statement->Storage->NameValueListHead, Link);\r
+        }\r
+      }\r
+\r
+      if (!Find) {\r
+        //\r
+        // Insert to Name/Value varstore list\r
+        //\r
+        NameValueNode = AllocateZeroPool (sizeof (NAME_VALUE_NODE));\r
+        ASSERT (NameValueNode != NULL);\r
+        NameValueNode->Signature = NAME_VALUE_NODE_SIGNATURE;\r
+        NameValueNode->Name = AllocateCopyPool (StrSize (Statement->VariableName), Statement->VariableName);\r
+        ASSERT (NameValueNode->Name != NULL);\r
+        NameValueNode->Value = AllocateZeroPool (0x10);\r
+        ASSERT (NameValueNode->Value != NULL);\r
+        NameValueNode->EditValue = AllocateZeroPool (0x10);\r
+        ASSERT (NameValueNode->EditValue != NULL);\r
+\r
+        InsertTailList (&Statement->Storage->NameValueListHead, &NameValueNode->Link);\r
+      }\r
     }\r
   }\r
 \r
@@ -286,32 +307,6 @@ CreateExpression (
   return Expression;\r
 }\r
 \r
-\r
-/**\r
-  Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.\r
-\r
-  @param  FormSet                Pointer of the current FormSet\r
-\r
-  @return Pointer to a FORMSET_STORAGE data structure.\r
-\r
-**/\r
-FORMSET_STORAGE *\r
-CreateStorage (\r
-  IN FORM_BROWSER_FORMSET  *FormSet\r
-  )\r
-{\r
-  FORMSET_STORAGE  *Storage;\r
-\r
-  Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
-  ASSERT (Storage != NULL);\r
-  Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
-  InitializeListHead (&Storage->NameValueListHead);\r
-  InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
-\r
-  return Storage;\r
-}\r
-\r
-\r
 /**\r
   Create ConfigHdr string for a storage.\r
 \r
@@ -324,7 +319,7 @@ CreateStorage (
 EFI_STATUS\r
 InitializeConfigHdr (\r
   IN FORM_BROWSER_FORMSET  *FormSet,\r
-  IN OUT FORMSET_STORAGE   *Storage\r
+  IN OUT BROWSER_STORAGE   *Storage\r
   )\r
 {\r
   CHAR16      *Name;\r
@@ -346,12 +341,185 @@ InitializeConfigHdr (
     return EFI_NOT_FOUND;\r
   }\r
 \r
-  Storage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr);\r
-  Storage->SpareStrLen = 0;\r
-\r
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Find the global storage link base on the input storate type, name and guid.\r
+\r
+  @param  StorageType                Storage type.\r
+  @param  StorageGuid                Storage guid.\r
+  @param  StorageName                Storage Name.\r
+\r
+  @return Pointer to a GLOBAL_STORAGE data structure.\r
+\r
+**/\r
+BROWSER_STORAGE *\r
+FindStorageInList (\r
+  IN UINT8                 StorageType,\r
+  IN EFI_GUID              *StorageGuid,\r
+  IN CHAR16                *StorageName\r
+  )\r
+{\r
+  LIST_ENTRY       *Link;\r
+  BROWSER_STORAGE  *BrowserStorage;\r
+\r
+  Link  = GetFirstNode (&gBrowserStorageList);\r
+  while (!IsNull (&gBrowserStorageList, Link)) {\r
+    BrowserStorage = BROWSER_STORAGE_FROM_LINK (Link);\r
+\r
+    if ((BrowserStorage->Type == StorageType) && CompareGuid (&BrowserStorage->Guid, StorageGuid)) {\r
+      if (StorageType == EFI_HII_VARSTORE_NAME_VALUE) {\r
+        return BrowserStorage;\r
+      }\r
+\r
+      if (StrCmp (BrowserStorage->Name, StorageName) == 0) {\r
+        return BrowserStorage;\r
+      }\r
+    }\r
+\r
+    //\r
+    // Get Next Storage.\r
+    //\r
+    Link = GetNextNode (&gBrowserStorageList, Link);\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+/**\r
+  Intialize the Global Storage.\r
+\r
+  @param  BrowserStorage              Pointer to the global storage.\r
+  @param  StorageType                Storage type.\r
+  @param  OpCodeData                 Binary data for this opcode.\r
+\r
+**/\r
+VOID\r
+IntializeBrowserStorage (\r
+  IN BROWSER_STORAGE       *BrowserStorage,\r
+  IN UINT8                 StorageType,\r
+  IN UINT8                 *OpCodeData\r
+  )\r
+{\r
+  switch (StorageType) {\r
+    case EFI_HII_VARSTORE_BUFFER:\r
+      CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
+      CopyMem (&BrowserStorage->Size, &((EFI_IFR_VARSTORE *) OpCodeData)->Size, sizeof (UINT16));\r
+\r
+      BrowserStorage->Buffer     = AllocateZeroPool (BrowserStorage->Size);\r
+      BrowserStorage->EditBuffer = AllocateZeroPool (BrowserStorage->Size);\r
+      break;\r
+\r
+    case EFI_HII_VARSTORE_EFI_VARIABLE:\r
+    case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
+      CopyMem (&BrowserStorage->Guid,       &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid,       sizeof (EFI_GUID));\r
+      CopyMem (&BrowserStorage->Attributes, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Attributes, sizeof (UINT32));\r
+      CopyMem (&BrowserStorage->Size,       &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Size,       sizeof (UINT16));\r
+\r
+      if (StorageType ==  EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+        BrowserStorage->Buffer     = AllocateZeroPool (BrowserStorage->Size);\r
+        BrowserStorage->EditBuffer = AllocateZeroPool (BrowserStorage->Size);\r
+      }\r
+      break;\r
+\r
+    case EFI_HII_VARSTORE_NAME_VALUE:\r
+      CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
+\r
+      InitializeListHead (&BrowserStorage->NameValueListHead);\r
+      break;\r
+\r
+    default:\r
+      break;\r
+  }\r
+}\r
+\r
+/**\r
+  Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.\r
+\r
+  @param  FormSet                    Pointer of the current FormSet\r
+  @param  StorageType                Storage type.\r
+  @param  OpCodeData                 Binary data for this opcode.\r
+\r
+  @return Pointer to a FORMSET_STORAGE data structure.\r
+\r
+**/\r
+FORMSET_STORAGE *\r
+CreateStorage (\r
+  IN FORM_BROWSER_FORMSET  *FormSet,\r
+  IN UINT8                 StorageType,\r
+  IN UINT8                 *OpCodeData\r
+  )\r
+{\r
+  FORMSET_STORAGE         *Storage;\r
+  CHAR16                  *UnicodeString;\r
+  UINT16                  Index;\r
+  BROWSER_STORAGE         *BrowserStorage;\r
+  EFI_GUID                *StorageGuid;\r
+  CHAR8                   *StorageName;\r
+\r
+  UnicodeString = NULL;\r
+  StorageName   = NULL;\r
+  switch (StorageType) {\r
+    case EFI_HII_VARSTORE_BUFFER:\r
+      StorageGuid = (EFI_GUID *) (CHAR8*) &((EFI_IFR_VARSTORE *) OpCodeData)->Guid;\r
+      StorageName = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;\r
+      break;\r
+\r
+    case EFI_HII_VARSTORE_EFI_VARIABLE:\r
+    case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
+      StorageGuid = (EFI_GUID *) (CHAR8*) &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid;\r
+      StorageName = (CHAR8 *) ((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Name;\r
+      break;\r
+\r
+    default:\r
+      ASSERT (StorageType == EFI_HII_VARSTORE_NAME_VALUE);\r
+      StorageGuid = &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid;\r
+      break;\r
+  }\r
+\r
+  if (StorageType != EFI_HII_VARSTORE_NAME_VALUE) {\r
+    ASSERT (StorageName != NULL);\r
+\r
+    UnicodeString = AllocateZeroPool (AsciiStrSize (StorageName) * 2);\r
+    ASSERT (UnicodeString != NULL);\r
+    for (Index = 0; StorageName[Index] != 0; Index++) {\r
+      UnicodeString[Index] = (CHAR16) StorageName[Index];\r
+    }\r
+  }\r
+\r
+  Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
+  ASSERT (Storage != NULL);\r
+  Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
+  InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
+\r
+  BrowserStorage = FindStorageInList(StorageType, StorageGuid, UnicodeString);\r
+  if (BrowserStorage == NULL) {\r
+    BrowserStorage = AllocateZeroPool (sizeof (BROWSER_STORAGE));\r
+    ASSERT (BrowserStorage != NULL);\r
+\r
+    BrowserStorage->Signature = BROWSER_STORAGE_SIGNATURE;\r
+    InsertTailList (&gBrowserStorageList, &BrowserStorage->Link);\r
+\r
+    IntializeBrowserStorage (BrowserStorage, StorageType, OpCodeData);\r
+    BrowserStorage->Type = StorageType;\r
+    if (StorageType != EFI_HII_VARSTORE_NAME_VALUE) {\r
+      BrowserStorage->Name = UnicodeString;\r
+    }\r
+\r
+    InitializeConfigHdr (FormSet, BrowserStorage);\r
+  }\r
+  //\r
+  // Add count because one formset storage use this global storage.\r
+  //\r
+  BrowserStorage->ReferenceCount++;\r
+\r
+  Storage->BrowserStorage = BrowserStorage;\r
+  Storage->ConfigRequest = AllocateCopyPool (StrSize (BrowserStorage->ConfigHdr), BrowserStorage->ConfigHdr);\r
+  Storage->SpareStrLen = 0;\r
+\r
+  return Storage;\r
+}\r
 \r
 /**\r
   Initialize Request Element of a Question. <RequestElement> ::= '&'<BlockName> | '&'<Label>\r
@@ -371,7 +539,8 @@ InitializeRequestElement (
   IN OUT FORM_BROWSER_FORM        *Form\r
   )\r
 {\r
-  FORMSET_STORAGE  *Storage;\r
+  BROWSER_STORAGE  *Storage;\r
+  FORMSET_STORAGE  *FormsetStorage;\r
   UINTN            StrLen;\r
   UINTN            StringSize;\r
   CHAR16           *NewStr;\r
@@ -418,27 +587,43 @@ InitializeRequestElement (
     return EFI_SUCCESS;\r
   }\r
 \r
+  //\r
+  // Find Formset Storage for this Question\r
+  //\r
+  FormsetStorage = NULL;\r
+  Link = GetFirstNode (&FormSet->StorageListHead);\r
+  while (!IsNull (&FormSet->StorageListHead, Link)) {\r
+    FormsetStorage = FORMSET_STORAGE_FROM_LINK (Link);\r
+\r
+    if (FormsetStorage->VarStoreId == Question->VarStoreId) {\r
+      break;\r
+    }\r
+\r
+    Link = GetNextNode (&FormSet->StorageListHead, Link);\r
+  }\r
+  ASSERT (FormsetStorage != NULL);\r
+\r
   //\r
   // Append <RequestElement> to <ConfigRequest>\r
   //\r
-  if (StrLen > Storage->SpareStrLen) {\r
+  if (StrLen > FormsetStorage->SpareStrLen) {\r
     //\r
     // Old String buffer is not sufficient for RequestElement, allocate a new one\r
     //\r
-    StringSize = (Storage->ConfigRequest != NULL) ? StrSize (Storage->ConfigRequest) : sizeof (CHAR16);\r
+    StringSize = (FormsetStorage->ConfigRequest != NULL) ? StrSize (FormsetStorage->ConfigRequest) : sizeof (CHAR16);\r
     NewStr = AllocateZeroPool (StringSize + CONFIG_REQUEST_STRING_INCREMENTAL * sizeof (CHAR16));\r
     ASSERT (NewStr != NULL);\r
-    if (Storage->ConfigRequest != NULL) {\r
-      CopyMem (NewStr, Storage->ConfigRequest, StringSize);\r
-      FreePool (Storage->ConfigRequest);\r
+    if (FormsetStorage->ConfigRequest != NULL) {\r
+      CopyMem (NewStr, FormsetStorage->ConfigRequest, StringSize);\r
+      FreePool (FormsetStorage->ConfigRequest);\r
     }\r
-    Storage->ConfigRequest = NewStr;\r
-    Storage->SpareStrLen   = CONFIG_REQUEST_STRING_INCREMENTAL;\r
+    FormsetStorage->ConfigRequest = NewStr;\r
+    FormsetStorage->SpareStrLen   = CONFIG_REQUEST_STRING_INCREMENTAL;\r
   }\r
 \r
-  StrCat (Storage->ConfigRequest, RequestElement);\r
-  Storage->ElementCount++;\r
-  Storage->SpareStrLen -= StrLen;\r
+  StrCat (FormsetStorage->ConfigRequest, RequestElement);\r
+  FormsetStorage->ElementCount++;\r
+  FormsetStorage->SpareStrLen -= StrLen;\r
 \r
   //\r
   // Update the Config Request info saved in the form.\r
@@ -449,7 +634,7 @@ InitializeRequestElement (
   while (!IsNull (&Form->ConfigRequestHead, Link)) {\r
     ConfigInfo = FORM_BROWSER_CONFIG_REQUEST_FROM_LINK (Link);\r
 \r
-    if (ConfigInfo != NULL && ConfigInfo->Storage->VarStoreId == Storage->VarStoreId) {\r
+    if (ConfigInfo != NULL && ConfigInfo->Storage == Storage) {\r
       Find = TRUE;\r
       break;\r
     }\r
@@ -537,7 +722,6 @@ DestroyExpression (
   FreePool (Expression);\r
 }\r
 \r
-\r
 /**\r
   Free resources of a storage.\r
 \r
@@ -549,47 +733,20 @@ DestroyStorage (
   IN FORMSET_STORAGE   *Storage\r
   )\r
 {\r
-  LIST_ENTRY         *Link;\r
-  NAME_VALUE_NODE    *NameValueNode;\r
-\r
   if (Storage == NULL) {\r
     return;\r
   }\r
 \r
-  if (Storage->Name != NULL) {\r
-    FreePool (Storage->Name);\r
-  }\r
-  if (Storage->Buffer != NULL) {\r
-    FreePool (Storage->Buffer);\r
-  }\r
-  if (Storage->EditBuffer != NULL) {\r
-    FreePool (Storage->EditBuffer);\r
-  }\r
-\r
-  while (!IsListEmpty (&Storage->NameValueListHead)) {\r
-    Link = GetFirstNode (&Storage->NameValueListHead);\r
-    NameValueNode = NAME_VALUE_NODE_FROM_LINK (Link);\r
-    RemoveEntryList (&NameValueNode->Link);\r
-\r
-    if (NameValueNode->Name != NULL) {\r
-      FreePool (NameValueNode->Name);\r
-    }\r
-    if (NameValueNode->Value != NULL) {\r
-      FreePool (NameValueNode->Value);\r
-    }\r
-    if (NameValueNode->EditValue != NULL) {\r
-      FreePool (NameValueNode->EditValue);\r
-    }\r
-    FreePool (NameValueNode);\r
-  }\r
-\r
-  if (Storage->ConfigHdr != NULL) {\r
-    FreePool (Storage->ConfigHdr);\r
-  }\r
   if (Storage->ConfigRequest != NULL) {\r
     FreePool (Storage->ConfigRequest);\r
   }\r
 \r
+  //\r
+  // Minus the reference to the global storage.\r
+  //\r
+  ASSERT (Storage->BrowserStorage->ReferenceCount > 0);\r
+  Storage->BrowserStorage->ReferenceCount--; \r
+\r
   FreePool (Storage);\r
 }\r
 \r
@@ -629,6 +786,9 @@ DestroyStatement (
   while (!IsListEmpty (&Statement->OptionListHead)) {\r
     Link = GetFirstNode (&Statement->OptionListHead);\r
     Option = QUESTION_OPTION_FROM_LINK (Link);\r
+    if (Option->SuppressExpression != NULL) {\r
+      FreePool (Option->SuppressExpression);\r
+    }\r
     RemoveEntryList (&Option->Link);\r
 \r
     FreePool (Option);\r
@@ -656,6 +816,10 @@ DestroyStatement (
     DestroyExpression (Expression);\r
   }\r
 \r
+  if (Statement->Expression != NULL) {\r
+    FreePool (Statement->Expression);\r
+  }\r
+\r
   if (Statement->VariableName != NULL) {\r
     FreePool (Statement->VariableName);\r
   }\r
@@ -723,6 +887,10 @@ DestroyForm (
     FreePool (ConfigInfo);\r
   }\r
 \r
+  if (Form->SuppressExpression != NULL) {\r
+    FreePool (Form->SuppressExpression);\r
+  }\r
+\r
   //\r
   // Free this Form\r
   //\r
@@ -909,7 +1077,6 @@ ParseOpCodes (
   )\r
 {\r
   EFI_STATUS              Status;\r
-  UINT16                  Index;\r
   FORM_BROWSER_FORM       *CurrentForm;\r
   FORM_BROWSER_STATEMENT  *CurrentStatement;\r
   EXPRESSION_OPCODE       *ExpressionOpCode;\r
@@ -925,16 +1092,11 @@ ParseOpCodes (
   QUESTION_DEFAULT        *CurrentDefault;\r
   QUESTION_OPTION         *CurrentOption;\r
   UINT8                   Width;\r
-  CHAR8                   *AsciiString;\r
   UINT16                  NumberOfStatement;\r
   UINT16                  NumberOfExpression;\r
   EFI_IMAGE_ID            *ImageId;\r
   BOOLEAN                 SuppressForQuestion;\r
   BOOLEAN                 SuppressForOption;\r
-  BOOLEAN                 InScopeOptionSuppress;\r
-  FORM_EXPRESSION         *OptionSuppressExpression;\r
-  BOOLEAN                 InScopeFormSuppress;\r
-  FORM_EXPRESSION         *FormSuppressExpression;\r
   UINT16                  DepthOfDisable;\r
   BOOLEAN                 OpCodeDisabled;\r
   BOOLEAN                 SingleOpCodeExpression;\r
@@ -946,15 +1108,13 @@ ParseOpCodes (
   FORMSET_STORAGE         *VarStorage;\r
   LIST_ENTRY              *MapExpressionList;\r
   EFI_VARSTORE_ID         TempVarstoreId;\r
+  BOOLEAN                 InScopeDisable;\r
+  INTN                    ConditionalExprCount;\r
 \r
   mInScopeSubtitle         = FALSE;\r
   SuppressForQuestion      = FALSE;\r
   SuppressForOption        = FALSE;\r
-  InScopeFormSuppress      = FALSE;\r
-  mInScopeSuppress         = FALSE;\r
-  InScopeOptionSuppress    = FALSE;\r
-  mInScopeGrayOut          = FALSE;\r
-  mInScopeDisable          = FALSE;\r
+  InScopeDisable           = FALSE;\r
   DepthOfDisable           = 0;\r
   OpCodeDisabled           = FALSE;\r
   SingleOpCodeExpression   = FALSE;\r
@@ -962,8 +1122,6 @@ ParseOpCodes (
   CurrentExpression        = NULL;\r
   CurrentDefault           = NULL;\r
   CurrentOption            = NULL;\r
-  OptionSuppressExpression = NULL;\r
-  FormSuppressExpression   = NULL;\r
   ImageId                  = NULL;\r
   MapMethod                = NULL;\r
   MapScopeDepth            = 0;\r
@@ -971,6 +1129,7 @@ ParseOpCodes (
   VarStorage               = NULL;\r
   MapExpressionList        = NULL;\r
   TempVarstoreId           = 0;\r
+  ConditionalExprCount     = 0;\r
 \r
   //\r
   // Get the number of Statements and Expressions\r
@@ -978,6 +1137,7 @@ ParseOpCodes (
   CountOpCodes (FormSet, &NumberOfStatement, &NumberOfExpression);\r
 \r
   mStatementIndex = 0;\r
+  mUsedQuestionId = 1;\r
   FormSet->StatementBuffer = AllocateZeroPool (NumberOfStatement * sizeof (FORM_BROWSER_STATEMENT));\r
   if (FormSet->StatementBuffer == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -989,6 +1149,7 @@ ParseOpCodes (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
+  InitializeListHead (&FormSet->StatementListOSF);\r
   InitializeListHead (&FormSet->StorageListHead);\r
   InitializeListHead (&FormSet->DefaultStoreListHead);\r
   InitializeListHead (&FormSet->FormListHead);\r
@@ -1032,7 +1193,7 @@ ParseOpCodes (
 \r
         if (ScopeOpCode == EFI_IFR_DISABLE_IF_OP) {\r
           if (DepthOfDisable == 0) {\r
-            mInScopeDisable = FALSE;\r
+            InScopeDisable = FALSE;\r
             OpCodeDisabled = FALSE;\r
           } else {\r
             DepthOfDisable--;\r
@@ -1063,7 +1224,7 @@ ParseOpCodes (
         CopyMem (&ExpressionOpCode->QuestionId2, &((EFI_IFR_EQ_ID_ID *) OpCodeData)->QuestionId2, sizeof (EFI_QUESTION_ID));\r
         break;\r
 \r
-      case EFI_IFR_EQ_ID_LIST_OP:\r
+      case EFI_IFR_EQ_ID_VAL_LIST_OP:\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
@@ -1105,7 +1266,7 @@ ParseOpCodes (
             while (!IsNull (&FormSet->StorageListHead, Link)) {\r
               VarStorage = FORMSET_STORAGE_FROM_LINK (Link);\r
               if (VarStorage->VarStoreId == ((EFI_IFR_GET *) OpCodeData)->VarStoreId) {\r
-                ExpressionOpCode->VarStorage = VarStorage;\r
+                ExpressionOpCode->VarStorage = VarStorage->BrowserStorage;\r
                 break;\r
               }\r
               Link = GetNextNode (&FormSet->StorageListHead, Link);\r
@@ -1288,7 +1449,7 @@ ParseOpCodes (
         //\r
         SingleOpCodeExpression = FALSE;\r
 \r
-        if (mInScopeDisable && CurrentForm == NULL) {\r
+        if (InScopeDisable && CurrentForm == NULL) {\r
           //\r
           // This is DisableIf expression for Form, it should be a constant expression\r
           //\r
@@ -1347,15 +1508,20 @@ ParseOpCodes (
       InitializeListHead (&CurrentForm->ConfigRequestHead);\r
 \r
       CurrentForm->FormType = STANDARD_MAP_FORM_TYPE;\r
-      CurrentForm->NvUpdateRequired = FALSE;\r
       CopyMem (&CurrentForm->FormId,    &((EFI_IFR_FORM *) OpCodeData)->FormId,    sizeof (UINT16));\r
       CopyMem (&CurrentForm->FormTitle, &((EFI_IFR_FORM *) OpCodeData)->FormTitle, sizeof (EFI_STRING_ID));\r
 \r
-      if (InScopeFormSuppress) {\r
+      ConditionalExprCount = GetConditionalExpressionCount(ExpressForm);\r
+      if ( ConditionalExprCount > 0) {\r
         //\r
         // Form is inside of suppressif\r
         //\r
-        CurrentForm->SuppressExpression = FormSuppressExpression;\r
+        CurrentForm->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
+                                                 (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
+        ASSERT (CurrentForm->SuppressExpression != NULL);\r
+        CurrentForm->SuppressExpression->Count     = (UINTN) ConditionalExprCount;\r
+        CurrentForm->SuppressExpression->Signature = FORM_EXPRESSION_LIST_SIGNATURE;\r
+        CopyMem (CurrentForm->SuppressExpression->Expression, GetConditionalExpressionList(ExpressForm), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
       }\r
 \r
       if (Scope != 0) {\r
@@ -1378,7 +1544,6 @@ ParseOpCodes (
       CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
       ASSERT (CurrentForm != NULL);\r
       CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
-      CurrentForm->NvUpdateRequired = FALSE;\r
       InitializeListHead (&CurrentForm->ExpressionListHead);\r
       InitializeListHead (&CurrentForm->StatementListHead);\r
       InitializeListHead (&CurrentForm->ConfigRequestHead);\r
@@ -1410,11 +1575,17 @@ ParseOpCodes (
         CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
       }\r
 \r
-      if (InScopeFormSuppress) {\r
+      ConditionalExprCount = GetConditionalExpressionCount(ExpressForm);\r
+      if ( ConditionalExprCount > 0) {\r
         //\r
         // Form is inside of suppressif\r
         //\r
-        CurrentForm->SuppressExpression = FormSuppressExpression;\r
+        CurrentForm->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
+                                                 (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
+        ASSERT (CurrentForm->SuppressExpression != NULL);\r
+        CurrentForm->SuppressExpression->Count     = (UINTN) ConditionalExprCount;\r
+        CurrentForm->SuppressExpression->Signature = FORM_EXPRESSION_LIST_SIGNATURE;\r
+        CopyMem (CurrentForm->SuppressExpression->Expression, GetConditionalExpressionList(ExpressForm), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
       }\r
 \r
       if (Scope != 0) {\r
@@ -1437,76 +1608,28 @@ ParseOpCodes (
       //\r
       // Create a buffer Storage for this FormSet\r
       //\r
-      Storage = CreateStorage (FormSet);\r
-      Storage->Type = EFI_HII_VARSTORE_BUFFER;\r
-\r
+      Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_BUFFER, OpCodeData);\r
       CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
-      CopyMem (&Storage->Guid,       &((EFI_IFR_VARSTORE *) OpCodeData)->Guid,       sizeof (EFI_GUID));\r
-      CopyMem (&Storage->Size,       &((EFI_IFR_VARSTORE *) OpCodeData)->Size,       sizeof (UINT16));\r
-\r
-      Storage->Buffer = AllocateZeroPool (Storage->Size);\r
-      Storage->EditBuffer = AllocateZeroPool (Storage->Size);\r
-\r
-      AsciiString = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;\r
-      Storage->Name = AllocateZeroPool (AsciiStrSize (AsciiString) * 2);\r
-      ASSERT (Storage->Name != NULL);\r
-      for (Index = 0; AsciiString[Index] != 0; Index++) {\r
-        Storage->Name[Index] = (CHAR16) AsciiString[Index];\r
-      }\r
-\r
-      //\r
-      // Initialize <ConfigHdr>\r
-      //\r
-      InitializeConfigHdr (FormSet, Storage);\r
       break;\r
 \r
     case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
       //\r
       // Create a name/value Storage for this FormSet\r
       //\r
-      Storage = CreateStorage (FormSet);\r
-      Storage->Type = EFI_HII_VARSTORE_NAME_VALUE;\r
-\r
+      Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_NAME_VALUE, OpCodeData);\r
       CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
-      CopyMem (&Storage->Guid,       &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid,       sizeof (EFI_GUID));\r
-\r
-      //\r
-      // Initialize <ConfigHdr>\r
-      //\r
-      InitializeConfigHdr (FormSet, Storage);\r
       break;\r
 \r
     case EFI_IFR_VARSTORE_EFI_OP:\r
       //\r
       // Create a EFI variable Storage for this FormSet\r
       //\r
-      Storage = CreateStorage (FormSet);\r
-\r
-      CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
-      CopyMem (&Storage->Guid,       &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid,       sizeof (EFI_GUID));\r
-      CopyMem (&Storage->Attributes, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Attributes, sizeof (UINT32));\r
-      CopyMem (&Storage->Size,       &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Size,       sizeof (UINT16));\r
-\r
       if (OpCodeLength < sizeof (EFI_IFR_VARSTORE_EFI)) {\r
-        Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE;\r
-        break;\r
-      } \r
-\r
-      Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER;\r
-      Storage->Buffer = AllocateZeroPool (Storage->Size);\r
-      Storage->EditBuffer = AllocateZeroPool (Storage->Size);\r
-\r
-      AsciiString = (CHAR8 *) ((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Name;\r
-      Storage->Name = AllocateZeroPool (AsciiStrSize (AsciiString) * 2);\r
-      ASSERT (Storage->Name != NULL);\r
-      for (Index = 0; AsciiString[Index] != 0; Index++) {\r
-        Storage->Name[Index] = (CHAR16) AsciiString[Index];\r
+        Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_EFI_VARIABLE, OpCodeData);\r
+      } else {\r
+        Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER, OpCodeData);\r
       }\r
-\r
-      //\r
-      // Initialize <ConfigHdr>\r
-      //\r
-      InitializeConfigHdr (FormSet, Storage);\r
+      CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
       break;\r
 \r
     //\r
@@ -1534,7 +1657,7 @@ ParseOpCodes (
       ASSERT (CurrentStatement != NULL);\r
 \r
       CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
-\r
+      CurrentStatement->FakeQuestionId = mUsedQuestionId++;\r
       if (Scope != 0) {\r
         mInScopeSubtitle = TRUE;\r
       }\r
@@ -1543,13 +1666,14 @@ ParseOpCodes (
     case EFI_IFR_TEXT_OP:\r
       CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
       ASSERT (CurrentStatement != NULL);\r
-\r
+      CurrentStatement->FakeQuestionId = mUsedQuestionId++;\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
+      CurrentStatement->FakeQuestionId = mUsedQuestionId++;\r
       CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
       break;\r
 \r
@@ -1768,8 +1892,10 @@ ParseOpCodes (
 \r
       CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
       CopyMem (&CurrentDefault->DefaultId, &((EFI_IFR_DEFAULT *) OpCodeData)->DefaultId, sizeof (UINT16));\r
-      CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
-      ExtendValueToU64 (&CurrentDefault->Value);\r
+      if (OpCodeLength > OFFSET_OF (EFI_IFR_DEFAULT, Value)) {\r
+        CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, OpCodeLength - OFFSET_OF (EFI_IFR_DEFAULT, Value));\r
+        ExtendValueToU64 (&CurrentDefault->Value);\r
+      }\r
 \r
       //\r
       // Insert to Default Value list of current Question\r
@@ -1792,15 +1918,25 @@ ParseOpCodes (
       CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
       ASSERT (CurrentOption != NULL);\r
       CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
+      CurrentOption->OpCode    = (EFI_IFR_ONE_OF_OPTION *) OpCodeData;\r
 \r
       CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
       CurrentOption->Value.Type = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Type;\r
       CopyMem (&CurrentOption->Text, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Option, sizeof (EFI_STRING_ID));\r
-      CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
+      CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, OpCodeLength - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value));\r
       ExtendValueToU64 (&CurrentOption->Value);\r
 \r
-      if (InScopeOptionSuppress) {\r
-        CurrentOption->SuppressExpression = OptionSuppressExpression;\r
+      ConditionalExprCount = GetConditionalExpressionCount(ExpressOption);\r
+      if ( ConditionalExprCount > 0) {\r
+        //\r
+        // Form is inside of suppressif\r
+        //\r
+        CurrentOption->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
+                                                 (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
+        ASSERT (CurrentOption->SuppressExpression != NULL);\r
+        CurrentOption->SuppressExpression->Count     = (UINTN) ConditionalExprCount;\r
+        CurrentOption->SuppressExpression->Signature = FORM_EXPRESSION_LIST_SIGNATURE;\r
+        CopyMem (CurrentOption->SuppressExpression->Expression, GetConditionalExpressionList(ExpressOption), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
       }\r
 \r
       //\r
@@ -1841,6 +1977,10 @@ ParseOpCodes (
         CurrentStatement->StorageWidth = (UINT16) (CurrentStatement->MaxContainers * Width);\r
         CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
         CurrentStatement->ValueType = CurrentOption->Value.Type;\r
+        if (CurrentStatement->HiiValue.Type == EFI_IFR_TYPE_BUFFER) {\r
+          CurrentStatement->HiiValue.Buffer = CurrentStatement->BufferValue;\r
+          CurrentStatement->HiiValue.BufferLen = CurrentStatement->StorageWidth;\r
+        }\r
 \r
         InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
       }\r
@@ -1888,14 +2028,11 @@ ParseOpCodes (
       }\r
 \r
       if (SuppressForOption) {\r
-        InScopeOptionSuppress = TRUE;\r
-        OptionSuppressExpression = CurrentExpression;\r
+        PushConditionalExpression(CurrentExpression, ExpressOption);       \r
       } else if (SuppressForQuestion) {\r
-        mInScopeSuppress = TRUE;\r
-        mSuppressExpression = CurrentExpression;\r
+        PushConditionalExpression(CurrentExpression, ExpressStatement);  \r
       } else {\r
-        InScopeFormSuppress = TRUE;\r
-        FormSuppressExpression = CurrentExpression;\r
+        PushConditionalExpression(CurrentExpression, ExpressForm);  \r
       }\r
 \r
       //\r
@@ -1914,9 +2051,7 @@ ParseOpCodes (
       CurrentExpression = CreateExpression (CurrentForm);\r
       CurrentExpression->Type = EFI_HII_EXPRESSION_GRAY_OUT_IF;\r
       InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
-\r
-      mInScopeGrayOut = TRUE;\r
-      mGrayOutExpression = CurrentExpression;\r
+      PushConditionalExpression(CurrentExpression, ExpressStatement);\r
 \r
       //\r
       // Take a look at next OpCode to see whether current expression consists\r
@@ -1943,12 +2078,11 @@ ParseOpCodes (
         // This is DisableIf for Question, enqueue it to Form expression list\r
         //\r
         InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
+        PushConditionalExpression(CurrentExpression, ExpressStatement);\r
       }\r
 \r
-      mDisableExpression = CurrentExpression;\r
-      mInScopeDisable    = TRUE;\r
-      OpCodeDisabled     = FALSE;\r
-\r
+      OpCodeDisabled  = FALSE;\r
+      InScopeDisable  = TRUE;\r
       //\r
       // Take a look at next OpCode to see whether current expression consists\r
       // of single OpCode\r
@@ -2142,45 +2276,8 @@ ParseOpCodes (
     //\r
     // Vendor specific\r
     //\r
-    case EFI_IFR_GUID_OP:\r
-      if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
-        //\r
-        // Tiano specific GUIDed opcodes\r
-        //\r
-        switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
-        case EFI_IFR_EXTEND_OP_LABEL:\r
-          //\r
-          // just ignore label\r
-          //\r
-          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
-              &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
-              );\r
-          }\r
-          break;\r
-\r
-        case EFI_IFR_EXTEND_OP_CLASS:\r
-          CopyMem (&FormSet->Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
-          break;\r
-\r
-        case EFI_IFR_EXTEND_OP_SUBCLASS:\r
-          CopyMem (&FormSet->SubClass, &((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass, sizeof (UINT16));\r
-          break;\r
-\r
-        default:\r
-          break;\r
-        }\r
-      }\r
-\r
+    case EFI_IFR_GUID_OP:     \r
+      CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
       break;\r
 \r
     //\r
@@ -2231,20 +2328,23 @@ ParseOpCodes (
 \r
       case EFI_IFR_SUPPRESS_IF_OP:\r
         if (SuppressForOption) {\r
-          InScopeOptionSuppress = FALSE;\r
+          PopConditionalExpression(ExpressOption);      \r
         } else if (SuppressForQuestion) {\r
-          mInScopeSuppress = FALSE;\r
+          PopConditionalExpression(ExpressStatement);\r
         } else {\r
-          InScopeFormSuppress = FALSE;\r
+          PopConditionalExpression(ExpressForm);\r
         }\r
         break;\r
 \r
       case EFI_IFR_GRAY_OUT_IF_OP:\r
-        mInScopeGrayOut = FALSE;\r
+        PopConditionalExpression(ExpressStatement);\r
         break;\r
 \r
       case EFI_IFR_DISABLE_IF_OP:\r
-        mInScopeDisable = FALSE;\r
+        if (CurrentForm != NULL) {\r
+          PopConditionalExpression(ExpressStatement);\r
+        }\r
+        InScopeDisable = FALSE;\r
         OpCodeDisabled = FALSE;\r
         break;\r
 \r
@@ -2276,7 +2376,7 @@ ParseOpCodes (
 \r
       default:\r
         if (IsExpressionOpCode (ScopeOpCode)) {\r
-          if (mInScopeDisable && CurrentForm == NULL) {\r
+          if (InScopeDisable && CurrentForm == NULL) {\r
             //\r
             // This is DisableIf expression for Form, it should be a constant expression\r
             //\r