]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiHandleParsingLib / UefiHandleParsingLib.c
index b4cf682ad895d2b708323b1c45995a29a2083a6e..aa0115bdd4986bb79b751a67b1e834a78cc3c313 100644 (file)
@@ -1,25 +1,87 @@
 /** @file\r
   Provides interface to advanced shell functionality for parsing both handle and protocol database.\r
 \r
-  Copyright (c) 2013 - 2014, Hewlett-Packard Development Company, L.P.\r
-  Copyright (c) 2010 - 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
-  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
+  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-2021 Hewlett Packard Enterprise Development LP<BR>\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_HII_HANDLE     mHandleParsingHiiHandle = NULL;\r
+HANDLE_INDEX_LIST  mHandleList             = {\r
+  {\r
+    { NULL, NULL }, 0, 0\r
+  }, 0\r
+};\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
-EFI_HANDLE        mHandleParsingHiiHandle = NULL;\r
-HANDLE_INDEX_LIST mHandleList = {{{NULL,NULL},0,0},0};\r
-GUID_INFO_BLOCK   *GuidList;\r
-UINTN             GuidListCount;\r
 /**\r
   Function to translate the EFI_MEMORY_TYPE into a string.\r
 \r
@@ -27,33 +89,49 @@ UINTN             GuidListCount;
 \r
   @retval               A string representation of the type allocated from BS Pool.\r
 **/\r
-CHAR16*\r
-EFIAPI\r
+CHAR16 *\r
 ConvertMemoryType (\r
-  IN CONST EFI_MEMORY_TYPE Memory\r
+  IN CONST EFI_MEMORY_TYPE  Memory\r
   )\r
 {\r
-  CHAR16 *RetVal;\r
+  CHAR16  *RetVal;\r
+\r
   RetVal = NULL;\r
 \r
   switch (Memory) {\r
-  case EfiReservedMemoryType:       StrnCatGrow(&RetVal, NULL, L"EfiReservedMemoryType", 0);        break;\r
-  case EfiLoaderCode:               StrnCatGrow(&RetVal, NULL, L"EfiLoaderCode", 0);                break;\r
-  case EfiLoaderData:               StrnCatGrow(&RetVal, NULL, L"EfiLoaderData", 0);                break;\r
-  case EfiBootServicesCode:         StrnCatGrow(&RetVal, NULL, L"EfiBootServicesCode", 0);          break;\r
-  case EfiBootServicesData:         StrnCatGrow(&RetVal, NULL, L"EfiBootServicesData", 0);          break;\r
-  case EfiRuntimeServicesCode:      StrnCatGrow(&RetVal, NULL, L"EfiRuntimeServicesCode", 0);       break;\r
-  case EfiRuntimeServicesData:      StrnCatGrow(&RetVal, NULL, L"EfiRuntimeServicesData", 0);       break;\r
-  case EfiConventionalMemory:       StrnCatGrow(&RetVal, NULL, L"EfiConventionalMemory", 0);        break;\r
-  case EfiUnusableMemory:           StrnCatGrow(&RetVal, NULL, L"EfiUnusableMemory", 0);            break;\r
-  case EfiACPIReclaimMemory:        StrnCatGrow(&RetVal, NULL, L"EfiACPIReclaimMemory", 0);         break;\r
-  case EfiACPIMemoryNVS:            StrnCatGrow(&RetVal, NULL, L"EfiACPIMemoryNVS", 0);             break;\r
-  case EfiMemoryMappedIO:           StrnCatGrow(&RetVal, NULL, L"EfiMemoryMappedIO", 0);            break;\r
-  case EfiMemoryMappedIOPortSpace:  StrnCatGrow(&RetVal, NULL, L"EfiMemoryMappedIOPortSpace", 0);   break;\r
-  case EfiPalCode:                  StrnCatGrow(&RetVal, NULL, L"EfiPalCode", 0);                   break;\r
-  case EfiMaxMemoryType:            StrnCatGrow(&RetVal, NULL, L"EfiMaxMemoryType", 0);             break;\r
-  default: ASSERT(FALSE);\r
+    case EfiReservedMemoryType:       StrnCatGrow (&RetVal, NULL, L"EfiReservedMemoryType", 0);\r
+      break;\r
+    case EfiLoaderCode:               StrnCatGrow (&RetVal, NULL, L"EfiLoaderCode", 0);\r
+      break;\r
+    case EfiLoaderData:               StrnCatGrow (&RetVal, NULL, L"EfiLoaderData", 0);\r
+      break;\r
+    case EfiBootServicesCode:         StrnCatGrow (&RetVal, NULL, L"EfiBootServicesCode", 0);\r
+      break;\r
+    case EfiBootServicesData:         StrnCatGrow (&RetVal, NULL, L"EfiBootServicesData", 0);\r
+      break;\r
+    case EfiRuntimeServicesCode:      StrnCatGrow (&RetVal, NULL, L"EfiRuntimeServicesCode", 0);\r
+      break;\r
+    case EfiRuntimeServicesData:      StrnCatGrow (&RetVal, NULL, L"EfiRuntimeServicesData", 0);\r
+      break;\r
+    case EfiConventionalMemory:       StrnCatGrow (&RetVal, NULL, L"EfiConventionalMemory", 0);\r
+      break;\r
+    case EfiUnusableMemory:           StrnCatGrow (&RetVal, NULL, L"EfiUnusableMemory", 0);\r
+      break;\r
+    case EfiACPIReclaimMemory:        StrnCatGrow (&RetVal, NULL, L"EfiACPIReclaimMemory", 0);\r
+      break;\r
+    case EfiACPIMemoryNVS:            StrnCatGrow (&RetVal, NULL, L"EfiACPIMemoryNVS", 0);\r
+      break;\r
+    case EfiMemoryMappedIO:           StrnCatGrow (&RetVal, NULL, L"EfiMemoryMappedIO", 0);\r
+      break;\r
+    case EfiMemoryMappedIOPortSpace:  StrnCatGrow (&RetVal, NULL, L"EfiMemoryMappedIOPortSpace", 0);\r
+      break;\r
+    case EfiPalCode:                  StrnCatGrow (&RetVal, NULL, L"EfiPalCode", 0);\r
+      break;\r
+    case EfiMaxMemoryType:            StrnCatGrow (&RetVal, NULL, L"EfiMaxMemoryType", 0);\r
+      break;\r
+    default: ASSERT (FALSE);\r
   }\r
+\r
   return (RetVal);\r
 }\r
 \r
@@ -64,23 +142,29 @@ ConvertMemoryType (
 \r
   @retval               A string representation of the type allocated from BS Pool.\r
 **/\r
-CHAR16*\r
-EFIAPI\r
+CHAR16 *\r
 ConvertPixelFormat (\r
-  IN CONST EFI_GRAPHICS_PIXEL_FORMAT Fmt\r
+  IN CONST EFI_GRAPHICS_PIXEL_FORMAT  Fmt\r
   )\r
 {\r
-  CHAR16 *RetVal;\r
+  CHAR16  *RetVal;\r
+\r
   RetVal = NULL;\r
 \r
   switch (Fmt) {\r
-  case PixelRedGreenBlueReserved8BitPerColor: StrnCatGrow(&RetVal, NULL, L"PixelRedGreenBlueReserved8BitPerColor", 0);  break;\r
-  case PixelBlueGreenRedReserved8BitPerColor: StrnCatGrow(&RetVal, NULL, L"PixelBlueGreenRedReserved8BitPerColor", 0);  break;\r
-  case PixelBitMask:                          StrnCatGrow(&RetVal, NULL, L"PixelBitMask", 0);                           break;\r
-  case PixelBltOnly:                          StrnCatGrow(&RetVal, NULL, L"PixelBltOnly", 0);                           break;\r
-  case PixelFormatMax:                        StrnCatGrow(&RetVal, NULL, L"PixelFormatMax", 0);                         break;\r
-  default: ASSERT(FALSE);\r
+    case PixelRedGreenBlueReserved8BitPerColor: StrnCatGrow (&RetVal, NULL, L"PixelRedGreenBlueReserved8BitPerColor", 0);\r
+      break;\r
+    case PixelBlueGreenRedReserved8BitPerColor: StrnCatGrow (&RetVal, NULL, L"PixelBlueGreenRedReserved8BitPerColor", 0);\r
+      break;\r
+    case PixelBitMask:                          StrnCatGrow (&RetVal, NULL, L"PixelBitMask", 0);\r
+      break;\r
+    case PixelBltOnly:                          StrnCatGrow (&RetVal, NULL, L"PixelBltOnly", 0);\r
+      break;\r
+    case PixelFormatMax:                        StrnCatGrow (&RetVal, NULL, L"PixelFormatMax", 0);\r
+      break;\r
+    default: ASSERT (FALSE);\r
   }\r
+\r
   return (RetVal);\r
 }\r
 \r
@@ -99,8 +183,8 @@ HandleParsingLibConstructor (
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  GuidListCount = 0;\r
-  GuidList      = NULL;\r
+  mGuidListCount = 0;\r
+  mGuidList      = NULL;\r
 \r
   //\r
   // Do nothing with mHandleParsingHiiHandle.  Initialize HII as needed.\r
@@ -108,12 +192,14 @@ HandleParsingLibConstructor (
   return (EFI_SUCCESS);\r
 }\r
 \r
-/** \r
+/**\r
   Initialization function for HII packages.\r
\r
+\r
 **/\r
 VOID\r
-HandleParsingHiiInit (VOID)\r
+HandleParsingHiiInit (\r
+  VOID\r
+  )\r
 {\r
   if (mHandleParsingHiiHandle == NULL) {\r
     mHandleParsingHiiHandle = HiiAddPackages (&gHandleParsingHiiGuid, gImageHandle, UefiHandleParsingLibStrings, NULL);\r
@@ -136,16 +222,17 @@ HandleParsingLibDestructor (
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  UINTN                 LoopCount;\r
+  UINTN  LoopCount;\r
 \r
-  for (LoopCount = 0; GuidList != NULL && LoopCount < GuidListCount; LoopCount++) {\r
-    SHELL_FREE_NON_NULL(GuidList[LoopCount].GuidId);\r
+  for (LoopCount = 0; mGuidList != NULL && LoopCount < mGuidListCount; LoopCount++) {\r
+    SHELL_FREE_NON_NULL (mGuidList[LoopCount].GuidId);\r
   }\r
 \r
-  SHELL_FREE_NON_NULL(GuidList);\r
+  SHELL_FREE_NON_NULL (mGuidList);\r
   if (mHandleParsingHiiHandle != NULL) {\r
-    HiiRemovePackages(mHandleParsingHiiHandle);\r
+    HiiRemovePackages (mHandleParsingHiiHandle);\r
   }\r
+\r
   return (EFI_SUCCESS);\r
 }\r
 \r
@@ -159,71 +246,92 @@ HandleParsingLibDestructor (
 \r
   @retval A poitner to a string containing the information.\r
 **/\r
-CHAR16*\r
+CHAR16 *\r
 EFIAPI\r
-LoadedImageProtocolDumpInformation(\r
-  IN CONST EFI_HANDLE TheHandle,\r
-  IN CONST BOOLEAN    Verbose\r
+LoadedImageProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST BOOLEAN     Verbose\r
   )\r
 {\r
-  EFI_LOADED_IMAGE_PROTOCOL         *LoadedImage;\r
-  EFI_STATUS                        Status;\r
-  CHAR16                            *RetVal;\r
-  CHAR16                            *Temp;\r
-  CHAR16                            *CodeType;\r
-  CHAR16                            *DataType;\r
+  EFI_LOADED_IMAGE_PROTOCOL  *LoadedImage;\r
+  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
+  Status = gBS->OpenProtocol (\r
+                  TheHandle,\r
+                  &gEfiLoadedImageProtocolGuid,\r
+                  (VOID **)&LoadedImage,\r
+                  gImageHandle,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
   }\r
 \r
-  HandleParsingHiiInit();\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
 \r
-  Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_LI_DUMP_MAIN), NULL);\r
-  RetVal = AllocateZeroPool (PcdGet16 (PcdShellPrintBufferSize));\r
-  if (Temp == NULL || RetVal == NULL) {\r
-    SHELL_FREE_NON_NULL(Temp);\r
-    SHELL_FREE_NON_NULL(RetVal);\r
-    return NULL;\r
+    return FileName;\r
   }\r
 \r
-  Status = gBS->OpenProtocol (\r
-                TheHandle,\r
-                &gEfiLoadedImageProtocolGuid,\r
-                (VOID**)&LoadedImage,\r
-                gImageHandle,\r
-                NULL,\r
-                EFI_OPEN_PROTOCOL_GET_PROTOCOL\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
-  if (EFI_ERROR (Status)) {\r
     SHELL_FREE_NON_NULL (Temp);\r
-    SHELL_FREE_NON_NULL (RetVal);\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
 \r
-  DataType = ConvertMemoryType(LoadedImage->ImageDataType);\r
-  CodeType = ConvertMemoryType(LoadedImage->ImageCodeType);\r
-\r
-  RetVal = CatSPrint(RetVal,\r
-                      Temp,\r
-                      LoadedImage->Revision,\r
-                      LoadedImage->ParentHandle,\r
-                      LoadedImage->SystemTable,\r
-                      LoadedImage->DeviceHandle,\r
-                      LoadedImage->FilePath,\r
-                      LoadedImage->LoadOptionsSize,\r
-                      LoadedImage->LoadOptions,\r
-                      LoadedImage->ImageBase,\r
-                      LoadedImage->ImageSize,\r
-                      CodeType,\r
-                      DataType,\r
-                      LoadedImage->Unload);\r
-\r
-  \r
-  SHELL_FREE_NON_NULL(Temp);\r
-  SHELL_FREE_NON_NULL(CodeType);\r
-  SHELL_FREE_NON_NULL(DataType);\r
+  PdbFileName = PeCoffLoaderGetPdbPointer (LoadedImage->ImageBase);\r
+  DataType    = ConvertMemoryType (LoadedImage->ImageDataType);\r
+  CodeType    = ConvertMemoryType (LoadedImage->ImageCodeType);\r
+\r
+  RetVal = CatSPrint (\r
+             RetVal,\r
+             Temp,\r
+             LoadedImage->Revision,\r
+             LoadedImage->ParentHandle,\r
+             LoadedImage->SystemTable,\r
+             LoadedImage->DeviceHandle,\r
+             FilePath,\r
+             PdbFileName,\r
+             LoadedImage->LoadOptionsSize,\r
+             LoadedImage->LoadOptions,\r
+             LoadedImage->ImageBase,\r
+             LoadedImage->ImageSize,\r
+             CodeType,\r
+             DataType,\r
+             LoadedImage->Unload\r
+             );\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
   return RetVal;\r
 }\r
@@ -238,69 +346,250 @@ LoadedImageProtocolDumpInformation(
 \r
   @retval A poitner to a string containing the information.\r
 **/\r
-CHAR16*\r
+CHAR16 *\r
 EFIAPI\r
-GraphicsOutputProtocolDumpInformation(\r
-  IN CONST EFI_HANDLE TheHandle,\r
-  IN CONST BOOLEAN    Verbose\r
+GraphicsOutputProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST BOOLEAN     Verbose\r
   )\r
 {\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL      *GraphicsOutput;\r
-  EFI_STATUS                        Status;\r
-  CHAR16                            *RetVal;\r
-  CHAR16                            *Temp;\r
-  CHAR16                            *Fmt;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL          *GraphicsOutput;\r
+  EFI_STATUS                            Status;\r
+  CHAR16                                *RetVal;\r
+  CHAR16                                *Temp;\r
+  CHAR16                                *Fmt;\r
+  CHAR16                                *TempRetVal;\r
+  UINTN                                 GopInfoSize;\r
+  UINT32                                Mode;\r
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *GopInfo;\r
 \r
   if (!Verbose) {\r
-    return (CatSPrint(NULL, L"GraphicsOutput"));\r
+    return (CatSPrint (NULL, L"GraphicsOutput"));\r
   }\r
 \r
-  HandleParsingHiiInit();\r
+  HandleParsingHiiInit ();\r
 \r
-  Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_GOP_DUMP_MAIN), NULL);\r
-  RetVal = AllocateZeroPool (PcdGet16 (PcdShellPrintBufferSize));\r
-  if (Temp == NULL || RetVal == NULL) {\r
-    SHELL_FREE_NON_NULL(Temp);\r
-    SHELL_FREE_NON_NULL(RetVal);\r
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GOP_DUMP_MAIN), NULL);\r
+  if (Temp == NULL) {\r
     return NULL;\r
   }\r
 \r
   Status = gBS->OpenProtocol (\r
-                TheHandle,\r
-                &gEfiGraphicsOutputProtocolGuid,\r
-                (VOID**)&GraphicsOutput,\r
-                gImageHandle,\r
-                NULL,\r
-                EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-               );\r
+                  TheHandle,\r
+                  &gEfiGraphicsOutputProtocolGuid,\r
+                  (VOID **)&GraphicsOutput,\r
+                  gImageHandle,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
 \r
   if (EFI_ERROR (Status)) {\r
     SHELL_FREE_NON_NULL (Temp);\r
+    return NULL;\r
+  }\r
+\r
+  Fmt = ConvertPixelFormat (GraphicsOutput->Mode->Info->PixelFormat);\r
+\r
+  RetVal = CatSPrint (\r
+             NULL,\r
+             Temp,\r
+             GraphicsOutput->Mode->MaxMode,\r
+             GraphicsOutput->Mode->Mode,\r
+             GraphicsOutput->Mode->FrameBufferBase,\r
+             (UINT64)GraphicsOutput->Mode->FrameBufferSize,\r
+             (UINT64)GraphicsOutput->Mode->SizeOfInfo,\r
+             GraphicsOutput->Mode->Info->Version,\r
+             GraphicsOutput->Mode->Info->HorizontalResolution,\r
+             GraphicsOutput->Mode->Info->VerticalResolution,\r
+             Fmt,\r
+             GraphicsOutput->Mode->Info->PixelsPerScanLine,\r
+             GraphicsOutput->Mode->Info->PixelFormat != PixelBitMask ? 0 : GraphicsOutput->Mode->Info->PixelInformation.RedMask,\r
+             GraphicsOutput->Mode->Info->PixelFormat != PixelBitMask ? 0 : GraphicsOutput->Mode->Info->PixelInformation.GreenMask,\r
+             GraphicsOutput->Mode->Info->PixelFormat != PixelBitMask ? 0 : GraphicsOutput->Mode->Info->PixelInformation.BlueMask\r
+             );\r
+\r
+  SHELL_FREE_NON_NULL (Temp);\r
+\r
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GOP_RES_LIST_MAIN), NULL);\r
+  if (Temp == NULL) {\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    goto EXIT;\r
+  }\r
+\r
+  TempRetVal = CatSPrint (RetVal, Temp);\r
+  SHELL_FREE_NON_NULL (RetVal);\r
+  if (TempRetVal == NULL) {\r
+    goto EXIT;\r
+  }\r
+\r
+  RetVal = TempRetVal;\r
+  SHELL_FREE_NON_NULL (Temp);\r
+\r
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GOP_RES_LIST_ENTRY), NULL);\r
+  if (Temp == NULL) {\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    goto EXIT;\r
+  }\r
+\r
+  for (Mode = 0; Mode < GraphicsOutput->Mode->MaxMode; Mode++) {\r
+    Status = GraphicsOutput->QueryMode (\r
+                               GraphicsOutput,\r
+                               Mode,\r
+                               &GopInfoSize,\r
+                               &GopInfo\r
+                               );\r
+    if (EFI_ERROR (Status)) {\r
+      continue;\r
+    }\r
+\r
+    TempRetVal = CatSPrint (\r
+                   RetVal,\r
+                   Temp,\r
+                   Mode,\r
+                   GopInfo->HorizontalResolution,\r
+                   GopInfo->VerticalResolution\r
+                   );\r
+\r
+    SHELL_FREE_NON_NULL (GopInfo);\r
     SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+  }\r
+\r
+EXIT:\r
+  SHELL_FREE_NON_NULL (Temp);\r
+  SHELL_FREE_NON_NULL (Fmt);\r
+\r
+  return RetVal;\r
+}\r
+\r
+/**\r
+  Function to dump information about EDID Discovered Protocol.\r
+\r
+  This will allocate the return buffer from boot services pool.\r
+\r
+  @param[in] TheHandle      The handle that has LoadedImage 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
+EdidDiscoveredProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST BOOLEAN     Verbose\r
+  )\r
+{\r
+  EFI_EDID_DISCOVERED_PROTOCOL  *EdidDiscovered;\r
+  EFI_STATUS                    Status;\r
+  CHAR16                        *RetVal;\r
+  CHAR16                        *Temp;\r
+  CHAR16                        *TempRetVal;\r
+\r
+  if (!Verbose) {\r
+    return (CatSPrint (NULL, L"EDIDDiscovered"));\r
+  }\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  TheHandle,\r
+                  &gEfiEdidDiscoveredProtocolGuid,\r
+                  (VOID **)&EdidDiscovered,\r
+                  NULL,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
     return NULL;\r
   }\r
 \r
-  Fmt = ConvertPixelFormat(GraphicsOutput->Mode->Info->PixelFormat);\r
-\r
-  RetVal = CatSPrint(RetVal,\r
-                      Temp,\r
-                      GraphicsOutput->Mode->MaxMode,\r
-                      GraphicsOutput->Mode->Mode,\r
-                      GraphicsOutput->Mode->FrameBufferBase,\r
-                      (UINT64)GraphicsOutput->Mode->FrameBufferSize,\r
-                      (UINT64)GraphicsOutput->Mode->SizeOfInfo,\r
-                      GraphicsOutput->Mode->Info->Version,\r
-                      GraphicsOutput->Mode->Info->HorizontalResolution,\r
-                      GraphicsOutput->Mode->Info->VerticalResolution,\r
-                      Fmt,\r
-                      GraphicsOutput->Mode->Info->PixelsPerScanLine,\r
-                      GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.RedMask,\r
-                      GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.GreenMask,\r
-                      GraphicsOutput->Mode->Info->PixelFormat!=PixelBitMask?0:GraphicsOutput->Mode->Info->PixelInformation.BlueMask\r
-                      );\r
-  \r
-  SHELL_FREE_NON_NULL(Temp);\r
-  SHELL_FREE_NON_NULL(Fmt);\r
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_DISCOVERED_MAIN), NULL);\r
+  if (Temp == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  RetVal = CatSPrint (NULL, Temp, EdidDiscovered->SizeOfEdid);\r
+  SHELL_FREE_NON_NULL (Temp);\r
+\r
+  if (EdidDiscovered->SizeOfEdid != 0) {\r
+    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_DISCOVERED_DATA), NULL);\r
+    if (Temp == NULL) {\r
+      SHELL_FREE_NON_NULL (RetVal);\r
+      return NULL;\r
+    }\r
+\r
+    TempRetVal = CatSPrint (RetVal, Temp);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+\r
+    TempRetVal = CatSDumpHex (RetVal, 4, 0, EdidDiscovered->SizeOfEdid, EdidDiscovered->Edid);\r
+    RetVal     = TempRetVal;\r
+  }\r
+\r
+  return RetVal;\r
+}\r
+\r
+/**\r
+  Function to dump information about EDID Active Protocol.\r
+\r
+  This will allocate the return buffer from boot services pool.\r
+\r
+  @param[in] TheHandle      The handle that has LoadedImage 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
+EdidActiveProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST BOOLEAN     Verbose\r
+  )\r
+{\r
+  EFI_EDID_ACTIVE_PROTOCOL  *EdidActive;\r
+  EFI_STATUS                Status;\r
+  CHAR16                    *RetVal;\r
+  CHAR16                    *Temp;\r
+  CHAR16                    *TempRetVal;\r
+\r
+  if (!Verbose) {\r
+    return (CatSPrint (NULL, L"EDIDActive"));\r
+  }\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  TheHandle,\r
+                  &gEfiEdidActiveProtocolGuid,\r
+                  (VOID **)&EdidActive,\r
+                  NULL,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_ACTIVE_MAIN), NULL);\r
+  if (Temp == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  RetVal = CatSPrint (NULL, Temp, EdidActive->SizeOfEdid);\r
+  SHELL_FREE_NON_NULL (Temp);\r
+\r
+  if (EdidActive->SizeOfEdid != 0) {\r
+    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_ACTIVE_DATA), NULL);\r
+    if (Temp == NULL) {\r
+      SHELL_FREE_NON_NULL (RetVal);\r
+      return NULL;\r
+    }\r
+\r
+    TempRetVal = CatSPrint (RetVal, Temp);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+\r
+    TempRetVal = CatSDumpHex (RetVal, 4, 0, EdidActive->SizeOfEdid, EdidActive->Edid);\r
+    RetVal     = TempRetVal;\r
+  }\r
 \r
   return RetVal;\r
 }\r
@@ -315,119 +604,142 @@ GraphicsOutputProtocolDumpInformation(
 \r
   @retval A poitner to a string containing the information.\r
 **/\r
