/** @file
  Provides interface to advanced shell functionality for parsing both handle and protocol database.

  Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>
  (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
  (C) Copyright 2015-2021 Hewlett Packard Enterprise Development LP<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include "UefiHandleParsingLib.h"
#include "IndustryStandard/Acpi10.h"
#include "IndustryStandard/Pci.h"
#include <PiDxe.h>
#include <Protocol/FirmwareVolume2.h>

EFI_HII_HANDLE     mHandleParsingHiiHandle = NULL;
HANDLE_INDEX_LIST  mHandleList             = {
  {
    { NULL, NULL }, 0, 0
  }, 0
};
GUID_INFO_BLOCK    *mGuidList;
UINTN              mGuidListCount;

/**
  Function to find the file name associated with a LoadedImageProtocol.

  @param[in] LoadedImage     An instance of LoadedImageProtocol.

  @retval                    A string representation of the file name associated
                             with LoadedImage, or NULL if no name can be found.
**/
CHAR16 *
FindLoadedImageFileName (
  IN EFI_LOADED_IMAGE_PROTOCOL  *LoadedImage
  )
{
  EFI_GUID                       *NameGuid;
  EFI_STATUS                     Status;
  EFI_FIRMWARE_VOLUME2_PROTOCOL  *Fv;
  VOID                           *Buffer;
  UINTN                          BufferSize;
  UINT32                         AuthenticationStatus;

  if ((LoadedImage == NULL) || (LoadedImage->FilePath == NULL)) {
    return NULL;
  }

  NameGuid = EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)LoadedImage->FilePath);

  if (NameGuid == NULL) {
    return NULL;
  }

  //
  // Get the FirmwareVolume2Protocol of the device handle that this image was loaded from.
  //
  Status = gBS->HandleProtocol (LoadedImage->DeviceHandle, &gEfiFirmwareVolume2ProtocolGuid, (VOID **)&Fv);

  //
  // FirmwareVolume2Protocol is PI, and is not required to be available.
  //
  if (EFI_ERROR (Status)) {
    return NULL;
  }

  //
  // Read the user interface section of the image.
  //
  Buffer = NULL;
  Status = Fv->ReadSection (Fv, NameGuid, EFI_SECTION_USER_INTERFACE, 0, &Buffer, &BufferSize, &AuthenticationStatus);

  if (EFI_ERROR (Status)) {
    return NULL;
  }

  //
  // ReadSection returns just the section data, without any section header. For
  // a user interface section, the only data is the file name.
  //
  return Buffer;
}

/**
  Function to translate the EFI_MEMORY_TYPE into a string.

  @param[in] Memory     The memory type.

  @retval               A string representation of the type allocated from BS Pool.
**/
CHAR16 *
ConvertMemoryType (
  IN CONST EFI_MEMORY_TYPE  Memory
  )
{
  CHAR16  *RetVal;

  RetVal = NULL;

  switch (Memory) {
    case EfiReservedMemoryType:       StrnCatGrow (&RetVal, NULL, L"EfiReservedMemoryType", 0);
      break;
    case EfiLoaderCode:               StrnCatGrow (&RetVal, NULL, L"EfiLoaderCode", 0);
      break;
    case EfiLoaderData:               StrnCatGrow (&RetVal, NULL, L"EfiLoaderData", 0);
      break;
    case EfiBootServicesCode:         StrnCatGrow (&RetVal, NULL, L"EfiBootServicesCode", 0);
      break;
    case EfiBootServicesData:         StrnCatGrow (&RetVal, NULL, L"EfiBootServicesData", 0);
      break;
    case EfiRuntimeServicesCode:      StrnCatGrow (&RetVal, NULL, L"EfiRuntimeServicesCode", 0);
      break;
    case EfiRuntimeServicesData:      StrnCatGrow (&RetVal, NULL, L"EfiRuntimeServicesData", 0);
      break;
    case EfiConventionalMemory:       StrnCatGrow (&RetVal, NULL, L"EfiConventionalMemory", 0);
      break;
    case EfiUnusableMemory:           StrnCatGrow (&RetVal, NULL, L"EfiUnusableMemory", 0);
      break;
    case EfiACPIReclaimMemory:        StrnCatGrow (&RetVal, NULL, L"EfiACPIReclaimMemory", 0);
      break;
    case EfiACPIMemoryNVS:            StrnCatGrow (&RetVal, NULL, L"EfiACPIMemoryNVS", 0);
      break;
    case EfiMemoryMappedIO:           StrnCatGrow (&RetVal, NULL, L"EfiMemoryMappedIO", 0);
      break;
    case EfiMemoryMappedIOPortSpace:  StrnCatGrow (&RetVal, NULL, L"EfiMemoryMappedIOPortSpace", 0);
      break;
    case EfiPalCode:                  StrnCatGrow (&RetVal, NULL, L"EfiPalCode", 0);
      break;
    case EfiMaxMemoryType:            StrnCatGrow (&RetVal, NULL, L"EfiMaxMemoryType", 0);
      break;
    default: ASSERT (FALSE);
  }

  return (RetVal);
}

/**
  Function to translate the EFI_GRAPHICS_PIXEL_FORMAT into a string.

  @param[in] Fmt     The format type.

  @retval               A string representation of the type allocated from BS Pool.
**/
CHAR16 *
ConvertPixelFormat (
  IN CONST EFI_GRAPHICS_PIXEL_FORMAT  Fmt
  )
{
  CHAR16  *RetVal;

  RetVal = NULL;

  switch (Fmt) {
    case PixelRedGreenBlueReserved8BitPerColor: StrnCatGrow (&RetVal, NULL, L"PixelRedGreenBlueReserved8BitPerColor", 0);
      break;
    case PixelBlueGreenRedReserved8BitPerColor: StrnCatGrow (&RetVal, NULL, L"PixelBlueGreenRedReserved8BitPerColor", 0);
      break;
    case PixelBitMask:                          StrnCatGrow (&RetVal, NULL, L"PixelBitMask", 0);
      break;
    case PixelBltOnly:                          StrnCatGrow (&RetVal, NULL, L"PixelBltOnly", 0);
      break;
    case PixelFormatMax:                        StrnCatGrow (&RetVal, NULL, L"PixelFormatMax", 0);
      break;
    default: ASSERT (FALSE);
  }

  return (RetVal);
}

/**
  Constructor for the library.

  @param[in] ImageHandle    Ignored.
  @param[in] SystemTable    Ignored.

  @retval EFI_SUCCESS   The operation was successful.
**/
EFI_STATUS
EFIAPI
HandleParsingLibConstructor (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  mGuidListCount = 0;
  mGuidList      = NULL;

  //
  // Do nothing with mHandleParsingHiiHandle.  Initialize HII as needed.
  //
  return (EFI_SUCCESS);
}

/**
  Initialization function for HII packages.

**/
VOID
HandleParsingHiiInit (
  VOID
  )
{
  if (mHandleParsingHiiHandle == NULL) {
    mHandleParsingHiiHandle = HiiAddPackages (&gHandleParsingHiiGuid, gImageHandle, UefiHandleParsingLibStrings, NULL);
    ASSERT (mHandleParsingHiiHandle != NULL);
  }
}

/**
  Destructor for the library.  free any resources.

  @param[in] ImageHandle    Ignored.
  @param[in] SystemTable    Ignored.

  @retval EFI_SUCCESS   The operation was successful.
**/
EFI_STATUS
EFIAPI
HandleParsingLibDestructor (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  )
{
  UINTN  LoopCount;

  for (LoopCount = 0; mGuidList != NULL && LoopCount < mGuidListCount; LoopCount++) {
    SHELL_FREE_NON_NULL (mGuidList[LoopCount].GuidId);
  }

  SHELL_FREE_NON_NULL (mGuidList);
  if (mHandleParsingHiiHandle != NULL) {
    HiiRemovePackages (mHandleParsingHiiHandle);
  }

  return (EFI_SUCCESS);
}

/**
  Function to dump information about LoadedImage.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has LoadedImage installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A poitner to a string containing the information.
**/
CHAR16 *
EFIAPI
LoadedImageProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_LOADED_IMAGE_PROTOCOL  *LoadedImage;
  EFI_STATUS                 Status;
  CHAR16                     *RetVal;
  CHAR16                     *Temp;
  CHAR16                     *FileName;
  CHAR8                      *PdbFileName;
  CHAR16                     *FilePath;
  CHAR16                     *CodeType;
  CHAR16                     *DataType;

  Status = gBS->OpenProtocol (
                  TheHandle,
                  &gEfiLoadedImageProtocolGuid,
                  (VOID **)&LoadedImage,
                  gImageHandle,
                  NULL,
                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
                  );

  if (EFI_ERROR (Status)) {
    return NULL;
  }

  FileName = FindLoadedImageFileName (LoadedImage);
  FilePath = ConvertDevicePathToText (LoadedImage->FilePath, TRUE, TRUE);
  if (!Verbose) {
    if (FileName == NULL) {
      FileName = FilePath;
    } else {
      SHELL_FREE_NON_NULL (FilePath);
    }

    return FileName;
  }

  HandleParsingHiiInit ();
  RetVal = NULL;
  if (FileName != NULL) {
    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_LI_DUMP_NAME), NULL);

    if (Temp != NULL) {
      RetVal = CatSPrint (NULL, Temp, FileName);
    }

    SHELL_FREE_NON_NULL (Temp);
    SHELL_FREE_NON_NULL (FileName);
  }

  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_LI_DUMP_MAIN), NULL);
  if (Temp == NULL) {
    return NULL;
  }

  PdbFileName = PeCoffLoaderGetPdbPointer (LoadedImage->ImageBase);
  DataType    = ConvertMemoryType (LoadedImage->ImageDataType);
  CodeType    = ConvertMemoryType (LoadedImage->ImageCodeType);

  RetVal = CatSPrint (
             RetVal,
             Temp,
             LoadedImage->Revision,
             LoadedImage->ParentHandle,
             LoadedImage->SystemTable,
             LoadedImage->DeviceHandle,
             FilePath,
             PdbFileName,
             LoadedImage->LoadOptionsSize,
             LoadedImage->LoadOptions,
             LoadedImage->ImageBase,
             LoadedImage->ImageSize,
             CodeType,
             DataType,
             LoadedImage->Unload
             );

  SHELL_FREE_NON_NULL (Temp);
  SHELL_FREE_NON_NULL (FilePath);
  SHELL_FREE_NON_NULL (CodeType);
  SHELL_FREE_NON_NULL (DataType);

  return RetVal;
}

/**
  Function to dump information about GOP.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has LoadedImage installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A poitner to a string containing the information.
**/
CHAR16 *
EFIAPI
GraphicsOutputProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_GRAPHICS_OUTPUT_PROTOCOL          *GraphicsOutput;
  EFI_STATUS                            Status;
  CHAR16                                *RetVal;
  CHAR16                                *Temp;
  CHAR16                                *Fmt;
  CHAR16                                *TempRetVal;
  UINTN                                 GopInfoSize;
  UINT32                                Mode;
  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *GopInfo;

  if (!Verbose) {
    return (CatSPrint (NULL, L"GraphicsOutput"));
  }

  HandleParsingHiiInit ();

  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GOP_DUMP_MAIN), NULL);
  if (Temp == NULL) {
    return NULL;
  }

  Status = gBS->OpenProtocol (
                  TheHandle,
                  &gEfiGraphicsOutputProtocolGuid,
                  (VOID **)&GraphicsOutput,
                  gImageHandle,
                  NULL,
                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
                  );

  if (EFI_ERROR (Status)) {
    SHELL_FREE_NON_NULL (Temp);
    return NULL;
  }

  Fmt = ConvertPixelFormat (GraphicsOutput->Mode->Info->PixelFormat);

  RetVal = CatSPrint (
             NULL,
             Temp,
             GraphicsOutput->Mode->MaxMode,
             GraphicsOutput->Mode->Mode,
             GraphicsOutput->Mode->FrameBufferBase,
             (UINT64)GraphicsOutput->Mode->FrameBufferSize,
             (UINT64)GraphicsOutput->Mode->SizeOfInfo,
             GraphicsOutput->Mode->Info->Version,
             GraphicsOutput->Mode->Info->HorizontalResolution,
             GraphicsOutput->Mode->Info->VerticalResolution,
             Fmt,
             GraphicsOutput->Mode->Info->PixelsPerScanLine,
             GraphicsOutput->Mode->Info->PixelFormat != PixelBitMask ? 0 : GraphicsOutput->Mode->Info->PixelInformation.RedMask,
             GraphicsOutput->Mode->Info->PixelFormat != PixelBitMask ? 0 : GraphicsOutput->Mode->Info->PixelInformation.GreenMask,
             GraphicsOutput->Mode->Info->PixelFormat != PixelBitMask ? 0 : GraphicsOutput->Mode->Info->PixelInformation.BlueMask
             );

  SHELL_FREE_NON_NULL (Temp);

  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GOP_RES_LIST_MAIN), NULL);
  if (Temp == NULL) {
    SHELL_FREE_NON_NULL (RetVal);
    goto EXIT;
  }

  TempRetVal = CatSPrint (RetVal, Temp);
  SHELL_FREE_NON_NULL (RetVal);
  if (TempRetVal == NULL) {
    goto EXIT;
  }

  RetVal = TempRetVal;
  SHELL_FREE_NON_NULL (Temp);

  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GOP_RES_LIST_ENTRY), NULL);
  if (Temp == NULL) {
    SHELL_FREE_NON_NULL (RetVal);
    goto EXIT;
  }

  for (Mode = 0; Mode < GraphicsOutput->Mode->MaxMode; Mode++) {
    Status = GraphicsOutput->QueryMode (
                               GraphicsOutput,
                               Mode,
                               &GopInfoSize,
                               &GopInfo
                               );
    if (EFI_ERROR (Status)) {
      continue;
    }

    TempRetVal = CatSPrint (
                   RetVal,
                   Temp,
                   Mode,
                   GopInfo->HorizontalResolution,
                   GopInfo->VerticalResolution
                   );

    SHELL_FREE_NON_NULL (GopInfo);
    SHELL_FREE_NON_NULL (RetVal);
    RetVal = TempRetVal;
  }

EXIT:
  SHELL_FREE_NON_NULL (Temp);
  SHELL_FREE_NON_NULL (Fmt);

  return RetVal;
}

/**
  Function to dump information about EDID Discovered Protocol.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has LoadedImage installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A pointer to a string containing the information.
**/
CHAR16 *
EFIAPI
EdidDiscoveredProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_EDID_DISCOVERED_PROTOCOL  *EdidDiscovered;
  EFI_STATUS                    Status;
  CHAR16                        *RetVal;
  CHAR16                        *Temp;
  CHAR16                        *TempRetVal;

  if (!Verbose) {
    return (CatSPrint (NULL, L"EDIDDiscovered"));
  }

  Status = gBS->OpenProtocol (
                  TheHandle,
                  &gEfiEdidDiscoveredProtocolGuid,
                  (VOID **)&EdidDiscovered,
                  NULL,
                  NULL,
                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
                  );

  if (EFI_ERROR (Status)) {
    return NULL;
  }

  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_DISCOVERED_MAIN), NULL);
  if (Temp == NULL) {
    return NULL;
  }

  RetVal = CatSPrint (NULL, Temp, EdidDiscovered->SizeOfEdid);
  SHELL_FREE_NON_NULL (Temp);

  if (EdidDiscovered->SizeOfEdid != 0) {
    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_DISCOVERED_DATA), NULL);
    if (Temp == NULL) {
      SHELL_FREE_NON_NULL (RetVal);
      return NULL;
    }

    TempRetVal = CatSPrint (RetVal, Temp);
    SHELL_FREE_NON_NULL (RetVal);
    RetVal = TempRetVal;

    TempRetVal = CatSDumpHex (RetVal, 4, 0, EdidDiscovered->SizeOfEdid, EdidDiscovered->Edid);
    RetVal     = TempRetVal;
  }

  return RetVal;
}

/**
  Function to dump information about EDID Active Protocol.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has LoadedImage installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A pointer to a string containing the information.
**/
CHAR16 *
EFIAPI
EdidActiveProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_EDID_ACTIVE_PROTOCOL  *EdidActive;
  EFI_STATUS                Status;
  CHAR16                    *RetVal;
  CHAR16                    *Temp;
  CHAR16                    *TempRetVal;

  if (!Verbose) {
    return (CatSPrint (NULL, L"EDIDActive"));
  }

  Status = gBS->OpenProtocol (
                  TheHandle,
                  &gEfiEdidActiveProtocolGuid,
                  (VOID **)&EdidActive,
                  NULL,
                  NULL,
                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
                  );

  if (EFI_ERROR (Status)) {
    return NULL;
  }

  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_ACTIVE_MAIN), NULL);
  if (Temp == NULL) {
    return NULL;
  }

  RetVal = CatSPrint (NULL, Temp, EdidActive->SizeOfEdid);
  SHELL_FREE_NON_NULL (Temp);

  if (EdidActive->SizeOfEdid != 0) {
    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_EDID_ACTIVE_DATA), NULL);
    if (Temp == NULL) {
      SHELL_FREE_NON_NULL (RetVal);
      return NULL;
    }

    TempRetVal = CatSPrint (RetVal, Temp);
    SHELL_FREE_NON_NULL (RetVal);
    RetVal = TempRetVal;

    TempRetVal = CatSDumpHex (RetVal, 4, 0, EdidActive->SizeOfEdid, EdidActive->Edid);
    RetVal     = TempRetVal;
  }

  return RetVal;
}

