]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
Update the logic in browser core, use config routine protocol instead of config acces...
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / ConfigRouting.c
index 95ca8d4777fd0ebc80093be3348adb2b13091fad..1fb16817b76a6282bc2abf62a95a52737881545b 100644 (file)
@@ -355,6 +355,9 @@ OutputConfigBody (
   }\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
@@ -1109,6 +1112,7 @@ GetVarStoreType (
 {\r
   EFI_STATUS               Status;\r
   UINTN                    IfrOffset;\r
+  UINTN                    PackageOffset;\r
   EFI_IFR_OP_HEADER        *IfrOpHdr;\r
   CHAR16                   *VarStoreName;\r
   EFI_STRING               GuidStr;\r
@@ -1118,6 +1122,7 @@ GetVarStoreType (
   UINT8                    *HiiFormPackage;\r
   UINTN                    PackageSize;\r
   EFI_IFR_VARSTORE_EFI     *IfrEfiVarStore;\r
+  EFI_HII_PACKAGE_HEADER   *PackageHeader;\r
   \r
   HiiFormPackage = NULL;\r
   LengthString     = 0;\r
@@ -1125,16 +1130,33 @@ GetVarStoreType (
   GuidStr          = NULL;\r
   NameStr          = NULL;\r
   TempStr          = NULL;\r
+  *IsEfiVarstore   = FALSE;\r
 \r
   Status = GetFormPackageData(DataBaseRecord, &HiiFormPackage, &PackageSize);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
 \r
-  IfrOffset   = sizeof (EFI_HII_PACKAGE_HEADER);\r
+  IfrOffset     = sizeof (EFI_HII_PACKAGE_HEADER);\r
+  PackageOffset = IfrOffset;\r
+  PackageHeader = (EFI_HII_PACKAGE_HEADER *) HiiFormPackage;\r
+\r
   while (IfrOffset < PackageSize) {\r
-    IfrOpHdr  = (EFI_IFR_OP_HEADER *) (HiiFormPackage + IfrOffset);    \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
     if (IfrOpHdr->OpCode == EFI_IFR_VARSTORE_EFI_OP ) {\r
       IfrEfiVarStore = (EFI_IFR_VARSTORE_EFI *) IfrOpHdr;\r
@@ -1189,6 +1211,13 @@ GetVarStoreType (
       FreePool (GuidStr);\r
       FreePool (NameStr);\r
       FreePool (TempStr);\r
+\r
+      //\r
+      // Already found the varstore, break;\r
+      //\r
+      if (*IsEfiVarstore) {\r
+        break;\r
+      }\r
     }\r
   }\r
 Done:\r
@@ -1255,6 +1284,13 @@ IsThisVarstore (
   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
@@ -1291,6 +1327,130 @@ Done:
   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
@@ -1414,6 +1574,7 @@ ParseIfrData (
 {\r
   EFI_STATUS               Status;\r
   UINTN                    IfrOffset;\r
+  UINTN                    PackageOffset;\r
   EFI_IFR_VARSTORE         *IfrVarStore;\r
   EFI_IFR_VARSTORE_EFI     *IfrEfiVarStore;\r
   EFI_IFR_OP_HEADER        *IfrOpHdr;\r
@@ -1430,32 +1591,57 @@ ParseIfrData (
   IFR_DEFAULT_DATA         DefaultData;\r
   IFR_DEFAULT_DATA         *DefaultDataPtr;\r
   IFR_BLOCK_DATA           *BlockData;\r
-  CHAR16                   *VarStoreName;
-  UINT16                   VarWidth;
-  UINT16                   VarDefaultId;
-  BOOLEAN                  FirstOneOfOption;
-  LIST_ENTRY               *LinkData;
-  LIST_ENTRY               *LinkDefault;
-  EFI_IFR_VARSTORE_NAME_VALUE *IfrNameValueVarStore;
-
-  Status           = EFI_SUCCESS;
-  BlockData        = NULL;
-  DefaultDataPtr   = NULL;
-  FirstOneOfOption = FALSE;
+  CHAR16                   *VarStoreName;\r
+  UINT16                   VarWidth;\r
+  UINT16                   VarDefaultId;\r
+  BOOLEAN                  FirstOneOfOption;\r
+  LIST_ENTRY               *LinkData;\r
+  LIST_ENTRY               *LinkDefault;\r
+  EFI_IFR_VARSTORE_NAME_VALUE *IfrNameValueVarStore;\r
+  EFI_HII_PACKAGE_HEADER   *PackageHeader;\r
+  EFI_VARSTORE_ID          VarStoreId;\r
+\r
+  Status           = EFI_SUCCESS;\r
+  BlockData        = NULL;\r
+  DefaultDataPtr   = NULL;\r
+  FirstOneOfOption = FALSE;\r
+  VarStoreId       = 0;\r
   ZeroMem (&DefaultData, sizeof (IFR_DEFAULT_DATA));\r
 \r
   //\r
   // Go through the form package to parse OpCode one by one.\r
   //\r
-  IfrOffset   = sizeof (EFI_HII_PACKAGE_HEADER);\r
+  PackageOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+  PackageHeader = (EFI_HII_PACKAGE_HEADER *) Package;\r
+  IfrOffset     = PackageOffset;\r
   while (IfrOffset < PackageLength) {\r
+\r
+    //\r
+    // More than one form package found.\r
+    //\r
+    if (PackageOffset >= PackageHeader->Length) {\r
+        //\r
+        // Already found varstore for this request, break;\r
+        //\r
+        if (VarStoreId != 0) {\r
+          VarStoreId = 0;\r
+        }\r
+\r
+        //\r
+        // Get next package header info.\r
+        //\r
+        IfrOffset    += sizeof (EFI_HII_PACKAGE_HEADER);\r
+        PackageOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+        PackageHeader = (EFI_HII_PACKAGE_HEADER *) (Package + IfrOffset);\r
+    }\r
+\r
     IfrOpHdr  = (EFI_IFR_OP_HEADER *) (Package + IfrOffset);\r
     switch (IfrOpHdr->OpCode) {\r
     case EFI_IFR_VARSTORE_OP:\r
       //\r
       // VarStore is found. Don't need to search any more.\r
       //\r
-      if (VarStorageData->VarStoreId != 0) {\r
+      if (VarStoreId != 0) {\r
         break;\r
       }\r
 \r
@@ -1473,10 +1659,10 @@ ParseIfrData (
         // Find the matched VarStore\r
         //\r
         CopyGuid (&VarStorageData->Guid, (EFI_GUID *) (VOID *) &IfrVarStore->Guid);\r
-        VarStorageData->VarStoreId = IfrVarStore->VarStoreId;\r
         VarStorageData->Size       = IfrVarStore->Size;\r
         VarStorageData->Name       = VarStoreName;\r
         VarStorageData->Type       = EFI_HII_VARSTORE_BUFFER;\r
+        VarStoreId                 = IfrVarStore->VarStoreId;\r
       }\r
       break;\r
 \r
@@ -1484,7 +1670,7 @@ ParseIfrData (
       //\r
       // VarStore is found. Don't need to search any more.\r
       //\r
-      if (VarStorageData->VarStoreId != 0) {\r
+      if (VarStoreId != 0) {\r
         break;\r
       }\r
 \r
@@ -1511,10 +1697,10 @@ ParseIfrData (
         // Find the matched VarStore\r
         //\r
         CopyGuid (&VarStorageData->Guid, (EFI_GUID *) (VOID *) &IfrEfiVarStore->Guid);\r
-        VarStorageData->VarStoreId = IfrEfiVarStore->VarStoreId;\r
         VarStorageData->Size       = IfrEfiVarStore->Size;\r
         VarStorageData->Name       = VarStoreName;\r
         VarStorageData->Type       = EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER;\r
+        VarStoreId                 = IfrEfiVarStore->VarStoreId;\r
       }\r
       break;\r
 \r
@@ -1522,7 +1708,7 @@ ParseIfrData (
       //\r
       // VarStore is found. Don't need to search any more.\r
       //\r
-      if (VarStorageData->VarStoreId != 0) {\r
+      if (VarStoreId != 0) {\r
         break;\r
       }\r
 \r
@@ -1533,8 +1719,8 @@ ParseIfrData (
         // Find the matched VarStore\r
         //\r
         CopyGuid (&VarStorageData->Guid, (EFI_GUID *) (VOID *) &IfrNameValueVarStore->Guid);\r
-        VarStorageData->VarStoreId = IfrNameValueVarStore->VarStoreId;\r
         VarStorageData->Type       = EFI_HII_VARSTORE_NAME_VALUE;\r
+        VarStoreId                 = IfrNameValueVarStore->VarStoreId;\r
       }\r
       break;\r
 \r
@@ -1557,7 +1743,7 @@ ParseIfrData (
       //\r
       // No matched varstore is found and directly return.\r
       //\r
-      if (VarStorageData->VarStoreId == 0) {\r
+      if ( VarStoreId == 0) {\r
         Status = EFI_SUCCESS;\r
         goto Done;\r
       }\r
@@ -1567,7 +1753,7 @@ ParseIfrData (
       //\r
       // Ref question is not in IFR Form. This IFR form is not valid. \r
       //\r
-      if (VarStorageData->VarStoreId == 0) {\r
+      if ( VarStoreId == 0) {\r
         Status = EFI_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -1575,7 +1761,7 @@ ParseIfrData (
       // Check whether this question is for the requested varstore.\r
       //\r
       IfrRef = (EFI_IFR_REF4 *) IfrOpHdr;\r
-      if (IfrRef->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+      if (IfrRef->Question.VarStoreId != VarStoreId) {\r
         break;\r
       }\r
       VarWidth  = (UINT16) (sizeof (EFI_HII_REF));\r
@@ -1595,7 +1781,7 @@ ParseIfrData (
       //\r
       // Numeric and OneOf question is not in IFR Form. This IFR form is not valid. \r
       //\r
-      if (VarStorageData->VarStoreId == 0) {\r
+      if (VarStoreId == 0) {\r
         Status = EFI_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -1603,7 +1789,7 @@ ParseIfrData (
       // Check whether this question is for the requested varstore.\r
       //\r
       IfrOneOf = (EFI_IFR_ONE_OF *) IfrOpHdr;\r
-      if (IfrOneOf->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+      if (IfrOneOf->Question.VarStoreId != VarStoreId) {\r
         break;\r
       }\r
       VarWidth  = (UINT16) (1 << (IfrOneOf->Flags & EFI_IFR_NUMERIC_SIZE));\r
@@ -1672,7 +1858,7 @@ ParseIfrData (
       //\r
       // OrderedList question is not in IFR Form. This IFR form is not valid. \r
       //\r
-      if (VarStorageData->VarStoreId == 0) {\r
+      if (VarStoreId == 0) {\r
         Status = EFI_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -1680,7 +1866,7 @@ ParseIfrData (
       // Check whether this question is for the requested varstore.\r
       //\r
       IfrOrderedList = (EFI_IFR_ORDERED_LIST *) IfrOpHdr;\r
-      if (IfrOrderedList->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+      if (IfrOrderedList->Question.VarStoreId != VarStoreId) {\r
         BlockData = NULL;\r
         break;\r
       }\r
@@ -1704,7 +1890,7 @@ ParseIfrData (
       //\r
       // CheckBox question is not in IFR Form. This IFR form is not valid. \r
       //\r
-      if (VarStorageData->VarStoreId == 0) {\r
+      if (VarStoreId == 0) {\r
         Status = EFI_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -1712,7 +1898,7 @@ ParseIfrData (
       // Check whether this question is for the requested varstore.\r
       //\r
       IfrCheckBox = (EFI_IFR_CHECKBOX *) IfrOpHdr;\r
-      if (IfrCheckBox->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+      if (IfrCheckBox->Question.VarStoreId != VarStoreId) {\r
         break;\r
       }\r
       VarWidth  = (UINT16) sizeof (BOOLEAN);\r
@@ -1791,7 +1977,7 @@ ParseIfrData (
       //\r
       // Date question is not in IFR Form. This IFR form is not valid. \r
       //\r
-      if (VarStorageData->VarStoreId == 0) {\r
+      if (VarStoreId == 0) {\r
         Status = EFI_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -1799,7 +1985,7 @@ ParseIfrData (
       // Check whether this question is for the requested varstore.\r
       //\r
       IfrDate = (EFI_IFR_DATE *) IfrOpHdr;\r
-      if (IfrDate->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+      if (IfrDate->Question.VarStoreId != VarStoreId) {\r
         break;\r
       }\r
 \r
@@ -1820,7 +2006,7 @@ ParseIfrData (
       //\r
       // Time question is not in IFR Form. This IFR form is not valid. \r
       //\r
-      if (VarStorageData->VarStoreId == 0) {\r
+      if (VarStoreId == 0) {\r
         Status = EFI_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -1828,7 +2014,7 @@ ParseIfrData (
       // Check whether this question is for the requested varstore.\r
       //\r
       IfrTime = (EFI_IFR_TIME *) IfrOpHdr;\r
-      if (IfrTime->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+      if (IfrTime->Question.VarStoreId != VarStoreId) {\r
         break;\r
       }\r
 \r
@@ -1849,7 +2035,7 @@ ParseIfrData (
       //\r
       // String question is not in IFR Form. This IFR form is not valid. \r
       //\r
-      if (VarStorageData->VarStoreId == 0) {\r
+      if (VarStoreId == 0) {\r
         Status = EFI_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -1857,7 +2043,7 @@ ParseIfrData (
       // Check whether this question is for the requested varstore.\r
       //\r
       IfrString = (EFI_IFR_STRING *) IfrOpHdr;\r
-      if (IfrString->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+      if (IfrString->Question.VarStoreId != VarStoreId) {\r
         break;\r
       }\r
 \r
@@ -1883,7 +2069,7 @@ ParseIfrData (
       //\r
       // Password question is not in IFR Form. This IFR form is not valid. \r
       //\r
-      if (VarStorageData->VarStoreId == 0) {\r
+      if (VarStoreId == 0) {\r
         Status = EFI_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -1891,7 +2077,7 @@ ParseIfrData (
       // Check whether this question is for the requested varstore.\r
       //\r
       IfrPassword = (EFI_IFR_PASSWORD *) IfrOpHdr;\r
-      if (IfrPassword->Question.VarStoreId != VarStorageData->VarStoreId) {\r
+      if (IfrPassword->Question.VarStoreId != VarStoreId) {\r
         break;\r
       }\r
 \r
@@ -2076,19 +2262,32 @@ ParseIfrData (
       //\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
       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
-    IfrOffset += IfrOpHdr->Length;\r
+    IfrOffset     += IfrOpHdr->Length;\r
+    PackageOffset += IfrOpHdr->Length;\r
   }\r
 \r
 Done:\r
@@ -2864,12 +3063,12 @@ GetFullStringFromHiiFormPackages (
   IFR_DEFAULT_DATA             *DefaultIdArray;\r
   IFR_VARSTORAGE_DATA          *VarStorageData;\r
   EFI_STRING                   DefaultAltCfgResp;\r
-  EFI_STRING                   ConfigHdr;
-  EFI_STRING                   StringPtr;
-  EFI_STRING                   Progress;
-
-  if (DataBaseRecord == NULL || DevicePath == NULL || Request == NULL || AltCfgResp == NULL) {
-    return EFI_INVALID_PARAMETER;
+  EFI_STRING                   ConfigHdr;\r
+  EFI_STRING                   StringPtr;\r
+  EFI_STRING                   Progress;\r
+\r
+  if (DataBaseRecord == NULL || DevicePath == NULL || Request == NULL || AltCfgResp == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   //\r
@@ -2879,12 +3078,12 @@ GetFullStringFromHiiFormPackages (
   DefaultIdArray    = NULL;\r
   VarStorageData    = NULL;\r
   DefaultAltCfgResp = NULL;\r
-  ConfigHdr         = NULL;
-  HiiFormPackage    = NULL;
-  PackageSize       = 0;
-  Progress          = *Request;
-
-  Status = GetFormPackageData (DataBaseRecord, &HiiFormPackage, &PackageSize);
+  ConfigHdr         = NULL;\r
+  HiiFormPackage    = NULL;\r
+  PackageSize       = 0;\r
+  Progress          = *Request;\r
+\r
+  Status = GetFormPackageData (DataBaseRecord, &HiiFormPackage, &PackageSize);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -2989,7 +3188,7 @@ GetFullStringFromHiiFormPackages (
   //\r
   // No requested varstore in IFR data and directly return\r
   //\r
-  if (VarStorageData->VarStoreId == 0) {\r
+  if (VarStorageData->Type == 0 && VarStorageData->Name == NULL) {\r
     Status = EFI_SUCCESS;\r
     goto Done;\r
   }\r
@@ -3147,10 +3346,11 @@ GetConfigRespFromEfiVarStore (
   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
@@ -3447,8 +3647,10 @@ ConfigRequestValidate (
                                  Progress parameter is set to NULL.\r
   @retval EFI_INVALID_PARAMETER  Illegal syntax. Progress set to most recent &\r
                                  before the error or the beginning of the string.\r
-  @retval EFI_INVALID_PARAMETER  Unknown name. Progress points to the & before the\r
-                                 name in question.\r
+  @retval EFI_INVALID_PARAMETER  The ExtractConfig function of the underlying HII\r
+                                 Configuration Access Protocol returned \r
+                                 EFI_INVALID_PARAMETER. Progress set to most recent\r
+                                 & before the error or the beginning of the string.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -3482,6 +3684,7 @@ HiiConfigRoutingExtractConfig (
   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
@@ -3567,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
-        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
@@ -3766,9 +3966,9 @@ Done:
                                  instance.\r
   @param  Results                Null-terminated Unicode string in\r
                                  <MultiConfigAltResp> format which has all values\r
-                                 filled in for the names in the Request string.\r
-                                 String to be allocated by the  called function.\r
-                                 De-allocation is up to the caller.\r
+                                 filled in for the entirety of the current HII \r
+                                 database. String to be allocated by the  called \r
+                                 function. De-allocation is up to the caller.\r
 \r
   @retval EFI_SUCCESS            The Results string is filled with the values\r
                                  corresponding to all requested names.\r
@@ -4005,6 +4205,7 @@ HiiConfigRoutingRouteConfig (
   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
@@ -4076,11 +4277,8 @@ HiiConfigRoutingRouteConfig (
 \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
@@ -4321,7 +4519,7 @@ HiiBlockToConfig (
     //\r
     Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);\r
     if (EFI_ERROR (Status)) {\r
-      *Progress = ConfigRequest;\r
+      *Progress = TmpPtr - 1;\r
       goto Exit;\r
     }\r
     Offset = 0;\r
@@ -4334,7 +4532,7 @@ HiiBlockToConfig (
 \r
     StringPtr += Length;\r
     if (StrnCmp (StringPtr, L"&WIDTH=", StrLen (L"&WIDTH=")) != 0) {\r
-      *Progress = StringPtr - Length - StrLen (L"OFFSET=") - 1;\r
+      *Progress = TmpPtr - 1;\r
       Status = EFI_INVALID_PARAMETER;\r
       goto Exit;\r
     }\r
@@ -4345,7 +4543,7 @@ HiiBlockToConfig (
     //\r
     Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);\r
     if (EFI_ERROR (Status)) {\r
-      *Progress = ConfigRequest;\r
+      *Progress =  TmpPtr - 1;\r
       goto Exit;\r
     }\r
     Width = 0;\r
@@ -4358,7 +4556,7 @@ HiiBlockToConfig (
 \r
     StringPtr += Length;\r
     if (*StringPtr != 0 && *StringPtr != L'&') {\r
-      *Progress = StringPtr - Length - StrLen (L"&WIDTH=");\r
+      *Progress =  TmpPtr - 1;\r
       Status = EFI_INVALID_PARAMETER;\r
       goto Exit;\r
     }\r
@@ -4481,8 +4679,9 @@ Exit:
                                  (see below)  is returned.\r
   @param  BlockSize              The length of the Block in units of UINT8.  On\r
                                  input, this is the size of the Block. On output,\r
-                                 if successful, contains the index of the  last\r
-                                 modified byte in the Block.\r
+                                 if successful, contains the largest index of the\r
+                                 modified byte in the Block, or the required buffer\r
+                                 size if the Block is not large enough.\r
   @param  Progress               On return, points to an element of the ConfigResp\r
                                  string filled in with the offset of the most\r
                                  recent '&' before the first failing name / value\r
@@ -4502,7 +4701,8 @@ Exit:
                                  value pair. Block is left updated and\r
                                  Progress points at the '&' preceding the first\r
                                  non-<BlockName>.\r
-  @retval EFI_DEVICE_ERROR       Block not large enough. Progress undefined.\r
+  @retval EFI_BUFFER_TOO_SMALL   Block not large enough. Progress undefined. \r
+                                 BlockSize is updated with the required buffer size.\r
   @retval EFI_NOT_FOUND          Target for the specified routing data was not found.\r
                                  Progress points to the "G" in "GUID" of the errant\r
                                  routing data.\r
@@ -4520,6 +4720,7 @@ HiiConfigToBlock (
 {\r
   HII_DATABASE_PRIVATE_DATA           *Private;\r
   EFI_STRING                          StringPtr;\r
+  EFI_STRING                          TmpPtr;\r
   UINTN                               Length;\r
   EFI_STATUS                          Status;\r
   UINT8                               *TmpBuffer;\r
@@ -4578,13 +4779,14 @@ HiiConfigToBlock (
   // <BlockConfig> ::= 'OFFSET='<Number>&'WIDTH='<Number>&'VALUE='<Number>\r
   //\r
   while (*StringPtr != 0 && StrnCmp (StringPtr, L"&OFFSET=", StrLen (L"&OFFSET=")) == 0) {\r
+    TmpPtr     = StringPtr;\r
     StringPtr += StrLen (L"&OFFSET=");\r
     //\r
     // Get Offset\r
     //\r
     Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);\r
     if (EFI_ERROR (Status)) {\r
-      *Progress = ConfigResp;\r
+      *Progress = TmpPtr;\r
       goto Exit;\r
     }\r
     Offset = 0;\r
@@ -4597,7 +4799,7 @@ HiiConfigToBlock (
 \r
     StringPtr += Length;\r
     if (StrnCmp (StringPtr, L"&WIDTH=", StrLen (L"&WIDTH=")) != 0) {\r
-      *Progress = StringPtr - Length - StrLen (L"&OFFSET=");\r
+      *Progress = TmpPtr;\r
       Status = EFI_INVALID_PARAMETER;\r
       goto Exit;\r
     }\r
@@ -4608,7 +4810,7 @@ HiiConfigToBlock (
     //\r
     Status = GetValueOfNumber (StringPtr, &TmpBuffer, &Length);\r
     if (EFI_ERROR (Status)) {\r
-      *Progress = ConfigResp;\r
+      *Progress = TmpPtr;\r
       goto Exit;\r
     }\r
     Width = 0;\r
@@ -4621,7 +4823,7 @@ HiiConfigToBlock (
 \r
     StringPtr += Length;\r
     if (StrnCmp (StringPtr, L"&VALUE=", StrLen (L"&VALUE=")) != 0) {\r
-      *Progress = StringPtr - Length - StrLen (L"&WIDTH=");\r
+      *Progress = TmpPtr;\r
       Status = EFI_INVALID_PARAMETER;\r
       goto Exit;\r
     }\r
@@ -4632,13 +4834,13 @@ HiiConfigToBlock (
     //\r
     Status = GetValueOfNumber (StringPtr, &Value, &Length);\r
     if (EFI_ERROR (Status)) {\r
-      *Progress = ConfigResp;\r
+      *Progress = TmpPtr;\r
       goto Exit;\r
     }\r
 \r
     StringPtr += Length;\r
     if (*StringPtr != 0 && *StringPtr != L'&') {\r
-      *Progress = StringPtr - Length - StrLen (L"&VALUE=");\r
+      *Progress = TmpPtr;\r
       Status = EFI_INVALID_PARAMETER;\r
       goto Exit;\r
     }\r
@@ -4679,7 +4881,7 @@ HiiConfigToBlock (
   if (MaxBlockSize > BufferSize) {\r
     *BlockSize = MaxBlockSize;\r
     if (Block != NULL) {\r
-      return EFI_DEVICE_ERROR;\r
+      return EFI_BUFFER_TOO_SMALL;\r
     }\r
   }\r
 \r