-CHAR16*\r
+CHAR16 *\r
 EFIAPI\r
-PciRootBridgeIoDumpInformation(\r
-  IN CONST EFI_HANDLE TheHandle,\r
-  IN CONST BOOLEAN    Verbose\r
+PciRootBridgeIoDumpInformation (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST BOOLEAN     Verbose\r
   )\r
 {\r
-  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL   *PciRootBridgeIo;\r
-  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Configuration;\r
-  UINT64                            Supports;\r
-  UINT64                            Attributes;\r
-  CHAR16                            *Temp;\r
-  CHAR16                            *Temp2;\r
-  CHAR16                            *RetVal;\r
-  EFI_STATUS                        Status;\r
+  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL    *PciRootBridgeIo;\r
+  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR  *Configuration;\r
+  UINT64                             Supports;\r
+  UINT64                             Attributes;\r
+  CHAR16                             *Temp;\r
+  CHAR16                             *Temp2;\r
+  CHAR16                             *RetVal;\r
+  EFI_STATUS                         Status;\r
 \r
-  RetVal  = NULL;\r
+  RetVal = NULL;\r
 \r
   if (!Verbose) {\r
-    return (CatSPrint(NULL, L"PciRootBridgeIo"));\r
+    return (CatSPrint (NULL, L"PciRootBridgeIo"));\r
   }\r
 \r
-  HandleParsingHiiInit();\r
+  HandleParsingHiiInit ();\r
+\r
+  Status = gBS->HandleProtocol (\r
+                  TheHandle,\r
+                  &gEfiPciRootBridgeIoProtocolGuid,\r
+                  (VOID **)&PciRootBridgeIo\r
+                  );\r
 \r
-  Status = gBS->HandleProtocol(\r
-    TheHandle,\r
-    &gEfiPciRootBridgeIoProtocolGuid,\r
-    (VOID**)&PciRootBridgeIo);\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
 \r
-  if (EFI_ERROR(Status)) {\r
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_PH), NULL);\r
+  if (Temp == NULL) {\r
     return NULL;\r
   }\r
 \r
-  Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_PH), NULL);\r
-  ASSERT (Temp != NULL);\r
-  Temp2 = CatSPrint(L"\r\n", Temp, PciRootBridgeIo->ParentHandle);\r
-  FreePool(Temp);\r
+  Temp2 = CatSPrint (NULL, Temp, PciRootBridgeIo->ParentHandle);\r
+  FreePool (Temp);\r
   RetVal = Temp2;\r
-  Temp2 = NULL;\r
\r
-  Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SEG), NULL);\r
-  ASSERT (Temp != NULL);\r
-  Temp2 = CatSPrint(RetVal, Temp, PciRootBridgeIo->SegmentNumber);\r
-  FreePool(Temp);\r
-  FreePool(RetVal);\r
+  Temp2  = NULL;\r
+\r
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_SEG), NULL);\r
+  if (Temp == NULL) {\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    return NULL;\r
+  }\r
+\r
+  Temp2 = CatSPrint (RetVal, Temp, PciRootBridgeIo->SegmentNumber);\r
+  FreePool (Temp);\r
+  FreePool (RetVal);\r
   RetVal = Temp2;\r
-  Temp2 = NULL;\r
+  Temp2  = NULL;\r
 \r
   Supports   = 0;\r
   Attributes = 0;\r
-  Status = PciRootBridgeIo->GetAttributes (PciRootBridgeIo, &Supports, &Attributes);\r
-  if (!EFI_ERROR(Status)) {\r
-    Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_ATT), NULL);\r
-    ASSERT (Temp != NULL);    \r
-    Temp2 = CatSPrint(RetVal, Temp, Attributes);\r
-    FreePool(Temp);\r
-    FreePool(RetVal);\r
+  Status     = PciRootBridgeIo->GetAttributes (PciRootBridgeIo, &Supports, &Attributes);\r
+  if (!EFI_ERROR (Status)) {\r
+    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_ATT), NULL);\r
+    if (Temp == NULL) {\r
+      SHELL_FREE_NON_NULL (RetVal);\r
+      return NULL;\r
+    }\r
+\r
+    Temp2 = CatSPrint (RetVal, Temp, Attributes);\r
+    FreePool (Temp);\r
+    FreePool (RetVal);\r
     RetVal = Temp2;\r
-    Temp2 = NULL;\r
-    \r
-    Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SUPPORTS), NULL);\r
-    ASSERT (Temp != NULL);\r
-    Temp2 = CatSPrint(RetVal, Temp, Supports);\r
-    FreePool(Temp);\r
-    FreePool(RetVal);\r
+    Temp2  = NULL;\r
+\r
+    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_SUPPORTS), NULL);\r
+    if (Temp == NULL) {\r
+      SHELL_FREE_NON_NULL (RetVal);\r
+      return NULL;\r
+    }\r
+\r
+    Temp2 = CatSPrint (RetVal, Temp, Supports);\r
+    FreePool (Temp);\r
+    FreePool (RetVal);\r
     RetVal = Temp2;\r
-    Temp2 = NULL;\r
+    Temp2  = NULL;\r
   }\r
 \r
-  Configuration   = NULL;\r
-  Status = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **) &Configuration);\r
-  if (!EFI_ERROR(Status) && Configuration != NULL) {\r
-    Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_TITLE), NULL);\r
-    ASSERT (Temp != NULL);\r
-    Temp2 = CatSPrint(RetVal, Temp, Supports);\r
-    FreePool(Temp);\r
-    FreePool(RetVal);\r
+  Configuration = NULL;\r
+  Status        = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **)&Configuration);\r
+  if (!EFI_ERROR (Status) && (Configuration != NULL)) {\r
+    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_TITLE), NULL);\r
+    if (Temp == NULL) {\r
+      SHELL_FREE_NON_NULL (RetVal);\r
+      return NULL;\r
+    }\r
+\r
+    Temp2 = CatSPrint (RetVal, Temp, Supports);\r
+    FreePool (Temp);\r
+    FreePool (RetVal);\r
     RetVal = Temp2;\r
-    Temp2 = NULL;\r
+    Temp2  = NULL;\r
     while (Configuration->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {\r
       Temp = NULL;\r
       switch (Configuration->ResType) {\r
-      case ACPI_ADDRESS_SPACE_TYPE_MEM:\r
-        Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_MEM), NULL);\r
-        break;\r
-      case ACPI_ADDRESS_SPACE_TYPE_IO:\r
-        Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_IO), NULL);\r
-        break;\r
-      case ACPI_ADDRESS_SPACE_TYPE_BUS:\r
-        Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_BUS), NULL);\r
-        break;\r
+        case ACPI_ADDRESS_SPACE_TYPE_MEM:\r
+          Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_MEM), NULL);\r
+          break;\r
+        case ACPI_ADDRESS_SPACE_TYPE_IO:\r
+          Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_IO), NULL);\r
+          break;\r
+        case ACPI_ADDRESS_SPACE_TYPE_BUS:\r
+          Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_BUS), NULL);\r
+          break;\r
       }\r
+\r
       if (Temp != NULL) {\r
-        Temp2 = CatSPrint(RetVal, L"%s", Temp);\r
-        FreePool(Temp);\r
-        FreePool(RetVal);\r
+        Temp2 = CatSPrint (RetVal, L"\r\n%s", Temp);\r
+        FreePool (Temp);\r
+        FreePool (RetVal);\r
         RetVal = Temp2;\r
-        Temp2 = NULL;\r
+        Temp2  = NULL;\r
       }\r
 \r
-      Temp2 = CatSPrint(RetVal, \r
-        L"%H%02x    %016lx  %016lx  %02x%N\r\n",\r
-        Configuration->SpecificFlag,\r
-        Configuration->AddrRangeMin,\r
-        Configuration->AddrRangeMax,\r
-        Configuration->AddrSpaceGranularity\r
-        );\r
-      FreePool(RetVal);\r
+      Temp2 = CatSPrint (\r
+                RetVal,\r
+                L"%%H%02x    %016lx  %016lx  %02x%%N",\r
+                Configuration->SpecificFlag,\r
+                Configuration->AddrRangeMin,\r
+                Configuration->AddrRangeMax,\r
+                Configuration->AddrSpaceGranularity\r
+                );\r
+      FreePool (RetVal);\r
       RetVal = Temp2;\r
-      Temp2 = NULL;\r
+      Temp2  = NULL;\r
       Configuration++;\r
     }\r
   }\r
+\r
   return (RetVal);\r
 }\r
 \r
