]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
Rollback patch 14537 & 14538, because patch 14537 is not tested by Laszlo Ersek,...
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
index 2cd666fc707180a3c73f5660479939451ddaeef8..2464aebd095b0b561a2c9f302d52ae1dfabde546 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Parser for IFR binary encoding.\r
 \r
-Copyright (c) 2007 - 2012, 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
@@ -18,6 +18,7 @@ UINT16           mStatementIndex;
 UINT16           mExpressionOpCodeIndex;\r
 \r
 BOOLEAN          mInScopeSubtitle;\r
+extern LIST_ENTRY      gBrowserStorageList;\r
 /**\r
   Initialize Statement header members.\r
 \r
@@ -179,6 +180,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
@@ -220,7 +222,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
@@ -238,19 +240,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
@@ -281,32 +303,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
@@ -319,7 +315,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
@@ -341,12 +337,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
@@ -366,7 +535,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
@@ -413,27 +583,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
@@ -444,7 +630,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
@@ -532,7 +718,6 @@ DestroyExpression (
   FreePool (Expression);\r
 }\r
 \r
-\r
 /**\r
   Free resources of a storage.\r
 \r
@@ -544,47 +729,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
@@ -915,7 +1073,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
@@ -931,7 +1088,6 @@ 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
@@ -1104,7 +1260,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
@@ -1448,76 +1604,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
@@ -1779,8 +1887,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
@@ -1807,7 +1917,7 @@ ParseOpCodes (
       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
       ConditionalExprCount = GetConditionalExpressionCount(ExpressOption);\r