]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c
SecurityPkg OpalPassword: Add solution without SMM device code
[mirror_edk2.git] / SecurityPkg / Tcg / Opal / OpalPasswordDxe / OpalHii.c
index 250cb438e94f39934adad3ba5140fdb54074fdeb..e3bde4275dfa73a9be861fb41fe6e5e653b7a7d5 100644 (file)
@@ -30,6 +30,8 @@ extern UINT8  OpalPasswordFormBin[];
 //\r
 extern UINT8  OpalPasswordDxeStrings[];\r
 \r
+CHAR16  OpalPasswordStorageName[] = L"OpalHiiConfig";\r
+\r
 EFI_HII_CONFIG_ACCESS_PROTOCOL gHiiConfigAccessProtocol;\r
 \r
 //\r
@@ -88,61 +90,63 @@ HiiSetCurrentConfiguration(
   VOID\r
   )\r
 {\r
-  EFI_STATUS                            Status;\r
-  OPAL_EXTRA_INFO_VAR                   OpalExtraInfo;\r
-  UINTN                                 DataSize;\r
+  UINT32                                       PpStorageFlag;\r
+  EFI_STRING                                   NewString;\r
 \r
   gHiiConfiguration.NumDisks = GetDeviceCount();\r
 \r
-  DataSize = sizeof (OPAL_EXTRA_INFO_VAR);\r
-  Status = gRT->GetVariable (\r
-                  OPAL_EXTRA_INFO_VAR_NAME,\r
-                  &gOpalExtraInfoVariableGuid,\r
-                  NULL,\r
-                  &DataSize,\r
-                  &OpalExtraInfo\r
-                  );\r
-  DEBUG ((DEBUG_INFO, "GetVariable for OpalExtraInfo @ HiiSetCurrentConfiguration, Status: %r\n", Status));\r
-  if (!EFI_ERROR (Status)) {\r
-    gHiiConfiguration.EnableBlockSid = OpalExtraInfo.EnableBlockSid;\r
-  }\r
-}\r
-\r
-/**\r
-  Check that all required protocols for HII are available.\r
-\r
-  @retval  EFI_SUCCESS        All required protocols are installed.\r
-  @retval  EFI_NOT_FOUND      One or more protocol are not installed.\r
-**/\r
-EFI_STATUS\r
-HiiCheckForRequiredProtocols (\r
-  VOID\r
-  )\r
-{\r
-  VOID*       TempProtocol;\r
-  EFI_STATUS  Status;\r
-\r
-  Status = gBS->LocateProtocol(&gEfiHiiStringProtocolGuid, NULL, (VOID**)&TempProtocol );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
+  //\r
+  // Update the BlockSID status string.\r
+  //\r
+  PpStorageFlag = Tcg2PhysicalPresenceLibGetManagementFlags ();\r
 \r
-  Status = gBS->LocateProtocol(&gEfiHiiDatabaseProtocolGuid, NULL, (VOID**)&TempProtocol );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_NOT_FOUND;\r
+  if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_ENABLE_BLOCK_SID) != 0) {\r
+    NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_ENABLED), NULL);\r
+    if (NewString == NULL) {\r
+      DEBUG ((DEBUG_INFO,  "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+      return;\r
+    }\r
+  } else {\r
+    NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISABLED), NULL);\r
+    if (NewString == NULL) {\r
+      DEBUG ((DEBUG_INFO,  "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+      return;\r
+    }\r
   }\r
-\r
-  Status = gBS->LocateProtocol(&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID**)&TempProtocol );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_NOT_FOUND;\r
+  HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS1), NewString, NULL);\r
+  FreePool (NewString);\r
+\r
+  if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_ENABLE_BLOCK_SID) != 0) {\r
+    NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_TRUE), NULL);\r
+    if (NewString == NULL) {\r
+      DEBUG ((DEBUG_INFO,  "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+      return;\r
+    }\r
+  } else {\r
+    NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_FALSE), NULL);\r
+    if (NewString == NULL) {\r
+      DEBUG ((DEBUG_INFO,  "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+      return;\r
+    }\r
   }\r
-\r
-  Status = gBS->LocateProtocol(&gEfiFormBrowser2ProtocolGuid, NULL, (VOID**)&TempProtocol );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_NOT_FOUND;\r
+  HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS2), NewString, NULL);\r
+  FreePool (NewString);\r
+\r
+  if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_DISABLE_BLOCK_SID) != 0) {\r
+    NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_TRUE), NULL);\r
+    if (NewString == NULL) {\r
+      DEBUG ((DEBUG_INFO,  "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+      return;\r
+    }\r
+  } else {\r
+    NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_FALSE), NULL);\r
+    if (NewString == NULL) {\r
+      DEBUG ((DEBUG_INFO,  "HiiSetCurrentConfiguration: HiiGetString( ) failed\n"));\r
+      return;\r
+    }\r
   }\r
