]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update the logic in browser core, use config routine protocol instead of config acces...
authorEric Dong <eric.dong@intel.com>
Wed, 27 Nov 2013 02:29:01 +0000 (02:29 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 27 Nov 2013 02:29:01 +0000 (02:29 +0000)
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14902 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c

index 2ed02cdaa4843c016cc55c75af90fce2070a79e7..1fb16817b76a6282bc2abf62a95a52737881545b 100644 (file)
@@ -355,6 +355,9 @@ OutputConfigBody (
   }\r
 \r
   Length = TmpPtr - String;\r
   }\r
 \r
   Length = TmpPtr - String;\r
+  if (Length == 0) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
   Result = AllocateCopyPool (Length * sizeof (CHAR16), String);\r
   if (Result == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   Result = AllocateCopyPool (Length * sizeof (CHAR16), String);\r
   if (Result == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -1281,6 +1284,13 @@ IsThisVarstore (
   GuidStr      = NULL;\r
   TempStr      = NULL;\r
 \r
   GuidStr      = NULL;\r
   TempStr      = NULL;\r
 \r
+  //\r
+  // If ConfigHdr has name field and varstore not has name, return FALSE.\r
+  //\r
+  if (Name == NULL && StrStr (ConfigHdr, L"NAME=&") == NULL) {\r
+    return FALSE;\r
+  }\r
+\r
   GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *)VarstoreGuid, 1, &GuidStr);\r
   if (Name != NULL) {\r
     GenerateSubStr (L"NAME=", StrLen (Name) * sizeof (CHAR16), (VOID *) Name, 2, &NameStr);\r
   GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *)VarstoreGuid, 1, &GuidStr);\r
   if (Name != NULL) {\r
     GenerateSubStr (L"NAME=", StrLen (Name) * sizeof (CHAR16), (VOID *) Name, 2, &NameStr);\r
@@ -1317,6 +1327,130 @@ Done:
   return RetVal;\r
 }\r
 \r
   return RetVal;\r
 }\r
 \r
