]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ShellPkg/dh: Support dump from GUID and "decode" parameter
authorRuiyu Ni <ruiyu.ni@intel.com>
Mon, 9 Jan 2017 02:51:58 +0000 (10:51 +0800)
committerRuiyu Ni <ruiyu.ni@intel.com>
Wed, 11 Jan 2017 02:07:08 +0000 (10:07 +0800)
To follow Shell spec 2.2, change "dh" to support dump from
protocol GUID and support "decode" parameter to dump the
GUID/name mapping.

Contributed-under: TianoCore Contribution Agreement 1.0
Cc: Jaben Carsey <jaben.carsey@intel.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Signed-off-by: Chen A Chen <chen.a.chen@intel.com>
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.uni

index 2773842722d502c1a997efd8102fd3974e21179a..d17a29d86fbebd04b273266e14729ddc7fa2e1fa 100644 (file)
@@ -41,6 +41,137 @@ STATIC CONST EFI_GUID *UefiDriverModelProtocolsGuidArray[] = {
   NULL\r
 };\r
 \r
+UINTN mGuidDataLen[] = {8, 4, 4, 4, 12};\r
+/**\r
+  Function to determine if the string can convert to a GUID.\r
+  The string must be restricted as "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" format.\r
+\r
+  @param[in]  String  The string to test.\r
+\r
+  @retval     TRUE    The string can convert to a GUID.\r
+  @retval     FALSE   The string can't convert to a GUID.\r
+**/\r
+BOOLEAN\r
+IsValidGuidString(\r
+  IN CONST CHAR16 *String\r
+  )\r
+{\r
+  CONST CHAR16  *Walker;\r
+  CONST CHAR16  *PrevWalker;\r
+  UINTN         Index;\r
+\r
+  if (String == NULL) {\r
+    return FALSE;\r
+  }\r
+\r
+  Walker      = String;\r
+  PrevWalker  = String;\r
+  Index       = 0;\r
+\r
+  while (Walker != NULL && *Walker != CHAR_NULL) {\r
+    if ( (*Walker >= '0' && *Walker <= '9') ||\r
+         (*Walker >= 'a' && *Walker <= 'f') ||\r
+         (*Walker >= 'A' && *Walker <= 'F')\r
+       ) {\r
+      Walker++;\r
+    } else {\r
+      if (*Walker == L'-' && (UINTN)(Walker - PrevWalker) == mGuidDataLen[Index]) {\r
+        Walker++;\r
+        PrevWalker = Walker;\r
+        Index++;\r
+      } else {\r
+        return FALSE;\r
+      }\r
+    }\r
+  }\r
+\r
+  if ((UINTN)(Walker - PrevWalker) == mGuidDataLen[Index]) {\r
+    return TRUE;\r
+  } else {\r
+    return FALSE;\r
+  }\r
+}\r
+\r
+/**\r
+  Convert a hex-character to decimal value.\r
+\r
+  This internal function only deal with Unicode character\r
+  which maps to a valid hexadecimal ASII character, i.e.\r
+  L'0' to L'9', L'a' to L'f' or L'A' to L'F'. For other\r
+  Unicode character, the value returned does not make sense.\r
+\r
+  @param[in]  Char      The character to convert.\r
+\r
+  @retval               The numerical value converted.\r
+**/\r
+UINTN\r
+HexCharToDecimal(\r
+  IN CHAR16 Char\r
+  )\r
+{\r
+  if (Char >= '0' && Char <= '9') {\r
+    return Char - L'0';\r
+  } else if (Char >= 'a' && Char <= 'f') {\r
+    return Char - L'a' + 10;\r
+  } else {\r
+    return Char - L'A' + 10;\r
+  }\r
+}\r
+\r
+/**\r
+  Function try to convert a string to GUID format.\r
+\r
+  @param[in]    String    The string will be converted.\r
+  @param[out]   Guid      Save the result convert from string.\r
+\r
+  @retval EFI_SUCCESS     The string was successfully converted to a GUID.\r
+  @retval EFI_UNSUPPORTED The input string is not in registry format.\r
+**/\r
+EFI_STATUS\r
+ConvertStrToGuid(\r
+  IN  CONST CHAR16 *String,\r
+  OUT GUID *Guid\r
+  )\r
+{\r
+  CONST CHAR16  *Walker;\r
+  UINT8         TempValue;\r
+  UINTN         Index;\r
+\r
+  if (String == NULL || !IsValidGuidString (String)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Index = 0;\r
+\r
+  Walker = String;\r
+  Guid->Data1 = (UINT32)StrHexToUint64 (Walker);\r
+\r
+  Walker += 9;\r
+  Guid->Data2 = (UINT16)StrHexToUint64 (Walker);\r
+\r
+  Walker += 5;\r
+  Guid->Data3 = (UINT16)StrHexToUint64 (Walker);\r
+\r
+  Walker += 5;\r
+  while (Walker != NULL && *Walker != CHAR_NULL) {\r
+    if (*Walker == L'-') {\r
+      Walker++;\r
+    } else {\r
+      TempValue = (UINT8)HexCharToDecimal (*Walker);\r
+      TempValue = (UINT8)LShiftU64 (TempValue, 4);\r
+      Walker++;\r
+\r
+      TempValue += (UINT8)HexCharToDecimal (*Walker);\r
+      Walker++;\r
+\r
+      Guid->Data4[Index] = TempValue;\r
+      Index++;\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   Get the name of a driver by it's handle.\r
 \r
@@ -733,8 +864,7 @@ DoDhForHandleList(
   SHELL_STATUS      ShellStatus;\r
 \r
   ShellStatus       = SHELL_SUCCESS;\r
-\r
-  for ( HandleWalker = HandleList; HandleWalker != NULL && *HandleWalker != NULL; HandleWalker++ ) {\r
+  for (HandleWalker = HandleList; HandleWalker != NULL && *HandleWalker != NULL; HandleWalker++) {\r
     DoDhByHandle (*HandleWalker, Verbose, Sfo, Language, DriverInfo, TRUE);\r
     if (ShellGetExecutionBreakFlag ()) {\r
       ShellStatus = SHELL_ABORTED;\r
@@ -745,89 +875,166 @@ DoDhForHandleList(
 }\r
 \r
 /**\r
-  Display information for all handles.\r
+  Display information for a GUID of protocol.\r
 \r
-  @param[in] Sfo              TRUE to output in standard format output (spec).\r
+  @param[in] Guid             The pointer to the name of the protocol.\r
   @param[in] Verbose          TRUE for extra info, FALSE otherwise.\r
+  @param[in] Sfo              TRUE to output in standard format output (spec).\r
   @param[in] Language         Language string per UEFI specification.\r
   @param[in] DriverInfo       TRUE to show all info about the handle.\r
 \r
   @retval SHELL_SUCCESS           The operation was successful.\r
+  @retval SHELL_NOT_FOUND         The GUID was not found.\r
   @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
 **/\r
 SHELL_STATUS\r
-DoDhForAll(\r
-  IN CONST BOOLEAN  Sfo,\r
+DoDhByProtocolGuid(\r
+  IN CONST GUID     *Guid,\r
   IN CONST BOOLEAN  Verbose,\r
+  IN CONST BOOLEAN  Sfo,\r
   IN CONST CHAR8    *Language,\r
   IN CONST BOOLEAN  DriverInfo\r
   )\r
 {\r
-  EFI_HANDLE    *HandleList;\r
+  CHAR16        *Name;\r
   SHELL_STATUS  ShellStatus;\r
+  EFI_HANDLE    *HandleList;\r
 \r
-  HandleList = GetHandleListByProtocol(NULL);\r
-\r
-  ShellStatus = DoDhForHandleList(\r
-    HandleList,\r
-    Verbose,\r
-    Sfo,\r
-    Language,\r
-    DriverInfo);\r
-\r
-  FreePool(HandleList);\r
+  if (!Sfo) {\r
+    if (Guid == NULL) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_ALL_HEADER), gShellDriver1HiiHandle);\r
+    } else {\r
+      Name = GetStringNameFromGuid (Guid, NULL);\r
+      if (Name == NULL) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_GUID_HEADER), gShellDriver1HiiHandle, Guid);\r
+      } else {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_NAME_HEADER), gShellDriver1HiiHandle, Name);\r
+      }\r
+    }\r
+  }\r
+  HandleList = GetHandleListByProtocol(Guid);\r
+  ShellStatus = DoDhForHandleList(HandleList, Verbose, Sfo, Language, DriverInfo);\r
+  SHELL_FREE_NON_NULL(HandleList);\r
 \r
-  return (ShellStatus);\r
+  return ShellStatus;\r
 }\r
 \r
 /**\r
-  Display information for all handles which have a specific protocol.\r
+  Function to determine use which method to print information.\r
+  If Protocol is NULL, The function will print all information.\r
 \r
-  @param[in] ProtocolName     The pointer to the name of the protocol.\r
+  @param[in] Protocol         The pointer to the name or GUID of protocol or NULL.\r
   @param[in] Verbose          TRUE for extra info, FALSE otherwise.\r
   @param[in] Sfo              TRUE to output in standard format output (spec).\r
   @param[in] Language         Language string per UEFI specification.\r
   @param[in] DriverInfo       TRUE to show all info about the handle.\r
 \r
-  @retval SHELL_SUCCESS           The operation was successful.\r
-  @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
+  @retval SHELL_SUCCESS             The operation was successful.\r
+  @retval SHELL_NOT_FOUND           The protocol was not found.\r
+  @retval SHELL_INVALID_PARAMETER   Protocol is invalid parameter.\r
 **/\r
 SHELL_STATUS\r
-DoDhByProtocol(\r
-  IN CONST CHAR16   *ProtocolName,\r
+DoDhByProtocol (\r
+  IN CONST CHAR16   *Protocol,\r
   IN CONST BOOLEAN  Verbose,\r
   IN CONST BOOLEAN  Sfo,\r
   IN CONST CHAR8    *Language,\r
   IN CONST BOOLEAN  DriverInfo\r
   )\r
 {\r
-  EFI_GUID      *Guid;\r
+  EFI_GUID      Guid;\r
+  EFI_GUID      *GuidPtr;\r
   EFI_STATUS    Status;\r
-  EFI_HANDLE    *HandleList;\r
-  SHELL_STATUS  ShellStatus;\r
 \r
-  if (ProtocolName == NULL) {\r
-    return (SHELL_INVALID_PARAMETER);\r
-  }\r
+  if (Protocol == NULL) {\r
+    return DoDhByProtocolGuid (NULL, Verbose, Sfo, Language, DriverInfo);\r
+  } else {\r
+    Status = ConvertStrToGuid (Protocol, &Guid);\r
+    if (!EFI_ERROR (Status)) {\r
+      GuidPtr = &Guid;\r
+    } else {\r
+      //\r
+      // Protocol is a Name, convert it to GUID\r
+      //\r
+      Status = GetGuidFromStringName (Protocol, Language, &GuidPtr);\r
+      if (EFI_ERROR(Status)) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol);\r
+        return (SHELL_NOT_FOUND);\r
+      }\r
+    }\r
 \r
-  Status = GetGuidFromStringName(ProtocolName, Language, &Guid);\r
-  if (EFI_ERROR(Status)) {\r
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, ProtocolName);\r
-    return (SHELL_INVALID_PARAMETER);\r
+    return DoDhByProtocolGuid (GuidPtr, Verbose, Sfo, Language, DriverInfo);\r
   }\r
+}\r
 \r