-\r
-  return EFI_SUCCESS;\r
+  HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS3), NewString, NULL);\r
+  FreePool (NewString);\r
 }\r
 \r
 /**\r
@@ -159,15 +163,6 @@ HiiInstall(
   EFI_STATUS                   Status;\r
   EFI_HANDLE                   DriverHandle;\r
 \r
-  //\r
-  // Check that all required protocols are available for HII.\r
-  // If not, fail the install\r
-  //\r
-  Status = HiiCheckForRequiredProtocols();\r
-  if (EFI_ERROR(Status)) {\r
-    return Status;\r
-  }\r
-\r
   //\r
   // Clear the global configuration.\r
   //\r
@@ -435,19 +430,22 @@ GetDiskNameStringId(
 EFI_STATUS\r
 EFIAPI\r
 DriverCallback(\r
-  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL*   This,\r
+  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL    *This,\r
   EFI_BROWSER_ACTION                      Action,\r
   EFI_QUESTION_ID                         QuestionId,\r
   UINT8                                   Type,\r
-  EFI_IFR_TYPE_VALUE*                     Value,\r
-  EFI_BROWSER_ACTION_REQUEST*             ActionRequest\r
+  EFI_IFR_TYPE_VALUE                      *Value,\r
+  EFI_BROWSER_ACTION_REQUEST              *ActionRequest\r
   )\r
 {\r
   HII_KEY    HiiKey;\r
   UINT8      HiiKeyId;\r
+  UINT32     PpRequest;\r
 \r
   if (ActionRequest != NULL) {\r
     *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
+  } else {\r
+    return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   //\r
@@ -504,15 +502,54 @@ DriverCallback(
       case HII_KEY_ID_ENTER_PASSWORD:\r
         return HiiPasswordEntered(Value->string);\r
 \r
-      case HII_KEY_ID_BLOCKSID:\r
-        return HiiSetBlockSid(Value->b);\r
+      case HII_KEY_ID_ENTER_PSID:\r
+        return HiiPsidRevert(Value->string);\r
+\r
     }\r
   } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
     switch (HiiKeyId) {\r
-      case HII_KEY_ID_ENTER_PSID:\r
-        HiiPsidRevert();\r
+      case HII_KEY_ID_BLOCKSID:\r
+        switch (Value->u8) {\r
+          case 0:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
+            break;\r
+\r
+          case 1:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID;\r
+            break;\r
+\r
+          case 2:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_DISABLE_BLOCK_SID;\r
+            break;\r
+\r
+          case 3:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_TRUE;\r
+            break;\r
+\r
+          case 4:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_FALSE;\r
+            break;\r
+\r
+          case 5:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_TRUE;\r
+            break;\r
+\r
+          case 6:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_FALSE;\r
+            break;\r
+\r
+          default:\r
+            PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION;\r
+            DEBUG ((DEBUG_ERROR, "Invalid value input!\n"));\r
+            break;\r
+        }\r
+        HiiSetBlockSidAction(PpRequest);\r
+\r
         *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
         return EFI_SUCCESS;\r
+\r
+      default:\r
+        break;\r
     }\r
   }\r
 \r
@@ -600,7 +637,6 @@ HiiPopulateDiskInfoForm(
         gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.UserPass == 1) ? HII_ACTION_SET_USER_PWD : HII_ACTION_NONE;\r
         gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.SecureErase == 1) ? HII_ACTION_SECURE_ERASE : HII_ACTION_NONE;\r
         gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.DisableUser == 1) ? HII_ACTION_DISABLE_USER : HII_ACTION_NONE;\r
-        gHiiConfiguration.SelectedDiskAvailableActions |= HII_ACTION_ENABLE_BLOCKSID;\r
 \r
         HiiSetFormString (STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default and Disable");\r
 \r
@@ -624,12 +660,14 @@ HiiPopulateDiskInfoForm(
 /**\r
   Reverts the Opal disk to factory default.\r
 \r
+  @param   PsidStringId      The string id for the PSID info.\r
+\r
   @retval  EFI_SUCCESS       Do the required action success.\r
 \r
 **/\r
 EFI_STATUS\r
 HiiPsidRevert(\r
-  VOID\r
+  EFI_STRING_ID         PsidStringId\r
   )\r
 {\r
   CHAR8                         Response[DEFAULT_RESPONSE_SIZE];\r
@@ -637,24 +675,32 @@ HiiPsidRevert(
   OPAL_DISK                     *OpalDisk;\r
   TCG_RESULT                    Ret;\r
   OPAL_SESSION                  Session;\r
+  CHAR16                        *UnicodeStr;\r
+  UINT8                         TmpBuf[PSID_CHARACTER_STRING_END_LENGTH];\r
 \r
   Ret = TcgResultFailure;\r
 \r
-  OpalHiiGetBrowserData();\r
-\r
-  UnicodeStrToAsciiStr(gHiiConfiguration.Psid, (CHAR8*)Psid.Psid);\r
-\r
-  OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);\r
-\r
-  ZeroMem(&Session, sizeof(Session));\r
-  Session.Sscp = OpalDisk->Sscp;\r
-  Session.MediaId = OpalDisk->MediaId;\r
-  Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
+  UnicodeStr = HiiGetString (gHiiPackageListHandle, PsidStringId, NULL);\r
+  ZeroMem (TmpBuf, sizeof (TmpBuf));\r
+  UnicodeStrToAsciiStrS (UnicodeStr, (CHAR8*)TmpBuf, PSID_CHARACTER_STRING_END_LENGTH);\r
+  CopyMem (Psid.Psid, TmpBuf, PSID_CHARACTER_LENGTH);\r
+  HiiSetString (gHiiPackageListHandle, PsidStringId, L"", NULL);\r
+  ZeroMem (TmpBuf, sizeof (TmpBuf));\r
+  ZeroMem (UnicodeStr, StrSize (UnicodeStr));\r
+  FreePool (UnicodeStr);\r
 \r
+  OpalDisk = HiiGetOpalDiskCB (gHiiConfiguration.SelectedDiskIndex);\r
   if (OpalDisk != NULL) {\r
+    ZeroMem(&Session, sizeof(Session));\r
+    Session.Sscp = OpalDisk->Sscp;\r
+    Session.MediaId = OpalDisk->MediaId;\r
+    Session.OpalBaseComId = OpalDisk->OpalBaseComId;\r
+\r
     Ret = OpalSupportPsidRevert(&Session, Psid.Psid, (UINT32)sizeof(Psid.Psid), OpalDisk->OpalDevicePath);\r
   }\r
 \r
+  ZeroMem (Psid.Psid, PSID_CHARACTER_LENGTH);\r
+\r
   if (Ret == TcgResultSuccess) {\r
     AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Success" );\r
   } else {\r
@@ -1060,8 +1106,8 @@ HiiPasswordEntered(
   EFI_STRING_ID            Str\r
   )\r
 {\r
-  OPAL_DISK*                    OpalDisk;\r
-  CHAR8                         Password[MAX_PASSWORD_CHARACTER_LENGTH + 1];\r
+  OPAL_DISK*                   OpalDisk;\r
+  CHAR8                        Password[MAX_PASSWORD_CHARACTER_LENGTH + 1];\r
   CHAR16*                      UniStr;\r
   UINT32                       PassLength;\r
   EFI_STATUS                   Status;\r
@@ -1085,17 +1131,20 @@ HiiPasswordEntered(
   if (UniStr == NULL) {\r
     return EFI_NOT_FOUND;\r
   }\r
+\r
+  HiiSetString(gHiiPackageListHandle, Str, L"", NULL);\r
+\r
   PassLength = (UINT32) StrLen (UniStr);\r
   if (PassLength >= sizeof(Password)) {\r
     HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Password too long");\r
-    gBS->FreePool(UniStr);\r
+    ZeroMem (UniStr, StrSize (UniStr));\r
+    FreePool(UniStr);\r
     return EFI_BUFFER_TOO_SMALL;\r
   }\r
 \r
-  UnicodeStrToAsciiStr(UniStr, Password);\r
-  gBS->FreePool(UniStr);\r
-\r
-  DEBUG ((DEBUG_INFO, "Password: '%s'\n", Password));\r
+  UnicodeStrToAsciiStrS (UniStr, Password, sizeof (Password));\r
+  ZeroMem (UniStr, StrSize (UniStr));\r
+  FreePool(UniStr);\r
 \r
   if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_UNLOCK) {\r
     Status = HiiUnlock (OpalDisk, Password, PassLength);\r
@@ -1104,49 +1153,53 @@ HiiPasswordEntered(
   } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_DISABLE_USER) {\r
     Status = HiiDisableUser (OpalDisk, Password, PassLength);\r
   } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_REVERT) {\r
-    DEBUG ((DEBUG_INFO, "gHiiConfiguration.KeepUserData %u\n", gHiiConfiguration.KeepUserData));\r
-    Status = HiiRevert(OpalDisk, Password, PassLength, gHiiConfiguration.KeepUserData);\r
+    if (OpalDisk->SupportedAttributes.PyriteSsc == 1 && OpalDisk->LockingFeature.MediaEncryption == 0) {\r
+      //\r
+      // For pyrite type device which also not supports media encryption, it not accept "Keep User Data" parameter.\r
+      // So here hardcode a FALSE for this case.\r
+      //\r
+      Status = HiiRevert(OpalDisk, Password, PassLength, FALSE);\r
+    } else {\r
+      Status = HiiRevert(OpalDisk, Password, PassLength, gHiiConfiguration.KeepUserData);\r
+    }\r
   } else {\r
     Status = HiiSetPassword(OpalDisk, Password, PassLength);\r
   }\r
 \r
+  ZeroMem (Password, sizeof (Password));\r
+\r
   OpalHiiSetBrowserData ();\r
 \r
   return Status;\r
 }\r
 \r
 /**\r
-  Update block sid info.\r
+  Send BlockSid request through TPM physical presence module.\r
 \r
-  @param      Enable         Enable/disable BlockSid.\r
+  @param   PpRequest         TPM physical presence operation request.\r
 \r
   @retval  EFI_SUCCESS       Do the required action success.\r
   @retval  Others            Other error occur.\r
 \r
 **/\r
 EFI_STATUS\r
-HiiSetBlockSid (\r
-  BOOLEAN          Enable\r
+HiiSetBlockSidAction (\r
+  IN UINT32          PpRequest\r
   )\r
 {\r
-  EFI_STATUS                            Status;\r
-  OPAL_EXTRA_INFO_VAR                   OpalExtraInfo;\r
-  UINTN                                 DataSize;\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  DEBUG ((DEBUG_INFO, "HiiSetBlockSid(enable: %x)\n", Enable));\r
-\r
-  OpalExtraInfo.EnableBlockSid = Enable;\r
-  DataSize = sizeof (OPAL_EXTRA_INFO_VAR);\r
-  Status = gRT->SetVariable (\r
-                 OPAL_EXTRA_INFO_VAR_NAME,\r
-                 &gOpalExtraInfoVariableGuid,\r
-                 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
-                 DataSize,\r
-                 &OpalExtraInfo\r
-                 );\r
-  DEBUG ((DEBUG_INFO, "SetVariable, Status: %r\n", Status));\r
+  UINT32                           ReturnCode;\r
+  EFI_STATUS                       Status;\r
+\r
+  ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (PpRequest, 0);\r
+  if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) {\r
+    Status = EFI_SUCCESS;\r
+  } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+  } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) {\r
+    Status = EFI_UNSUPPORTED;\r
+  } else {\r
+    Status = EFI_DEVICE_ERROR;\r
+  }\r
 \r
   return Status;\r
 }\r