@@ -441,144 +753,1348 @@ PciRootBridgeIoDumpInformation(
 \r
   @retval A poitner to a string containing the information.\r
 **/\r
-CHAR16*\r
+CHAR16 *\r
 EFIAPI\r
-TxtOutProtocolDumpInformation(\r
-  IN CONST EFI_HANDLE TheHandle,\r
-  IN CONST BOOLEAN    Verbose\r
+TxtOutProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST BOOLEAN     Verbose\r
   )\r
 {\r
-  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Dev;\r
-  INTN                            Index;\r
-  UINTN                           Col;\r
-  UINTN                           Row;\r
-  EFI_STATUS                      Status;\r
-  CHAR16                          *RetVal;\r
-  UINTN                           Size;\r
-  CHAR16                          *Temp;\r
-  UINTN                           NewSize;\r
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *Dev;\r
+  INTN                             Index;\r
+  UINTN                            Col;\r
+  UINTN                            Row;\r
+  EFI_STATUS                       Status;\r
+  CHAR16                           *RetVal;\r
+  UINTN                            Size;\r
+  CHAR16                           *Temp;\r
+  UINTN                            NewSize;\r
 \r
   if (!Verbose) {\r
     return (NULL);\r
   }\r
 \r
-  HandleParsingHiiInit();\r
+  HandleParsingHiiInit ();\r
 \r
-  RetVal  = NULL;\r
-  Size    = 0;\r
+  RetVal = NULL;\r
+  Size   = 0;\r
 \r
-  Status = gBS->HandleProtocol(\r
-    TheHandle,\r
-    &gEfiSimpleTextOutProtocolGuid,\r
-    (VOID**)&Dev);\r
+  Status = gBS->HandleProtocol (\r
+                  TheHandle,\r
+                  &gEfiSimpleTextOutProtocolGuid,\r
+                  (VOID **)&Dev\r
+                  );\r
 \r
-  ASSERT_EFI_ERROR(Status);\r
+  ASSERT_EFI_ERROR (Status);\r
   ASSERT (Dev != NULL && Dev->Mode != NULL);\r
 \r
-  Size = (Dev->Mode->MaxMode + 1) * 80;\r
-  RetVal = AllocateZeroPool(Size);\r
+  Size   = (Dev->Mode->MaxMode + 1) * 80;\r
+  RetVal = AllocateZeroPool (Size);\r
+\r
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_TXT_OUT_DUMP_HEADER), NULL);\r
+  if (Temp != NULL) {\r
+    UnicodeSPrint (RetVal, Size, Temp, Dev, Dev->Mode->Attribute);\r
+    FreePool (Temp);\r
+  }\r
+\r
+  //\r
+  // Dump TextOut Info\r
+  //\r
+  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_TXT_OUT_DUMP_LINE), NULL);\r
+  for (Index = 0; Index < Dev->Mode->MaxMode; Index++) {\r
+    Status  = Dev->QueryMode (Dev, Index, &Col, &Row);\r
+    NewSize = Size - StrSize (RetVal);\r
+    UnicodeSPrint (\r
+      RetVal + StrLen (RetVal),\r
+      NewSize,\r
+      Temp == NULL ? L"" : Temp,\r
+      Index == Dev->Mode->Mode ? L'*' : L' ',\r
+      Index,\r
+      !EFI_ERROR (Status) ? (INTN)Col : -1,\r
+      !EFI_ERROR (Status) ? (INTN)Row : -1\r
+      );\r
+  }\r
+\r
+  FreePool (Temp);\r
+  return (RetVal);\r
+}\r
+\r
+STATIC CONST UINTN  VersionStringSize = 60;\r
+\r
+/**\r
+  Function to dump information about EfiDriverSupportedEfiVersion 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 poitner to a string containing the information.\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+DriverEfiVersionProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST BOOLEAN     Verbose\r
+  )\r
+{\r
+  EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL  *DriverEfiVersion;\r
+  EFI_STATUS                                 Status;\r
+  CHAR16                                     *RetVal;\r
+\r
+  Status = gBS->HandleProtocol (\r
+                  TheHandle,\r
+                  &gEfiDriverSupportedEfiVersionProtocolGuid,\r
+                  (VOID **)&DriverEfiVersion\r
+                  );\r
+\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  RetVal = AllocateZeroPool (VersionStringSize);\r
+  if (RetVal != NULL) {\r
+    UnicodeSPrint (RetVal, VersionStringSize, L"0x%08x", DriverEfiVersion->FirmwareVersion);\r
+  }\r
+\r
+  return (RetVal);\r
+}\r
+\r
+/**\r
+  Function to convert device path to string.\r
+\r
+  This will allocate the return buffer from boot services pool.\r
+\r
+  @param[in] DevPath        Pointer to device path instance.\r
+  @param[in] Verbose        TRUE for additional information, FALSE otherwise.\r
+  @param[in] Length         Maximum allowed text length of the device path.\r
+\r
+  @retval A pointer to a string containing the information.\r
+**/\r
+CHAR16 *\r
+ConvertDevicePathToShortText (\r
+  IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevPath,\r
+  IN CONST BOOLEAN                   Verbose,\r
+  IN CONST UINTN                     Length\r
+  )\r
+{\r
+  CHAR16  *Temp;\r
+  CHAR16  *Temp2;\r
+  UINTN   Size;\r
+\r
+  //\r
+  // I cannot decide whether to allow shortcuts here (the second BOOLEAN on the next line)\r
+  //\r
+  Temp = ConvertDevicePathToText (DevPath, TRUE, TRUE);\r
+  if (!Verbose && (Temp != NULL) && (StrLen (Temp) > Length)) {\r
+    Temp2 = NULL;\r
+    Size  = 0;\r
+    Temp2 = StrnCatGrow (&Temp2, &Size, L"..", 0);\r
+    Temp2 = StrnCatGrow (&Temp2, &Size, Temp+(StrLen (Temp) - (Length - 2)), 0);\r
+    FreePool (Temp);\r
+    Temp = Temp2;\r
+  }\r
+\r
+  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
+\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
+\r
+      FreePool (DevPathStr);\r
+      DevPathStr = DevPathStrTemp;\r
+    }\r
+\r
+    gBS->CloseProtocol (TheHandle, Protocol, gImageHandle, NULL);\r
+  }\r
+\r
+  return DevPathStr;\r
+}\r
+\r
+/**\r
+  Function to dump information about DevicePath 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
+DevicePathProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST BOOLEAN     Verbose\r
+  )\r
+{\r
+  return DevicePathProtocolDumpInformationEx (TheHandle, Verbose, &gEfiDevicePathProtocolGuid);\r
+}\r
+\r
+/**\r
+  Function to dump information about LoadedImageDevicePath 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
+LoadedImageDevicePathProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST BOOLEAN     Verbose\r
+  )\r
+{\r
+  return DevicePathProtocolDumpInformationEx (TheHandle, Verbose, &gEfiLoadedImageDevicePathProtocolGuid);\r
+}\r
+\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
+\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
+\r
+  HandleParsingHiiInit ();\r
+  GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_BSDO_DUMP_MAIN), NULL);\r
+  if (GetString == NULL) {\r
+    return NULL;\r
+  }\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
+\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
+\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
+\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
+\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
+\r
+  HandleParsingHiiInit ();\r
+  GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_DEBUGSUPPORT_INFO), NULL);\r
+  if (GetString == NULL) {\r
+    return NULL;\r
+  }\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
+\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
+\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
+\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
+\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
+\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
+\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
+\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
+  Function to dump information about EfiAdapterInformation 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
+AdapterInformationDumpInformation (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST BOOLEAN     Verbose\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  EFI_ADAPTER_INFORMATION_PROTOCOL  *EfiAdptrInfoProtocol;\r
+  UINTN                             InfoTypesBufferCount;\r
+  UINTN                             GuidIndex;\r
+  EFI_GUID                          *InfoTypesBuffer;\r
+  CHAR16                            *GuidStr;\r
+  CHAR16                            *TempStr;\r
+  CHAR16                            *RetVal;\r
+  CHAR16                            *TempRetVal;\r
+  VOID                              *InformationBlock;\r
+  UINTN                             InformationBlockSize;\r
+\r
+  if (!Verbose) {\r
+    return (CatSPrint (NULL, L"AdapterInfo"));\r
+  }\r
+\r
+  InfoTypesBuffer  = NULL;\r
+  InformationBlock = NULL;\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  (EFI_HANDLE)(TheHandle),\r
+                  &gEfiAdapterInformationProtocolGuid,\r
+                  (VOID **)&EfiAdptrInfoProtocol,\r
+                  NULL,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Get a list of supported information types for this instance of the protocol.\r
+  //\r
+  Status = EfiAdptrInfoProtocol->GetSupportedTypes (\r
+                                   EfiAdptrInfoProtocol,\r
+                                   &InfoTypesBuffer,\r
+                                   &InfoTypesBufferCount\r
+                                   );\r
+  RetVal = NULL;\r
+  if (EFI_ERROR (Status)) {\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GET_SUPP_TYPES_FAILED), NULL);\r
+    if (TempStr != NULL) {\r
+      RetVal = CatSPrint (NULL, TempStr, Status);\r
+    } else {\r
+      goto ERROR_EXIT;\r
+    }\r
+  } else {\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_SUPP_TYPE_HEADER), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+\r
+    RetVal = CatSPrint (NULL, TempStr);\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+    for (GuidIndex = 0; GuidIndex < InfoTypesBufferCount; GuidIndex++) {\r
+      TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GUID_NUMBER), NULL);\r
+      if (TempStr == NULL) {\r
+        goto ERROR_EXIT;\r
+      }\r
+\r
+      TempRetVal = CatSPrint (RetVal, TempStr, (GuidIndex + 1), &InfoTypesBuffer[GuidIndex]);\r
+      SHELL_FREE_NON_NULL (RetVal);\r
+      RetVal = TempRetVal;\r
+      SHELL_FREE_NON_NULL (TempStr);\r
+\r
+      TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GUID_STRING), NULL);\r
+      if (TempStr == NULL) {\r
+        goto ERROR_EXIT;\r
+      }\r
+\r
+      if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoMediaStateGuid)) {\r
+        TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoMediaStateGuid");\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
+      } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoNetworkBootGuid)) {\r
+        TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoNetworkBootGuid");\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
+      } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoSanMacAddressGuid)) {\r
+        TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoSanMacAddressGuid");\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
+      } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoUndiIpv6SupportGuid)) {\r
+        TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoUndiIpv6SupportGuid");\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
+      } else {\r
+        GuidStr = GetStringNameFromGuid (&InfoTypesBuffer[GuidIndex], NULL);\r
+        if (GuidStr == NULL) {\r
+          TempRetVal = CatSPrint (RetVal, TempStr, L"UnknownInfoType");\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
+\r
+          SHELL_FREE_NON_NULL (TempStr);\r
+          SHELL_FREE_NON_NULL (GuidStr);\r
+          //\r
+          // So that we never have to pass this UnknownInfoType to the parsing function "GetInformation" service of AIP\r
+          //\r
+          continue;\r
+        } else {\r
+          TempRetVal = CatSPrint (RetVal, TempStr, GuidStr);\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
+          SHELL_FREE_NON_NULL (GuidStr);\r
+        }\r
+      }\r
+\r
+      SHELL_FREE_NON_NULL (TempStr);\r
+\r
+      Status = EfiAdptrInfoProtocol->GetInformation (\r
+                                       EfiAdptrInfoProtocol,\r
+                                       &InfoTypesBuffer[GuidIndex],\r
+                                       &InformationBlock,\r
+                                       &InformationBlockSize\r
+                                       );\r
+\r
+      if (EFI_ERROR (Status)) {\r
+        TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GETINFO_FAILED), NULL);\r
+        if (TempStr == NULL) {\r
+          goto ERROR_EXIT;\r
+        }\r
+\r
+        TempRetVal = CatSPrint (RetVal, TempStr, Status);\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
+      } else {\r
+        if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoMediaStateGuid)) {\r
+          TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_MEDIA_STATE), NULL);\r
+          if (TempStr == NULL) {\r
+            goto ERROR_EXIT;\r
+          }\r
+\r
+          TempRetVal = CatSPrint (\r
+                         RetVal,\r
+                         TempStr,\r
+                         ((EFI_ADAPTER_INFO_MEDIA_STATE *)InformationBlock)->MediaState,\r
+                         ((EFI_ADAPTER_INFO_MEDIA_STATE *)InformationBlock)->MediaState\r
+                         );\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
+        } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoNetworkBootGuid)) {\r
+          TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_NETWORK_BOOT_INFO), NULL);\r
+          if (TempStr == NULL) {\r
+            goto ERROR_EXIT;\r
+          }\r
+\r
+          TempRetVal = CatSPrint (\r
+                         RetVal,\r
+                         TempStr,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv4BootCapablity,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv6BootCapablity,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->FCoeBootCapablity,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->OffloadCapability,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiMpioCapability,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv4Boot,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv6Boot,\r
+                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->FCoeBoot\r
+                         );\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
+        } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoSanMacAddressGuid) == TRUE) {\r
+          TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_SAN_MAC_ADDRESS_INFO), NULL);\r
+          if (TempStr == NULL) {\r
+            goto ERROR_EXIT;\r
+          }\r
+\r
+          TempRetVal = CatSPrint (\r
+                         RetVal,\r
+                         TempStr,\r
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[0],\r
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[1],\r
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[2],\r
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[3],\r
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[4],\r
+                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[5]\r
+                         );\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
+        } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoUndiIpv6SupportGuid) == TRUE) {\r
+          TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_UNDI_IPV6_INFO), NULL);\r
+          if (TempStr == NULL) {\r
+            goto ERROR_EXIT;\r
+          }\r
+\r
+          TempRetVal = CatSPrint (\r
+                         RetVal,\r
+                         TempStr,\r
+                         ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT *)InformationBlock)->Ipv6Support\r
+                         );\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
+        } else {\r
+          TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_UNKNOWN_INFO_TYPE), NULL);\r
+          if (TempStr == NULL) {\r
+            goto ERROR_EXIT;\r
+          }\r
+\r
+          TempRetVal = CatSPrint (RetVal, TempStr, &InfoTypesBuffer[GuidIndex]);\r
+          SHELL_FREE_NON_NULL (RetVal);\r
+          RetVal = TempRetVal;\r
+        }\r
+      }\r
+\r
+      SHELL_FREE_NON_NULL (TempStr);\r
+      SHELL_FREE_NON_NULL (InformationBlock);\r
+    }\r
+  }\r
+\r
+  SHELL_FREE_NON_NULL (InfoTypesBuffer);\r
+  return RetVal;\r
+\r
+ERROR_EXIT:\r
+  SHELL_FREE_NON_NULL (RetVal);\r
+  SHELL_FREE_NON_NULL (InfoTypesBuffer);\r
+  SHELL_FREE_NON_NULL (InformationBlock);\r
+  return NULL;\r
+}\r
+\r
+/**\r
+  Function to dump information about EFI_FIRMWARE_MANAGEMENT_PROTOCOL 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
+FirmwareManagementDumpInformation (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST BOOLEAN     Verbose\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  EFI_FIRMWARE_MANAGEMENT_PROTOCOL  *EfiFwMgmtProtocol;\r
+  EFI_FIRMWARE_IMAGE_DESCRIPTOR     *ImageInfo;\r
+  EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1  *ImageInfoV1;\r
+  EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2  *ImageInfoV2;\r
+  UINT64                            AttributeSetting;\r
+  UINTN                             ImageInfoSize;\r
+  UINTN                             DescriptorSize;\r
+  UINT32                            DescriptorVersion;\r
+  UINT32                            PackageVersion;\r
+  UINT8                             DescriptorCount;\r
+  UINT8                             Index;\r
+  UINT8                             Index1;\r
+  UINT8                             ImageCount;\r
+  CHAR16                            *PackageVersionName;\r
+  CHAR16                            *TempStr;\r
+  CHAR16                            *RetVal;\r
+  CHAR16                            *TempRetVal;\r
+  CHAR16                            *AttributeSettingStr;\r
+  BOOLEAN                           Found;\r
+  BOOLEAN                           AttributeSupported;\r
+\r
+  //\r
+  // Initialize local variables\r
+  //\r
+  ImageCount          = 0;\r
+  ImageInfoSize       = 1;\r
+  AttributeSetting    = 0;\r
+  Found               = FALSE;\r
+  AttributeSupported  = FALSE;\r
+  ImageInfo           = NULL;\r
+  ImageInfoV1         = NULL;\r
+  ImageInfoV2         = NULL;\r
+  PackageVersionName  = NULL;\r
+  RetVal              = NULL;\r
+  TempRetVal          = NULL;\r
+  TempStr             = NULL;\r
+  AttributeSettingStr = NULL;\r
+\r
+  if (!Verbose) {\r
+    return (CatSPrint (NULL, L"FirmwareManagement"));\r
+  }\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  (EFI_HANDLE)(TheHandle),\r
+                  &gEfiFirmwareManagementProtocolGuid,\r
+                  (VOID **)&EfiFwMgmtProtocol,\r
+                  NULL,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  Status = EfiFwMgmtProtocol->GetImageInfo (\r
+                                EfiFwMgmtProtocol,\r
+                                &ImageInfoSize,\r
+                                ImageInfo,\r
+                                &DescriptorVersion,\r
+                                &DescriptorCount,\r
+                                &DescriptorSize,\r
+                                &PackageVersion,\r
+                                &PackageVersionName\r
+                                );\r
+\r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    ImageInfo = AllocateZeroPool (ImageInfoSize);\r
+\r
+    if (ImageInfo == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+    } else {\r
+      Status = EfiFwMgmtProtocol->GetImageInfo (\r
+                                    EfiFwMgmtProtocol,\r
+                                    &ImageInfoSize,\r
+                                    ImageInfo,\r
+                                    &DescriptorVersion,\r
+                                    &DescriptorCount,\r
+                                    &DescriptorSize,\r
+                                    &PackageVersion,\r
+                                    &PackageVersionName\r
+                                    );\r
+    }\r
+  }\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    goto ERROR_EXIT;\r
+  }\r
+\r
+  //\r
+  // Decode Image Descriptor data only if its version is supported\r
+  //\r
+  if (DescriptorVersion <= EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION) {\r
+    if (ImageInfo == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+\r
+    ImageInfoV1 = (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1 *)ImageInfo;\r
+    ImageInfoV2 = (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2 *)ImageInfo;\r
+\r
+    //\r
+    // Set ImageInfoSize in return buffer\r
+    //\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_IMAGE_INFO_SIZE), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+\r
+    RetVal = CatSPrint (NULL, TempStr, ImageInfoSize);\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+    //\r
+    // Set DescriptorVersion in return buffer\r
+    //\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_DESCRIPTOR_VERSION), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+\r
+    TempRetVal = CatSPrint (RetVal, TempStr, DescriptorVersion);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+    //\r
+    // Set DescriptorCount in return buffer\r
+    //\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_DESCRIPTOR_COUNT), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+\r
+    TempRetVal = CatSPrint (RetVal, TempStr, DescriptorCount);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+    //\r
+    // Set DescriptorSize in return buffer\r
+    //\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_DESCRIPTOR_SIZE), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+\r
+    TempRetVal = CatSPrint (RetVal, TempStr, DescriptorSize);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+    //\r
+    // Set PackageVersion in return buffer\r
+    //\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_PACKAGE_VERSION), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+\r
+    TempRetVal = CatSPrint (RetVal, TempStr, PackageVersion);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+    //\r
+    // Set PackageVersionName in return buffer\r
+    //\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_PACKAGE_VERSION_NAME), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+\r
+    TempRetVal = CatSPrint (RetVal, TempStr, PackageVersionName);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+\r
+    for (Index = 0; Index < DescriptorCount; Index++) {\r
+      //\r
+      // First check if Attribute is supported\r
+      // and generate a string for AttributeSetting field\r
+      //\r
+      SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+      AttributeSupported = FALSE;\r
+      AttributeSetting   = 0;\r
+      if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {\r
+        if (ImageInfoV1[Index].AttributesSupported != 0x0) {\r
+          AttributeSupported = TRUE;\r
+          AttributeSetting   = ImageInfoV1[Index].AttributesSetting;\r
+        }\r
+      } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {\r
+        if (ImageInfoV2[Index].AttributesSupported != 0x0) {\r
+          AttributeSupported = TRUE;\r
+          AttributeSetting   = ImageInfoV2[Index].AttributesSetting;\r
+        }\r
+      } else {\r
+        if (ImageInfo[Index].AttributesSupported != 0x0) {\r
+          AttributeSupported = TRUE;\r
+          AttributeSetting   = ImageInfo[Index].AttributesSetting;\r
+        }\r
+      }\r
+\r
+      if (!AttributeSupported) {\r
+        AttributeSettingStr = CatSPrint (NULL, L"None");\r
+      } else {\r
+        AttributeSettingStr = CatSPrint (NULL, L"(");\r
+\r
+        if ((AttributeSetting & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE) != 0x0) {\r
+          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_IMAGE_UPDATABLE");\r
+          SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+          AttributeSettingStr = TempRetVal;\r
+        }\r
+\r
+        if ((AttributeSetting & IMAGE_ATTRIBUTE_RESET_REQUIRED) != 0x0) {\r
+          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_RESET_REQUIRED");\r
+          SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+          AttributeSettingStr = TempRetVal;\r
+        }\r
+\r
+        if ((AttributeSetting & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED) != 0x0) {\r
+          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED");\r
+          SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+          AttributeSettingStr = TempRetVal;\r
+        }\r
+\r
+        if ((AttributeSetting & IMAGE_ATTRIBUTE_IN_USE) != 0x0) {\r
+          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_IN_USE");\r
+          SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+          AttributeSettingStr = TempRetVal;\r
+        }\r
+\r
+        if ((AttributeSetting & IMAGE_ATTRIBUTE_UEFI_IMAGE) != 0x0) {\r
+          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_UEFI_IMAGE");\r
+          SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+          AttributeSettingStr = TempRetVal;\r
+        }\r
+\r
+        TempRetVal = CatSPrint (AttributeSettingStr, L" )");\r
+        SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+        AttributeSettingStr = TempRetVal;\r
+      }\r
+\r
+      if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {\r
+        if (ImageInfoV1[Index].ImageIndex != 0x0) {\r
+          ImageCount++;\r
+        }\r
+\r
+        TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_IMAGE_DESCRIPTOR_INFO_V1), NULL);\r
+        if (TempStr == NULL) {\r
+          goto ERROR_EXIT;\r
+        }\r
+\r
+        TempRetVal = CatSPrint (\r
+                       RetVal,\r
+                       TempStr,\r
+                       Index,\r
+                       ImageInfoV1[Index].ImageIndex,\r
+                       &ImageInfoV1[Index].ImageTypeId,\r
+                       ImageInfoV1[Index].ImageId,\r
+                       ImageInfoV1[Index].ImageIdName,\r
+                       ImageInfoV1[Index].Version,\r
+                       ImageInfoV1[Index].VersionName,\r
+                       ImageInfoV1[Index].Size,\r
+                       ImageInfoV1[Index].AttributesSupported,\r
+                       AttributeSettingStr,\r
+                       ImageInfoV1[Index].Compatibilities\r
+                       );\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
+        SHELL_FREE_NON_NULL (TempStr);\r
+      } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {\r
+        if (ImageInfoV2[Index].ImageIndex != 0x0) {\r
+          ImageCount++;\r
+        }\r
+\r
+        TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_IMAGE_DESCRIPTOR_INFO_V2), NULL);\r
+        if (TempStr == NULL) {\r
+          goto ERROR_EXIT;\r
+        }\r
+\r
+        TempRetVal = CatSPrint (\r
+                       RetVal,\r
+                       TempStr,\r
+                       Index,\r
+                       ImageInfoV2[Index].ImageIndex,\r
+                       &ImageInfoV2[Index].ImageTypeId,\r
+                       ImageInfoV2[Index].ImageId,\r
+                       ImageInfoV2[Index].ImageIdName,\r
+                       ImageInfoV2[Index].Version,\r
+                       ImageInfoV2[Index].VersionName,\r
+                       ImageInfoV2[Index].Size,\r
+                       ImageInfoV2[Index].AttributesSupported,\r
+                       AttributeSettingStr,\r
+                       ImageInfoV2[Index].Compatibilities,\r
+                       ImageInfoV2[Index].LowestSupportedImageVersion\r
+                       );\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
+        SHELL_FREE_NON_NULL (TempStr);\r
+      } else {\r
+        if (ImageInfo[Index].ImageIndex != 0x0) {\r
+          ImageCount++;\r
+        }\r
+\r
+        TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_IMAGE_DESCRIPTOR_INFO), NULL);\r
+        if (TempStr == NULL) {\r
+          goto ERROR_EXIT;\r
+        }\r
+\r
+        TempRetVal = CatSPrint (\r
+                       RetVal,\r
+                       TempStr,\r
+                       Index,\r
+                       ImageInfo[Index].ImageIndex,\r
+                       &ImageInfo[Index].ImageTypeId,\r
+                       ImageInfo[Index].ImageId,\r
+                       ImageInfo[Index].ImageIdName,\r
+                       ImageInfo[Index].Version,\r
+                       ImageInfo[Index].VersionName,\r
+                       ImageInfo[Index].Size,\r
+                       ImageInfo[Index].AttributesSupported,\r
+                       AttributeSettingStr,\r
+                       ImageInfo[Index].Compatibilities,\r
+                       ImageInfo[Index].LowestSupportedImageVersion,\r
+                       ImageInfo[Index].LastAttemptVersion,\r
+                       ImageInfo[Index].LastAttemptStatus,\r
+                       ImageInfo[Index].HardwareInstance\r
+                       );\r
+        SHELL_FREE_NON_NULL (RetVal);\r
+        RetVal = TempRetVal;\r
+        SHELL_FREE_NON_NULL (TempStr);\r
+      }\r
+    }\r
+  }\r
+\r
+  if (ImageCount > 0) {\r
+    for (Index = 0; Index < DescriptorCount; Index++) {\r
+      for (Index1 = Index+1; Index1 < DescriptorCount; Index1++) {\r
+        if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {\r
+          if (ImageInfoV1[Index].ImageId == ImageInfoV1[Index1].ImageId) {\r
+            Found = TRUE;\r
+            //\r
+            // At least one match found indicating presense of non unique ImageId values so no more comparisons needed\r
+            //\r
+            goto ENDLOOP;\r
+          }\r
+        } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {\r
+          if (ImageInfoV2[Index].ImageId == ImageInfoV2[Index1].ImageId) {\r
+            Found = TRUE;\r
+            //\r
+            // At least one match found indicating presense of non unique ImageId values so no more comparisons needed\r
+            //\r
+            goto ENDLOOP;\r
+          }\r
+        } else {\r
+          if (ImageInfo[Index].ImageId == ImageInfo[Index1].ImageId) {\r
+            Found = TRUE;\r
+            //\r
+            // At least one match found indicating presense of non unique ImageId values so no more comparisons needed\r
+            //\r
+            goto ENDLOOP;\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+ENDLOOP:\r
+  //\r
+  // Check if ImageId with duplicate value was found\r
+  //\r
+  if (Found) {\r
+    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_IMAGEID_NON_UNIQUE), NULL);\r
+    if (TempStr == NULL) {\r
+      goto ERROR_EXIT;\r
+    }\r
+\r
+    TempRetVal = CatSPrint (RetVal, TempStr);\r
+    SHELL_FREE_NON_NULL (RetVal);\r
+    RetVal = TempRetVal;\r
+    SHELL_FREE_NON_NULL (TempStr);\r
+  }\r
+\r
+  SHELL_FREE_NON_NULL (ImageInfo);\r
+  SHELL_FREE_NON_NULL (PackageVersionName);\r
+  SHELL_FREE_NON_NULL (AttributeSettingStr);\r
+\r
+  return RetVal;\r
 \r
-  Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_TXT_OUT_DUMP_HEADER), NULL);\r
-  if (Temp != NULL) {\r
-    UnicodeSPrint(RetVal, Size, Temp, Dev, Dev->Mode->Attribute);\r
-    FreePool(Temp);\r
-  }\r
+ERROR_EXIT:\r
+  SHELL_FREE_NON_NULL (RetVal);\r
+  SHELL_FREE_NON_NULL (ImageInfo);\r
+  SHELL_FREE_NON_NULL (PackageVersionName);\r
+  SHELL_FREE_NON_NULL (AttributeSettingStr);\r
 \r
-  //\r
-  // Dump TextOut Info\r
-  //\r
-  Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_TXT_OUT_DUMP_LINE), NULL);\r
-  for (Index = 0; Index < Dev->Mode->MaxMode; Index++) {\r
-    Status = Dev->QueryMode (Dev, Index, &Col, &Row);\r
-    NewSize = Size - StrSize(RetVal);\r
-    UnicodeSPrint(\r
-      RetVal + StrLen(RetVal),\r
-      NewSize,\r
-      Temp == NULL?L"":Temp,\r
-      Index == Dev->Mode->Mode ? L'*' : L' ',\r
-      Index,\r
-      !EFI_ERROR(Status)?(INTN)Col:-1,\r
-      !EFI_ERROR(Status)?(INTN)Row:-1\r
-     );\r
-  }\r
-  FreePool(Temp);\r
-  return (RetVal);\r
+  return NULL;\r
 }\r
 \r
-STATIC CONST UINTN VersionStringSize = 60;\r
-\r
 /**\r
-  Function to dump information about EfiDriverSupportedEfiVersion protocol.\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 poitner to a string containing the information.\r
+  @retval A pointer to a string containing the information.\r
 **/\r
-CHAR16*\r
+CHAR16 *\r
 EFIAPI\r
