]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/BdsDxe/DeviceMngr/DeviceManager.c
Allocate exact memory size for string buffer to avoid buffer overflow.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / DeviceMngr / DeviceManager.c
index 1857ffa0a1c93789eb3120db9f983e3a30e01f5e..85cbe8951d5234801abec757a8279bcd03f5f065 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   The platform device manager reference implementation\r
 \r
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -34,9 +34,6 @@ DEVICE_MANAGER_CALLBACK_DATA  gDeviceManagerPrivate = {
 \r
 #define  MAX_MAC_ADDRESS_NODE_LIST_LEN    10\r
 \r
-EFI_GUID mDeviceManagerGuid = DEVICE_MANAGER_FORMSET_GUID;\r
-EFI_GUID mDriverHealthGuid = DRIVER_HEALTH_FORMSET_GUID;\r
-\r
 //\r
 // Which Mac Address string is select\r
 // it will decide what menu need to show in the NETWORK_DEVICE_FORM_ID form.\r
@@ -72,10 +69,7 @@ HII_VENDOR_DEVICE_PATH  mDeviceManagerHiiVendorDevicePath = {
         (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
       }\r
     },\r
-    //\r
-    // {102579A0-3686-466e-ACD8-80C087044F4A}\r
-    //\r
-    { 0x102579a0, 0x3686, 0x466e, { 0xac, 0xd8, 0x80, 0xc0, 0x87, 0x4, 0x4f, 0x4a } }\r
+    DEVICE_MANAGER_FORMSET_GUID\r
   },\r
   {\r
     END_DEVICE_PATH_TYPE,\r
@@ -97,10 +91,7 @@ HII_VENDOR_DEVICE_PATH  mDriverHealthHiiVendorDevicePath = {
           (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
       }\r
     },\r
-    //\r
-    // {D8F76651-1675-4986-BED4-3824B2F1F4C8}\r
-    //\r
-    { 0xd8f76651, 0x1675, 0x4986, { 0xbe, 0xd4, 0x38, 0x24, 0xb2, 0xf1, 0xf4, 0xc8 } }\r
+    DRIVER_HEALTH_FORMSET_GUID\r
   },\r
   {\r
     END_DEVICE_PATH_TYPE,\r
@@ -142,35 +133,30 @@ DeviceManagerCallback (
 {\r
   UINTN CurIndex;\r
 \r
-  if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
-    if ((Value == NULL) || (ActionRequest == NULL)) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    gCallbackKey = QuestionId;\r
-    if ((QuestionId < MAX_KEY_SECTION_LEN + NETWORK_DEVICE_LIST_KEY_OFFSET) && (QuestionId >= NETWORK_DEVICE_LIST_KEY_OFFSET)) {\r
-      //\r
-      // If user select the mac address, need to record mac address string to support next form show.\r
-      //\r
-      for (CurIndex = 0; CurIndex < mMacDeviceList.CurListLen; CurIndex ++) {\r
-        if (mMacDeviceList.NodeList[CurIndex].QuestionId == QuestionId) {\r
-           mSelectedMacAddrString = HiiGetString (gDeviceManagerPrivate.HiiHandle, mMacDeviceList.NodeList[CurIndex].PromptId, NULL);\r
-        }\r
-      }\r
-    }\r
-  \r
+  if (Action != EFI_BROWSER_ACTION_CHANGING) {\r
     //\r
-    // Request to exit SendForm(), so as to switch to selected form\r
+    // All other action return unsupported.\r
     //\r
-    *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+    return EFI_UNSUPPORTED;\r
+  }\r
 \r
-    return EFI_SUCCESS;\r
+  if (Value == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  //\r
-  // All other action return unsupported.\r
-  //\r
-  return EFI_UNSUPPORTED;\r
+  gCallbackKey = QuestionId;\r
+  if ((QuestionId < MAX_KEY_SECTION_LEN + NETWORK_DEVICE_LIST_KEY_OFFSET) && (QuestionId >= NETWORK_DEVICE_LIST_KEY_OFFSET)) {\r
+    //\r
+    // If user select the mac address, need to record mac address string to support next form show.\r
+    //\r
+    for (CurIndex = 0; CurIndex < mMacDeviceList.CurListLen; CurIndex ++) {\r
+      if (mMacDeviceList.NodeList[CurIndex].QuestionId == QuestionId) {\r
+         mSelectedMacAddrString = HiiGetString (gDeviceManagerPrivate.HiiHandle, mMacDeviceList.NodeList[CurIndex].PromptId, NULL);\r
+      }\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -222,8 +208,10 @@ InitializeDeviceManager (
 \r
   @param Handle          The HII handle.\r
   @param SetupClassGuid  The class guid specifies which form set will be displayed.\r
+  @param SkipCount       Skip some formsets which has processed before.\r
   @param FormSetTitle    Formset title string.\r
   @param FormSetHelp     Formset help string.\r
+  @param FormSetGuid     Return the formset guid for this formset.\r
 \r
   @retval  TRUE          The formset for given HII handle will be displayed.\r
   @return  FALSE         The formset for given HII handle will not be displayed.\r
@@ -233,8 +221,10 @@ BOOLEAN
 ExtractDisplayedHiiFormFromHiiHandle (\r
   IN      EFI_HII_HANDLE      Handle,\r
   IN      EFI_GUID            *SetupClassGuid,\r
+  IN      UINTN               SkipCount,\r
   OUT     EFI_STRING_ID       *FormSetTitle,\r
-  OUT     EFI_STRING_ID       *FormSetHelp\r
+  OUT     EFI_STRING_ID       *FormSetHelp,\r
+  OUT     EFI_GUID            **FormSetGuid\r
   )\r
 {\r
   EFI_STATUS                   Status;\r
@@ -300,8 +290,14 @@ ExtractDisplayedHiiFormFromHiiHandle (
       Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
       while (Offset2 < PackageHeader.Length) {\r
         OpCodeData = Package + Offset2;\r
+        Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
 \r
         if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
+          if (SkipCount != 0) {\r
+            SkipCount --;\r
+            continue;\r
+          }\r
+\r
           if (((EFI_IFR_OP_HEADER *) OpCodeData)->Length > OFFSET_OF (EFI_IFR_FORM_SET, Flags)) {\r
             //\r
             // Find FormSet OpCode\r
@@ -312,6 +308,8 @@ ExtractDisplayedHiiFormFromHiiHandle (
               if (CompareGuid (SetupClassGuid, ClassGuid)) {\r
                 CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
                 CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
+                *FormSetGuid = AllocateCopyPool (sizeof (EFI_GUID), &((EFI_IFR_FORM_SET *) OpCodeData)->Guid);\r
+                ASSERT (*FormSetGuid != NULL);\r
                 FreePool (HiiPackageList);\r
                 return TRUE;\r
               }\r
@@ -320,15 +318,12 @@ ExtractDisplayedHiiFormFromHiiHandle (
            } else {\r
              CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
              CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
+             *FormSetGuid = AllocateCopyPool (sizeof (EFI_GUID), &((EFI_IFR_FORM_SET *) OpCodeData)->Guid);\r
+             ASSERT (*FormSetGuid != NULL);\r
              FreePool (HiiPackageList);\r
              return TRUE;\r
           }\r
         }\r
-        \r
-        //\r
-        // Go to next opcode\r
-        //\r
-        Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
       }\r
     }\r
     \r
@@ -588,7 +583,6 @@ IsNeedAddNetworkMenu (
   EFI_STATUS     Status;\r
   UINTN          EntryCount;\r
   UINTN          Index;  \r
-  EFI_HII_HANDLE HiiDeviceManagerHandle;\r
   EFI_HANDLE     DriverHandle;\r
   EFI_HANDLE     ControllerHandle;\r
   EFI_DEVICE_PATH_PROTOCOL   *DevicePath;\r
@@ -597,7 +591,6 @@ IsNeedAddNetworkMenu (
   EFI_OPEN_PROTOCOL_INFORMATION_ENTRY   *OpenInfoBuffer;\r
   BOOLEAN        IsNeedAdd;\r
 \r
-  HiiDeviceManagerHandle = gDeviceManagerPrivate.HiiHandle;\r
   IsNeedAdd  = FALSE;\r
   OpenInfoBuffer = NULL;\r
   if ((Handle == NULL) || (ItemCount == NULL)) {\r
@@ -715,6 +708,71 @@ Done:
   return IsNeedAdd; \r
 }\r
 \r
+/**\r
+  Get HiiHandle total number.\r
+\r
+  @param   HiiHandles              The input HiiHandle array.\r
+\r
+  @retval  the Hiihandle count.\r
+\r
+**/\r
+UINTN\r
+GetHiiHandleCount (\r
+  IN EFI_HII_HANDLE              *HiiHandles\r
+  )\r
+{\r
+  UINTN  Index;\r
+\r
+  for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
+  }\r
+\r
+  return Index;\r
+}\r
+\r
+/**\r
+  Insert the new HiiHandle + FormsetGuid at the NewPair[InsertOffset].\r
+\r
+  @param   HiiHandles              The input HiiHandle array.\r
+  @param   GuidLists               The input form set guid lists.\r
+  @param   ArrayCount              The input array count, new array will be arraycount + 1 size.\r
+  @param   Offset                  The current used HiiHandle's Offset. \r
+  @param   FormSetGuid             The new found formset guid.\r
+\r
+**/\r
+VOID\r
+AdjustArrayData (\r
+  IN OUT EFI_HII_HANDLE              **HiiHandles,\r
+  IN OUT EFI_GUID                    ***GuidLists,\r
+  IN     UINTN                       ArrayCount,\r
+  IN     UINTN                       Offset,\r
+  IN     EFI_GUID                    *FormSetGuid\r
+  )\r
+{\r
+  EFI_HII_HANDLE              *NewHiiHandles;\r
+  EFI_GUID                    **NewGuidLists;\r
+\r
+  //\r
+  // +2 means include the new HiiHandle and the last empty NULL pointer.\r
+  //\r
+  NewHiiHandles = AllocateZeroPool ((ArrayCount + 2) * sizeof (EFI_HII_HANDLE));\r
+  ASSERT (NewHiiHandles != NULL);\r
+\r
+  CopyMem (NewHiiHandles, *HiiHandles, Offset * sizeof (EFI_HII_HANDLE));\r
+  NewHiiHandles[Offset] = NewHiiHandles[Offset - 1];\r
+  CopyMem (NewHiiHandles + Offset + 1, *HiiHandles + Offset, (ArrayCount - Offset) * sizeof (EFI_HII_HANDLE));\r
+\r
+  NewGuidLists = AllocateZeroPool ((ArrayCount + 2) * sizeof (EFI_GUID *));\r
+  ASSERT (NewGuidLists != NULL);\r
+\r
+  CopyMem (NewGuidLists, *GuidLists, Offset * sizeof (EFI_GUID *));\r
+  NewGuidLists[Offset] = FormSetGuid;\r
+\r
+  FreePool (*HiiHandles);\r
+  *HiiHandles = NewHiiHandles;\r
+  FreePool (*GuidLists);\r
+  *GuidLists = NewGuidLists;\r
+}\r
+\r
 /**\r
   Call the browser and display the device manager to allow user\r
   to configure the platform.\r
@@ -752,7 +810,12 @@ CallDeviceManager (
   UINTN                       AddItemCount;\r
   UINTN                       NewStringLen;\r
   EFI_STRING                  NewStringTitle;\r
+  EFI_GUID                    **GuidLists;\r
+  UINTN                       HandleNum;\r
+  UINTN                       SkipCount;\r
+  EFI_GUID                    *FormSetGuid;\r
 \r
+  GuidLists     = NULL;\r
   HiiHandles    = NULL;\r
   Status        = EFI_SUCCESS;\r
   gCallbackKey  = 0;\r
@@ -760,6 +823,8 @@ CallDeviceManager (
   DriverHealthHandles = NULL;\r
   AddNetworkMenu = FALSE;\r
   AddItemCount   = 0;\r
+  SkipCount      = 0;\r
+  FormSetGuid    = NULL;\r
 \r
   //\r
   // Connect all prior to entering the platform setup menu.\r
@@ -775,7 +840,7 @@ CallDeviceManager (
     // Publish our HII data.\r
     //\r
     HiiHandle = HiiAddPackages (\r
-                  &mDeviceManagerGuid,\r
+                  &gDeviceManagerFormSetGuid,\r
                   gDeviceManagerPrivate.DriverHandle,\r
                   DeviceManagerVfrBin,\r
                   BdsDxeStrings,\r
@@ -841,6 +906,10 @@ CallDeviceManager (
   HiiHandles = HiiGetHiiHandles (NULL);\r
   ASSERT (HiiHandles != NULL);\r
 \r
+  HandleNum = GetHiiHandleCount (HiiHandles);\r
+  GuidLists = AllocateZeroPool ((HandleNum + 1) * sizeof (EFI_GUID *));\r
+  ASSERT (GuidLists != NULL);\r
+\r
   //\r
   // Search for formset of each class type\r
   //\r
@@ -852,10 +921,21 @@ CallDeviceManager (
     //\r
     ASSERT(Index < MAX_KEY_SECTION_LEN);\r
 \r
-    if (!ExtractDisplayedHiiFormFromHiiHandle (HiiHandles[Index], &gEfiHiiPlatformSetupFormsetGuid, &FormSetTitle, &FormSetHelp)) {\r
+    if (!ExtractDisplayedHiiFormFromHiiHandle (HiiHandles[Index], &gEfiHiiPlatformSetupFormsetGuid, SkipCount, &FormSetTitle, &FormSetHelp, &FormSetGuid)) {\r
+      SkipCount = 0;\r
       continue;\r
     }\r
 \r
+    //\r
+    // One HiiHandle has more than one formset can be shown, \r
+    // Insert a new pair of HiiHandle + Guid to the HiiHandles and GuidLists list.\r
+    // \r
+    if (SkipCount > 0) {\r
+      AdjustArrayData (&HiiHandles, &GuidLists, HandleNum, Index + 1, FormSetGuid);\r
+      HandleNum ++;\r
+      Index ++;\r
+    }\r
+\r
     String = HiiGetString (HiiHandles[Index], FormSetTitle, NULL);\r
     if (String == NULL) {\r
       String = HiiGetString (HiiHandle, STR_MISSING_STRING, NULL);\r
@@ -884,7 +964,7 @@ CallDeviceManager (
           AddNetworkMenu = TRUE;\r
           HiiCreateGotoOpCode (\r
             StartOpCodeHandle,\r
-            DEVICE_MANAGER_FORM_ID,\r
+            INVALID_FORM_ID,\r
             STRING_TOKEN (STR_FORM_NETWORK_DEVICE_LIST_TITLE),\r
             STRING_TOKEN (STR_FORM_NETWORK_DEVICE_LIST_HELP),\r
             EFI_IFR_FLAG_CALLBACK,\r
@@ -898,7 +978,7 @@ CallDeviceManager (
         while (AddItemCount > 0) {\r
             HiiCreateGotoOpCode (\r
               StartOpCodeHandle,\r
-              NETWORK_DEVICE_LIST_FORM_ID,\r
+              INVALID_FORM_ID,\r
               mMacDeviceList.NodeList[mMacDeviceList.CurListLen - AddItemCount].PromptId,\r
               STRING_TOKEN (STR_NETWORK_DEVICE_HELP),\r
               EFI_IFR_FLAG_CALLBACK,\r
@@ -912,7 +992,7 @@ CallDeviceManager (
         //\r
         HiiCreateGotoOpCode (\r
           StartOpCodeHandle,\r
-          NETWORK_DEVICE_FORM_ID,\r
+          INVALID_FORM_ID,\r
           Token,\r
           TokenHelp,\r
           EFI_IFR_FLAG_CALLBACK,\r
@@ -927,7 +1007,7 @@ CallDeviceManager (
       if (mNextShowFormId == DEVICE_MANAGER_FORM_ID) {\r
         HiiCreateGotoOpCode (\r
           StartOpCodeHandle,\r
-          DEVICE_MANAGER_FORM_ID,\r
+          INVALID_FORM_ID,\r
           Token,\r
           TokenHelp,\r
           EFI_IFR_FLAG_CALLBACK,\r
@@ -935,6 +1015,12 @@ CallDeviceManager (
           );\r
       }\r
     }\r
+\r
+    //\r
+    // Try to find more formset in this HiiHandle.\r
+    //\r
+    SkipCount++;\r
+    Index--;\r
   }\r
 \r
   Status = gBS->LocateHandleBuffer (\r
@@ -980,7 +1066,7 @@ CallDeviceManager (
 \r
   HiiUpdateForm (\r
     HiiHandle,\r
-    &mDeviceManagerGuid,\r
+    &gDeviceManagerFormSetGuid,\r
     mNextShowFormId,\r
     StartOpCodeHandle,\r
     EndOpCodeHandle\r
@@ -991,7 +1077,7 @@ CallDeviceManager (
                            gFormBrowser2,\r
                            &HiiHandle,\r
                            1,\r
-                           &mDeviceManagerGuid,\r
+                           &gDeviceManagerFormSetGuid,\r
                            mNextShowFormId,\r
                            NULL,\r
                            &ActionRequest\r
@@ -1010,7 +1096,7 @@ CallDeviceManager (
                              gFormBrowser2,\r
                              &HiiHandles[gCallbackKey - DEVICE_KEY_OFFSET],\r
                              1,\r
-                             NULL,\r
+                             GuidLists[gCallbackKey - DEVICE_KEY_OFFSET],\r
                              0,\r
                              NULL,\r
                              &ActionRequest\r
@@ -1078,6 +1164,13 @@ Done:
   HiiFreeOpCodeHandle (EndOpCodeHandle);\r
   FreePool (HiiHandles);\r
 \r
+  for (Index = 0; Index < HandleNum; Index++) {\r
+    if (GuidLists[Index] != NULL) {\r
+      FreePool (GuidLists[Index]);\r
+    }\r
+  }\r
+  FreePool (GuidLists);\r
+\r
   return Status;\r
 }\r
 \r
@@ -1108,7 +1201,7 @@ DriverHealthCallback (
   OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
   )\r
 {\r
-  if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
+  if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
     if ((Value == NULL) || (ActionRequest == NULL)) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
@@ -1166,13 +1259,14 @@ CallDriverHealth (
   DRIVER_HEALTH_INFO          *DriverHealthInfo;\r
   LIST_ENTRY                  *Link;\r
   EFI_DEVICE_PATH_PROTOCOL    *DriverDevicePath;\r
-  UINTN                       Length;\r
   BOOLEAN                     RebootRequired;\r
+  BOOLEAN                     IsControllerNameEmpty;\r
+  UINTN                       StringSize;\r
 \r
   Index               = 0;\r
-  Length              = 0;\r
   DriverHealthInfo    = NULL;  \r
   DriverDevicePath    = NULL;\r
+  IsControllerNameEmpty = FALSE;\r
   InitializeListHead (&DriverHealthList);\r
 \r
   HiiHandle = gDeviceManagerPrivate.DriverHealthHiiHandle;\r
@@ -1181,7 +1275,7 @@ CallDriverHealth (
     // Publish Driver Health HII data.\r
     //\r
     HiiHandle = HiiAddPackages (\r
-                  &mDeviceManagerGuid,\r
+                  &gDeviceManagerFormSetGuid,\r
                   gDeviceManagerPrivate.DriverHealthHandle,\r
                   DriverHealthVfrBin,\r
                   BdsDxeStrings,\r
@@ -1245,13 +1339,7 @@ CallDriverHealth (
   Link = GetFirstNode (&DriverHealthList);\r
 \r
   while (!IsNull (&DriverHealthList, Link)) {   \r
-    DriverHealthInfo = DEVICE_MANAGER_HEALTH_INFO_FROM_LINK (Link);\r
-    \r
-    //\r
-    // Assume no line strings is longer than 512 bytes.\r
-    //\r
-    String = (EFI_STRING) AllocateZeroPool (0x200);\r
-    ASSERT (String != NULL);\r
+    DriverHealthInfo = DEVICE_MANAGER_HEALTH_INFO_FROM_LINK (Link);    \r
 \r
     Status = DriverHealthGetDriverName (DriverHealthInfo->DriverHandle, &DriverName);\r
     if (EFI_ERROR (Status)) {\r
@@ -1261,11 +1349,7 @@ CallDriverHealth (
       DriverDevicePath = DevicePathFromHandle (DriverHealthInfo->DriverHandle);\r
       DriverName       = DevicePathToStr (DriverDevicePath);\r
     }\r
-    //\r
-    // Add the Driver name & Controller name into FormSetTitle string\r
-    // \r
-    StrnCat (String, DriverName, StrLen (DriverName));\r
-\r
+    StringSize = StrSize (DriverName);\r
 \r
     Status = DriverHealthGetControllerName (\r
                DriverHealthInfo->DriverHandle, \r
@@ -1275,23 +1359,39 @@ CallDriverHealth (
                );\r
 \r
     if (!EFI_ERROR (Status)) {\r
-      //\r
-      // Can not get the Controller name, just let it empty.\r
-      //\r
-      StrnCat (String, L"    ", StrLen (L"    "));\r
-      StrnCat (String, ControllerName, StrLen (ControllerName));   \r
+      IsControllerNameEmpty = FALSE;\r
+      StringSize += StrLen (L"    ") * sizeof(CHAR16);\r
+      StringSize += StrLen (ControllerName) * sizeof(CHAR16);\r
+    } else {\r
+      IsControllerNameEmpty = TRUE;\r
     }\r
    \r
     //\r
     // Add the message of the Module itself provided after the string item.\r
     //\r
     if ((DriverHealthInfo->MessageList != NULL) && (DriverHealthInfo->MessageList->StringId != 0)) {\r
-       StrnCat (String, L"    ", StrLen (L"    "));\r
        TmpString = HiiGetString (\r
                      DriverHealthInfo->MessageList->HiiHandle, \r
                      DriverHealthInfo->MessageList->StringId, \r
                      NULL\r
                      );\r
+       ASSERT (TmpString != NULL);\r
+       \r
+       StringSize += StrLen (L"    ") * sizeof(CHAR16);\r
+       StringSize += StrLen (TmpString) * sizeof(CHAR16);\r
+\r
+       String = (EFI_STRING) AllocateZeroPool (StringSize);\r
+       ASSERT (String != NULL);\r
+       \r
+       StrnCpy (String, DriverName, StringSize / sizeof(CHAR16));\r
+       if (!IsControllerNameEmpty) {\r
+        StrnCat (String, L"    ", StringSize / sizeof(CHAR16) - StrLen(String) - 1);\r
+        StrnCat (String, ControllerName, StringSize / sizeof(CHAR16) - StrLen(String) - 1);\r
+       }\r
+\r
+       StrnCat (String, L"    ", StringSize / sizeof(CHAR16) - StrLen(String) - 1);\r
+       StrnCat (String, TmpString, StringSize / sizeof(CHAR16) - StrLen(String) - 1);\r
+       \r
     } else {\r
       //\r
       // Update the string will be displayed base on the driver's health status\r
@@ -1316,10 +1416,22 @@ CallDriverHealth (
         TmpString = GetStringById (STRING_TOKEN (STR_DRIVER_HEALTH_HEALTHY));\r
         break;\r
       }\r
+      ASSERT (TmpString != NULL);\r
+\r
+      StringSize += StrLen (TmpString) * sizeof(CHAR16);\r
+\r
+      String = (EFI_STRING) AllocateZeroPool (StringSize);\r
+      ASSERT (String != NULL);\r
+      \r
+      StrnCpy (String, DriverName, StringSize / sizeof(CHAR16));\r
+      if (!IsControllerNameEmpty) {\r
+        StrnCat (String, L"    ", StringSize / sizeof(CHAR16) - StrLen(String) - 1);\r
+        StrnCat (String, ControllerName, StringSize / sizeof(CHAR16) - StrLen(String) - 1);\r
+      }\r
+\r
+      StrnCat (String, TmpString, StringSize / sizeof(CHAR16) - StrLen(String) - 1);\r
     }\r
 \r
-    ASSERT (TmpString != NULL);\r
-    StrCat (String, TmpString);\r
     FreePool (TmpString);\r
 \r
     Token = HiiSetString (HiiHandle, 0, String, NULL);\r
@@ -1379,7 +1491,7 @@ CallDriverHealth (
 \r
   Status = HiiUpdateForm (\r
              HiiHandle,\r
-             &mDriverHealthGuid,\r
+             &gDriverHealthFormSetGuid,\r
              DRIVER_HEALTH_FORM_ID,\r
              StartOpCodeHandle,\r
              EndOpCodeHandle\r
@@ -1389,7 +1501,7 @@ CallDriverHealth (
 \r
   Status = HiiUpdateForm (\r
             HiiHandle,\r
-            &mDriverHealthGuid,\r
+            &gDriverHealthFormSetGuid,\r
             DRIVER_HEALTH_FORM_ID,\r
             StartOpCodeHandleRepair,\r
             EndOpCodeHandleRepair\r
@@ -1402,7 +1514,7 @@ CallDriverHealth (
                            gFormBrowser2,\r
                            &HiiHandle,\r
                            1,\r
-                           &mDriverHealthGuid,\r
+                           &gDriverHealthFormSetGuid,\r
                            DRIVER_HEALTH_FORM_ID,\r
                            NULL,\r
                            &ActionRequest\r
@@ -1961,7 +2073,7 @@ ProcessSingleControllerHealth (
                                DriverHealth,\r
                                ControllerHandle,\r
                                ChildHandle,\r
-                               (EFI_DRIVER_HEALTH_REPAIR_PROGRESS_NOTIFY) RepairNotify\r
+                               RepairNotify\r
                                );\r
     }\r
     //\r
@@ -2037,24 +2149,20 @@ ProcessSingleControllerHealth (
 \r
 \r
 /**\r
-  Platform specific notification function for controller repair operations.\r
-\r
-  If the driver for a controller support the Driver Health Protocol and the\r
-  current state of the controller is EfiDriverHealthStatusRepairRequired then\r
-  when the Repair() service of the Driver Health Protocol is called, this \r
-  platform specific notification function can display the progress of the repair\r
-  operation.  Some platforms may choose to not display anything, other may choose\r
-  to show the percentage complete on text consoles, and other may choose to render\r
-  a progress bar on text and graphical consoles.\r
-\r
-  This function displays the percentage of the repair operation that has been\r
-  completed on text consoles.  The percentage is Value / Limit * 100%.\r
-  \r
-  @param  Value               Value in the range 0..Limit the the repair has completed..\r
-  @param  Limit               The maximum value of Value\r
+  Reports the progress of a repair operation.\r
+\r
+  @param[in]  Value             A value between 0 and Limit that identifies the current \r
+                                progress of the repair operation.\r
+\r
+  @param[in]  Limit             The maximum value of Value for the current repair operation.\r
+                                For example, a driver that wants to specify progress in \r
+                                percent would use a Limit value of 100.\r
+\r
+  @retval EFI_SUCCESS           The progress of a repair operation is reported successfully.\r
 \r
 **/\r
-VOID\r
+EFI_STATUS\r
+EFIAPI\r
 RepairNotify (\r
   IN  UINTN Value,\r
   IN  UINTN Limit\r
@@ -2068,6 +2176,7 @@ RepairNotify (
     Percent = Value * 100 / Limit;\r
     Print(L"Repair Progress = %3d%%\n\r", Percent);\r
   }\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -2185,7 +2294,7 @@ DriverHealthSelectBestLanguage (
   CHAR8           *LanguageVariable;\r
   CHAR8           *BestLanguage;\r
 \r
-  LanguageVariable =  GetEfiGlobalVariable (Iso639Language ? L"Lang" : L"PlatformLang");\r
+  GetEfiGlobalVariable2 (Iso639Language ? L"Lang" : L"PlatformLang", (VOID**)&LanguageVariable, NULL);\r
 \r
   BestLanguage = GetBestLanguage(\r
                    SupportedLanguages,\r