/**
  Function to dump information about PciRootBridgeIo.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has PciRootBridgeIo installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A poitner to a string containing the information.
**/
CHAR16 *
EFIAPI
PciRootBridgeIoDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL    *PciRootBridgeIo;
  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR  *Configuration;
  UINT64                             Supports;
  UINT64                             Attributes;
  CHAR16                             *Temp;
  CHAR16                             *Temp2;
  CHAR16                             *RetVal;
  EFI_STATUS                         Status;

  RetVal = NULL;

  if (!Verbose) {
    return (CatSPrint (NULL, L"PciRootBridgeIo"));
  }

  HandleParsingHiiInit ();

  Status = gBS->HandleProtocol (
                  TheHandle,
                  &gEfiPciRootBridgeIoProtocolGuid,
                  (VOID **)&PciRootBridgeIo
                  );

  if (EFI_ERROR (Status)) {
    return NULL;
  }

  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_PH), NULL);
  if (Temp == NULL) {
    return NULL;
  }

  Temp2 = CatSPrint (NULL, Temp, PciRootBridgeIo->ParentHandle);
  FreePool (Temp);
  RetVal = Temp2;
  Temp2  = NULL;

  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_SEG), NULL);
  if (Temp == NULL) {
    SHELL_FREE_NON_NULL (RetVal);
    return NULL;
  }

  Temp2 = CatSPrint (RetVal, Temp, PciRootBridgeIo->SegmentNumber);
  FreePool (Temp);
  FreePool (RetVal);
  RetVal = Temp2;
  Temp2  = NULL;

  Supports   = 0;
  Attributes = 0;
  Status     = PciRootBridgeIo->GetAttributes (PciRootBridgeIo, &Supports, &Attributes);
  if (!EFI_ERROR (Status)) {
    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_ATT), NULL);
    if (Temp == NULL) {
      SHELL_FREE_NON_NULL (RetVal);
      return NULL;
    }

    Temp2 = CatSPrint (RetVal, Temp, Attributes);
    FreePool (Temp);
    FreePool (RetVal);
    RetVal = Temp2;
    Temp2  = NULL;

    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_SUPPORTS), NULL);
    if (Temp == NULL) {
      SHELL_FREE_NON_NULL (RetVal);
      return NULL;
    }

    Temp2 = CatSPrint (RetVal, Temp, Supports);
    FreePool (Temp);
    FreePool (RetVal);
    RetVal = Temp2;
    Temp2  = NULL;
  }

  Configuration = NULL;
  Status        = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **)&Configuration);
  if (!EFI_ERROR (Status) && (Configuration != NULL)) {
    Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_TITLE), NULL);
    if (Temp == NULL) {
      SHELL_FREE_NON_NULL (RetVal);
      return NULL;
    }

    Temp2 = CatSPrint (RetVal, Temp, Supports);
    FreePool (Temp);
    FreePool (RetVal);
    RetVal = Temp2;
    Temp2  = NULL;
    while (Configuration->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {
      Temp = NULL;
      switch (Configuration->ResType) {
        case ACPI_ADDRESS_SPACE_TYPE_MEM:
          Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_MEM), NULL);
          break;
        case ACPI_ADDRESS_SPACE_TYPE_IO:
          Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_IO), NULL);
          break;
        case ACPI_ADDRESS_SPACE_TYPE_BUS:
          Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIRB_DUMP_BUS), NULL);
          break;
      }

      if (Temp != NULL) {
        Temp2 = CatSPrint (RetVal, L"\r\n%s", Temp);
        FreePool (Temp);
        FreePool (RetVal);
        RetVal = Temp2;
        Temp2  = NULL;
      }

      Temp2 = CatSPrint (
                RetVal,
                L"%%H%02x    %016lx  %016lx  %02x%%N",
                Configuration->SpecificFlag,
                Configuration->AddrRangeMin,
                Configuration->AddrRangeMax,
                Configuration->AddrSpaceGranularity
                );
      FreePool (RetVal);
      RetVal = Temp2;
      Temp2  = NULL;
      Configuration++;
    }
  }

  return (RetVal);
}

/**
  Function to dump information about SimpleTextOut.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has SimpleTextOut installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A poitner to a string containing the information.
**/
CHAR16 *
EFIAPI
TxtOutProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *Dev;
  INTN                             Index;
  UINTN                            Col;
  UINTN                            Row;
  EFI_STATUS                       Status;
  CHAR16                           *RetVal;
  UINTN                            Size;
  CHAR16                           *Temp;
  UINTN                            NewSize;

  if (!Verbose) {
    return (NULL);
  }

  HandleParsingHiiInit ();

  RetVal = NULL;
  Size   = 0;

  Status = gBS->HandleProtocol (
                  TheHandle,
                  &gEfiSimpleTextOutProtocolGuid,
                  (VOID **)&Dev
                  );

  ASSERT_EFI_ERROR (Status);
  ASSERT (Dev != NULL && Dev->Mode != NULL);

  Size   = (Dev->Mode->MaxMode + 1) * 80;
  RetVal = AllocateZeroPool (Size);

  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_TXT_OUT_DUMP_HEADER), NULL);
  if (Temp != NULL) {
    UnicodeSPrint (RetVal, Size, Temp, Dev, Dev->Mode->Attribute);
    FreePool (Temp);
  }

  //
  // Dump TextOut Info
  //
  Temp = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_TXT_OUT_DUMP_LINE), NULL);
  for (Index = 0; Index < Dev->Mode->MaxMode; Index++) {
    Status  = Dev->QueryMode (Dev, Index, &Col, &Row);
    NewSize = Size - StrSize (RetVal);
    UnicodeSPrint (
      RetVal + StrLen (RetVal),
      NewSize,
      Temp == NULL ? L"" : Temp,
      Index == Dev->Mode->Mode ? L'*' : L' ',
      Index,
      !EFI_ERROR (Status) ? (INTN)Col : -1,
      !EFI_ERROR (Status) ? (INTN)Row : -1
      );
  }

  FreePool (Temp);
  return (RetVal);
}

STATIC CONST UINTN  VersionStringSize = 60;

/**
  Function to dump information about EfiDriverSupportedEfiVersion protocol.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has the protocol installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A poitner to a string containing the information.
**/
CHAR16 *
EFIAPI
DriverEfiVersionProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL  *DriverEfiVersion;
  EFI_STATUS                                 Status;
  CHAR16                                     *RetVal;

  Status = gBS->HandleProtocol (
                  TheHandle,
                  &gEfiDriverSupportedEfiVersionProtocolGuid,
                  (VOID **)&DriverEfiVersion
                  );

  ASSERT_EFI_ERROR (Status);

  RetVal = AllocateZeroPool (VersionStringSize);
  if (RetVal != NULL) {
    UnicodeSPrint (RetVal, VersionStringSize, L"0x%08x", DriverEfiVersion->FirmwareVersion);
  }

  return (RetVal);
}

/**
  Function to convert device path to string.

  This will allocate the return buffer from boot services pool.

  @param[in] DevPath        Pointer to device path instance.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.
  @param[in] Length         Maximum allowed text length of the device path.

  @retval A pointer to a string containing the information.
**/
CHAR16 *
ConvertDevicePathToShortText (
  IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevPath,
  IN CONST BOOLEAN                   Verbose,
  IN CONST UINTN                     Length
  )
{
  CHAR16  *Temp;
  CHAR16  *Temp2;
  UINTN   Size;

  //
  // I cannot decide whether to allow shortcuts here (the second BOOLEAN on the next line)
  //
  Temp = ConvertDevicePathToText (DevPath, TRUE, TRUE);
  if (!Verbose && (Temp != NULL) && (StrLen (Temp) > Length)) {
    Temp2 = NULL;
    Size  = 0;
    Temp2 = StrnCatGrow (&Temp2, &Size, L"..", 0);
    Temp2 = StrnCatGrow (&Temp2, &Size, Temp+(StrLen (Temp) - (Length - 2)), 0);
    FreePool (Temp);
    Temp = Temp2;
  }

  return (Temp);
}

/**
  Function to dump protocol information.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has the protocol installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.
  @param[in] Protocol       The protocol is needed to dump.

  @retval A pointer to a string containing the information.
**/
STATIC CHAR16 *
EFIAPI
DevicePathProtocolDumpInformationEx (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose,
  IN       EFI_GUID    *Protocol
  )
{
  EFI_DEVICE_PATH_PROTOCOL  *DevPath;
  CHAR16                    *DevPathStr;
  CHAR16                    *DevPathStrTemp;
  UINTN                     Size;
  EFI_STATUS                Status;

  DevPathStr     = NULL;
  DevPathStrTemp = NULL;
  Status         = gBS->OpenProtocol (TheHandle, Protocol, (VOID **)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
  if (!EFI_ERROR (Status)) {
    DevPathStr = ConvertDevicePathToShortText (DevPath, Verbose, 30);
    if (Verbose) {
      Size           = StrSize (DevPathStr) + sizeof (CHAR16) * 2;
      DevPathStrTemp = AllocateZeroPool (Size);
      if (DevPathStrTemp != NULL) {
        StrnCatS (DevPathStrTemp, Size/sizeof (CHAR16), L"  ", 2);
        StrnCatS (DevPathStrTemp, Size/sizeof (CHAR16), DevPathStr, StrLen (DevPathStr));
      }

      FreePool (DevPathStr);
      DevPathStr = DevPathStrTemp;
    }

    gBS->CloseProtocol (TheHandle, Protocol, gImageHandle, NULL);
  }

  return DevPathStr;
}

/**
  Function to dump information about DevicePath protocol.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has the protocol installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A pointer to a string containing the information.
**/
CHAR16 *
EFIAPI
DevicePathProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  return DevicePathProtocolDumpInformationEx (TheHandle, Verbose, &gEfiDevicePathProtocolGuid);
}

/**
  Function to dump information about LoadedImageDevicePath protocol.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has the protocol installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A pointer to a string containing the information.
**/
CHAR16 *
EFIAPI
LoadedImageDevicePathProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  return DevicePathProtocolDumpInformationEx (TheHandle, Verbose, &gEfiLoadedImageDevicePathProtocolGuid);
}

/**
  Function to dump information about BusSpecificDriverOverride protocol.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has the protocol installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A pointer to a string containing the information.
**/
CHAR16 *
EFIAPI
BusSpecificDriverOverrideProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_STATUS                                 Status;
  CHAR16                                     *GetString;
  CHAR16                                     *RetVal;
  CHAR16                                     *TempRetVal;
  EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL  *BusSpecificDriverOverride;
  EFI_LOADED_IMAGE_PROTOCOL                  *LoadedImage;
  EFI_HANDLE                                 ImageHandle;
  UINTN                                      Size;

  if (!Verbose) {
    return NULL;
  }

  Size        = 0;
  GetString   = NULL;
  RetVal      = NULL;
  TempRetVal  = NULL;
  ImageHandle = 0;

  Status = gBS->OpenProtocol (
                  TheHandle,
                  &gEfiBusSpecificDriverOverrideProtocolGuid,
                  (VOID **)&BusSpecificDriverOverride,
                  gImageHandle,
                  NULL,
                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
                  );
  if (EFI_ERROR (Status)) {
    return NULL;
  }

  HandleParsingHiiInit ();
  GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_BSDO_DUMP_MAIN), NULL);
  if (GetString == NULL) {
    return NULL;
  }

  do {
    Status = BusSpecificDriverOverride->GetDriver (
                                          BusSpecificDriverOverride,
                                          &ImageHandle
                                          );
    if (!EFI_ERROR (Status)) {
      Status = gBS->HandleProtocol (
                      ImageHandle,
                      &gEfiLoadedImageProtocolGuid,
                      (VOID **)&LoadedImage
                      );
      if (!EFI_ERROR (Status)) {
        TempRetVal = CatSPrint (
                       TempRetVal,
                       GetString,
                       ConvertHandleToHandleIndex (ImageHandle),
                       ConvertDevicePathToText (LoadedImage->FilePath, TRUE, TRUE)
                       );
        StrnCatGrow (&RetVal, &Size, TempRetVal, 0);
        SHELL_FREE_NON_NULL (TempRetVal);
      }
    }
  } while (!EFI_ERROR (Status));

  SHELL_FREE_NON_NULL (GetString);
  return RetVal;
}

/**
  Function to dump information about BlockIo protocol.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has the protocol installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A pointer to a string containing the information.
**/
CHAR16 *
EFIAPI
BlockIoProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_STATUS             Status;
  EFI_BLOCK_IO_PROTOCOL  *BlockIo;
  EFI_BLOCK_IO_MEDIA     *BlockMedia;
  CHAR16                 *GetString;
  CHAR16                 *RetVal;

  if (!Verbose) {
    return NULL;
  }

  GetString = NULL;
  RetVal    = NULL;

  Status = gBS->OpenProtocol (
                  TheHandle,
                  &gEfiBlockIoProtocolGuid,
                  (VOID **)&BlockIo,
                  gImageHandle,
                  NULL,
                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
                  );
  if (EFI_ERROR (Status)) {
    return NULL;
  }

  BlockMedia = BlockIo->Media;
  //
  // Per spec:
  //   The function (ReadBlocks) must return EFI_NO_MEDIA or
  //   EFI_MEDIA_CHANGED even if LBA, BufferSize, or Buffer are invalid so the caller can probe
  //   for changes in media state.
  //
  BlockIo->ReadBlocks (
             BlockIo,
             BlockIo->Media->MediaId,
             0,
             0,
             NULL
             );

  HandleParsingHiiInit ();
  GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_BLOCKIO_INFO), NULL);
  if (GetString == NULL) {
    return NULL;
  }

  RetVal = CatSPrint (
             RetVal,
             GetString,
             BlockMedia->RemovableMedia ? L"Removable " : L"Fixed ",
             BlockMedia->MediaPresent ? L"" : L"not-present ",
             BlockMedia->MediaId,
             BlockMedia->BlockSize,
             BlockMedia->LastBlock,
             MultU64x32 (BlockMedia->LastBlock + 1, BlockMedia->BlockSize),
             BlockMedia->LogicalPartition ? L"partition" : L"raw",
             BlockMedia->ReadOnly ? L"ro" : L"rw",
             BlockMedia->WriteCaching ? L"cached" : L"!cached"
             );

  SHELL_FREE_NON_NULL (GetString);
  return RetVal;
}

/**
  Function to dump information about DebugSupport Protocol.

  @param[in] TheHandle      The handle that has the protocol installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A pointer to a string containing the information.
**/
CHAR16 *
EFIAPI
DebugSupportProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_STATUS                  Status;
  EFI_DEBUG_SUPPORT_PROTOCOL  *DebugSupport;
  CHAR16                      *GetString;
  CHAR16                      *RetVal;

  if (!Verbose) {
    return NULL;
  }

  GetString = NULL;
  RetVal    = NULL;
  Status    = gBS->OpenProtocol (
                     TheHandle,
                     &gEfiDebugSupportProtocolGuid,
                     (VOID **)&DebugSupport,
                     gImageHandle,
                     NULL,
                     EFI_OPEN_PROTOCOL_GET_PROTOCOL
                     );
  if (EFI_ERROR (Status)) {
    return NULL;
  }

  HandleParsingHiiInit ();
  GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_DEBUGSUPPORT_INFO), NULL);
  if (GetString == NULL) {
    return NULL;
  }

  //
  // Dump Debug support info
  //
  switch (DebugSupport->Isa) {
    case (IsaIa32):
      RetVal = CatSPrint (RetVal, GetString, L"IA-32");
      break;
    case (IsaIpf):
      RetVal = CatSPrint (RetVal, GetString, L"IPF");
      break;
    case (IsaEbc):
      RetVal = CatSPrint (RetVal, GetString, L"EBC");
      break;
    default:
      SHELL_FREE_NON_NULL (GetString);
      GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_DEBUGSUPPORT_UNKNOWN), NULL);
      RetVal    = GetString != NULL ? CatSPrint (RetVal, GetString, DebugSupport->Isa) : NULL;
      break;
  }

  SHELL_FREE_NON_NULL (GetString);
  return RetVal;
}

/**
  Function to dump information about PciIoProtocol.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has PciRootBridgeIo installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A poitner to a string containing the information.
**/
CHAR16 *
EFIAPI
PciIoProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_STATUS           Status;
  EFI_PCI_IO_PROTOCOL  *PciIo;
  PCI_TYPE00           Pci;
  UINTN                Segment;
  UINTN                Bus;
  UINTN                Device;
  UINTN                Function;
  UINTN                Index;
  CHAR16               *GetString;
  CHAR16               *TempRetVal;
  CHAR16               *RetVal;

  if (!Verbose) {
    return (NULL);
  }

  RetVal     = NULL;
  GetString  = NULL;
  TempRetVal = NULL;
  Status     = gBS->OpenProtocol (
                      TheHandle,
                      &gEfiPciIoProtocolGuid,
                      (VOID **)&PciIo,
                      gImageHandle,
                      NULL,
                      EFI_OPEN_PROTOCOL_GET_PROTOCOL
                      );

  if (EFI_ERROR (Status)) {
    return NULL;
  }

  PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0, sizeof (Pci), &Pci);
  PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);
  HandleParsingHiiInit ();
  GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PCIIO_DUMP_MAIN), NULL);
  if (GetString == NULL) {
    return NULL;
  }

  RetVal = CatSPrint (
             NULL,
             GetString,
             Segment,
             Bus,
             Device,
             Function,
             PciIo->RomSize,
             PciIo->RomImage,
             Pci.Hdr.VendorId,
             Pci.Hdr.DeviceId,
             Pci.Hdr.ClassCode[0],
             Pci.Hdr.ClassCode[1],
             Pci.Hdr.ClassCode[2]
             );
  for (Index = 0; Index < sizeof (Pci); Index++) {
    if ((Index % 0x10) == 0) {
      TempRetVal = CatSPrint (RetVal, L"\r\n       %02x", *((UINT8 *)(&Pci) + Index));
    } else {
      TempRetVal = CatSPrint (RetVal, L"%02x", *((UINT8 *)(&Pci) + Index));
    }

    FreePool (RetVal);
    RetVal     = TempRetVal;
    TempRetVal = NULL;
  }

  FreePool (GetString);
  return RetVal;
}

