| /** @file | |
| Definition for Device Path Tool. | |
| Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include "UefiDevicePathLib.h" | |
| // | |
| // Utility Name | |
| // | |
| #define UTILITY_NAME "DevicePath" | |
| // | |
| // Utility version information | |
| // | |
| #define UTILITY_MAJOR_VERSION 0 | |
| #define UTILITY_MINOR_VERSION 1 | |
| EFI_GUID gEfiDebugPortProtocolGuid = DEVICE_PATH_MESSAGING_DEBUGPORT; | |
| EFI_GUID gEfiPcAnsiGuid = EFI_PC_ANSI_GUID; | |
| EFI_GUID gEfiVT100Guid = EFI_VT_100_GUID; | |
| EFI_GUID gEfiVT100PlusGuid = EFI_VT_100_PLUS_GUID; | |
| EFI_GUID gEfiVTUTF8Guid = EFI_VT_UTF8_GUID; | |
| EFI_GUID gEfiUartDevicePathGuid = EFI_UART_DEVICE_PATH_GUID; | |
| EFI_GUID gEfiSasDevicePathGuid = EFI_SAS_DEVICE_PATH_GUID; | |
| EFI_GUID gEfiVirtualDiskGuid = EFI_VIRTUAL_DISK_GUID; | |
| EFI_GUID gEfiVirtualCdGuid = EFI_VIRTUAL_CD_GUID; | |
| EFI_GUID gEfiPersistentVirtualDiskGuid = EFI_PERSISTENT_VIRTUAL_DISK_GUID; | |
| EFI_GUID gEfiPersistentVirtualCdGuid = EFI_PERSISTENT_VIRTUAL_CD_GUID; | |
| STATIC | |
| VOID | |
| Version ( | |
| VOID | |
| ) | |
| /*++ | |
| Routine Description: | |
| Displays the standard utility information to SDTOUT | |
| Arguments: | |
| None | |
| Returns: | |
| None | |
| --*/ | |
| { | |
| fprintf (stdout, "%s Version %d.%d %s \n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION, __BUILD_VERSION); | |
| } | |
| STATIC | |
| VOID | |
| Usage ( | |
| VOID | |
| ) | |
| /*++ | |
| Routine Description: | |
| Displays the utility usage syntax to STDOUT | |
| Arguments: | |
| None | |
| Returns: | |
| None | |
| --*/ | |
| { | |
| // | |
| // Summary usage | |
| // | |
| fprintf (stdout, "\nUsage: %s [options]\n\n", UTILITY_NAME); | |
| // | |
| // Copyright declaration | |
| // | |
| fprintf (stdout, "Copyright (c) 2017, Intel Corporation. All rights reserved.\n\n"); | |
| // | |
| // Details Option | |
| // | |
| fprintf (stdout, "Options:\n"); | |
| fprintf (stdout, " DevicePathString Device Path string is specified, no space character.\n" | |
| " Example: \"PciRoot(0)/Pci(0,0)\"\n"); | |
| fprintf (stdout, " --version Show program's version number and exit.\n"); | |
| fprintf (stdout, " -h, --help Show this help message and exit.\n"); | |
| } | |
| STATIC | |
| VOID | |
| PrintMem ( | |
| CONST VOID *Buffer, | |
| UINTN Count | |
| ) | |
| { | |
| CONST UINT8 *Bytes; | |
| UINTN Idx; | |
| Bytes = Buffer; | |
| for (Idx = 0; Idx < Count; Idx++) { | |
| printf("0x%02x ", Bytes[Idx]); | |
| } | |
| } | |
| VOID | |
| Ascii2UnicodeString ( | |
| CHAR8 *String, | |
| CHAR16 *UniString | |
| ) | |
| /*++ | |
| Routine Description: | |
| Write ascii string as unicode string format to FILE | |
| Arguments: | |
| String - Pointer to string that is written to FILE. | |
| UniString - Pointer to unicode string | |
| Returns: | |
| NULL | |
| --*/ | |
| { | |
| while (*String != '\0') { | |
| *(UniString++) = (CHAR16) *(String++); | |
| } | |
| // | |
| // End the UniString with a NULL. | |
| // | |
| *UniString = '\0'; | |
| } | |
| int main(int argc, CHAR8 *argv[]) | |
| { | |
| CHAR8 * Str; | |
| CHAR16* Str16; | |
| EFI_DEVICE_PATH_PROTOCOL *DevicePath; | |
| if (argc == 1) { | |
| Error (NULL, 0, 1001, "Missing options", "No input options specified."); | |
| Usage (); | |
| return STATUS_ERROR; | |
| } | |
| if ((stricmp (argv[1], "-h") == 0) || (stricmp (argv[1], "--help") == 0)) { | |
| Version (); | |
| Usage (); | |
| return STATUS_SUCCESS; | |
| } | |
| if (stricmp (argv[1], "--version") == 0) { | |
| Version (); | |
| return STATUS_SUCCESS; | |
| } | |
| Str = argv[1]; | |
| if (Str == NULL) { | |
| fprintf(stderr, "Invalid option value, Device Path can't be NULL"); | |
| return STATUS_ERROR; | |
| } | |
| Str16 = (CHAR16 *)malloc((strlen (Str) + 1) * sizeof (CHAR16)); | |
| if (Str16 == NULL) { | |
| fprintf(stderr, "Resource, memory cannot be allocated"); | |
| return STATUS_ERROR; | |
| } | |
| Ascii2UnicodeString(Str, Str16); | |
| DevicePath = UefiDevicePathLibConvertTextToDevicePath(Str16); | |
| if (DevicePath == NULL) { | |
| fprintf(stderr, "Convert fail, Cannot convert text to a device path"); | |
| free(Str16); | |
| return STATUS_ERROR; | |
| } | |
| while (!((DevicePath->Type == END_DEVICE_PATH_TYPE) && (DevicePath->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE)) ) | |
| { | |
| PrintMem (DevicePath, DevicePath->Length[0] | DevicePath->Length[1] << 8); | |
| DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)((UINT8 *)DevicePath + (DevicePath->Length[0] | DevicePath->Length[1] << 8)); | |
| } | |
| PrintMem (DevicePath, DevicePath->Length[0] | DevicePath->Length[1] << 8); | |
| putchar('\n'); | |
| free(Str16); | |
| return STATUS_SUCCESS; | |
| } |