-  HandleList = GetHandleListByProtocol(Guid);\r
+/**\r
+  Function to display decode information by Protocol.\r
+  The parameter Protocol is either a GUID or the name of protocol.\r
+  If the parameter Protocol is NULL, the function will print all\r
+  decode information.\r
 \r
-  ShellStatus = DoDhForHandleList(\r
-    HandleList,\r
-    Verbose,\r
-    Sfo,\r
-    Language,\r
-    DriverInfo);\r
+  @param[in] Protocol         The pointer to the name or GUID of protocol.\r
+  @param[in] Language         Language string per UEFI specification.\r
 \r
-  SHELL_FREE_NON_NULL(HandleList);\r
+  @retval SHELL_SUCCESS           The operation was successful.\r
+  @retval SHELL_OUT_OT_RESOURCES  A memory allocation failed.\r
+**/\r
+SHELL_STATUS\r
+DoDecodeByProtocol(\r
+  IN CONST CHAR16 *Protocol,\r
+  IN CONST CHAR8  *Language\r
+  )\r
+{\r
+  EFI_STATUS    Status;\r
+  EFI_GUID      *Guids;\r
+  EFI_GUID      Guid;\r
+  UINTN         Counts;\r
+  UINTN         Index;\r
+  CHAR16        *Name;\r
+\r
+  if (Protocol == NULL) {\r
+    Counts = 0;\r
+    Status = GetAllMappingGuids (NULL, &Counts);\r
+    if (Status == EFI_BUFFER_TOO_SMALL) {\r
+      Guids = AllocatePool (Counts * sizeof(EFI_GUID));\r
+      if (Guids == NULL) {\r
+        return SHELL_OUT_OF_RESOURCES;\r
+      }\r
 \r
-  return (ShellStatus);\r
+      Status = GetAllMappingGuids (Guids, &Counts);\r
+      if (Status == EFI_SUCCESS) {\r
+        for (Index = 0; Index < Counts; Index++) {\r
+          Name = GetStringNameFromGuid (&Guids[Index], Language);\r
+          if (Name != NULL) {\r
+            ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guids[Index]);\r
+          } else {\r
+            ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guids[Index]);\r
+          }\r
+          SHELL_FREE_NON_NULL (Name);\r
+        }\r
+      }\r
+      FreePool (Guids);\r
+    }\r
+  } else {\r
+    if (ConvertStrToGuid (Protocol, &Guid) == EFI_SUCCESS) {\r
+      Name = GetStringNameFromGuid (&Guid, Language);\r
+      if (Name != NULL) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guid);\r
+      } else {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guid);\r
+      }\r
+      SHELL_FREE_NON_NULL(Name);\r
+    } else {\r
+      Status = GetGuidFromStringName (Protocol, Language, &Guids);\r
+      if (Status == EFI_SUCCESS) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Protocol, Guids);\r
+      } else {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol);\r
+      }\r
+    }\r
+  }\r
+\r
+  return SHELL_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -850,10 +1057,12 @@ ShellCommandRunDh (
   CHAR8               *Language;\r
   CONST CHAR16        *Lang;\r
   CONST CHAR16        *RawValue;\r
+  CONST CHAR16        *ProtocolVal;\r
   BOOLEAN             SfoFlag;\r
   BOOLEAN             DriverFlag;\r
   BOOLEAN             VerboseFlag;\r
   UINT64              Intermediate;\r
+  EFI_HANDLE          Handle;\r
 \r
   ShellStatus         = SHELL_SUCCESS;\r
   Status              = EFI_SUCCESS;\r
@@ -906,60 +1115,54 @@ ShellCommandRunDh (
     SfoFlag     = ShellCommandLineGetFlag (Package, L"-sfo");\r
     DriverFlag  = ShellCommandLineGetFlag (Package, L"-d");\r
     VerboseFlag = (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-v") || ShellCommandLineGetFlag (Package, L"-verbose"));\r
+    RawValue    = ShellCommandLineGetRawValue (Package, 1);\r
+    ProtocolVal = ShellCommandLineGetValue (Package, L"-p");\r
 \r
-    if (ShellCommandLineGetFlag (Package, L"-p")) {\r
-      if (ShellCommandLineGetCount (Package) > 1) {\r
-        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh");\r
-        ShellStatus = SHELL_INVALID_PARAMETER;\r
-      } else if (ShellCommandLineGetValue(Package, L"-p") == NULL) {\r
-        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh",  L"-p");\r
+    if (RawValue == NULL) {\r
+      if (ShellCommandLineGetFlag (Package, L"-p") && (ProtocolVal == NULL)) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p");\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
       } else {\r
         //\r
-        // print by protocol\r
+        // Print information by protocol, The ProtocolVal maybe is name or GUID or NULL.\r
         //\r
-        ShellStatus = DoDhByProtocol(\r
-          ShellCommandLineGetValue(Package, L"-p"),\r
-          VerboseFlag,\r
-          SfoFlag,\r
-          Language,\r
-          DriverFlag\r
-        );\r
+        ShellStatus = DoDhByProtocol (ProtocolVal, VerboseFlag, SfoFlag, Language, DriverFlag);\r
       }\r
-    } else {\r
-      RawValue = ShellCommandLineGetRawValue(Package, 1);\r
-      if (RawValue == NULL) {\r
+    } else if ((RawValue != NULL) &&\r
+               (gUnicodeCollation->StriColl(gUnicodeCollation, L"decode", (CHAR16 *) RawValue) == 0)) {\r
+      if (ShellCommandLineGetFlag (Package, L"-p") && (ProtocolVal == NULL)) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p");\r
+        ShellStatus = SHELL_INVALID_PARAMETER;\r
+      } else {\r
         //\r
-        // Print everything\r
+        // Print decode informatino by protocol.\r
         //\r
-        ShellStatus = DoDhForAll(\r
-          SfoFlag,\r
-          VerboseFlag,\r
-          Language,\r
-          DriverFlag\r
-         );\r
+        ShellStatus = DoDecodeByProtocol (ProtocolVal, Language);\r
+      }\r
+    } else {\r
+      if (ShellCommandLineGetFlag (Package, L"-p")) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh");\r
+        ShellStatus = SHELL_INVALID_PARAMETER;\r
       } else {\r
-        Status = ShellConvertStringToUint64(RawValue, &Intermediate, TRUE, FALSE);\r
-        if (EFI_ERROR(Status) || ConvertHandleIndexToHandle((UINTN)Intermediate) == NULL) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue);\r
+        Status = ShellConvertStringToUint64 (RawValue, &Intermediate, TRUE, FALSE);\r
+        if (EFI_ERROR(Status)) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue);\r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
         } else {\r
-          //\r
-          // print 1 handle\r
-          //\r
-          DoDhByHandle(\r
-            ConvertHandleIndexToHandle((UINTN)Intermediate),\r
-            VerboseFlag,\r
-            SfoFlag,\r
-            Language,\r
-            DriverFlag,\r
-            FALSE\r
-          );\r
+          Handle = ConvertHandleIndexToHandle ((UINTN) Intermediate);\r
+          if (Handle == NULL) {\r
+            ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue);\r
+            ShellStatus = SHELL_INVALID_PARAMETER;\r
+          } else {\r
+            //\r
+            // Print information by handle.\r
+            //\r
+            DoDhByHandle (Handle, VerboseFlag, SfoFlag, Language, DriverFlag, FALSE);\r
+          }\r
         }\r
       }\r
     }\r
 \r
