]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
Update the logic in browser core, use config routine protocol instead of config acces...
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Setup.c
index 7975a1df19c9579fb050110d1b541a8161c2f24b..66238e055f29b3949dd91ce6e5e4468c1c15a5f6 100644 (file)
@@ -645,6 +645,17 @@ BrowserCallback (
         }\r
       }\r
 \r
+      if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE ||\r
+          Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
+        if (mSystemLevelFormSet == NULL || mSystemLevelFormSet->HiiHandle == NULL) {\r
+          return EFI_NOT_FOUND;\r
+        }\r
+\r
+        if (Storage->HiiHandle != mSystemLevelFormSet->HiiHandle) {\r
+          continue;\r
+        }\r
+      }\r
+\r
       Status = ProcessStorage (&TotalSize, &ResultsData, RetrieveData, Storage);\r
       if (EFI_ERROR (Status)) {\r
         return Status;\r
@@ -1259,7 +1270,6 @@ GetQuestionValue (
   BOOLEAN             IsString;\r
   CHAR16              TemStr[5];\r
   UINT8               DigitUint8;\r
-  UINT8               *TemBuffer;\r
 \r
   Status = EFI_SUCCESS;\r
   Value  = NULL;\r
@@ -1476,147 +1486,118 @@ GetQuestionValue (
       FreePool (Value);\r
     }\r
   } else {\r
-    if (Storage->Type == EFI_HII_VARSTORE_BUFFER || Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
-      //\r
-      // Request current settings from Configuration Driver\r
-      //\r
-      if (FormSet->ConfigAccess == NULL) {\r
-        return EFI_NOT_FOUND;\r
-      }\r
-\r
-      //\r
-      // <ConfigRequest> ::= <ConfigHdr> + <BlockName> ||\r
-      //                   <ConfigHdr> + "&" + <VariableName>\r
-      //\r
-      if (IsBufferStorage) {\r
-        Length = StrLen (Storage->ConfigHdr);\r
-        Length += StrLen (Question->BlockName);\r
-      } else {\r
-        Length = StrLen (Storage->ConfigHdr);\r
-        Length += StrLen (Question->VariableName) + 1;\r
-      }\r
-      ConfigRequest = AllocateZeroPool ((Length + 1) * sizeof (CHAR16));\r
-      ASSERT (ConfigRequest != NULL);\r
+    //\r
+    // <ConfigRequest> ::= <ConfigHdr> + <BlockName> ||\r
+    //                   <ConfigHdr> + "&" + <VariableName>\r
+    //\r
+    if (IsBufferStorage) {\r
+      Length = StrLen (Storage->ConfigHdr);\r
+      Length += StrLen (Question->BlockName);\r
+    } else {\r
+      Length = StrLen (Storage->ConfigHdr);\r
+      Length += StrLen (Question->VariableName) + 1;\r
+    }\r
+    ConfigRequest = AllocateZeroPool ((Length + 1) * sizeof (CHAR16));\r
+    ASSERT (ConfigRequest != NULL);\r
 \r
-      StrCpy (ConfigRequest, Storage->ConfigHdr);\r
-      if (IsBufferStorage) {\r
-        StrCat (ConfigRequest, Question->BlockName);\r
-      } else {\r
-        StrCat (ConfigRequest, L"&");\r
-        StrCat (ConfigRequest, Question->VariableName);\r
-      }\r
+    StrCpy (ConfigRequest, Storage->ConfigHdr);\r
+    if (IsBufferStorage) {\r
+      StrCat (ConfigRequest, Question->BlockName);\r
+    } else {\r
+      StrCat (ConfigRequest, L"&");\r
+      StrCat (ConfigRequest, Question->VariableName);\r
+    }\r
 \r
-      Status = FormSet->ConfigAccess->ExtractConfig (\r
-                                        FormSet->ConfigAccess,\r
-                                        ConfigRequest,\r
-                                        &Progress,\r
-                                        &Result\r
-                                        );\r
-      FreePool (ConfigRequest);\r
-      if (EFI_ERROR (Status)) {\r
-        return Status;\r
-      }\r
+    //\r
+    // Request current settings from Configuration Driver\r
+    //\r
+    Status = mHiiConfigRouting->ExtractConfig (\r
+                                      mHiiConfigRouting,\r
+                                      ConfigRequest,\r
+                                      &Progress,\r
+                                      &Result\r
+                                      );\r
+    FreePool (ConfigRequest);\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
 \r
-      //\r
-      // Skip <ConfigRequest>\r
-      //\r
-      if (IsBufferStorage) {\r
-        Value = StrStr (Result, L"&VALUE");\r
-        if (Value == NULL) {\r
-          FreePool (Result);\r
-          return EFI_NOT_FOUND;\r
-        }\r
-        //\r
-        // Skip "&VALUE"\r
-        //\r
-        Value = Value + 6;\r
-      } else {\r
-        Value = Result + Length;\r
-      }\r
-      if (*Value != '=') {\r
+    //\r
+    // Skip <ConfigRequest>\r
+    //\r
+    if (IsBufferStorage) {\r
+      Value = StrStr (Result, L"&VALUE");\r
+      if (Value == NULL) {\r
         FreePool (Result);\r
         return EFI_NOT_FOUND;\r
       }\r
       //\r
-      // Skip '=', point to value\r
+      // Skip "&VALUE"\r
       //\r
-      Value = Value + 1;\r
+      Value = Value + 6;\r
+    } else {\r
+      Value = Result + Length;\r
+    }\r
+    if (*Value != '=') {\r
+      FreePool (Result);\r
+      return EFI_NOT_FOUND;\r
+    }\r
+    //\r
+    // Skip '=', point to value\r
+    //\r
+    Value = Value + 1;\r
 \r
+    //\r
+    // Suppress <AltResp> if any\r
+    //\r
+    StringPtr = Value;\r
+    while (*StringPtr != L'\0' && *StringPtr != L'&') {\r
+      StringPtr++;\r
+    }\r
+    *StringPtr = L'\0';\r
+\r
+    LengthStr = StrLen (Value);\r
+    Status    = EFI_SUCCESS;\r
+    if (!IsBufferStorage && IsString) {\r
       //\r
-      // Suppress <AltResp> if any\r
+      // Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"\r
+      // Add string tail char L'\0' into Length\r
       //\r
-      StringPtr = Value;\r
-      while (*StringPtr != L'\0' && *StringPtr != L'&') {\r
-        StringPtr++;\r
-      }\r
-      *StringPtr = L'\0';\r
-\r
-      LengthStr = StrLen (Value);\r
-      Status    = EFI_SUCCESS;\r
-      if (!IsBufferStorage && IsString) {\r
+      Length    = StorageWidth + sizeof (CHAR16);\r
+      if (Length < ((LengthStr / 4 + 1) * 2)) {\r
+        Status = EFI_BUFFER_TOO_SMALL;\r
+      } else {\r
+        StringPtr = (CHAR16 *) Dst;\r
+        ZeroMem (TemStr, sizeof (TemStr));\r
+        for (Index = 0; Index < LengthStr; Index += 4) {\r
+          StrnCpy (TemStr, Value + Index, 4);\r
+          StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);\r
+        }\r
         //\r
-        // Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"\r
-        // Add string tail char L'\0' into Length\r
+        // Add tailing L'\0' character\r
         //\r
-        Length    = StorageWidth + sizeof (CHAR16);\r
-        if (Length < ((LengthStr / 4 + 1) * 2)) {\r
-          Status = EFI_BUFFER_TOO_SMALL;\r
-        } else {\r
-          StringPtr = (CHAR16 *) Dst;\r
-          ZeroMem (TemStr, sizeof (TemStr));\r
-          for (Index = 0; Index < LengthStr; Index += 4) {\r
-            StrnCpy (TemStr, Value + Index, 4);\r
-            StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);\r
-          }\r
-          //\r
-          // Add tailing L'\0' character\r
-          //\r
-          StringPtr[Index/4] = L'\0';\r
-        }\r
+        StringPtr[Index/4] = L'\0';\r
+      }\r
+    } else {\r
+      if (StorageWidth < ((LengthStr + 1) / 2)) {\r
+        Status = EFI_BUFFER_TOO_SMALL;\r
       } else {\r
-        if (StorageWidth < ((LengthStr + 1) / 2)) {\r
-          Status = EFI_BUFFER_TOO_SMALL;\r
-        } else {\r
-          ZeroMem (TemStr, sizeof (TemStr));\r
-          for (Index = 0; Index < LengthStr; Index ++) {\r
-            TemStr[0] = Value[LengthStr - Index - 1];\r
-            DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
-            if ((Index & 1) == 0) {\r
-              Dst [Index/2] = DigitUint8;\r
-            } else {\r
-              Dst [Index/2] = (UINT8) ((DigitUint8 << 4) + Dst [Index/2]);\r
-            }\r
+        ZeroMem (TemStr, sizeof (TemStr));\r
+        for (Index = 0; Index < LengthStr; Index ++) {\r
+          TemStr[0] = Value[LengthStr - Index - 1];\r
+          DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+          if ((Index & 1) == 0) {\r
+            Dst [Index/2] = DigitUint8;\r
+          } else {\r
+            Dst [Index/2] = (UINT8) ((DigitUint8 << 4) + Dst [Index/2]);\r
           }\r
         }\r
       }\r
+    }\r
 \r
-      if (EFI_ERROR (Status)) {\r
-        FreePool (Result);\r
-        return Status;\r
-      }\r
-    } else if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
-      TemBuffer = NULL;\r
-      TemBuffer = AllocateZeroPool (Storage->Size);\r
-      if (TemBuffer == NULL) {\r
-        Status = EFI_OUT_OF_RESOURCES;\r
-        return Status;\r
-      }\r
-      Length = Storage->Size;\r
-      Status = gRT->GetVariable (\r
-                       Storage->Name,\r
-                       &Storage->Guid,\r
-                       NULL,\r
-                       &Length,\r
-                       TemBuffer\r
-                       );\r
-      if (EFI_ERROR (Status)) {\r
-        FreePool (TemBuffer);\r
-        return Status;\r
-      }\r
-\r
-      CopyMem (Dst, TemBuffer + Question->VarStoreInfo.VarOffset, StorageWidth);\r
-\r
-      FreePool (TemBuffer);\r
+    if (EFI_ERROR (Status)) {\r
+      FreePool (Result);\r
+      return Status;\r
     }\r
 \r
     //\r
@@ -1860,111 +1841,78 @@ SetQuestionValue (
       }\r
     }\r
   } else if (SetValueTo == GetSetValueWithHiiDriver) {\r
-    if (Storage->Type == EFI_HII_VARSTORE_BUFFER || Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
-      //\r
-      // <ConfigResp> ::= <ConfigHdr> + <BlockName> + "&VALUE=" + "<HexCh>StorageWidth * 2" ||\r
-      //                <ConfigHdr> + "&" + <VariableName> + "=" + "<string>"\r
-      //\r
-      if (IsBufferStorage) {\r
-        Length = StrLen (Question->BlockName) + 7;\r
-      } else {\r
-        Length = StrLen (Question->VariableName) + 2;\r
-      }\r
-      if (!IsBufferStorage && IsString) {\r
-        Length += (StrLen ((CHAR16 *) Src) * 4);\r
-      } else {\r
-        Length += (StorageWidth * 2);\r
-      }\r
-      ConfigResp = AllocateZeroPool ((StrLen (Storage->ConfigHdr) + Length + 1) * sizeof (CHAR16));\r
-      ASSERT (ConfigResp != NULL);\r
-\r
-      StrCpy (ConfigResp, Storage->ConfigHdr);\r
-      if (IsBufferStorage) {\r
-        StrCat (ConfigResp, Question->BlockName);\r
-        StrCat (ConfigResp, L"&VALUE=");\r
-      } else {\r
-        StrCat (ConfigResp, L"&");\r
-        StrCat (ConfigResp, Question->VariableName);\r
-        StrCat (ConfigResp, L"=");\r
-      }\r
+    //\r
+    // <ConfigResp> ::= <ConfigHdr> + <BlockName> + "&VALUE=" + "<HexCh>StorageWidth * 2" ||\r
+    //                <ConfigHdr> + "&" + <VariableName> + "=" + "<string>"\r
+    //\r
+    if (IsBufferStorage) {\r
+      Length = StrLen (Question->BlockName) + 7;\r
+    } else {\r
+      Length = StrLen (Question->VariableName) + 2;\r
+    }\r
+    if (!IsBufferStorage && IsString) {\r
+      Length += (StrLen ((CHAR16 *) Src) * 4);\r
+    } else {\r
+      Length += (StorageWidth * 2);\r
+    }\r
+    ConfigResp = AllocateZeroPool ((StrLen (Storage->ConfigHdr) + Length + 1) * sizeof (CHAR16));\r
+    ASSERT (ConfigResp != NULL);\r
 \r
-      Value = ConfigResp + StrLen (ConfigResp);\r
+    StrCpy (ConfigResp, Storage->ConfigHdr);\r
+    if (IsBufferStorage) {\r
+      StrCat (ConfigResp, Question->BlockName);\r
+      StrCat (ConfigResp, L"&VALUE=");\r
+    } else {\r
+      StrCat (ConfigResp, L"&");\r
+      StrCat (ConfigResp, Question->VariableName);\r
+      StrCat (ConfigResp, L"=");\r
+    }\r
 \r
-      if (!IsBufferStorage && IsString) {\r
-        //\r
-        // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
-        //\r
-        TemName = (CHAR16 *) Src;\r
-        TemString = Value;\r
-        for (; *TemName != L'\0'; TemName++) {\r
-          TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);\r
-        }\r
-      } else {\r
-        //\r
-        // Convert Buffer to Hex String\r
-        //\r
-        TemBuffer = Src + StorageWidth - 1;\r
-        TemString = Value;\r
-        for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {\r
-          TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
-        }\r
-      }\r
+    Value = ConfigResp + StrLen (ConfigResp);\r
 \r
+    if (!IsBufferStorage && IsString) {\r
       //\r
-      // Convert to lower char.\r
+      // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
       //\r
-      for (TemString = Value; *Value != L'\0'; Value++) {\r
-        if (*Value >= L'A' && *Value <= L'Z') {\r
-          *Value = (CHAR16) (*Value - L'A' + L'a');\r
-        }\r
+      TemName = (CHAR16 *) Src;\r
+      TemString = Value;\r
+      for (; *TemName != L'\0'; TemName++) {\r
+        TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);\r
       }\r
-\r
+    } else {\r
       //\r
-      // Submit Question Value to Configuration Driver\r
+      // Convert Buffer to Hex String\r
       //\r
-      if (FormSet->ConfigAccess != NULL) {\r
-        Status = FormSet->ConfigAccess->RouteConfig (\r
-                                          FormSet->ConfigAccess,\r
-                                          ConfigResp,\r
-                                          &Progress\r
-                                          );\r
-        if (EFI_ERROR (Status)) {\r
-          FreePool (ConfigResp);\r
-          return Status;\r
-        }\r
-      }\r
-      FreePool (ConfigResp);\r
-      \r
-    } else if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
-      TemBuffer = NULL;\r
-      TemBuffer = AllocateZeroPool(Storage->Size);\r
-      if (TemBuffer == NULL) {\r
-        Status = EFI_OUT_OF_RESOURCES;\r
-        return Status;\r
+      TemBuffer = Src + StorageWidth - 1;\r
+      TemString = Value;\r
+      for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {\r
+        TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
       }\r
-      Length = Storage->Size;\r
-      Status = gRT->GetVariable (\r
-                       Storage->Name,\r
-                       &Storage->Guid,\r
-                       NULL,\r
-                       &Length,\r
-                       TemBuffer\r
-                       );\r
-\r
-      CopyMem (TemBuffer + Question->VarStoreInfo.VarOffset, Src, StorageWidth);\r
-      \r
-      Status = gRT->SetVariable (\r
-                       Storage->Name,\r
-                       &Storage->Guid,\r
-                       Storage->Attributes,\r
-                       Storage->Size,\r
-                       TemBuffer\r
-                       );\r
-      FreePool (TemBuffer);\r
-      if (EFI_ERROR (Status)){\r
-        return Status;\r
+    }\r
+\r
+    //\r
+    // Convert to lower char.\r
+    //\r
+    for (TemString = Value; *Value != L'\0'; Value++) {\r
+      if (*Value >= L'A' && *Value <= L'Z') {\r
+        *Value = (CHAR16) (*Value - L'A' + L'a');\r
       }\r
     }\r
+\r
+    //\r
+    // Submit Question Value to Configuration Driver\r
+    //\r
+    Status = mHiiConfigRouting->RouteConfig (\r
+                                      mHiiConfigRouting,\r
+                                      ConfigResp,\r
+                                      &Progress\r
+                                      );\r
+    if (EFI_ERROR (Status)) {\r
+      FreePool (ConfigResp);\r
+      return Status;\r
+    }\r
+    FreePool (ConfigResp);\r
+    \r
     //\r
     // Sync storage, from editbuffer to buffer.\r
     //\r
@@ -2511,8 +2459,6 @@ SubmitForm (
   EFI_STRING              Progress;\r
   BROWSER_STORAGE         *Storage;\r
   FORMSET_STORAGE         *FormSetStorage;\r
-  UINTN                   BufferSize;\r
-  UINT8                   *TmpBuf;  \r
   FORM_BROWSER_FORMSET    *LocalFormSet;\r
   FORM_BROWSER_CONFIG_REQUEST  *ConfigInfo;\r
 \r
@@ -2564,72 +2510,18 @@ SubmitForm (
       }\r
 \r
       //\r
-      // 2. Set value to hii driver or efi variable.\r
+      // 2. Set value to hii config routine protocol.\r
       //\r
-      if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
-          Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
-        //\r
-        // Send <ConfigResp> to Configuration Driver\r
-        //\r
-        if (FormSet->ConfigAccess != NULL) {\r
-          Status = FormSet->ConfigAccess->RouteConfig (\r
-                                            FormSet->ConfigAccess,\r
-                                            ConfigResp,\r
-                                            &Progress\r
-                                            );\r
-          if (EFI_ERROR (Status)) {\r
-            FreePool (ConfigResp);\r
-            return Status;\r
-          }\r
-        }\r
-      } else if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
-        TmpBuf = NULL;\r
-        TmpBuf = AllocateZeroPool(Storage->Size);\r
-        if (TmpBuf == NULL) {\r
-          Status = EFI_OUT_OF_RESOURCES;\r
-          return Status;\r
-        }\r
-\r
-        BufferSize = Storage->Size;\r
-        Status = gRT->GetVariable (\r
-                         Storage->Name,\r
-                         &Storage->Guid,\r
-                         NULL,\r
-                         &BufferSize,\r
-                         TmpBuf\r
-                         );\r
-        if (EFI_ERROR (Status)) {\r
-          FreePool (TmpBuf);\r
-          FreePool (ConfigResp);\r
-          return Status;\r
-        }\r
-        ASSERT (BufferSize == Storage->Size);      \r
-        Status = mHiiConfigRouting->ConfigToBlock (\r
-                                      mHiiConfigRouting,\r
-                                      ConfigResp,\r
-                                      TmpBuf,\r
-                                      &BufferSize,\r
-                                      &Progress\r
-                                      );\r
-        if (EFI_ERROR (Status)) {\r
-          FreePool (TmpBuf);\r
-          FreePool (ConfigResp);\r
-          return Status;\r
-        }\r
-\r
-        Status = gRT->SetVariable (\r
-                         Storage->Name,\r
-                         &Storage->Guid,\r
-                         Storage->Attributes,\r
-                         Storage->Size,\r
-                         TmpBuf\r
-                         );\r
-        FreePool (TmpBuf);\r
-        if (EFI_ERROR (Status)) {\r
-          FreePool (ConfigResp);\r
-          return Status;\r
-        }\r
+      Status = mHiiConfigRouting->RouteConfig (\r
+                                        mHiiConfigRouting,\r
+                                        ConfigResp,\r
+                                        &Progress\r
+                                        );\r
+      if (EFI_ERROR (Status)) {\r
+        FreePool (ConfigResp);\r
+        return Status;\r
       }\r
+\r
       FreePool (ConfigResp);\r
       //\r
       // 3. Config success, update storage shadow Buffer, only update the data belong to this form.\r
@@ -2670,69 +2562,19 @@ SubmitForm (
         return Status;\r
       }\r
 \r
-      if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
-          Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
-\r
-        //\r
-        // 2. Send <ConfigResp> to Configuration Driver\r
-        //\r
-        if (FormSet->ConfigAccess != NULL) {\r
-          Status = FormSet->ConfigAccess->RouteConfig (\r
-                                            FormSet->ConfigAccess,\r
-                                            ConfigResp,\r
-                                            &Progress\r
-                                            );\r
-          if (EFI_ERROR (Status)) {\r
-            FreePool (ConfigResp);\r
-            return Status;\r
-          }\r
-        }\r
-      } else if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
-        //\r
-        // 1&2. Set the edit data to the variable.\r
-        //\r
-        TmpBuf = NULL;\r
-        TmpBuf = AllocateZeroPool (Storage->Size);\r
-        if (TmpBuf == NULL) {\r
-          Status = EFI_OUT_OF_RESOURCES;\r
-          return Status;\r
-        }        \r
-        BufferSize = Storage->Size;\r
-        Status = gRT->GetVariable (\r
-                       Storage->Name,\r
-                       &Storage->Guid,\r
-                       NULL,\r
-                       &BufferSize,\r
-                       TmpBuf\r
-                       );\r
-        ASSERT (BufferSize == Storage->Size);      \r
-        Status = mHiiConfigRouting->ConfigToBlock (\r
-                                      mHiiConfigRouting,\r
-                                      ConfigResp,\r
-                                      TmpBuf,\r
-                                      &BufferSize,\r
-                                      &Progress\r
-                                      );\r
-        if (EFI_ERROR (Status)) {\r
-          FreePool (TmpBuf);\r
-          FreePool (ConfigResp);\r
-          return Status;\r
-        }\r
-\r
-        Status = gRT->SetVariable (\r
-                         Storage->Name,\r
-                         &Storage->Guid,\r
-                         Storage->Attributes,\r
-                         Storage->Size,\r
-                         TmpBuf\r
-                         );\r
-        if (EFI_ERROR (Status)) {\r
-          FreePool (TmpBuf);\r
-          FreePool (ConfigResp);\r
-          return Status;\r
-        }\r
-        FreePool (TmpBuf);\r
+      //\r
+      // 2. Send <ConfigResp> to Routine config Protocol.\r
+      //\r
+      Status = mHiiConfigRouting->RouteConfig (\r
+                                        mHiiConfigRouting,\r
+                                        ConfigResp,\r
+                                        &Progress\r
+                                        );\r
+      if (EFI_ERROR (Status)) {\r
+        FreePool (ConfigResp);\r
+        return Status;\r
       }\r
+\r
       FreePool (ConfigResp);\r
       //\r
       // 3. Config success, update storage shadow Buffer\r
@@ -2817,9 +2659,7 @@ GetDefaultValueFromAltCfg (
   Value         = NULL;\r
   Storage       = Question->Storage;\r
 \r
-  if ((Storage == NULL) || \r
-      (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) || \r
-      (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
+  if ((Storage == NULL) || (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE)) {\r
     return Status;\r
   }\r
 \r
@@ -2838,7 +2678,11 @@ GetDefaultValueFromAltCfg (
     Dst = (UINT8 *) &Question->HiiValue.Value;\r
   }\r
 \r
-  IsBufferStorage = (BOOLEAN) ((Storage->Type == EFI_HII_VARSTORE_BUFFER) ? TRUE : FALSE);\r
+  if (Storage->Type == EFI_HII_VARSTORE_BUFFER || Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+    IsBufferStorage = TRUE;\r
+  } else {\r
+    IsBufferStorage = FALSE;\r
+  }\r
   IsString = (BOOLEAN) ((Question->HiiValue.Type == EFI_IFR_TYPE_STRING) ?  TRUE : FALSE);\r
 \r
   //\r
@@ -2863,8 +2707,8 @@ GetDefaultValueFromAltCfg (
     StrCat (ConfigRequest, Question->VariableName);\r
   }\r
 \r
-  Status = FormSet->ConfigAccess->ExtractConfig (\r
-                                    FormSet->ConfigAccess,\r
+  Status = mHiiConfigRouting->ExtractConfig (\r
+                                    mHiiConfigRouting,\r
                                     ConfigRequest,\r
                                     &Progress,\r
                                     &Result\r
@@ -2894,6 +2738,11 @@ GetDefaultValueFromAltCfg (
     goto Done;\r
   }\r
 \r
+  if (ConfigResp == NULL) {\r
+    Status = EFI_NOT_FOUND;\r
+    goto Done;\r
+  }\r
+\r
   //\r
   // Skip <ConfigRequest>\r
   //\r
@@ -3880,18 +3729,20 @@ CleanBrowserStorage (
     Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
     Link = GetNextNode (&FormSet->StorageListHead, Link);\r
 \r
-    if ((Storage->BrowserStorage->Type != EFI_HII_VARSTORE_BUFFER) && \r
-        (Storage->BrowserStorage->Type != EFI_HII_VARSTORE_NAME_VALUE) && \r
-        (Storage->BrowserStorage->Type != EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
-      continue;\r
-    }\r
+    if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+      if (Storage->ConfigRequest == NULL || Storage->BrowserStorage->ConfigRequest == NULL) {\r
+        continue;\r
+      }\r
 \r
-    if (Storage->ConfigRequest == NULL || Storage->BrowserStorage->ConfigRequest == NULL) {\r
-      continue;\r
+      ConfigRequest = FormSet->QuestionInited ? Storage->ConfigRequest : Storage->ConfigElements;\r
+      RemoveConfigRequest (Storage->BrowserStorage, ConfigRequest);\r
+    } else if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER ||\r
+               Storage->BrowserStorage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
+      if (Storage->BrowserStorage->ConfigRequest != NULL) { \r
+        FreePool (Storage->BrowserStorage->ConfigRequest);\r
+      }\r
+      Storage->BrowserStorage->Initialized = FALSE;\r
     }\r
-\r
-    ConfigRequest = FormSet->QuestionInited ? Storage->ConfigRequest : Storage->ConfigElements;\r
-    RemoveConfigRequest (Storage->BrowserStorage, ConfigRequest);\r
   }\r
 }\r
 \r
@@ -4244,86 +4095,57 @@ LoadStorage (
         ConfigRequestAdjust(Storage);\r
         return;\r
       }\r
-\r
-      Status = gRT->GetVariable (\r
-                       Storage->BrowserStorage->Name,\r
-                       &Storage->BrowserStorage->Guid,\r
-                       NULL,\r
-                       (UINTN*)&Storage->BrowserStorage->Size,\r
-                       Storage->BrowserStorage->EditBuffer\r
-                       );\r
-      //\r
-      // If get variable fail, extract default from IFR binary\r
-      //\r
-      if (EFI_ERROR (Status)) {\r
-        ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage->BrowserStorage, TRUE);\r
-      }\r
-\r
-      Storage->BrowserStorage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigRequest), Storage->ConfigRequest);\r
-      //\r
-      // Input NULL for ConfigRequest field means sync all fields from editbuffer to buffer. \r
-      //\r
-      SynchronizeStorage(FormSet, Storage->BrowserStorage, NULL, TRUE);\r
       break;\r
 \r
     case EFI_HII_VARSTORE_BUFFER:\r
     case EFI_HII_VARSTORE_NAME_VALUE:\r
       //\r
-      // Skip if there is no RequestElement\r
+      // Skip if there is no RequestElement or data has initilized.\r
       //\r
-      if (Storage->ElementCount == 0) {\r
+      if (Storage->ElementCount == 0 || Storage->BrowserStorage->Initialized) {\r
         return;\r
       }\r
+      Storage->BrowserStorage->Initialized = TRUE;\r
+      break;\r
 \r
-      //\r
-      // Adjust the ConfigRequest string, only the field not saved in BrowserStorage->AllConfig\r
-      // will used to call ExtractConfig.\r
-      // If not elements need to udpate, return.\r
-      //\r
-      if (!ConfigRequestAdjust(Storage)) {\r
-        return;\r
-      }\r
-      ASSERT (Storage->ConfigElements != NULL);\r
+    default:\r
+      return;\r
+  }\r
 \r
-      Status = EFI_NOT_FOUND;\r
-      if (FormSet->ConfigAccess != NULL) { \r
-        //\r
-        // Request current settings from Configuration Driver\r
-        //\r
-        Status = FormSet->ConfigAccess->ExtractConfig (\r
-                                          FormSet->ConfigAccess,\r
-                                          Storage->ConfigElements,\r
-                                          &Progress,\r
-                                          &Result\r
-                                          );\r
-        \r
-        if (!EFI_ERROR (Status)) {\r
-          //\r
-          // Convert Result from <ConfigAltResp> to <ConfigResp>\r
-          //\r
-          StrPtr = StrStr (Result, L"&GUID=");\r
-          if (StrPtr != NULL) {\r
-            *StrPtr = L'\0';\r
-          }\r
-          \r
-          Status = ConfigRespToStorage (Storage->BrowserStorage, Result);\r
-          FreePool (Result);\r
-        }\r
-      }\r
+  //\r
+  // Request current settings from Configuration Driver\r
+  //\r
+  Status = mHiiConfigRouting->ExtractConfig (\r
+                                    mHiiConfigRouting,\r
+                                    Storage->ConfigRequest,\r
+                                    &Progress,\r
+                                    &Result\r
+                                    );\r
 \r
-      if (EFI_ERROR (Status)) {\r
-        //\r
-        // Base on the configRequest string to get default value.\r
-        //\r
-        GetDefaultForFormset (FormSet, Storage->BrowserStorage, Storage->ConfigElements);\r
-      }\r
+  //\r
+  // If get value fail, extract default from IFR binary\r
+  //\r
+  if (EFI_ERROR (Status)) {\r
+    ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage->BrowserStorage, TRUE);\r
+  } else {\r
+    //\r
+    // Convert Result from <ConfigAltResp> to <ConfigResp>\r
+    //\r
+    StrPtr = StrStr (Result, L"&GUID=");\r
+    if (StrPtr != NULL) {\r
+      *StrPtr = L'\0';\r
+    }\r
+    \r
+    Status = ConfigRespToStorage (Storage->BrowserStorage, Result);\r
+    FreePool (Result);\r
+  }\r
 \r
-      SynchronizeStorage(FormSet, Storage->BrowserStorage, Storage->ConfigElements, TRUE);\r
-      break;\r
+  Storage->BrowserStorage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigRequest), Storage->ConfigRequest);\r
 \r
-    default:\r
-      break;\r
-  }\r
+  //\r
+  // Input NULL for ConfigRequest field means sync all fields from editbuffer to buffer. \r
+  //\r
+  SynchronizeStorage(FormSet, Storage->BrowserStorage, NULL, TRUE);\r
 }\r
 \r
 /**\r