/**
  Function to dump information about UsbIoProtocol.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has PciRootBridgeIo installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A poitner to a string containing the information.
**/
CHAR16 *
EFIAPI
UsbIoProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_STATUS                    Status;
  EFI_USB_IO_PROTOCOL           *UsbIo;
  EFI_USB_INTERFACE_DESCRIPTOR  InterfaceDesc;
  CHAR16                        *GetString;
  CHAR16                        *RetVal;

  if (!Verbose) {
    return (NULL);
  }

  RetVal    = NULL;
  GetString = NULL;
  Status    = gBS->OpenProtocol (
                     TheHandle,
                     &gEfiUsbIoProtocolGuid,
                     (VOID **)&UsbIo,
                     gImageHandle,
                     NULL,
                     EFI_OPEN_PROTOCOL_GET_PROTOCOL
                     );

  if (EFI_ERROR (Status)) {
    return NULL;
  }

  UsbIo->UsbGetInterfaceDescriptor (UsbIo, &InterfaceDesc);
  HandleParsingHiiInit ();
  GetString = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_USBIO_DUMP_MAIN), NULL);
  if (GetString == NULL) {
    return NULL;
  }

  RetVal = CatSPrint (
             NULL,
             GetString,
             InterfaceDesc.InterfaceNumber,
             InterfaceDesc.InterfaceClass,
             InterfaceDesc.InterfaceSubClass,
             InterfaceDesc.InterfaceProtocol
             );

  FreePool (GetString);
  return RetVal;
}

/**
  Function to dump information about EfiAdapterInformation Protocol.

  @param[in] TheHandle      The handle that has the protocol installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A pointer to a string containing the information.
**/
CHAR16 *
EFIAPI
AdapterInformationDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_STATUS                        Status;
  EFI_ADAPTER_INFORMATION_PROTOCOL  *EfiAdptrInfoProtocol;
  UINTN                             InfoTypesBufferCount;
  UINTN                             GuidIndex;
  EFI_GUID                          *InfoTypesBuffer;
  CHAR16                            *GuidStr;
  CHAR16                            *TempStr;
  CHAR16                            *RetVal;
  CHAR16                            *TempRetVal;
  VOID                              *InformationBlock;
  UINTN                             InformationBlockSize;

  if (!Verbose) {
    return (CatSPrint (NULL, L"AdapterInfo"));
  }

  InfoTypesBuffer  = NULL;
  InformationBlock = NULL;

  Status = gBS->OpenProtocol (
                  (EFI_HANDLE)(TheHandle),
                  &gEfiAdapterInformationProtocolGuid,
                  (VOID **)&EfiAdptrInfoProtocol,
                  NULL,
                  NULL,
                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
                  );

  if (EFI_ERROR (Status)) {
    return NULL;
  }

  //
  // Get a list of supported information types for this instance of the protocol.
  //
  Status = EfiAdptrInfoProtocol->GetSupportedTypes (
                                   EfiAdptrInfoProtocol,
                                   &InfoTypesBuffer,
                                   &InfoTypesBufferCount
                                   );
  RetVal = NULL;
  if (EFI_ERROR (Status)) {
    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GET_SUPP_TYPES_FAILED), NULL);
    if (TempStr != NULL) {
      RetVal = CatSPrint (NULL, TempStr, Status);
    } else {
      goto ERROR_EXIT;
    }
  } else {
    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_SUPP_TYPE_HEADER), NULL);
    if (TempStr == NULL) {
      goto ERROR_EXIT;
    }

    RetVal = CatSPrint (NULL, TempStr);
    SHELL_FREE_NON_NULL (TempStr);

    for (GuidIndex = 0; GuidIndex < InfoTypesBufferCount; GuidIndex++) {
      TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GUID_NUMBER), NULL);
      if (TempStr == NULL) {
        goto ERROR_EXIT;
      }

      TempRetVal = CatSPrint (RetVal, TempStr, (GuidIndex + 1), &InfoTypesBuffer[GuidIndex]);
      SHELL_FREE_NON_NULL (RetVal);
      RetVal = TempRetVal;
      SHELL_FREE_NON_NULL (TempStr);

      TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GUID_STRING), NULL);
      if (TempStr == NULL) {
        goto ERROR_EXIT;
      }

      if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoMediaStateGuid)) {
        TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoMediaStateGuid");
        SHELL_FREE_NON_NULL (RetVal);
        RetVal = TempRetVal;
      } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoNetworkBootGuid)) {
        TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoNetworkBootGuid");
        SHELL_FREE_NON_NULL (RetVal);
        RetVal = TempRetVal;
      } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoSanMacAddressGuid)) {
        TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoSanMacAddressGuid");
        SHELL_FREE_NON_NULL (RetVal);
        RetVal = TempRetVal;
      } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoUndiIpv6SupportGuid)) {
        TempRetVal = CatSPrint (RetVal, TempStr, L"gEfiAdapterInfoUndiIpv6SupportGuid");
        SHELL_FREE_NON_NULL (RetVal);
        RetVal = TempRetVal;
      } else {
        GuidStr = GetStringNameFromGuid (&InfoTypesBuffer[GuidIndex], NULL);
        if (GuidStr == NULL) {
          TempRetVal = CatSPrint (RetVal, TempStr, L"UnknownInfoType");
          SHELL_FREE_NON_NULL (RetVal);
          RetVal = TempRetVal;

          SHELL_FREE_NON_NULL (TempStr);
          SHELL_FREE_NON_NULL (GuidStr);
          //
          // So that we never have to pass this UnknownInfoType to the parsing function "GetInformation" service of AIP
          //
          continue;
        } else {
          TempRetVal = CatSPrint (RetVal, TempStr, GuidStr);
          SHELL_FREE_NON_NULL (RetVal);
          RetVal = TempRetVal;
          SHELL_FREE_NON_NULL (GuidStr);
        }
      }

      SHELL_FREE_NON_NULL (TempStr);

      Status = EfiAdptrInfoProtocol->GetInformation (
                                       EfiAdptrInfoProtocol,
                                       &InfoTypesBuffer[GuidIndex],
                                       &InformationBlock,
                                       &InformationBlockSize
                                       );

      if (EFI_ERROR (Status)) {
        TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_GETINFO_FAILED), NULL);
        if (TempStr == NULL) {
          goto ERROR_EXIT;
        }

        TempRetVal = CatSPrint (RetVal, TempStr, Status);
        SHELL_FREE_NON_NULL (RetVal);
        RetVal = TempRetVal;
      } else {
        if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoMediaStateGuid)) {
          TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_MEDIA_STATE), NULL);
          if (TempStr == NULL) {
            goto ERROR_EXIT;
          }

          TempRetVal = CatSPrint (
                         RetVal,
                         TempStr,
                         ((EFI_ADAPTER_INFO_MEDIA_STATE *)InformationBlock)->MediaState,
                         ((EFI_ADAPTER_INFO_MEDIA_STATE *)InformationBlock)->MediaState
                         );
          SHELL_FREE_NON_NULL (RetVal);
          RetVal = TempRetVal;
        } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoNetworkBootGuid)) {
          TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_NETWORK_BOOT_INFO), NULL);
          if (TempStr == NULL) {
            goto ERROR_EXIT;
          }

          TempRetVal = CatSPrint (
                         RetVal,
                         TempStr,
                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv4BootCapablity,
                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv6BootCapablity,
                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->FCoeBootCapablity,
                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->OffloadCapability,
                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiMpioCapability,
                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv4Boot,
                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->iScsiIpv6Boot,
                         ((EFI_ADAPTER_INFO_NETWORK_BOOT *)InformationBlock)->FCoeBoot
                         );
          SHELL_FREE_NON_NULL (RetVal);
          RetVal = TempRetVal;
        } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoSanMacAddressGuid) == TRUE) {
          TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_SAN_MAC_ADDRESS_INFO), NULL);
          if (TempStr == NULL) {
            goto ERROR_EXIT;
          }

          TempRetVal = CatSPrint (
                         RetVal,
                         TempStr,
                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[0],
                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[1],
                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[2],
                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[3],
                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[4],
                         ((EFI_ADAPTER_INFO_SAN_MAC_ADDRESS *)InformationBlock)->SanMacAddress.Addr[5]
                         );
          SHELL_FREE_NON_NULL (RetVal);
          RetVal = TempRetVal;
        } else if (CompareGuid (&InfoTypesBuffer[GuidIndex], &gEfiAdapterInfoUndiIpv6SupportGuid) == TRUE) {
          TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_UNDI_IPV6_INFO), NULL);
          if (TempStr == NULL) {
            goto ERROR_EXIT;
          }

          TempRetVal = CatSPrint (
                         RetVal,
                         TempStr,
                         ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT *)InformationBlock)->Ipv6Support
                         );
          SHELL_FREE_NON_NULL (RetVal);
          RetVal = TempRetVal;
        } else {
          TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_UNKNOWN_INFO_TYPE), NULL);
          if (TempStr == NULL) {
            goto ERROR_EXIT;
          }

          TempRetVal = CatSPrint (RetVal, TempStr, &InfoTypesBuffer[GuidIndex]);
          SHELL_FREE_NON_NULL (RetVal);
          RetVal = TempRetVal;
        }
      }

      SHELL_FREE_NON_NULL (TempStr);
      SHELL_FREE_NON_NULL (InformationBlock);
    }
  }

  SHELL_FREE_NON_NULL (InfoTypesBuffer);
  return RetVal;

ERROR_EXIT:
  SHELL_FREE_NON_NULL (RetVal);
  SHELL_FREE_NON_NULL (InfoTypesBuffer);
  SHELL_FREE_NON_NULL (InformationBlock);
  return NULL;
}

/**
  Function to dump information about EFI_FIRMWARE_MANAGEMENT_PROTOCOL Protocol.

  @param[in] TheHandle      The handle that has the protocol installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A pointer to a string containing the information.
**/
CHAR16 *
EFIAPI
FirmwareManagementDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_STATUS                        Status;
  EFI_FIRMWARE_MANAGEMENT_PROTOCOL  *EfiFwMgmtProtocol;
  EFI_FIRMWARE_IMAGE_DESCRIPTOR     *ImageInfo;
  EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1  *ImageInfoV1;
  EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2  *ImageInfoV2;
  UINT64                            AttributeSetting;
  UINTN                             ImageInfoSize;
  UINTN                             DescriptorSize;
  UINT32                            DescriptorVersion;
  UINT32                            PackageVersion;
  UINT8                             DescriptorCount;
  UINT8                             Index;
  UINT8                             Index1;
  UINT8                             ImageCount;
  CHAR16                            *PackageVersionName;
  CHAR16                            *TempStr;
  CHAR16                            *RetVal;
  CHAR16                            *TempRetVal;
  CHAR16                            *AttributeSettingStr;
  BOOLEAN                           Found;
  BOOLEAN                           AttributeSupported;

  //
  // Initialize local variables
  //
  ImageCount          = 0;
  ImageInfoSize       = 1;
  AttributeSetting    = 0;
  Found               = FALSE;
  AttributeSupported  = FALSE;
  ImageInfo           = NULL;
  ImageInfoV1         = NULL;
  ImageInfoV2         = NULL;
  PackageVersionName  = NULL;
  RetVal              = NULL;
  TempRetVal          = NULL;
  TempStr             = NULL;
  AttributeSettingStr = NULL;

  if (!Verbose) {
    return (CatSPrint (NULL, L"FirmwareManagement"));
  }

  Status = gBS->OpenProtocol (
                  (EFI_HANDLE)(TheHandle),
                  &gEfiFirmwareManagementProtocolGuid,
                  (VOID **)&EfiFwMgmtProtocol,
                  NULL,
                  NULL,
                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
                  );

  if (EFI_ERROR (Status)) {
    return NULL;
  }

  Status = EfiFwMgmtProtocol->GetImageInfo (
                                EfiFwMgmtProtocol,
                                &ImageInfoSize,
                                ImageInfo,
                                &DescriptorVersion,
                                &DescriptorCount,
                                &DescriptorSize,
                                &PackageVersion,
                                &PackageVersionName
                                );

  if (Status == EFI_BUFFER_TOO_SMALL) {
    ImageInfo = AllocateZeroPool (ImageInfoSize);

    if (ImageInfo == NULL) {
      Status = EFI_OUT_OF_RESOURCES;
    } else {
      Status = EfiFwMgmtProtocol->GetImageInfo (
                                    EfiFwMgmtProtocol,
                                    &ImageInfoSize,
                                    ImageInfo,
                                    &DescriptorVersion,
                                    &DescriptorCount,
                                    &DescriptorSize,
                                    &PackageVersion,
                                    &PackageVersionName
                                    );
    }
  }

  if (EFI_ERROR (Status)) {
    goto ERROR_EXIT;
  }

  //
  // Decode Image Descriptor data only if its version is supported
  //
  if (DescriptorVersion <= EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION) {
    if (ImageInfo == NULL) {
      goto ERROR_EXIT;
    }

    ImageInfoV1 = (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V1 *)ImageInfo;
    ImageInfoV2 = (EFI_FIRMWARE_IMAGE_DESCRIPTOR_V2 *)ImageInfo;

    //
    // Set ImageInfoSize in return buffer
    //
    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_IMAGE_INFO_SIZE), NULL);
    if (TempStr == NULL) {
      goto ERROR_EXIT;
    }

    RetVal = CatSPrint (NULL, TempStr, ImageInfoSize);
    SHELL_FREE_NON_NULL (TempStr);

    //
    // Set DescriptorVersion in return buffer
    //
    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_DESCRIPTOR_VERSION), NULL);
    if (TempStr == NULL) {
      goto ERROR_EXIT;
    }

    TempRetVal = CatSPrint (RetVal, TempStr, DescriptorVersion);
    SHELL_FREE_NON_NULL (RetVal);
    RetVal = TempRetVal;
    SHELL_FREE_NON_NULL (TempStr);

    //
    // Set DescriptorCount in return buffer
    //
    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_DESCRIPTOR_COUNT), NULL);
    if (TempStr == NULL) {
      goto ERROR_EXIT;
    }

    TempRetVal = CatSPrint (RetVal, TempStr, DescriptorCount);
    SHELL_FREE_NON_NULL (RetVal);
    RetVal = TempRetVal;
    SHELL_FREE_NON_NULL (TempStr);

    //
    // Set DescriptorSize in return buffer
    //
    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_DESCRIPTOR_SIZE), NULL);
    if (TempStr == NULL) {
      goto ERROR_EXIT;
    }

    TempRetVal = CatSPrint (RetVal, TempStr, DescriptorSize);
    SHELL_FREE_NON_NULL (RetVal);
    RetVal = TempRetVal;
    SHELL_FREE_NON_NULL (TempStr);

    //
    // Set PackageVersion in return buffer
    //
    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_PACKAGE_VERSION), NULL);
    if (TempStr == NULL) {
      goto ERROR_EXIT;
    }

    TempRetVal = CatSPrint (RetVal, TempStr, PackageVersion);
    SHELL_FREE_NON_NULL (RetVal);
    RetVal = TempRetVal;
    SHELL_FREE_NON_NULL (TempStr);

    //
    // Set PackageVersionName in return buffer
    //
    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_PACKAGE_VERSION_NAME), NULL);
    if (TempStr == NULL) {
      goto ERROR_EXIT;
    }

    TempRetVal = CatSPrint (RetVal, TempStr, PackageVersionName);
    SHELL_FREE_NON_NULL (RetVal);
    RetVal = TempRetVal;
    SHELL_FREE_NON_NULL (TempStr);

    for (Index = 0; Index < DescriptorCount; Index++) {
      //
      // First check if Attribute is supported
      // and generate a string for AttributeSetting field
      //
      SHELL_FREE_NON_NULL (AttributeSettingStr);
      AttributeSupported = FALSE;
      AttributeSetting   = 0;
      if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {
        if (ImageInfoV1[Index].AttributesSupported != 0x0) {
          AttributeSupported = TRUE;
          AttributeSetting   = ImageInfoV1[Index].AttributesSetting;
        }
      } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {
        if (ImageInfoV2[Index].AttributesSupported != 0x0) {
          AttributeSupported = TRUE;
          AttributeSetting   = ImageInfoV2[Index].AttributesSetting;
        }
      } else {
        if (ImageInfo[Index].AttributesSupported != 0x0) {
          AttributeSupported = TRUE;
          AttributeSetting   = ImageInfo[Index].AttributesSetting;
        }
      }

      if (!AttributeSupported) {
        AttributeSettingStr = CatSPrint (NULL, L"None");
      } else {
        AttributeSettingStr = CatSPrint (NULL, L"(");

        if ((AttributeSetting & IMAGE_ATTRIBUTE_IMAGE_UPDATABLE) != 0x0) {
          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_IMAGE_UPDATABLE");
          SHELL_FREE_NON_NULL (AttributeSettingStr);
          AttributeSettingStr = TempRetVal;
        }

        if ((AttributeSetting & IMAGE_ATTRIBUTE_RESET_REQUIRED) != 0x0) {
          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_RESET_REQUIRED");
          SHELL_FREE_NON_NULL (AttributeSettingStr);
          AttributeSettingStr = TempRetVal;
        }

        if ((AttributeSetting & IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED) != 0x0) {
          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED");
          SHELL_FREE_NON_NULL (AttributeSettingStr);
          AttributeSettingStr = TempRetVal;
        }

        if ((AttributeSetting & IMAGE_ATTRIBUTE_IN_USE) != 0x0) {
          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_IN_USE");
          SHELL_FREE_NON_NULL (AttributeSettingStr);
          AttributeSettingStr = TempRetVal;
        }

        if ((AttributeSetting & IMAGE_ATTRIBUTE_UEFI_IMAGE) != 0x0) {
          TempRetVal = CatSPrint (AttributeSettingStr, L" IMAGE_ATTRIBUTE_UEFI_IMAGE");
          SHELL_FREE_NON_NULL (AttributeSettingStr);
          AttributeSettingStr = TempRetVal;
        }

        TempRetVal = CatSPrint (AttributeSettingStr, L" )");
        SHELL_FREE_NON_NULL (AttributeSettingStr);
        AttributeSettingStr = TempRetVal;
      }

      if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {
        if (ImageInfoV1[Index].ImageIndex != 0x0) {
          ImageCount++;
        }

        TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_IMAGE_DESCRIPTOR_INFO_V1), NULL);
        if (TempStr == NULL) {
          goto ERROR_EXIT;
        }

        TempRetVal = CatSPrint (
                       RetVal,
                       TempStr,
                       Index,
                       ImageInfoV1[Index].ImageIndex,
                       &ImageInfoV1[Index].ImageTypeId,
                       ImageInfoV1[Index].ImageId,
                       ImageInfoV1[Index].ImageIdName,
                       ImageInfoV1[Index].Version,
                       ImageInfoV1[Index].VersionName,
                       ImageInfoV1[Index].Size,
                       ImageInfoV1[Index].AttributesSupported,
                       AttributeSettingStr,
                       ImageInfoV1[Index].Compatibilities
                       );
        SHELL_FREE_NON_NULL (RetVal);
        RetVal = TempRetVal;
        SHELL_FREE_NON_NULL (TempStr);
      } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {
        if (ImageInfoV2[Index].ImageIndex != 0x0) {
          ImageCount++;
        }

        TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_IMAGE_DESCRIPTOR_INFO_V2), NULL);
        if (TempStr == NULL) {
          goto ERROR_EXIT;
        }

        TempRetVal = CatSPrint (
                       RetVal,
                       TempStr,
                       Index,
                       ImageInfoV2[Index].ImageIndex,
                       &ImageInfoV2[Index].ImageTypeId,
                       ImageInfoV2[Index].ImageId,
                       ImageInfoV2[Index].ImageIdName,
                       ImageInfoV2[Index].Version,
                       ImageInfoV2[Index].VersionName,
                       ImageInfoV2[Index].Size,
                       ImageInfoV2[Index].AttributesSupported,
                       AttributeSettingStr,
                       ImageInfoV2[Index].Compatibilities,
                       ImageInfoV2[Index].LowestSupportedImageVersion
                       );
        SHELL_FREE_NON_NULL (RetVal);
        RetVal = TempRetVal;
        SHELL_FREE_NON_NULL (TempStr);
      } else {
        if (ImageInfo[Index].ImageIndex != 0x0) {
          ImageCount++;
        }

        TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_IMAGE_DESCRIPTOR_INFO), NULL);
        if (TempStr == NULL) {
          goto ERROR_EXIT;
        }

        TempRetVal = CatSPrint (
                       RetVal,
                       TempStr,
                       Index,
                       ImageInfo[Index].ImageIndex,
                       &ImageInfo[Index].ImageTypeId,
                       ImageInfo[Index].ImageId,
                       ImageInfo[Index].ImageIdName,
                       ImageInfo[Index].Version,
                       ImageInfo[Index].VersionName,
                       ImageInfo[Index].Size,
                       ImageInfo[Index].AttributesSupported,
                       AttributeSettingStr,
                       ImageInfo[Index].Compatibilities,
                       ImageInfo[Index].LowestSupportedImageVersion,
                       ImageInfo[Index].LastAttemptVersion,
                       ImageInfo[Index].LastAttemptStatus,
                       ImageInfo[Index].HardwareInstance
                       );
        SHELL_FREE_NON_NULL (RetVal);
        RetVal = TempRetVal;
        SHELL_FREE_NON_NULL (TempStr);
      }
    }
  }

  if (ImageCount > 0) {
    for (Index = 0; Index < DescriptorCount; Index++) {
      for (Index1 = Index+1; Index1 < DescriptorCount; Index1++) {
        if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V1) {
          if (ImageInfoV1[Index].ImageId == ImageInfoV1[Index1].ImageId) {
            Found = TRUE;
            //
            // At least one match found indicating presense of non unique ImageId values so no more comparisons needed
            //
            goto ENDLOOP;
          }
        } else if (DescriptorVersion == EFI_FIRMWARE_IMAGE_DESCRIPTOR_VERSION_V2) {
          if (ImageInfoV2[Index].ImageId == ImageInfoV2[Index1].ImageId) {
            Found = TRUE;
            //
            // At least one match found indicating presense of non unique ImageId values so no more comparisons needed
            //
            goto ENDLOOP;
          }
        } else {
          if (ImageInfo[Index].ImageId == ImageInfo[Index1].ImageId) {
            Found = TRUE;
            //
            // At least one match found indicating presense of non unique ImageId values so no more comparisons needed
            //
            goto ENDLOOP;
          }
        }
      }
    }
  }