-DriverEfiVersionProtocolDumpInformation(\r
-  IN CONST EFI_HANDLE TheHandle,\r
-  IN CONST BOOLEAN    Verbose\r
+PartitionInfoProtocolDumpInformation (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST BOOLEAN     Verbose\r
   )\r
 {\r
-  EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL *DriverEfiVersion;\r
-  EFI_STATUS                                Status;\r
-  CHAR16                                    *RetVal;\r
+  EFI_STATUS                   Status;\r
+  EFI_PARTITION_INFO_PROTOCOL  *PartitionInfo;\r
+  CHAR16                       *PartitionType;\r
+  CHAR16                       *EfiSystemPartition;\r
+  CHAR16                       *RetVal;\r
 \r
-  Status = gBS->HandleProtocol(\r
-    TheHandle,\r
-    &gEfiDriverSupportedEfiVersionProtocolGuid,\r
-    (VOID**)&DriverEfiVersion);\r
-\r
-  ASSERT_EFI_ERROR(Status);\r
-\r
-  RetVal = AllocateZeroPool(VersionStringSize);\r
-  ASSERT(RetVal != NULL);\r
-  UnicodeSPrint(RetVal, VersionStringSize, L"0x%08x", DriverEfiVersion->FirmwareVersion);\r
-  return (RetVal);\r
-}\r
+  if (!Verbose) {\r
+    return NULL;\r
+  }\r
 \r
-/**\r
-  Function to dump information about DevicePath protocol.\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
-  This will allocate the return buffer from boot services pool.\r
+  HandleParsingHiiInit ();\r
 \r
-  @param[in] TheHandle      The handle that has the protocol installed.\r
-  @param[in] Verbose        TRUE for additional information, FALSE otherwise.\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
 \r
-  @retval A poitner to a string containing the information.\r
-**/\r
-CHAR16*\r
-EFIAPI\r
-DevicePathProtocolDumpInformation(\r
-  IN CONST EFI_HANDLE TheHandle,\r
-  IN CONST BOOLEAN    Verbose\r
-  )\r
-{\r
-  EFI_DEVICE_PATH_PROTOCOL          *DevPath;\r
-  CHAR16                            *Temp;\r
-  CHAR16                            *Temp2;\r
-  EFI_STATUS                        Status;\r
-  Temp = NULL;\r
+  if (PartitionType == NULL) {\r
+    return NULL;\r
+  }\r
 \r
-  Status = gBS->OpenProtocol(TheHandle, &gEfiDevicePathProtocolGuid, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
-  if (!EFI_ERROR(Status)) {\r
-    //\r
-    // I cannot decide whether to allow shortcuts here (the second BOOLEAN on the next line)\r
-    //\r
-    Temp = ConvertDevicePathToText(DevPath, TRUE, TRUE);\r
-    gBS->CloseProtocol(TheHandle, &gEfiDevicePathProtocolGuid, gImageHandle, NULL);\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 (!Verbose && Temp != NULL && StrLen(Temp) > 30) {\r
-    Temp2 = NULL;\r
-    Temp2 = StrnCatGrow(&Temp2, NULL, Temp+(StrLen(Temp) - 30), 30);\r
-    FreePool(Temp);\r
-    Temp = Temp2;\r
+\r
+  if (EfiSystemPartition == NULL) {\r
+    SHELL_FREE_NON_NULL (PartitionType);\r
+    return NULL;\r
   }\r
-  return (Temp);\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
@@ -598,200 +2114,389 @@ DevicePathProtocolDumpInformation(
   { \\r
     0xc95a93d, 0xa006, 0x11d4, { 0xbc, 0xfa, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \\r
   }\r
-STATIC CONST EFI_GUID WinNtThunkProtocolGuid = LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID;\r
-STATIC CONST EFI_GUID WinNtIoProtocolGuid    = LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID;\r
-STATIC CONST EFI_GUID WinNtSerialPortGuid    = LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID;\r
+STATIC CONST EFI_GUID  WinNtThunkProtocolGuid = LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID;\r
+STATIC CONST EFI_GUID  WinNtIoProtocolGuid    = LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID;\r
+STATIC CONST EFI_GUID  WinNtSerialPortGuid    = LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID;\r
+\r
+//\r
+// Deprecated protocols we dont want to link from IntelFrameworkModulePkg\r
+//\r
+#define LOCAL_EFI_ISA_IO_PROTOCOL_GUID \\r
+  { \\r
+  0x7ee2bd44, 0x3da0, 0x11d4, { 0x9a, 0x38, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \\r
+  }\r
+#define LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID \\r
+  { \\r
+  0x64a892dc, 0x5561, 0x4536, { 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 } \\r
+  }\r
+STATIC CONST EFI_GUID  EfiIsaIoProtocolGuid   = LOCAL_EFI_ISA_IO_PROTOCOL_GUID;\r
+STATIC CONST EFI_GUID  EfiIsaAcpiProtocolGuid = LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID;\r
 \r
-STATIC CONST GUID_INFO_BLOCK mGuidStringListNT[] = {\r
-  {STRING_TOKEN(STR_WINNT_THUNK),           (EFI_GUID*)&WinNtThunkProtocolGuid,               NULL},\r
-  {STRING_TOKEN(STR_WINNT_DRIVER_IO),       (EFI_GUID*)&WinNtIoProtocolGuid,                  NULL},\r
-  {STRING_TOKEN(STR_WINNT_SERIAL_PORT),     (EFI_GUID*)&WinNtSerialPortGuid,                  NULL},\r
-  {STRING_TOKEN(STR_UNKNOWN_DEVICE),        NULL,                                             NULL},\r
+STATIC CONST GUID_INFO_BLOCK  mGuidStringListNT[] = {\r
+  { STRING_TOKEN (STR_WINNT_THUNK),       (EFI_GUID *)&WinNtThunkProtocolGuid, NULL },\r
+  { STRING_TOKEN (STR_WINNT_DRIVER_IO),   (EFI_GUID *)&WinNtIoProtocolGuid,    NULL },\r
+  { STRING_TOKEN (STR_WINNT_SERIAL_PORT), (EFI_GUID *)&WinNtSerialPortGuid,    NULL },\r
+  { 0,                                    NULL,                                NULL },\r
 };\r
 \r
-STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {\r
-  {STRING_TOKEN(STR_LOADED_IMAGE),          &gEfiLoadedImageProtocolGuid,                     LoadedImageProtocolDumpInformation},\r
-  {STRING_TOKEN(STR_DEVICE_PATH),           &gEfiDevicePathProtocolGuid,                      DevicePathProtocolDumpInformation},\r
-  {STRING_TOKEN(STR_IMAGE_PATH),            &gEfiLoadedImageDevicePathProtocolGuid,           DevicePathProtocolDumpInformation},\r
-  {STRING_TOKEN(STR_DEVICE_PATH_UTIL),      &gEfiDevicePathUtilitiesProtocolGuid,             NULL},\r
-  {STRING_TOKEN(STR_DEVICE_PATH_TXT),       &gEfiDevicePathToTextProtocolGuid,                NULL},\r
-  {STRING_TOKEN(STR_DEVICE_PATH_FTXT),      &gEfiDevicePathFromTextProtocolGuid,              NULL},\r
-  {STRING_TOKEN(STR_DEVICE_PATH_PC),        &gEfiPcAnsiGuid,                                  NULL},\r
-  {STRING_TOKEN(STR_DEVICE_PATH_VT100),     &gEfiVT100Guid,                                   NULL},\r
-  {STRING_TOKEN(STR_DEVICE_PATH_VT100P),    &gEfiVT100PlusGuid,                               NULL},\r
-  {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_DRIVER_DIAG),           &gEfiDriverDiagnosticsProtocolGuid,               NULL},\r
-  {STRING_TOKEN(STR_DRIVER_DIAG2),          &gEfiDriverDiagnostics2ProtocolGuid,              NULL},\r
-  {STRING_TOKEN(STR_DRIVER_CN),             &gEfiComponentNameProtocolGuid,                   NULL},\r
-  {STRING_TOKEN(STR_DRIVER_CN2),            &gEfiComponentName2ProtocolGuid,                  NULL},\r
-  {STRING_TOKEN(STR_PLAT_DRV_CFG),          &gEfiPlatformToDriverConfigurationProtocolGuid,   NULL},\r
-  {STRING_TOKEN(STR_DRIVER_VERSION),        &gEfiDriverSupportedEfiVersionProtocolGuid,       DriverEfiVersionProtocolDumpInformation},\r
-  {STRING_TOKEN(STR_TXT_IN),                &gEfiSimpleTextInProtocolGuid,                    NULL},\r
-  {STRING_TOKEN(STR_TXT_IN_EX),             &gEfiSimpleTextInputExProtocolGuid,               NULL},\r
-  {STRING_TOKEN(STR_TXT_OUT),               &gEfiSimpleTextOutProtocolGuid,                   TxtOutProtocolDumpInformation},\r
-  {STRING_TOKEN(STR_SIM_POINTER),           &gEfiSimplePointerProtocolGuid,                   NULL},\r
-  {STRING_TOKEN(STR_ABS_POINTER),           &gEfiAbsolutePointerProtocolGuid,                 NULL},\r
-  {STRING_TOKEN(STR_SERIAL_IO),             &gEfiSerialIoProtocolGuid,                        NULL},\r
-  {STRING_TOKEN(STR_GRAPHICS_OUTPUT),       &gEfiGraphicsOutputProtocolGuid,                  GraphicsOutputProtocolDumpInformation},\r
-  {STRING_TOKEN(STR_EDID_DISCOVERED),       &gEfiEdidDiscoveredProtocolGuid,                  NULL},\r
-  {STRING_TOKEN(STR_EDID_ACTIVE),           &gEfiEdidActiveProtocolGuid,                      NULL},\r
-  {STRING_TOKEN(STR_EDID_OVERRIDE),         &gEfiEdidOverrideProtocolGuid,                    NULL},\r
-  {STRING_TOKEN(STR_CON_IN),                &gEfiConsoleInDeviceGuid,                         NULL},\r
-  {STRING_TOKEN(STR_CON_OUT),               &gEfiConsoleOutDeviceGuid,                        NULL},\r
-  {STRING_TOKEN(STR_STD_ERR),               &gEfiStandardErrorDeviceGuid,                     NULL},\r
-  {STRING_TOKEN(STR_LOAD_FILE),             &gEfiLoadFileProtocolGuid,                        NULL},\r
-  {STRING_TOKEN(STR_LOAD_FILE2),            &gEfiLoadFile2ProtocolGuid,                       NULL},\r
-  {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_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_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_HC),                &gEfiUsbHcProtocolGuid,                           NULL},\r
-  {STRING_TOKEN(STR_USB_HC2),               &gEfiUsb2HcProtocolGuid,                          NULL},\r
-  {STRING_TOKEN(STR_DEBUG_SUPPORT),         &gEfiDebugSupportProtocolGuid,                    NULL},\r
-  {STRING_TOKEN(STR_DEBUG_PORT),            &gEfiDebugPortProtocolGuid,                       NULL},\r
-  {STRING_TOKEN(STR_DECOMPRESS),            &gEfiDecompressProtocolGuid,                      NULL},\r
-  {STRING_TOKEN(STR_ACPI_TABLE),            &gEfiAcpiTableProtocolGuid,                       NULL},\r
-  {STRING_TOKEN(STR_EBC_INTERPRETER),       &gEfiEbcProtocolGuid,                             NULL},\r
-  {STRING_TOKEN(STR_SNP),                   &gEfiSimpleNetworkProtocolGuid,                   NULL},\r
-  {STRING_TOKEN(STR_NII),                   &gEfiNetworkInterfaceIdentifierProtocolGuid,      NULL},\r
-  {STRING_TOKEN(STR_NII_31),                &gEfiNetworkInterfaceIdentifierProtocolGuid_31,   NULL},\r
-  {STRING_TOKEN(STR_PXE_BC),                &gEfiPxeBaseCodeProtocolGuid,                     NULL},\r
-  {STRING_TOKEN(STR_PXE_CB),                &gEfiPxeBaseCodeCallbackProtocolGuid,             NULL},\r
-  {STRING_TOKEN(STR_BIS),                   &gEfiBisProtocolGuid,                             NULL},\r
-  {STRING_TOKEN(STR_MNP_SB),                &gEfiManagedNetworkServiceBindingProtocolGuid,    NULL},\r
-  {STRING_TOKEN(STR_MNP),                   &gEfiManagedNetworkProtocolGuid,                  NULL},\r
-  {STRING_TOKEN(STR_ARP_SB),                &gEfiArpServiceBindingProtocolGuid,               NULL},\r
-  {STRING_TOKEN(STR_ARP),                   &gEfiArpProtocolGuid,                             NULL},\r
-  {STRING_TOKEN(STR_DHCPV4_SB),             &gEfiDhcp4ServiceBindingProtocolGuid,             NULL},\r
-  {STRING_TOKEN(STR_DHCPV4),                &gEfiDhcp4ProtocolGuid,                           NULL},\r
-  {STRING_TOKEN(STR_TCPV4_SB),              &gEfiTcp4ServiceBindingProtocolGuid,              NULL},\r
-  {STRING_TOKEN(STR_TCPV4),                 &gEfiTcp4ProtocolGuid,                            NULL},\r
-  {STRING_TOKEN(STR_IPV4_SB),               &gEfiIp4ServiceBindingProtocolGuid,               NULL},\r
-  {STRING_TOKEN(STR_IPV4),                  &gEfiIp4ProtocolGuid,                             NULL},\r
-  {STRING_TOKEN(STR_IPV4_CFG),              &gEfiIp4ConfigProtocolGuid,                       NULL},\r
-  {STRING_TOKEN(STR_UDPV4_SB),              &gEfiUdp4ServiceBindingProtocolGuid,              NULL},\r
-  {STRING_TOKEN(STR_UDPV4),                 &gEfiUdp4ProtocolGuid,                            NULL},\r
-  {STRING_TOKEN(STR_MTFTPV4_SB),            &gEfiMtftp4ServiceBindingProtocolGuid,            NULL},\r
-  {STRING_TOKEN(STR_MTFTPV4),               &gEfiMtftp4ProtocolGuid,                          NULL},\r
-  {STRING_TOKEN(STR_AUTH_INFO),             &gEfiAuthenticationInfoProtocolGuid,              NULL},\r
-  {STRING_TOKEN(STR_HASH_SB),               &gEfiHashServiceBindingProtocolGuid,              NULL},\r
-  {STRING_TOKEN(STR_HASH),                  &gEfiHashProtocolGuid,                            NULL},\r
-  {STRING_TOKEN(STR_HII_FONT),              &gEfiHiiFontProtocolGuid,                         NULL},\r
-  {STRING_TOKEN(STR_HII_STRING),            &gEfiHiiStringProtocolGuid,                       NULL},\r
-  {STRING_TOKEN(STR_HII_IMAGE),             &gEfiHiiImageProtocolGuid,                        NULL},\r
-  {STRING_TOKEN(STR_HII_DATABASE),          &gEfiHiiDatabaseProtocolGuid,                     NULL},\r
-  {STRING_TOKEN(STR_HII_CONFIG_ROUT),       &gEfiHiiConfigRoutingProtocolGuid,                NULL},\r
-  {STRING_TOKEN(STR_HII_CONFIG_ACC),        &gEfiHiiConfigAccessProtocolGuid,                 NULL},\r
-  {STRING_TOKEN(STR_HII_FORM_BROWSER2),     &gEfiFormBrowser2ProtocolGuid,                    NULL},\r
-  {STRING_TOKEN(STR_DRIVER_FAM_OVERRIDE),   &gEfiDriverFamilyOverrideProtocolGuid,            NULL},\r
-  {STRING_TOKEN(STR_PCD),                   &gPcdProtocolGuid,                                NULL},\r
-  {STRING_TOKEN(STR_TCG),                   &gEfiTcgProtocolGuid,                             NULL},\r
-  {STRING_TOKEN(STR_HII_PACKAGE_LIST),      &gEfiHiiPackageListProtocolGuid,                  NULL},\r
+STATIC CONST GUID_INFO_BLOCK  mGuidStringList[] = {\r
+  { STRING_TOKEN (STR_LOADED_IMAGE),        &gEfiLoadedImageProtocolGuid,                      LoadedImageProtocolDumpInformation               },\r
+  { STRING_TOKEN (STR_DEVICE_PATH),         &gEfiDevicePathProtocolGuid,                       DevicePathProtocolDumpInformation                },\r
+  { STRING_TOKEN (STR_IMAGE_PATH),          &gEfiLoadedImageDevicePathProtocolGuid,            LoadedImageDevicePathProtocolDumpInformation     },\r
+  { STRING_TOKEN (STR_DEVICE_PATH_UTIL),    &gEfiDevicePathUtilitiesProtocolGuid,              NULL                                             },\r
+  { STRING_TOKEN (STR_DEVICE_PATH_TXT),     &gEfiDevicePathToTextProtocolGuid,                 NULL                                             },\r
+  { STRING_TOKEN (STR_DEVICE_PATH_FTXT),    &gEfiDevicePathFromTextProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_DEVICE_PATH_PC),      &gEfiPcAnsiGuid,                                   NULL                                             },\r
+  { STRING_TOKEN (STR_DEVICE_PATH_VT100),   &gEfiVT100Guid,                                    NULL                                             },\r
+  { STRING_TOKEN (STR_DEVICE_PATH_VT100P),  &gEfiVT100PlusGuid,                                NULL                                             },\r
+  { 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,        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
+  { STRING_TOKEN (STR_DRIVER_CN2),          &gEfiComponentName2ProtocolGuid,                   NULL                                             },\r
+  { STRING_TOKEN (STR_PLAT_DRV_CFG),        &gEfiPlatformToDriverConfigurationProtocolGuid,    NULL                                             },\r
+  { STRING_TOKEN (STR_DRIVER_VERSION),      &gEfiDriverSupportedEfiVersionProtocolGuid,        DriverEfiVersionProtocolDumpInformation          },\r
+  { STRING_TOKEN (STR_TXT_IN),              &gEfiSimpleTextInProtocolGuid,                     NULL                                             },\r
+  { STRING_TOKEN (STR_TXT_IN_EX),           &gEfiSimpleTextInputExProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_TXT_OUT),             &gEfiSimpleTextOutProtocolGuid,                    TxtOutProtocolDumpInformation                    },\r
+  { STRING_TOKEN (STR_SIM_POINTER),         &gEfiSimplePointerProtocolGuid,                    NULL                                             },\r
+  { STRING_TOKEN (STR_ABS_POINTER),         &gEfiAbsolutePointerProtocolGuid,                  NULL                                             },\r
+  { STRING_TOKEN (STR_SERIAL_IO),           &gEfiSerialIoProtocolGuid,                         NULL                                             },\r
+  { STRING_TOKEN (STR_GRAPHICS_OUTPUT),     &gEfiGraphicsOutputProtocolGuid,                   GraphicsOutputProtocolDumpInformation            },\r
+  { STRING_TOKEN (STR_EDID_DISCOVERED),     &gEfiEdidDiscoveredProtocolGuid,                   EdidDiscoveredProtocolDumpInformation            },\r
+  { STRING_TOKEN (STR_EDID_ACTIVE),         &gEfiEdidActiveProtocolGuid,                       EdidActiveProtocolDumpInformation                },\r
+  { STRING_TOKEN (STR_EDID_OVERRIDE),       &gEfiEdidOverrideProtocolGuid,                     NULL                                             },\r
+  { STRING_TOKEN (STR_CON_IN),              &gEfiConsoleInDeviceGuid,                          NULL                                             },\r
+  { STRING_TOKEN (STR_CON_OUT),             &gEfiConsoleOutDeviceGuid,                         NULL                                             },\r
+  { STRING_TOKEN (STR_STD_ERR),             &gEfiStandardErrorDeviceGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_LOAD_FILE),           &gEfiLoadFileProtocolGuid,                         NULL                                             },\r
+  { STRING_TOKEN (STR_LOAD_FILE2),          &gEfiLoadFile2ProtocolGuid,                        NULL                                             },\r
+  { 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,                          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,                            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,                            UsbIoProtocolDumpInformation                     },\r
+  { STRING_TOKEN (STR_USB_HC),              &gEfiUsbHcProtocolGuid,                            NULL                                             },\r
+  { STRING_TOKEN (STR_USB_HC2),             &gEfiUsb2HcProtocolGuid,                           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
+  { STRING_TOKEN (STR_EBC_INTERPRETER),     &gEfiEbcProtocolGuid,                              NULL                                             },\r
+  { STRING_TOKEN (STR_SNP),                 &gEfiSimpleNetworkProtocolGuid,                    NULL                                             },\r
+  { STRING_TOKEN (STR_NII),                 &gEfiNetworkInterfaceIdentifierProtocolGuid,       NULL                                             },\r
+  { STRING_TOKEN (STR_NII_31),              &gEfiNetworkInterfaceIdentifierProtocolGuid_31,    NULL                                             },\r
+  { STRING_TOKEN (STR_PXE_BC),              &gEfiPxeBaseCodeProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_PXE_CB),              &gEfiPxeBaseCodeCallbackProtocolGuid,              NULL                                             },\r
+  { STRING_TOKEN (STR_BIS),                 &gEfiBisProtocolGuid,                              NULL                                             },\r
+  { STRING_TOKEN (STR_MNP_SB),              &gEfiManagedNetworkServiceBindingProtocolGuid,     NULL                                             },\r
+  { STRING_TOKEN (STR_MNP),                 &gEfiManagedNetworkProtocolGuid,                   NULL                                             },\r
+  { STRING_TOKEN (STR_ARP_SB),              &gEfiArpServiceBindingProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_ARP),                 &gEfiArpProtocolGuid,                              NULL                                             },\r
+  { STRING_TOKEN (STR_DHCPV4_SB),           &gEfiDhcp4ServiceBindingProtocolGuid,              NULL                                             },\r
+  { STRING_TOKEN (STR_DHCPV4),              &gEfiDhcp4ProtocolGuid,                            NULL                                             },\r
+  { STRING_TOKEN (STR_TCPV4_SB),            &gEfiTcp4ServiceBindingProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_TCPV4),               &gEfiTcp4ProtocolGuid,                             NULL                                             },\r
+  { STRING_TOKEN (STR_IPV4_SB),             &gEfiIp4ServiceBindingProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_IPV4),                &gEfiIp4ProtocolGuid,                              NULL                                             },\r
+  { STRING_TOKEN (STR_IPV4_CFG),            &gEfiIp4ConfigProtocolGuid,                        NULL                                             },\r
+  { STRING_TOKEN (STR_IPV4_CFG2),           &gEfiIp4Config2ProtocolGuid,                       NULL                                             },\r
+  { STRING_TOKEN (STR_UDPV4_SB),            &gEfiUdp4ServiceBindingProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_UDPV4),               &gEfiUdp4ProtocolGuid,                             NULL                                             },\r
+  { STRING_TOKEN (STR_MTFTPV4_SB),          &gEfiMtftp4ServiceBindingProtocolGuid,             NULL                                             },\r
+  { STRING_TOKEN (STR_MTFTPV4),             &gEfiMtftp4ProtocolGuid,                           NULL                                             },\r
+  { STRING_TOKEN (STR_AUTH_INFO),           &gEfiAuthenticationInfoProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_HASH_SB),             &gEfiHashServiceBindingProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_HASH),                &gEfiHashProtocolGuid,                             NULL                                             },\r
+  { STRING_TOKEN (STR_HII_FONT),            &gEfiHiiFontProtocolGuid,                          NULL                                             },\r
+  { STRING_TOKEN (STR_HII_STRING),          &gEfiHiiStringProtocolGuid,                        NULL                                             },\r
+  { STRING_TOKEN (STR_HII_IMAGE),           &gEfiHiiImageProtocolGuid,                         NULL                                             },\r
+  { STRING_TOKEN (STR_HII_DATABASE),        &gEfiHiiDatabaseProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_HII_CONFIG_ROUT),     &gEfiHiiConfigRoutingProtocolGuid,                 NULL                                             },\r
+  { STRING_TOKEN (STR_HII_CONFIG_ACC),      &gEfiHiiConfigAccessProtocolGuid,                  NULL                                             },\r
+  { STRING_TOKEN (STR_HII_FORM_BROWSER2),   &gEfiFormBrowser2ProtocolGuid,                     NULL                                             },\r
+  { STRING_TOKEN (STR_DRIVER_FAM_OVERRIDE), &gEfiDriverFamilyOverrideProtocolGuid,             NULL                                             },\r
+  { STRING_TOKEN (STR_PCD),                 &gPcdProtocolGuid,                                 NULL                                             },\r
+  { STRING_TOKEN (STR_TCG),                 &gEfiTcgProtocolGuid,                              NULL                                             },\r
+  { STRING_TOKEN (STR_HII_PACKAGE_LIST),    &gEfiHiiPackageListProtocolGuid,                   NULL                                             },\r
 \r
