]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
ShellPkg/UefiHandleParsingLib: Remove some unused Guids
[mirror_edk2.git] / ShellPkg / Library / UefiHandleParsingLib / UefiHandleParsingLib.c
index b4cd1b3bee553b1ec93f27144fda5f1e1e4a82b0..f179c410922361e13467a8b9527fbde8cfd6ee82 100644 (file)
@@ -4,23 +4,80 @@
   Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>\r
   (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>\r
   (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<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
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "UefiHandleParsingLib.h"\r
 #include "IndustryStandard/Acpi10.h"\r
+#include "IndustryStandard/Pci.h"\r
+#include <PiDxe.h>\r
+#include <Protocol/FirmwareVolume2.h>\r
 \r
 EFI_HANDLE        mHandleParsingHiiHandle = NULL;\r
 HANDLE_INDEX_LIST mHandleList = {{{NULL,NULL},0,0},0};\r
 GUID_INFO_BLOCK   *mGuidList;\r
 UINTN             mGuidListCount;\r
+\r
+/**\r
+  Function to find the file name associated with a LoadedImageProtocol.\r
+\r
+  @param[in] LoadedImage     An instance of LoadedImageProtocol.\r
+\r
+  @retval                    A string representation of the file name associated\r
+                             with LoadedImage, or NULL if no name can be found.\r
+**/\r
+CHAR16*\r
+FindLoadedImageFileName (\r
+  IN EFI_LOADED_IMAGE_PROTOCOL *LoadedImage\r
+  )\r
+{\r
+  EFI_GUID                       *NameGuid;\r
+  EFI_STATUS                     Status;\r
+  EFI_FIRMWARE_VOLUME2_PROTOCOL  *Fv;\r
+  VOID                           *Buffer;\r
+  UINTN                          BufferSize;\r
+  UINT32                         AuthenticationStatus;\r
+\r
+  if ((LoadedImage == NULL) || (LoadedImage->FilePath == NULL)) {\r
+    return NULL;\r
+  }\r
+\r
+  NameGuid = EfiGetNameGuidFromFwVolDevicePathNode((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)LoadedImage->FilePath);\r
+\r
+  if (NameGuid == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Get the FirmwareVolume2Protocol of the device handle that this image was loaded from.\r
+  //\r
+  Status = gBS->HandleProtocol (LoadedImage->DeviceHandle, &gEfiFirmwareVolume2ProtocolGuid, (VOID**) &Fv);\r
+\r
+  //\r
+  // FirmwareVolume2Protocol is PI, and is not required to be available.\r
+  //\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Read the user interface section of the image.\r
+  //\r
+  Buffer = NULL;\r
+  Status = Fv->ReadSection(Fv, NameGuid, EFI_SECTION_USER_INTERFACE, 0, &Buffer, &BufferSize, &AuthenticationStatus);\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // ReadSection returns just the section data, without any section header. For\r
+  // a user interface section, the only data is the file name.\r
+  //\r
+  return Buffer;\r
+}\r
+\r
 /**\r
   Function to translate the EFI_MEMORY_TYPE into a string.\r
 \r
@@ -169,20 +226,12 @@ LoadedImageProtocolDumpInformation(
   EFI_STATUS                        Status;\r
   CHAR16                            *RetVal;\r
   CHAR16                            *Temp;\r
+  CHAR16                            *FileName;\r
+  CHAR8                             *PdbFileName;\r
+  CHAR16                            *FilePath;\r
   CHAR16                            *CodeType;\r
   CHAR16                            *DataType;\r
 \r
-  if (!Verbose) {\r
-    return (CatSPrint(NULL, L"LoadedImage"));\r
-  }\r
-\r
-  HandleParsingHiiInit();\r
-\r
-  Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_MAIN), NULL);\r
-  if (Temp == NULL) {\r
-    return NULL;\r
-  }\r
-\r
   Status = gBS->OpenProtocol (\r
                 TheHandle,\r
                 &gEfiLoadedImageProtocolGuid,\r
@@ -193,21 +242,50 @@ LoadedImageProtocolDumpInformation(
                );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    SHELL_FREE_NON_NULL (Temp);\r
     return NULL;\r
   }\r
 \r
+  FileName = FindLoadedImageFileName(LoadedImage);\r
+  FilePath = ConvertDevicePathToText(LoadedImage->FilePath, TRUE, TRUE);\r
+  if (!Verbose) {\r
+    if (FileName == NULL) {\r
+      FileName = FilePath;\r
+    } else {\r
+      SHELL_FREE_NON_NULL(FilePath);\r
+    }\r
+    return FileName;\r
+  }\r
+\r
+  HandleParsingHiiInit();\r
+  RetVal = NULL;\r
+  if (FileName != NULL) {\r
+    Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_NAME), NULL);\r
+\r
+    if (Temp != NULL) {\r
+      RetVal = CatSPrint(NULL, Temp, FileName);\r
+    }\r
+\r
+    SHELL_FREE_NON_NULL(Temp);\r
+    SHELL_FREE_NON_NULL(FileName);\r
+  }\r
+\r
+  Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_MAIN), NULL);\r
+  if (Temp == NULL) {\r
+    return NULL;\r
+  }\r
+  PdbFileName = PeCoffLoaderGetPdbPointer (LoadedImage->ImageBase);\r
   DataType = ConvertMemoryType(LoadedImage->ImageDataType);\r
   CodeType = ConvertMemoryType(LoadedImage->ImageCodeType);\r
 \r
   RetVal = CatSPrint(\r
-             NULL,\r
+             RetVal,\r
              Temp,\r
              LoadedImage->Revision,\r
              LoadedImage->ParentHandle,\r
              LoadedImage->SystemTable,\r
              LoadedImage->DeviceHandle,\r
-             LoadedImage->FilePath,\r
+             FilePath,\r
+             PdbFileName,\r
              LoadedImage->LoadOptionsSize,\r
              LoadedImage->LoadOptions,\r
              LoadedImage->ImageBase,\r
@@ -219,6 +297,7 @@ LoadedImageProtocolDumpInformation(
 \r
 \r
   SHELL_FREE_NON_NULL(Temp);\r
+  SHELL_FREE_NON_NULL(FilePath);\r
   SHELL_FREE_NON_NULL(CodeType);\r
   SHELL_FREE_NON_NULL(DataType);\r
 \r
@@ -410,7 +489,7 @@ EdidDiscoveredProtocolDumpInformation (
     SHELL_FREE_NON_NULL (RetVal);\r
     RetVal = TempRetVal;\r
 \r
-    TempRetVal = CatSDumpHex (RetVal, 7, 0, EdidDiscovered->SizeOfEdid, EdidDiscovered->Edid);\r
+    TempRetVal = CatSDumpHex (RetVal, 4, 0, EdidDiscovered->SizeOfEdid, EdidDiscovered->Edid);\r
     RetVal = TempRetVal;\r
   }\r
   return RetVal;\r
@@ -474,7 +553,7 @@ EdidActiveProtocolDumpInformation (
     SHELL_FREE_NON_NULL (RetVal);\r
     RetVal = TempRetVal;\r
 \r
-    TempRetVal = CatSDumpHex (RetVal, 7, 0, EdidActive->SizeOfEdid, EdidActive->Edid);\r
+    TempRetVal = CatSDumpHex (RetVal, 4, 0, EdidActive->SizeOfEdid, EdidActive->Edid);\r
     RetVal = TempRetVal;\r
   }\r
   return RetVal;\r
@@ -527,7 +606,7 @@ PciRootBridgeIoDumpInformation(
   if (Temp == NULL) {\r
     return NULL;\r
   }\r
-  Temp2 = CatSPrint(L"\r\n", Temp, PciRootBridgeIo->ParentHandle);\r
+  Temp2 = CatSPrint(NULL, Temp, PciRootBridgeIo->ParentHandle);\r
   FreePool(Temp);\r
   RetVal = Temp2;\r
   Temp2 = NULL;\r
@@ -597,7 +676,7 @@ PciRootBridgeIoDumpInformation(
         break;\r
       }\r
       if (Temp != NULL) {\r
-        Temp2 = CatSPrint(RetVal, L"%s", Temp);\r
+        Temp2 = CatSPrint(RetVal, L"\r\n%s", Temp);\r
         FreePool(Temp);\r
         FreePool(RetVal);\r
         RetVal = Temp2;\r
@@ -605,7 +684,7 @@ PciRootBridgeIoDumpInformation(
       }\r
 \r
       Temp2 = CatSPrint(RetVal,\r
-        L"%H%02x    %016lx  %016lx  %02x%N\r\n",\r
+        L"%%H%02x    %016lx  %016lx  %02x%%N",\r
         Configuration->SpecificFlag,\r
         Configuration->AddrRangeMin,\r
         Configuration->AddrRangeMax,\r
@@ -767,6 +846,50 @@ ConvertDevicePathToShortText(
   return (Temp);\r
 }\r
 \r
+/**\r
+  Function to dump protocol information.\r
+\r
+  This will allocate the return buffer from boot services pool.\r
+\r
+  @param[in] TheHandle      The handle that has the protocol installed.\r
+  @param[in] Verbose        TRUE for additional information, FALSE otherwise.\r
+  @param[in] Protocol       The protocol is needed to dump.\r
+\r
+  @retval A pointer to a string containing the information.\r
+**/\r
+STATIC CHAR16*\r
+EFIAPI\r
+DevicePathProtocolDumpInformationEx (\r
+  IN CONST EFI_HANDLE   TheHandle,\r
+  IN CONST BOOLEAN      Verbose,\r
+  IN       EFI_GUID     *Protocol\r
+)\r
+{\r
+  EFI_DEVICE_PATH_PROTOCOL          *DevPath;\r
+  CHAR16                            *DevPathStr;\r
+  CHAR16                            *DevPathStrTemp;\r
+  UINTN                             Size;\r
+  EFI_STATUS                        Status;\r
+  DevPathStr     = NULL;\r
+  DevPathStrTemp = NULL;\r
+  Status = gBS->OpenProtocol(TheHandle, Protocol, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
+  if (!EFI_ERROR(Status)) {\r
+    DevPathStr = ConvertDevicePathToShortText (DevPath, Verbose, 30);\r
+    if (Verbose) {\r
+      Size = StrSize(DevPathStr) + sizeof(CHAR16) * 2;\r
+      DevPathStrTemp = AllocateZeroPool (Size);\r
+      if (DevPathStrTemp != NULL) {\r
+        StrnCatS (DevPathStrTemp, Size/sizeof(CHAR16), L"  ", 2);\r
+        StrnCatS (DevPathStrTemp, Size/sizeof(CHAR16), DevPathStr, StrLen (DevPathStr));\r
+      }\r
+      FreePool (DevPathStr);\r
+      DevPathStr = DevPathStrTemp;\r
+    }\r
+    gBS->CloseProtocol(TheHandle, Protocol, gImageHandle, NULL);\r
+  }\r
+  return DevPathStr;\r
+}\r
+\r
 /**\r
   Function to dump information about DevicePath protocol.\r
 \r
@@ -784,17 +907,7 @@ DevicePathProtocolDumpInformation(
   IN CONST BOOLEAN    Verbose\r
   )\r
 {\r
-  EFI_DEVICE_PATH_PROTOCOL          *DevPath;\r
-  CHAR16                            *Temp;\r
-  EFI_STATUS                        Status;\r
-  Temp = NULL;\r
-\r
-  Status = gBS->OpenProtocol(TheHandle, &gEfiDevicePathProtocolGuid, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
-  if (!EFI_ERROR(Status)) {\r
-    Temp = ConvertDevicePathToShortText (DevPath, Verbose, 30);\r
-    gBS->CloseProtocol(TheHandle, &gEfiDevicePathProtocolGuid, gImageHandle, NULL);\r
-  }\r
-  return (Temp);\r
+  return DevicePathProtocolDumpInformationEx (TheHandle, Verbose, &gEfiDevicePathProtocolGuid);\r
 }\r
 \r
 /**\r
@@ -814,17 +927,372 @@ LoadedImageDevicePathProtocolDumpInformation(
   IN CONST BOOLEAN    Verbose\r
   )\r
 {\r
-  EFI_DEVICE_PATH_PROTOCOL          *DevPath;\r
-  CHAR16                            *Temp;\r
-  EFI_STATUS                        Status;\r
-  Temp = NULL;\r
+  return DevicePathProtocolDumpInformationEx (TheHandle, Verbose, &gEfiLoadedImageDevicePathProtocolGuid);\r
+}\r
 \r
-  Status = gBS->OpenProtocol(TheHandle, &gEfiLoadedImageDevicePathProtocolGuid, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
-  if (!EFI_ERROR(Status)) {\r
-    Temp = ConvertDevicePathToShortText (DevPath, Verbose, 30);\r
-    gBS->CloseProtocol(TheHandle, &gEfiDevicePathProtocolGuid, gImageHandle, NULL);\r
+/**\r
+  Function to dump information about BusSpecificDriverOverride protocol.\r
+\r
+  This will allocate the return buffer from boot services pool.\r
+\r
+  @param[in] TheHandle      The handle that has the protocol installed.\r
+  @param[in] Verbose        TRUE for additional information, FALSE otherwise.\r
+\r
+  @retval A pointer to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+BusSpecificDriverOverrideProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE TheHandle,\r
+  IN CONST BOOLEAN    Verbose\r
+  )\r
+{\r
+  EFI_STATUS                                Status;\r
+  CHAR16                                    *GetString;\r
+  CHAR16                                    *RetVal;\r
+  CHAR16                                    *TempRetVal;\r
+  EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride;\r
+  EFI_LOADED_IMAGE_PROTOCOL                 *LoadedImage;\r
+  EFI_HANDLE                                ImageHandle;\r
+  UINTN                                     Size;\r
+\r
+  if (!Verbose) {\r
+    return NULL;\r
   }\r
-  return (Temp);\r
+  Size        = 0;\r
+  GetString   = NULL;\r
+  RetVal      = NULL;\r
+  TempRetVal  = NULL;\r
+  ImageHandle = 0;\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  TheHandle,\r
+                  &gEfiBusSpecificDriverOverrideProtocolGuid,\r
+                  (VOID**)&BusSpecificDriverOverride,\r
+                  gImageHandle,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+  HandleParsingHiiInit ();\r
+  GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_BSDO_DUMP_MAIN), NULL);\r
+  if (GetString == NULL) {\r
+    return NULL;\r
+  }\r
+  do {\r
+    Status = BusSpecificDriverOverride->GetDriver (\r
+                                          BusSpecificDriverOverride,\r
+                                          &ImageHandle\r
+                                          );\r
+    if (!EFI_ERROR (Status)) {\r
+      Status = gBS->HandleProtocol (\r
+                      ImageHandle,\r
+                      &gEfiLoadedImageProtocolGuid,\r
+                      (VOID **) &LoadedImage\r
+                      );\r
+      if(!EFI_ERROR (Status)) {\r
+        TempRetVal = CatSPrint (\r
+                       TempRetVal,\r
+                       GetString,\r
+                       ConvertHandleToHandleIndex (ImageHandle),\r
+                       ConvertDevicePathToText (LoadedImage->FilePath, TRUE, TRUE)\r
+                       );\r
+        StrnCatGrow (&RetVal, &Size, TempRetVal, 0);\r
+        SHELL_FREE_NON_NULL (TempRetVal);\r
+      }\r
+    }\r
+  } while (!EFI_ERROR (Status));\r
+\r
+  SHELL_FREE_NON_NULL (GetString);\r
+  return RetVal;\r
+}\r
+\r
+/**\r
+  Function to dump information about BlockIo protocol.\r
+\r
+  This will allocate the return buffer from boot services pool.\r
+\r
+  @param[in] TheHandle      The handle that has the protocol installed.\r
+  @param[in] Verbose        TRUE for additional information, FALSE otherwise.\r
+\r
+  @retval A pointer to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+BlockIoProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE TheHandle,\r
+  IN CONST BOOLEAN    Verbose\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+  EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+  EFI_BLOCK_IO_MEDIA    *BlockMedia;\r
+  CHAR16                *GetString;\r
+  CHAR16                *RetVal;\r
+\r
+  if (!Verbose) {\r
+    return NULL;\r
+  }\r
+  GetString   = NULL;\r
+  RetVal = NULL;\r
+\r
+  Status = gBS->OpenProtocol (\r
+                TheHandle,\r
+                &gEfiBlockIoProtocolGuid,\r
+                (VOID**)&BlockIo,\r
+                gImageHandle,\r
+                NULL,\r
+                EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                );\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+  BlockMedia = BlockIo->Media;\r
+  //\r
+  // Per spec:\r
+  //   The function (ReadBlocks) must return EFI_NO_MEDIA or\r
+  //   EFI_MEDIA_CHANGED even if LBA, BufferSize, or Buffer are invalid so the caller can probe\r
+  //   for changes in media state.\r
+  //\r
+  BlockIo->ReadBlocks (\r
+             BlockIo,\r
+             BlockIo->Media->MediaId,\r
+             0,\r
+             0,\r
+             NULL\r
+             );\r
+\r
+  HandleParsingHiiInit ();\r
+  GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_BLOCKIO_INFO), NULL);\r
+  if (GetString == NULL) {\r
+    return NULL;\r
+  }\r
+  RetVal = CatSPrint (\r
+            RetVal,\r
+            GetString,\r
+            BlockMedia->RemovableMedia ? L"Removable " : L"Fixed ",\r
+            BlockMedia->MediaPresent ? L"" : L"not-present ",\r
+            BlockMedia->MediaId,\r
+            BlockMedia->BlockSize,\r
+            BlockMedia->LastBlock,\r
+            MultU64x32 (BlockMedia->LastBlock + 1, BlockMedia->BlockSize),\r
+            BlockMedia->LogicalPartition ? L"partition" : L"raw",\r
+            BlockMedia->ReadOnly ? L"ro" : L"rw",\r
+            BlockMedia->WriteCaching ? L"cached" : L"!cached"\r
+            );\r
+\r
+  SHELL_FREE_NON_NULL (GetString);\r
+  return RetVal;\r
+}\r
+\r
+/**\r
+  Function to dump information about DebugSupport Protocol.\r
+\r
+  @param[in] TheHandle      The handle that has the protocol installed.\r
+  @param[in] Verbose        TRUE for additional information, FALSE otherwise.\r
+\r
+  @retval A pointer to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+DebugSupportProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE TheHandle,\r
+  IN CONST BOOLEAN    Verbose\r
+  )\r
+{\r
+  EFI_STATUS                  Status;\r
+  EFI_DEBUG_SUPPORT_PROTOCOL  *DebugSupport;\r
+  CHAR16                      *GetString;\r
+  CHAR16                      *RetVal;\r
+\r
+  if (!Verbose) {\r
+    return NULL;\r
+  }\r
+  GetString = NULL;\r
+  RetVal = NULL;\r
+  Status = gBS->OpenProtocol (\r
+                TheHandle,\r
+                &gEfiDebugSupportProtocolGuid,\r
+                (VOID**)&DebugSupport,\r
+                gImageHandle,\r
+                NULL,\r
+                EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                );\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+  HandleParsingHiiInit ();\r
+  GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_DEBUGSUPPORT_INFO), NULL);\r
+  if (GetString == NULL) {\r
+    return NULL;\r
+  }\r
+  //\r
+  // Dump Debug support info\r
+  //\r
+  switch (DebugSupport->Isa) {\r
+  case (IsaIa32):\r
+    RetVal = CatSPrint (RetVal, GetString, L"IA-32");\r
+    break;\r
+  case (IsaIpf):\r
+    RetVal = CatSPrint (RetVal, GetString, L"IPF");\r
+    break;\r
+  case (IsaEbc):\r
+    RetVal = CatSPrint (RetVal, GetString, L"EBC");\r
+    break;\r
+  default:\r
+    SHELL_FREE_NON_NULL (GetString);\r
+    GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_DEBUGSUPPORT_UNKNOWN), NULL);\r
+    RetVal = GetString != NULL ? CatSPrint (RetVal, GetString, DebugSupport->Isa) : NULL;\r
+    break;\r
+  }\r
+\r
+  SHELL_FREE_NON_NULL (GetString);\r
+  return RetVal;\r
+}\r
+\r
+/**\r
+  Function to dump information about PciIoProtocol.\r
+\r
+  This will allocate the return buffer from boot services pool.\r
+\r
+  @param[in] TheHandle      The handle that has PciRootBridgeIo installed.\r
+  @param[in] Verbose        TRUE for additional information, FALSE otherwise.\r
+\r
+  @retval A poitner to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+PciIoProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE TheHandle,\r
+  IN CONST BOOLEAN    Verbose\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  EFI_PCI_IO_PROTOCOL     *PciIo;\r
+  PCI_TYPE00              Pci;\r
+  UINTN                   Segment;\r
+  UINTN                   Bus;\r
+  UINTN                   Device;\r
+  UINTN                   Function;\r
+  UINTN                   Index;\r
+  CHAR16                  *GetString;\r
+  CHAR16                  *TempRetVal;\r
+  CHAR16                  *RetVal;\r
+\r
+  if (!Verbose) {\r
+    return (NULL);\r
+  }\r
+  RetVal = NULL;\r
+  GetString   = NULL;\r
+  TempRetVal  = NULL;\r
+  Status = gBS->OpenProtocol (\r
+                  TheHandle,\r
+                  &gEfiPciIoProtocolGuid,\r
+                  (VOID**)&PciIo,\r
+                  gImageHandle,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
+  if (EFI_ERROR(Status)) {\r
+    return NULL;\r
+  }\r
+  PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0, sizeof (Pci), &Pci);\r
+  PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);\r
+  HandleParsingHiiInit ();\r
+  GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIIO_DUMP_MAIN), NULL);\r
+  if (GetString == NULL) {\r
+    return NULL;\r
+  }\r
+  RetVal = CatSPrint (\r
+            NULL,\r
+            GetString,\r
+            Segment,\r
+            Bus,\r
+            Device,\r
+            Function,\r
+            PciIo->RomSize,\r
+            PciIo->RomImage,\r
+            Pci.Hdr.VendorId,\r
+            Pci.Hdr.DeviceId,\r
+            Pci.Hdr.ClassCode[0],\r
+            Pci.Hdr.ClassCode[1],\r
+            Pci.Hdr.ClassCode[2]\r
+            );\r
+  for (Index = 0; Index < sizeof (Pci); Index ++) {\r
+    if ((Index % 0x10) == 0) {\r
+      TempRetVal = CatSPrint (RetVal, L"\r\n       %02x", *((UINT8 *) (&Pci) + Index));\r
+    } else {\r
+      TempRetVal = CatSPrint (RetVal, L"%02x", *((UINT8 *) (&Pci) + Index));\r
+    }\r
+    FreePool (RetVal);\r
+    RetVal = TempRetVal;\r
+    TempRetVal = NULL;\r
+  }\r
+\r
+  FreePool(GetString);\r
+  return RetVal;\r
+}\r
+\r
+/**\r
+  Function to dump information about UsbIoProtocol.\r
+\r
+  This will allocate the return buffer from boot services pool.\r
+\r
+  @param[in] TheHandle      The handle that has PciRootBridgeIo installed.\r
+  @param[in] Verbose        TRUE for additional information, FALSE otherwise.\r
+\r
+  @retval A poitner to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+UsbIoProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE TheHandle,\r
+  IN CONST BOOLEAN    Verbose\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  EFI_USB_IO_PROTOCOL           *UsbIo;\r
+  EFI_USB_INTERFACE_DESCRIPTOR  InterfaceDesc;\r
+  CHAR16                        *GetString;\r
+  CHAR16                        *RetVal;\r
+\r
+  if (!Verbose) {\r
+    return (NULL);\r
+  }\r
+  RetVal = NULL;\r
+  GetString = NULL;\r
+  Status = gBS->OpenProtocol (\r
+                  TheHandle,\r
+                  &gEfiUsbIoProtocolGuid,\r
+                  (VOID**)&UsbIo,\r
+                  gImageHandle,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
+  if (EFI_ERROR(Status)) {\r
+    return NULL;\r
+  }\r
+  UsbIo->UsbGetInterfaceDescriptor (UsbIo, &InterfaceDesc);\r
+  HandleParsingHiiInit ();\r
+  GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_USBIO_DUMP_MAIN), NULL);\r
+  if (GetString == NULL) {\r
+    return NULL;\r
+  }\r
+  RetVal = CatSPrint (\r
+            NULL,\r
+            GetString,\r
+            InterfaceDesc.InterfaceNumber,\r
+            InterfaceDesc.InterfaceClass,\r
+            InterfaceDesc.InterfaceSubClass,\r
+            InterfaceDesc.InterfaceProtocol\r
+            );\r
+\r
+  FreePool (GetString);\r
+  return RetVal;\r
 }\r
 \r
 /**\r
@@ -1457,6 +1925,87 @@ ERROR_EXIT:
   return NULL;\r
 }\r
 \r
+/**\r
+  Function to dump information about Partition Information protocol.\r
+\r
+  This will allocate the return buffer from boot services pool.\r
+\r
+  @param[in] TheHandle      The handle that has the protocol installed.\r
+  @param[in] Verbose        TRUE for additional information, FALSE otherwise.\r
+\r
+  @retval A pointer to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+PartitionInfoProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE TheHandle,\r
+  IN CONST BOOLEAN    Verbose\r
+  )\r
+{\r
+  EFI_STATUS                      Status;\r
+  EFI_PARTITION_INFO_PROTOCOL     *PartitionInfo;\r
+  CHAR16                          *PartitionType;\r
+  CHAR16                          *EfiSystemPartition;\r
+  CHAR16                          *RetVal;\r
+\r
+  if (!Verbose) {\r
+    return NULL;\r
+  }\r
+\r
+  Status = gBS->OpenProtocol (\r
+                TheHandle,\r
+                &gEfiPartitionInfoProtocolGuid,\r
+                (VOID**)&PartitionInfo,\r
+                gImageHandle,\r
+                NULL,\r
+                EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                );\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  HandleParsingHiiInit ();\r
+\r
+  switch (PartitionInfo->Type) {\r
+  case PARTITION_TYPE_OTHER:\r
+    PartitionType = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PARTINFO_DUMP_TYPE_OTHER), NULL);\r
+    break;\r
+  case PARTITION_TYPE_MBR:\r
+    PartitionType = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PARTINFO_DUMP_TYPE_MBR), NULL);\r
+    break;\r
+  case PARTITION_TYPE_GPT:\r
+    PartitionType = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PARTINFO_DUMP_TYPE_GPT), NULL);\r
+    break;\r
+  default:\r
+    PartitionType = NULL;\r
+    break;\r
+  }\r
+  if (PartitionType == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  if (PartitionInfo->System == 1) {\r
+    EfiSystemPartition = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PARTINFO_DUMP_EFI_SYS_PART), NULL);\r
+  } else {\r
+    EfiSystemPartition = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN(STR_PARTINFO_DUMP_NOT_EFI_SYS_PART), NULL);\r
+  }\r
+  if (EfiSystemPartition == NULL) {\r
+    SHELL_FREE_NON_NULL (PartitionType);\r
+    return NULL;\r
+  }\r
+\r
+  RetVal = CatSPrint (\r
+             NULL,\r
+             L"%s\r\n%s",\r
+             PartitionType,\r
+             EfiSystemPartition\r
+             );\r
+\r
+  SHELL_FREE_NON_NULL (EfiSystemPartition);\r
+  SHELL_FREE_NON_NULL (PartitionType);\r
+  return RetVal;\r
+}\r
+\r
 //\r
 // Put the information on the NT32 protocol GUIDs here so we are not dependant on the Nt32Pkg\r
 //\r
@@ -1513,7 +2062,7 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_DEVICE_PATH_VTUTF8),    &gEfiVTUTF8Guid,                                  NULL},\r
   {STRING_TOKEN(STR_DRIVER_BINDING),        &gEfiDriverBindingProtocolGuid,                   NULL},\r
   {STRING_TOKEN(STR_PLATFORM_OVERRIDE),     &gEfiPlatformDriverOverrideProtocolGuid,          NULL},\r
-  {STRING_TOKEN(STR_BUS_OVERRIDE),          &gEfiBusSpecificDriverOverrideProtocolGuid,       NULL},\r
+  {STRING_TOKEN(STR_BUS_OVERRIDE),          &gEfiBusSpecificDriverOverrideProtocolGuid,       BusSpecificDriverOverrideProtocolDumpInformation},\r
   {STRING_TOKEN(STR_DRIVER_DIAG),           &gEfiDriverDiagnosticsProtocolGuid,               NULL},\r
   {STRING_TOKEN(STR_DRIVER_DIAG2),          &gEfiDriverDiagnostics2ProtocolGuid,              NULL},\r
   {STRING_TOKEN(STR_DRIVER_CN),             &gEfiComponentNameProtocolGuid,                   NULL},\r
@@ -1538,19 +2087,19 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_SIMPLE_FILE_SYS),       &gEfiSimpleFileSystemProtocolGuid,                NULL},\r
   {STRING_TOKEN(STR_TAPE_IO),               &gEfiTapeIoProtocolGuid,                          NULL},\r
   {STRING_TOKEN(STR_DISK_IO),               &gEfiDiskIoProtocolGuid,                          NULL},\r
-  {STRING_TOKEN(STR_BLK_IO),                &gEfiBlockIoProtocolGuid,                         NULL},\r
+  {STRING_TOKEN(STR_BLK_IO),                &gEfiBlockIoProtocolGuid,                         BlockIoProtocolDumpInformation},\r
   {STRING_TOKEN(STR_UC),                    &gEfiUnicodeCollationProtocolGuid,                NULL},\r
   {STRING_TOKEN(STR_UC2),                   &gEfiUnicodeCollation2ProtocolGuid,               NULL},\r
   {STRING_TOKEN(STR_PCIRB_IO),              &gEfiPciRootBridgeIoProtocolGuid,                 PciRootBridgeIoDumpInformation},\r
-  {STRING_TOKEN(STR_PCI_IO),                &gEfiPciIoProtocolGuid,                           NULL},\r
+  {STRING_TOKEN(STR_PCI_IO),                &gEfiPciIoProtocolGuid,                           PciIoProtocolDumpInformation},\r
   {STRING_TOKEN(STR_SCSI_PT),               &gEfiScsiPassThruProtocolGuid,                    NULL},\r
   {STRING_TOKEN(STR_SCSI_IO),               &gEfiScsiIoProtocolGuid,                          NULL},\r
   {STRING_TOKEN(STR_SCSI_PT_EXT),           &gEfiExtScsiPassThruProtocolGuid,                 NULL},\r
   {STRING_TOKEN(STR_ISCSI),                 &gEfiIScsiInitiatorNameProtocolGuid,              NULL},\r
-  {STRING_TOKEN(STR_USB_IO),                &gEfiUsbIoProtocolGuid,                           NULL},\r
+  {STRING_TOKEN(STR_USB_IO),                &gEfiUsbIoProtocolGuid,                           UsbIoProtocolDumpInformation},\r
   {STRING_TOKEN(STR_USB_HC),                &gEfiUsbHcProtocolGuid,                           NULL},\r
   {STRING_TOKEN(STR_USB_HC2),               &gEfiUsb2HcProtocolGuid,                          NULL},\r
-  {STRING_TOKEN(STR_DEBUG_SUPPORT),         &gEfiDebugSupportProtocolGuid,                    NULL},\r
+  {STRING_TOKEN(STR_DEBUG_SUPPORT),         &gEfiDebugSupportProtocolGuid,                    DebugSupportProtocolDumpInformation},\r
   {STRING_TOKEN(STR_DEBUG_PORT),            &gEfiDebugPortProtocolGuid,                       NULL},\r
   {STRING_TOKEN(STR_DECOMPRESS),            &gEfiDecompressProtocolGuid,                      NULL},\r
   {STRING_TOKEN(STR_ACPI_TABLE),            &gEfiAcpiTableProtocolGuid,                       NULL},\r
@@ -1670,6 +2219,37 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_DISK_IO2),              &gEfiDiskIo2ProtocolGuid,                         NULL},\r
   {STRING_TOKEN(STR_ADAPTER_INFO),          &gEfiAdapterInformationProtocolGuid,              AdapterInformationDumpInformation},\r
 \r
+//\r
+// UEFI2.5\r
+//\r
+  {STRING_TOKEN(STR_TLS_SB),                &gEfiTlsServiceBindingProtocolGuid,              NULL},\r
+  {STRING_TOKEN(STR_TLS),                   &gEfiTlsProtocolGuid,                            NULL},\r
+  {STRING_TOKEN(STR_TLS_CONFIG),            &gEfiTlsConfigurationProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_SUPPLICANT_SB),         &gEfiSupplicantServiceBindingProtocolGuid,       NULL},\r
+  {STRING_TOKEN(STR_SUPPLICANT),            &gEfiSupplicantProtocolGuid,                     NULL},\r
+\r
+//\r
+// UEFI2.6\r
+//\r
+  {STRING_TOKEN(STR_WIFI2),                 &gEfiWiFi2ProtocolGuid,                          NULL},\r
+  {STRING_TOKEN(STR_RAMDISK),               &gEfiRamDiskProtocolGuid,                        NULL},\r
+  {STRING_TOKEN(STR_HII_ID),                &gEfiHiiImageDecoderProtocolGuid,                NULL},\r
+  {STRING_TOKEN(STR_HII_IE),                &gEfiHiiImageExProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_SD_MPT),                &gEfiSdMmcPassThruProtocolGuid,                  NULL},\r
+  {STRING_TOKEN(STR_ERASE_BLOCK),           &gEfiEraseBlockProtocolGuid,                     NULL},\r
+\r
+//\r
+// UEFI2.7\r
+//\r
+  {STRING_TOKEN(STR_BLUETOOTH_ATTR),        &gEfiBluetoothAttributeProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_BLUETOOTH_ATTR_SB),     &gEfiBluetoothAttributeServiceBindingProtocolGuid, NULL},\r
+  {STRING_TOKEN(STR_BLUETOOTH_LE_CONFIG),   &gEfiBluetoothLeConfigProtocolGuid,                NULL},\r
+  {STRING_TOKEN(STR_UFS_DEV_CONFIG),        &gEfiUfsDeviceConfigProtocolGuid,                  NULL},\r
+  {STRING_TOKEN(STR_HTTP_BOOT_CALL),        &gEfiHttpBootCallbackProtocolGuid,                 NULL},\r
+  {STRING_TOKEN(STR_RESET_NOTI),            &gEfiResetNotificationProtocolGuid,                NULL},\r
+  {STRING_TOKEN(STR_PARTITION_INFO),        &gEfiPartitionInfoProtocolGuid,                    PartitionInfoProtocolDumpInformation},\r
+  {STRING_TOKEN(STR_HII_POPUP),             &gEfiHiiPopupProtocolGuid,                         NULL},\r
+\r
 //\r
 // PI Spec ones\r
 //\r
@@ -1722,7 +2302,7 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_S_COMM),                &gEfiSmmCommunicationProtocolGuid,                NULL},\r
   {STRING_TOKEN(STR_S_STAT),                &gEfiSmmStatusCodeProtocolGuid,                   NULL},\r
   {STRING_TOKEN(STR_S_CPU),                 &gEfiSmmCpuProtocolGuid,                          NULL},\r
-  {STRING_TOKEN(STR_S_PCIRBIO),             &gEfiPciRootBridgeIoProtocolGuid,                 NULL},\r
+  {STRING_TOKEN(STR_S_PCIRBIO),             &gEfiSmmPciRootBridgeIoProtocolGuid,              NULL},\r
   {STRING_TOKEN(STR_S_SWD),                 &gEfiSmmSwDispatch2ProtocolGuid,                  NULL},\r
   {STRING_TOKEN(STR_S_SXD),                 &gEfiSmmSxDispatch2ProtocolGuid,                  NULL},\r
   {STRING_TOKEN(STR_S_PTD2),                &gEfiSmmPeriodicTimerDispatch2ProtocolGuid,       NULL},\r
@@ -1735,23 +2315,6 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_FVB2),                  &gEfiFirmwareVolumeBlock2ProtocolGuid,            NULL},\r
   {STRING_TOKEN(STR_CPUIO2),                &gEfiCpuIo2ProtocolGuid,                          NULL},\r
   {STRING_TOKEN(STR_LEGACY_R2),             &gEfiLegacyRegion2ProtocolGuid,                   NULL},\r
-  {STRING_TOKEN(STR_SAL_MIP),               &gEfiSalMcaInitPmiProtocolGuid,                   NULL},\r
-  {STRING_TOKEN(STR_ES_BS),                 &gEfiExtendedSalBootServiceProtocolGuid,          NULL},\r
-  {STRING_TOKEN(STR_ES_BIO),                &gEfiExtendedSalBaseIoServicesProtocolGuid,       NULL},\r
-  {STRING_TOKEN(STR_ES_STALL),              &gEfiExtendedSalStallServicesProtocolGuid,        NULL},\r
-  {STRING_TOKEN(STR_ES_RTC),                &gEfiExtendedSalRtcServicesProtocolGuid,          NULL},\r
-  {STRING_TOKEN(STR_ES_VS),                 &gEfiExtendedSalVariableServicesProtocolGuid,     NULL},\r
-  {STRING_TOKEN(STR_ES_MTC),                &gEfiExtendedSalMtcServicesProtocolGuid,          NULL},\r
-  {STRING_TOKEN(STR_ES_RESET),              &gEfiExtendedSalResetServicesProtocolGuid,        NULL},\r
-  {STRING_TOKEN(STR_ES_SC),                 &gEfiExtendedSalStatusCodeServicesProtocolGuid,   NULL},\r
-  {STRING_TOKEN(STR_ES_FBS),                &gEfiExtendedSalFvBlockServicesProtocolGuid,      NULL},\r
-  {STRING_TOKEN(STR_ES_MP),                 &gEfiExtendedSalMpServicesProtocolGuid,           NULL},\r
-  {STRING_TOKEN(STR_ES_PAL),                &gEfiExtendedSalPalServicesProtocolGuid,          NULL},\r
-  {STRING_TOKEN(STR_ES_BASE),               &gEfiExtendedSalBaseServicesProtocolGuid,         NULL},\r
-  {STRING_TOKEN(STR_ES_MCA),                &gEfiExtendedSalMcaServicesProtocolGuid,          NULL},\r
-  {STRING_TOKEN(STR_ES_PCI),                &gEfiExtendedSalPciServicesProtocolGuid,          NULL},\r
-  {STRING_TOKEN(STR_ES_CACHE),              &gEfiExtendedSalCacheServicesProtocolGuid,        NULL},\r
-  {STRING_TOKEN(STR_ES_MCA_LOG),            &gEfiExtendedSalMcaLogServicesProtocolGuid,       NULL},\r
   {STRING_TOKEN(STR_S2ARCH),                &gEfiSecurity2ArchProtocolGuid,                   NULL},\r
   {STRING_TOKEN(STR_EODXE),                 &gEfiSmmEndOfDxeProtocolGuid,                     NULL},\r
   {STRING_TOKEN(STR_ISAHC),                 &gEfiIsaHcProtocolGuid,                           NULL},\r
@@ -1763,7 +2326,6 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_I2CEN),                 &gEfiI2cEnumerateProtocolGuid,                    NULL},\r
   {STRING_TOKEN(STR_I2C_H),                 &gEfiI2cHostProtocolGuid,                         NULL},\r
   {STRING_TOKEN(STR_I2C_BCM),               &gEfiI2cBusConfigurationManagementProtocolGuid,   NULL},\r
-  {STRING_TOKEN(STR_TREE),                  &gEfiTrEEProtocolGuid,                            NULL},\r
   {STRING_TOKEN(STR_TCG2),                  &gEfiTcg2ProtocolGuid,                            NULL},\r
   {STRING_TOKEN(STR_TIMESTAMP),             &gEfiTimestampProtocolGuid,                       NULL},\r
   {STRING_TOKEN(STR_RNG),                   &gEfiRngProtocolGuid,                             NULL},\r
@@ -1794,6 +2356,31 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_NET_HTTP_U),            &gEfiHttpUtilitiesProtocolGuid,                   NULL},\r
   {STRING_TOKEN(STR_REST),                  &gEfiRestProtocolGuid,                            NULL},\r
 \r
+//\r
+// PI 1.5\r
+//\r
+  {STRING_TOKEN(STR_MM_EOD),                &gEfiMmEndOfDxeProtocolGuid,                      NULL},\r
+  {STRING_TOKEN(STR_MM_ITD),                &gEfiMmIoTrapDispatchProtocolGuid,                NULL},\r
+  {STRING_TOKEN(STR_MM_PBD),                &gEfiMmPowerButtonDispatchProtocolGuid,           NULL},\r
+  {STRING_TOKEN(STR_MM_SBD),                &gEfiMmStandbyButtonDispatchProtocolGuid,         NULL},\r
+  {STRING_TOKEN(STR_MM_GD),                 &gEfiMmGpiDispatchProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_MM_UD),                 &gEfiMmUsbDispatchProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_MM_PTD),                &gEfiMmPeriodicTimerDispatchProtocolGuid,         NULL},\r
+  {STRING_TOKEN(STR_MM_SXD),                &gEfiMmSxDispatchProtocolGuid,                    NULL},\r
+  {STRING_TOKEN(STR_MM_SWD),                &gEfiMmSwDispatchProtocolGuid,                    NULL},\r
+  {STRING_TOKEN(STR_MM_PRBI),               &gEfiMmPciRootBridgeIoProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_MM_CPU),                &gEfiMmCpuProtocolGuid,                           NULL},\r
+  {STRING_TOKEN(STR_MM_STACODE),            &gEfiMmStatusCodeProtocolGuid,                    NULL},\r
+  {STRING_TOKEN(STR_DXEMM_RTL),             &gEfiDxeMmReadyToLockProtocolGuid,                NULL},\r
+  {STRING_TOKEN(STR_MM_CONFIG),             &gEfiMmConfigurationProtocolGuid,                 NULL},\r
+  {STRING_TOKEN(STR_MM_RTL),                &gEfiMmReadyToLockProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_MM_CONTROL),            &gEfiMmControlProtocolGuid,                       NULL},\r
+  {STRING_TOKEN(STR_MM_ACCESS),             &gEfiMmAccessProtocolGuid,                        NULL},\r
+  {STRING_TOKEN(STR_MM_BASE),               &gEfiMmBaseProtocolGuid,                          NULL},\r
+  {STRING_TOKEN(STR_MM_CPUIO),              &gEfiMmCpuIoProtocolGuid,                         NULL},\r
+  {STRING_TOKEN(STR_MM_RH),                 &gEfiMmRscHandlerProtocolGuid,                    NULL},\r
+  {STRING_TOKEN(STR_MM_COM),                &gEfiMmCommunicationProtocolGuid,                 NULL},\r
+\r
 //\r
 // UEFI Shell Spec 2.0\r
 //\r
@@ -2331,7 +2918,9 @@ ConvertHandleIndexToHandle(
       // Verify that LinkWalker->TheHandle is valid handle\r
       //\r
       Status = gBS->ProtocolsPerHandle(ListWalker->TheHandle, &ProtocolBuffer, &ProtocolCount);\r
-      if (EFI_ERROR (Status)) {\r
+      if (!EFI_ERROR (Status)) {\r
+        FreePool (ProtocolBuffer);\r
+      } else {\r
         //\r
         // TheHandle is not valid, so do not add to handle list\r
         //\r
@@ -3099,7 +3688,7 @@ GetAllMappingGuids (
   )\r
 {\r
   UINTN GuidCount;\r
-  UINTN NtGuidCount\r
+  UINTN NtGuidCount;\r
   UINTN Index;\r
 \r
   if (Count == NULL) {\r