ENDLOOP:
  //
  // Check if ImageId with duplicate value was found
  //
  if (Found) {
    TempStr = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_FMP_IMAGEID_NON_UNIQUE), NULL);
    if (TempStr == NULL) {
      goto ERROR_EXIT;
    }

    TempRetVal = CatSPrint (RetVal, TempStr);
    SHELL_FREE_NON_NULL (RetVal);
    RetVal = TempRetVal;
    SHELL_FREE_NON_NULL (TempStr);
  }

  SHELL_FREE_NON_NULL (ImageInfo);
  SHELL_FREE_NON_NULL (PackageVersionName);
  SHELL_FREE_NON_NULL (AttributeSettingStr);

  return RetVal;

ERROR_EXIT:
  SHELL_FREE_NON_NULL (RetVal);
  SHELL_FREE_NON_NULL (ImageInfo);
  SHELL_FREE_NON_NULL (PackageVersionName);
  SHELL_FREE_NON_NULL (AttributeSettingStr);

  return NULL;
}

/**
  Function to dump information about Partition Information protocol.

  This will allocate the return buffer from boot services pool.

  @param[in] TheHandle      The handle that has the protocol installed.
  @param[in] Verbose        TRUE for additional information, FALSE otherwise.

  @retval A pointer to a string containing the information.
**/
CHAR16 *
EFIAPI
PartitionInfoProtocolDumpInformation (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST BOOLEAN     Verbose
  )
{
  EFI_STATUS                   Status;
  EFI_PARTITION_INFO_PROTOCOL  *PartitionInfo;
  CHAR16                       *PartitionType;
  CHAR16                       *EfiSystemPartition;
  CHAR16                       *RetVal;

  if (!Verbose) {
    return NULL;
  }

  Status = gBS->OpenProtocol (
                  TheHandle,
                  &gEfiPartitionInfoProtocolGuid,
                  (VOID **)&PartitionInfo,
                  gImageHandle,
                  NULL,
                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
                  );
  if (EFI_ERROR (Status)) {
    return NULL;
  }

  HandleParsingHiiInit ();

  switch (PartitionInfo->Type) {
    case PARTITION_TYPE_OTHER:
      PartitionType = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PARTINFO_DUMP_TYPE_OTHER), NULL);
      break;
    case PARTITION_TYPE_MBR:
      PartitionType = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PARTINFO_DUMP_TYPE_MBR), NULL);
      break;
    case PARTITION_TYPE_GPT:
      PartitionType = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PARTINFO_DUMP_TYPE_GPT), NULL);
      break;
    default:
      PartitionType = NULL;
      break;
  }

  if (PartitionType == NULL) {
    return NULL;
  }

  if (PartitionInfo->System == 1) {
    EfiSystemPartition = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PARTINFO_DUMP_EFI_SYS_PART), NULL);
  } else {
    EfiSystemPartition = HiiGetString (mHandleParsingHiiHandle, STRING_TOKEN (STR_PARTINFO_DUMP_NOT_EFI_SYS_PART), NULL);
  }

  if (EfiSystemPartition == NULL) {
    SHELL_FREE_NON_NULL (PartitionType);
    return NULL;
  }

  RetVal = CatSPrint (
             NULL,
             L"%s\r\n%s",
             PartitionType,
             EfiSystemPartition
             );

  SHELL_FREE_NON_NULL (EfiSystemPartition);
  SHELL_FREE_NON_NULL (PartitionType);
  return RetVal;
}