-//\r
-// the ones under this are deprecated by the current UEFI Spec, but may be found anyways...\r
-//\r
-  {STRING_TOKEN(STR_SHELL_INTERFACE),       &gEfiShellInterfaceGuid,                          NULL},\r
-  {STRING_TOKEN(STR_SHELL_ENV2),            &gEfiShellEnvironment2Guid,                       NULL},\r
-  {STRING_TOKEN(STR_SHELL_ENV),             &gEfiShellEnvironment2Guid,                       NULL},\r
-  {STRING_TOKEN(STR_DEVICE_IO),             &gEfiDeviceIoProtocolGuid,                        NULL},\r
-  {STRING_TOKEN(STR_UGA_DRAW),              &gEfiUgaDrawProtocolGuid,                         NULL},\r
-  {STRING_TOKEN(STR_UGA_IO),                &gEfiUgaIoProtocolGuid,                           NULL},\r
-  {STRING_TOKEN(STR_ESP),                   &gEfiPartTypeSystemPartGuid,                      NULL},\r
-  {STRING_TOKEN(STR_GPT_NBR),               &gEfiPartTypeLegacyMbrGuid,                       NULL},\r
-  {STRING_TOKEN(STR_DRIVER_CONFIG),         &gEfiDriverConfigurationProtocolGuid,             NULL},\r
-  {STRING_TOKEN(STR_DRIVER_CONFIG2),        &gEfiDriverConfiguration2ProtocolGuid,            NULL},\r
+  //\r
+  // the ones under this are deprecated by the current UEFI Spec, but may be found anyways...\r
+  //\r
+  { STRING_TOKEN (STR_SHELL_INTERFACE),     &gEfiShellInterfaceGuid,                           NULL                                             },\r
+  { STRING_TOKEN (STR_SHELL_ENV2),          &gEfiShellEnvironment2Guid,                        NULL                                             },\r
+  { STRING_TOKEN (STR_SHELL_ENV),           &gEfiShellEnvironment2Guid,                        NULL                                             },\r
+  { STRING_TOKEN (STR_DEVICE_IO),           &gEfiDeviceIoProtocolGuid,                         NULL                                             },\r
+  { STRING_TOKEN (STR_UGA_DRAW),            &gEfiUgaDrawProtocolGuid,                          NULL                                             },\r
+  { STRING_TOKEN (STR_UGA_IO),              &gEfiUgaIoProtocolGuid,                            NULL                                             },\r
+  { STRING_TOKEN (STR_ESP),                 &gEfiPartTypeSystemPartGuid,                       NULL                                             },\r
+  { STRING_TOKEN (STR_GPT_NBR),             &gEfiPartTypeLegacyMbrGuid,                        NULL                                             },\r
+  { STRING_TOKEN (STR_DRIVER_CONFIG),       &gEfiDriverConfigurationProtocolGuid,              NULL                                             },\r
+  { STRING_TOKEN (STR_DRIVER_CONFIG2),      &gEfiDriverConfiguration2ProtocolGuid,             NULL                                             },\r
 \r
-//\r
-// the ones under this are GUID identified structs, not protocols\r
-//\r
-  {STRING_TOKEN(STR_FILE_INFO),             &gEfiFileInfoGuid,                                NULL},\r
-  {STRING_TOKEN(STR_FILE_SYS_INFO),         &gEfiFileSystemInfoGuid,                          NULL},\r
+  //\r
+  // these are using local (non-global) definitions to reduce package dependancy.\r
+  //\r
+  { STRING_TOKEN (STR_ISA_IO),              (EFI_GUID *)&EfiIsaIoProtocolGuid,                 NULL                                             },\r
+  { STRING_TOKEN (STR_ISA_ACPI),            (EFI_GUID *)&EfiIsaAcpiProtocolGuid,               NULL                                             },\r
 \r
-//\r
-// the ones under this are misc GUIDS.\r
-//\r
-  {STRING_TOKEN(STR_EFI_GLOBAL_VARIABLE),   &gEfiGlobalVariableGuid,                          NULL},\r
+  //\r
+  // the ones under this are GUID identified structs, not protocols\r
+  //\r
+  { STRING_TOKEN (STR_FILE_INFO),           &gEfiFileInfoGuid,                                 NULL                                             },\r
+  { STRING_TOKEN (STR_FILE_SYS_INFO),       &gEfiFileSystemInfoGuid,                           NULL                                             },\r
 \r
-//\r
-// UEFI 2.2\r
-//\r
-  {STRING_TOKEN(STR_IP6_SB),                &gEfiIp6ServiceBindingProtocolGuid,               NULL},\r
-  {STRING_TOKEN(STR_IP6),                   &gEfiIp6ProtocolGuid,                             NULL},\r
-  {STRING_TOKEN(STR_IP6_CONFIG),            &gEfiIp6ConfigProtocolGuid,                       NULL},\r
-  {STRING_TOKEN(STR_MTFTP6_SB),             &gEfiMtftp6ServiceBindingProtocolGuid,            NULL},\r
-  {STRING_TOKEN(STR_MTFTP6),                &gEfiMtftp6ProtocolGuid,                          NULL},\r
-  {STRING_TOKEN(STR_DHCP6_SB),              &gEfiDhcp6ServiceBindingProtocolGuid,             NULL},\r
-  {STRING_TOKEN(STR_DHCP6),                 &gEfiDhcp6ProtocolGuid,                           NULL},\r
-  {STRING_TOKEN(STR_UDP6_SB),               &gEfiUdp6ServiceBindingProtocolGuid,              NULL},\r
-  {STRING_TOKEN(STR_UDP6),                  &gEfiUdp6ProtocolGuid,                            NULL},\r
-  {STRING_TOKEN(STR_TCP6_SB),               &gEfiTcp6ServiceBindingProtocolGuid,              NULL},\r
-  {STRING_TOKEN(STR_TCP6),                  &gEfiTcp6ProtocolGuid,                            NULL},\r
-  {STRING_TOKEN(STR_VLAN_CONFIG),           &gEfiVlanConfigProtocolGuid,                      NULL},\r
-  {STRING_TOKEN(STR_EAP),                   &gEfiEapProtocolGuid,                             NULL},\r
-  {STRING_TOKEN(STR_EAP_MGMT),              &gEfiEapManagementProtocolGuid,                   NULL},\r
-  {STRING_TOKEN(STR_FTP4_SB),               &gEfiFtp4ServiceBindingProtocolGuid,              NULL},\r
-  {STRING_TOKEN(STR_FTP4),                  &gEfiFtp4ProtocolGuid,                            NULL},\r
-  {STRING_TOKEN(STR_IP_SEC_CONFIG),         &gEfiIpSecConfigProtocolGuid,                     NULL},\r
-  {STRING_TOKEN(STR_DH),                    &gEfiDriverHealthProtocolGuid,                    NULL},\r
-  {STRING_TOKEN(STR_DEF_IMG_LOAD),          &gEfiDeferredImageLoadProtocolGuid,               NULL},\r
-  {STRING_TOKEN(STR_USER_CRED),             &gEfiUserCredentialProtocolGuid,                  NULL},\r
-  {STRING_TOKEN(STR_USER_MNGR),             &gEfiUserManagerProtocolGuid,                     NULL},\r
-  {STRING_TOKEN(STR_ATA_PASS_THRU),         &gEfiAtaPassThruProtocolGuid,                     NULL},\r
+  //\r
+  // the ones under this are misc GUIDS.\r
+  //\r
+  { STRING_TOKEN (STR_EFI_GLOBAL_VARIABLE), &gEfiGlobalVariableGuid,                           NULL                                             },\r
 \r
-//\r
-// UEFI 2.3\r
-//\r
-  {STRING_TOKEN(STR_FW_MGMT),               &gEfiFirmwareManagementProtocolGuid,              NULL},\r
-  {STRING_TOKEN(STR_IP_SEC),                &gEfiIpSecProtocolGuid,                           NULL},\r
-  {STRING_TOKEN(STR_IP_SEC2),               &gEfiIpSec2ProtocolGuid,                          NULL},\r
+  //\r
+  // UEFI 2.2\r
+  //\r
+  { STRING_TOKEN (STR_IP6_SB),              &gEfiIp6ServiceBindingProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_IP6),                 &gEfiIp6ProtocolGuid,                              NULL                                             },\r
+  { STRING_TOKEN (STR_IP6_CONFIG),          &gEfiIp6ConfigProtocolGuid,                        NULL                                             },\r
+  { STRING_TOKEN (STR_MTFTP6_SB),           &gEfiMtftp6ServiceBindingProtocolGuid,             NULL                                             },\r
+  { STRING_TOKEN (STR_MTFTP6),              &gEfiMtftp6ProtocolGuid,                           NULL                                             },\r
+  { STRING_TOKEN (STR_DHCP6_SB),            &gEfiDhcp6ServiceBindingProtocolGuid,              NULL                                             },\r
+  { STRING_TOKEN (STR_DHCP6),               &gEfiDhcp6ProtocolGuid,                            NULL                                             },\r
+  { STRING_TOKEN (STR_UDP6_SB),             &gEfiUdp6ServiceBindingProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_UDP6),                &gEfiUdp6ProtocolGuid,                             NULL                                             },\r
+  { STRING_TOKEN (STR_TCP6_SB),             &gEfiTcp6ServiceBindingProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_TCP6),                &gEfiTcp6ProtocolGuid,                             NULL                                             },\r
+  { STRING_TOKEN (STR_VLAN_CONFIG),         &gEfiVlanConfigProtocolGuid,                       NULL                                             },\r
+  { STRING_TOKEN (STR_EAP),                 &gEfiEapProtocolGuid,                              NULL                                             },\r
+  { STRING_TOKEN (STR_EAP_MGMT),            &gEfiEapManagementProtocolGuid,                    NULL                                             },\r
+  { STRING_TOKEN (STR_FTP4_SB),             &gEfiFtp4ServiceBindingProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_FTP4),                &gEfiFtp4ProtocolGuid,                             NULL                                             },\r
+  { STRING_TOKEN (STR_IP_SEC_CONFIG),       &gEfiIpSecConfigProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_DH),                  &gEfiDriverHealthProtocolGuid,                     NULL                                             },\r
+  { STRING_TOKEN (STR_DEF_IMG_LOAD),        &gEfiDeferredImageLoadProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_USER_CRED),           &gEfiUserCredentialProtocolGuid,                   NULL                                             },\r
+  { STRING_TOKEN (STR_USER_MNGR),           &gEfiUserManagerProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_ATA_PASS_THRU),       &gEfiAtaPassThruProtocolGuid,                      NULL                                             },\r
 \r
-//\r
-// UEFI 2.3.1\r
-//\r
-  {STRING_TOKEN(STR_KMS),                   &gEfiKmsProtocolGuid,                             NULL},\r
-  {STRING_TOKEN(STR_BLK_IO2),               &gEfiBlockIo2ProtocolGuid,                        NULL},\r
-  {STRING_TOKEN(STR_SSC),                   &gEfiStorageSecurityCommandProtocolGuid,          NULL},\r
-  {STRING_TOKEN(STR_UCRED2),                &gEfiUserCredential2ProtocolGuid,                 NULL},\r
+  //\r
+  // UEFI 2.3\r
+  //\r
+  { STRING_TOKEN (STR_FW_MGMT),             &gEfiFirmwareManagementProtocolGuid,               FirmwareManagementDumpInformation                },\r
+  { STRING_TOKEN (STR_IP_SEC),              &gEfiIpSecProtocolGuid,                            NULL                                             },\r
+  { STRING_TOKEN (STR_IP_SEC2),             &gEfiIpSec2ProtocolGuid,                           NULL                                             },\r
 \r
-//\r
-// UEFI 2.4\r
-//\r
-  {STRING_TOKEN(STR_DISK_IO2),              &gEfiDiskIo2ProtocolGuid,                         NULL},\r
-  {STRING_TOKEN(STR_ADAPTER_INFO),          &gEfiAdapterInformationProtocolGuid,              NULL},\r
+  //\r
+  // UEFI 2.3.1\r
+  //\r
+  { STRING_TOKEN (STR_KMS),                 &gEfiKmsProtocolGuid,                              NULL                                             },\r
+  { STRING_TOKEN (STR_BLK_IO2),             &gEfiBlockIo2ProtocolGuid,                         NULL                                             },\r
+  { STRING_TOKEN (STR_SSC),                 &gEfiStorageSecurityCommandProtocolGuid,           NULL                                             },\r
+  { STRING_TOKEN (STR_UCRED2),              &gEfiUserCredential2ProtocolGuid,                  NULL                                             },\r
 \r
-//\r
-// PI Spec ones\r
-//\r
-  {STRING_TOKEN(STR_IDE_CONT_INIT),         &gEfiIdeControllerInitProtocolGuid,               NULL},\r
+  //\r
+  // UEFI 2.4\r
+  //\r
+  { STRING_TOKEN (STR_DISK_IO2),            &gEfiDiskIo2ProtocolGuid,                          NULL                                             },\r
+  { STRING_TOKEN (STR_ADAPTER_INFO),        &gEfiAdapterInformationProtocolGuid,               AdapterInformationDumpInformation                },\r
 \r
-//\r
-// UEFI Shell Spec 2.0\r
-//\r
-  {STRING_TOKEN(STR_SHELL_PARAMETERS),      &gEfiShellParametersProtocolGuid,                 NULL},\r
-  {STRING_TOKEN(STR_SHELL),                 &gEfiShellProtocolGuid,                           NULL},\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
-// UEFI Shell Spec 2.1\r
-//\r
-  {STRING_TOKEN(STR_SHELL_DYNAMIC),         &gEfiShellDynamicCommandProtocolGuid,             NULL},\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
-// terminator\r
-//\r
-  {STRING_TOKEN(STR_UNKNOWN_DEVICE),        NULL,                                             NULL},\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
+  // UEFI 2.8\r
+  //\r
+  { STRING_TOKEN (STR_REST_EX),             &gEfiRestExProtocolGuid,                           NULL                                             },\r
+  { STRING_TOKEN (STR_REDFISH_DISCOVER),    &gEfiRedfishDiscoverProtocolGuid,                  NULL                                             },\r
+\r
+  //\r
+  // PI Spec ones\r
+  //\r
+  { STRING_TOKEN (STR_IDE_CONT_INIT),       &gEfiIdeControllerInitProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_DISK_INFO),           &gEfiDiskInfoProtocolGuid,                         NULL                                             },\r
+\r
+  //\r
+  // PI Spec 1.0\r
+  //\r
+  { STRING_TOKEN (STR_BDS_ARCH),            &gEfiBdsArchProtocolGuid,                          NULL                                             },\r
+  { STRING_TOKEN (STR_CPU_ARCH),            &gEfiCpuArchProtocolGuid,                          NULL                                             },\r
+  { STRING_TOKEN (STR_MET_ARCH),            &gEfiMetronomeArchProtocolGuid,                    NULL                                             },\r
+  { STRING_TOKEN (STR_MON_ARCH),            &gEfiMonotonicCounterArchProtocolGuid,             NULL                                             },\r
+  { STRING_TOKEN (STR_RTC_ARCH),            &gEfiRealTimeClockArchProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_RESET_ARCH),          &gEfiResetArchProtocolGuid,                        NULL                                             },\r
+  { STRING_TOKEN (STR_RT_ARCH),             &gEfiRuntimeArchProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_SEC_ARCH),            &gEfiSecurityArchProtocolGuid,                     NULL                                             },\r
+  { STRING_TOKEN (STR_TIMER_ARCH),          &gEfiTimerArchProtocolGuid,                        NULL                                             },\r
+  { STRING_TOKEN (STR_VAR_ARCH),            &gEfiVariableWriteArchProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_V_ARCH),              &gEfiVariableArchProtocolGuid,                     NULL                                             },\r
+  { STRING_TOKEN (STR_SECP),                &gEfiSecurityPolicyProtocolGuid,                   NULL                                             },\r
+  { STRING_TOKEN (STR_WDT_ARCH),            &gEfiWatchdogTimerArchProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_SCR),                 &gEfiStatusCodeRuntimeProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_SMB_HC),              &gEfiSmbusHcProtocolGuid,                          NULL                                             },\r
+  { STRING_TOKEN (STR_FV_2),                &gEfiFirmwareVolume2ProtocolGuid,                  NULL                                             },\r
+  { STRING_TOKEN (STR_FV_BLOCK),            &gEfiFirmwareVolumeBlockProtocolGuid,              NULL                                             },\r
+  { STRING_TOKEN (STR_CAP_ARCH),            &gEfiCapsuleArchProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_MP_SERVICE),          &gEfiMpServiceProtocolGuid,                        NULL                                             },\r
+  { STRING_TOKEN (STR_HBRAP),               &gEfiPciHostBridgeResourceAllocationProtocolGuid,  NULL                                             },\r
+  { STRING_TOKEN (STR_PCIP),                &gEfiPciPlatformProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_PCIO),                &gEfiPciOverrideProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_PCIE),                &gEfiPciEnumerationCompleteProtocolGuid,           NULL                                             },\r
+  { STRING_TOKEN (STR_IPCID),               &gEfiIncompatiblePciDeviceSupportProtocolGuid,     NULL                                             },\r
+  { STRING_TOKEN (STR_PCIHPI),              &gEfiPciHotPlugInitProtocolGuid,                   NULL                                             },\r
+  { STRING_TOKEN (STR_PCIHPR),              &gEfiPciHotPlugRequestProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_SMBIOS),              &gEfiSmbiosProtocolGuid,                           NULL                                             },\r
+  { STRING_TOKEN (STR_S3_SAVE),             &gEfiS3SaveStateProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_S3_S_SMM),            &gEfiS3SmmSaveStateProtocolGuid,                   NULL                                             },\r
+  { STRING_TOKEN (STR_RSC),                 &gEfiRscHandlerProtocolGuid,                       NULL                                             },\r
+  { STRING_TOKEN (STR_S_RSC),               &gEfiSmmRscHandlerProtocolGuid,                    NULL                                             },\r
+  { STRING_TOKEN (STR_ACPI_SDT),            &gEfiAcpiSdtProtocolGuid,                          NULL                                             },\r
+  { STRING_TOKEN (STR_SIO),                 &gEfiSioProtocolGuid,                              NULL                                             },\r
+  { STRING_TOKEN (STR_S_CPU2),              &gEfiSmmCpuIo2ProtocolGuid,                        NULL                                             },\r
+  { STRING_TOKEN (STR_S_BASE2),             &gEfiSmmBase2ProtocolGuid,                         NULL                                             },\r
+  { STRING_TOKEN (STR_S_ACC_2),             &gEfiSmmAccess2ProtocolGuid,                       NULL                                             },\r
+  { STRING_TOKEN (STR_S_CON_2),             &gEfiSmmControl2ProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_S_CONFIG),            &gEfiSmmConfigurationProtocolGuid,                 NULL                                             },\r
+  { STRING_TOKEN (STR_S_RTL),               &gEfiSmmReadyToLockProtocolGuid,                   NULL                                             },\r
+  { STRING_TOKEN (STR_DS_RTL),              &gEfiDxeSmmReadyToLockProtocolGuid,                NULL                                             },\r
+  { 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),           &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
+  { STRING_TOKEN (STR_S_UD2),               &gEfiSmmUsbDispatch2ProtocolGuid,                  NULL                                             },\r
+  { STRING_TOKEN (STR_S_GD2),               &gEfiSmmGpiDispatch2ProtocolGuid,                  NULL                                             },\r
+  { STRING_TOKEN (STR_S_SBD2),              &gEfiSmmStandbyButtonDispatch2ProtocolGuid,        NULL                                             },\r
+  { STRING_TOKEN (STR_S_PBD2),              &gEfiSmmPowerButtonDispatch2ProtocolGuid,          NULL                                             },\r
+  { STRING_TOKEN (STR_S_ITD2),              &gEfiSmmIoTrapDispatch2ProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_PCD),                 &gEfiPcdProtocolGuid,                              NULL                                             },\r
+  { 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_S2ARCH),              &gEfiSecurity2ArchProtocolGuid,                    NULL                                             },\r
+  { STRING_TOKEN (STR_EODXE),               &gEfiSmmEndOfDxeProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_ISAHC),               &gEfiIsaHcProtocolGuid,                            NULL                                             },\r
+  { STRING_TOKEN (STR_ISAHC_B),             &gEfiIsaHcServiceBindingProtocolGuid,              NULL                                             },\r
+  { STRING_TOKEN (STR_SIO_C),               &gEfiSioControlProtocolGuid,                       NULL                                             },\r
+  { STRING_TOKEN (STR_GET_PCD),             &gEfiGetPcdInfoProtocolGuid,                       NULL                                             },\r
+  { STRING_TOKEN (STR_I2C_M),               &gEfiI2cMasterProtocolGuid,                        NULL                                             },\r
+  { STRING_TOKEN (STR_I2CIO),               &gEfiI2cIoProtocolGuid,                            NULL                                             },\r
+  { 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_TCG2),                &gEfiTcg2ProtocolGuid,                             NULL                                             },\r
+  { STRING_TOKEN (STR_TIMESTAMP),           &gEfiTimestampProtocolGuid,                        NULL                                             },\r
+  { STRING_TOKEN (STR_RNG),                 &gEfiRngProtocolGuid,                              NULL                                             },\r
+  { STRING_TOKEN (STR_NVMEPT),              &gEfiNvmExpressPassThruProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_H2_SB),               &gEfiHash2ServiceBindingProtocolGuid,              NULL                                             },\r
+  { STRING_TOKEN (STR_HASH2),               &gEfiHash2ProtocolGuid,                            NULL                                             },\r
+  { STRING_TOKEN (STR_BIO_C),               &gEfiBlockIoCryptoProtocolGuid,                    NULL                                             },\r
+  { STRING_TOKEN (STR_SCR),                 &gEfiSmartCardReaderProtocolGuid,                  NULL                                             },\r
+  { STRING_TOKEN (STR_SCE),                 &gEfiSmartCardEdgeProtocolGuid,                    NULL                                             },\r
+  { STRING_TOKEN (STR_USB_FIO),             &gEfiUsbFunctionIoProtocolGuid,                    NULL                                             },\r
+  { STRING_TOKEN (STR_BC_HC),               &gEfiBluetoothHcProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_BC_IO_SB),            &gEfiBluetoothIoServiceBindingProtocolGuid,        NULL                                             },\r
+  { STRING_TOKEN (STR_BC_IO),               &gEfiBluetoothIoProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_BC_C),                &gEfiBluetoothConfigProtocolGuid,                  NULL                                             },\r
+  { STRING_TOKEN (STR_REG_EXP),             &gEfiRegularExpressionProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_B_MGR_P),             &gEfiBootManagerPolicyProtocolGuid,                NULL                                             },\r
+  { STRING_TOKEN (STR_CKH),                 &gEfiConfigKeywordHandlerProtocolGuid,             NULL                                             },\r
+  { STRING_TOKEN (STR_WIFI),                &gEfiWiFiProtocolGuid,                             NULL                                             },\r
+  { STRING_TOKEN (STR_EAP_M),               &gEfiEapManagement2ProtocolGuid,                   NULL                                             },\r
+  { STRING_TOKEN (STR_EAP_C),               &gEfiEapConfigurationProtocolGuid,                 NULL                                             },\r
+  { STRING_TOKEN (STR_PKCS7),               &gEfiPkcs7VerifyProtocolGuid,                      NULL                                             },\r
+  { STRING_TOKEN (STR_NET_DNS4_SB),         &gEfiDns4ServiceBindingProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_NET_DNS4),            &gEfiDns4ProtocolGuid,                             NULL                                             },\r
+  { STRING_TOKEN (STR_NET_DNS6_SB),         &gEfiDns6ServiceBindingProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_NET_DNS6),            &gEfiDns6ProtocolGuid,                             NULL                                             },\r
+  { STRING_TOKEN (STR_NET_HTTP_SB),         &gEfiHttpServiceBindingProtocolGuid,               NULL                                             },\r
+  { STRING_TOKEN (STR_NET_HTTP),            &gEfiHttpProtocolGuid,                             NULL                                             },\r
+  { 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
+  { STRING_TOKEN (STR_SHELL_PARAMETERS),    &gEfiShellParametersProtocolGuid,                  NULL                                             },\r
+  { STRING_TOKEN (STR_SHELL),               &gEfiShellProtocolGuid,                            NULL                                             },\r
+\r
+  //\r
+  // UEFI Shell Spec 2.1\r
+  //\r
+  { STRING_TOKEN (STR_SHELL_DYNAMIC),       &gEfiShellDynamicCommandProtocolGuid,              NULL                                             },\r
+\r
+  //\r
+  // Misc\r
+  //\r
+  { STRING_TOKEN (STR_PCDINFOPROT),         &gGetPcdInfoProtocolGuid,                          NULL                                             },\r
+\r
+  //\r
+  // terminator\r
+  //\r
+  { 0,                                      NULL,                                              NULL                                             },\r
 };\r
 \r
 /**\r
@@ -804,34 +2509,35 @@ STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   @return                       The node.\r
 **/\r
 CONST GUID_INFO_BLOCK *\r
