diff --git a/rEFIt_UEFI/Platform/DevicePath.cpp b/rEFIt_UEFI/Platform/DevicePath.cpp
index 4c6919d07..f59583d2d 100644
--- a/rEFIt_UEFI/Platform/DevicePath.cpp
+++ b/rEFIt_UEFI/Platform/DevicePath.cpp
@@ -1,1621 +1,1621 @@
-/** @file DevicePath.c
- BDS internal function define the default device path string, it can be
- replaced by platform device path.
-
-Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Platform.h"
-//#include
-//#include "InternalBdsLib.h"
-
-/**
- Concatenates a formatted unicode string to allocated pool.
- The caller must free the resulting buffer.
-
- @param Str Tracks the allocated pool, size in use, and amount of pool allocated.
- @param Fmt The format string
- @param ... The data will be printed.
-
- @return Allocated buffer with the formatted string printed in it.
- The caller must free the allocated buffer.
- The buffer allocation is not packed.
-
-**/
-CHAR16 *
-EFIAPI
-CatPrint (
- IN OUT POOL_PRINT *Str,
- IN CONST CHAR16 *Fmt,
- ...
- )
-{
- CHAR16 *AppendStr;
- VA_LIST Args;
- UINTN StringSize;
-
- AppendStr = (__typeof__(AppendStr))AllocateZeroPool (0x1000);
- if (AppendStr == NULL) {
- return Str->Str;
- }
-
- VA_START (Args, Fmt);
- UnicodeVSPrint (AppendStr, 0x1000, Fmt, Args);
- VA_END (Args);
- if (NULL == Str->Str) {
- StringSize = StrSize (AppendStr);
- Str->Str = (__typeof__(Str->Str))AllocateZeroPool (StringSize);
-// ASSERT (Str->Str != NULL);
- } else {
- StringSize = StrSize (AppendStr);
- StringSize += (StrSize (Str->Str) - sizeof (UINT16));
-
- Str->Str = (__typeof__(Str->Str))ReallocatePool (
- StrSize (Str->Str),
- StringSize,
- Str->Str
- );
-// ASSERT (Str->Str != NULL);
- }
-
- Str->Maxlen = MAX_CHAR * sizeof (UINT16);
- if (StringSize < Str->Maxlen) {
- StrCatS (Str->Str, StringSize, AppendStr);
- Str->Len = StringSize - sizeof (UINT16);
- }
-
- FreePool (AppendStr);
- return Str->Str;
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathPci (
- IN OUT POOL_PRINT *Str,
- IN PCI_DEVICE_PATH *DevPath
- )
-{
- PCI_DEVICE_PATH *Pci;
-
- Pci = DevPath;
- CatPrint (Str, L"Pci(%x|%x)", (UINTN) Pci->Device, (UINTN) Pci->Function);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathPccard (
- IN OUT POOL_PRINT *Str,
- IN PCCARD_DEVICE_PATH *DevPath
- )
-{
- PCCARD_DEVICE_PATH *Pccard;
-
- Pccard = DevPath;
- CatPrint (Str, L"Pcmcia(Function%x)", (UINTN) Pccard->FunctionNumber);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathMemMap (
- IN OUT POOL_PRINT *Str,
- IN MEMMAP_DEVICE_PATH *DevPath
- )
-{
- MEMMAP_DEVICE_PATH *MemMap;
-
- MemMap = DevPath;
- CatPrint (
- Str,
- L"MemMap(%d:%lx-%lx)",
- (UINTN) MemMap->MemoryType,
- MemMap->StartingAddress,
- MemMap->EndingAddress
- );
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathController (
- IN OUT POOL_PRINT *Str,
- IN CONTROLLER_DEVICE_PATH *DevPath
- )
-{
- CONTROLLER_DEVICE_PATH *Controller;
-
- Controller = DevPath;
- CatPrint (Str, L"Ctrl(%d)", (UINTN) Controller->ControllerNumber);
-}
-
-
-/**
- Convert Vendor device path to device name.
-
- @param Str The buffer store device name
- @param DevPath Pointer to vendor device path
-
-**/
-VOID
-DevPathVendor (
- IN OUT POOL_PRINT *Str,
- IN VENDOR_DEVICE_PATH *DevPath
- )
-{
- VENDOR_DEVICE_PATH *Vendor;
- CONST CHAR16 *Type;
- UINTN DataLength;
- UINTN Index;
-// UINT32 FlowControlMap;
-
- UINT16 Info;
-
- Vendor = DevPath;
-
- switch (DevicePathType (&Vendor->Header)) {
- case HARDWARE_DEVICE_PATH:
- Type = L"Hw";
- break;
-
- case MESSAGING_DEVICE_PATH:
- Type = L"Msg";
- /* if (CompareGuid (&Vendor->Guid, &gEfiPcAnsiGuid)) {
- CatPrint (Str, L"VenPcAnsi()");
- return ;
- } else if (CompareGuid (&Vendor->Guid, &gEfiVT100Guid)) {
- CatPrint (Str, L"VenVt100()");
- return ;
- } else if (CompareGuid (&Vendor->Guid, &gEfiVT100PlusGuid)) {
- CatPrint (Str, L"VenVt100Plus()");
- return ;
- } else if (CompareGuid (&Vendor->Guid, &gEfiVTUTF8Guid)) {
- CatPrint (Str, L"VenUft8()");
- return ;
- } else if (CompareGuid (&Vendor->Guid, &gEfiUartDevicePathGuid )) {
- FlowControlMap = (((UART_FLOW_CONTROL_DEVICE_PATH *) Vendor)->FlowControlMap);
- switch (FlowControlMap & 0x00000003) {
- case 0:
- CatPrint (Str, L"UartFlowCtrl(%s)", L"None");
- break;
-
- case 1:
- CatPrint (Str, L"UartFlowCtrl(%s)", L"Hardware");
- break;
-
- case 2:
- CatPrint (Str, L"UartFlowCtrl(%s)", L"XonXoff");
- break;
-
- default:
- break;
- }
-
- return ;
-
- } else
-*/
- if (CompareGuid (&Vendor->Guid, &gEfiSasDevicePathGuid)) {
- CatPrint (
- Str,
- L"SAS(%lx,%lx,%x,",
- ((SAS_DEVICE_PATH *) Vendor)->SasAddress,
- ((SAS_DEVICE_PATH *) Vendor)->Lun,
- (UINTN) ((SAS_DEVICE_PATH *) Vendor)->RelativeTargetPort
- );
- Info = (((SAS_DEVICE_PATH *) Vendor)->DeviceTopology);
- if ((Info & 0x0f) == 0) {
- CatPrint (Str, L"NoTopology,0,0,0,");
- } else if (((Info & 0x0f) == 1) || ((Info & 0x0f) == 2)) {
- CatPrint (
- Str,
- L"%s,%s,%s,",
- ((Info & (0x1 << 4)) != 0) ? L"SATA" : L"SAS",
- ((Info & (0x1 << 5)) != 0) ? L"External" : L"Internal",
- ((Info & (0x1 << 6)) != 0) ? L"Expanded" : L"Direct"
- );
- if ((Info & 0x0f) == 1) {
- CatPrint (Str, L"0,");
- } else {
- CatPrint (Str, L"%x,", (UINTN) ((Info >> 8) & 0xff));
- }
- } else {
- CatPrint (Str, L"0,0,0,0,");
- }
-
- CatPrint (Str, L"%x)", (UINTN) ((SAS_DEVICE_PATH *) Vendor)->Reserved);
- return ;
-
- } else if (CompareGuid (&Vendor->Guid, &gEfiDebugPortProtocolGuid)) {
- CatPrint (Str, L"DebugPort()");
- return ;
- }
- break;
-
- case MEDIA_DEVICE_PATH:
- Type = L"Media";
- break;
-
- default:
- Type = L"?";
- break;
- }
-
- CatPrint (Str, L"Ven%s(%g", Type, &Vendor->Guid);
- DataLength = DevicePathNodeLength (&Vendor->Header) - sizeof (VENDOR_DEVICE_PATH);
- if (DataLength > 0) {
- CatPrint (Str, L",");
- for (Index = 0; Index < DataLength; Index++) {
- CatPrint (Str, L"%02x", (UINTN) ((VENDOR_DEVICE_PATH_WITH_DATA *) Vendor)->VendorDefinedData[Index]);
- }
- }
- CatPrint (Str, L")");
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathAcpi (
- IN OUT POOL_PRINT *Str,
- IN ACPI_HID_DEVICE_PATH *DevPath
- )
-{
- ACPI_HID_DEVICE_PATH *Acpi;
-
- Acpi = DevPath;
- if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
- CatPrint (Str, L"Acpi(PNP%04x,%x)", (UINTN) EISA_ID_TO_NUM (Acpi->HID), (UINTN) Acpi->UID);
- } else {
- CatPrint (Str, L"Acpi(%08x,%x)", (UINTN) Acpi->HID, (UINTN) Acpi->UID);
- }
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathExtendedAcpi (
- IN OUT POOL_PRINT *Str,
- IN ACPI_EXTENDED_HID_DEVICE_PATH *DevPath
- )
-{
- ACPI_EXTENDED_HID_DEVICE_PATH *ExtendedAcpi;
-
- //
- // Index for HID, UID and CID strings, 0 for non-exist
- //
- UINT16 HIDSTRIdx;
- UINT16 UIDSTRIdx;
- UINT16 CIDSTRIdx;
- UINT16 Index;
- UINT16 Length;
- UINT16 Anchor;
- CHAR8 *AsChar8Array;
-
- HIDSTRIdx = 0;
- UIDSTRIdx = 0;
- CIDSTRIdx = 0;
- ExtendedAcpi = DevPath;
- Length = (UINT16) DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) ExtendedAcpi);
-
- AsChar8Array = (CHAR8 *) ExtendedAcpi;
-
- //
- // find HIDSTR
- //
- Anchor = 16;
- for (Index = Anchor; Index < Length && AsChar8Array[Index] != '\0'; Index++) {
- ;
- }
- if (Index > Anchor) {
- HIDSTRIdx = Anchor;
- }
- //
- // find UIDSTR
- //
- Anchor = (UINT16) (Index + 1);
- for (Index = Anchor; Index < Length && AsChar8Array[Index] != '\0'; Index++) {
- ;
- }
- if (Index > Anchor) {
- UIDSTRIdx = Anchor;
- }
- //
- // find CIDSTR
- //
- Anchor = (UINT16) (Index + 1);
- for (Index = Anchor; Index < Length && AsChar8Array[Index] != '\0'; Index++) {
- ;
- }
- if (Index > Anchor) {
- CIDSTRIdx = Anchor;
- }
-
- if (HIDSTRIdx == 0 && CIDSTRIdx == 0 && ExtendedAcpi->UID == 0) {
- CatPrint (Str, L"AcpiExp(");
- if ((ExtendedAcpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
- CatPrint (Str, L"PNP%04x,", (UINTN) EISA_ID_TO_NUM (ExtendedAcpi->HID));
- } else {
- CatPrint (Str, L"%08x,", (UINTN) ExtendedAcpi->HID);
- }
- if ((ExtendedAcpi->CID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
- CatPrint (Str, L"PNP%04x,", (UINTN) EISA_ID_TO_NUM (ExtendedAcpi->CID));
- } else {
- CatPrint (Str, L"%08x,", (UINTN) ExtendedAcpi->CID);
- }
- if (UIDSTRIdx != 0) {
- CatPrint (Str, L"%a)", AsChar8Array + UIDSTRIdx);
- } else {
- CatPrint (Str, L"\"\")");
- }
- } else {
- CatPrint (Str, L"AcpiEx(");
- if ((ExtendedAcpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
- CatPrint (Str, L"PNP%04x,", (UINTN) EISA_ID_TO_NUM (ExtendedAcpi->HID));
- } else {
- CatPrint (Str, L"%08x,", (UINTN) ExtendedAcpi->HID);
- }
- if ((ExtendedAcpi->CID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
- CatPrint (Str, L"PNP%04x,", (UINTN) EISA_ID_TO_NUM (ExtendedAcpi->CID));
- } else {
- CatPrint (Str, L"%08x,", (UINTN) ExtendedAcpi->CID);
- }
- CatPrint (Str, L"%x,", (UINTN) ExtendedAcpi->UID);
-
- if (HIDSTRIdx != 0) {
- CatPrint (Str, L"%a,", AsChar8Array + HIDSTRIdx);
- } else {
- CatPrint (Str, L"\"\",");
- }
- if (CIDSTRIdx != 0) {
- CatPrint (Str, L"%a,", AsChar8Array + CIDSTRIdx);
- } else {
- CatPrint (Str, L"\"\",");
- }
- if (UIDSTRIdx != 0) {
- CatPrint (Str, L"%a)", AsChar8Array + UIDSTRIdx);
- } else {
- CatPrint (Str, L"\"\")");
- }
- }
-
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathAdrAcpi (
- IN OUT POOL_PRINT *Str,
- IN ACPI_ADR_DEVICE_PATH *DevPath
- )
-{
- ACPI_ADR_DEVICE_PATH *AcpiAdr;
- UINT16 Index;
- UINT16 Length;
- UINT16 AdditionalAdrCount;
-
- AcpiAdr = DevPath;
- Length = (UINT16) DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr);
- AdditionalAdrCount = (UINT16) ((Length - 8) / 4);
-
- CatPrint (Str, L"AcpiAdr(%x", (UINTN) AcpiAdr->ADR);
- for (Index = 0; Index < AdditionalAdrCount; Index++) {
- CatPrint (Str, L",%x", (UINTN) *(UINT32 *) ((UINT8 *) AcpiAdr + 8 + Index * 4));
- }
- CatPrint (Str, L")");
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathAtapi (
- IN OUT POOL_PRINT *Str,
- IN ATAPI_DEVICE_PATH *DevPath
- )
-{
- ATAPI_DEVICE_PATH *Atapi;
-
- Atapi = DevPath;
- CatPrint (
- Str,
- L"Ata(%s,%s)",
- (Atapi->PrimarySecondary != 0)? L"Secondary" : L"Primary",
- (Atapi->SlaveMaster != 0)? L"Slave" : L"Master"
- );
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathScsi (
- IN OUT POOL_PRINT *Str,
- IN SCSI_DEVICE_PATH *DevPath
- )
-{
- SCSI_DEVICE_PATH *Scsi;
-
- Scsi = DevPath;
- CatPrint (Str, L"Scsi(Pun%x,Lun%x)", (UINTN) Scsi->Pun, (UINTN) Scsi->Lun);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathFibre (
- IN OUT POOL_PRINT *Str,
- IN FIBRECHANNEL_DEVICE_PATH *DevPath
- )
-{
- FIBRECHANNEL_DEVICE_PATH *Fibre;
-
- Fibre = DevPath;
- CatPrint (Str, L"Fibre(Wwn%lx,Lun%x)", Fibre->WWN, Fibre->Lun);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPath1394 (
- IN OUT POOL_PRINT *Str,
- IN F1394_DEVICE_PATH *DevPath
- )
-{
- F1394_DEVICE_PATH *F1394Path;
-
- F1394Path = DevPath;
- CatPrint (Str, L"1394(%lx)", &F1394Path->Guid);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathUsb (
- IN OUT POOL_PRINT *Str,
- IN USB_DEVICE_PATH *DevPath
- )
-{
- USB_DEVICE_PATH *Usb;
-
- Usb = DevPath;
- CatPrint (Str, L"Usb(%x,%x)", (UINTN) Usb->ParentPortNumber, (UINTN) Usb->InterfaceNumber);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathUsbWWID (
- IN OUT POOL_PRINT *Str,
- IN USB_WWID_DEVICE_PATH *DevPath
- )
-{
- USB_WWID_DEVICE_PATH *UsbWWId;
-
- UsbWWId = DevPath;
- CatPrint (
- Str,
- L"UsbWwid(%x,%x,%x,\"WWID\")",
- (UINTN) UsbWWId->VendorId,
- (UINTN) UsbWWId->ProductId,
- (UINTN) UsbWWId->InterfaceNumber
- );
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathLogicalUnit (
- IN OUT POOL_PRINT *Str,
- IN DEVICE_LOGICAL_UNIT_DEVICE_PATH *DevPath
- )
-{
- DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;
-
- LogicalUnit = DevPath;
- CatPrint (Str, L"Unit(%x)", (UINTN) LogicalUnit->Lun);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathUsbClass (
- IN OUT POOL_PRINT *Str,
- IN USB_CLASS_DEVICE_PATH *DevPath
- )
-{
- USB_CLASS_DEVICE_PATH *UsbClass;
-
- UsbClass = DevPath;
- CatPrint (
- Str,
- L"Usb Class(%x,%x,%x,%x,%x)",
- (UINTN) UsbClass->VendorId,
- (UINTN) UsbClass->ProductId,
- (UINTN) UsbClass->DeviceClass,
- (UINTN) UsbClass->DeviceSubClass,
- (UINTN) UsbClass->DeviceProtocol
- );
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathSata (
- IN OUT POOL_PRINT *Str,
- IN SATA_DEVICE_PATH *DevPath
- )
-{
- SATA_DEVICE_PATH *Sata;
-
- Sata = DevPath;
- if ((Sata->PortMultiplierPortNumber & SATA_HBA_DIRECT_CONNECT_FLAG) != 0) {
- CatPrint (
- Str,
- L"Sata(%x,%x)",
- (UINTN) Sata->HBAPortNumber,
- (UINTN) Sata->Lun
- );
- } else {
- CatPrint (
- Str,
- L"Sata(%x,%x,%x)",
- (UINTN) Sata->HBAPortNumber,
- (UINTN) Sata->PortMultiplierPortNumber,
- (UINTN) Sata->Lun
- );
- }
-}
-
-/**
- Converts a NVM Express Namespace device path structure to its string representative.
-
- @param Str The string representative of input device.
- @param DevPath The input device path structure.
- @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation
- of the display node is used, where applicable. If DisplayOnly
- is FALSE, then the longer text representation of the display node
- is used.
- @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text
- representation for a device node can be used, where applicable.
-
- **/
-VOID
-DevPathToTextNVMe (
- IN OUT POOL_PRINT *Str,
- IN NVME_NAMESPACE_DEVICE_PATH *DevPath /*,
- IN BOOLEAN DisplayOnly,
- IN BOOLEAN AllowShortcuts */
- )
-{
- NVME_NAMESPACE_DEVICE_PATH *Nvme;
- UINT8 *Uuid;
-
- Nvme = DevPath;
- Uuid = (UINT8 *) &Nvme->NamespaceUuid;
- CatPrint (
- Str,
- L"NVMe(0x%x,%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)",
- Nvme->NamespaceId,
- Uuid[7], Uuid[6], Uuid[5], Uuid[4],
- Uuid[3], Uuid[2], Uuid[1], Uuid[0]
- );
-}
-
-
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathI2O (
- IN OUT POOL_PRINT *Str,
- IN I2O_DEVICE_PATH *DevPath
- )
-{
- I2O_DEVICE_PATH *I2OPath;
-
- I2OPath = DevPath;
- CatPrint (Str, L"I2O(%x)", (UINTN) I2OPath->Tid);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathMacAddr (
- IN OUT POOL_PRINT *Str,
- IN MAC_ADDR_DEVICE_PATH *DevPath
- )
-{
- MAC_ADDR_DEVICE_PATH *MACDevPath;
- UINTN HwAddressSize;
- UINTN Index;
-
- MACDevPath = DevPath;
-
- HwAddressSize = sizeof (EFI_MAC_ADDRESS);
- if (MACDevPath->IfType == 0x01 || MACDevPath->IfType == 0x00) {
- HwAddressSize = 6;
- }
-
- CatPrint (Str, L"Mac(");
-
- for (Index = 0; Index < HwAddressSize; Index++) {
- CatPrint (Str, L"%02x", (UINTN) MACDevPath->MacAddress.Addr[Index]);
- }
-
- CatPrint (Str, L")");
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathIPv4 (
- IN OUT POOL_PRINT *Str,
- IN IPv4_DEVICE_PATH *DevPath
- )
-{
- IPv4_DEVICE_PATH *IPDevPath;
-
- IPDevPath = DevPath;
- CatPrint (
- Str,
- L"IPv4(%d.%d.%d.%d:%d)",
- (UINTN) IPDevPath->RemoteIpAddress.Addr[0],
- (UINTN) IPDevPath->RemoteIpAddress.Addr[1],
- (UINTN) IPDevPath->RemoteIpAddress.Addr[2],
- (UINTN) IPDevPath->RemoteIpAddress.Addr[3],
- (UINTN) IPDevPath->RemotePort
- );
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathIPv6 (
- IN OUT POOL_PRINT *Str,
- IN IPv6_DEVICE_PATH *DevPath
- )
-{
- IPv6_DEVICE_PATH *IPv6DevPath;
-
- IPv6DevPath = DevPath;
- CatPrint (
- Str,
- L"IPv6(%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x)",
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[0],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[1],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[2],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[3],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[4],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[5],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[6],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[7],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[8],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[9],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[10],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[11],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[12],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[13],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[14],
- (UINTN) IPv6DevPath->RemoteIpAddress.Addr[15]
- );
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathInfiniBand (
- IN OUT POOL_PRINT *Str,
- IN INFINIBAND_DEVICE_PATH *DevPath
- )
-{
- INFINIBAND_DEVICE_PATH *InfiniBand;
-
- InfiniBand = DevPath;
- CatPrint (
- Str,
- L"Infiniband(%x,%g,%lx,%lx,%lx)",
- (UINTN) InfiniBand->ResourceFlags,
- InfiniBand->PortGid,
- InfiniBand->ServiceId,
- InfiniBand->TargetPortId,
- InfiniBand->DeviceId
- );
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathUart (
- IN OUT POOL_PRINT *Str,
- IN UART_DEVICE_PATH *DevPath
- )
-{
- UART_DEVICE_PATH *Uart;
- CHAR8 Parity;
-
- Uart = DevPath;
- switch (Uart->Parity) {
- case 0:
- Parity = 'D';
- break;
-
- case 1:
- Parity = 'N';
- break;
-
- case 2:
- Parity = 'E';
- break;
-
- case 3:
- Parity = 'O';
- break;
-
- case 4:
- Parity = 'M';
- break;
-
- case 5:
- Parity = 'S';
- break;
-
- default:
- Parity = 'x';
- break;
- }
-
- if (Uart->BaudRate == 0) {
- CatPrint (Str, L"Uart(DEFAULT,%c,", Parity);
- } else {
- CatPrint (Str, L"Uart(%ld,%c,", Uart->BaudRate, Parity);
- }
-
- if (Uart->DataBits == 0) {
- CatPrint (Str, L"D,");
- } else {
- CatPrint (Str, L"%d,", (UINTN) Uart->DataBits);
- }
-
- switch (Uart->StopBits) {
- case 0:
- CatPrint (Str, L"D)");
- break;
-
- case 1:
- CatPrint (Str, L"1)");
- break;
-
- case 2:
- CatPrint (Str, L"1.5)");
- break;
-
- case 3:
- CatPrint (Str, L"2)");
- break;
-
- default:
- CatPrint (Str, L"x)");
- break;
- }
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathiSCSI (
- IN OUT POOL_PRINT *Str,
- IN ISCSI_DEVICE_PATH_WITH_NAME *DevPath
- )
-{
- ISCSI_DEVICE_PATH_WITH_NAME *IScsi;
- UINT16 Options;
-
- IScsi = DevPath;
- CatPrint (
- Str,
- L"iSCSI(%a,%x,%lx,",
- IScsi->TargetName,
- (UINTN) IScsi->TargetPortalGroupTag,
- IScsi->Lun
- );
-
- Options = IScsi->LoginOption;
- CatPrint (Str, L"%s,", (((Options >> 1) & 0x0001) != 0) ? L"CRC32C" : L"None");
- CatPrint (Str, L"%s,", (((Options >> 3) & 0x0001) != 0) ? L"CRC32C" : L"None");
- if (((Options >> 11) & 0x0001) != 0) {
- CatPrint (Str, L"%s,", L"None");
- } else if (((Options >> 12) & 0x0001) != 0) {
- CatPrint (Str, L"%s,", L"CHAP_UNI");
- } else {
- CatPrint (Str, L"%s,", L"CHAP_BI");
-
- }
-
- CatPrint (Str, L"%s)", (IScsi->NetworkProtocol == 0) ? L"TCP" : L"reserved");
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maixmum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathVlan (
- IN OUT POOL_PRINT *Str,
- IN VLAN_DEVICE_PATH *DevPath
- )
-{
- VLAN_DEVICE_PATH *Vlan;
-
- Vlan = DevPath;
- CatPrint (Str, L"Vlan(%d)", (UINTN) Vlan->VlanId);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maixmum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathHardDrive (
- IN OUT POOL_PRINT *Str,
- IN HARDDRIVE_DEVICE_PATH *DevPath
- )
-{
- HARDDRIVE_DEVICE_PATH *Hd;
-
- Hd = DevPath;
- switch (Hd->SignatureType) {
- case SIGNATURE_TYPE_MBR:
- CatPrint (
- Str,
- L"HD(Part%d,Sig%08x)",
- (UINTN) Hd->PartitionNumber,
- (UINTN) *((UINT32 *) (&(Hd->Signature[0])))
- );
- break;
-
- case SIGNATURE_TYPE_GUID:
- CatPrint (
- Str,
- L"HD(Part%d,Sig%g)",
- (UINTN) Hd->PartitionNumber,
- (EFI_GUID *) &(Hd->Signature[0])
- );
- break;
-
- default:
- CatPrint (
- Str,
- L"HD(Part%d,MBRType=%02x,SigType=%02x)",
- (UINTN) Hd->PartitionNumber,
- (UINTN) Hd->MBRType,
- (UINTN) Hd->SignatureType
- );
- break;
- }
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathCDROM (
- IN OUT POOL_PRINT *Str,
- IN CDROM_DEVICE_PATH *DevPath
- )
-{
- CDROM_DEVICE_PATH *Cd;
-
- Cd = DevPath;
- CatPrint (Str, L"CDROM(Entry%x)", (UINTN) Cd->BootEntry);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathFilePath (
- IN OUT POOL_PRINT *Str,
- IN FILEPATH_DEVICE_PATH *DevPath
- )
-{
- FILEPATH_DEVICE_PATH *Fp;
-
- Fp = DevPath;
- CatPrint (Str, L"%s", Fp->PathName);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathMediaProtocol (
- IN OUT POOL_PRINT *Str,
- IN MEDIA_PROTOCOL_DEVICE_PATH *DevPath
- )
-{
- MEDIA_PROTOCOL_DEVICE_PATH *MediaProt;
-
- MediaProt = DevPath;
- CatPrint (Str, L"Media(%g)", &MediaProt->Protocol);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathFvFilePath (
- IN OUT POOL_PRINT *Str,
- IN MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *DevPath
- )
-{
- MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFilePath;
-
- FvFilePath = DevPath;
- CatPrint (Str, L"%g", &FvFilePath->FvFileName);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathRelativeOffsetRange0 (
- IN OUT POOL_PRINT *Str,
- IN MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *DevPath
- )
-{
- MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;
-
- Offset = DevPath;
- CatPrint (
- Str,
- L"Offset(%lx,%lx)",
- Offset->StartingOffset,
- Offset->EndingOffset
- );
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathBssBss (
- IN OUT POOL_PRINT *Str,
- IN BBS_BBS_DEVICE_PATH *DevPath
- )
-{
- BBS_BBS_DEVICE_PATH *Bbs;
- CONST CHAR16 *Type;
-
- Bbs = DevPath;
- switch (Bbs->DeviceType) {
- case BBS_TYPE_FLOPPY:
- Type = L"Floppy";
- break;
-
- case BBS_TYPE_HARDDRIVE:
- Type = L"Harddrive";
- break;
-
- case BBS_TYPE_CDROM:
- Type = L"CDROM";
- break;
-
- case BBS_TYPE_PCMCIA:
- Type = L"PCMCIA";
- break;
-
- case BBS_TYPE_USB:
- Type = L"Usb";
- break;
-
- case BBS_TYPE_EMBEDDED_NETWORK:
- Type = L"Net";
- break;
-
- case BBS_TYPE_BEV:
- Type = L"BEV";
- break;
-
- default:
- Type = L"?";
- break;
- }
- CatPrint (Str, L"Legacy-%s", Type);
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathEndInstance (
- IN OUT POOL_PRINT *Str,
- IN VOID *DevPath
- )
-{
- CatPrint (Str, L",");
-}
-
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathNodeUnknown (
- IN OUT POOL_PRINT *Str,
- IN VOID *DevPath
- )
-{
- CatPrint (Str, L"?");
-}
-/**
- Convert Device Path to a Unicode string for printing.
-
- @param Str The buffer holding the output string.
- This buffer contains the length of the
- string and the maximum length reserved
- for the string buffer.
- @param DevPath The device path.
-
-**/
-static VOID
-DevPathFvPath (
- IN OUT POOL_PRINT *Str,
- IN MEDIA_FW_VOL_DEVICE_PATH *DevPath
- )
-{
- MEDIA_FW_VOL_DEVICE_PATH *FvPath;
-
- FvPath = DevPath;
- CatPrint (Str, L"Fv(%g)", &FvPath->FvName);
-}
-
-DEVICE_PATH_STRING_TABLE DevPathTable[] = {
- {
- HARDWARE_DEVICE_PATH,
- HW_PCI_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathPci
- },
- {
- HARDWARE_DEVICE_PATH,
- HW_PCCARD_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathPccard
- },
- {
- HARDWARE_DEVICE_PATH,
- HW_MEMMAP_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathMemMap
- },
- {
- HARDWARE_DEVICE_PATH,
- HW_VENDOR_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathVendor
- },
- {
- HARDWARE_DEVICE_PATH,
- HW_CONTROLLER_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathController
- },
- {
- ACPI_DEVICE_PATH,
- ACPI_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathAcpi
- },
- {
- ACPI_DEVICE_PATH,
- ACPI_EXTENDED_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathExtendedAcpi
- },
- {
- ACPI_DEVICE_PATH,
- ACPI_ADR_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathAdrAcpi
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_ATAPI_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathAtapi
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_SCSI_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathScsi
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_FIBRECHANNEL_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathFibre
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_1394_DP,
- (DEV_PATH_FUNCTION_VOID)DevPath1394
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_USB_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathUsb
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_USB_WWID_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathUsbWWID
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_DEVICE_LOGICAL_UNIT_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathLogicalUnit
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_USB_CLASS_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathUsbClass
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_SATA_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathSata
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_NVME_NAMESPACE_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathToTextNVMe
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_I2O_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathI2O
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_MAC_ADDR_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathMacAddr
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_IPv4_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathIPv4
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_IPv6_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathIPv6
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_INFINIBAND_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathInfiniBand
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_UART_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathUart
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_VENDOR_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathVendor
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_ISCSI_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathiSCSI
- },
- {
- MESSAGING_DEVICE_PATH,
- MSG_VLAN_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathVlan
- },
- {
- MEDIA_DEVICE_PATH,
- MEDIA_HARDDRIVE_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathHardDrive
- },
- {
- MEDIA_DEVICE_PATH,
- MEDIA_CDROM_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathCDROM
- },
- {
- MEDIA_DEVICE_PATH,
- MEDIA_VENDOR_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathVendor
- },
- {
- MEDIA_DEVICE_PATH,
- MEDIA_FILEPATH_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathFilePath
- },
- {
- MEDIA_DEVICE_PATH,
- MEDIA_PROTOCOL_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathMediaProtocol
- },
- {
- MEDIA_DEVICE_PATH,
- MEDIA_PIWG_FW_VOL_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathFvPath,
- },
- {
- MEDIA_DEVICE_PATH,
- MEDIA_PIWG_FW_FILE_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathFvFilePath
- },
- {
- MEDIA_DEVICE_PATH,
- MEDIA_RELATIVE_OFFSET_RANGE_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathRelativeOffsetRange0,
- },
- {
- BBS_DEVICE_PATH,
- BBS_BBS_DP,
- (DEV_PATH_FUNCTION_VOID)DevPathBssBss
- },
- {
- END_DEVICE_PATH_TYPE,
- END_INSTANCE_DEVICE_PATH_SUBTYPE,
- (DEV_PATH_FUNCTION_VOID)DevPathEndInstance
- },
- {
- 0,
- 0,
- (DEV_PATH_FUNCTION_VOID)NULL
- }
-};
-
-
-/**
- This function converts an input device structure to a Unicode string.
-
- @param DevPath A pointer to the device path structure.
-
- @return A new allocated Unicode string that represents the device path.
-
-**/
-CHAR16 *
-EFIAPI
-DevicePathToStr (
- IN EFI_DEVICE_PATH_PROTOCOL *DevPath
- )
-{
- POOL_PRINT Str;
- EFI_DEVICE_PATH_PROTOCOL *DevPathNode;
- VOID (*DumpNode) (POOL_PRINT *, VOID *);
-
- UINTN Index;
- UINTN NewSize;
-
- EFI_STATUS Status;
- CHAR16 *ToText;
- EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevPathToText;
-
- ZeroMem (&Str, sizeof (Str));
-
- if (DevPath == NULL) {
- goto Done;
- }
-
- Status = gBS->LocateProtocol (
- &gEfiDevicePathToTextProtocolGuid,
- NULL,
- (VOID **) &DevPathToText
- );
- if (!EFI_ERROR (Status)) {
- ToText = DevPathToText->ConvertDevicePathToText (
- DevPath,
- FALSE,
- TRUE
- );
-// ASSERT (ToText != NULL);
- return ToText;
- }
-
- //
- // Process each device path node
- //
- DevPathNode = DevPath;
- while (!IsDevicePathEnd (DevPathNode)) {
- //
- // Find the handler to dump this device path node
- //
- DumpNode = NULL;
- for (Index = 0; DevPathTable[Index].Function != NULL; Index += 1) {
-
- if (DevicePathType (DevPathNode) == DevPathTable[Index].Type &&
- DevicePathSubType (DevPathNode) == DevPathTable[Index].SubType
- ) {
- DumpNode = DevPathTable[Index].Function;
- break;
- }
- }
- //
- // If not found, use a generic function
- //
- if (!DumpNode) {
- DumpNode = DevPathNodeUnknown;
- }
- //
- // Put a path separator in if needed
- //
- if ((Str.Len != 0) && (DumpNode != DevPathEndInstance)) {
- CatPrint (&Str, L"/");
- }
- //
- // Print this node of the device path
- //
- DumpNode (&Str, DevPathNode);
-
- //
- // Next device path node
- //
- DevPathNode = NextDevicePathNode (DevPathNode);
- }
-
-Done:
- NewSize = (Str.Len + 1) * sizeof (CHAR16);
- Str.Str = (__typeof__(Str.Str))ReallocatePool (NewSize, NewSize, Str.Str);
-// ASSERT (Str.Str != NULL);
- if (!Str.Str) {
- return NULL;
- }
-
- Str.Str[Str.Len] = 0;
- return Str.Str;
-}
+///** @file DevicePath.c
+// BDS internal function define the default device path string, it can be
+// replaced by platform device path.
+//
+//Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.
+//This program and the accompanying materials
+//are licensed and made available under the terms and conditions of the BSD License
+//which accompanies this distribution. The full text of the license may be found at
+//http://opensource.org/licenses/bsd-license.php
+//
+//THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+//WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+//
+//**/
+//
+//#include "Platform.h"
+////#include
+////#include "InternalBdsLib.h"
+//
+///**
+// Concatenates a formatted unicode string to allocated pool.
+// The caller must free the resulting buffer.
+//
+// @param Str Tracks the allocated pool, size in use, and amount of pool allocated.
+// @param Fmt The format string
+// @param ... The data will be printed.
+//
+// @return Allocated buffer with the formatted string printed in it.
+// The caller must free the allocated buffer.
+// The buffer allocation is not packed.
+//
+//**/
+//CHAR16 *
+//EFIAPI
+//CatPrint (
+// IN OUT POOL_PRINT *Str,
+// IN CONST CHAR16 *Fmt,
+// ...
+// )
+//{
+// CHAR16 *AppendStr;
+// VA_LIST Args;
+// UINTN StringSize;
+//
+// AppendStr = (__typeof__(AppendStr))AllocateZeroPool (0x1000);
+// if (AppendStr == NULL) {
+// return Str->Str;
+// }
+//
+// VA_START (Args, Fmt);
+// UnicodeVSPrint (AppendStr, 0x1000, Fmt, Args);
+// VA_END (Args);
+// if (NULL == Str->Str) {
+// StringSize = StrSize (AppendStr);
+// Str->Str = (__typeof__(Str->Str))AllocateZeroPool (StringSize);
+//// ASSERT (Str->Str != NULL);
+// } else {
+// StringSize = StrSize (AppendStr);
+// StringSize += (StrSize (Str->Str) - sizeof (UINT16));
+//
+// Str->Str = (__typeof__(Str->Str))ReallocatePool (
+// StrSize (Str->Str),
+// StringSize,
+// Str->Str
+// );
+//// ASSERT (Str->Str != NULL);
+// }
+//
+// Str->Maxlen = MAX_CHAR * sizeof (UINT16);
+// if (StringSize < Str->Maxlen) {
+// StrCatS (Str->Str, StringSize, AppendStr);
+// Str->Len = StringSize - sizeof (UINT16);
+// }
+//
+// FreePool (AppendStr);
+// return Str->Str;
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathPci (
+// IN OUT POOL_PRINT *Str,
+// IN PCI_DEVICE_PATH *DevPath
+// )
+//{
+// PCI_DEVICE_PATH *Pci;
+//
+// Pci = DevPath;
+// CatPrint (Str, L"Pci(%x|%x)", (UINTN) Pci->Device, (UINTN) Pci->Function);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathPccard (
+// IN OUT POOL_PRINT *Str,
+// IN PCCARD_DEVICE_PATH *DevPath
+// )
+//{
+// PCCARD_DEVICE_PATH *Pccard;
+//
+// Pccard = DevPath;
+// CatPrint (Str, L"Pcmcia(Function%x)", (UINTN) Pccard->FunctionNumber);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathMemMap (
+// IN OUT POOL_PRINT *Str,
+// IN MEMMAP_DEVICE_PATH *DevPath
+// )
+//{
+// MEMMAP_DEVICE_PATH *MemMap;
+//
+// MemMap = DevPath;
+// CatPrint (
+// Str,
+// L"MemMap(%d:%lx-%lx)",
+// (UINTN) MemMap->MemoryType,
+// MemMap->StartingAddress,
+// MemMap->EndingAddress
+// );
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathController (
+// IN OUT POOL_PRINT *Str,
+// IN CONTROLLER_DEVICE_PATH *DevPath
+// )
+//{
+// CONTROLLER_DEVICE_PATH *Controller;
+//
+// Controller = DevPath;
+// CatPrint (Str, L"Ctrl(%d)", (UINTN) Controller->ControllerNumber);
+//}
+//
+//
+///**
+// Convert Vendor device path to device name.
+//
+// @param Str The buffer store device name
+// @param DevPath Pointer to vendor device path
+//
+//**/
+//VOID
+//DevPathVendor (
+// IN OUT POOL_PRINT *Str,
+// IN VENDOR_DEVICE_PATH *DevPath
+// )
+//{
+// VENDOR_DEVICE_PATH *Vendor;
+// CONST CHAR16 *Type;
+// UINTN DataLength;
+// UINTN Index;
+//// UINT32 FlowControlMap;
+//
+// UINT16 Info;
+//
+// Vendor = DevPath;
+//
+// switch (DevicePathType (&Vendor->Header)) {
+// case HARDWARE_DEVICE_PATH:
+// Type = L"Hw";
+// break;
+//
+// case MESSAGING_DEVICE_PATH:
+// Type = L"Msg";
+// /* if (CompareGuid (&Vendor->Guid, &gEfiPcAnsiGuid)) {
+// CatPrint (Str, L"VenPcAnsi()");
+// return ;
+// } else if (CompareGuid (&Vendor->Guid, &gEfiVT100Guid)) {
+// CatPrint (Str, L"VenVt100()");
+// return ;
+// } else if (CompareGuid (&Vendor->Guid, &gEfiVT100PlusGuid)) {
+// CatPrint (Str, L"VenVt100Plus()");
+// return ;
+// } else if (CompareGuid (&Vendor->Guid, &gEfiVTUTF8Guid)) {
+// CatPrint (Str, L"VenUft8()");
+// return ;
+// } else if (CompareGuid (&Vendor->Guid, &gEfiUartDevicePathGuid )) {
+// FlowControlMap = (((UART_FLOW_CONTROL_DEVICE_PATH *) Vendor)->FlowControlMap);
+// switch (FlowControlMap & 0x00000003) {
+// case 0:
+// CatPrint (Str, L"UartFlowCtrl(%s)", L"None");
+// break;
+//
+// case 1:
+// CatPrint (Str, L"UartFlowCtrl(%s)", L"Hardware");
+// break;
+//
+// case 2:
+// CatPrint (Str, L"UartFlowCtrl(%s)", L"XonXoff");
+// break;
+//
+// default:
+// break;
+// }
+//
+// return ;
+//
+// } else
+//*/
+// if (CompareGuid (&Vendor->Guid, &gEfiSasDevicePathGuid)) {
+// CatPrint (
+// Str,
+// L"SAS(%lx,%lx,%x,",
+// ((SAS_DEVICE_PATH *) Vendor)->SasAddress,
+// ((SAS_DEVICE_PATH *) Vendor)->Lun,
+// (UINTN) ((SAS_DEVICE_PATH *) Vendor)->RelativeTargetPort
+// );
+// Info = (((SAS_DEVICE_PATH *) Vendor)->DeviceTopology);
+// if ((Info & 0x0f) == 0) {
+// CatPrint (Str, L"NoTopology,0,0,0,");
+// } else if (((Info & 0x0f) == 1) || ((Info & 0x0f) == 2)) {
+// CatPrint (
+// Str,
+// L"%s,%s,%s,",
+// ((Info & (0x1 << 4)) != 0) ? L"SATA" : L"SAS",
+// ((Info & (0x1 << 5)) != 0) ? L"External" : L"Internal",
+// ((Info & (0x1 << 6)) != 0) ? L"Expanded" : L"Direct"
+// );
+// if ((Info & 0x0f) == 1) {
+// CatPrint (Str, L"0,");
+// } else {
+// CatPrint (Str, L"%x,", (UINTN) ((Info >> 8) & 0xff));
+// }
+// } else {
+// CatPrint (Str, L"0,0,0,0,");
+// }
+//
+// CatPrint (Str, L"%x)", (UINTN) ((SAS_DEVICE_PATH *) Vendor)->Reserved);
+// return ;
+//
+// } else if (CompareGuid (&Vendor->Guid, &gEfiDebugPortProtocolGuid)) {
+// CatPrint (Str, L"DebugPort()");
+// return ;
+// }
+// break;
+//
+// case MEDIA_DEVICE_PATH:
+// Type = L"Media";
+// break;
+//
+// default:
+// Type = L"?";
+// break;
+// }
+//
+// CatPrint (Str, L"Ven%s(%g", Type, &Vendor->Guid);
+// DataLength = DevicePathNodeLength (&Vendor->Header) - sizeof (VENDOR_DEVICE_PATH);
+// if (DataLength > 0) {
+// CatPrint (Str, L",");
+// for (Index = 0; Index < DataLength; Index++) {
+// CatPrint (Str, L"%02x", (UINTN) ((VENDOR_DEVICE_PATH_WITH_DATA *) Vendor)->VendorDefinedData[Index]);
+// }
+// }
+// CatPrint (Str, L")");
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathAcpi (
+// IN OUT POOL_PRINT *Str,
+// IN ACPI_HID_DEVICE_PATH *DevPath
+// )
+//{
+// ACPI_HID_DEVICE_PATH *Acpi;
+//
+// Acpi = DevPath;
+// if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
+// CatPrint (Str, L"Acpi(PNP%04x,%x)", (UINTN) EISA_ID_TO_NUM (Acpi->HID), (UINTN) Acpi->UID);
+// } else {
+// CatPrint (Str, L"Acpi(%08x,%x)", (UINTN) Acpi->HID, (UINTN) Acpi->UID);
+// }
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathExtendedAcpi (
+// IN OUT POOL_PRINT *Str,
+// IN ACPI_EXTENDED_HID_DEVICE_PATH *DevPath
+// )
+//{
+// ACPI_EXTENDED_HID_DEVICE_PATH *ExtendedAcpi;
+//
+// //
+// // Index for HID, UID and CID strings, 0 for non-exist
+// //
+// UINT16 HIDSTRIdx;
+// UINT16 UIDSTRIdx;
+// UINT16 CIDSTRIdx;
+// UINT16 Index;
+// UINT16 Length;
+// UINT16 Anchor;
+// CHAR8 *AsChar8Array;
+//
+// HIDSTRIdx = 0;
+// UIDSTRIdx = 0;
+// CIDSTRIdx = 0;
+// ExtendedAcpi = DevPath;
+// Length = (UINT16) DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) ExtendedAcpi);
+//
+// AsChar8Array = (CHAR8 *) ExtendedAcpi;
+//
+// //
+// // find HIDSTR
+// //
+// Anchor = 16;
+// for (Index = Anchor; Index < Length && AsChar8Array[Index] != '\0'; Index++) {
+// ;
+// }
+// if (Index > Anchor) {
+// HIDSTRIdx = Anchor;
+// }
+// //
+// // find UIDSTR
+// //
+// Anchor = (UINT16) (Index + 1);
+// for (Index = Anchor; Index < Length && AsChar8Array[Index] != '\0'; Index++) {
+// ;
+// }
+// if (Index > Anchor) {
+// UIDSTRIdx = Anchor;
+// }
+// //
+// // find CIDSTR
+// //
+// Anchor = (UINT16) (Index + 1);
+// for (Index = Anchor; Index < Length && AsChar8Array[Index] != '\0'; Index++) {
+// ;
+// }
+// if (Index > Anchor) {
+// CIDSTRIdx = Anchor;
+// }
+//
+// if (HIDSTRIdx == 0 && CIDSTRIdx == 0 && ExtendedAcpi->UID == 0) {
+// CatPrint (Str, L"AcpiExp(");
+// if ((ExtendedAcpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
+// CatPrint (Str, L"PNP%04x,", (UINTN) EISA_ID_TO_NUM (ExtendedAcpi->HID));
+// } else {
+// CatPrint (Str, L"%08x,", (UINTN) ExtendedAcpi->HID);
+// }
+// if ((ExtendedAcpi->CID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
+// CatPrint (Str, L"PNP%04x,", (UINTN) EISA_ID_TO_NUM (ExtendedAcpi->CID));
+// } else {
+// CatPrint (Str, L"%08x,", (UINTN) ExtendedAcpi->CID);
+// }
+// if (UIDSTRIdx != 0) {
+// CatPrint (Str, L"%a)", AsChar8Array + UIDSTRIdx);
+// } else {
+// CatPrint (Str, L"\"\")");
+// }
+// } else {
+// CatPrint (Str, L"AcpiEx(");
+// if ((ExtendedAcpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
+// CatPrint (Str, L"PNP%04x,", (UINTN) EISA_ID_TO_NUM (ExtendedAcpi->HID));
+// } else {
+// CatPrint (Str, L"%08x,", (UINTN) ExtendedAcpi->HID);
+// }
+// if ((ExtendedAcpi->CID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) {
+// CatPrint (Str, L"PNP%04x,", (UINTN) EISA_ID_TO_NUM (ExtendedAcpi->CID));
+// } else {
+// CatPrint (Str, L"%08x,", (UINTN) ExtendedAcpi->CID);
+// }
+// CatPrint (Str, L"%x,", (UINTN) ExtendedAcpi->UID);
+//
+// if (HIDSTRIdx != 0) {
+// CatPrint (Str, L"%a,", AsChar8Array + HIDSTRIdx);
+// } else {
+// CatPrint (Str, L"\"\",");
+// }
+// if (CIDSTRIdx != 0) {
+// CatPrint (Str, L"%a,", AsChar8Array + CIDSTRIdx);
+// } else {
+// CatPrint (Str, L"\"\",");
+// }
+// if (UIDSTRIdx != 0) {
+// CatPrint (Str, L"%a)", AsChar8Array + UIDSTRIdx);
+// } else {
+// CatPrint (Str, L"\"\")");
+// }
+// }
+//
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathAdrAcpi (
+// IN OUT POOL_PRINT *Str,
+// IN ACPI_ADR_DEVICE_PATH *DevPath
+// )
+//{
+// ACPI_ADR_DEVICE_PATH *AcpiAdr;
+// UINT16 Index;
+// UINT16 Length;
+// UINT16 AdditionalAdrCount;
+//
+// AcpiAdr = DevPath;
+// Length = (UINT16) DevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr);
+// AdditionalAdrCount = (UINT16) ((Length - 8) / 4);
+//
+// CatPrint (Str, L"AcpiAdr(%x", (UINTN) AcpiAdr->ADR);
+// for (Index = 0; Index < AdditionalAdrCount; Index++) {
+// CatPrint (Str, L",%x", (UINTN) *(UINT32 *) ((UINT8 *) AcpiAdr + 8 + Index * 4));
+// }
+// CatPrint (Str, L")");
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathAtapi (
+// IN OUT POOL_PRINT *Str,
+// IN ATAPI_DEVICE_PATH *DevPath
+// )
+//{
+// ATAPI_DEVICE_PATH *Atapi;
+//
+// Atapi = DevPath;
+// CatPrint (
+// Str,
+// L"Ata(%s,%s)",
+// (Atapi->PrimarySecondary != 0)? L"Secondary" : L"Primary",
+// (Atapi->SlaveMaster != 0)? L"Slave" : L"Master"
+// );
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathScsi (
+// IN OUT POOL_PRINT *Str,
+// IN SCSI_DEVICE_PATH *DevPath
+// )
+//{
+// SCSI_DEVICE_PATH *Scsi;
+//
+// Scsi = DevPath;
+// CatPrint (Str, L"Scsi(Pun%x,Lun%x)", (UINTN) Scsi->Pun, (UINTN) Scsi->Lun);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathFibre (
+// IN OUT POOL_PRINT *Str,
+// IN FIBRECHANNEL_DEVICE_PATH *DevPath
+// )
+//{
+// FIBRECHANNEL_DEVICE_PATH *Fibre;
+//
+// Fibre = DevPath;
+// CatPrint (Str, L"Fibre(Wwn%lx,Lun%x)", Fibre->WWN, Fibre->Lun);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPath1394 (
+// IN OUT POOL_PRINT *Str,
+// IN F1394_DEVICE_PATH *DevPath
+// )
+//{
+// F1394_DEVICE_PATH *F1394Path;
+//
+// F1394Path = DevPath;
+// CatPrint (Str, L"1394(%lx)", &F1394Path->Guid);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathUsb (
+// IN OUT POOL_PRINT *Str,
+// IN USB_DEVICE_PATH *DevPath
+// )
+//{
+// USB_DEVICE_PATH *Usb;
+//
+// Usb = DevPath;
+// CatPrint (Str, L"Usb(%x,%x)", (UINTN) Usb->ParentPortNumber, (UINTN) Usb->InterfaceNumber);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathUsbWWID (
+// IN OUT POOL_PRINT *Str,
+// IN USB_WWID_DEVICE_PATH *DevPath
+// )
+//{
+// USB_WWID_DEVICE_PATH *UsbWWId;
+//
+// UsbWWId = DevPath;
+// CatPrint (
+// Str,
+// L"UsbWwid(%x,%x,%x,\"WWID\")",
+// (UINTN) UsbWWId->VendorId,
+// (UINTN) UsbWWId->ProductId,
+// (UINTN) UsbWWId->InterfaceNumber
+// );
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathLogicalUnit (
+// IN OUT POOL_PRINT *Str,
+// IN DEVICE_LOGICAL_UNIT_DEVICE_PATH *DevPath
+// )
+//{
+// DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;
+//
+// LogicalUnit = DevPath;
+// CatPrint (Str, L"Unit(%x)", (UINTN) LogicalUnit->Lun);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathUsbClass (
+// IN OUT POOL_PRINT *Str,
+// IN USB_CLASS_DEVICE_PATH *DevPath
+// )
+//{
+// USB_CLASS_DEVICE_PATH *UsbClass;
+//
+// UsbClass = DevPath;
+// CatPrint (
+// Str,
+// L"Usb Class(%x,%x,%x,%x,%x)",
+// (UINTN) UsbClass->VendorId,
+// (UINTN) UsbClass->ProductId,
+// (UINTN) UsbClass->DeviceClass,
+// (UINTN) UsbClass->DeviceSubClass,
+// (UINTN) UsbClass->DeviceProtocol
+// );
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathSata (
+// IN OUT POOL_PRINT *Str,
+// IN SATA_DEVICE_PATH *DevPath
+// )
+//{
+// SATA_DEVICE_PATH *Sata;
+//
+// Sata = DevPath;
+// if ((Sata->PortMultiplierPortNumber & SATA_HBA_DIRECT_CONNECT_FLAG) != 0) {
+// CatPrint (
+// Str,
+// L"Sata(%x,%x)",
+// (UINTN) Sata->HBAPortNumber,
+// (UINTN) Sata->Lun
+// );
+// } else {
+// CatPrint (
+// Str,
+// L"Sata(%x,%x,%x)",
+// (UINTN) Sata->HBAPortNumber,
+// (UINTN) Sata->PortMultiplierPortNumber,
+// (UINTN) Sata->Lun
+// );
+// }
+//}
+//
+///**
+// Converts a NVM Express Namespace device path structure to its string representative.
+//
+// @param Str The string representative of input device.
+// @param DevPath The input device path structure.
+// @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation
+// of the display node is used, where applicable. If DisplayOnly
+// is FALSE, then the longer text representation of the display node
+// is used.
+// @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text
+// representation for a device node can be used, where applicable.
+//
+// **/
+//VOID
+//DevPathToTextNVMe (
+// IN OUT POOL_PRINT *Str,
+// IN NVME_NAMESPACE_DEVICE_PATH *DevPath /*,
+// IN BOOLEAN DisplayOnly,
+// IN BOOLEAN AllowShortcuts */
+// )
+//{
+// NVME_NAMESPACE_DEVICE_PATH *Nvme;
+// UINT8 *Uuid;
+//
+// Nvme = DevPath;
+// Uuid = (UINT8 *) &Nvme->NamespaceUuid;
+// CatPrint (
+// Str,
+// L"NVMe(0x%x,%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)",
+// Nvme->NamespaceId,
+// Uuid[7], Uuid[6], Uuid[5], Uuid[4],
+// Uuid[3], Uuid[2], Uuid[1], Uuid[0]
+// );
+//}
+//
+//
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathI2O (
+// IN OUT POOL_PRINT *Str,
+// IN I2O_DEVICE_PATH *DevPath
+// )
+//{
+// I2O_DEVICE_PATH *I2OPath;
+//
+// I2OPath = DevPath;
+// CatPrint (Str, L"I2O(%x)", (UINTN) I2OPath->Tid);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathMacAddr (
+// IN OUT POOL_PRINT *Str,
+// IN MAC_ADDR_DEVICE_PATH *DevPath
+// )
+//{
+// MAC_ADDR_DEVICE_PATH *MACDevPath;
+// UINTN HwAddressSize;
+// UINTN Index;
+//
+// MACDevPath = DevPath;
+//
+// HwAddressSize = sizeof (EFI_MAC_ADDRESS);
+// if (MACDevPath->IfType == 0x01 || MACDevPath->IfType == 0x00) {
+// HwAddressSize = 6;
+// }
+//
+// CatPrint (Str, L"Mac(");
+//
+// for (Index = 0; Index < HwAddressSize; Index++) {
+// CatPrint (Str, L"%02x", (UINTN) MACDevPath->MacAddress.Addr[Index]);
+// }
+//
+// CatPrint (Str, L")");
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathIPv4 (
+// IN OUT POOL_PRINT *Str,
+// IN IPv4_DEVICE_PATH *DevPath
+// )
+//{
+// IPv4_DEVICE_PATH *IPDevPath;
+//
+// IPDevPath = DevPath;
+// CatPrint (
+// Str,
+// L"IPv4(%d.%d.%d.%d:%d)",
+// (UINTN) IPDevPath->RemoteIpAddress.Addr[0],
+// (UINTN) IPDevPath->RemoteIpAddress.Addr[1],
+// (UINTN) IPDevPath->RemoteIpAddress.Addr[2],
+// (UINTN) IPDevPath->RemoteIpAddress.Addr[3],
+// (UINTN) IPDevPath->RemotePort
+// );
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathIPv6 (
+// IN OUT POOL_PRINT *Str,
+// IN IPv6_DEVICE_PATH *DevPath
+// )
+//{
+// IPv6_DEVICE_PATH *IPv6DevPath;
+//
+// IPv6DevPath = DevPath;
+// CatPrint (
+// Str,
+// L"IPv6(%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x)",
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[0],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[1],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[2],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[3],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[4],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[5],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[6],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[7],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[8],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[9],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[10],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[11],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[12],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[13],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[14],
+// (UINTN) IPv6DevPath->RemoteIpAddress.Addr[15]
+// );
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathInfiniBand (
+// IN OUT POOL_PRINT *Str,
+// IN INFINIBAND_DEVICE_PATH *DevPath
+// )
+//{
+// INFINIBAND_DEVICE_PATH *InfiniBand;
+//
+// InfiniBand = DevPath;
+// CatPrint (
+// Str,
+// L"Infiniband(%x,%g,%lx,%lx,%lx)",
+// (UINTN) InfiniBand->ResourceFlags,
+// InfiniBand->PortGid,
+// InfiniBand->ServiceId,
+// InfiniBand->TargetPortId,
+// InfiniBand->DeviceId
+// );
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathUart (
+// IN OUT POOL_PRINT *Str,
+// IN UART_DEVICE_PATH *DevPath
+// )
+//{
+// UART_DEVICE_PATH *Uart;
+// CHAR8 Parity;
+//
+// Uart = DevPath;
+// switch (Uart->Parity) {
+// case 0:
+// Parity = 'D';
+// break;
+//
+// case 1:
+// Parity = 'N';
+// break;
+//
+// case 2:
+// Parity = 'E';
+// break;
+//
+// case 3:
+// Parity = 'O';
+// break;
+//
+// case 4:
+// Parity = 'M';
+// break;
+//
+// case 5:
+// Parity = 'S';
+// break;
+//
+// default:
+// Parity = 'x';
+// break;
+// }
+//
+// if (Uart->BaudRate == 0) {
+// CatPrint (Str, L"Uart(DEFAULT,%c,", Parity);
+// } else {
+// CatPrint (Str, L"Uart(%ld,%c,", Uart->BaudRate, Parity);
+// }
+//
+// if (Uart->DataBits == 0) {
+// CatPrint (Str, L"D,");
+// } else {
+// CatPrint (Str, L"%d,", (UINTN) Uart->DataBits);
+// }
+//
+// switch (Uart->StopBits) {
+// case 0:
+// CatPrint (Str, L"D)");
+// break;
+//
+// case 1:
+// CatPrint (Str, L"1)");
+// break;
+//
+// case 2:
+// CatPrint (Str, L"1.5)");
+// break;
+//
+// case 3:
+// CatPrint (Str, L"2)");
+// break;
+//
+// default:
+// CatPrint (Str, L"x)");
+// break;
+// }
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathiSCSI (
+// IN OUT POOL_PRINT *Str,
+// IN ISCSI_DEVICE_PATH_WITH_NAME *DevPath
+// )
+//{
+// ISCSI_DEVICE_PATH_WITH_NAME *IScsi;
+// UINT16 Options;
+//
+// IScsi = DevPath;
+// CatPrint (
+// Str,
+// L"iSCSI(%a,%x,%lx,",
+// IScsi->TargetName,
+// (UINTN) IScsi->TargetPortalGroupTag,
+// IScsi->Lun
+// );
+//
+// Options = IScsi->LoginOption;
+// CatPrint (Str, L"%s,", (((Options >> 1) & 0x0001) != 0) ? L"CRC32C" : L"None");
+// CatPrint (Str, L"%s,", (((Options >> 3) & 0x0001) != 0) ? L"CRC32C" : L"None");
+// if (((Options >> 11) & 0x0001) != 0) {
+// CatPrint (Str, L"%s,", L"None");
+// } else if (((Options >> 12) & 0x0001) != 0) {
+// CatPrint (Str, L"%s,", L"CHAP_UNI");
+// } else {
+// CatPrint (Str, L"%s,", L"CHAP_BI");
+//
+// }
+//
+// CatPrint (Str, L"%s)", (IScsi->NetworkProtocol == 0) ? L"TCP" : L"reserved");
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maixmum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathVlan (
+// IN OUT POOL_PRINT *Str,
+// IN VLAN_DEVICE_PATH *DevPath
+// )
+//{
+// VLAN_DEVICE_PATH *Vlan;
+//
+// Vlan = DevPath;
+// CatPrint (Str, L"Vlan(%d)", (UINTN) Vlan->VlanId);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maixmum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathHardDrive (
+// IN OUT POOL_PRINT *Str,
+// IN HARDDRIVE_DEVICE_PATH *DevPath
+// )
+//{
+// HARDDRIVE_DEVICE_PATH *Hd;
+//
+// Hd = DevPath;
+// switch (Hd->SignatureType) {
+// case SIGNATURE_TYPE_MBR:
+// CatPrint (
+// Str,
+// L"HD(Part%d,Sig%08x)",
+// (UINTN) Hd->PartitionNumber,
+// (UINTN) *((UINT32 *) (&(Hd->Signature[0])))
+// );
+// break;
+//
+// case SIGNATURE_TYPE_GUID:
+// CatPrint (
+// Str,
+// L"HD(Part%d,Sig%g)",
+// (UINTN) Hd->PartitionNumber,
+// (EFI_GUID *) &(Hd->Signature[0])
+// );
+// break;
+//
+// default:
+// CatPrint (
+// Str,
+// L"HD(Part%d,MBRType=%02x,SigType=%02x)",
+// (UINTN) Hd->PartitionNumber,
+// (UINTN) Hd->MBRType,
+// (UINTN) Hd->SignatureType
+// );
+// break;
+// }
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathCDROM (
+// IN OUT POOL_PRINT *Str,
+// IN CDROM_DEVICE_PATH *DevPath
+// )
+//{
+// CDROM_DEVICE_PATH *Cd;
+//
+// Cd = DevPath;
+// CatPrint (Str, L"CDROM(Entry%x)", (UINTN) Cd->BootEntry);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathFilePath (
+// IN OUT POOL_PRINT *Str,
+// IN FILEPATH_DEVICE_PATH *DevPath
+// )
+//{
+// FILEPATH_DEVICE_PATH *Fp;
+//
+// Fp = DevPath;
+// CatPrint (Str, L"%s", Fp->PathName);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathMediaProtocol (
+// IN OUT POOL_PRINT *Str,
+// IN MEDIA_PROTOCOL_DEVICE_PATH *DevPath
+// )
+//{
+// MEDIA_PROTOCOL_DEVICE_PATH *MediaProt;
+//
+// MediaProt = DevPath;
+// CatPrint (Str, L"Media(%g)", &MediaProt->Protocol);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathFvFilePath (
+// IN OUT POOL_PRINT *Str,
+// IN MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *DevPath
+// )
+//{
+// MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *FvFilePath;
+//
+// FvFilePath = DevPath;
+// CatPrint (Str, L"%g", &FvFilePath->FvFileName);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathRelativeOffsetRange0 (
+// IN OUT POOL_PRINT *Str,
+// IN MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *DevPath
+// )
+//{
+// MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;
+//
+// Offset = DevPath;
+// CatPrint (
+// Str,
+// L"Offset(%lx,%lx)",
+// Offset->StartingOffset,
+// Offset->EndingOffset
+// );
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathBssBss (
+// IN OUT POOL_PRINT *Str,
+// IN BBS_BBS_DEVICE_PATH *DevPath
+// )
+//{
+// BBS_BBS_DEVICE_PATH *Bbs;
+// CONST CHAR16 *Type;
+//
+// Bbs = DevPath;
+// switch (Bbs->DeviceType) {
+// case BBS_TYPE_FLOPPY:
+// Type = L"Floppy";
+// break;
+//
+// case BBS_TYPE_HARDDRIVE:
+// Type = L"Harddrive";
+// break;
+//
+// case BBS_TYPE_CDROM:
+// Type = L"CDROM";
+// break;
+//
+// case BBS_TYPE_PCMCIA:
+// Type = L"PCMCIA";
+// break;
+//
+// case BBS_TYPE_USB:
+// Type = L"Usb";
+// break;
+//
+// case BBS_TYPE_EMBEDDED_NETWORK:
+// Type = L"Net";
+// break;
+//
+// case BBS_TYPE_BEV:
+// Type = L"BEV";
+// break;
+//
+// default:
+// Type = L"?";
+// break;
+// }
+// CatPrint (Str, L"Legacy-%s", Type);
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathEndInstance (
+// IN OUT POOL_PRINT *Str,
+// IN VOID *DevPath
+// )
+//{
+// CatPrint (Str, L",");
+//}
+//
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathNodeUnknown (
+// IN OUT POOL_PRINT *Str,
+// IN VOID *DevPath
+// )
+//{
+// CatPrint (Str, L"?");
+//}
+///**
+// Convert Device Path to a Unicode string for printing.
+//
+// @param Str The buffer holding the output string.
+// This buffer contains the length of the
+// string and the maximum length reserved
+// for the string buffer.
+// @param DevPath The device path.
+//
+//**/
+//static VOID
+//DevPathFvPath (
+// IN OUT POOL_PRINT *Str,
+// IN MEDIA_FW_VOL_DEVICE_PATH *DevPath
+// )
+//{
+// MEDIA_FW_VOL_DEVICE_PATH *FvPath;
+//
+// FvPath = DevPath;
+// CatPrint (Str, L"Fv(%g)", &FvPath->FvName);
+//}
+//
+//DEVICE_PATH_STRING_TABLE DevPathTable[] = {
+// {
+// HARDWARE_DEVICE_PATH,
+// HW_PCI_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathPci
+// },
+// {
+// HARDWARE_DEVICE_PATH,
+// HW_PCCARD_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathPccard
+// },
+// {
+// HARDWARE_DEVICE_PATH,
+// HW_MEMMAP_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathMemMap
+// },
+// {
+// HARDWARE_DEVICE_PATH,
+// HW_VENDOR_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathVendor
+// },
+// {
+// HARDWARE_DEVICE_PATH,
+// HW_CONTROLLER_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathController
+// },
+// {
+// ACPI_DEVICE_PATH,
+// ACPI_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathAcpi
+// },
+// {
+// ACPI_DEVICE_PATH,
+// ACPI_EXTENDED_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathExtendedAcpi
+// },
+// {
+// ACPI_DEVICE_PATH,
+// ACPI_ADR_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathAdrAcpi
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_ATAPI_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathAtapi
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_SCSI_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathScsi
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_FIBRECHANNEL_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathFibre
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_1394_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPath1394
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_USB_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathUsb
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_USB_WWID_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathUsbWWID
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_DEVICE_LOGICAL_UNIT_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathLogicalUnit
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_USB_CLASS_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathUsbClass
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_SATA_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathSata
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_NVME_NAMESPACE_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathToTextNVMe
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_I2O_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathI2O
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_MAC_ADDR_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathMacAddr
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_IPv4_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathIPv4
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_IPv6_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathIPv6
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_INFINIBAND_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathInfiniBand
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_UART_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathUart
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_VENDOR_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathVendor
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_ISCSI_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathiSCSI
+// },
+// {
+// MESSAGING_DEVICE_PATH,
+// MSG_VLAN_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathVlan
+// },
+// {
+// MEDIA_DEVICE_PATH,
+// MEDIA_HARDDRIVE_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathHardDrive
+// },
+// {
+// MEDIA_DEVICE_PATH,
+// MEDIA_CDROM_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathCDROM
+// },
+// {
+// MEDIA_DEVICE_PATH,
+// MEDIA_VENDOR_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathVendor
+// },
+// {
+// MEDIA_DEVICE_PATH,
+// MEDIA_FILEPATH_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathFilePath
+// },
+// {
+// MEDIA_DEVICE_PATH,
+// MEDIA_PROTOCOL_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathMediaProtocol
+// },
+// {
+// MEDIA_DEVICE_PATH,
+// MEDIA_PIWG_FW_VOL_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathFvPath,
+// },
+// {
+// MEDIA_DEVICE_PATH,
+// MEDIA_PIWG_FW_FILE_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathFvFilePath
+// },
+// {
+// MEDIA_DEVICE_PATH,
+// MEDIA_RELATIVE_OFFSET_RANGE_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathRelativeOffsetRange0,
+// },
+// {
+// BBS_DEVICE_PATH,
+// BBS_BBS_DP,
+// (DEV_PATH_FUNCTION_VOID)DevPathBssBss
+// },
+// {
+// END_DEVICE_PATH_TYPE,
+// END_INSTANCE_DEVICE_PATH_SUBTYPE,
+// (DEV_PATH_FUNCTION_VOID)DevPathEndInstance
+// },
+// {
+// 0,
+// 0,
+// (DEV_PATH_FUNCTION_VOID)NULL
+// }
+//};
+//
+//
+///**
+// This function converts an input device structure to a Unicode string.
+//
+// @param DevPath A pointer to the device path structure.
+//
+// @return A new allocated Unicode string that represents the device path.
+//
+//**/
+//CHAR16 *
+//EFIAPI
+//DevicePathToStr (
+// IN EFI_DEVICE_PATH_PROTOCOL *DevPath
+// )
+//{
+// POOL_PRINT Str;
+// EFI_DEVICE_PATH_PROTOCOL *DevPathNode;
+// VOID (*DumpNode) (POOL_PRINT *, VOID *);
+//
+// UINTN Index;
+// UINTN NewSize;
+//
+// EFI_STATUS Status;
+// CHAR16 *ToText;
+// EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevPathToText;
+//
+// ZeroMem (&Str, sizeof (Str));
+//
+// if (DevPath == NULL) {
+// goto Done;
+// }
+//
+// Status = gBS->LocateProtocol (
+// &gEfiDevicePathToTextProtocolGuid,
+// NULL,
+// (VOID **) &DevPathToText
+// );
+// if (!EFI_ERROR (Status)) {
+// ToText = DevPathToText->ConvertDevicePathToText (
+// DevPath,
+// FALSE,
+// TRUE
+// );
+//// ASSERT (ToText != NULL);
+// return ToText;
+// }
+//
+// //
+// // Process each device path node
+// //
+// DevPathNode = DevPath;
+// while (!IsDevicePathEnd (DevPathNode)) {
+// //
+// // Find the handler to dump this device path node
+// //
+// DumpNode = NULL;
+// for (Index = 0; DevPathTable[Index].Function != NULL; Index += 1) {
+//
+// if (DevicePathType (DevPathNode) == DevPathTable[Index].Type &&
+// DevicePathSubType (DevPathNode) == DevPathTable[Index].SubType
+// ) {
+// DumpNode = DevPathTable[Index].Function;
+// break;
+// }
+// }
+// //
+// // If not found, use a generic function
+// //
+// if (!DumpNode) {
+// DumpNode = DevPathNodeUnknown;
+// }
+// //
+// // Put a path separator in if needed
+// //
+// if ((Str.Len != 0) && (DumpNode != DevPathEndInstance)) {
+// CatPrint (&Str, L"/");
+// }
+// //
+// // Print this node of the device path
+// //
+// DumpNode (&Str, DevPathNode);
+//
+// //
+// // Next device path node
+// //
+// DevPathNode = NextDevicePathNode (DevPathNode);
+// }
+//
+//Done:
+// NewSize = (Str.Len + 1) * sizeof (CHAR16);
+// Str.Str = (__typeof__(Str.Str))ReallocatePool (NewSize, NewSize, Str.Str);
+//// ASSERT (Str.Str != NULL);
+// if (!Str.Str) {
+// return NULL;
+// }
+//
+// Str.Str[Str.Len] = 0;
+// return Str.Str;
+//}