//
// Put the information on the NT32 protocol GUIDs here so we are not dependant on the Nt32Pkg
//
#define LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID \
  { \
    0x58c518b1, 0x76f3, 0x11d4, { 0xbc, 0xea, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
  }

#define LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID \
  { \
    0x96eb4ad6, 0xa32a, 0x11d4, { 0xbc, 0xfd, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
  }

#define LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID \
  { \
    0xc95a93d, 0xa006, 0x11d4, { 0xbc, 0xfa, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
  }
STATIC CONST EFI_GUID  WinNtThunkProtocolGuid = LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID;
STATIC CONST EFI_GUID  WinNtIoProtocolGuid    = LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID;
STATIC CONST EFI_GUID  WinNtSerialPortGuid    = LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID;

//
// Deprecated protocols we dont want to link from IntelFrameworkModulePkg
//
#define LOCAL_EFI_ISA_IO_PROTOCOL_GUID \
  { \
  0x7ee2bd44, 0x3da0, 0x11d4, { 0x9a, 0x38, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } \
  }
#define LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID \
  { \
  0x64a892dc, 0x5561, 0x4536, { 0x92, 0xc7, 0x79, 0x9b, 0xfc, 0x18, 0x33, 0x55 } \
  }
STATIC CONST EFI_GUID  EfiIsaIoProtocolGuid   = LOCAL_EFI_ISA_IO_PROTOCOL_GUID;
STATIC CONST EFI_GUID  EfiIsaAcpiProtocolGuid = LOCAL_EFI_ISA_ACPI_PROTOCOL_GUID;

STATIC CONST GUID_INFO_BLOCK  mGuidStringListNT[] = {
  { STRING_TOKEN (STR_WINNT_THUNK),       (EFI_GUID *)&WinNtThunkProtocolGuid, NULL },
  { STRING_TOKEN (STR_WINNT_DRIVER_IO),   (EFI_GUID *)&WinNtIoProtocolGuid,    NULL },
  { STRING_TOKEN (STR_WINNT_SERIAL_PORT), (EFI_GUID *)&WinNtSerialPortGuid,    NULL },
  { 0,                                    NULL,                                NULL },
};

STATIC CONST GUID_INFO_BLOCK  mGuidStringList[] = {
  { STRING_TOKEN (STR_LOADED_IMAGE),        &gEfiLoadedImageProtocolGuid,                      LoadedImageProtocolDumpInformation               },
  { STRING_TOKEN (STR_DEVICE_PATH),         &gEfiDevicePathProtocolGuid,                       DevicePathProtocolDumpInformation                },
  { STRING_TOKEN (STR_IMAGE_PATH),          &gEfiLoadedImageDevicePathProtocolGuid,            LoadedImageDevicePathProtocolDumpInformation     },
  { STRING_TOKEN (STR_DEVICE_PATH_UTIL),    &gEfiDevicePathUtilitiesProtocolGuid,              NULL                                             },
  { STRING_TOKEN (STR_DEVICE_PATH_TXT),     &gEfiDevicePathToTextProtocolGuid,                 NULL                                             },
  { STRING_TOKEN (STR_DEVICE_PATH_FTXT),    &gEfiDevicePathFromTextProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_DEVICE_PATH_PC),      &gEfiPcAnsiGuid,                                   NULL                                             },
  { STRING_TOKEN (STR_DEVICE_PATH_VT100),   &gEfiVT100Guid,                                    NULL                                             },
  { STRING_TOKEN (STR_DEVICE_PATH_VT100P),  &gEfiVT100PlusGuid,                                NULL                                             },
  { STRING_TOKEN (STR_DEVICE_PATH_VTUTF8),  &gEfiVTUTF8Guid,                                   NULL                                             },
  { STRING_TOKEN (STR_DRIVER_BINDING),      &gEfiDriverBindingProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_PLATFORM_OVERRIDE),   &gEfiPlatformDriverOverrideProtocolGuid,           NULL                                             },
  { STRING_TOKEN (STR_BUS_OVERRIDE),        &gEfiBusSpecificDriverOverrideProtocolGuid,        BusSpecificDriverOverrideProtocolDumpInformation },
  { STRING_TOKEN (STR_DRIVER_DIAG),         &gEfiDriverDiagnosticsProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_DRIVER_DIAG2),        &gEfiDriverDiagnostics2ProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_DRIVER_CN),           &gEfiComponentNameProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_DRIVER_CN2),          &gEfiComponentName2ProtocolGuid,                   NULL                                             },
  { STRING_TOKEN (STR_PLAT_DRV_CFG),        &gEfiPlatformToDriverConfigurationProtocolGuid,    NULL                                             },
  { STRING_TOKEN (STR_DRIVER_VERSION),      &gEfiDriverSupportedEfiVersionProtocolGuid,        DriverEfiVersionProtocolDumpInformation          },
  { STRING_TOKEN (STR_TXT_IN),              &gEfiSimpleTextInProtocolGuid,                     NULL                                             },
  { STRING_TOKEN (STR_TXT_IN_EX),           &gEfiSimpleTextInputExProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_TXT_OUT),             &gEfiSimpleTextOutProtocolGuid,                    TxtOutProtocolDumpInformation                    },
  { STRING_TOKEN (STR_SIM_POINTER),         &gEfiSimplePointerProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_ABS_POINTER),         &gEfiAbsolutePointerProtocolGuid,                  NULL                                             },
  { STRING_TOKEN (STR_SERIAL_IO),           &gEfiSerialIoProtocolGuid,                         NULL                                             },
  { STRING_TOKEN (STR_GRAPHICS_OUTPUT),     &gEfiGraphicsOutputProtocolGuid,                   GraphicsOutputProtocolDumpInformation            },
  { STRING_TOKEN (STR_EDID_DISCOVERED),     &gEfiEdidDiscoveredProtocolGuid,                   EdidDiscoveredProtocolDumpInformation            },
  { STRING_TOKEN (STR_EDID_ACTIVE),         &gEfiEdidActiveProtocolGuid,                       EdidActiveProtocolDumpInformation                },
  { STRING_TOKEN (STR_EDID_OVERRIDE),       &gEfiEdidOverrideProtocolGuid,                     NULL                                             },
  { STRING_TOKEN (STR_CON_IN),              &gEfiConsoleInDeviceGuid,                          NULL                                             },
  { STRING_TOKEN (STR_CON_OUT),             &gEfiConsoleOutDeviceGuid,                         NULL                                             },
  { STRING_TOKEN (STR_STD_ERR),             &gEfiStandardErrorDeviceGuid,                      NULL                                             },
  { STRING_TOKEN (STR_LOAD_FILE),           &gEfiLoadFileProtocolGuid,                         NULL                                             },
  { STRING_TOKEN (STR_LOAD_FILE2),          &gEfiLoadFile2ProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_SIMPLE_FILE_SYS),     &gEfiSimpleFileSystemProtocolGuid,                 NULL                                             },
  { STRING_TOKEN (STR_TAPE_IO),             &gEfiTapeIoProtocolGuid,                           NULL                                             },
  { STRING_TOKEN (STR_DISK_IO),             &gEfiDiskIoProtocolGuid,                           NULL                                             },
  { STRING_TOKEN (STR_BLK_IO),              &gEfiBlockIoProtocolGuid,                          BlockIoProtocolDumpInformation                   },
  { STRING_TOKEN (STR_UC),                  &gEfiUnicodeCollationProtocolGuid,                 NULL                                             },
  { STRING_TOKEN (STR_UC2),                 &gEfiUnicodeCollation2ProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_PCIRB_IO),            &gEfiPciRootBridgeIoProtocolGuid,                  PciRootBridgeIoDumpInformation                   },
  { STRING_TOKEN (STR_PCI_IO),              &gEfiPciIoProtocolGuid,                            PciIoProtocolDumpInformation                     },
  { STRING_TOKEN (STR_SCSI_PT),             &gEfiScsiPassThruProtocolGuid,                     NULL                                             },
  { STRING_TOKEN (STR_SCSI_IO),             &gEfiScsiIoProtocolGuid,                           NULL                                             },
  { STRING_TOKEN (STR_SCSI_PT_EXT),         &gEfiExtScsiPassThruProtocolGuid,                  NULL                                             },
  { STRING_TOKEN (STR_ISCSI),               &gEfiIScsiInitiatorNameProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_USB_IO),              &gEfiUsbIoProtocolGuid,                            UsbIoProtocolDumpInformation                     },
  { STRING_TOKEN (STR_USB_HC),              &gEfiUsbHcProtocolGuid,                            NULL                                             },
  { STRING_TOKEN (STR_USB_HC2),             &gEfiUsb2HcProtocolGuid,                           NULL                                             },
  { STRING_TOKEN (STR_DEBUG_SUPPORT),       &gEfiDebugSupportProtocolGuid,                     DebugSupportProtocolDumpInformation              },
  { STRING_TOKEN (STR_DEBUG_PORT),          &gEfiDebugPortProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_DECOMPRESS),          &gEfiDecompressProtocolGuid,                       NULL                                             },
  { STRING_TOKEN (STR_ACPI_TABLE),          &gEfiAcpiTableProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_EBC_INTERPRETER),     &gEfiEbcProtocolGuid,                              NULL                                             },
  { STRING_TOKEN (STR_SNP),                 &gEfiSimpleNetworkProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_NII),                 &gEfiNetworkInterfaceIdentifierProtocolGuid,       NULL                                             },
  { STRING_TOKEN (STR_NII_31),              &gEfiNetworkInterfaceIdentifierProtocolGuid_31,    NULL                                             },
  { STRING_TOKEN (STR_PXE_BC),              &gEfiPxeBaseCodeProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_PXE_CB),              &gEfiPxeBaseCodeCallbackProtocolGuid,              NULL                                             },
  { STRING_TOKEN (STR_BIS),                 &gEfiBisProtocolGuid,                              NULL                                             },
  { STRING_TOKEN (STR_MNP_SB),              &gEfiManagedNetworkServiceBindingProtocolGuid,     NULL                                             },
  { STRING_TOKEN (STR_MNP),                 &gEfiManagedNetworkProtocolGuid,                   NULL                                             },
  { STRING_TOKEN (STR_ARP_SB),              &gEfiArpServiceBindingProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_ARP),                 &gEfiArpProtocolGuid,                              NULL                                             },
  { STRING_TOKEN (STR_DHCPV4_SB),           &gEfiDhcp4ServiceBindingProtocolGuid,              NULL                                             },
  { STRING_TOKEN (STR_DHCPV4),              &gEfiDhcp4ProtocolGuid,                            NULL                                             },
  { STRING_TOKEN (STR_TCPV4_SB),            &gEfiTcp4ServiceBindingProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_TCPV4),               &gEfiTcp4ProtocolGuid,                             NULL                                             },
  { STRING_TOKEN (STR_IPV4_SB),             &gEfiIp4ServiceBindingProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_IPV4),                &gEfiIp4ProtocolGuid,                              NULL                                             },
  { STRING_TOKEN (STR_IPV4_CFG),            &gEfiIp4ConfigProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_IPV4_CFG2),           &gEfiIp4Config2ProtocolGuid,                       NULL                                             },
  { STRING_TOKEN (STR_UDPV4_SB),            &gEfiUdp4ServiceBindingProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_UDPV4),               &gEfiUdp4ProtocolGuid,                             NULL                                             },
  { STRING_TOKEN (STR_MTFTPV4_SB),          &gEfiMtftp4ServiceBindingProtocolGuid,             NULL                                             },
  { STRING_TOKEN (STR_MTFTPV4),             &gEfiMtftp4ProtocolGuid,                           NULL                                             },
  { STRING_TOKEN (STR_AUTH_INFO),           &gEfiAuthenticationInfoProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_HASH_SB),             &gEfiHashServiceBindingProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_HASH),                &gEfiHashProtocolGuid,                             NULL                                             },
  { STRING_TOKEN (STR_HII_FONT),            &gEfiHiiFontProtocolGuid,                          NULL                                             },
  { STRING_TOKEN (STR_HII_STRING),          &gEfiHiiStringProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_HII_IMAGE),           &gEfiHiiImageProtocolGuid,                         NULL                                             },
  { STRING_TOKEN (STR_HII_DATABASE),        &gEfiHiiDatabaseProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_HII_CONFIG_ROUT),     &gEfiHiiConfigRoutingProtocolGuid,                 NULL                                             },
  { STRING_TOKEN (STR_HII_CONFIG_ACC),      &gEfiHiiConfigAccessProtocolGuid,                  NULL                                             },
  { STRING_TOKEN (STR_HII_FORM_BROWSER2),   &gEfiFormBrowser2ProtocolGuid,                     NULL                                             },
  { STRING_TOKEN (STR_DRIVER_FAM_OVERRIDE), &gEfiDriverFamilyOverrideProtocolGuid,             NULL                                             },
  { STRING_TOKEN (STR_PCD),                 &gPcdProtocolGuid,                                 NULL                                             },
  { STRING_TOKEN (STR_TCG),                 &gEfiTcgProtocolGuid,                              NULL                                             },
  { STRING_TOKEN (STR_HII_PACKAGE_LIST),    &gEfiHiiPackageListProtocolGuid,                   NULL                                             },

  //
  // the ones under this are deprecated by the current UEFI Spec, but may be found anyways...
  //
  { STRING_TOKEN (STR_SHELL_INTERFACE),     &gEfiShellInterfaceGuid,                           NULL                                             },
  { STRING_TOKEN (STR_SHELL_ENV2),          &gEfiShellEnvironment2Guid,                        NULL                                             },
  { STRING_TOKEN (STR_SHELL_ENV),           &gEfiShellEnvironment2Guid,                        NULL                                             },
  { STRING_TOKEN (STR_DEVICE_IO),           &gEfiDeviceIoProtocolGuid,                         NULL                                             },
  { STRING_TOKEN (STR_UGA_DRAW),            &gEfiUgaDrawProtocolGuid,                          NULL                                             },
  { STRING_TOKEN (STR_UGA_IO),              &gEfiUgaIoProtocolGuid,                            NULL                                             },
  { STRING_TOKEN (STR_ESP),                 &gEfiPartTypeSystemPartGuid,                       NULL                                             },
  { STRING_TOKEN (STR_GPT_NBR),             &gEfiPartTypeLegacyMbrGuid,                        NULL                                             },
  { STRING_TOKEN (STR_DRIVER_CONFIG),       &gEfiDriverConfigurationProtocolGuid,              NULL                                             },
  { STRING_TOKEN (STR_DRIVER_CONFIG2),      &gEfiDriverConfiguration2ProtocolGuid,             NULL                                             },

  //
  // these are using local (non-global) definitions to reduce package dependancy.
  //
  { STRING_TOKEN (STR_ISA_IO),              (EFI_GUID *)&EfiIsaIoProtocolGuid,                 NULL                                             },
  { STRING_TOKEN (STR_ISA_ACPI),            (EFI_GUID *)&EfiIsaAcpiProtocolGuid,               NULL                                             },

  //
  // the ones under this are GUID identified structs, not protocols
  //
  { STRING_TOKEN (STR_FILE_INFO),           &gEfiFileInfoGuid,                                 NULL                                             },
  { STRING_TOKEN (STR_FILE_SYS_INFO),       &gEfiFileSystemInfoGuid,                           NULL                                             },

  //
  // the ones under this are misc GUIDS.
  //
  { STRING_TOKEN (STR_EFI_GLOBAL_VARIABLE), &gEfiGlobalVariableGuid,                           NULL                                             },

  //
  // UEFI 2.2
  //
  { STRING_TOKEN (STR_IP6_SB),              &gEfiIp6ServiceBindingProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_IP6),                 &gEfiIp6ProtocolGuid,                              NULL                                             },
  { STRING_TOKEN (STR_IP6_CONFIG),          &gEfiIp6ConfigProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_MTFTP6_SB),           &gEfiMtftp6ServiceBindingProtocolGuid,             NULL                                             },
  { STRING_TOKEN (STR_MTFTP6),              &gEfiMtftp6ProtocolGuid,                           NULL                                             },
  { STRING_TOKEN (STR_DHCP6_SB),            &gEfiDhcp6ServiceBindingProtocolGuid,              NULL                                             },
  { STRING_TOKEN (STR_DHCP6),               &gEfiDhcp6ProtocolGuid,                            NULL                                             },
  { STRING_TOKEN (STR_UDP6_SB),             &gEfiUdp6ServiceBindingProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_UDP6),                &gEfiUdp6ProtocolGuid,                             NULL                                             },
  { STRING_TOKEN (STR_TCP6_SB),             &gEfiTcp6ServiceBindingProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_TCP6),                &gEfiTcp6ProtocolGuid,                             NULL                                             },
  { STRING_TOKEN (STR_VLAN_CONFIG),         &gEfiVlanConfigProtocolGuid,                       NULL                                             },
  { STRING_TOKEN (STR_EAP),                 &gEfiEapProtocolGuid,                              NULL                                             },
  { STRING_TOKEN (STR_EAP_MGMT),            &gEfiEapManagementProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_FTP4_SB),             &gEfiFtp4ServiceBindingProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_FTP4),                &gEfiFtp4ProtocolGuid,                             NULL                                             },
  { STRING_TOKEN (STR_IP_SEC_CONFIG),       &gEfiIpSecConfigProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_DH),                  &gEfiDriverHealthProtocolGuid,                     NULL                                             },
  { STRING_TOKEN (STR_DEF_IMG_LOAD),        &gEfiDeferredImageLoadProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_USER_CRED),           &gEfiUserCredentialProtocolGuid,                   NULL                                             },
  { STRING_TOKEN (STR_USER_MNGR),           &gEfiUserManagerProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_ATA_PASS_THRU),       &gEfiAtaPassThruProtocolGuid,                      NULL                                             },

  //
  // UEFI 2.3
  //
  { STRING_TOKEN (STR_FW_MGMT),             &gEfiFirmwareManagementProtocolGuid,               FirmwareManagementDumpInformation                },
  { STRING_TOKEN (STR_IP_SEC),              &gEfiIpSecProtocolGuid,                            NULL                                             },
  { STRING_TOKEN (STR_IP_SEC2),             &gEfiIpSec2ProtocolGuid,                           NULL                                             },

  //
  // UEFI 2.3.1
  //
  { STRING_TOKEN (STR_KMS),                 &gEfiKmsProtocolGuid,                              NULL                                             },
  { STRING_TOKEN (STR_BLK_IO2),             &gEfiBlockIo2ProtocolGuid,                         NULL                                             },
  { STRING_TOKEN (STR_SSC),                 &gEfiStorageSecurityCommandProtocolGuid,           NULL                                             },
  { STRING_TOKEN (STR_UCRED2),              &gEfiUserCredential2ProtocolGuid,                  NULL                                             },

  //
  // UEFI 2.4
  //
  { STRING_TOKEN (STR_DISK_IO2),            &gEfiDiskIo2ProtocolGuid,                          NULL                                             },
  { STRING_TOKEN (STR_ADAPTER_INFO),        &gEfiAdapterInformationProtocolGuid,               AdapterInformationDumpInformation                },

  //
  // UEFI2.5
  //
  { STRING_TOKEN (STR_TLS_SB),              &gEfiTlsServiceBindingProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_TLS),                 &gEfiTlsProtocolGuid,                              NULL                                             },
  { STRING_TOKEN (STR_TLS_CONFIG),          &gEfiTlsConfigurationProtocolGuid,                 NULL                                             },
  { STRING_TOKEN (STR_SUPPLICANT_SB),       &gEfiSupplicantServiceBindingProtocolGuid,         NULL                                             },
  { STRING_TOKEN (STR_SUPPLICANT),          &gEfiSupplicantProtocolGuid,                       NULL                                             },

  //
  // UEFI2.6
  //
  { STRING_TOKEN (STR_WIFI2),               &gEfiWiFi2ProtocolGuid,                            NULL                                             },
  { STRING_TOKEN (STR_RAMDISK),             &gEfiRamDiskProtocolGuid,                          NULL                                             },
  { STRING_TOKEN (STR_HII_ID),              &gEfiHiiImageDecoderProtocolGuid,                  NULL                                             },
  { STRING_TOKEN (STR_HII_IE),              &gEfiHiiImageExProtocolGuid,                       NULL                                             },
  { STRING_TOKEN (STR_SD_MPT),              &gEfiSdMmcPassThruProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_ERASE_BLOCK),         &gEfiEraseBlockProtocolGuid,                       NULL                                             },

  //
  // UEFI2.7
  //
  { STRING_TOKEN (STR_BLUETOOTH_ATTR),      &gEfiBluetoothAttributeProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_BLUETOOTH_ATTR_SB),   &gEfiBluetoothAttributeServiceBindingProtocolGuid, NULL                                             },
  { STRING_TOKEN (STR_BLUETOOTH_LE_CONFIG), &gEfiBluetoothLeConfigProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_UFS_DEV_CONFIG),      &gEfiUfsDeviceConfigProtocolGuid,                  NULL                                             },
  { STRING_TOKEN (STR_HTTP_BOOT_CALL),      &gEfiHttpBootCallbackProtocolGuid,                 NULL                                             },
  { STRING_TOKEN (STR_RESET_NOTI),          &gEfiResetNotificationProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_PARTITION_INFO),      &gEfiPartitionInfoProtocolGuid,                    PartitionInfoProtocolDumpInformation             },
  { STRING_TOKEN (STR_HII_POPUP),           &gEfiHiiPopupProtocolGuid,                         NULL                                             },

  //
  // UEFI 2.8
  //
  { STRING_TOKEN (STR_REST_EX),             &gEfiRestExProtocolGuid,                           NULL                                             },
  { STRING_TOKEN (STR_REDFISH_DISCOVER),    &gEfiRedfishDiscoverProtocolGuid,                  NULL                                             },

  //
  // PI Spec ones
  //
  { STRING_TOKEN (STR_IDE_CONT_INIT),       &gEfiIdeControllerInitProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_DISK_INFO),           &gEfiDiskInfoProtocolGuid,                         NULL                                             },

  //
  // PI Spec 1.0
  //
  { STRING_TOKEN (STR_BDS_ARCH),            &gEfiBdsArchProtocolGuid,                          NULL                                             },
  { STRING_TOKEN (STR_CPU_ARCH),            &gEfiCpuArchProtocolGuid,                          NULL                                             },
  { STRING_TOKEN (STR_MET_ARCH),            &gEfiMetronomeArchProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_MON_ARCH),            &gEfiMonotonicCounterArchProtocolGuid,             NULL                                             },
  { STRING_TOKEN (STR_RTC_ARCH),            &gEfiRealTimeClockArchProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_RESET_ARCH),          &gEfiResetArchProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_RT_ARCH),             &gEfiRuntimeArchProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_SEC_ARCH),            &gEfiSecurityArchProtocolGuid,                     NULL                                             },
  { STRING_TOKEN (STR_TIMER_ARCH),          &gEfiTimerArchProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_VAR_ARCH),            &gEfiVariableWriteArchProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_V_ARCH),              &gEfiVariableArchProtocolGuid,                     NULL                                             },
  { STRING_TOKEN (STR_SECP),                &gEfiSecurityPolicyProtocolGuid,                   NULL                                             },
  { STRING_TOKEN (STR_WDT_ARCH),            &gEfiWatchdogTimerArchProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_SCR),                 &gEfiStatusCodeRuntimeProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_SMB_HC),              &gEfiSmbusHcProtocolGuid,                          NULL                                             },
  { STRING_TOKEN (STR_FV_2),                &gEfiFirmwareVolume2ProtocolGuid,                  NULL                                             },
  { STRING_TOKEN (STR_FV_BLOCK),            &gEfiFirmwareVolumeBlockProtocolGuid,              NULL                                             },
  { STRING_TOKEN (STR_CAP_ARCH),            &gEfiCapsuleArchProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_MP_SERVICE),          &gEfiMpServiceProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_HBRAP),               &gEfiPciHostBridgeResourceAllocationProtocolGuid,  NULL                                             },
  { STRING_TOKEN (STR_PCIP),                &gEfiPciPlatformProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_PCIO),                &gEfiPciOverrideProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_PCIE),                &gEfiPciEnumerationCompleteProtocolGuid,           NULL                                             },
  { STRING_TOKEN (STR_IPCID),               &gEfiIncompatiblePciDeviceSupportProtocolGuid,     NULL                                             },
  { STRING_TOKEN (STR_PCIHPI),              &gEfiPciHotPlugInitProtocolGuid,                   NULL                                             },
  { STRING_TOKEN (STR_PCIHPR),              &gEfiPciHotPlugRequestProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_SMBIOS),              &gEfiSmbiosProtocolGuid,                           NULL                                             },
  { STRING_TOKEN (STR_S3_SAVE),             &gEfiS3SaveStateProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_S3_S_SMM),            &gEfiS3SmmSaveStateProtocolGuid,                   NULL                                             },
  { STRING_TOKEN (STR_RSC),                 &gEfiRscHandlerProtocolGuid,                       NULL                                             },
  { STRING_TOKEN (STR_S_RSC),               &gEfiSmmRscHandlerProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_ACPI_SDT),            &gEfiAcpiSdtProtocolGuid,                          NULL                                             },
  { STRING_TOKEN (STR_SIO),                 &gEfiSioProtocolGuid,                              NULL                                             },
  { STRING_TOKEN (STR_S_CPU2),              &gEfiSmmCpuIo2ProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_S_BASE2),             &gEfiSmmBase2ProtocolGuid,                         NULL                                             },
  { STRING_TOKEN (STR_S_ACC_2),             &gEfiSmmAccess2ProtocolGuid,                       NULL                                             },
  { STRING_TOKEN (STR_S_CON_2),             &gEfiSmmControl2ProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_S_CONFIG),            &gEfiSmmConfigurationProtocolGuid,                 NULL                                             },
  { STRING_TOKEN (STR_S_RTL),               &gEfiSmmReadyToLockProtocolGuid,                   NULL                                             },
  { STRING_TOKEN (STR_DS_RTL),              &gEfiDxeSmmReadyToLockProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_S_COMM),              &gEfiSmmCommunicationProtocolGuid,                 NULL                                             },
  { STRING_TOKEN (STR_S_STAT),              &gEfiSmmStatusCodeProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_S_CPU),               &gEfiSmmCpuProtocolGuid,                           NULL                                             },
  { STRING_TOKEN (STR_S_PCIRBIO),           &gEfiSmmPciRootBridgeIoProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_S_SWD),               &gEfiSmmSwDispatch2ProtocolGuid,                   NULL                                             },
  { STRING_TOKEN (STR_S_SXD),               &gEfiSmmSxDispatch2ProtocolGuid,                   NULL                                             },
  { STRING_TOKEN (STR_S_PTD2),              &gEfiSmmPeriodicTimerDispatch2ProtocolGuid,        NULL                                             },
  { STRING_TOKEN (STR_S_UD2),               &gEfiSmmUsbDispatch2ProtocolGuid,                  NULL                                             },
  { STRING_TOKEN (STR_S_GD2),               &gEfiSmmGpiDispatch2ProtocolGuid,                  NULL                                             },
  { STRING_TOKEN (STR_S_SBD2),              &gEfiSmmStandbyButtonDispatch2ProtocolGuid,        NULL                                             },
  { STRING_TOKEN (STR_S_PBD2),              &gEfiSmmPowerButtonDispatch2ProtocolGuid,          NULL                                             },
  { STRING_TOKEN (STR_S_ITD2),              &gEfiSmmIoTrapDispatch2ProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_PCD),                 &gEfiPcdProtocolGuid,                              NULL                                             },
  { STRING_TOKEN (STR_FVB2),                &gEfiFirmwareVolumeBlock2ProtocolGuid,             NULL                                             },
  { STRING_TOKEN (STR_CPUIO2),              &gEfiCpuIo2ProtocolGuid,                           NULL                                             },
  { STRING_TOKEN (STR_LEGACY_R2),           &gEfiLegacyRegion2ProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_S2ARCH),              &gEfiSecurity2ArchProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_EODXE),               &gEfiSmmEndOfDxeProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_ISAHC),               &gEfiIsaHcProtocolGuid,                            NULL                                             },
  { STRING_TOKEN (STR_ISAHC_B),             &gEfiIsaHcServiceBindingProtocolGuid,              NULL                                             },
  { STRING_TOKEN (STR_SIO_C),               &gEfiSioControlProtocolGuid,                       NULL                                             },
  { STRING_TOKEN (STR_GET_PCD),             &gEfiGetPcdInfoProtocolGuid,                       NULL                                             },
  { STRING_TOKEN (STR_I2C_M),               &gEfiI2cMasterProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_I2CIO),               &gEfiI2cIoProtocolGuid,                            NULL                                             },
  { STRING_TOKEN (STR_I2CEN),               &gEfiI2cEnumerateProtocolGuid,                     NULL                                             },
  { STRING_TOKEN (STR_I2C_H),               &gEfiI2cHostProtocolGuid,                          NULL                                             },
  { STRING_TOKEN (STR_I2C_BCM),             &gEfiI2cBusConfigurationManagementProtocolGuid,    NULL                                             },
  { STRING_TOKEN (STR_TCG2),                &gEfiTcg2ProtocolGuid,                             NULL                                             },
  { STRING_TOKEN (STR_TIMESTAMP),           &gEfiTimestampProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_RNG),                 &gEfiRngProtocolGuid,                              NULL                                             },
  { STRING_TOKEN (STR_NVMEPT),              &gEfiNvmExpressPassThruProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_H2_SB),               &gEfiHash2ServiceBindingProtocolGuid,              NULL                                             },
  { STRING_TOKEN (STR_HASH2),               &gEfiHash2ProtocolGuid,                            NULL                                             },
  { STRING_TOKEN (STR_BIO_C),               &gEfiBlockIoCryptoProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_SCR),                 &gEfiSmartCardReaderProtocolGuid,                  NULL                                             },
  { STRING_TOKEN (STR_SCE),                 &gEfiSmartCardEdgeProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_USB_FIO),             &gEfiUsbFunctionIoProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_BC_HC),               &gEfiBluetoothHcProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_BC_IO_SB),            &gEfiBluetoothIoServiceBindingProtocolGuid,        NULL                                             },
  { STRING_TOKEN (STR_BC_IO),               &gEfiBluetoothIoProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_BC_C),                &gEfiBluetoothConfigProtocolGuid,                  NULL                                             },
  { STRING_TOKEN (STR_REG_EXP),             &gEfiRegularExpressionProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_B_MGR_P),             &gEfiBootManagerPolicyProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_CKH),                 &gEfiConfigKeywordHandlerProtocolGuid,             NULL                                             },
  { STRING_TOKEN (STR_WIFI),                &gEfiWiFiProtocolGuid,                             NULL                                             },
  { STRING_TOKEN (STR_EAP_M),               &gEfiEapManagement2ProtocolGuid,                   NULL                                             },
  { STRING_TOKEN (STR_EAP_C),               &gEfiEapConfigurationProtocolGuid,                 NULL                                             },
  { STRING_TOKEN (STR_PKCS7),               &gEfiPkcs7VerifyProtocolGuid,                      NULL                                             },
  { STRING_TOKEN (STR_NET_DNS4_SB),         &gEfiDns4ServiceBindingProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_NET_DNS4),            &gEfiDns4ProtocolGuid,                             NULL                                             },
  { STRING_TOKEN (STR_NET_DNS6_SB),         &gEfiDns6ServiceBindingProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_NET_DNS6),            &gEfiDns6ProtocolGuid,                             NULL                                             },
  { STRING_TOKEN (STR_NET_HTTP_SB),         &gEfiHttpServiceBindingProtocolGuid,               NULL                                             },
  { STRING_TOKEN (STR_NET_HTTP),            &gEfiHttpProtocolGuid,                             NULL                                             },
  { STRING_TOKEN (STR_NET_HTTP_U),          &gEfiHttpUtilitiesProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_REST),                &gEfiRestProtocolGuid,                             NULL                                             },

  //
  // PI 1.5
  //
  { STRING_TOKEN (STR_MM_EOD),              &gEfiMmEndOfDxeProtocolGuid,                       NULL                                             },
  { STRING_TOKEN (STR_MM_ITD),              &gEfiMmIoTrapDispatchProtocolGuid,                 NULL                                             },
  { STRING_TOKEN (STR_MM_PBD),              &gEfiMmPowerButtonDispatchProtocolGuid,            NULL                                             },
  { STRING_TOKEN (STR_MM_SBD),              &gEfiMmStandbyButtonDispatchProtocolGuid,          NULL                                             },
  { STRING_TOKEN (STR_MM_GD),               &gEfiMmGpiDispatchProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_MM_UD),               &gEfiMmUsbDispatchProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_MM_PTD),              &gEfiMmPeriodicTimerDispatchProtocolGuid,          NULL                                             },
  { STRING_TOKEN (STR_MM_SXD),              &gEfiMmSxDispatchProtocolGuid,                     NULL                                             },
  { STRING_TOKEN (STR_MM_SWD),              &gEfiMmSwDispatchProtocolGuid,                     NULL                                             },
  { STRING_TOKEN (STR_MM_PRBI),             &gEfiMmPciRootBridgeIoProtocolGuid,                NULL                                             },
  { STRING_TOKEN (STR_MM_CPU),              &gEfiMmCpuProtocolGuid,                            NULL                                             },
  { STRING_TOKEN (STR_MM_STACODE),          &gEfiMmStatusCodeProtocolGuid,                     NULL                                             },
  { STRING_TOKEN (STR_DXEMM_RTL),           &gEfiDxeMmReadyToLockProtocolGuid,                 NULL                                             },
  { STRING_TOKEN (STR_MM_CONFIG),           &gEfiMmConfigurationProtocolGuid,                  NULL                                             },
  { STRING_TOKEN (STR_MM_RTL),              &gEfiMmReadyToLockProtocolGuid,                    NULL                                             },
  { STRING_TOKEN (STR_MM_CONTROL),          &gEfiMmControlProtocolGuid,                        NULL                                             },
  { STRING_TOKEN (STR_MM_ACCESS),           &gEfiMmAccessProtocolGuid,                         NULL                                             },
  { STRING_TOKEN (STR_MM_BASE),             &gEfiMmBaseProtocolGuid,                           NULL                                             },
  { STRING_TOKEN (STR_MM_CPUIO),            &gEfiMmCpuIoProtocolGuid,                          NULL                                             },
  { STRING_TOKEN (STR_MM_RH),               &gEfiMmRscHandlerProtocolGuid,                     NULL                                             },
  { STRING_TOKEN (STR_MM_COM),              &gEfiMmCommunicationProtocolGuid,                  NULL                                             },

  //
  // UEFI Shell Spec 2.0
  //
  { STRING_TOKEN (STR_SHELL_PARAMETERS),    &gEfiShellParametersProtocolGuid,                  NULL                                             },
  { STRING_TOKEN (STR_SHELL),               &gEfiShellProtocolGuid,                            NULL                                             },

  //
  // UEFI Shell Spec 2.1
  //
  { STRING_TOKEN (STR_SHELL_DYNAMIC),       &gEfiShellDynamicCommandProtocolGuid,              NULL                                             },

  //
  // Misc
  //
  { STRING_TOKEN (STR_PCDINFOPROT),         &gGetPcdInfoProtocolGuid,                          NULL                                             },

  //
  // terminator
  //
  { 0,                                      NULL,                                              NULL                                             },
};