-\r
     ShellCommandLineFreeVarList (Package);\r
     SHELL_FREE_NON_NULL(Language);\r
   }\r
index ac520e2d9251aecd531168173c1d000ea2fa145d..52156d5b05e871203983e6397138e986689fcd97 100644 (file)
@@ -2,7 +2,7 @@
 //\r
 // (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
 // (C) Copyright 2012-2015 Hewlett-Packard Development Company, L.P.<BR>\r
-// Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>\r
+// Copyright (c) 2010 - 2017, 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
 #string STR_DRIVERS_ITEM_LINE     #language en-US "%H%3x%N %08x %1c %1c %1c %3d %3d %-35s %s\r\n"\r
 #string STR_DRIVERS_ITEM_LINE_SFO #language en-US "DriversInfo,"%x","%x","%c","%c","%c","%d","%d","%s","%s"\r\n"\r
 \r
-#string STR_DH_NO_GUID_FOUND      #language en-US "Protocol ID '%s' could not be identified.\r\n"\r
+#string STR_DH_OUTPUT_DECODE      #language en-US "%s: %g\r\n"\r
+#string STR_DH_NO_NAME_FOUND      #language en-US "Protocol Name '%s' could not be identified.\r\n"\r
+#string STR_DH_NO_GUID_FOUND      #language en-US "Protocol GUID '%g' could not be identified.\r\n"\r
 #string STR_DH_SFO_OUTPUT         #language en-US "%s, %s, %H%02x%N, %s, &s\r\n"\r
 #string STR_DH_OUTPUT             #language en-US "%H%02x%N: %s\r\n"\r
+#string STR_DH_OUTPUT_ALL_HEADER  #language en-US "Handle dump\r\n"\r
+#string STR_DH_OUTPUT_GUID_HEADER #language en-US "Handle dump by protocol '%g'\r\n"\r
+#string STR_DH_OUTPUT_NAME_HEADER #language en-US "Handle dump by protocol '%s'\r\n"\r
 #string STR_DH_OUTPUT_SINGLE      #language en-US "%H%02x%N: %x\r\n%s"\r
 #string STR_DH_OUTPUT_SFO         #language en-US "%s, %s, %s, %H%02x%N, %s, %s\r\n"\r
 #string STR_DH_OUTPUT_DRIVER1     #language en-US "   Controller Name    : %B%s%N\r\n"\r