@@ -1177,11 +1230,17 @@ RouteConfig(
   EFI_STRING                              *Progress\r
   )\r
 {\r
-  DEBUG ((DEBUG_INFO,  "RouteConfig( )\n"));\r
   if (Configuration == NULL || Progress == NULL) {\r
     return (EFI_INVALID_PARAMETER);\r
   }\r
 \r
+  *Progress = Configuration;\r
+  if (!HiiIsConfigHdrMatch (Configuration, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  *Progress = Configuration + StrLen (Configuration);\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1221,8 +1280,12 @@ ExtractConfig(
   )\r
 {\r
   EFI_STATUS                              Status;\r
-\r
-  DEBUG ((DEBUG_INFO,  "ExtractConfig( )\n"));\r
+  EFI_STRING                              ConfigRequest;\r
+  EFI_STRING                              ConfigRequestHdr;\r
+  UINTN                                   BufferSize;\r
+  UINTN                                   Size;\r
+  BOOLEAN                                 AllocatedRequest;\r
+  EFI_HANDLE                              DriverHandle;\r
 \r
   //\r
   // Check for valid parameters\r
@@ -1231,18 +1294,62 @@ ExtractConfig(
     return (EFI_INVALID_PARAMETER);\r
   }\r
 \r
+  *Progress = Request;\r
+  if ((Request != NULL) &&\r
+    !HiiIsConfigHdrMatch (Request, &gHiiSetupVariableGuid, OpalPasswordStorageName)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  AllocatedRequest = FALSE;\r
+  BufferSize = sizeof (OPAL_HII_CONFIGURATION);\r
+  ConfigRequest = Request;\r
+  if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
+    //\r
+    // Request has no request element, construct full request string.\r
+    // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
+    // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
+    //\r
+    DriverHandle = HiiGetDriverImageHandleCB();\r
+    ConfigRequestHdr = HiiConstructConfigHdr (&gHiiSetupVariableGuid, OpalPasswordStorageName, DriverHandle);\r
+    Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
+    ConfigRequest = AllocateZeroPool (Size);\r
+    if (ConfigRequest == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    AllocatedRequest = TRUE;\r
+    UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
+    FreePool (ConfigRequestHdr);\r
+  }\r
+\r
   //\r
   // Convert Buffer Data to <ConfigResp> by helper function BlockToConfig( )\r
   //\r
   Status = gHiiConfigRouting->BlockToConfig(\r
                gHiiConfigRouting,\r
-               Request,\r
+               ConfigRequest,\r
                (UINT8*)&gHiiConfiguration,\r
                sizeof(OPAL_HII_CONFIGURATION),\r
                Results,\r
                Progress\r
            );\r
 \r
+  //\r
+  // Free the allocated config request string.\r
+  //\r
+  if (AllocatedRequest) {\r
+    FreePool (ConfigRequest);\r
+    ConfigRequest = NULL;\r
+  }\r
+\r
+  //\r
+  // Set Progress string to the original request string.\r
+  //\r
+  if (Request == NULL) {\r
+    *Progress = NULL;\r
+  } else if (StrStr (Request, L"OFFSET") == NULL) {\r
+    *Progress = Request + StrLen (Request);\r
+  }\r
+\r
   return (Status);\r
 }\r
 \r
@@ -1257,7 +1364,6 @@ OpalHiiSetBrowserData (
   VOID\r
   )\r
 {\r
-  DEBUG ((DEBUG_INFO,  "OpalHiiSetBrowserData( )\n"));\r
   HiiSetBrowserData(\r
       &gHiiSetupVariableGuid,\r
       (CHAR16*)L"OpalHiiConfig",\r
@@ -1278,7 +1384,6 @@ OpalHiiGetBrowserData (
   VOID\r
   )\r
 {\r
-  DEBUG ((DEBUG_INFO,  "OpalHiiGetBrowserData( )\n"));\r
   HiiGetBrowserData(\r
       &gHiiSetupVariableGuid,\r
       (CHAR16*)L"OpalHiiConfig",\r
@@ -1307,8 +1412,6 @@ HiiSetFormString(
   UINT32                    UniSize;\r
   CHAR16*                   UniStr;\r
 \r
-  DEBUG ((DEBUG_INFO,  "HiiSetFormString( )\n"));\r
-\r
   //\r
   // Determine the Length of the sting\r
   //\r
@@ -1323,7 +1426,7 @@ HiiSetFormString(
   //\r
   // Copy into unicode string, then copy into string id\r
   //\r
-  AsciiStrToUnicodeStr( SrcAsciiStr, UniStr );\r
+  AsciiStrToUnicodeStrS ( SrcAsciiStr, UniStr, Len + 1);\r
 \r
   //\r
   // Update the string in the form\r