/**
  Function to get the node for a protocol or struct from it's GUID.

  if Guid is NULL, then ASSERT.

  @param[in] Guid               The GUID to look for the name of.

  @return                       The node.
**/
CONST GUID_INFO_BLOCK *
InternalShellGetNodeFromGuid (
  IN CONST EFI_GUID  *Guid
  )
{
  CONST GUID_INFO_BLOCK  *ListWalker;
  UINTN                  LoopCount;

  ASSERT (Guid != NULL);

  for (LoopCount = 0, ListWalker = mGuidList; mGuidList != NULL && LoopCount < mGuidListCount; LoopCount++, ListWalker++) {
    if (CompareGuid (ListWalker->GuidId, Guid)) {
      return (ListWalker);
    }
  }

  if (PcdGetBool (PcdShellIncludeNtGuids)) {
    for (ListWalker = mGuidStringListNT; ListWalker != NULL && ListWalker->GuidId != NULL; ListWalker++) {
      if (CompareGuid (ListWalker->GuidId, Guid)) {
        return (ListWalker);
      }
    }
  }

  for (ListWalker = mGuidStringList; ListWalker != NULL && ListWalker->GuidId != NULL; ListWalker++) {
    if (CompareGuid (ListWalker->GuidId, Guid)) {
      return (ListWalker);
    }
  }

  return (NULL);
}

/**
Function to add a new GUID/Name mapping.

@param[in] Guid       The Guid
@param[in] NameID     The STRING id of the HII string to use
@param[in] DumpFunc   The pointer to the dump function


@retval EFI_SUCCESS           The operation was sucessful
@retval EFI_OUT_OF_RESOURCES  A memory allocation failed
@retval EFI_INVALID_PARAMETER Guid NameId was invalid
**/
EFI_STATUS
InsertNewGuidNameMapping (
  IN CONST EFI_GUID            *Guid,
  IN CONST EFI_STRING_ID       NameID,
  IN CONST DUMP_PROTOCOL_INFO  DumpFunc OPTIONAL
  )
{
  ASSERT (Guid   != NULL);
  ASSERT (NameID != 0);

  mGuidList = ReallocatePool (
                mGuidListCount * sizeof (GUID_INFO_BLOCK),
                (mGuidListCount + 1) * sizeof (GUID_INFO_BLOCK),
                mGuidList
                );
  if (mGuidList == NULL) {
    mGuidListCount = 0;
    return (EFI_OUT_OF_RESOURCES);
  }

  mGuidListCount++;

  mGuidList[mGuidListCount - 1].GuidId   = AllocateCopyPool (sizeof (EFI_GUID), Guid);
  mGuidList[mGuidListCount - 1].StringId = NameID;
  mGuidList[mGuidListCount - 1].DumpInfo = DumpFunc;

  if (mGuidList[mGuidListCount - 1].GuidId == NULL) {
    return (EFI_OUT_OF_RESOURCES);
  }

  return (EFI_SUCCESS);
}

/**
  Function to add a new GUID/Name mapping.

  This cannot overwrite an existing mapping.

  @param[in] Guid       The Guid
  @param[in] TheName    The Guid's name
  @param[in] Lang       RFC4646 language code list or NULL

  @retval EFI_SUCCESS           The operation was sucessful
  @retval EFI_ACCESS_DENIED     There was a duplicate
  @retval EFI_OUT_OF_RESOURCES  A memory allocation failed
  @retval EFI_INVALID_PARAMETER Guid or TheName was NULL
**/
EFI_STATUS
EFIAPI
AddNewGuidNameMapping (
  IN CONST EFI_GUID  *Guid,
  IN CONST CHAR16    *TheName,
  IN CONST CHAR8     *Lang OPTIONAL
  )
{
  EFI_STRING_ID  NameID;

  HandleParsingHiiInit ();

  if ((Guid == NULL) || (TheName == NULL)) {
    return (EFI_INVALID_PARAMETER);
  }

  if ((InternalShellGetNodeFromGuid (Guid)) != NULL) {
    return (EFI_ACCESS_DENIED);
  }

  NameID = HiiSetString (mHandleParsingHiiHandle, 0, (CHAR16 *)TheName, Lang);
  if (NameID == 0) {
    return (EFI_OUT_OF_RESOURCES);
  }

  return (InsertNewGuidNameMapping (Guid, NameID, NULL));
}

/**
  Function to get the name of a protocol or struct from it's GUID.

  if Guid is NULL, then ASSERT.

  @param[in] Guid               The GUID to look for the name of.
  @param[in] Lang               The language to use.

  @return                       pointer to string of the name.  The caller
                                is responsible to free this memory.
**/
CHAR16 *
EFIAPI
GetStringNameFromGuid (
  IN CONST EFI_GUID  *Guid,
  IN CONST CHAR8     *Lang OPTIONAL
  )
{
  CONST GUID_INFO_BLOCK  *Id;

  HandleParsingHiiInit ();

  Id = InternalShellGetNodeFromGuid (Guid);
  if (Id == NULL) {
    return NULL;
  }

  return HiiGetString (mHandleParsingHiiHandle, Id->StringId, Lang);
}

/**
  Function to dump protocol information from a handle.

  This function will return a allocated string buffer containing the
  information.  The caller is responsible for freeing the memory.

  If Guid is NULL, ASSERT().
  If TheHandle is NULL, ASSERT().

  @param[in] TheHandle      The handle to dump information from.
  @param[in] Guid           The GUID of the protocol to dump.
  @param[in] Verbose        TRUE for extra info.  FALSE otherwise.

  @return                   The pointer to string.
  @retval NULL              An error was encountered.
**/
CHAR16 *
EFIAPI
GetProtocolInformationDump (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST EFI_GUID    *Guid,
  IN CONST BOOLEAN     Verbose
  )
{
  CONST GUID_INFO_BLOCK  *Id;

  ASSERT (TheHandle  != NULL);
  ASSERT (Guid       != NULL);

  if ((TheHandle == NULL) || (Guid == NULL)) {
    return (NULL);
  }

  Id = InternalShellGetNodeFromGuid (Guid);
  if ((Id != NULL) && (Id->DumpInfo != NULL)) {
    return (Id->DumpInfo (TheHandle, Verbose));
  }

  return (NULL);
}

/**
  Function to get the Guid for a protocol or struct based on it's string name.

  do not modify the returned Guid.

  @param[in] Name           The pointer to the string name.
  @param[in] Lang           The pointer to the language code.
  @param[out] Guid          The pointer to the Guid.

  @retval EFI_SUCCESS       The operation was sucessful.
**/
EFI_STATUS
EFIAPI
GetGuidFromStringName (
  IN CONST CHAR16  *Name,
  IN CONST CHAR8   *Lang OPTIONAL,
  OUT EFI_GUID     **Guid
  )
{
  CONST GUID_INFO_BLOCK  *ListWalker;
  CHAR16                 *String;
  UINTN                  LoopCount;

  HandleParsingHiiInit ();

  ASSERT (Guid != NULL);
  if (Guid == NULL) {
    return (EFI_INVALID_PARAMETER);
  }

  *Guid = NULL;

  if (PcdGetBool (PcdShellIncludeNtGuids)) {
    for (ListWalker = mGuidStringListNT; ListWalker != NULL && ListWalker->GuidId != NULL; ListWalker++) {
      String = HiiGetString (mHandleParsingHiiHandle, ListWalker->StringId, Lang);
      if ((Name != NULL) && (String != NULL) && (StringNoCaseCompare (&Name, &String) == 0)) {
        *Guid = ListWalker->GuidId;
      }

      SHELL_FREE_NON_NULL (String);
      if (*Guid != NULL) {
        return (EFI_SUCCESS);
      }
    }
  }

  for (ListWalker = mGuidStringList; ListWalker != NULL && ListWalker->GuidId != NULL; ListWalker++) {
    String = HiiGetString (mHandleParsingHiiHandle, ListWalker->StringId, Lang);
    if ((Name != NULL) && (String != NULL) && (StringNoCaseCompare (&Name, &String) == 0)) {
      *Guid = ListWalker->GuidId;
    }

    SHELL_FREE_NON_NULL (String);
    if (*Guid != NULL) {
      return (EFI_SUCCESS);
    }
  }

  for (LoopCount = 0, ListWalker = mGuidList; mGuidList != NULL && LoopCount < mGuidListCount; LoopCount++, ListWalker++) {
    String = HiiGetString (mHandleParsingHiiHandle, ListWalker->StringId, Lang);
    if ((Name != NULL) && (String != NULL) && (StringNoCaseCompare (&Name, &String) == 0)) {
      *Guid = ListWalker->GuidId;
    }

    SHELL_FREE_NON_NULL (String);
    if (*Guid != NULL) {
      return (EFI_SUCCESS);
    }
  }

  return (EFI_NOT_FOUND);
}