-EFIAPI\r
-InternalShellGetNodeFromGuid(\r
-  IN CONST EFI_GUID* Guid\r
+InternalShellGetNodeFromGuid (\r
+  IN CONST EFI_GUID  *Guid\r
   )\r
 {\r
-  CONST GUID_INFO_BLOCK *ListWalker;\r
-  UINTN                 LoopCount;\r
+  CONST GUID_INFO_BLOCK  *ListWalker;\r
+  UINTN                  LoopCount;\r
 \r
-  ASSERT(Guid != NULL);\r
+  ASSERT (Guid != NULL);\r
 \r
-  for (LoopCount = 0, ListWalker = GuidList; GuidList != NULL && LoopCount < GuidListCount; LoopCount++, ListWalker++) {\r
-    if (CompareGuid(ListWalker->GuidId, Guid)) {\r
+  for (LoopCount = 0, ListWalker = mGuidList; mGuidList != NULL && LoopCount < mGuidListCount; LoopCount++, ListWalker++) {\r
+    if (CompareGuid (ListWalker->GuidId, Guid)) {\r
       return (ListWalker);\r
     }\r
   }\r
 \r
-  if (PcdGetBool(PcdShellIncludeNtGuids)) {\r
-    for (ListWalker = mGuidStringListNT ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
-      if (CompareGuid(ListWalker->GuidId, Guid)) {\r
+  if (PcdGetBool (PcdShellIncludeNtGuids)) {\r
+    for (ListWalker = mGuidStringListNT; ListWalker != NULL && ListWalker->GuidId != NULL; ListWalker++) {\r
+      if (CompareGuid (ListWalker->GuidId, Guid)) {\r
         return (ListWalker);\r
       }\r
     }\r
   }\r
-  for (ListWalker = mGuidStringList ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
-    if (CompareGuid(ListWalker->GuidId, Guid)) {\r
+\r
+  for (ListWalker = mGuidStringList; ListWalker != NULL && ListWalker->GuidId != NULL; ListWalker++) {\r
+    if (CompareGuid (ListWalker->GuidId, Guid)) {\r
       return (ListWalker);\r
     }\r
   }\r
+\r
   return (NULL);\r
 }\r
 \r
@@ -848,28 +2554,32 @@ Function to add a new GUID/Name mapping.
 @retval EFI_INVALID_PARAMETER Guid NameId was invalid\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
-InsertNewGuidNameMapping(\r
-  IN CONST EFI_GUID           *Guid,\r
-  IN CONST EFI_STRING_ID      NameID,\r
-  IN CONST DUMP_PROTOCOL_INFO DumpFunc OPTIONAL\r
+InsertNewGuidNameMapping (\r
+  IN CONST EFI_GUID            *Guid,\r
+  IN CONST EFI_STRING_ID       NameID,\r
+  IN CONST DUMP_PROTOCOL_INFO  DumpFunc OPTIONAL\r
   )\r
 {\r
-  ASSERT(Guid   != NULL);\r
-  ASSERT(NameID != 0);\r
-\r
-  GuidList = ReallocatePool(GuidListCount * sizeof(GUID_INFO_BLOCK), GuidListCount+1 * sizeof(GUID_INFO_BLOCK), GuidList);\r
-  if (GuidList == NULL) {\r
-    GuidListCount = 0;\r
+  ASSERT (Guid   != NULL);\r
+  ASSERT (NameID != 0);\r
+\r
+  mGuidList = ReallocatePool (\r
+                mGuidListCount * sizeof (GUID_INFO_BLOCK),\r
+                (mGuidListCount + 1) * sizeof (GUID_INFO_BLOCK),\r
+                mGuidList\r
+                );\r
+  if (mGuidList == NULL) {\r
+    mGuidListCount = 0;\r
     return (EFI_OUT_OF_RESOURCES);\r
   }\r
-  GuidListCount++;\r
 \r
-  GuidList[GuidListCount - 1].GuidId   = AllocateCopyPool(sizeof(EFI_GUID), Guid);\r
-  GuidList[GuidListCount - 1].StringId = NameID;\r
-  GuidList[GuidListCount - 1].DumpInfo = DumpFunc;\r
+  mGuidListCount++;\r
+\r
+  mGuidList[mGuidListCount - 1].GuidId   = AllocateCopyPool (sizeof (EFI_GUID), Guid);\r
+  mGuidList[mGuidListCount - 1].StringId = NameID;\r
+  mGuidList[mGuidListCount - 1].DumpInfo = DumpFunc;\r
 \r
-  if (GuidList[GuidListCount - 1].GuidId == NULL) {\r
+  if (mGuidList[mGuidListCount - 1].GuidId == NULL) {\r
     return (EFI_OUT_OF_RESOURCES);\r
   }\r
 \r
@@ -892,31 +2602,30 @@ InsertNewGuidNameMapping(
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-AddNewGuidNameMapping(\r
-  IN CONST EFI_GUID *Guid,\r
-  IN CONST CHAR16   *TheName,\r
-  IN CONST CHAR8    *Lang OPTIONAL\r
+AddNewGuidNameMapping (\r
+  IN CONST EFI_GUID  *Guid,\r
+  IN CONST CHAR16    *TheName,\r
+  IN CONST CHAR8     *Lang OPTIONAL\r
   )\r
 {\r
-  CONST GUID_INFO_BLOCK *Temp;\r
-  EFI_STRING_ID         NameID;\r
+  EFI_STRING_ID  NameID;\r
 \r
-  HandleParsingHiiInit();\r
+  HandleParsingHiiInit ();\r
 \r
-  if (Guid == NULL || TheName == NULL){\r
+  if ((Guid == NULL) || (TheName == NULL)) {\r
     return (EFI_INVALID_PARAMETER);\r
   }\r
 \r
-  if ((Temp = InternalShellGetNodeFromGuid(Guid)) != NULL) {\r
+  if ((InternalShellGetNodeFromGuid (Guid)) != NULL) {\r
     return (EFI_ACCESS_DENIED);\r
   }\r
 \r
-  NameID = HiiSetString(mHandleParsingHiiHandle, 0, (CHAR16*)TheName, Lang);\r
+  NameID = HiiSetString (mHandleParsingHiiHandle, 0, (CHAR16 *)TheName, Lang);\r
   if (NameID == 0) {\r
     return (EFI_OUT_OF_RESOURCES);\r
   }\r
 \r
-  return (InsertNewGuidNameMapping(Guid, NameID, NULL));\r
+  return (InsertNewGuidNameMapping (Guid, NameID, NULL));\r
 }\r
 \r
 /**\r
@@ -930,19 +2639,23 @@ AddNewGuidNameMapping(
   @return                       pointer to string of the name.  The caller\r
                                 is responsible to free this memory.\r
 **/\r
-CHAR16*\r
+CHAR16 *\r
 EFIAPI\r
-GetStringNameFromGuid(\r
-  IN CONST EFI_GUID *Guid,\r
-  IN CONST CHAR8    *Lang OPTIONAL\r
+GetStringNameFromGuid (\r
+  IN CONST EFI_GUID  *Guid,\r
+  IN CONST CHAR8     *Lang OPTIONAL\r
   )\r
 {\r
-  CONST GUID_INFO_BLOCK *Id;\r
+  CONST GUID_INFO_BLOCK  *Id;\r
 \r
-  HandleParsingHiiInit();\r
+  HandleParsingHiiInit ();\r
 \r
-  Id = InternalShellGetNodeFromGuid(Guid);\r
-  return (HiiGetString(mHandleParsingHiiHandle, Id==NULL?STRING_TOKEN(STR_UNKNOWN_DEVICE):Id->StringId, Lang));\r
+  Id = InternalShellGetNodeFromGuid (Guid);\r
+  if (Id == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  return HiiGetString (mHandleParsingHiiHandle, Id->StringId, Lang);\r
 }\r
 \r
 /**\r
@@ -961,27 +2674,28 @@ GetStringNameFromGuid(
   @return                   The pointer to string.\r
   @retval NULL              An error was encountered.\r
 **/\r
-CHAR16*\r
+CHAR16 *\r
 EFIAPI\r
-GetProtocolInformationDump(\r
-  IN CONST EFI_HANDLE TheHandle,\r
-  IN CONST EFI_GUID   *Guid,\r
-  IN CONST BOOLEAN    Verbose\r
+GetProtocolInformationDump (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST EFI_GUID    *Guid,\r
+  IN CONST BOOLEAN     Verbose\r
   )\r
 {\r
-  CONST GUID_INFO_BLOCK *Id;\r
+  CONST GUID_INFO_BLOCK  *Id;\r
 \r
-  ASSERT(TheHandle  != NULL);\r
-  ASSERT(Guid       != NULL);\r
+  ASSERT (TheHandle  != NULL);\r
+  ASSERT (Guid       != NULL);\r
 \r
-  if (TheHandle == NULL || Guid == NULL) {\r
+  if ((TheHandle == NULL) || (Guid == NULL)) {\r
     return (NULL);\r
   }\r
 \r
-  Id = InternalShellGetNodeFromGuid(Guid);\r
-  if (Id != NULL && Id->DumpInfo != NULL) {\r
-    return (Id->DumpInfo(TheHandle, Verbose));\r
+  Id = InternalShellGetNodeFromGuid (Guid);\r
+  if ((Id != NULL) && (Id->DumpInfo != NULL)) {\r
+    return (Id->DumpInfo (TheHandle, Verbose));\r
   }\r
+\r
   return (NULL);\r
 }\r
 \r
@@ -998,53 +2712,58 @@ GetProtocolInformationDump(
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-GetGuidFromStringName(\r
-  IN CONST CHAR16 *Name,\r
-  IN CONST CHAR8  *Lang OPTIONAL,\r
-  OUT EFI_GUID    **Guid\r
+GetGuidFromStringName (\r
+  IN CONST CHAR16  *Name,\r
+  IN CONST CHAR8   *Lang OPTIONAL,\r
+  OUT EFI_GUID     **Guid\r
   )\r
 {\r
   CONST GUID_INFO_BLOCK  *ListWalker;\r
-  CHAR16                     *String;\r
+  CHAR16                 *String;\r
   UINTN                  LoopCount;\r
 \r
-  HandleParsingHiiInit();\r
+  HandleParsingHiiInit ();\r
 \r
-  ASSERT(Guid != NULL);\r
+  ASSERT (Guid != NULL);\r
   if (Guid == NULL) {\r
     return (EFI_INVALID_PARAMETER);\r
   }\r
+\r
   *Guid = NULL;\r
 \r
-  if (PcdGetBool(PcdShellIncludeNtGuids)) {\r
-    for (ListWalker = mGuidStringListNT ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
-      String = HiiGetString(mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
-      if (Name != NULL && String != NULL && StringNoCaseCompare (&Name, &String) == 0) {\r
+  if (PcdGetBool (PcdShellIncludeNtGuids)) {\r
+    for (ListWalker = mGuidStringListNT; ListWalker != NULL && ListWalker->GuidId != NULL; ListWalker++) {\r
+      String = HiiGetString (mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
+      if ((Name != NULL) && (String != NULL) && (StringNoCaseCompare (&Name, &String) == 0)) {\r
         *Guid = ListWalker->GuidId;\r
       }\r
-      SHELL_FREE_NON_NULL(String);\r
+\r
+      SHELL_FREE_NON_NULL (String);\r
       if (*Guid != NULL) {\r
         return (EFI_SUCCESS);\r
       }\r
     }\r
   }\r
-  for (ListWalker = mGuidStringList ; ListWalker != NULL && ListWalker->GuidId != NULL ; ListWalker++) {\r
-    String = HiiGetString(mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
-    if (Name != NULL && String != NULL && StringNoCaseCompare (&Name, &String) == 0) {\r
+\r
+  for (ListWalker = mGuidStringList; ListWalker != NULL && ListWalker->GuidId != NULL; ListWalker++) {\r
+    String = HiiGetString (mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
+    if ((Name != NULL) && (String != NULL) && (StringNoCaseCompare (&Name, &String) == 0)) {\r
       *Guid = ListWalker->GuidId;\r
     }\r
-    SHELL_FREE_NON_NULL(String);\r
+\r
+    SHELL_FREE_NON_NULL (String);\r
     if (*Guid != NULL) {\r
       return (EFI_SUCCESS);\r
     }\r
   }\r
 \r
-  for (LoopCount = 0, ListWalker = GuidList; GuidList != NULL && LoopCount < GuidListCount; LoopCount++, ListWalker++) {\r
-    String = HiiGetString(mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
-    if (Name != NULL && String != NULL && StringNoCaseCompare (&Name, &String) == 0) {\r
+  for (LoopCount = 0, ListWalker = mGuidList; mGuidList != NULL && LoopCount < mGuidListCount; LoopCount++, ListWalker++) {\r
+    String = HiiGetString (mHandleParsingHiiHandle, ListWalker->StringId, Lang);\r
+    if ((Name != NULL) && (String != NULL) && (StringNoCaseCompare (&Name, &String) == 0)) {\r
       *Guid = ListWalker->GuidId;\r
     }\r
-    SHELL_FREE_NON_NULL(String);\r
+\r
+    SHELL_FREE_NON_NULL (String);\r
     if (*Guid != NULL) {\r
       return (EFI_SUCCESS);\r
     }\r
@@ -1055,9 +2774,9 @@ GetGuidFromStringName(
 \r
 /**\r
   Get best support language for this driver.\r
-  \r
-  First base on the user input language  to search, second base on the current \r
-  platform used language to search, third get the first language from the \r
+\r
+  First base on the user input language  to search, second base on the current\r
+  platform used language to search, third get the first language from the\r
   support language list. The caller need to free the buffer of the best language.\r
 \r
   @param[in] SupportedLanguages      The support languages for this driver.\r
@@ -1074,12 +2793,12 @@ GetBestLanguageForDriver (
   IN BOOLEAN      Iso639Language\r
   )\r
 {\r
-  CHAR8                         *LanguageVariable;\r
-  CHAR8                         *BestLanguage;\r
+  CHAR8  *LanguageVariable;\r
+  CHAR8  *BestLanguage;\r
 \r
-  LanguageVariable = GetVariable (Iso639Language ? L"Lang" : L"PlatformLang", &gEfiGlobalVariableGuid);\r
+  GetVariable2 (Iso639Language ? L"Lang" : L"PlatformLang", &gEfiGlobalVariableGuid, (VOID **)&LanguageVariable, NULL);\r
 \r
-  BestLanguage = GetBestLanguage(\r
+  BestLanguage = GetBestLanguage (\r
                    SupportedLanguages,\r
                    Iso639Language,\r
                    (InputLanguage != NULL) ? InputLanguage : "",\r
@@ -1105,11 +2824,11 @@ GetBestLanguageForDriver (
   @retval NULL              The name could not be found.\r
   @return                   A pointer to the string name.  Do not de-allocate the memory.\r
 **/\r
-CONST CHAR16*\r
+CONST CHAR16 *\r
 EFIAPI\r
-GetStringNameFromHandle(\r
-  IN CONST EFI_HANDLE TheHandle,\r
-  IN CONST CHAR8      *Language\r
+GetStringNameFromHandle (\r
+  IN CONST EFI_HANDLE  TheHandle,\r
+  IN CONST CHAR8       *Language\r
   )\r
 {\r
   EFI_COMPONENT_NAME2_PROTOCOL  *CompNameStruct;\r
@@ -1119,41 +2838,47 @@ GetStringNameFromHandle(
 \r
   BestLang = NULL;\r
 \r
-  Status = gBS->OpenProtocol(\r
-    TheHandle,\r
-    &gEfiComponentName2ProtocolGuid,\r
-    (VOID**)&CompNameStruct,\r
-    gImageHandle,\r
-    NULL,\r
-    EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
-  if (!EFI_ERROR(Status)) {\r
+  Status = gBS->OpenProtocol (\r
+                  TheHandle,\r
+                  &gEfiComponentName2ProtocolGuid,\r
+                  (VOID **)&CompNameStruct,\r
+                  gImageHandle,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+  if (!EFI_ERROR (Status)) {\r
     BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, Language, FALSE);\r
-    Status = CompNameStruct->GetDriverName(CompNameStruct, BestLang, &RetVal);\r
+    Status   = CompNameStruct->GetDriverName (CompNameStruct, BestLang, &RetVal);\r
     if (BestLang != NULL) {\r
       FreePool (BestLang);\r
       BestLang = NULL;\r
     }\r
-    if (!EFI_ERROR(Status)) {\r
+\r
+    if (!EFI_ERROR (Status)) {\r
       return (RetVal);\r
     }\r
   }\r
-  Status = gBS->OpenProtocol(\r
-    TheHandle,\r
-    &gEfiComponentNameProtocolGuid,\r
-    (VOID**)&CompNameStruct,\r
-    gImageHandle,\r
-    NULL,\r
-    EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
-  if (!EFI_ERROR(Status)) {\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  TheHandle,\r
+                  &gEfiComponentNameProtocolGuid,\r
+                  (VOID **)&CompNameStruct,\r
+                  gImageHandle,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+  if (!EFI_ERROR (Status)) {\r
     BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, Language, FALSE);\r
-    Status = CompNameStruct->GetDriverName(CompNameStruct, BestLang, &RetVal);\r
+    Status   = CompNameStruct->GetDriverName (CompNameStruct, BestLang, &RetVal);\r
     if (BestLang != NULL) {\r
       FreePool (BestLang);\r
     }\r
-    if (!EFI_ERROR(Status)) {\r
+\r
+    if (!EFI_ERROR (Status)) {\r
       return (RetVal);\r
     }\r
   }\r
+\r
   return (NULL);\r
 }\r
 \r
@@ -1164,8 +2889,7 @@ GetStringNameFromHandle(
   @retval EFI_SUCCESS     The operation was successful.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
-InternalShellInitHandleList(\r
+InternalShellInitHandleList (\r
   VOID\r
   )\r
 {\r
@@ -1177,27 +2901,31 @@ InternalShellInitHandleList(
   if (mHandleList.NextIndex != 0) {\r
     return EFI_SUCCESS;\r
   }\r
-  InitializeListHead(&mHandleList.List.Link);\r
+\r
+  InitializeListHead (&mHandleList.List.Link);\r
   mHandleList.NextIndex = 1;\r
-  Status = gBS->LocateHandleBuffer (\r
-                AllHandles,\r
-                NULL,\r
-                NULL,\r
-                &HandleCount,\r
-                &HandleBuffer\r
-               );\r
-  ASSERT_EFI_ERROR(Status);\r
-  if (EFI_ERROR(Status)) {\r
+  Status                = gBS->LocateHandleBuffer (\r
+                                 AllHandles,\r
+                                 NULL,\r
+                                 NULL,\r
+                                 &HandleCount,\r
+                                 &HandleBuffer\r
+                                 );\r
+  ASSERT_EFI_ERROR (Status);\r
+  if (EFI_ERROR (Status)) {\r
     return (Status);\r
   }\r
-  for (mHandleList.NextIndex = 1 ; mHandleList.NextIndex <= HandleCount ; mHandleList.NextIndex++){\r
-    ListWalker = AllocateZeroPool(sizeof(HANDLE_LIST));\r
-    ASSERT(ListWalker != NULL);\r
-    ListWalker->TheHandle = HandleBuffer[mHandleList.NextIndex-1];\r
-    ListWalker->TheIndex  = mHandleList.NextIndex;\r
-    InsertTailList(&mHandleList.List.Link,&ListWalker->Link);\r
+\r
+  for (mHandleList.NextIndex = 1; mHandleList.NextIndex <= HandleCount; mHandleList.NextIndex++) {\r
+    ListWalker = AllocateZeroPool (sizeof (HANDLE_LIST));\r
+    if (ListWalker != NULL) {\r
+      ListWalker->TheHandle = HandleBuffer[mHandleList.NextIndex - 1];\r
+      ListWalker->TheIndex  = mHandleList.NextIndex;\r
+      InsertTailList (&mHandleList.List.Link, &ListWalker->Link);\r
+    }\r
   }\r
-  FreePool(HandleBuffer);\r
+\r
+  FreePool (HandleBuffer);\r
   return (EFI_SUCCESS);\r
 }\r
 \r
@@ -1214,8 +2942,8 @@ InternalShellInitHandleList(
 **/\r
 UINTN\r
 EFIAPI\r
-ConvertHandleToHandleIndex(\r
-  IN CONST EFI_HANDLE TheHandle\r
+ConvertHandleToHandleIndex (\r
+  IN CONST EFI_HANDLE  TheHandle\r
   )\r
 {\r
   EFI_STATUS   Status;\r
@@ -1227,17 +2955,18 @@ ConvertHandleToHandleIndex(
     return 0;\r
   }\r
 \r
-  InternalShellInitHandleList();\r
+  InternalShellInitHandleList ();\r
 \r
-  for (ListWalker = (HANDLE_LIST*)GetFirstNode(&mHandleList.List.Link)\r
-    ;  !IsNull(&mHandleList.List.Link,&ListWalker->Link)\r
-    ;  ListWalker = (HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link)\r
-   ){\r
+  for (ListWalker = (HANDLE_LIST *)GetFirstNode (&mHandleList.List.Link)\r
+       ; !IsNull (&mHandleList.List.Link, &ListWalker->Link)\r
+       ; ListWalker = (HANDLE_LIST *)GetNextNode (&mHandleList.List.Link, &ListWalker->Link)\r
+       )\r
+  {\r
     if (ListWalker->TheHandle == TheHandle) {\r
       //\r
       // Verify that TheHandle is still present in the Handle Database\r
       //\r
-      Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount);\r
+      Status = gBS->ProtocolsPerHandle (TheHandle, &ProtocolBuffer, &ProtocolCount);\r
       if (EFI_ERROR (Status)) {\r
         //\r
         // TheHandle is not present in the Handle Database, so delete from the handle list\r
@@ -1245,6 +2974,7 @@ ConvertHandleToHandleIndex(
         RemoveEntryList (&ListWalker->Link);\r
         return 0;\r
       }\r
+\r
       FreePool (ProtocolBuffer);\r
       return (ListWalker->TheIndex);\r
     }\r
@@ -1253,25 +2983,27 @@ ConvertHandleToHandleIndex(
   //\r
   // Verify that TheHandle is valid handle\r
   //\r
-  Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount);\r
+  Status = gBS->ProtocolsPerHandle (TheHandle, &ProtocolBuffer, &ProtocolCount);\r
   if (EFI_ERROR (Status)) {\r
     //\r
     // TheHandle is not valid, so do not add to handle list\r
     //\r
     return 0;\r
   }\r
+\r
   FreePool (ProtocolBuffer);\r
 \r
-  ListWalker = AllocateZeroPool(sizeof(HANDLE_LIST));\r
-  ASSERT(ListWalker != NULL);\r
+  ListWalker = AllocateZeroPool (sizeof (HANDLE_LIST));\r
+  if (ListWalker == NULL) {\r
+    return 0;\r
+  }\r
+\r
   ListWalker->TheHandle = TheHandle;\r
   ListWalker->TheIndex  = mHandleList.NextIndex++;\r
-  InsertTailList(&mHandleList.List.Link,&ListWalker->Link);\r
+  InsertTailList (&mHandleList.List.Link, &ListWalker->Link);\r
   return (ListWalker->TheIndex);\r
 }\r
 \r
-\r
-\r
 /**\r
   Function to retrieve the EFI_HANDLE from the human-friendly index.\r
 \r
@@ -1283,39 +3015,44 @@ ConvertHandleToHandleIndex(
 **/\r
 EFI_HANDLE\r
 EFIAPI\r
-ConvertHandleIndexToHandle(\r
-  IN CONST UINTN TheIndex\r
+ConvertHandleIndexToHandle (\r
+  IN CONST UINTN  TheIndex\r
   )\r
 {\r
   EFI_STATUS   Status;\r
   EFI_GUID     **ProtocolBuffer;\r
   UINTN        ProtocolCount;\r
-  HANDLE_LIST *ListWalker;\r
+  HANDLE_LIST  *ListWalker;\r
 \r
-  InternalShellInitHandleList();\r
+  InternalShellInitHandleList ();\r
 \r
   if (TheIndex >= mHandleList.NextIndex) {\r
     return NULL;\r
   }\r
 \r
-  for (ListWalker = (HANDLE_LIST*)GetFirstNode(&mHandleList.List.Link)\r
-    ;  !IsNull(&mHandleList.List.Link,&ListWalker->Link)\r
-    ;  ListWalker = (HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link)\r
-   ){\r
-    if (ListWalker->TheIndex == TheIndex && ListWalker->TheHandle != NULL) {\r
+  for (ListWalker = (HANDLE_LIST *)GetFirstNode (&mHandleList.List.Link)\r
+       ; !IsNull (&mHandleList.List.Link, &ListWalker->Link)\r
+       ; ListWalker = (HANDLE_LIST *)GetNextNode (&mHandleList.List.Link, &ListWalker->Link)\r
+       )\r
+  {\r
+    if ((ListWalker->TheIndex == TheIndex) && (ListWalker->TheHandle != NULL)) {\r
       //\r
       // Verify that LinkWalker->TheHandle is valid handle\r
       //\r
-      Status = gBS->ProtocolsPerHandle(ListWalker->TheHandle, &ProtocolBuffer, &ProtocolCount);\r
-      if (EFI_ERROR (Status)) {\r
+      Status = gBS->ProtocolsPerHandle (ListWalker->TheHandle, &ProtocolBuffer, &ProtocolCount);\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
         ListWalker->TheHandle = NULL;\r
       }\r
+\r
       return (ListWalker->TheHandle);\r
     }\r
   }\r
+\r
   return NULL;\r
 }\r
 \r
@@ -1348,53 +3085,57 @@ ConvertHandleIndexToHandle(
 EFI_STATUS\r
 EFIAPI\r
 ParseHandleDatabaseByRelationshipWithType (\r
-  IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL,\r
-  IN CONST EFI_HANDLE ControllerHandle OPTIONAL,\r
-  IN UINTN            *HandleCount,\r
-  OUT EFI_HANDLE      **HandleBuffer,\r
-  OUT UINTN           **HandleType\r
+  IN CONST EFI_HANDLE  DriverBindingHandle OPTIONAL,\r
+  IN CONST EFI_HANDLE  ControllerHandle OPTIONAL,\r
+  IN UINTN             *HandleCount,\r
+  OUT EFI_HANDLE       **HandleBuffer,\r
+  OUT UINTN            **HandleType\r
   )\r
 {\r
-  EFI_STATUS                          Status;\r
-  UINTN                               HandleIndex;\r
-  EFI_GUID                            **ProtocolGuidArray;\r
-  UINTN                               ArrayCount;\r
-  UINTN                               ProtocolIndex;\r
-  EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo;\r
-  UINTN                               OpenInfoCount;\r
-  UINTN                               OpenInfoIndex;\r
-  UINTN                               ChildIndex;\r
-  INTN                                DriverBindingHandleIndex;\r
-\r
-  ASSERT(HandleCount  != NULL);\r
-  ASSERT(HandleBuffer != NULL);\r
-  ASSERT(HandleType   != NULL);\r
-  ASSERT(DriverBindingHandle != NULL || ControllerHandle != NULL);\r
-\r
-  *HandleCount                  = 0;\r
-  *HandleBuffer                 = NULL;\r
-  *HandleType                   = NULL;\r
+  EFI_STATUS                           Status;\r
+  UINTN                                HandleIndex;\r
+  EFI_GUID                             **ProtocolGuidArray;\r
+  UINTN                                ArrayCount;\r
+  UINTN                                ProtocolIndex;\r
+  EFI_OPEN_PROTOCOL_INFORMATION_ENTRY  *OpenInfo;\r
+  UINTN                                OpenInfoCount;\r
+  UINTN                                OpenInfoIndex;\r
+  UINTN                                ChildIndex;\r
+  INTN                                 DriverBindingHandleIndex;\r
+\r
+  ASSERT (HandleCount  != NULL);\r
+  ASSERT (HandleBuffer != NULL);\r
+  ASSERT (HandleType   != NULL);\r
+  ASSERT (DriverBindingHandle != NULL || ControllerHandle != NULL);\r
+\r
+  *HandleCount  = 0;\r
+  *HandleBuffer = NULL;\r
+  *HandleType   = NULL;\r
 \r
   //\r
   // Retrieve the list of all handles from the handle database\r
   //\r
   Status = gBS->LocateHandleBuffer (\r
-                AllHandles,\r
-                NULL,\r
-                NULL,\r
-                HandleCount,\r
-                HandleBuffer\r
-               );\r
+                  AllHandles,\r
+                  NULL,\r
+                  NULL,\r
+                  HandleCount,\r
+                  HandleBuffer\r
+                  );\r
   if (EFI_ERROR (Status)) {\r
     return (Status);\r
   }\r
 \r
   *HandleType = AllocateZeroPool (*HandleCount * sizeof (UINTN));\r
-  ASSERT(*HandleType != NULL);\r
+  if (*HandleType == NULL) {\r
+    SHELL_FREE_NON_NULL (*HandleBuffer);\r
+    *HandleCount = 0;\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
 \r
   DriverBindingHandleIndex = -1;\r
   for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {\r
-    if (DriverBindingHandle != NULL && (*HandleBuffer)[HandleIndex] == DriverBindingHandle) {\r
+    if ((DriverBindingHandle != NULL) && ((*HandleBuffer)[HandleIndex] == DriverBindingHandle)) {\r
       DriverBindingHandleIndex = (INTN)HandleIndex;\r
     }\r
   }\r
@@ -1404,42 +3145,38 @@ ParseHandleDatabaseByRelationshipWithType (
     // Retrieve the list of all the protocols on each handle\r
     //\r
     Status = gBS->ProtocolsPerHandle (\r
-                  (*HandleBuffer)[HandleIndex],\r
-                  &ProtocolGuidArray,\r
-                  &ArrayCount\r
-                 );\r
+                    (*HandleBuffer)[HandleIndex],\r
+                    &ProtocolGuidArray,\r
+                    &ArrayCount\r
+                    );\r
     if (EFI_ERROR (Status)) {\r
       continue;\r
     }\r
 \r
     for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
-\r
       //\r
       // Set the bit describing what this handle has\r
       //\r
-      if        (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiLoadedImageProtocolGuid)         ) {\r
+      if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiLoadedImageProtocolGuid)) {\r
         (*HandleType)[HandleIndex] |= (UINTN)HR_IMAGE_HANDLE;\r
-      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverBindingProtocolGuid)       ) {\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverBindingProtocolGuid)) {\r
         (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_BINDING_HANDLE;\r
       } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfiguration2ProtocolGuid)) {\r
         (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_CONFIGURATION_HANDLE;\r
-      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid) ) {\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid)) {\r
         (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_CONFIGURATION_HANDLE;\r
-      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid)  ) {\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid)) {\r
         (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_DIAGNOSTICS_HANDLE;\r
-      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid)   ) {\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid)) {\r
         (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_DIAGNOSTICS_HANDLE;\r
-      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid)      ) {\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid)) {\r
         (*HandleType)[HandleIndex] |= (UINTN)HR_COMPONENT_NAME_HANDLE;\r
-      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentNameProtocolGuid)       ) {\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentNameProtocolGuid)) {\r
         (*HandleType)[HandleIndex] |= (UINTN)HR_COMPONENT_NAME_HANDLE;\r
-      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDevicePathProtocolGuid)          ) {\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDevicePathProtocolGuid)) {\r
         (*HandleType)[HandleIndex] |= (UINTN)HR_DEVICE_HANDLE;\r
-      } else {\r
-        DEBUG_CODE_BEGIN();\r
-        ASSERT((*HandleType)[HandleIndex] == (*HandleType)[HandleIndex]);\r
-        DEBUG_CODE_END();\r
       }\r
+\r
       //\r
       // Retrieve the list of agents that have opened each protocol\r
       //\r
@@ -1448,28 +3185,30 @@ ParseHandleDatabaseByRelationshipWithType (
                       ProtocolGuidArray[ProtocolIndex],\r
                       &OpenInfo,\r
                       &OpenInfoCount\r
-                     );\r
+                      );\r
       if (EFI_ERROR (Status)) {\r
         continue;\r
       }\r
 \r
       if (ControllerHandle == NULL) {\r
         //\r
-        // ControllerHandle == NULL and DriverBindingHandle != NULL.  \r
+        // ControllerHandle == NULL and DriverBindingHandle != NULL.\r
         // Return information on all the controller handles that the driver specified by DriverBindingHandle is managing\r
         //\r
         for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
-          if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && (OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
+          if ((OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) && ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0)) {\r
             (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
             if (DriverBindingHandleIndex != -1) {\r
               (*HandleType)[DriverBindingHandleIndex] |= (UINTN)HR_DEVICE_DRIVER;\r
             }\r
           }\r
-          if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && (OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
+\r
+          if ((OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) && ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0)) {\r
             (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
             if (DriverBindingHandleIndex != -1) {\r
               (*HandleType)[DriverBindingHandleIndex] |= (UINTN)(HR_BUS_DRIVER | HR_DEVICE_DRIVER);\r
             }\r
+\r
             for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
               if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {\r
                 (*HandleType)[ChildIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CHILD_HANDLE);\r
@@ -1478,7 +3217,8 @@ ParseHandleDatabaseByRelationshipWithType (
           }\r
         }\r
       }\r
-      if (DriverBindingHandle == NULL && ControllerHandle != NULL) {\r
+\r
+      if ((DriverBindingHandle == NULL) && (ControllerHandle != NULL)) {\r
         if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {\r
           (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
           for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
@@ -1489,11 +3229,13 @@ ParseHandleDatabaseByRelationshipWithType (
                 }\r
               }\r
             }\r
+\r
             if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
               for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
                 if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {\r
                   (*HandleType)[ChildIndex] |= (UINTN)(HR_BUS_DRIVER | HR_DEVICE_DRIVER);\r
                 }\r
+\r
                 if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {\r
                   (*HandleType)[ChildIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CHILD_HANDLE);\r
                 }\r
@@ -1510,7 +3252,8 @@ ParseHandleDatabaseByRelationshipWithType (
           }\r
         }\r
       }\r
-      if (DriverBindingHandle != NULL && ControllerHandle != NULL) {\r
+\r
+      if ((DriverBindingHandle != NULL) && (ControllerHandle != NULL)) {\r
         if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {\r
           (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
           for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
@@ -1521,6 +3264,7 @@ ParseHandleDatabaseByRelationshipWithType (
                 }\r
               }\r
             }\r
+\r
             if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
               if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {\r
                 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
@@ -1547,10 +3291,13 @@ ParseHandleDatabaseByRelationshipWithType (
           }\r
         }\r
       }\r
+\r
       FreePool (OpenInfo);\r
     }\r
+\r
     FreePool (ProtocolGuidArray);\r
   }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1585,27 +3332,27 @@ ParseHandleDatabaseByRelationshipWithType (
 EFI_STATUS\r
 EFIAPI\r
 ParseHandleDatabaseByRelationship (\r
-  IN CONST EFI_HANDLE       DriverBindingHandle OPTIONAL,\r
-  IN CONST EFI_HANDLE       ControllerHandle OPTIONAL,\r
-  IN CONST UINTN            Mask,\r
-  IN UINTN                  *MatchingHandleCount,\r
-  OUT EFI_HANDLE            **MatchingHandleBuffer OPTIONAL\r
+  IN CONST EFI_HANDLE  DriverBindingHandle OPTIONAL,\r
+  IN CONST EFI_HANDLE  ControllerHandle OPTIONAL,\r
+  IN CONST UINTN       Mask,\r
+  IN UINTN             *MatchingHandleCount,\r
+  OUT EFI_HANDLE       **MatchingHandleBuffer OPTIONAL\r
   )\r
 {\r
-  EFI_STATUS            Status;\r
-  UINTN                 HandleCount;\r
-  EFI_HANDLE            *HandleBuffer;\r
-  UINTN                 *HandleType;\r
-  UINTN                 HandleIndex;\r
+  EFI_STATUS  Status;\r
+  UINTN       HandleCount;\r
+  EFI_HANDLE  *HandleBuffer;\r
+  UINTN       *HandleType;\r
+  UINTN       HandleIndex;\r
 \r
-  ASSERT(MatchingHandleCount != NULL);\r
-  ASSERT(DriverBindingHandle != NULL || ControllerHandle != NULL);\r
+  ASSERT (MatchingHandleCount != NULL);\r
+  ASSERT (DriverBindingHandle != NULL || ControllerHandle != NULL);\r
 \r
   if ((Mask & HR_VALID_MASK) != Mask) {\r
     return (EFI_INVALID_PARAMETER);\r
   }\r
 \r
-  if ((Mask & HR_CHILD_HANDLE) != 0 && DriverBindingHandle == NULL) {\r
+  if (((Mask & HR_CHILD_HANDLE) != 0) && (DriverBindingHandle == NULL)) {\r
     return (EFI_INVALID_PARAMETER);\r
   }\r
 \r
@@ -1614,16 +3361,16 @@ ParseHandleDatabaseByRelationship (
     *MatchingHandleBuffer = NULL;\r
   }\r
 \r
-  HandleBuffer  = NULL;\r
-  HandleType    = NULL;\r
+  HandleBuffer = NULL;\r
+  HandleType   = NULL;\r
 \r
   Status = ParseHandleDatabaseByRelationshipWithType (\r
-            DriverBindingHandle,\r
-            ControllerHandle,\r
-            &HandleCount,\r
-            &HandleBuffer,\r
-            &HandleType\r
-           );\r
+             DriverBindingHandle,\r
+             ControllerHandle,\r
+             &HandleCount,\r
+             &HandleBuffer,\r
+             &HandleType\r
+             );\r
   if (!EFI_ERROR (Status)) {\r
     //\r
     // Count the number of handles that match the attributes in Mask\r
@@ -1633,13 +3380,13 @@ ParseHandleDatabaseByRelationship (
         (*MatchingHandleCount)++;\r
       }\r
     }\r
+\r
     //\r
     // If no handles match the attributes in Mask then return EFI_NOT_FOUND\r
     //\r
     if (*MatchingHandleCount == 0) {\r
       Status = EFI_NOT_FOUND;\r
     } else {\r
-\r
       if (MatchingHandleBuffer == NULL) {\r
         //\r
         // Someone just wanted the count...\r
@@ -1650,26 +3397,29 @@ ParseHandleDatabaseByRelationship (
         // Allocate a handle buffer for the number of handles that matched the attributes in Mask\r
         //\r
         *MatchingHandleBuffer = AllocateZeroPool ((*MatchingHandleCount +1)* sizeof (EFI_HANDLE));\r
-        ASSERT(*MatchingHandleBuffer != NULL);\r
+        if (*MatchingHandleBuffer == NULL) {\r
+          Status = EFI_OUT_OF_RESOURCES;\r
+        } else {\r
+          for (HandleIndex = 0, *MatchingHandleCount = 0\r
+               ; HandleIndex < HandleCount\r
+               ; HandleIndex++\r
+               )\r
+          {\r
+            //\r
+            // Fill the allocated buffer with the handles that matched the attributes in Mask\r
+            //\r
+            if ((HandleType[HandleIndex] & Mask) == Mask) {\r
+              (*MatchingHandleBuffer)[(*MatchingHandleCount)++] = HandleBuffer[HandleIndex];\r
+            }\r
+          }\r
 \r
-        for (HandleIndex = 0,*MatchingHandleCount = 0\r
-          ;  HandleIndex < HandleCount\r
-          ;  HandleIndex++\r
-         ){\r
           //\r
-          // Fill the allocated buffer with the handles that matched the attributes in Mask\r
+          // Make the last one NULL\r
           //\r
-          if ((HandleType[HandleIndex] & Mask) == Mask) {\r
-            (*MatchingHandleBuffer)[(*MatchingHandleCount)++] = HandleBuffer[HandleIndex];\r
-          }\r
-        }\r
-\r
-        //\r
-        // Make the last one NULL\r
-        //\r
-        (*MatchingHandleBuffer)[*MatchingHandleCount] = NULL;\r
+          (*MatchingHandleBuffer)[*MatchingHandleCount] = NULL;\r
 \r
-        Status = EFI_SUCCESS;\r
+          Status = EFI_SUCCESS;\r
+        } // *MatchingHandleBuffer == NULL (ELSE)\r
       } // MacthingHandleBuffer == NULL (ELSE)\r
     } // *MatchingHandleCount  == 0 (ELSE)\r
   } // no error on ParseHandleDatabaseByRelationshipWithType\r
@@ -1682,6 +3432,11 @@ ParseHandleDatabaseByRelationship (
     FreePool (HandleType);\r
   }\r
 \r
+  ASSERT (\r
+    (MatchingHandleBuffer == NULL) ||\r
+    (*MatchingHandleCount == 0 && *MatchingHandleBuffer == NULL) ||\r
+    (*MatchingHandleCount != 0 && *MatchingHandleBuffer != NULL)\r
+    );\r
   return Status;\r
 }\r
 \r
@@ -1689,7 +3444,7 @@ ParseHandleDatabaseByRelationship (
   Gets handles for any child controllers of the passed in controller.\r
 \r
   @param[in] ControllerHandle       The handle of the "parent controller"\r
-  @param[in] MatchingHandleCount    Pointer to the number of handles in\r
+  @param[out] MatchingHandleCount   Pointer to the number of handles in\r
                                     MatchingHandleBuffer on return.\r
   @param[out] MatchingHandleBuffer  Buffer containing handles on a successful\r
                                     return.\r
@@ -1699,10 +3454,10 @@ ParseHandleDatabaseByRelationship (
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-ParseHandleDatabaseForChildControllers(\r
-  IN CONST EFI_HANDLE       ControllerHandle,\r
-  IN UINTN                  *MatchingHandleCount,\r
-  OUT EFI_HANDLE            **MatchingHandleBuffer OPTIONAL\r
+ParseHandleDatabaseForChildControllers (\r
+  IN CONST EFI_HANDLE  ControllerHandle,\r
+  OUT UINTN            *MatchingHandleCount,\r
+  OUT EFI_HANDLE       **MatchingHandleBuffer OPTIONAL\r
   )\r
 {\r
   EFI_STATUS  Status;\r
@@ -1718,13 +3473,14 @@ ParseHandleDatabaseForChildControllers(
   if (MatchingHandleCount == NULL) {\r
     return (EFI_INVALID_PARAMETER);\r
   }\r
+\r
   *MatchingHandleCount = 0;\r
 \r
   Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
-            ControllerHandle,\r
-            &DriverBindingHandleCount,\r
-            &DriverBindingHandleBuffer\r
-           );\r
+             ControllerHandle,\r
+             &DriverBindingHandleCount,\r
+             &DriverBindingHandleBuffer\r
+             );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
@@ -1732,7 +3488,7 @@ ParseHandleDatabaseForChildControllers(
   //\r
   // Get a buffer big enough for all the controllers.\r
   //\r
-  HandleBufferForReturn = GetHandleListByProtocol(NULL);\r
+  HandleBufferForReturn = GetHandleListByProtocol (NULL);\r
   if (HandleBufferForReturn == NULL) {\r
     FreePool (DriverBindingHandleBuffer);\r
     return (EFI_NOT_FOUND);\r
@@ -1740,11 +3496,11 @@ ParseHandleDatabaseForChildControllers(
 \r
   for (DriverBindingHandleIndex = 0; DriverBindingHandleIndex < DriverBindingHandleCount; DriverBindingHandleIndex++) {\r
     Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
-              DriverBindingHandleBuffer[DriverBindingHandleIndex],\r
-              ControllerHandle,\r
-              &ChildControllerHandleCount,\r
-              &ChildControllerHandleBuffer\r
-             );\r
+               DriverBindingHandleBuffer[DriverBindingHandleIndex],\r
+               ControllerHandle,\r
+               &ChildControllerHandleCount,\r
+               &ChildControllerHandleBuffer\r
+               );\r
     if (EFI_ERROR (Status)) {\r
       continue;\r
     }\r
@@ -1752,12 +3508,14 @@ ParseHandleDatabaseForChildControllers(
     for (ChildControllerHandleIndex = 0;\r
          ChildControllerHandleIndex < ChildControllerHandleCount;\r
          ChildControllerHandleIndex++\r
-       ) {\r
+         )\r
+    {\r
       for (HandleIndex = 0; HandleIndex < *MatchingHandleCount; HandleIndex++) {\r
         if (HandleBufferForReturn[HandleIndex] == ChildControllerHandleBuffer[ChildControllerHandleIndex]) {\r
           break;\r
         }\r
       }\r
+\r
       if (HandleIndex >= *MatchingHandleCount) {\r
         HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];\r
       }\r
@@ -1768,12 +3526,24 @@ ParseHandleDatabaseForChildControllers(
 \r
   FreePool (DriverBindingHandleBuffer);\r
 \r
+  if ((MatchingHandleBuffer == NULL) || (*MatchingHandleCount == 0)) {\r
+    //\r
+    // The caller is not interested in the actual handles, or we've found none.\r
+    //\r
+    FreePool (HandleBufferForReturn);\r
+    HandleBufferForReturn = NULL;\r
+  }\r
+\r
   if (MatchingHandleBuffer != NULL) {\r
     *MatchingHandleBuffer = HandleBufferForReturn;\r
-  } else {\r
-    FreePool(HandleBufferForReturn);\r
   }\r
 \r
+  ASSERT (\r
+    (MatchingHandleBuffer == NULL) ||\r
+    (*MatchingHandleCount == 0 && *MatchingHandleBuffer == NULL) ||\r
+    (*MatchingHandleCount != 0 && *MatchingHandleBuffer != NULL)\r
+    );\r
+\r
   return (EFI_SUCCESS);\r
 }\r
 \r
@@ -1792,8 +3562,7 @@ ParseHandleDatabaseForChildControllers(
   @retval NULL                      A parameter was invalid.\r
   @return                           A pointer to (*DestinationBuffer).\r
 **/\r
-VOID*\r
-EFIAPI\r
+VOID *\r
 BuffernCatGrow (\r
   IN OUT VOID   **DestinationBuffer,\r
   IN OUT UINTN  *DestinationSize,\r
@@ -1801,12 +3570,12 @@ BuffernCatGrow (
   IN     UINTN  SourceSize\r
   )\r
 {\r
-  UINTN LocalDestinationSize;\r
-  UINTN LocalDestinationFinalSize;\r
+  UINTN  LocalDestinationSize;\r
+  UINTN  LocalDestinationFinalSize;\r
 \r
-  ASSERT(DestinationBuffer != NULL);\r
+  ASSERT (DestinationBuffer != NULL);\r
 \r
-  if (SourceSize == 0 || SourceBuffer == NULL) {\r
+  if ((SourceSize == 0) || (SourceBuffer == NULL)) {\r
     return (*DestinationBuffer);\r
   }\r
 \r
@@ -1824,16 +3593,16 @@ BuffernCatGrow (
 \r
   if (LocalDestinationSize == 0) {\r
     // allcoate\r
-    *DestinationBuffer = AllocateZeroPool(LocalDestinationFinalSize);\r
+    *DestinationBuffer = AllocateZeroPool (LocalDestinationFinalSize);\r
   } else {\r
     // reallocate\r
-    *DestinationBuffer = ReallocatePool(LocalDestinationSize, LocalDestinationFinalSize, *DestinationBuffer);\r
+    *DestinationBuffer = ReallocatePool (LocalDestinationSize, LocalDestinationFinalSize, *DestinationBuffer);\r
   }\r
 \r
-  ASSERT(*DestinationBuffer != NULL);\r
+  ASSERT (*DestinationBuffer != NULL);\r
 \r
   // copy\r
-  return (CopyMem(((UINT8*)(*DestinationBuffer)) + LocalDestinationSize, SourceBuffer, SourceSize));\r
+  return (CopyMem (((UINT8 *)(*DestinationBuffer)) + LocalDestinationSize, SourceBuffer, SourceSize));\r
 }\r
 \r
 /**\r
@@ -1849,66 +3618,68 @@ BuffernCatGrow (
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-ParseHandleDatabaseForChildDevices(\r
-  IN CONST EFI_HANDLE       DriverHandle,\r
-  IN UINTN                  *MatchingHandleCount,\r
-  OUT EFI_HANDLE            **MatchingHandleBuffer OPTIONAL\r
+ParseHandleDatabaseForChildDevices (\r
+  IN CONST EFI_HANDLE  DriverHandle,\r
+  IN UINTN             *MatchingHandleCount,\r
+  OUT EFI_HANDLE       **MatchingHandleBuffer OPTIONAL\r
   )\r
 {\r
-  EFI_HANDLE      *Buffer;\r
-  EFI_HANDLE      *Buffer2;\r
-  UINTN           Count1;\r
-  UINTN           Count2;\r
-  UINTN           HandleIndex;\r
-  EFI_STATUS      Status;\r
-  UINTN           HandleBufferSize;\r
+  EFI_HANDLE  *Buffer;\r
+  EFI_HANDLE  *Buffer2;\r
+  UINTN       Count1;\r
+  UINTN       Count2;\r
+  UINTN       HandleIndex;\r
+  EFI_STATUS  Status;\r
+  UINTN       HandleBufferSize;\r
 \r
-  ASSERT(MatchingHandleCount != NULL);\r
+  ASSERT (MatchingHandleCount != NULL);\r
 \r
-  HandleBufferSize      = 0;\r
-  Buffer                = NULL;\r
-  Buffer2               = NULL;\r
-  *MatchingHandleCount  = 0;\r
+  HandleBufferSize     = 0;\r
+  Buffer               = NULL;\r
+  Buffer2              = NULL;\r
+  *MatchingHandleCount = 0;\r
 \r
   Status = PARSE_HANDLE_DATABASE_DEVICES (\r
-            DriverHandle,\r
-            &Count1,\r
-            &Buffer\r
-           );\r
+             DriverHandle,\r
+             &Count1,\r
+             &Buffer\r
+             );\r
   if (!EFI_ERROR (Status)) {\r
     for (HandleIndex = 0; HandleIndex < Count1; HandleIndex++) {\r
       //\r
       // now find the children\r
       //\r
       Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
-                DriverHandle,\r
-                Buffer[HandleIndex],\r
-                &Count2,\r
-                &Buffer2\r
-               );\r
-      if (EFI_ERROR(Status)) {\r
+                 DriverHandle,\r
+                 Buffer[HandleIndex],\r
+                 &Count2,\r
+                 &Buffer2\r
+                 );\r
+      if (EFI_ERROR (Status)) {\r
         break;\r
       }\r
+\r
       //\r
       // save out required and optional data elements\r
       //\r
       *MatchingHandleCount += Count2;\r
       if (MatchingHandleBuffer != NULL) {\r
-        *MatchingHandleBuffer = BuffernCatGrow((VOID**)MatchingHandleBuffer, &HandleBufferSize, Buffer2, Count2 * sizeof(Buffer2[0]));\r
+        *MatchingHandleBuffer = BuffernCatGrow ((VOID **)MatchingHandleBuffer, &HandleBufferSize, Buffer2, Count2 * sizeof (Buffer2[0]));\r
       }\r
 \r
       //\r
       // free the memory\r
       //\r
       if (Buffer2 != NULL) {\r
-        FreePool(Buffer2);\r
+        FreePool (Buffer2);\r
       }\r
     }\r
   }\r
 \r
   if (Buffer != NULL) {\r
-    FreePool(Buffer);\r
+    FreePool (Buffer);\r
   }\r
+\r
   return (Status);\r
 }\r
 \r
@@ -1921,49 +3692,54 @@ ParseHandleDatabaseForChildDevices(
   @retval NULL            A memory allocation failed.\r
   @return                 A NULL terminated list of handles.\r
 **/\r
-EFI_HANDLE*\r
+EFI_HANDLE *\r
 EFIAPI\r
 GetHandleListByProtocol (\r
-  IN CONST EFI_GUID *ProtocolGuid OPTIONAL\r
+  IN CONST EFI_GUID  *ProtocolGuid OPTIONAL\r
   )\r
 {\r
-  EFI_HANDLE          *HandleList;\r
-  UINTN               Size;\r
-  EFI_STATUS          Status;\r
+  EFI_HANDLE  *HandleList;\r
+  UINTN       Size;\r
+  EFI_STATUS  Status;\r
 \r
-  Size = 0;\r
+  Size       = 0;\r
   HandleList = NULL;\r
 \r
   //\r
   // We cannot use LocateHandleBuffer since we need that NULL item on the ends of the list!\r
   //\r
   if (ProtocolGuid == NULL) {\r
-    Status = gBS->LocateHandle(AllHandles, NULL, NULL, &Size, HandleList);\r
+    Status = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, HandleList);\r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      HandleList = AllocateZeroPool(Size + sizeof(EFI_HANDLE));\r
+      HandleList = AllocateZeroPool (Size + sizeof (EFI_HANDLE));\r
       if (HandleList == NULL) {\r
         return (NULL);\r
       }\r
-      Status = gBS->LocateHandle(AllHandles, NULL, NULL, &Size, HandleList);\r
-      HandleList[Size/sizeof(EFI_HANDLE)] = NULL;\r
+\r
+      Status                               = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, HandleList);\r
+      HandleList[Size/sizeof (EFI_HANDLE)] = NULL;\r
     }\r
   } else {\r
-    Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)ProtocolGuid, NULL, &Size, HandleList);\r
+    Status = gBS->LocateHandle (ByProtocol, (EFI_GUID *)ProtocolGuid, NULL, &Size, HandleList);\r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      HandleList = AllocateZeroPool(Size + sizeof(EFI_HANDLE));\r
+      HandleList = AllocateZeroPool (Size + sizeof (EFI_HANDLE));\r
       if (HandleList == NULL) {\r
         return (NULL);\r
       }\r
-      Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)ProtocolGuid, NULL, &Size, HandleList);\r
-      HandleList[Size/sizeof(EFI_HANDLE)] = NULL;\r
+\r
+      Status                               = gBS->LocateHandle (ByProtocol, (EFI_GUID *)ProtocolGuid, NULL, &Size, HandleList);\r
+      HandleList[Size/sizeof (EFI_HANDLE)] = NULL;\r
     }\r
   }\r
-  if (EFI_ERROR(Status)) {\r
+\r
+  if (EFI_ERROR (Status)) {\r
     if (HandleList != NULL) {\r
-      FreePool(HandleList);\r
+      FreePool (HandleList);\r
     }\r
+\r
     return (NULL);\r
   }\r
+\r
   return (HandleList);\r
 }\r
 \r
@@ -1976,65 +3752,66 @@ GetHandleListByProtocol (
   @retval NULL              ProtocolGuids was NULL.\r
   @return                   A NULL terminated list of EFI_HANDLEs.\r
 **/\r
-EFI_HANDLE*\r
+EFI_HANDLE *\r
 EFIAPI\r
 GetHandleListByProtocolList (\r
-  IN CONST EFI_GUID **ProtocolGuids\r
+  IN CONST EFI_GUID  **ProtocolGuids\r
   )\r
 {\r
-  EFI_HANDLE          *HandleList;\r
-  UINTN               Size;\r
-  UINTN               TotalSize;\r
-  UINTN               TempSize;\r
-  EFI_STATUS          Status;\r
-  CONST EFI_GUID      **GuidWalker;\r
-  EFI_HANDLE          *HandleWalker1;\r
-  EFI_HANDLE          *HandleWalker2;\r
+  EFI_HANDLE      *HandleList;\r
+  UINTN           Size;\r
+  UINTN           TotalSize;\r
+  UINTN           TempSize;\r
+  EFI_STATUS      Status;\r
+  CONST EFI_GUID  **GuidWalker;\r
+  EFI_HANDLE      *HandleWalker1;\r
+  EFI_HANDLE      *HandleWalker2;\r
 \r
-  Size        = 0;\r
-  HandleList  = NULL;\r
-  TotalSize   = sizeof(EFI_HANDLE);\r
+  Size       = 0;\r
+  HandleList = NULL;\r
+  TotalSize  = sizeof (EFI_HANDLE);\r
 \r
-  for (GuidWalker = ProtocolGuids ; GuidWalker != NULL && *GuidWalker != NULL ; GuidWalker++,Size = 0){\r
-    Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)(*GuidWalker), NULL, &Size, NULL);\r
+  for (GuidWalker = ProtocolGuids; GuidWalker != NULL && *GuidWalker != NULL; GuidWalker++, Size = 0) {\r
+    Status = gBS->LocateHandle (ByProtocol, (EFI_GUID *)(*GuidWalker), NULL, &Size, NULL);\r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
       TotalSize += Size;\r
     }\r
   }\r
 \r
   //\r
-  // No handles were found... \r
+  // No handles were found...\r
   //\r
-  if (TotalSize == sizeof(EFI_HANDLE)) {\r
+  if (TotalSize == sizeof (EFI_HANDLE)) {\r
     return (NULL);\r
   }\r
 \r
-  HandleList = AllocateZeroPool(TotalSize);\r
+  HandleList = AllocateZeroPool (TotalSize);\r
   if (HandleList == NULL) {\r
     return (NULL);\r
   }\r
 \r
   Size = 0;\r
-  for (GuidWalker = ProtocolGuids ; GuidWalker != NULL && *GuidWalker != NULL ; GuidWalker++){\r
+  for (GuidWalker = ProtocolGuids; GuidWalker != NULL && *GuidWalker != NULL; GuidWalker++) {\r
     TempSize = TotalSize - Size;\r
-    Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)(*GuidWalker), NULL, &TempSize, HandleList+(Size/sizeof(EFI_HANDLE)));\r
+    Status   = gBS->LocateHandle (ByProtocol, (EFI_GUID *)(*GuidWalker), NULL, &TempSize, HandleList+(Size/sizeof (EFI_HANDLE)));\r
 \r
     //\r
     // Allow for missing protocols... Only update the 'used' size upon success.\r
     //\r
-    if (!EFI_ERROR(Status)) {\r
+    if (!EFI_ERROR (Status)) {\r
       Size += TempSize;\r
     }\r
   }\r
-  ASSERT(HandleList[(TotalSize/sizeof(EFI_HANDLE))-1] == NULL);\r
 \r
-  for (HandleWalker1 = HandleList ; HandleWalker1 != NULL && *HandleWalker1 != NULL ; HandleWalker1++) {\r
-    for (HandleWalker2 = HandleWalker1 + 1; HandleWalker2 != NULL && *HandleWalker2 != NULL ; HandleWalker2++) {\r
+  ASSERT (HandleList[(TotalSize/sizeof (EFI_HANDLE))-1] == NULL);\r
+\r
+  for (HandleWalker1 = HandleList; HandleWalker1 != NULL && *HandleWalker1 != NULL; HandleWalker1++) {\r
+    for (HandleWalker2 = HandleWalker1 + 1; HandleWalker2 != NULL && *HandleWalker2 != NULL; HandleWalker2++) {\r
       if (*HandleWalker1 == *HandleWalker2) {\r
         //\r
         // copy memory back 1 handle width.\r
         //\r
-        CopyMem(HandleWalker2, HandleWalker2 + 1, TotalSize - ((HandleWalker2-HandleList+1)*sizeof(EFI_HANDLE)));\r
+        CopyMem (HandleWalker2, HandleWalker2 + 1, TotalSize - ((HandleWalker2-HandleList+1)*sizeof (EFI_HANDLE)));\r
       }\r
     }\r
   }\r
@@ -2042,12 +3819,55 @@ GetHandleListByProtocolList (
   return (HandleList);\r
 }\r
 \r
+/**\r
+  Return all supported GUIDs.\r
+\r
+  @param[out]     Guids  The buffer to return all supported GUIDs.\r
+  @param[in, out] Count  On input, the count of GUIDs the buffer can hold,\r
+                         On output, the count of GUIDs to return.\r
 \r
+  @retval EFI_INVALID_PARAMETER Count is NULL.\r
+  @retval EFI_BUFFER_TOO_SMALL  Buffer is not enough to hold all GUIDs.\r
+  @retval EFI_SUCCESS           GUIDs are returned successfully.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetAllMappingGuids (\r
+  OUT EFI_GUID  *Guids,\r
+  IN OUT UINTN  *Count\r
+  )\r
+{\r
+  UINTN  GuidCount;\r
+  UINTN  NtGuidCount;\r
+  UINTN  Index;\r
 \r
+  if (Count == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
+  NtGuidCount = 0;\r
+  if (PcdGetBool (PcdShellIncludeNtGuids)) {\r
+    NtGuidCount = ARRAY_SIZE (mGuidStringListNT) - 1;\r
+  }\r
 \r
+  GuidCount = ARRAY_SIZE (mGuidStringList) - 1;\r
 \r
+  if (*Count < NtGuidCount + GuidCount + mGuidListCount) {\r
+    *Count = NtGuidCount + GuidCount + mGuidListCount;\r
+    return EFI_BUFFER_TOO_SMALL;\r
+  }\r
 \r
+  for (Index = 0; Index < NtGuidCount; Index++) {\r
+    CopyGuid (&Guids[Index], mGuidStringListNT[Index].GuidId);\r
+  }\r
 \r
+  for (Index = 0; Index < GuidCount; Index++) {\r
+    CopyGuid (&Guids[NtGuidCount + Index], mGuidStringList[Index].GuidId);\r
+  }\r
 \r
+  for (Index = 0; Index < mGuidListCount; Index++) {\r
+    CopyGuid (&Guids[NtGuidCount + GuidCount + Index], mGuidList[Index].GuidId);\r
+  }\r
 \r
+  return EFI_SUCCESS;\r
+}\r