+/**\r
+  This function parses Form Package to get the efi varstore info according to the request ConfigHdr.\r
+\r
+  @param  DataBaseRecord        The DataBaseRecord instance contains the found Hii handle and package.\r
+  @param  ConfigHdr             Request string ConfigHdr. If it is NULL,\r
+                                the first found varstore will be as ConfigHdr.\r
+  @retval  TRUE                 This hii package is the reqeust one.\r
+  @retval  FALSE                This hii package is not the reqeust one.\r
+**/                                \r
+BOOLEAN\r
+IsThisPackageList (\r
+  IN     HII_DATABASE_RECORD        *DataBaseRecord,\r
+  IN     EFI_STRING                 ConfigHdr\r
+  )\r
+{\r
+  EFI_STATUS               Status;\r
+  UINTN                    IfrOffset;\r
+  UINTN                    PackageOffset;\r
+  EFI_IFR_OP_HEADER        *IfrOpHdr;\r
+  CHAR16                   *VarStoreName;\r
+  UINT8                    *HiiFormPackage;\r
+  UINTN                    PackageSize;\r
+  EFI_IFR_VARSTORE_EFI     *IfrEfiVarStore;\r
+  EFI_HII_PACKAGE_HEADER   *PackageHeader;\r
+  EFI_IFR_VARSTORE         *IfrVarStore;\r
+  EFI_IFR_VARSTORE_NAME_VALUE *IfrNameValueVarStore;\r
+  BOOLEAN                  FindVarstore;\r
+\r
+  HiiFormPackage   = NULL;\r
+  VarStoreName     = NULL;\r
+  Status           = EFI_SUCCESS;\r
+  FindVarstore     = FALSE;\r
+\r
+  Status = GetFormPackageData(DataBaseRecord, &HiiFormPackage, &PackageSize);\r
+  if (EFI_ERROR (Status)) {\r
+    return FALSE;\r
+  }\r
+\r
+  IfrOffset     = sizeof (EFI_HII_PACKAGE_HEADER);\r
+  PackageOffset = IfrOffset;\r
+  PackageHeader = (EFI_HII_PACKAGE_HEADER *) HiiFormPackage;\r
+\r
+  while (IfrOffset < PackageSize) {\r
+    //\r
+    // More than one form packages exist.\r
+    //\r
+    if (PackageOffset >= PackageHeader->Length) {\r
+        //\r
+        // Process the new form package.\r
+        //\r
+        PackageOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+        IfrOffset    += PackageOffset;\r
+        PackageHeader = (EFI_HII_PACKAGE_HEADER *) (HiiFormPackage + IfrOffset);\r
+    }\r
+\r
+    IfrOpHdr  = (EFI_IFR_OP_HEADER *) (HiiFormPackage + IfrOffset);\r
+    IfrOffset += IfrOpHdr->Length;\r
+    PackageOffset += IfrOpHdr->Length;\r
+\r
+    switch (IfrOpHdr->OpCode) {\r
+    \r
+    case EFI_IFR_VARSTORE_OP:\r
+      IfrVarStore = (EFI_IFR_VARSTORE *) IfrOpHdr;\r
+\r
+      VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrVarStore->Name) * sizeof (CHAR16));\r
+      if (VarStoreName == NULL) {\r
+        goto Done;\r
+      }\r
+      AsciiStrToUnicodeStr ((CHAR8 *)IfrVarStore->Name, VarStoreName);\r
+\r
+      if (IsThisVarstore((VOID *)&IfrVarStore->Guid, VarStoreName, ConfigHdr)) {\r
+        FindVarstore = TRUE;\r
+        goto Done;\r
+      }\r
+      break;\r
+\r
+    case EFI_IFR_VARSTORE_EFI_OP:\r
+      IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *) IfrOpHdr;\r
+      VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)IfrEfiVarStore->Name) * sizeof (CHAR16));\r
+      if (VarStoreName == NULL) {\r
+        goto Done;\r
+      }\r
+      AsciiStrToUnicodeStr ((CHAR8 *)IfrEfiVarStore->Name, VarStoreName);\r
+\r
+      if (IsThisVarstore (&IfrEfiVarStore->Guid, VarStoreName, ConfigHdr)) {\r
+        FindVarstore = TRUE;\r
+        goto Done;\r
+      }\r
+      break;\r
+\r
+    case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
+      IfrNameValueVarStore = (EFI_IFR_VARSTORE_NAME_VALUE *) IfrOpHdr;\r
+\r
+      if (IsThisVarstore (&IfrNameValueVarStore->Guid, NULL, ConfigHdr)) {\r
+        FindVarstore = TRUE;\r
+        goto Done;\r
+      }\r
+      break;\r
+      \r
+    case EFI_IFR_FORM_OP:\r
+    case EFI_IFR_FORM_MAP_OP:\r
+      //\r
+      // No matched varstore is found and directly return.\r
+      //\r
+      goto Done;\r
+      break;\r
+\r
+    default:\r
+      break;\r
+    }\r
+  }\r
+\r
+Done:\r
+  if (HiiFormPackage != NULL) {\r
+    FreePool (HiiFormPackage);\r
+  }\r
+\r
+  if (VarStoreName != NULL) {\r
+    FreePool (VarStoreName);\r
+  }\r
+\r
+  return FindVarstore;\r
+}\r
+\r
 /**\r
   Check whether the this op code is required.\r
 \r
 /**\r
   Check whether the this op code is required.\r
 \r
@@ -2128,14 +2262,26 @@ ParseIfrData (
       //\r
       // End Opcode is for Var question.\r
       //\r
       //\r
       // End Opcode is for Var question.\r
       //\r
-      if (BlockData != NULL && BlockData->Scope > 0) {\r
-        BlockData->Scope--;\r
+      if (BlockData != NULL) {\r
+        if (BlockData->Scope > 0) {\r
+          BlockData->Scope--;\r
+        }\r
+        if (BlockData->Scope == 0) {\r
+          BlockData = NULL;\r
+        }\r
       }\r
       }\r
+\r
       break;\r
 \r
     default:\r
       break;\r
 \r
     default:\r
-      if (BlockData != NULL && BlockData->Scope > 0) {\r
-        BlockData->Scope = (UINT8) (BlockData->Scope + IfrOpHdr->Scope);\r
+      if (BlockData != NULL) {\r
+        if (BlockData->Scope > 0) {\r
+          BlockData->Scope = (UINT8) (BlockData->Scope + IfrOpHdr->Scope);\r
+        }\r
+\r
+        if (BlockData->Scope == 0) {\r
+          BlockData = NULL;\r
+        }\r
       }\r
       break;\r
     }\r
       }\r
       break;\r
     }\r
@@ -3200,10 +3346,11 @@ GetConfigRespFromEfiVarStore (
   UINT8      *VarStore;\r
   UINTN      BufferSize;\r
 \r
   UINT8      *VarStore;\r
   UINTN      BufferSize;\r
 \r
-  Status       = EFI_SUCCESS;\r
-  BufferSize   = 0;\r
-  VarStore     = NULL;\r
-  VarStoreName = NULL;\r
+  Status          = EFI_SUCCESS;\r
+  BufferSize      = 0;\r
+  VarStore        = NULL;\r
+  VarStoreName    = NULL;\r
+  *AccessProgress = Request;\r
   \r
   VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)EfiVarStoreInfo->Name) * sizeof (CHAR16));\r
   if (VarStoreName == NULL) {\r
   \r
   VarStoreName = AllocateZeroPool (AsciiStrSize ((CHAR8 *)EfiVarStoreInfo->Name) * sizeof (CHAR16));\r
   if (VarStoreName == NULL) {\r
@@ -3537,6 +3684,7 @@ HiiConfigRoutingExtractConfig (
   BOOLEAN                             IsEfiVarStore;\r
   EFI_IFR_VARSTORE_EFI                *EfiVarStoreInfo;\r
   EFI_STRING                          ErrorPtr;\r
   BOOLEAN                             IsEfiVarStore;\r
   EFI_IFR_VARSTORE_EFI                *EfiVarStoreInfo;\r
   EFI_STRING                          ErrorPtr;\r
+  UINTN                               DevicePathSize;\r
 \r
   if (This == NULL || Progress == NULL || Results == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
 \r
   if (This == NULL || Progress == NULL || Results == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -3622,11 +3770,8 @@ HiiConfigRoutingExtractConfig (
       Database = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
       if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {\r
         CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);\r
       Database = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
       if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {\r
         CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);\r
-        if (CompareMem (\r
-              DevicePath,\r
-              CurrentDevicePath,\r
-              GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath)\r
-              ) == 0) {\r
+        DevicePathSize    = GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath);\r
+        if ((CompareMem (DevicePath,CurrentDevicePath,DevicePathSize) == 0) && IsThisPackageList(Database, Request)) {\r
           DriverHandle = Database->DriverHandle;\r
           HiiHandle    = Database->Handle;\r
           break;\r
           DriverHandle = Database->DriverHandle;\r
           HiiHandle    = Database->Handle;\r
           break;\r
@@ -4060,6 +4205,7 @@ HiiConfigRoutingRouteConfig (
   EFI_STRING                          AccessProgress;\r
   EFI_IFR_VARSTORE_EFI                *EfiVarStoreInfo;\r
   BOOLEAN                             IsEfiVarstore;\r
   EFI_STRING                          AccessProgress;\r
   EFI_IFR_VARSTORE_EFI                *EfiVarStoreInfo;\r
   BOOLEAN                             IsEfiVarstore;\r
+  UINTN                               DevicePathSize;\r
 \r
   if (This == NULL || Progress == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
 \r
   if (This == NULL || Progress == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -4131,11 +4277,8 @@ HiiConfigRoutingRouteConfig (
 \r
       if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {\r
         CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);\r
 \r
       if ((DevicePathPkg = Database->PackageList->DevicePathPkg) != NULL) {\r
         CurrentDevicePath = DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER);\r
-        if (CompareMem (\r
-              DevicePath,\r
-              CurrentDevicePath,\r
-              GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath)\r
-              ) == 0) {\r
+        DevicePathSize    = GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) CurrentDevicePath);\r
+        if ((CompareMem (DevicePath,CurrentDevicePath,DevicePathSize) == 0) && IsThisPackageList(Database, Configuration)) {\r
           DriverHandle = Database->DriverHandle;\r
           break;\r
         }\r
           DriverHandle = Database->DriverHandle;\r
           break;\r
         }\r
index 5e0187396aeaffc0ea06e75a3f20c52bed15c8ab..fb3ff7b266f45cb0082659d474b7fb28b226baeb 100644 (file)
@@ -1499,7 +1499,6 @@ ProcessQuestionConfig (
   EFI_STATUS                      Status;\r
   CHAR16                          *ConfigResp;\r
   CHAR16                          *Progress;\r
   EFI_STATUS                      Status;\r
   CHAR16                          *ConfigResp;\r
   CHAR16                          *Progress;\r
-  EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
 \r
   if (Question->QuestionConfig == 0) {\r
     return EFI_SUCCESS;\r
 \r
   if (Question->QuestionConfig == 0) {\r
     return EFI_SUCCESS;\r
@@ -1516,12 +1515,8 @@ ProcessQuestionConfig (
   //\r
   // Send config to Configuration Driver\r
   //\r
   //\r
   // Send config to Configuration Driver\r
   //\r
-  ConfigAccess = Selection->FormSet->ConfigAccess;\r
-  if (ConfigAccess == NULL) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-  Status = ConfigAccess->RouteConfig (\r
-                           ConfigAccess,\r
+  Status = mHiiConfigRouting->RouteConfig (\r
+                           mHiiConfigRouting,\r
                            ConfigResp,\r
                            &Progress\r
                            );\r
                            ConfigResp,\r
                            &Progress\r
                            );\r
index f8ea4ff01b367403857cb060c013ee5c2b753a73..66238e055f29b3949dd91ce6e5e4468c1c15a5f6 100644 (file)
@@ -1270,7 +1270,6 @@ GetQuestionValue (
   BOOLEAN             IsString;\r
   CHAR16              TemStr[5];\r
   UINT8               DigitUint8;\r
   BOOLEAN             IsString;\r
   CHAR16              TemStr[5];\r
   UINT8               DigitUint8;\r
-  UINT8               *TemBuffer;\r
 \r
   Status = EFI_SUCCESS;\r
   Value  = NULL;\r
 \r
   Status = EFI_SUCCESS;\r
   Value  = NULL;\r
@@ -1487,147 +1486,118 @@ GetQuestionValue (
       FreePool (Value);\r
     }\r
   } else {\r
       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
 \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
 \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
-      //\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
         FreePool (Result);\r
         return EFI_NOT_FOUND;\r
       }\r
       //\r
-      // Skip '=', point to value\r
+      // Skip "&VALUE"\r
       //\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
 \r
+    LengthStr = StrLen (Value);\r
+    Status    = EFI_SUCCESS;\r
+    if (!IsBufferStorage && IsString) {\r
       //\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
       //\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
         //\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
         //\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
       } 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
       }\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
     }\r
 \r
     //\r
@@ -1871,111 +1841,78 @@ SetQuestionValue (
       }\r
     }\r
   } else if (SetValueTo == GetSetValueWithHiiDriver) {\r
       }\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
 \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
 \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
 \r
+    if (!IsBufferStorage && IsString) {\r
       //\r
       //\r
-      // Convert to lower char.\r
+      // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
       //\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
-\r
+    } else {\r
       //\r
       //\r
-      // Submit Question Value to Configuration Driver\r
+      // Convert Buffer to Hex String\r
       //\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
       }\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
+\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
     //\r
     // Sync storage, from editbuffer to buffer.\r
     //\r
@@ -2522,8 +2459,6 @@ SubmitForm (
   EFI_STRING              Progress;\r
   BROWSER_STORAGE         *Storage;\r
   FORMSET_STORAGE         *FormSetStorage;\r
   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
   FORM_BROWSER_FORMSET    *LocalFormSet;\r
   FORM_BROWSER_CONFIG_REQUEST  *ConfigInfo;\r
 \r
@@ -2575,72 +2510,18 @@ SubmitForm (
       }\r
 \r
       //\r
       }\r
 \r
       //\r
-      // 2. Set value to hii driver or efi variable.\r
+      // 2. Set value to hii config routine protocol.\r
       //\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
+\r
       FreePool (ConfigResp);\r
       //\r
       // 3. Config success, update storage shadow Buffer, only update the data belong to this form.\r
       FreePool (ConfigResp);\r
       //\r
       // 3. Config success, update storage shadow Buffer, only update the data belong to this form.\r
@@ -2681,69 +2562,19 @@ SubmitForm (
         return Status;\r
       }\r
 \r
         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
+\r
       FreePool (ConfigResp);\r
       //\r
       // 3. Config success, update storage shadow Buffer\r
       FreePool (ConfigResp);\r
       //\r
       // 3. Config success, update storage shadow Buffer\r
@@ -2828,9 +2659,7 @@ GetDefaultValueFromAltCfg (
   Value         = NULL;\r
   Storage       = Question->Storage;\r
 \r
   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
     return Status;\r
   }\r
 \r
@@ -2849,7 +2678,11 @@ GetDefaultValueFromAltCfg (
     Dst = (UINT8 *) &Question->HiiValue.Value;\r
   }\r
 \r
     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
   IsString = (BOOLEAN) ((Question->HiiValue.Type == EFI_IFR_TYPE_STRING) ?  TRUE : FALSE);\r
 \r
   //\r
@@ -2874,8 +2707,8 @@ GetDefaultValueFromAltCfg (
     StrCat (ConfigRequest, Question->VariableName);\r
   }\r
 \r
     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
                                     ConfigRequest,\r
                                     &Progress,\r
                                     &Result\r
@@ -2905,6 +2738,11 @@ GetDefaultValueFromAltCfg (
     goto Done;\r
   }\r
 \r
     goto Done;\r
   }\r
 \r
+  if (ConfigResp == NULL) {\r
+    Status = EFI_NOT_FOUND;\r
+    goto Done;\r
+  }\r
+\r
   //\r
   // Skip <ConfigRequest>\r
   //\r
   //\r
   // Skip <ConfigRequest>\r
   //\r
@@ -4257,26 +4095,6 @@ LoadStorage (
         ConfigRequestAdjust(Storage);\r
         return;\r
       }\r
         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
       break;\r
 \r
     case EFI_HII_VARSTORE_BUFFER:\r
@@ -4287,49 +4105,47 @@ LoadStorage (
       if (Storage->ElementCount == 0 || Storage->BrowserStorage->Initialized) {\r
         return;\r
       }\r
       if (Storage->ElementCount == 0 || Storage->BrowserStorage->Initialized) {\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->ConfigRequest,\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
-      if (EFI_ERROR (Status)) {\r
-        //\r
-        // Base on the configRequest string to get default value.\r
-        //\r
-        GetDefaultForFormset (FormSet, Storage->BrowserStorage, Storage->ConfigRequest);\r
-      }\r
-\r
-      SynchronizeStorage(FormSet, Storage->BrowserStorage, Storage->ConfigRequest, TRUE);\r
-\r
-      Storage->BrowserStorage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigRequest), Storage->ConfigRequest);\r
       Storage->BrowserStorage->Initialized = TRUE;\r
       break;\r
 \r
     default:\r
       Storage->BrowserStorage->Initialized = TRUE;\r
       break;\r
 \r
     default:\r
-      break;\r
+      return;\r
   }\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
+  //\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
+  Storage->BrowserStorage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigRequest), Storage->ConfigRequest);\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
 }\r
 \r
 /**\r