/**
  Get best support language for this driver.

  First base on the user input language  to search, second base on the current
  platform used language to search, third get the first language from the
  support language list. The caller need to free the buffer of the best language.

  @param[in] SupportedLanguages      The support languages for this driver.
  @param[in] InputLanguage           The user input language.
  @param[in] Iso639Language          Whether get language for ISO639.

  @return                            The best support language for this driver.
**/
CHAR8 *
EFIAPI
GetBestLanguageForDriver (
  IN CONST CHAR8  *SupportedLanguages,
  IN CONST CHAR8  *InputLanguage,
  IN BOOLEAN      Iso639Language
  )
{
  CHAR8  *LanguageVariable;
  CHAR8  *BestLanguage;

  GetVariable2 (Iso639Language ? L"Lang" : L"PlatformLang", &gEfiGlobalVariableGuid, (VOID **)&LanguageVariable, NULL);

  BestLanguage = GetBestLanguage (
                   SupportedLanguages,
                   Iso639Language,
                   (InputLanguage != NULL) ? InputLanguage : "",
                   (LanguageVariable != NULL) ? LanguageVariable : "",
                   SupportedLanguages,
                   NULL
                   );

  if (LanguageVariable != NULL) {
    FreePool (LanguageVariable);
  }

  return BestLanguage;
}

/**
  Function to retrieve the driver name (if possible) from the ComponentName or
  ComponentName2 protocol

  @param[in] TheHandle      The driver handle to get the name of.
  @param[in] Language       The language to use.

  @retval NULL              The name could not be found.
  @return                   A pointer to the string name.  Do not de-allocate the memory.
**/
CONST CHAR16 *
EFIAPI
GetStringNameFromHandle (
  IN CONST EFI_HANDLE  TheHandle,
  IN CONST CHAR8       *Language
  )
{
  EFI_COMPONENT_NAME2_PROTOCOL  *CompNameStruct;
  EFI_STATUS                    Status;
  CHAR16                        *RetVal;
  CHAR8                         *BestLang;

  BestLang = NULL;

  Status = gBS->OpenProtocol (
                  TheHandle,
                  &gEfiComponentName2ProtocolGuid,
                  (VOID **)&CompNameStruct,
                  gImageHandle,
                  NULL,
                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
                  );
  if (!EFI_ERROR (Status)) {
    BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, Language, FALSE);
    Status   = CompNameStruct->GetDriverName (CompNameStruct, BestLang, &RetVal);
    if (BestLang != NULL) {
      FreePool (BestLang);
      BestLang = NULL;
    }

    if (!EFI_ERROR (Status)) {
      return (RetVal);
    }
  }

  Status = gBS->OpenProtocol (
                  TheHandle,
                  &gEfiComponentNameProtocolGuid,
                  (VOID **)&CompNameStruct,
                  gImageHandle,
                  NULL,
                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
                  );
  if (!EFI_ERROR (Status)) {
    BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, Language, FALSE);
    Status   = CompNameStruct->GetDriverName (CompNameStruct, BestLang, &RetVal);
    if (BestLang != NULL) {
      FreePool (BestLang);
    }

    if (!EFI_ERROR (Status)) {
      return (RetVal);
    }
  }

  return (NULL);
}

/**
  Function to initialize the file global mHandleList object for use in
  vonverting handles to index and index to handle.

  @retval EFI_SUCCESS     The operation was successful.
**/
EFI_STATUS
InternalShellInitHandleList (
  VOID
  )
{
  EFI_STATUS   Status;
  EFI_HANDLE   *HandleBuffer;
  UINTN        HandleCount;
  HANDLE_LIST  *ListWalker;

  if (mHandleList.NextIndex != 0) {
    return EFI_SUCCESS;
  }

  InitializeListHead (&mHandleList.List.Link);
  mHandleList.NextIndex = 1;
  Status                = gBS->LocateHandleBuffer (
                                 AllHandles,
                                 NULL,
                                 NULL,
                                 &HandleCount,
                                 &HandleBuffer
                                 );
  ASSERT_EFI_ERROR (Status);
  if (EFI_ERROR (Status)) {
    return (Status);
  }

  for (mHandleList.NextIndex = 1; mHandleList.NextIndex <= HandleCount; mHandleList.NextIndex++) {
    ListWalker = AllocateZeroPool (sizeof (HANDLE_LIST));
    if (ListWalker != NULL) {
      ListWalker->TheHandle = HandleBuffer[mHandleList.NextIndex - 1];
      ListWalker->TheIndex  = mHandleList.NextIndex;
      InsertTailList (&mHandleList.List.Link, &ListWalker->Link);
    }
  }

  FreePool (HandleBuffer);
  return (EFI_SUCCESS);
}

/**
  Function to retrieve the human-friendly index of a given handle.  If the handle
  does not have a index one will be automatically assigned.  The index value is valid
  until the termination of the shell application.

  @param[in] TheHandle    The handle to retrieve an index for.

  @retval 0               A memory allocation failed.
  @return                 The index of the handle.

**/
UINTN
EFIAPI
ConvertHandleToHandleIndex (
  IN CONST EFI_HANDLE  TheHandle
  )
{
  EFI_STATUS   Status;
  EFI_GUID     **ProtocolBuffer;
  UINTN        ProtocolCount;
  HANDLE_LIST  *ListWalker;

  if (TheHandle == NULL) {
    return 0;
  }

  InternalShellInitHandleList ();

  for (ListWalker = (HANDLE_LIST *)GetFirstNode (&mHandleList.List.Link)
       ; !IsNull (&mHandleList.List.Link, &ListWalker->Link)
       ; ListWalker = (HANDLE_LIST *)GetNextNode (&mHandleList.List.Link, &ListWalker->Link)
       )
  {
    if (ListWalker->TheHandle == TheHandle) {
      //
      // Verify that TheHandle is still present in the Handle Database
      //
      Status = gBS->ProtocolsPerHandle (TheHandle, &ProtocolBuffer, &ProtocolCount);
      if (EFI_ERROR (Status)) {
        //
        // TheHandle is not present in the Handle Database, so delete from the handle list
        //
        RemoveEntryList (&ListWalker->Link);
        return 0;
      }

      FreePool (ProtocolBuffer);
      return (ListWalker->TheIndex);
    }
  }

  //
  // Verify that TheHandle is valid handle
  //
  Status = gBS->ProtocolsPerHandle (TheHandle, &ProtocolBuffer, &ProtocolCount);
  if (EFI_ERROR (Status)) {
    //
    // TheHandle is not valid, so do not add to handle list
    //
    return 0;
  }

  FreePool (ProtocolBuffer);

  ListWalker = AllocateZeroPool (sizeof (HANDLE_LIST));
  if (ListWalker == NULL) {
    return 0;
  }

  ListWalker->TheHandle = TheHandle;
  ListWalker->TheIndex  = mHandleList.NextIndex++;
  InsertTailList (&mHandleList.List.Link, &ListWalker->Link);
  return (ListWalker->TheIndex);
}

/**
  Function to retrieve the EFI_HANDLE from the human-friendly index.

  @param[in] TheIndex     The index to retrieve the EFI_HANDLE for.

  @retval NULL            The index was invalid.
  @return                 The EFI_HANDLE that index represents.

**/
EFI_HANDLE
EFIAPI
ConvertHandleIndexToHandle (
  IN CONST UINTN  TheIndex
  )
{
  EFI_STATUS   Status;
  EFI_GUID     **ProtocolBuffer;
  UINTN        ProtocolCount;
  HANDLE_LIST  *ListWalker;

  InternalShellInitHandleList ();

  if (TheIndex >= mHandleList.NextIndex) {
    return NULL;
  }

  for (ListWalker = (HANDLE_LIST *)GetFirstNode (&mHandleList.List.Link)
       ; !IsNull (&mHandleList.List.Link, &ListWalker->Link)
       ; ListWalker = (HANDLE_LIST *)GetNextNode (&mHandleList.List.Link, &ListWalker->Link)
       )
  {
    if ((ListWalker->TheIndex == TheIndex) && (ListWalker->TheHandle != NULL)) {
      //
      // Verify that LinkWalker->TheHandle is valid handle
      //
      Status = gBS->ProtocolsPerHandle (ListWalker->TheHandle, &ProtocolBuffer, &ProtocolCount);
      if (!EFI_ERROR (Status)) {
        FreePool (ProtocolBuffer);
      } else {
        //
        // TheHandle is not valid, so do not add to handle list
        //
        ListWalker->TheHandle = NULL;
      }

      return (ListWalker->TheHandle);
    }
  }

  return NULL;
}

/**
  Gets all the related EFI_HANDLEs based on the mask supplied.

  This function scans all EFI_HANDLES in the UEFI environment's handle database
  and returns the ones with the specified relationship (Mask) to the specified
  controller handle.

  If both DriverBindingHandle and ControllerHandle are NULL, then ASSERT.
  If MatchingHandleCount is NULL, then ASSERT.

  If MatchingHandleBuffer is not NULL upon a successful return the memory must be
  caller freed.

  @param[in] DriverBindingHandle    The handle with Driver Binding protocol on it.
  @param[in] ControllerHandle       The handle with Device Path protocol on it.
  @param[in] MatchingHandleCount    The pointer to UINTN that specifies the number of HANDLES in
                                    MatchingHandleBuffer.
  @param[out] MatchingHandleBuffer  On a successful return, a buffer of MatchingHandleCount
                                    EFI_HANDLEs with a terminating NULL EFI_HANDLE.
  @param[out] HandleType            An array of type information.

  @retval EFI_SUCCESS               The operation was successful, and any related handles
                                    are in MatchingHandleBuffer.
  @retval EFI_NOT_FOUND             No matching handles were found.
  @retval EFI_INVALID_PARAMETER     A parameter was invalid or out of range.
**/
EFI_STATUS
EFIAPI
ParseHandleDatabaseByRelationshipWithType (
  IN CONST EFI_HANDLE  DriverBindingHandle OPTIONAL,
  IN CONST EFI_HANDLE  ControllerHandle OPTIONAL,
  IN UINTN             *HandleCount,
  OUT EFI_HANDLE       **HandleBuffer,
  OUT UINTN            **HandleType
  )
{
  EFI_STATUS                           Status;
  UINTN                                HandleIndex;
  EFI_GUID                             **ProtocolGuidArray;
  UINTN                                ArrayCount;
  UINTN                                ProtocolIndex;
  EFI_OPEN_PROTOCOL_INFORMATION_ENTRY  *OpenInfo;
  UINTN                                OpenInfoCount;
  UINTN                                OpenInfoIndex;
  UINTN                                ChildIndex;
  INTN                                 DriverBindingHandleIndex;

  ASSERT (HandleCount  != NULL);
  ASSERT (HandleBuffer != NULL);
  ASSERT (HandleType   != NULL);
  ASSERT (DriverBindingHandle != NULL || ControllerHandle != NULL);

  *HandleCount  = 0;
  *HandleBuffer = NULL;
  *HandleType   = NULL;

  //
  // Retrieve the list of all handles from the handle database
  //
  Status = gBS->LocateHandleBuffer (
                  AllHandles,
                  NULL,
                  NULL,
                  HandleCount,
                  HandleBuffer
                  );
  if (EFI_ERROR (Status)) {
    return (Status);
  }

  *HandleType = AllocateZeroPool (*HandleCount * sizeof (UINTN));
  if (*HandleType == NULL) {
    SHELL_FREE_NON_NULL (*HandleBuffer);
    *HandleCount = 0;
    return EFI_OUT_OF_RESOURCES;
  }

  DriverBindingHandleIndex = -1;
  for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {
    if ((DriverBindingHandle != NULL) && ((*HandleBuffer)[HandleIndex] == DriverBindingHandle)) {
      DriverBindingHandleIndex = (INTN)HandleIndex;
    }
  }

  for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {
    //
    // Retrieve the list of all the protocols on each handle
    //
    Status = gBS->ProtocolsPerHandle (
                    (*HandleBuffer)[HandleIndex],
                    &ProtocolGuidArray,
                    &ArrayCount
                    );
    if (EFI_ERROR (Status)) {
      continue;
    }

    for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {
      //
      // Set the bit describing what this handle has
      //
      if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiLoadedImageProtocolGuid)) {
        (*HandleType)[HandleIndex] |= (UINTN)HR_IMAGE_HANDLE;
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverBindingProtocolGuid)) {
        (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_BINDING_HANDLE;
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfiguration2ProtocolGuid)) {
        (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_CONFIGURATION_HANDLE;
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid)) {
        (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_CONFIGURATION_HANDLE;
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid)) {
        (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_DIAGNOSTICS_HANDLE;
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid)) {
        (*HandleType)[HandleIndex] |= (UINTN)HR_DRIVER_DIAGNOSTICS_HANDLE;
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid)) {
        (*HandleType)[HandleIndex] |= (UINTN)HR_COMPONENT_NAME_HANDLE;
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentNameProtocolGuid)) {
        (*HandleType)[HandleIndex] |= (UINTN)HR_COMPONENT_NAME_HANDLE;
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDevicePathProtocolGuid)) {
        (*HandleType)[HandleIndex] |= (UINTN)HR_DEVICE_HANDLE;
      }

      //
      // Retrieve the list of agents that have opened each protocol
      //
      Status = gBS->OpenProtocolInformation (
                      (*HandleBuffer)[HandleIndex],
                      ProtocolGuidArray[ProtocolIndex],
                      &OpenInfo,
                      &OpenInfoCount
                      );
      if (EFI_ERROR (Status)) {
        continue;
      }

      if (ControllerHandle == NULL) {
        //
        // ControllerHandle == NULL and DriverBindingHandle != NULL.
        // Return information on all the controller handles that the driver specified by DriverBindingHandle is managing
        //
        for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
          if ((OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) && ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0)) {
            (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);
            if (DriverBindingHandleIndex != -1) {
              (*HandleType)[DriverBindingHandleIndex] |= (UINTN)HR_DEVICE_DRIVER;
            }
          }

          if ((OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) && ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0)) {
            (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);
            if (DriverBindingHandleIndex != -1) {
              (*HandleType)[DriverBindingHandleIndex] |= (UINTN)(HR_BUS_DRIVER | HR_DEVICE_DRIVER);
            }

            for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
              if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {
                (*HandleType)[ChildIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CHILD_HANDLE);
              }
            }
          }
        }
      }

      if ((DriverBindingHandle == NULL) && (ControllerHandle != NULL)) {
        if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {
          (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);
          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {
              for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
                if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {
                  (*HandleType)[ChildIndex] |= (UINTN)HR_DEVICE_DRIVER;
                }
              }
            }

            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
              for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
                if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {
                  (*HandleType)[ChildIndex] |= (UINTN)(HR_BUS_DRIVER | HR_DEVICE_DRIVER);
                }

                if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {
                  (*HandleType)[ChildIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CHILD_HANDLE);
                }
              }
            }
          }
        } else {
          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
              if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {
                (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_PARENT_HANDLE);
              }
            }
          }
        }
      }

      if ((DriverBindingHandle != NULL) && (ControllerHandle != NULL)) {
        if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {
          (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);
          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {
              if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {
                if (DriverBindingHandleIndex != -1) {
                  (*HandleType)[DriverBindingHandleIndex] |= (UINTN)HR_DEVICE_DRIVER;
                }
              }
            }

            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
              if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {
                for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
                  if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {
                    (*HandleType)[ChildIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_CHILD_HANDLE);
                  }
                }
              }

              for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
                if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {
                  (*HandleType)[ChildIndex] |= (UINTN)(HR_BUS_DRIVER | HR_DEVICE_DRIVER);
                }
              }
            }
          }
        } else {
          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
              if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {
                (*HandleType)[HandleIndex] |= (UINTN)(HR_DEVICE_HANDLE | HR_PARENT_HANDLE);
              }
            }
          }
        }
      }

      FreePool (OpenInfo);
    }

    FreePool (ProtocolGuidArray);
  }

  return EFI_SUCCESS;
}

/**
  Gets all the related EFI_HANDLEs based on the single EFI_HANDLE and the mask
  supplied.

  This function will scan all EFI_HANDLES in the UEFI environment's handle database
  and return all the ones with the specified relationship (Mask) to the specified
  controller handle.

  If both DriverBindingHandle and ControllerHandle are NULL, then ASSERT.
  If MatchingHandleCount is NULL, then ASSERT.

  If MatchingHandleBuffer is not NULL upon a sucessful return the memory must be
  caller freed.

  @param[in] DriverBindingHandle    Handle to a object with Driver Binding protocol
                                    on it.
  @param[in] ControllerHandle       Handle to a device with Device Path protocol on it.
  @param[in] Mask                   Mask of what relationship(s) is desired.
  @param[in] MatchingHandleCount    Poitner to UINTN specifying number of HANDLES in
                                    MatchingHandleBuffer.
  @param[out] MatchingHandleBuffer  On a sucessful return a buffer of MatchingHandleCount
                                    EFI_HANDLEs and a terminating NULL EFI_HANDLE.

  @retval EFI_SUCCESS               The operation was sucessful and any related handles
                                    are in MatchingHandleBuffer;
  @retval EFI_NOT_FOUND             No matching handles were found.
  @retval EFI_INVALID_PARAMETER     A parameter was invalid or out of range.
**/
EFI_STATUS
EFIAPI
ParseHandleDatabaseByRelationship (
  IN CONST EFI_HANDLE  DriverBindingHandle OPTIONAL,
  IN CONST EFI_HANDLE  ControllerHandle OPTIONAL,
  IN CONST UINTN       Mask,
  IN UINTN             *MatchingHandleCount,
  OUT EFI_HANDLE       **MatchingHandleBuffer OPTIONAL
  )
{
  EFI_STATUS  Status;
  UINTN       HandleCount;
  EFI_HANDLE  *HandleBuffer;
  UINTN       *HandleType;
  UINTN       HandleIndex;

  ASSERT (MatchingHandleCount != NULL);
  ASSERT (DriverBindingHandle != NULL || ControllerHandle != NULL);

  if ((Mask & HR_VALID_MASK) != Mask) {
    return (EFI_INVALID_PARAMETER);
  }

  if (((Mask & HR_CHILD_HANDLE) != 0) && (DriverBindingHandle == NULL)) {
    return (EFI_INVALID_PARAMETER);
  }

  *MatchingHandleCount = 0;
  if (MatchingHandleBuffer != NULL) {
    *MatchingHandleBuffer = NULL;
  }

  HandleBuffer = NULL;
  HandleType   = NULL;

  Status = ParseHandleDatabaseByRelationshipWithType (
             DriverBindingHandle,
             ControllerHandle,
             &HandleCount,
             &HandleBuffer,
             &HandleType
             );
  if (!EFI_ERROR (Status)) {
    //
    // Count the number of handles that match the attributes in Mask
    //
    for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
      if ((HandleType[HandleIndex] & Mask) == Mask) {
        (*MatchingHandleCount)++;
      }
    }

    //
    // If no handles match the attributes in Mask then return EFI_NOT_FOUND
    //
    if (*MatchingHandleCount == 0) {
      Status = EFI_NOT_FOUND;
    } else {
      if (MatchingHandleBuffer == NULL) {
        //
        // Someone just wanted the count...
        //
        Status = EFI_SUCCESS;
      } else {
        //
        // Allocate a handle buffer for the number of handles that matched the attributes in Mask
        //
        *MatchingHandleBuffer = AllocateZeroPool ((*MatchingHandleCount +1)* sizeof (EFI_HANDLE));
        if (*MatchingHandleBuffer == NULL) {
          Status = EFI_OUT_OF_RESOURCES;
        } else {
          for (HandleIndex = 0, *MatchingHandleCount = 0
               ; HandleIndex < HandleCount
               ; HandleIndex++
               )
          {
            //
            // Fill the allocated buffer with the handles that matched the attributes in Mask
            //
            if ((HandleType[HandleIndex] & Mask) == Mask) {
              (*MatchingHandleBuffer)[(*MatchingHandleCount)++] = HandleBuffer[HandleIndex];
            }
          }

          //
          // Make the last one NULL
          //
          (*MatchingHandleBuffer)[*MatchingHandleCount] = NULL;

          Status = EFI_SUCCESS;
        } // *MatchingHandleBuffer == NULL (ELSE)
      } // MacthingHandleBuffer == NULL (ELSE)
    } // *MatchingHandleCount  == 0 (ELSE)
  } // no error on ParseHandleDatabaseByRelationshipWithType

  if (HandleBuffer != NULL) {
    FreePool (HandleBuffer);
  }

  if (HandleType != NULL) {
    FreePool (HandleType);
  }

  ASSERT (
    (MatchingHandleBuffer == NULL) ||
    (*MatchingHandleCount == 0 && *MatchingHandleBuffer == NULL) ||
    (*MatchingHandleCount != 0 && *MatchingHandleBuffer != NULL)
    );
  return Status;
}

/**
  Gets handles for any child controllers of the passed in controller.

  @param[in] ControllerHandle       The handle of the "parent controller"
  @param[out] MatchingHandleCount   Pointer to the number of handles in
                                    MatchingHandleBuffer on return.
  @param[out] MatchingHandleBuffer  Buffer containing handles on a successful
                                    return.


  @retval EFI_SUCCESS               The operation was sucessful.
**/
EFI_STATUS
EFIAPI
ParseHandleDatabaseForChildControllers (
  IN CONST EFI_HANDLE  ControllerHandle,
  OUT UINTN            *MatchingHandleCount,
  OUT EFI_HANDLE       **MatchingHandleBuffer OPTIONAL
  )
{
  EFI_STATUS  Status;
  UINTN       HandleIndex;
  UINTN       DriverBindingHandleCount;
  EFI_HANDLE  *DriverBindingHandleBuffer;
  UINTN       DriverBindingHandleIndex;
  UINTN       ChildControllerHandleCount;
  EFI_HANDLE  *ChildControllerHandleBuffer;
  UINTN       ChildControllerHandleIndex;
  EFI_HANDLE  *HandleBufferForReturn;

  if (MatchingHandleCount == NULL) {
    return (EFI_INVALID_PARAMETER);
  }

  *MatchingHandleCount = 0;

  Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (
             ControllerHandle,
             &DriverBindingHandleCount,
             &DriverBindingHandleBuffer
             );
  if (EFI_ERROR (Status)) {
    return Status;
  }

  //
  // Get a buffer big enough for all the controllers.
  //
  HandleBufferForReturn = GetHandleListByProtocol (NULL);
  if (HandleBufferForReturn == NULL) {
    FreePool (DriverBindingHandleBuffer);
    return (EFI_NOT_FOUND);
  }

  for (DriverBindingHandleIndex = 0; DriverBindingHandleIndex < DriverBindingHandleCount; DriverBindingHandleIndex++) {
    Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
               DriverBindingHandleBuffer[DriverBindingHandleIndex],
               ControllerHandle,
               &ChildControllerHandleCount,
               &ChildControllerHandleBuffer
               );
    if (EFI_ERROR (Status)) {
      continue;
    }

    for (ChildControllerHandleIndex = 0;
         ChildControllerHandleIndex < ChildControllerHandleCount;
         ChildControllerHandleIndex++
         )
    {
      for (HandleIndex = 0; HandleIndex < *MatchingHandleCount; HandleIndex++) {
        if (HandleBufferForReturn[HandleIndex] == ChildControllerHandleBuffer[ChildControllerHandleIndex]) {
          break;
        }
      }

      if (HandleIndex >= *MatchingHandleCount) {
        HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];
      }
    }

    FreePool (ChildControllerHandleBuffer);
  }

  FreePool (DriverBindingHandleBuffer);

  if ((MatchingHandleBuffer == NULL) || (*MatchingHandleCount == 0)) {
    //
    // The caller is not interested in the actual handles, or we've found none.
    //
    FreePool (HandleBufferForReturn);
    HandleBufferForReturn = NULL;
  }

  if (MatchingHandleBuffer != NULL) {
    *MatchingHandleBuffer = HandleBufferForReturn;
  }

  ASSERT (
    (MatchingHandleBuffer == NULL) ||
    (*MatchingHandleCount == 0 && *MatchingHandleBuffer == NULL) ||
    (*MatchingHandleCount != 0 && *MatchingHandleBuffer != NULL)
    );

  return (EFI_SUCCESS);
}

/**
  Appends 1 buffer to another buffer.  This will re-allocate the destination buffer
  if necessary to fit all of the data.

  If DestinationBuffer is NULL, then ASSERT().

  @param[in, out]  DestinationBuffer The pointer to the pointer to the buffer to append onto.
  @param[in, out]  DestinationSize   The pointer to the size of DestinationBuffer.
  @param[in]       SourceBuffer      The pointer to the buffer to append onto DestinationBuffer.
  @param[in]       SourceSize        The number of bytes of SourceBuffer to append.

  @retval NULL                      A memory allocation failed.
  @retval NULL                      A parameter was invalid.
  @return                           A pointer to (*DestinationBuffer).
**/
VOID *
BuffernCatGrow (
  IN OUT VOID   **DestinationBuffer,
  IN OUT UINTN  *DestinationSize,
  IN     VOID   *SourceBuffer,
  IN     UINTN  SourceSize
  )
{
  UINTN  LocalDestinationSize;
  UINTN  LocalDestinationFinalSize;

  ASSERT (DestinationBuffer != NULL);

  if ((SourceSize == 0) || (SourceBuffer == NULL)) {
    return (*DestinationBuffer);
  }

  if (DestinationSize == NULL) {
    LocalDestinationSize = 0;
  } else {
    LocalDestinationSize = *DestinationSize;
  }

  LocalDestinationFinalSize = LocalDestinationSize + SourceSize;

  if (DestinationSize != NULL) {
    *DestinationSize = LocalDestinationSize;
  }

  if (LocalDestinationSize == 0) {
    // allcoate
    *DestinationBuffer = AllocateZeroPool (LocalDestinationFinalSize);
  } else {
    // reallocate
    *DestinationBuffer = ReallocatePool (LocalDestinationSize, LocalDestinationFinalSize, *DestinationBuffer);
  }

  ASSERT (*DestinationBuffer != NULL);

  // copy
  return (CopyMem (((UINT8 *)(*DestinationBuffer)) + LocalDestinationSize, SourceBuffer, SourceSize));
}

/**
  Gets handles for any child devices produced by the passed in driver.

  @param[in] DriverHandle           The handle of the driver.
  @param[in] MatchingHandleCount    Pointer to the number of handles in
                                    MatchingHandleBuffer on return.
  @param[out] MatchingHandleBuffer  Buffer containing handles on a successful
                                    return.
  @retval EFI_SUCCESS               The operation was sucessful.
  @sa ParseHandleDatabaseByRelationship
**/
EFI_STATUS
EFIAPI
ParseHandleDatabaseForChildDevices (
  IN CONST EFI_HANDLE  DriverHandle,
  IN UINTN             *MatchingHandleCount,
  OUT EFI_HANDLE       **MatchingHandleBuffer OPTIONAL
  )
{
  EFI_HANDLE  *Buffer;
  EFI_HANDLE  *Buffer2;
  UINTN       Count1;
  UINTN       Count2;
  UINTN       HandleIndex;
  EFI_STATUS  Status;
  UINTN       HandleBufferSize;

  ASSERT (MatchingHandleCount != NULL);

  HandleBufferSize     = 0;
  Buffer               = NULL;
  Buffer2              = NULL;
  *MatchingHandleCount = 0;

  Status = PARSE_HANDLE_DATABASE_DEVICES (
             DriverHandle,
             &Count1,
             &Buffer
             );
  if (!EFI_ERROR (Status)) {
    for (HandleIndex = 0; HandleIndex < Count1; HandleIndex++) {
      //
      // now find the children
      //
      Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (
                 DriverHandle,
                 Buffer[HandleIndex],
                 &Count2,
                 &Buffer2
                 );
      if (EFI_ERROR (Status)) {
        break;
      }

      //
      // save out required and optional data elements
      //
      *MatchingHandleCount += Count2;
      if (MatchingHandleBuffer != NULL) {
        *MatchingHandleBuffer = BuffernCatGrow ((VOID **)MatchingHandleBuffer, &HandleBufferSize, Buffer2, Count2 * sizeof (Buffer2[0]));
      }

      //
      // free the memory
      //
      if (Buffer2 != NULL) {
        FreePool (Buffer2);
      }
    }
  }

  if (Buffer != NULL) {
    FreePool (Buffer);
  }

  return (Status);
}

/**
  Function to get all handles that support a given protocol or all handles.

  @param[in] ProtocolGuid The guid of the protocol to get handles for.  If NULL
                          then the function will return all handles.

  @retval NULL            A memory allocation failed.
  @return                 A NULL terminated list of handles.
**/
EFI_HANDLE *
EFIAPI
GetHandleListByProtocol (
  IN CONST EFI_GUID  *ProtocolGuid OPTIONAL
  )
{
  EFI_HANDLE  *HandleList;
  UINTN       Size;
  EFI_STATUS  Status;

  Size       = 0;
  HandleList = NULL;

  //
  // We cannot use LocateHandleBuffer since we need that NULL item on the ends of the list!
  //
  if (ProtocolGuid == NULL) {
    Status = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, HandleList);
    if (Status == EFI_BUFFER_TOO_SMALL) {
      HandleList = AllocateZeroPool (Size + sizeof (EFI_HANDLE));
      if (HandleList == NULL) {
        return (NULL);
      }

      Status                               = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, HandleList);
      HandleList[Size/sizeof (EFI_HANDLE)] = NULL;
    }
  } else {
    Status = gBS->LocateHandle (ByProtocol, (EFI_GUID *)ProtocolGuid, NULL, &Size, HandleList);
    if (Status == EFI_BUFFER_TOO_SMALL) {
      HandleList = AllocateZeroPool (Size + sizeof (EFI_HANDLE));
      if (HandleList == NULL) {
        return (NULL);
      }

      Status                               = gBS->LocateHandle (ByProtocol, (EFI_GUID *)ProtocolGuid, NULL, &Size, HandleList);
      HandleList[Size/sizeof (EFI_HANDLE)] = NULL;
    }
  }

  if (EFI_ERROR (Status)) {
    if (HandleList != NULL) {
      FreePool (HandleList);
    }

    return (NULL);
  }

  return (HandleList);
}

/**
  Function to get all handles that support some protocols.

  @param[in] ProtocolGuids  A NULL terminated list of protocol GUIDs.

  @retval NULL              A memory allocation failed.
  @retval NULL              ProtocolGuids was NULL.
  @return                   A NULL terminated list of EFI_HANDLEs.
**/
EFI_HANDLE *
EFIAPI
GetHandleListByProtocolList (
  IN CONST EFI_GUID  **ProtocolGuids
  )
{
  EFI_HANDLE      *HandleList;
  UINTN           Size;
  UINTN           TotalSize;
  UINTN           TempSize;
  EFI_STATUS      Status;
  CONST EFI_GUID  **GuidWalker;
  EFI_HANDLE      *HandleWalker1;
  EFI_HANDLE      *HandleWalker2;

  Size       = 0;
  HandleList = NULL;
  TotalSize  = sizeof (EFI_HANDLE);

  for (GuidWalker = ProtocolGuids; GuidWalker != NULL && *GuidWalker != NULL; GuidWalker++, Size = 0) {
    Status = gBS->LocateHandle (ByProtocol, (EFI_GUID *)(*GuidWalker), NULL, &Size, NULL);
    if (Status == EFI_BUFFER_TOO_SMALL) {
      TotalSize += Size;
    }
  }

  //
  // No handles were found...
  //
  if (TotalSize == sizeof (EFI_HANDLE)) {
    return (NULL);
  }

  HandleList = AllocateZeroPool (TotalSize);
  if (HandleList == NULL) {
    return (NULL);
  }

  Size = 0;
  for (GuidWalker = ProtocolGuids; GuidWalker != NULL && *GuidWalker != NULL; GuidWalker++) {
    TempSize = TotalSize - Size;
    Status   = gBS->LocateHandle (ByProtocol, (EFI_GUID *)(*GuidWalker), NULL, &TempSize, HandleList+(Size/sizeof (EFI_HANDLE)));

    //
    // Allow for missing protocols... Only update the 'used' size upon success.
    //
    if (!EFI_ERROR (Status)) {
      Size += TempSize;
    }
  }

  ASSERT (HandleList[(TotalSize/sizeof (EFI_HANDLE))-1] == NULL);

  for (HandleWalker1 = HandleList; HandleWalker1 != NULL && *HandleWalker1 != NULL; HandleWalker1++) {
    for (HandleWalker2 = HandleWalker1 + 1; HandleWalker2 != NULL && *HandleWalker2 != NULL; HandleWalker2++) {
      if (*HandleWalker1 == *HandleWalker2) {
        //
        // copy memory back 1 handle width.
        //
        CopyMem (HandleWalker2, HandleWalker2 + 1, TotalSize - ((HandleWalker2-HandleList+1)*sizeof (EFI_HANDLE)));
      }
    }
  }

  return (HandleList);
}

/**
  Return all supported GUIDs.

  @param[out]     Guids  The buffer to return all supported GUIDs.
  @param[in, out] Count  On input, the count of GUIDs the buffer can hold,
                         On output, the count of GUIDs to return.

  @retval EFI_INVALID_PARAMETER Count is NULL.
  @retval EFI_BUFFER_TOO_SMALL  Buffer is not enough to hold all GUIDs.
  @retval EFI_SUCCESS           GUIDs are returned successfully.
**/
EFI_STATUS
EFIAPI
GetAllMappingGuids (
  OUT EFI_GUID  *Guids,
  IN OUT UINTN  *Count
  )
{
  UINTN  GuidCount;
  UINTN  NtGuidCount;
  UINTN  Index;

  if (Count == NULL) {
    return EFI_INVALID_PARAMETER;
  }

  NtGuidCount = 0;
  if (PcdGetBool (PcdShellIncludeNtGuids)) {
    NtGuidCount = ARRAY_SIZE (mGuidStringListNT) - 1;
  }

  GuidCount = ARRAY_SIZE (mGuidStringList) - 1;

  if (*Count < NtGuidCount + GuidCount + mGuidListCount) {
    *Count = NtGuidCount + GuidCount + mGuidListCount;
    return EFI_BUFFER_TOO_SMALL;
  }

  for (Index = 0; Index < NtGuidCount; Index++) {
    CopyGuid (&Guids[Index], mGuidStringListNT[Index].GuidId);
  }

  for (Index = 0; Index < GuidCount; Index++) {
    CopyGuid (&Guids[NtGuidCount + Index], mGuidStringList[Index].GuidId);
  }

  for (Index = 0; Index < mGuidListCount; Index++) {
    CopyGuid (&Guids[NtGuidCount + GuidCount + Index], mGuidList[Index].GuidId);
  }

  return EFI_SUCCESS;
}
