Home | History | Annotate | Download | only in UefiDevicePathLib
      1 /** @file
      2   DevicePathFromText protocol as defined in the UEFI 2.0 specification.
      3 
      4 Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #include "UefiDevicePathLib.h"
     16 
     17 /**
     18 
     19   Duplicates a string.
     20 
     21   @param  Src  Source string.
     22 
     23   @return The duplicated string.
     24 
     25 **/
     26 CHAR16 *
     27 UefiDevicePathLibStrDuplicate (
     28   IN CONST CHAR16  *Src
     29   )
     30 {
     31   return AllocateCopyPool (StrSize (Src), Src);
     32 }
     33 
     34 /**
     35 
     36   Get parameter in a pair of parentheses follow the given node name.
     37   For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".
     38 
     39   @param  Str      Device Path Text.
     40   @param  NodeName Name of the node.
     41 
     42   @return Parameter text for the node.
     43 
     44 **/
     45 CHAR16 *
     46 GetParamByNodeName (
     47   IN CHAR16 *Str,
     48   IN CHAR16 *NodeName
     49   )
     50 {
     51   CHAR16  *ParamStr;
     52   CHAR16  *StrPointer;
     53   UINTN   NodeNameLength;
     54   UINTN   ParameterLength;
     55 
     56   //
     57   // Check whether the node name matchs
     58   //
     59   NodeNameLength = StrLen (NodeName);
     60   if (StrnCmp (Str, NodeName, NodeNameLength) != 0) {
     61     return NULL;
     62   }
     63 
     64   ParamStr = Str + NodeNameLength;
     65   if (!IS_LEFT_PARENTH (*ParamStr)) {
     66     return NULL;
     67   }
     68 
     69   //
     70   // Skip the found '(' and find first occurrence of ')'
     71   //
     72   ParamStr++;
     73   ParameterLength = 0;
     74   StrPointer = ParamStr;
     75   while (!IS_NULL (*StrPointer)) {
     76     if (IS_RIGHT_PARENTH (*StrPointer)) {
     77       break;
     78     }
     79     StrPointer++;
     80     ParameterLength++;
     81   }
     82   if (IS_NULL (*StrPointer)) {
     83     //
     84     // ')' not found
     85     //
     86     return NULL;
     87   }
     88 
     89   ParamStr = AllocateCopyPool ((ParameterLength + 1) * sizeof (CHAR16), ParamStr);
     90   if (ParamStr == NULL) {
     91     return NULL;
     92   }
     93   //
     94   // Terminate the parameter string
     95   //
     96   ParamStr[ParameterLength] = L'\0';
     97 
     98   return ParamStr;
     99 }
    100 
    101 /**
    102   Gets current sub-string from a string list, before return
    103   the list header is moved to next sub-string. The sub-string is separated
    104   by the specified character. For example, the separator is ',', the string
    105   list is "2,0,3", it returns "2", the remain list move to "0,3"
    106 
    107   @param  List        A string list separated by the specified separator
    108   @param  Separator   The separator character
    109 
    110   @return A pointer to the current sub-string
    111 
    112 **/
    113 CHAR16 *
    114 SplitStr (
    115   IN OUT CHAR16 **List,
    116   IN     CHAR16 Separator
    117   )
    118 {
    119   CHAR16  *Str;
    120   CHAR16  *ReturnStr;
    121 
    122   Str = *List;
    123   ReturnStr = Str;
    124 
    125   if (IS_NULL (*Str)) {
    126     return ReturnStr;
    127   }
    128 
    129   //
    130   // Find first occurrence of the separator
    131   //
    132   while (!IS_NULL (*Str)) {
    133     if (*Str == Separator) {
    134       break;
    135     }
    136     Str++;
    137   }
    138 
    139   if (*Str == Separator) {
    140     //
    141     // Find a sub-string, terminate it
    142     //
    143     *Str = L'\0';
    144     Str++;
    145   }
    146 
    147   //
    148   // Move to next sub-string
    149   //
    150   *List = Str;
    151 
    152   return ReturnStr;
    153 }
    154 
    155 /**
    156   Gets the next parameter string from the list.
    157 
    158   @param List            A string list separated by the specified separator
    159 
    160   @return A pointer to the current sub-string
    161 
    162 **/
    163 CHAR16 *
    164 GetNextParamStr (
    165   IN OUT CHAR16 **List
    166   )
    167 {
    168   //
    169   // The separator is comma
    170   //
    171   return SplitStr (List, L',');
    172 }
    173 
    174 /**
    175   Get one device node from entire device path text.
    176 
    177   @param DevicePath      On input, the current Device Path node; on output, the next device path node
    178   @param IsInstanceEnd   This node is the end of a device path instance
    179 
    180   @return A device node text or NULL if no more device node available
    181 
    182 **/
    183 CHAR16 *
    184 GetNextDeviceNodeStr (
    185   IN OUT CHAR16   **DevicePath,
    186   OUT    BOOLEAN  *IsInstanceEnd
    187   )
    188 {
    189   CHAR16  *Str;
    190   CHAR16  *ReturnStr;
    191   UINTN   ParenthesesStack;
    192 
    193   Str = *DevicePath;
    194   if (IS_NULL (*Str)) {
    195     return NULL;
    196   }
    197 
    198   //
    199   // Skip the leading '/', '(', ')' and ','
    200   //
    201   while (!IS_NULL (*Str)) {
    202     if (!IS_SLASH (*Str) &&
    203         !IS_COMMA (*Str) &&
    204         !IS_LEFT_PARENTH (*Str) &&
    205         !IS_RIGHT_PARENTH (*Str)) {
    206       break;
    207     }
    208     Str++;
    209   }
    210 
    211   ReturnStr = Str;
    212 
    213   //
    214   // Scan for the separator of this device node, '/' or ','
    215   //
    216   ParenthesesStack = 0;
    217   while (!IS_NULL (*Str)) {
    218     if ((IS_COMMA (*Str) || IS_SLASH (*Str)) && (ParenthesesStack == 0)) {
    219       break;
    220     }
    221 
    222     if (IS_LEFT_PARENTH (*Str)) {
    223       ParenthesesStack++;
    224     } else if (IS_RIGHT_PARENTH (*Str)) {
    225       ParenthesesStack--;
    226     }
    227 
    228     Str++;
    229   }
    230 
    231   if (ParenthesesStack != 0) {
    232     //
    233     // The '(' doesn't pair with ')', invalid device path text
    234     //
    235     return NULL;
    236   }
    237 
    238   if (IS_COMMA (*Str)) {
    239     *IsInstanceEnd = TRUE;
    240     *Str = L'\0';
    241     Str++;
    242   } else {
    243     *IsInstanceEnd = FALSE;
    244     if (!IS_NULL (*Str)) {
    245       *Str = L'\0';
    246       Str++;
    247     }
    248   }
    249 
    250   *DevicePath = Str;
    251 
    252   return ReturnStr;
    253 }
    254 
    255 
    256 /**
    257   Return whether the integer string is a hex string.
    258 
    259   @param Str             The integer string
    260 
    261   @retval TRUE   Hex string
    262   @retval FALSE  Decimal string
    263 
    264 **/
    265 BOOLEAN
    266 IsHexStr (
    267   IN CHAR16   *Str
    268   )
    269 {
    270   //
    271   // skip preceeding white space
    272   //
    273   while ((*Str != 0) && *Str == L' ') {
    274     Str ++;
    275   }
    276   //
    277   // skip preceeding zeros
    278   //
    279   while ((*Str != 0) && *Str == L'0') {
    280     Str ++;
    281   }
    282 
    283   return (BOOLEAN) (*Str == L'x' || *Str == L'X');
    284 }
    285 
    286 /**
    287 
    288   Convert integer string to uint.
    289 
    290   @param Str             The integer string. If leading with "0x" or "0X", it's hexadecimal.
    291 
    292   @return A UINTN value represented by Str
    293 
    294 **/
    295 UINTN
    296 Strtoi (
    297   IN CHAR16  *Str
    298   )
    299 {
    300   if (IsHexStr (Str)) {
    301     return StrHexToUintn (Str);
    302   } else {
    303     return StrDecimalToUintn (Str);
    304   }
    305 }
    306 
    307 /**
    308 
    309   Convert integer string to 64 bit data.
    310 
    311   @param Str             The integer string. If leading with "0x" or "0X", it's hexadecimal.
    312   @param Data            A pointer to the UINT64 value represented by Str
    313 
    314 **/
    315 VOID
    316 Strtoi64 (
    317   IN  CHAR16  *Str,
    318   OUT UINT64  *Data
    319   )
    320 {
    321   if (IsHexStr (Str)) {
    322     *Data = StrHexToUint64 (Str);
    323   } else {
    324     *Data = StrDecimalToUint64 (Str);
    325   }
    326 }
    327 
    328 /**
    329   Converts a list of string to a specified buffer.
    330 
    331   @param Buf             The output buffer that contains the string.
    332   @param BufferLength    The length of the buffer
    333   @param Str             The input string that contains the hex number
    334 
    335   @retval EFI_SUCCESS    The string was successfully converted to the buffer.
    336 
    337 **/
    338 EFI_STATUS
    339 StrToBuf (
    340   OUT UINT8    *Buf,
    341   IN  UINTN    BufferLength,
    342   IN  CHAR16   *Str
    343   )
    344 {
    345   UINTN       Index;
    346   UINTN       StrLength;
    347   UINT8       Digit;
    348   UINT8       Byte;
    349 
    350   Digit = 0;
    351 
    352   //
    353   // Two hex char make up one byte
    354   //
    355   StrLength = BufferLength * sizeof (CHAR16);
    356 
    357   for(Index = 0; Index < StrLength; Index++, Str++) {
    358 
    359     if ((*Str >= L'a') && (*Str <= L'f')) {
    360       Digit = (UINT8) (*Str - L'a' + 0x0A);
    361     } else if ((*Str >= L'A') && (*Str <= L'F')) {
    362       Digit = (UINT8) (*Str - L'A' + 0x0A);
    363     } else if ((*Str >= L'0') && (*Str <= L'9')) {
    364       Digit = (UINT8) (*Str - L'0');
    365     } else {
    366       return EFI_INVALID_PARAMETER;
    367     }
    368 
    369     //
    370     // For odd characters, write the upper nibble for each buffer byte,
    371     // and for even characters, the lower nibble.
    372     //
    373     if ((Index & 1) == 0) {
    374       Byte = (UINT8) (Digit << 4);
    375     } else {
    376       Byte = Buf[Index / 2];
    377       Byte &= 0xF0;
    378       Byte = (UINT8) (Byte | Digit);
    379     }
    380 
    381     Buf[Index / 2] = Byte;
    382   }
    383 
    384   return EFI_SUCCESS;
    385 }
    386 
    387 /**
    388   Converts a string to GUID value.
    389   Guid Format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    390 
    391   @param Str              The registry format GUID string that contains the GUID value.
    392   @param Guid             A pointer to the converted GUID value.
    393 
    394   @retval EFI_SUCCESS     The GUID string was successfully converted to the GUID value.
    395   @retval EFI_UNSUPPORTED The input string is not in registry format.
    396   @return others          Some error occurred when converting part of GUID value.
    397 
    398 **/
    399 EFI_STATUS
    400 StrToGuid (
    401   IN  CHAR16   *Str,
    402   OUT EFI_GUID *Guid
    403   )
    404 {
    405   //
    406   // Get the first UINT32 data
    407   //
    408   Guid->Data1 = (UINT32) StrHexToUint64  (Str);
    409   while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {
    410     Str ++;
    411   }
    412 
    413   if (IS_HYPHEN (*Str)) {
    414     Str++;
    415   } else {
    416     return EFI_UNSUPPORTED;
    417   }
    418 
    419   //
    420   // Get the second UINT16 data
    421   //
    422   Guid->Data2 = (UINT16) StrHexToUint64  (Str);
    423   while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {
    424     Str ++;
    425   }
    426 
    427   if (IS_HYPHEN (*Str)) {
    428     Str++;
    429   } else {
    430     return EFI_UNSUPPORTED;
    431   }
    432 
    433   //
    434   // Get the third UINT16 data
    435   //
    436   Guid->Data3 = (UINT16) StrHexToUint64  (Str);
    437   while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {
    438     Str ++;
    439   }
    440 
    441   if (IS_HYPHEN (*Str)) {
    442     Str++;
    443   } else {
    444     return EFI_UNSUPPORTED;
    445   }
    446 
    447   //
    448   // Get the following 8 bytes data
    449   //
    450   StrToBuf (&Guid->Data4[0], 2, Str);
    451   //
    452   // Skip 2 byte hex chars
    453   //
    454   Str += 2 * 2;
    455 
    456   if (IS_HYPHEN (*Str)) {
    457     Str++;
    458   } else {
    459     return EFI_UNSUPPORTED;
    460   }
    461   StrToBuf (&Guid->Data4[2], 6, Str);
    462 
    463   return EFI_SUCCESS;
    464 }
    465 
    466 /**
    467   Converts a string to IPv4 address
    468 
    469   @param Str             A string representation of IPv4 address.
    470   @param IPv4Addr        A pointer to the converted IPv4 address.
    471 
    472 **/
    473 VOID
    474 StrToIPv4Addr (
    475   IN OUT CHAR16           **Str,
    476   OUT    EFI_IPv4_ADDRESS *IPv4Addr
    477   )
    478 {
    479   UINTN  Index;
    480 
    481   for (Index = 0; Index < 4; Index++) {
    482     IPv4Addr->Addr[Index] = (UINT8) Strtoi (SplitStr (Str, L'.'));
    483   }
    484 }
    485 
    486 /**
    487   Converts a string to IPv4 address
    488 
    489   @param Str             A string representation of IPv6 address.
    490   @param IPv6Addr        A pointer to the converted IPv6 address.
    491 
    492 **/
    493 VOID
    494 StrToIPv6Addr (
    495   IN OUT CHAR16           **Str,
    496   OUT    EFI_IPv6_ADDRESS *IPv6Addr
    497   )
    498 {
    499   UINTN  Index;
    500   UINT16 Data;
    501 
    502   for (Index = 0; Index < 8; Index++) {
    503     Data = (UINT16) StrHexToUintn (SplitStr (Str, L':'));
    504     IPv6Addr->Addr[Index * 2] = (UINT8) (Data >> 8);
    505     IPv6Addr->Addr[Index * 2 + 1] = (UINT8) (Data & 0xff);
    506   }
    507 }
    508 
    509 /**
    510   Converts a Unicode string to ASCII string.
    511 
    512   @param Str             The equivalent Unicode string
    513   @param AsciiStr        On input, it points to destination ASCII string buffer; on output, it points
    514                          to the next ASCII string next to it
    515 
    516 **/
    517 VOID
    518 StrToAscii (
    519   IN     CHAR16 *Str,
    520   IN OUT CHAR8  **AsciiStr
    521   )
    522 {
    523   CHAR8 *Dest;
    524 
    525   Dest = *AsciiStr;
    526   while (!IS_NULL (*Str)) {
    527     *(Dest++) = (CHAR8) *(Str++);
    528   }
    529   *Dest = 0;
    530 
    531   //
    532   // Return the string next to it
    533   //
    534   *AsciiStr = Dest + 1;
    535 }
    536 
    537 /**
    538   Converts a generic text device path node to device path structure.
    539 
    540   @param Type            The type of the device path node.
    541   @param TextDeviceNode  The input text device path node.
    542 
    543   @return A pointer to device path structure.
    544 **/
    545 EFI_DEVICE_PATH_PROTOCOL *
    546 DevPathFromTextGenericPath (
    547   IN UINT8  Type,
    548   IN CHAR16 *TextDeviceNode
    549   )
    550 {
    551   EFI_DEVICE_PATH_PROTOCOL *Node;
    552   CHAR16                   *SubtypeStr;
    553   CHAR16                   *DataStr;
    554   UINTN                    DataLength;
    555 
    556   SubtypeStr = GetNextParamStr (&TextDeviceNode);
    557   DataStr    = GetNextParamStr (&TextDeviceNode);
    558 
    559   if (DataStr == NULL) {
    560     DataLength = 0;
    561   } else {
    562     DataLength = StrLen (DataStr) / 2;
    563   }
    564   Node = CreateDeviceNode (
    565            Type,
    566            (UINT8) Strtoi (SubtypeStr),
    567            (UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL) + DataLength)
    568            );
    569 
    570   if (DataLength != 0) {
    571     StrToBuf ((UINT8 *) (Node + 1), DataLength, DataStr);
    572   }
    573   return Node;
    574 }
    575 
    576 /**
    577   Converts a generic text device path node to device path structure.
    578 
    579   @param TextDeviceNode  The input Text device path node.
    580 
    581   @return A pointer to device path structure.
    582 
    583 **/
    584 EFI_DEVICE_PATH_PROTOCOL *
    585 DevPathFromTextPath (
    586   IN CHAR16 *TextDeviceNode
    587   )
    588 {
    589   CHAR16                   *TypeStr;
    590 
    591   TypeStr    = GetNextParamStr (&TextDeviceNode);
    592 
    593   return DevPathFromTextGenericPath ((UINT8) Strtoi (TypeStr), TextDeviceNode);
    594 }
    595 
    596 /**
    597   Converts a generic hardware text device path node to Hardware device path structure.
    598 
    599   @param TextDeviceNode  The input Text device path node.
    600 
    601   @return A pointer to Hardware device path structure.
    602 
    603 **/
    604 EFI_DEVICE_PATH_PROTOCOL *
    605 DevPathFromTextHardwarePath (
    606   IN CHAR16 *TextDeviceNode
    607   )
    608 {
    609   return DevPathFromTextGenericPath (HARDWARE_DEVICE_PATH, TextDeviceNode);
    610 }
    611 
    612 /**
    613   Converts a text device path node to Hardware PCI device path structure.
    614 
    615   @param TextDeviceNode  The input Text device path node.
    616 
    617   @return A pointer to Hardware PCI device path structure.
    618 
    619 **/
    620 EFI_DEVICE_PATH_PROTOCOL *
    621 DevPathFromTextPci (
    622   IN CHAR16 *TextDeviceNode
    623   )
    624 {
    625   CHAR16          *FunctionStr;
    626   CHAR16          *DeviceStr;
    627   PCI_DEVICE_PATH *Pci;
    628 
    629   DeviceStr   = GetNextParamStr (&TextDeviceNode);
    630   FunctionStr = GetNextParamStr (&TextDeviceNode);
    631   Pci         = (PCI_DEVICE_PATH *) CreateDeviceNode (
    632                                       HARDWARE_DEVICE_PATH,
    633                                       HW_PCI_DP,
    634                                       (UINT16) sizeof (PCI_DEVICE_PATH)
    635                                       );
    636 
    637   Pci->Function = (UINT8) Strtoi (FunctionStr);
    638   Pci->Device   = (UINT8) Strtoi (DeviceStr);
    639 
    640   return (EFI_DEVICE_PATH_PROTOCOL *) Pci;
    641 }
    642 
    643 /**
    644   Converts a text device path node to Hardware PC card device path structure.
    645 
    646   @param TextDeviceNode  The input Text device path node.
    647 
    648   @return A pointer to Hardware PC card device path structure.
    649 
    650 **/
    651 EFI_DEVICE_PATH_PROTOCOL *
    652 DevPathFromTextPcCard (
    653   IN CHAR16 *TextDeviceNode
    654   )
    655 {
    656   CHAR16              *FunctionNumberStr;
    657   PCCARD_DEVICE_PATH  *Pccard;
    658 
    659   FunctionNumberStr = GetNextParamStr (&TextDeviceNode);
    660   Pccard            = (PCCARD_DEVICE_PATH *) CreateDeviceNode (
    661                                                HARDWARE_DEVICE_PATH,
    662                                                HW_PCCARD_DP,
    663                                                (UINT16) sizeof (PCCARD_DEVICE_PATH)
    664                                                );
    665 
    666   Pccard->FunctionNumber  = (UINT8) Strtoi (FunctionNumberStr);
    667 
    668   return (EFI_DEVICE_PATH_PROTOCOL *) Pccard;
    669 }
    670 
    671 /**
    672   Converts a text device path node to Hardware memory map device path structure.
    673 
    674   @param TextDeviceNode  The input Text device path node.
    675 
    676   @return A pointer to Hardware memory map device path structure.
    677 
    678 **/
    679 EFI_DEVICE_PATH_PROTOCOL *
    680 DevPathFromTextMemoryMapped (
    681   IN CHAR16 *TextDeviceNode
    682   )
    683 {
    684   CHAR16              *MemoryTypeStr;
    685   CHAR16              *StartingAddressStr;
    686   CHAR16              *EndingAddressStr;
    687   MEMMAP_DEVICE_PATH  *MemMap;
    688 
    689   MemoryTypeStr      = GetNextParamStr (&TextDeviceNode);
    690   StartingAddressStr = GetNextParamStr (&TextDeviceNode);
    691   EndingAddressStr   = GetNextParamStr (&TextDeviceNode);
    692   MemMap             = (MEMMAP_DEVICE_PATH *) CreateDeviceNode (
    693                                                HARDWARE_DEVICE_PATH,
    694                                                HW_MEMMAP_DP,
    695                                                (UINT16) sizeof (MEMMAP_DEVICE_PATH)
    696                                                );
    697 
    698   MemMap->MemoryType = (UINT32) Strtoi (MemoryTypeStr);
    699   Strtoi64 (StartingAddressStr, &MemMap->StartingAddress);
    700   Strtoi64 (EndingAddressStr, &MemMap->EndingAddress);
    701 
    702   return (EFI_DEVICE_PATH_PROTOCOL *) MemMap;
    703 }
    704 
    705 /**
    706   Converts a text device path node to Vendor device path structure based on the input Type
    707   and SubType.
    708 
    709   @param TextDeviceNode  The input Text device path node.
    710   @param Type            The type of device path node.
    711   @param SubType         The subtype of device path node.
    712 
    713   @return A pointer to the newly-created Vendor device path structure.
    714 
    715 **/
    716 EFI_DEVICE_PATH_PROTOCOL *
    717 ConvertFromTextVendor (
    718   IN CHAR16 *TextDeviceNode,
    719   IN UINT8  Type,
    720   IN UINT8  SubType
    721   )
    722 {
    723   CHAR16              *GuidStr;
    724   CHAR16              *DataStr;
    725   UINTN               Length;
    726   VENDOR_DEVICE_PATH  *Vendor;
    727 
    728   GuidStr = GetNextParamStr (&TextDeviceNode);
    729 
    730   DataStr = GetNextParamStr (&TextDeviceNode);
    731   Length  = StrLen (DataStr);
    732   //
    733   // Two hex characters make up 1 buffer byte
    734   //
    735   Length  = (Length + 1) / 2;
    736 
    737   Vendor  = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
    738                                      Type,
    739                                      SubType,
    740                                      (UINT16) (sizeof (VENDOR_DEVICE_PATH) + Length)
    741                                      );
    742 
    743   StrToGuid (GuidStr, &Vendor->Guid);
    744   StrToBuf (((UINT8 *) Vendor) + sizeof (VENDOR_DEVICE_PATH), Length, DataStr);
    745 
    746   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
    747 }
    748 
    749 /**
    750   Converts a text device path node to Vendor Hardware device path structure.
    751 
    752   @param TextDeviceNode  The input Text device path node.
    753 
    754   @return A pointer to the newly-created Vendor Hardware device path structure.
    755 
    756 **/
    757 EFI_DEVICE_PATH_PROTOCOL *
    758 DevPathFromTextVenHw (
    759   IN CHAR16 *TextDeviceNode
    760   )
    761 {
    762   return ConvertFromTextVendor (
    763            TextDeviceNode,
    764            HARDWARE_DEVICE_PATH,
    765            HW_VENDOR_DP
    766            );
    767 }
    768 
    769 /**
    770   Converts a text device path node to Hardware Controller device path structure.
    771 
    772   @param TextDeviceNode  The input Text device path node.
    773 
    774   @return A pointer to the newly-created Hardware Controller device path structure.
    775 
    776 **/
    777 EFI_DEVICE_PATH_PROTOCOL *
    778 DevPathFromTextCtrl (
    779   IN CHAR16 *TextDeviceNode
    780   )
    781 {
    782   CHAR16                  *ControllerStr;
    783   CONTROLLER_DEVICE_PATH  *Controller;
    784 
    785   ControllerStr = GetNextParamStr (&TextDeviceNode);
    786   Controller    = (CONTROLLER_DEVICE_PATH *) CreateDeviceNode (
    787                                                HARDWARE_DEVICE_PATH,
    788                                                HW_CONTROLLER_DP,
    789                                                (UINT16) sizeof (CONTROLLER_DEVICE_PATH)
    790                                                );
    791   Controller->ControllerNumber = (UINT32) Strtoi (ControllerStr);
    792 
    793   return (EFI_DEVICE_PATH_PROTOCOL *) Controller;
    794 }
    795 
    796 /**
    797   Converts a text device path node to BMC device path structure.
    798 
    799   @param TextDeviceNode  The input Text device path node.
    800 
    801   @return A pointer to the newly-created BMC device path structure.
    802 
    803 **/
    804 EFI_DEVICE_PATH_PROTOCOL *
    805 DevPathFromTextBmc (
    806   IN CHAR16 *TextDeviceNode
    807   )
    808 {
    809   CHAR16                *InterfaceTypeStr;
    810   CHAR16                *BaseAddressStr;
    811   BMC_DEVICE_PATH       *BmcDp;
    812 
    813   InterfaceTypeStr = GetNextParamStr (&TextDeviceNode);
    814   BaseAddressStr   = GetNextParamStr (&TextDeviceNode);
    815   BmcDp            = (BMC_DEVICE_PATH *) CreateDeviceNode (
    816                                            HARDWARE_DEVICE_PATH,
    817                                            HW_BMC_DP,
    818                                            (UINT16) sizeof (BMC_DEVICE_PATH)
    819                                            );
    820 
    821   BmcDp->InterfaceType = (UINT8) Strtoi (InterfaceTypeStr);
    822   WriteUnaligned64 (
    823     (UINT64 *) (&BmcDp->BaseAddress),
    824     StrHexToUint64 (BaseAddressStr)
    825     );
    826 
    827   return (EFI_DEVICE_PATH_PROTOCOL *) BmcDp;
    828 }
    829 
    830 /**
    831   Converts a generic ACPI text device path node to ACPI device path structure.
    832 
    833   @param TextDeviceNode  The input Text device path node.
    834 
    835   @return A pointer to ACPI device path structure.
    836 
    837 **/
    838 EFI_DEVICE_PATH_PROTOCOL *
    839 DevPathFromTextAcpiPath (
    840   IN CHAR16 *TextDeviceNode
    841   )
    842 {
    843   return DevPathFromTextGenericPath (ACPI_DEVICE_PATH, TextDeviceNode);
    844 }
    845 
    846 /**
    847   Converts a string to EisaId.
    848 
    849   @param Text   The input string.
    850 
    851   @return UINT32 EISA ID.
    852 **/
    853 UINT32
    854 EisaIdFromText (
    855   IN CHAR16 *Text
    856   )
    857 {
    858   return (((Text[0] - 'A' + 1) & 0x1f) << 10)
    859        + (((Text[1] - 'A' + 1) & 0x1f) <<  5)
    860        + (((Text[2] - 'A' + 1) & 0x1f) <<  0)
    861        + (UINT32) (StrHexToUintn (&Text[3]) << 16)
    862        ;
    863 }
    864 
    865 /**
    866   Converts a text device path node to ACPI HID device path structure.
    867 
    868   @param TextDeviceNode  The input Text device path node.
    869 
    870   @return A pointer to the newly-created ACPI HID device path structure.
    871 
    872 **/
    873 EFI_DEVICE_PATH_PROTOCOL *
    874 DevPathFromTextAcpi (
    875   IN CHAR16 *TextDeviceNode
    876   )
    877 {
    878   CHAR16                *HIDStr;
    879   CHAR16                *UIDStr;
    880   ACPI_HID_DEVICE_PATH  *Acpi;
    881 
    882   HIDStr = GetNextParamStr (&TextDeviceNode);
    883   UIDStr = GetNextParamStr (&TextDeviceNode);
    884   Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (
    885                                       ACPI_DEVICE_PATH,
    886                                       ACPI_DP,
    887                                       (UINT16) sizeof (ACPI_HID_DEVICE_PATH)
    888                                       );
    889 
    890   Acpi->HID = EisaIdFromText (HIDStr);
    891   Acpi->UID = (UINT32) Strtoi (UIDStr);
    892 
    893   return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;
    894 }
    895 
    896 /**
    897   Converts a text device path node to ACPI HID device path structure.
    898 
    899   @param TextDeviceNode  The input Text device path node.
    900   @param PnPId           The input plug and play identification.
    901 
    902   @return A pointer to the newly-created ACPI HID device path structure.
    903 
    904 **/
    905 EFI_DEVICE_PATH_PROTOCOL *
    906 ConvertFromTextAcpi (
    907   IN CHAR16 *TextDeviceNode,
    908   IN UINT32  PnPId
    909   )
    910 {
    911   CHAR16                *UIDStr;
    912   ACPI_HID_DEVICE_PATH  *Acpi;
    913 
    914   UIDStr = GetNextParamStr (&TextDeviceNode);
    915   Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (
    916                                       ACPI_DEVICE_PATH,
    917                                       ACPI_DP,
    918                                       (UINT16) sizeof (ACPI_HID_DEVICE_PATH)
    919                                       );
    920 
    921   Acpi->HID = EFI_PNP_ID (PnPId);
    922   Acpi->UID = (UINT32) Strtoi (UIDStr);
    923 
    924   return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;
    925 }
    926 
    927 /**
    928   Converts a text device path node to PCI root device path structure.
    929 
    930   @param TextDeviceNode  The input Text device path node.
    931 
    932   @return A pointer to the newly-created PCI root device path structure.
    933 
    934 **/
    935 EFI_DEVICE_PATH_PROTOCOL *
    936 DevPathFromTextPciRoot (
    937   IN CHAR16 *TextDeviceNode
    938   )
    939 {
    940   return ConvertFromTextAcpi (TextDeviceNode, 0x0a03);
    941 }
    942 
    943 /**
    944   Converts a text device path node to PCIE root device path structure.
    945 
    946   @param TextDeviceNode  The input Text device path node.
    947 
    948   @return A pointer to the newly-created PCIE root device path structure.
    949 
    950 **/
    951 EFI_DEVICE_PATH_PROTOCOL *
    952 DevPathFromTextPcieRoot (
    953   IN CHAR16 *TextDeviceNode
    954   )
    955 {
    956   return ConvertFromTextAcpi (TextDeviceNode, 0x0a08);
    957 }
    958 
    959 /**
    960   Converts a text device path node to Floppy device path structure.
    961 
    962   @param TextDeviceNode  The input Text device path node.
    963 
    964   @return A pointer to the newly-created Floppy device path structure.
    965 
    966 **/
    967 EFI_DEVICE_PATH_PROTOCOL *
    968 DevPathFromTextFloppy (
    969   IN CHAR16 *TextDeviceNode
    970   )
    971 {
    972   return ConvertFromTextAcpi (TextDeviceNode, 0x0604);
    973 }
    974 
    975 /**
    976   Converts a text device path node to Keyboard device path structure.
    977 
    978   @param TextDeviceNode  The input Text device path node.
    979 
    980   @return A pointer to the newly-created  Keyboard device path structure.
    981 
    982 **/
    983 EFI_DEVICE_PATH_PROTOCOL *
    984 DevPathFromTextKeyboard (
    985   IN CHAR16 *TextDeviceNode
    986   )
    987 {
    988   return ConvertFromTextAcpi (TextDeviceNode, 0x0301);
    989 }
    990 
    991 /**
    992   Converts a text device path node to Serial device path structure.
    993 
    994   @param TextDeviceNode  The input Text device path node.
    995 
    996   @return A pointer to the newly-created Serial device path structure.
    997 
    998 **/
    999 EFI_DEVICE_PATH_PROTOCOL *
   1000 DevPathFromTextSerial (
   1001   IN CHAR16 *TextDeviceNode
   1002   )
   1003 {
   1004   return ConvertFromTextAcpi (TextDeviceNode, 0x0501);
   1005 }
   1006 
   1007 /**
   1008   Converts a text device path node to Parallel Port device path structure.
   1009 
   1010   @param TextDeviceNode  The input Text device path node.
   1011 
   1012   @return A pointer to the newly-created Parallel Port device path structure.
   1013 
   1014 **/
   1015 EFI_DEVICE_PATH_PROTOCOL *
   1016 DevPathFromTextParallelPort (
   1017   IN CHAR16 *TextDeviceNode
   1018   )
   1019 {
   1020   return ConvertFromTextAcpi (TextDeviceNode, 0x0401);
   1021 }
   1022 
   1023 /**
   1024   Converts a text device path node to ACPI extension device path structure.
   1025 
   1026   @param TextDeviceNode  The input Text device path node.
   1027 
   1028   @return A pointer to the newly-created ACPI extension device path structure.
   1029 
   1030 **/
   1031 EFI_DEVICE_PATH_PROTOCOL *
   1032 DevPathFromTextAcpiEx (
   1033   IN CHAR16 *TextDeviceNode
   1034   )
   1035 {
   1036   CHAR16                         *HIDStr;
   1037   CHAR16                         *CIDStr;
   1038   CHAR16                         *UIDStr;
   1039   CHAR16                         *HIDSTRStr;
   1040   CHAR16                         *CIDSTRStr;
   1041   CHAR16                         *UIDSTRStr;
   1042   CHAR8                          *AsciiStr;
   1043   UINT16                         Length;
   1044   ACPI_EXTENDED_HID_DEVICE_PATH  *AcpiEx;
   1045 
   1046   HIDStr    = GetNextParamStr (&TextDeviceNode);
   1047   CIDStr    = GetNextParamStr (&TextDeviceNode);
   1048   UIDStr    = GetNextParamStr (&TextDeviceNode);
   1049   HIDSTRStr = GetNextParamStr (&TextDeviceNode);
   1050   CIDSTRStr = GetNextParamStr (&TextDeviceNode);
   1051   UIDSTRStr = GetNextParamStr (&TextDeviceNode);
   1052 
   1053   Length    = (UINT16) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (HIDSTRStr) + 1);
   1054   Length    = (UINT16) (Length + StrLen (UIDSTRStr) + 1);
   1055   Length    = (UINT16) (Length + StrLen (CIDSTRStr) + 1);
   1056   AcpiEx = (ACPI_EXTENDED_HID_DEVICE_PATH *) CreateDeviceNode (
   1057                                                ACPI_DEVICE_PATH,
   1058                                                ACPI_EXTENDED_DP,
   1059                                                Length
   1060                                                );
   1061 
   1062   AcpiEx->HID = EisaIdFromText (HIDStr);
   1063   AcpiEx->CID = EisaIdFromText (CIDStr);
   1064   AcpiEx->UID = (UINT32) Strtoi (UIDStr);
   1065 
   1066   AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));
   1067   StrToAscii (HIDSTRStr, &AsciiStr);
   1068   StrToAscii (UIDSTRStr, &AsciiStr);
   1069   StrToAscii (CIDSTRStr, &AsciiStr);
   1070 
   1071   return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;
   1072 }
   1073 
   1074 /**
   1075   Converts a text device path node to ACPI extension device path structure.
   1076 
   1077   @param TextDeviceNode  The input Text device path node.
   1078 
   1079   @return A pointer to the newly-created ACPI extension device path structure.
   1080 
   1081 **/
   1082 EFI_DEVICE_PATH_PROTOCOL *
   1083 DevPathFromTextAcpiExp (
   1084   IN CHAR16 *TextDeviceNode
   1085   )
   1086 {
   1087   CHAR16                         *HIDStr;
   1088   CHAR16                         *CIDStr;
   1089   CHAR16                         *UIDSTRStr;
   1090   CHAR8                          *AsciiStr;
   1091   UINT16                         Length;
   1092   ACPI_EXTENDED_HID_DEVICE_PATH  *AcpiEx;
   1093 
   1094   HIDStr    = GetNextParamStr (&TextDeviceNode);
   1095   CIDStr    = GetNextParamStr (&TextDeviceNode);
   1096   UIDSTRStr = GetNextParamStr (&TextDeviceNode);
   1097   Length    = (UINT16) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (UIDSTRStr) + 3);
   1098   AcpiEx    = (ACPI_EXTENDED_HID_DEVICE_PATH *) CreateDeviceNode (
   1099                                                   ACPI_DEVICE_PATH,
   1100                                                   ACPI_EXTENDED_DP,
   1101                                                   Length
   1102                                                   );
   1103 
   1104   AcpiEx->HID = EisaIdFromText (HIDStr);
   1105   AcpiEx->CID = EisaIdFromText (CIDStr);
   1106   AcpiEx->UID = 0;
   1107 
   1108   AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));
   1109   //
   1110   // HID string is NULL
   1111   //
   1112   *AsciiStr = '\0';
   1113   //
   1114   // Convert UID string
   1115   //
   1116   AsciiStr++;
   1117   StrToAscii (UIDSTRStr, &AsciiStr);
   1118   //
   1119   // CID string is NULL
   1120   //
   1121   *AsciiStr = '\0';
   1122 
   1123   return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;
   1124 }
   1125 
   1126 /**
   1127   Converts a text device path node to ACPI _ADR device path structure.
   1128 
   1129   @param TextDeviceNode  The input Text device path node.
   1130 
   1131   @return A pointer to the newly-created ACPI _ADR device path structure.
   1132 
   1133 **/
   1134 EFI_DEVICE_PATH_PROTOCOL *
   1135 DevPathFromTextAcpiAdr (
   1136   IN CHAR16 *TextDeviceNode
   1137   )
   1138 {
   1139   CHAR16                *DisplayDeviceStr;
   1140   ACPI_ADR_DEVICE_PATH  *AcpiAdr;
   1141   UINTN                 Index;
   1142   UINTN                 Length;
   1143 
   1144   AcpiAdr = (ACPI_ADR_DEVICE_PATH *) CreateDeviceNode (
   1145                                        ACPI_DEVICE_PATH,
   1146                                        ACPI_ADR_DP,
   1147                                        (UINT16) sizeof (ACPI_ADR_DEVICE_PATH)
   1148                                        );
   1149   ASSERT (AcpiAdr != NULL);
   1150 
   1151   for (Index = 0; ; Index++) {
   1152     DisplayDeviceStr = GetNextParamStr (&TextDeviceNode);
   1153     if (IS_NULL (*DisplayDeviceStr)) {
   1154       break;
   1155     }
   1156     if (Index > 0) {
   1157       Length  = DevicePathNodeLength (AcpiAdr);
   1158       AcpiAdr = ReallocatePool (
   1159                   Length,
   1160                   Length + sizeof (UINT32),
   1161                   AcpiAdr
   1162                   );
   1163       ASSERT (AcpiAdr != NULL);
   1164       SetDevicePathNodeLength (AcpiAdr, Length + sizeof (UINT32));
   1165     }
   1166 
   1167     (&AcpiAdr->ADR)[Index] = (UINT32) Strtoi (DisplayDeviceStr);
   1168   }
   1169 
   1170   return (EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr;
   1171 }
   1172 
   1173 /**
   1174   Converts a generic messaging text device path node to messaging device path structure.
   1175 
   1176   @param TextDeviceNode  The input Text device path node.
   1177 
   1178   @return A pointer to messaging device path structure.
   1179 
   1180 **/
   1181 EFI_DEVICE_PATH_PROTOCOL *
   1182 DevPathFromTextMsg (
   1183   IN CHAR16 *TextDeviceNode
   1184   )
   1185 {
   1186   return DevPathFromTextGenericPath (MESSAGING_DEVICE_PATH, TextDeviceNode);
   1187 }
   1188 
   1189 /**
   1190   Converts a text device path node to Parallel Port device path structure.
   1191 
   1192   @param TextDeviceNode  The input Text device path node.
   1193 
   1194   @return A pointer to the newly-created Parallel Port device path structure.
   1195 
   1196 **/
   1197 EFI_DEVICE_PATH_PROTOCOL *
   1198 DevPathFromTextAta (
   1199 IN CHAR16 *TextDeviceNode
   1200 )
   1201 {
   1202   CHAR16            *PrimarySecondaryStr;
   1203   CHAR16            *SlaveMasterStr;
   1204   CHAR16            *LunStr;
   1205   ATAPI_DEVICE_PATH *Atapi;
   1206 
   1207   Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (
   1208     MESSAGING_DEVICE_PATH,
   1209     MSG_ATAPI_DP,
   1210     (UINT16) sizeof (ATAPI_DEVICE_PATH)
   1211     );
   1212 
   1213   PrimarySecondaryStr = GetNextParamStr (&TextDeviceNode);
   1214   SlaveMasterStr      = GetNextParamStr (&TextDeviceNode);
   1215   LunStr              = GetNextParamStr (&TextDeviceNode);
   1216 
   1217   if (StrCmp (PrimarySecondaryStr, L"Primary") == 0) {
   1218     Atapi->PrimarySecondary = 0;
   1219   } else if (StrCmp (PrimarySecondaryStr, L"Secondary") == 0) {
   1220     Atapi->PrimarySecondary = 1;
   1221   } else {
   1222     Atapi->PrimarySecondary = (UINT8) Strtoi (PrimarySecondaryStr);
   1223   }
   1224   if (StrCmp (SlaveMasterStr, L"Master") == 0) {
   1225     Atapi->SlaveMaster      = 0;
   1226   } else if (StrCmp (SlaveMasterStr, L"Slave") == 0) {
   1227     Atapi->SlaveMaster      = 1;
   1228   } else {
   1229     Atapi->SlaveMaster      = (UINT8) Strtoi (SlaveMasterStr);
   1230   }
   1231 
   1232   Atapi->Lun                = (UINT16) Strtoi (LunStr);
   1233 
   1234   return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;
   1235 }
   1236 
   1237 /**
   1238   Converts a text device path node to SCSI device path structure.
   1239 
   1240   @param TextDeviceNode  The input Text device path node.
   1241 
   1242   @return A pointer to the newly-created SCSI device path structure.
   1243 
   1244 **/
   1245 EFI_DEVICE_PATH_PROTOCOL *
   1246 DevPathFromTextScsi (
   1247   IN CHAR16 *TextDeviceNode
   1248   )
   1249 {
   1250   CHAR16            *PunStr;
   1251   CHAR16            *LunStr;
   1252   SCSI_DEVICE_PATH  *Scsi;
   1253 
   1254   PunStr = GetNextParamStr (&TextDeviceNode);
   1255   LunStr = GetNextParamStr (&TextDeviceNode);
   1256   Scsi   = (SCSI_DEVICE_PATH *) CreateDeviceNode (
   1257                                    MESSAGING_DEVICE_PATH,
   1258                                    MSG_SCSI_DP,
   1259                                    (UINT16) sizeof (SCSI_DEVICE_PATH)
   1260                                    );
   1261 
   1262   Scsi->Pun = (UINT16) Strtoi (PunStr);
   1263   Scsi->Lun = (UINT16) Strtoi (LunStr);
   1264 
   1265   return (EFI_DEVICE_PATH_PROTOCOL *) Scsi;
   1266 }
   1267 
   1268 /**
   1269   Converts a text device path node to Fibre device path structure.
   1270 
   1271   @param TextDeviceNode  The input Text device path node.
   1272 
   1273   @return A pointer to the newly-created Fibre device path structure.
   1274 
   1275 **/
   1276 EFI_DEVICE_PATH_PROTOCOL *
   1277 DevPathFromTextFibre (
   1278   IN CHAR16 *TextDeviceNode
   1279   )
   1280 {
   1281   CHAR16                    *WWNStr;
   1282   CHAR16                    *LunStr;
   1283   FIBRECHANNEL_DEVICE_PATH  *Fibre;
   1284 
   1285   WWNStr = GetNextParamStr (&TextDeviceNode);
   1286   LunStr = GetNextParamStr (&TextDeviceNode);
   1287   Fibre  = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (
   1288                                           MESSAGING_DEVICE_PATH,
   1289                                           MSG_FIBRECHANNEL_DP,
   1290                                           (UINT16) sizeof (FIBRECHANNEL_DEVICE_PATH)
   1291                                           );
   1292 
   1293   Fibre->Reserved = 0;
   1294   Strtoi64 (WWNStr, &Fibre->WWN);
   1295   Strtoi64 (LunStr, &Fibre->Lun);
   1296 
   1297   return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;
   1298 }
   1299 
   1300 /**
   1301   Converts a text device path node to FibreEx device path structure.
   1302 
   1303   @param TextDeviceNode  The input Text device path node.
   1304 
   1305   @return A pointer to the newly-created FibreEx device path structure.
   1306 
   1307 **/
   1308 EFI_DEVICE_PATH_PROTOCOL *
   1309 DevPathFromTextFibreEx (
   1310   IN CHAR16 *TextDeviceNode
   1311   )
   1312 {
   1313   CHAR16                      *WWNStr;
   1314   CHAR16                      *LunStr;
   1315   FIBRECHANNELEX_DEVICE_PATH  *FibreEx;
   1316 
   1317   WWNStr  = GetNextParamStr (&TextDeviceNode);
   1318   LunStr  = GetNextParamStr (&TextDeviceNode);
   1319   FibreEx = (FIBRECHANNELEX_DEVICE_PATH *) CreateDeviceNode (
   1320                                              MESSAGING_DEVICE_PATH,
   1321                                              MSG_FIBRECHANNELEX_DP,
   1322                                              (UINT16) sizeof (FIBRECHANNELEX_DEVICE_PATH)
   1323                                              );
   1324 
   1325   FibreEx->Reserved = 0;
   1326   Strtoi64 (WWNStr, (UINT64 *) (&FibreEx->WWN));
   1327   Strtoi64 (LunStr, (UINT64 *) (&FibreEx->Lun));
   1328 
   1329   *(UINT64 *) (&FibreEx->WWN) = SwapBytes64 (*(UINT64 *) (&FibreEx->WWN));
   1330   *(UINT64 *) (&FibreEx->Lun) = SwapBytes64 (*(UINT64 *) (&FibreEx->Lun));
   1331 
   1332   return (EFI_DEVICE_PATH_PROTOCOL *) FibreEx;
   1333 }
   1334 
   1335 /**
   1336   Converts a text device path node to 1394 device path structure.
   1337 
   1338   @param TextDeviceNode  The input Text device path node.
   1339 
   1340   @return A pointer to the newly-created 1394 device path structure.
   1341 
   1342 **/
   1343 EFI_DEVICE_PATH_PROTOCOL *
   1344 DevPathFromText1394 (
   1345   IN CHAR16 *TextDeviceNode
   1346   )
   1347 {
   1348   CHAR16            *GuidStr;
   1349   F1394_DEVICE_PATH *F1394DevPath;
   1350 
   1351   GuidStr = GetNextParamStr (&TextDeviceNode);
   1352   F1394DevPath  = (F1394_DEVICE_PATH *) CreateDeviceNode (
   1353                                           MESSAGING_DEVICE_PATH,
   1354                                           MSG_1394_DP,
   1355                                           (UINT16) sizeof (F1394_DEVICE_PATH)
   1356                                           );
   1357 
   1358   F1394DevPath->Reserved = 0;
   1359   F1394DevPath->Guid     = StrHexToUint64 (GuidStr);
   1360 
   1361   return (EFI_DEVICE_PATH_PROTOCOL *) F1394DevPath;
   1362 }
   1363 
   1364 /**
   1365   Converts a text device path node to USB device path structure.
   1366 
   1367   @param TextDeviceNode  The input Text device path node.
   1368 
   1369   @return A pointer to the newly-created USB device path structure.
   1370 
   1371 **/
   1372 EFI_DEVICE_PATH_PROTOCOL *
   1373 DevPathFromTextUsb (
   1374   IN CHAR16 *TextDeviceNode
   1375   )
   1376 {
   1377   CHAR16          *PortStr;
   1378   CHAR16          *InterfaceStr;
   1379   USB_DEVICE_PATH *Usb;
   1380 
   1381   PortStr               = GetNextParamStr (&TextDeviceNode);
   1382   InterfaceStr          = GetNextParamStr (&TextDeviceNode);
   1383   Usb                   = (USB_DEVICE_PATH *) CreateDeviceNode (
   1384                                                 MESSAGING_DEVICE_PATH,
   1385                                                 MSG_USB_DP,
   1386                                                 (UINT16) sizeof (USB_DEVICE_PATH)
   1387                                                 );
   1388 
   1389   Usb->ParentPortNumber = (UINT8) Strtoi (PortStr);
   1390   Usb->InterfaceNumber  = (UINT8) Strtoi (InterfaceStr);
   1391 
   1392   return (EFI_DEVICE_PATH_PROTOCOL *) Usb;
   1393 }
   1394 
   1395 /**
   1396   Converts a text device path node to I20 device path structure.
   1397 
   1398   @param TextDeviceNode  The input Text device path node.
   1399 
   1400   @return A pointer to the newly-created I20 device path structure.
   1401 
   1402 **/
   1403 EFI_DEVICE_PATH_PROTOCOL *
   1404 DevPathFromTextI2O (
   1405   IN CHAR16 *TextDeviceNode
   1406   )
   1407 {
   1408   CHAR16          *TIDStr;
   1409   I2O_DEVICE_PATH *I2ODevPath;
   1410 
   1411   TIDStr     = GetNextParamStr (&TextDeviceNode);
   1412   I2ODevPath = (I2O_DEVICE_PATH *) CreateDeviceNode (
   1413                                     MESSAGING_DEVICE_PATH,
   1414                                     MSG_I2O_DP,
   1415                                     (UINT16) sizeof (I2O_DEVICE_PATH)
   1416                                     );
   1417 
   1418   I2ODevPath->Tid  = (UINT32) Strtoi (TIDStr);
   1419 
   1420   return (EFI_DEVICE_PATH_PROTOCOL *) I2ODevPath;
   1421 }
   1422 
   1423 /**
   1424   Converts a text device path node to Infini Band device path structure.
   1425 
   1426   @param TextDeviceNode  The input Text device path node.
   1427 
   1428   @return A pointer to the newly-created Infini Band device path structure.
   1429 
   1430 **/
   1431 EFI_DEVICE_PATH_PROTOCOL *
   1432 DevPathFromTextInfiniband (
   1433   IN CHAR16 *TextDeviceNode
   1434   )
   1435 {
   1436   CHAR16                  *FlagsStr;
   1437   CHAR16                  *GuidStr;
   1438   CHAR16                  *SidStr;
   1439   CHAR16                  *TidStr;
   1440   CHAR16                  *DidStr;
   1441   EFI_GUID                PortGid;
   1442   INFINIBAND_DEVICE_PATH  *InfiniBand;
   1443 
   1444   FlagsStr   = GetNextParamStr (&TextDeviceNode);
   1445   GuidStr    = GetNextParamStr (&TextDeviceNode);
   1446   SidStr     = GetNextParamStr (&TextDeviceNode);
   1447   TidStr     = GetNextParamStr (&TextDeviceNode);
   1448   DidStr     = GetNextParamStr (&TextDeviceNode);
   1449   InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (
   1450                                             MESSAGING_DEVICE_PATH,
   1451                                             MSG_INFINIBAND_DP,
   1452                                             (UINT16) sizeof (INFINIBAND_DEVICE_PATH)
   1453                                             );
   1454 
   1455   InfiniBand->ResourceFlags = (UINT32) Strtoi (FlagsStr);
   1456   StrToGuid (GuidStr, &PortGid);
   1457   CopyMem (InfiniBand->PortGid, &PortGid, sizeof (EFI_GUID));
   1458   Strtoi64 (SidStr, &InfiniBand->ServiceId);
   1459   Strtoi64 (TidStr, &InfiniBand->TargetPortId);
   1460   Strtoi64 (DidStr, &InfiniBand->DeviceId);
   1461 
   1462   return (EFI_DEVICE_PATH_PROTOCOL *) InfiniBand;
   1463 }
   1464 
   1465 /**
   1466   Converts a text device path node to Vendor-Defined Messaging device path structure.
   1467 
   1468   @param TextDeviceNode  The input Text device path node.
   1469 
   1470   @return A pointer to the newly-created Vendor-Defined Messaging device path structure.
   1471 
   1472 **/
   1473 EFI_DEVICE_PATH_PROTOCOL *
   1474 DevPathFromTextVenMsg (
   1475   IN CHAR16 *TextDeviceNode
   1476   )
   1477 {
   1478   return ConvertFromTextVendor (
   1479             TextDeviceNode,
   1480             MESSAGING_DEVICE_PATH,
   1481             MSG_VENDOR_DP
   1482             );
   1483 }
   1484 
   1485 /**
   1486   Converts a text device path node to Vendor defined PC-ANSI device path structure.
   1487 
   1488   @param TextDeviceNode  The input Text device path node.
   1489 
   1490   @return A pointer to the newly-created Vendor defined PC-ANSI device path structure.
   1491 
   1492 **/
   1493 EFI_DEVICE_PATH_PROTOCOL *
   1494 DevPathFromTextVenPcAnsi (
   1495   IN CHAR16 *TextDeviceNode
   1496   )
   1497 {
   1498   VENDOR_DEVICE_PATH  *Vendor;
   1499 
   1500   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
   1501                                     MESSAGING_DEVICE_PATH,
   1502                                     MSG_VENDOR_DP,
   1503                                     (UINT16) sizeof (VENDOR_DEVICE_PATH));
   1504   CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);
   1505 
   1506   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
   1507 }
   1508 
   1509 /**
   1510   Converts a text device path node to Vendor defined VT100 device path structure.
   1511 
   1512   @param TextDeviceNode  The input Text device path node.
   1513 
   1514   @return A pointer to the newly-created Vendor defined VT100 device path structure.
   1515 
   1516 **/
   1517 EFI_DEVICE_PATH_PROTOCOL *
   1518 DevPathFromTextVenVt100 (
   1519   IN CHAR16 *TextDeviceNode
   1520   )
   1521 {
   1522   VENDOR_DEVICE_PATH  *Vendor;
   1523 
   1524   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
   1525                                     MESSAGING_DEVICE_PATH,
   1526                                     MSG_VENDOR_DP,
   1527                                     (UINT16) sizeof (VENDOR_DEVICE_PATH));
   1528   CopyGuid (&Vendor->Guid, &gEfiVT100Guid);
   1529 
   1530   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
   1531 }
   1532 
   1533 /**
   1534   Converts a text device path node to Vendor defined VT100 Plus device path structure.
   1535 
   1536   @param TextDeviceNode  The input Text device path node.
   1537 
   1538   @return A pointer to the newly-created Vendor defined VT100 Plus device path structure.
   1539 
   1540 **/
   1541 EFI_DEVICE_PATH_PROTOCOL *
   1542 DevPathFromTextVenVt100Plus (
   1543   IN CHAR16 *TextDeviceNode
   1544   )
   1545 {
   1546   VENDOR_DEVICE_PATH  *Vendor;
   1547 
   1548   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
   1549                                     MESSAGING_DEVICE_PATH,
   1550                                     MSG_VENDOR_DP,
   1551                                     (UINT16) sizeof (VENDOR_DEVICE_PATH));
   1552   CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);
   1553 
   1554   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
   1555 }
   1556 
   1557 /**
   1558   Converts a text device path node to Vendor defined UTF8 device path structure.
   1559 
   1560   @param TextDeviceNode  The input Text device path node.
   1561 
   1562   @return A pointer to the newly-created Vendor defined UTF8 device path structure.
   1563 
   1564 **/
   1565 EFI_DEVICE_PATH_PROTOCOL *
   1566 DevPathFromTextVenUtf8 (
   1567   IN CHAR16 *TextDeviceNode
   1568   )
   1569 {
   1570   VENDOR_DEVICE_PATH  *Vendor;
   1571 
   1572   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
   1573                                     MESSAGING_DEVICE_PATH,
   1574                                     MSG_VENDOR_DP,
   1575                                     (UINT16) sizeof (VENDOR_DEVICE_PATH));
   1576   CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);
   1577 
   1578   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
   1579 }
   1580 
   1581 /**
   1582   Converts a text device path node to UART Flow Control device path structure.
   1583 
   1584   @param TextDeviceNode  The input Text device path node.
   1585 
   1586   @return A pointer to the newly-created UART Flow Control device path structure.
   1587 
   1588 **/
   1589 EFI_DEVICE_PATH_PROTOCOL *
   1590 DevPathFromTextUartFlowCtrl (
   1591   IN CHAR16 *TextDeviceNode
   1592   )
   1593 {
   1594   CHAR16                        *ValueStr;
   1595   UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;
   1596 
   1597   ValueStr        = GetNextParamStr (&TextDeviceNode);
   1598   UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (
   1599                                                         MESSAGING_DEVICE_PATH,
   1600                                                         MSG_VENDOR_DP,
   1601                                                         (UINT16) sizeof (UART_FLOW_CONTROL_DEVICE_PATH)
   1602                                                         );
   1603 
   1604   CopyGuid (&UartFlowControl->Guid, &gEfiUartDevicePathGuid);
   1605   if (StrCmp (ValueStr, L"XonXoff") == 0) {
   1606     UartFlowControl->FlowControlMap = 2;
   1607   } else if (StrCmp (ValueStr, L"Hardware") == 0) {
   1608     UartFlowControl->FlowControlMap = 1;
   1609   } else {
   1610     UartFlowControl->FlowControlMap = 0;
   1611   }
   1612 
   1613   return (EFI_DEVICE_PATH_PROTOCOL *) UartFlowControl;
   1614 }
   1615 
   1616 /**
   1617   Converts a text device path node to Serial Attached SCSI device path structure.
   1618 
   1619   @param TextDeviceNode  The input Text device path node.
   1620 
   1621   @return A pointer to the newly-created Serial Attached SCSI device path structure.
   1622 
   1623 **/
   1624 EFI_DEVICE_PATH_PROTOCOL *
   1625 DevPathFromTextSAS (
   1626   IN CHAR16 *TextDeviceNode
   1627   )
   1628 {
   1629   CHAR16          *AddressStr;
   1630   CHAR16          *LunStr;
   1631   CHAR16          *RTPStr;
   1632   CHAR16          *SASSATAStr;
   1633   CHAR16          *LocationStr;
   1634   CHAR16          *ConnectStr;
   1635   CHAR16          *DriveBayStr;
   1636   CHAR16          *ReservedStr;
   1637   UINT16          Info;
   1638   UINT16          Uint16;
   1639   SAS_DEVICE_PATH *Sas;
   1640 
   1641   AddressStr  = GetNextParamStr (&TextDeviceNode);
   1642   LunStr      = GetNextParamStr (&TextDeviceNode);
   1643   RTPStr      = GetNextParamStr (&TextDeviceNode);
   1644   SASSATAStr  = GetNextParamStr (&TextDeviceNode);
   1645   LocationStr = GetNextParamStr (&TextDeviceNode);
   1646   ConnectStr  = GetNextParamStr (&TextDeviceNode);
   1647   DriveBayStr = GetNextParamStr (&TextDeviceNode);
   1648   ReservedStr = GetNextParamStr (&TextDeviceNode);
   1649   Sas         = (SAS_DEVICE_PATH *) CreateDeviceNode (
   1650                                        MESSAGING_DEVICE_PATH,
   1651                                        MSG_VENDOR_DP,
   1652                                        (UINT16) sizeof (SAS_DEVICE_PATH)
   1653                                        );
   1654 
   1655   CopyGuid (&Sas->Guid, &gEfiSasDevicePathGuid);
   1656   Strtoi64 (AddressStr, &Sas->SasAddress);
   1657   Strtoi64 (LunStr, &Sas->Lun);
   1658   Sas->RelativeTargetPort = (UINT16) Strtoi (RTPStr);
   1659 
   1660   if (StrCmp (SASSATAStr, L"NoTopology") == 0) {
   1661     Info = 0x0;
   1662 
   1663   } else if ((StrCmp (SASSATAStr, L"SATA") == 0) || (StrCmp (SASSATAStr, L"SAS") == 0)) {
   1664 
   1665     Uint16 = (UINT16) Strtoi (DriveBayStr);
   1666     if (Uint16 == 0) {
   1667       Info = 0x1;
   1668     } else {
   1669       Info = (UINT16) (0x2 | ((Uint16 - 1) << 8));
   1670     }
   1671 
   1672     if (StrCmp (SASSATAStr, L"SATA") == 0) {
   1673       Info |= BIT4;
   1674     }
   1675 
   1676     //
   1677     // Location is an integer between 0 and 1 or else
   1678     // the keyword Internal (0) or External (1).
   1679     //
   1680     if (StrCmp (LocationStr, L"External") == 0) {
   1681       Uint16 = 1;
   1682     } else if (StrCmp (LocationStr, L"Internal") == 0) {
   1683       Uint16 = 0;
   1684     } else {
   1685       Uint16 = ((UINT16) Strtoi (LocationStr) & BIT0);
   1686     }
   1687     Info |= (Uint16 << 5);
   1688 
   1689     //
   1690     // Connect is an integer between 0 and 3 or else
   1691     // the keyword Direct (0) or Expanded (1).
   1692     //
   1693     if (StrCmp (ConnectStr, L"Expanded") == 0) {
   1694       Uint16 = 1;
   1695     } else if (StrCmp (ConnectStr, L"Direct") == 0) {
   1696       Uint16 = 0;
   1697     } else {
   1698       Uint16 = ((UINT16) Strtoi (ConnectStr) & (BIT0 | BIT1));
   1699     }
   1700     Info |= (Uint16 << 6);
   1701 
   1702   } else {
   1703     Info = (UINT16) Strtoi (SASSATAStr);
   1704   }
   1705 
   1706   Sas->DeviceTopology = Info;
   1707   Sas->Reserved       = (UINT32) Strtoi (ReservedStr);
   1708 
   1709   return (EFI_DEVICE_PATH_PROTOCOL *) Sas;
   1710 }
   1711 
   1712 /**
   1713   Converts a text device path node to Serial Attached SCSI Ex device path structure.
   1714 
   1715   @param TextDeviceNode  The input Text device path node.
   1716 
   1717   @return A pointer to the newly-created Serial Attached SCSI Ex device path structure.
   1718 
   1719 **/
   1720 EFI_DEVICE_PATH_PROTOCOL *
   1721 DevPathFromTextSasEx (
   1722   IN CHAR16 *TextDeviceNode
   1723   )
   1724 {
   1725   CHAR16            *AddressStr;
   1726   CHAR16            *LunStr;
   1727   CHAR16            *RTPStr;
   1728   CHAR16            *SASSATAStr;
   1729   CHAR16            *LocationStr;
   1730   CHAR16            *ConnectStr;
   1731   CHAR16            *DriveBayStr;
   1732   UINT16            Info;
   1733   UINT16            Uint16;
   1734   UINT64            SasAddress;
   1735   UINT64            Lun;
   1736   SASEX_DEVICE_PATH *SasEx;
   1737 
   1738   AddressStr  = GetNextParamStr (&TextDeviceNode);
   1739   LunStr      = GetNextParamStr (&TextDeviceNode);
   1740   RTPStr      = GetNextParamStr (&TextDeviceNode);
   1741   SASSATAStr  = GetNextParamStr (&TextDeviceNode);
   1742   LocationStr = GetNextParamStr (&TextDeviceNode);
   1743   ConnectStr  = GetNextParamStr (&TextDeviceNode);
   1744   DriveBayStr = GetNextParamStr (&TextDeviceNode);
   1745   SasEx       = (SASEX_DEVICE_PATH *) CreateDeviceNode (
   1746                                         MESSAGING_DEVICE_PATH,
   1747                                         MSG_SASEX_DP,
   1748                                         (UINT16) sizeof (SASEX_DEVICE_PATH)
   1749                                         );
   1750 
   1751   Strtoi64 (AddressStr, &SasAddress);
   1752   Strtoi64 (LunStr,     &Lun);
   1753   WriteUnaligned64 ((UINT64 *) &SasEx->SasAddress, SwapBytes64 (SasAddress));
   1754   WriteUnaligned64 ((UINT64 *) &SasEx->Lun,        SwapBytes64 (Lun));
   1755   SasEx->RelativeTargetPort      = (UINT16) Strtoi (RTPStr);
   1756 
   1757   if (StrCmp (SASSATAStr, L"NoTopology") == 0) {
   1758     Info = 0x0;
   1759 
   1760   } else if ((StrCmp (SASSATAStr, L"SATA") == 0) || (StrCmp (SASSATAStr, L"SAS") == 0)) {
   1761 
   1762     Uint16 = (UINT16) Strtoi (DriveBayStr);
   1763     if (Uint16 == 0) {
   1764       Info = 0x1;
   1765     } else {
   1766       Info = (UINT16) (0x2 | ((Uint16 - 1) << 8));
   1767     }
   1768 
   1769     if (StrCmp (SASSATAStr, L"SATA") == 0) {
   1770       Info |= BIT4;
   1771     }
   1772 
   1773     //
   1774     // Location is an integer between 0 and 1 or else
   1775     // the keyword Internal (0) or External (1).
   1776     //
   1777     if (StrCmp (LocationStr, L"External") == 0) {
   1778       Uint16 = 1;
   1779     } else if (StrCmp (LocationStr, L"Internal") == 0) {
   1780       Uint16 = 0;
   1781     } else {
   1782       Uint16 = ((UINT16) Strtoi (LocationStr) & BIT0);
   1783     }
   1784     Info |= (Uint16 << 5);
   1785 
   1786     //
   1787     // Connect is an integer between 0 and 3 or else
   1788     // the keyword Direct (0) or Expanded (1).
   1789     //
   1790     if (StrCmp (ConnectStr, L"Expanded") == 0) {
   1791       Uint16 = 1;
   1792     } else if (StrCmp (ConnectStr, L"Direct") == 0) {
   1793       Uint16 = 0;
   1794     } else {
   1795       Uint16 = ((UINT16) Strtoi (ConnectStr) & (BIT0 | BIT1));
   1796     }
   1797     Info |= (Uint16 << 6);
   1798 
   1799   } else {
   1800     Info = (UINT16) Strtoi (SASSATAStr);
   1801   }
   1802 
   1803   SasEx->DeviceTopology = Info;
   1804 
   1805   return (EFI_DEVICE_PATH_PROTOCOL *) SasEx;
   1806 }
   1807 
   1808 /**
   1809   Converts a text device path node to NVM Express Namespace device path structure.
   1810 
   1811   @param TextDeviceNode  The input Text device path node.
   1812 
   1813   @return A pointer to the newly-created NVM Express Namespace device path structure.
   1814 
   1815 **/
   1816 EFI_DEVICE_PATH_PROTOCOL *
   1817 DevPathFromTextNVMe (
   1818   IN CHAR16 *TextDeviceNode
   1819   )
   1820 {
   1821   CHAR16                     *NamespaceIdStr;
   1822   CHAR16                     *NamespaceUuidStr;
   1823   NVME_NAMESPACE_DEVICE_PATH *Nvme;
   1824   UINT8                      *Uuid;
   1825   UINTN                      Index;
   1826 
   1827   NamespaceIdStr   = GetNextParamStr (&TextDeviceNode);
   1828   NamespaceUuidStr = GetNextParamStr (&TextDeviceNode);
   1829   Nvme = (NVME_NAMESPACE_DEVICE_PATH *) CreateDeviceNode (
   1830     MESSAGING_DEVICE_PATH,
   1831     MSG_NVME_NAMESPACE_DP,
   1832     (UINT16) sizeof (NVME_NAMESPACE_DEVICE_PATH)
   1833     );
   1834 
   1835   Nvme->NamespaceId = (UINT32) Strtoi (NamespaceIdStr);
   1836   Uuid = (UINT8 *) &Nvme->NamespaceUuid;
   1837 
   1838   Index = sizeof (Nvme->NamespaceUuid) / sizeof (UINT8);
   1839   while (Index-- != 0) {
   1840     Uuid[Index] = (UINT8) StrHexToUintn (SplitStr (&NamespaceUuidStr, L'-'));
   1841   }
   1842 
   1843   return (EFI_DEVICE_PATH_PROTOCOL *) Nvme;
   1844 }
   1845 
   1846 /**
   1847   Converts a text device path node to UFS device path structure.
   1848 
   1849   @param TextDeviceNode  The input Text device path node.
   1850 
   1851   @return A pointer to the newly-created UFS device path structure.
   1852 
   1853 **/
   1854 EFI_DEVICE_PATH_PROTOCOL *
   1855 DevPathFromTextUfs (
   1856   IN CHAR16 *TextDeviceNode
   1857   )
   1858 {
   1859   CHAR16            *PunStr;
   1860   CHAR16            *LunStr;
   1861   UFS_DEVICE_PATH   *Ufs;
   1862 
   1863   PunStr = GetNextParamStr (&TextDeviceNode);
   1864   LunStr = GetNextParamStr (&TextDeviceNode);
   1865   Ufs    = (UFS_DEVICE_PATH *) CreateDeviceNode (
   1866                                  MESSAGING_DEVICE_PATH,
   1867                                  MSG_UFS_DP,
   1868                                  (UINT16) sizeof (UFS_DEVICE_PATH)
   1869                                  );
   1870 
   1871   Ufs->Pun = (UINT8) Strtoi (PunStr);
   1872   Ufs->Lun = (UINT8) Strtoi (LunStr);
   1873 
   1874   return (EFI_DEVICE_PATH_PROTOCOL *) Ufs;
   1875 }
   1876 
   1877 /**
   1878   Converts a text device path node to SD (Secure Digital) device path structure.
   1879 
   1880   @param TextDeviceNode  The input Text device path node.
   1881 
   1882   @return A pointer to the newly-created SD device path structure.
   1883 
   1884 **/
   1885 EFI_DEVICE_PATH_PROTOCOL *
   1886 DevPathFromTextSd (
   1887   IN CHAR16 *TextDeviceNode
   1888   )
   1889 {
   1890   CHAR16            *SlotNumberStr;
   1891   SD_DEVICE_PATH    *Sd;
   1892 
   1893   SlotNumberStr = GetNextParamStr (&TextDeviceNode);
   1894   Sd            = (SD_DEVICE_PATH *) CreateDeviceNode (
   1895                                        MESSAGING_DEVICE_PATH,
   1896                                        MSG_SD_DP,
   1897                                        (UINT16) sizeof (SD_DEVICE_PATH)
   1898                                        );
   1899 
   1900   Sd->SlotNumber = (UINT8) Strtoi (SlotNumberStr);
   1901 
   1902   return (EFI_DEVICE_PATH_PROTOCOL *) Sd;
   1903 }
   1904 
   1905 /**
   1906   Converts a text device path node to Debug Port device path structure.
   1907 
   1908   @param TextDeviceNode  The input Text device path node.
   1909 
   1910   @return A pointer to the newly-created Debug Port device path structure.
   1911 
   1912 **/
   1913 EFI_DEVICE_PATH_PROTOCOL *
   1914 DevPathFromTextDebugPort (
   1915   IN CHAR16 *TextDeviceNode
   1916   )
   1917 {
   1918   VENDOR_DEFINED_MESSAGING_DEVICE_PATH  *Vend;
   1919 
   1920   Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (
   1921                                                     MESSAGING_DEVICE_PATH,
   1922                                                     MSG_VENDOR_DP,
   1923                                                     (UINT16) sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)
   1924                                                     );
   1925 
   1926   CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);
   1927 
   1928   return (EFI_DEVICE_PATH_PROTOCOL *) Vend;
   1929 }
   1930 
   1931 /**
   1932   Converts a text device path node to MAC device path structure.
   1933 
   1934   @param TextDeviceNode  The input Text device path node.
   1935 
   1936   @return A pointer to the newly-created MAC device path structure.
   1937 
   1938 **/
   1939 EFI_DEVICE_PATH_PROTOCOL *
   1940 DevPathFromTextMAC (
   1941   IN CHAR16 *TextDeviceNode
   1942   )
   1943 {
   1944   CHAR16                *AddressStr;
   1945   CHAR16                *IfTypeStr;
   1946   UINTN                 Length;
   1947   MAC_ADDR_DEVICE_PATH  *MACDevPath;
   1948 
   1949   AddressStr    = GetNextParamStr (&TextDeviceNode);
   1950   IfTypeStr     = GetNextParamStr (&TextDeviceNode);
   1951   MACDevPath    = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (
   1952                                               MESSAGING_DEVICE_PATH,
   1953                                               MSG_MAC_ADDR_DP,
   1954                                               (UINT16) sizeof (MAC_ADDR_DEVICE_PATH)
   1955                                               );
   1956 
   1957   MACDevPath->IfType   = (UINT8) Strtoi (IfTypeStr);
   1958 
   1959   Length = sizeof (EFI_MAC_ADDRESS);
   1960   StrToBuf (&MACDevPath->MacAddress.Addr[0], Length, AddressStr);
   1961 
   1962   return (EFI_DEVICE_PATH_PROTOCOL *) MACDevPath;
   1963 }
   1964 
   1965 
   1966 /**
   1967   Converts a text format to the network protocol ID.
   1968 
   1969   @param Text  String of protocol field.
   1970 
   1971   @return Network protocol ID .
   1972 
   1973 **/
   1974 UINTN
   1975 NetworkProtocolFromText (
   1976   IN CHAR16 *Text
   1977   )
   1978 {
   1979   if (StrCmp (Text, L"UDP") == 0) {
   1980     return RFC_1700_UDP_PROTOCOL;
   1981   }
   1982 
   1983   if (StrCmp (Text, L"TCP") == 0) {
   1984     return RFC_1700_TCP_PROTOCOL;
   1985   }
   1986 
   1987   return Strtoi (Text);
   1988 }
   1989 
   1990 
   1991 /**
   1992   Converts a text device path node to IPV4 device path structure.
   1993 
   1994   @param TextDeviceNode  The input Text device path node.
   1995 
   1996   @return A pointer to the newly-created IPV4 device path structure.
   1997 
   1998 **/
   1999 EFI_DEVICE_PATH_PROTOCOL *
   2000 DevPathFromTextIPv4 (
   2001   IN CHAR16 *TextDeviceNode
   2002   )
   2003 {
   2004   CHAR16            *RemoteIPStr;
   2005   CHAR16            *ProtocolStr;
   2006   CHAR16            *TypeStr;
   2007   CHAR16            *LocalIPStr;
   2008   CHAR16            *GatewayIPStr;
   2009   CHAR16            *SubnetMaskStr;
   2010   IPv4_DEVICE_PATH  *IPv4;
   2011 
   2012   RemoteIPStr           = GetNextParamStr (&TextDeviceNode);
   2013   ProtocolStr           = GetNextParamStr (&TextDeviceNode);
   2014   TypeStr               = GetNextParamStr (&TextDeviceNode);
   2015   LocalIPStr            = GetNextParamStr (&TextDeviceNode);
   2016   GatewayIPStr          = GetNextParamStr (&TextDeviceNode);
   2017   SubnetMaskStr         = GetNextParamStr (&TextDeviceNode);
   2018   IPv4                  = (IPv4_DEVICE_PATH *) CreateDeviceNode (
   2019                                                  MESSAGING_DEVICE_PATH,
   2020                                                  MSG_IPv4_DP,
   2021                                                  (UINT16) sizeof (IPv4_DEVICE_PATH)
   2022                                                  );
   2023 
   2024   StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);
   2025   IPv4->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);
   2026   if (StrCmp (TypeStr, L"Static") == 0) {
   2027     IPv4->StaticIpAddress = TRUE;
   2028   } else {
   2029     IPv4->StaticIpAddress = FALSE;
   2030   }
   2031 
   2032   StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);
   2033   if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*SubnetMaskStr)) {
   2034     StrToIPv4Addr (&GatewayIPStr,  &IPv4->GatewayIpAddress);
   2035     StrToIPv4Addr (&SubnetMaskStr, &IPv4->SubnetMask);
   2036   } else {
   2037     ZeroMem (&IPv4->GatewayIpAddress, sizeof (IPv4->GatewayIpAddress));
   2038     ZeroMem (&IPv4->SubnetMask,    sizeof (IPv4->SubnetMask));
   2039   }
   2040 
   2041   IPv4->LocalPort       = 0;
   2042   IPv4->RemotePort      = 0;
   2043 
   2044   return (EFI_DEVICE_PATH_PROTOCOL *) IPv4;
   2045 }
   2046 
   2047 /**
   2048   Converts a text device path node to IPV6 device path structure.
   2049 
   2050   @param TextDeviceNode  The input Text device path node.
   2051 
   2052   @return A pointer to the newly-created IPV6 device path structure.
   2053 
   2054 **/
   2055 EFI_DEVICE_PATH_PROTOCOL *
   2056 DevPathFromTextIPv6 (
   2057   IN CHAR16 *TextDeviceNode
   2058   )
   2059 {
   2060   CHAR16            *RemoteIPStr;
   2061   CHAR16            *ProtocolStr;
   2062   CHAR16            *TypeStr;
   2063   CHAR16            *LocalIPStr;
   2064   CHAR16            *GatewayIPStr;
   2065   CHAR16            *PrefixLengthStr;
   2066   IPv6_DEVICE_PATH  *IPv6;
   2067 
   2068   RemoteIPStr           = GetNextParamStr (&TextDeviceNode);
   2069   ProtocolStr           = GetNextParamStr (&TextDeviceNode);
   2070   TypeStr               = GetNextParamStr (&TextDeviceNode);
   2071   LocalIPStr            = GetNextParamStr (&TextDeviceNode);
   2072   PrefixLengthStr       = GetNextParamStr (&TextDeviceNode);
   2073   GatewayIPStr          = GetNextParamStr (&TextDeviceNode);
   2074   IPv6                  = (IPv6_DEVICE_PATH *) CreateDeviceNode (
   2075                                                  MESSAGING_DEVICE_PATH,
   2076                                                  MSG_IPv6_DP,
   2077                                                  (UINT16) sizeof (IPv6_DEVICE_PATH)
   2078                                                  );
   2079 
   2080   StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);
   2081   IPv6->Protocol        = (UINT16) NetworkProtocolFromText (ProtocolStr);
   2082   if (StrCmp (TypeStr, L"Static") == 0) {
   2083     IPv6->IpAddressOrigin = 0;
   2084   } else if (StrCmp (TypeStr, L"StatelessAutoConfigure") == 0) {
   2085     IPv6->IpAddressOrigin = 1;
   2086   } else {
   2087     IPv6->IpAddressOrigin = 2;
   2088   }
   2089 
   2090   StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);
   2091   if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*PrefixLengthStr)) {
   2092     StrToIPv6Addr (&GatewayIPStr, &IPv6->GatewayIpAddress);
   2093     IPv6->PrefixLength = (UINT8) Strtoi (PrefixLengthStr);
   2094   } else {
   2095     ZeroMem (&IPv6->GatewayIpAddress, sizeof (IPv6->GatewayIpAddress));
   2096     IPv6->PrefixLength = 0;
   2097   }
   2098 
   2099   IPv6->LocalPort       = 0;
   2100   IPv6->RemotePort      = 0;
   2101 
   2102   return (EFI_DEVICE_PATH_PROTOCOL *) IPv6;
   2103 }
   2104 
   2105 /**
   2106   Converts a text device path node to UART device path structure.
   2107 
   2108   @param TextDeviceNode  The input Text device path node.
   2109 
   2110   @return A pointer to the newly-created UART device path structure.
   2111 
   2112 **/
   2113 EFI_DEVICE_PATH_PROTOCOL *
   2114 DevPathFromTextUart (
   2115   IN CHAR16 *TextDeviceNode
   2116   )
   2117 {
   2118   CHAR16            *BaudStr;
   2119   CHAR16            *DataBitsStr;
   2120   CHAR16            *ParityStr;
   2121   CHAR16            *StopBitsStr;
   2122   UART_DEVICE_PATH  *Uart;
   2123 
   2124   BaudStr         = GetNextParamStr (&TextDeviceNode);
   2125   DataBitsStr     = GetNextParamStr (&TextDeviceNode);
   2126   ParityStr       = GetNextParamStr (&TextDeviceNode);
   2127   StopBitsStr     = GetNextParamStr (&TextDeviceNode);
   2128   Uart            = (UART_DEVICE_PATH *) CreateDeviceNode (
   2129                                            MESSAGING_DEVICE_PATH,
   2130                                            MSG_UART_DP,
   2131                                            (UINT16) sizeof (UART_DEVICE_PATH)
   2132                                            );
   2133 
   2134   if (StrCmp (BaudStr, L"DEFAULT") == 0) {
   2135     Uart->BaudRate = 115200;
   2136   } else {
   2137     Strtoi64 (BaudStr, &Uart->BaudRate);
   2138   }
   2139   Uart->DataBits  = (UINT8) ((StrCmp (DataBitsStr, L"DEFAULT") == 0) ? 8 : Strtoi (DataBitsStr));
   2140   switch (*ParityStr) {
   2141   case L'D':
   2142     Uart->Parity = 0;
   2143     break;
   2144 
   2145   case L'N':
   2146     Uart->Parity = 1;
   2147     break;
   2148 
   2149   case L'E':
   2150     Uart->Parity = 2;
   2151     break;
   2152 
   2153   case L'O':
   2154     Uart->Parity = 3;
   2155     break;
   2156 
   2157   case L'M':
   2158     Uart->Parity = 4;
   2159     break;
   2160 
   2161   case L'S':
   2162     Uart->Parity = 5;
   2163     break;
   2164 
   2165   default:
   2166     Uart->Parity = (UINT8) Strtoi (ParityStr);
   2167     break;
   2168   }
   2169 
   2170   if (StrCmp (StopBitsStr, L"D") == 0) {
   2171     Uart->StopBits = (UINT8) 0;
   2172   } else if (StrCmp (StopBitsStr, L"1") == 0) {
   2173     Uart->StopBits = (UINT8) 1;
   2174   } else if (StrCmp (StopBitsStr, L"1.5") == 0) {
   2175     Uart->StopBits = (UINT8) 2;
   2176   } else if (StrCmp (StopBitsStr, L"2") == 0) {
   2177     Uart->StopBits = (UINT8) 3;
   2178   } else {
   2179     Uart->StopBits = (UINT8) Strtoi (StopBitsStr);
   2180   }
   2181 
   2182   return (EFI_DEVICE_PATH_PROTOCOL *) Uart;
   2183 }
   2184 
   2185 /**
   2186   Converts a text device path node to USB class device path structure.
   2187 
   2188   @param TextDeviceNode  The input Text device path node.
   2189   @param UsbClassText    A pointer to USB_CLASS_TEXT structure to be integrated to USB Class Text.
   2190 
   2191   @return A pointer to the newly-created USB class device path structure.
   2192 
   2193 **/
   2194 EFI_DEVICE_PATH_PROTOCOL *
   2195 ConvertFromTextUsbClass (
   2196   IN CHAR16         *TextDeviceNode,
   2197   IN USB_CLASS_TEXT *UsbClassText
   2198   )
   2199 {
   2200   CHAR16                *VIDStr;
   2201   CHAR16                *PIDStr;
   2202   CHAR16                *ClassStr;
   2203   CHAR16                *SubClassStr;
   2204   CHAR16                *ProtocolStr;
   2205   USB_CLASS_DEVICE_PATH *UsbClass;
   2206 
   2207   UsbClass    = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (
   2208                                             MESSAGING_DEVICE_PATH,
   2209                                             MSG_USB_CLASS_DP,
   2210                                             (UINT16) sizeof (USB_CLASS_DEVICE_PATH)
   2211                                             );
   2212 
   2213   VIDStr      = GetNextParamStr (&TextDeviceNode);
   2214   PIDStr      = GetNextParamStr (&TextDeviceNode);
   2215   if (UsbClassText->ClassExist) {
   2216     ClassStr = GetNextParamStr (&TextDeviceNode);
   2217     UsbClass->DeviceClass = (UINT8) Strtoi (ClassStr);
   2218   } else {
   2219     UsbClass->DeviceClass = UsbClassText->Class;
   2220   }
   2221   if (UsbClassText->SubClassExist) {
   2222     SubClassStr = GetNextParamStr (&TextDeviceNode);
   2223     UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);
   2224   } else {
   2225     UsbClass->DeviceSubClass = UsbClassText->SubClass;
   2226   }
   2227 
   2228   ProtocolStr = GetNextParamStr (&TextDeviceNode);
   2229 
   2230   UsbClass->VendorId        = (UINT16) Strtoi (VIDStr);
   2231   UsbClass->ProductId       = (UINT16) Strtoi (PIDStr);
   2232   UsbClass->DeviceProtocol  = (UINT8) Strtoi (ProtocolStr);
   2233 
   2234   return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;
   2235 }
   2236 
   2237 
   2238 /**
   2239   Converts a text device path node to USB class device path structure.
   2240 
   2241   @param TextDeviceNode  The input Text device path node.
   2242 
   2243   @return A pointer to the newly-created USB class device path structure.
   2244 
   2245 **/
   2246 EFI_DEVICE_PATH_PROTOCOL *
   2247 DevPathFromTextUsbClass (
   2248   IN CHAR16 *TextDeviceNode
   2249   )
   2250 {
   2251   USB_CLASS_TEXT  UsbClassText;
   2252 
   2253   UsbClassText.ClassExist    = TRUE;
   2254   UsbClassText.SubClassExist = TRUE;
   2255 
   2256   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2257 }
   2258 
   2259 /**
   2260   Converts a text device path node to USB audio device path structure.
   2261 
   2262   @param TextDeviceNode  The input Text device path node.
   2263 
   2264   @return A pointer to the newly-created USB audio device path structure.
   2265 
   2266 **/
   2267 EFI_DEVICE_PATH_PROTOCOL *
   2268 DevPathFromTextUsbAudio (
   2269   IN CHAR16 *TextDeviceNode
   2270   )
   2271 {
   2272   USB_CLASS_TEXT  UsbClassText;
   2273 
   2274   UsbClassText.ClassExist    = FALSE;
   2275   UsbClassText.Class         = USB_CLASS_AUDIO;
   2276   UsbClassText.SubClassExist = TRUE;
   2277 
   2278   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2279 }
   2280 
   2281 /**
   2282   Converts a text device path node to USB CDC Control device path structure.
   2283 
   2284   @param TextDeviceNode  The input Text device path node.
   2285 
   2286   @return A pointer to the newly-created USB CDC Control device path structure.
   2287 
   2288 **/
   2289 EFI_DEVICE_PATH_PROTOCOL *
   2290 DevPathFromTextUsbCDCControl (
   2291   IN CHAR16 *TextDeviceNode
   2292   )
   2293 {
   2294   USB_CLASS_TEXT  UsbClassText;
   2295 
   2296   UsbClassText.ClassExist    = FALSE;
   2297   UsbClassText.Class         = USB_CLASS_CDCCONTROL;
   2298   UsbClassText.SubClassExist = TRUE;
   2299 
   2300   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2301 }
   2302 
   2303 /**
   2304   Converts a text device path node to USB HID device path structure.
   2305 
   2306   @param TextDeviceNode  The input Text device path node.
   2307 
   2308   @return A pointer to the newly-created USB HID device path structure.
   2309 
   2310 **/
   2311 EFI_DEVICE_PATH_PROTOCOL *
   2312 DevPathFromTextUsbHID (
   2313   IN CHAR16 *TextDeviceNode
   2314   )
   2315 {
   2316   USB_CLASS_TEXT  UsbClassText;
   2317 
   2318   UsbClassText.ClassExist    = FALSE;
   2319   UsbClassText.Class         = USB_CLASS_HID;
   2320   UsbClassText.SubClassExist = TRUE;
   2321 
   2322   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2323 }
   2324 
   2325 /**
   2326   Converts a text device path node to USB Image device path structure.
   2327 
   2328   @param TextDeviceNode  The input Text device path node.
   2329 
   2330   @return A pointer to the newly-created USB Image device path structure.
   2331 
   2332 **/
   2333 EFI_DEVICE_PATH_PROTOCOL *
   2334 DevPathFromTextUsbImage (
   2335   IN CHAR16 *TextDeviceNode
   2336   )
   2337 {
   2338   USB_CLASS_TEXT  UsbClassText;
   2339 
   2340   UsbClassText.ClassExist    = FALSE;
   2341   UsbClassText.Class         = USB_CLASS_IMAGE;
   2342   UsbClassText.SubClassExist = TRUE;
   2343 
   2344   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2345 }
   2346 
   2347 /**
   2348   Converts a text device path node to USB Print device path structure.
   2349 
   2350   @param TextDeviceNode  The input Text device path node.
   2351 
   2352   @return A pointer to the newly-created USB Print device path structure.
   2353 
   2354 **/
   2355 EFI_DEVICE_PATH_PROTOCOL *
   2356 DevPathFromTextUsbPrinter (
   2357   IN CHAR16 *TextDeviceNode
   2358   )
   2359 {
   2360   USB_CLASS_TEXT  UsbClassText;
   2361 
   2362   UsbClassText.ClassExist    = FALSE;
   2363   UsbClassText.Class         = USB_CLASS_PRINTER;
   2364   UsbClassText.SubClassExist = TRUE;
   2365 
   2366   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2367 }
   2368 
   2369 /**
   2370   Converts a text device path node to USB mass storage device path structure.
   2371 
   2372   @param TextDeviceNode  The input Text device path node.
   2373 
   2374   @return A pointer to the newly-created USB mass storage device path structure.
   2375 
   2376 **/
   2377 EFI_DEVICE_PATH_PROTOCOL *
   2378 DevPathFromTextUsbMassStorage (
   2379   IN CHAR16 *TextDeviceNode
   2380   )
   2381 {
   2382   USB_CLASS_TEXT  UsbClassText;
   2383 
   2384   UsbClassText.ClassExist    = FALSE;
   2385   UsbClassText.Class         = USB_CLASS_MASS_STORAGE;
   2386   UsbClassText.SubClassExist = TRUE;
   2387 
   2388   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2389 }
   2390 
   2391 /**
   2392   Converts a text device path node to USB HUB device path structure.
   2393 
   2394   @param TextDeviceNode  The input Text device path node.
   2395 
   2396   @return A pointer to the newly-created USB HUB device path structure.
   2397 
   2398 **/
   2399 EFI_DEVICE_PATH_PROTOCOL *
   2400 DevPathFromTextUsbHub (
   2401   IN CHAR16 *TextDeviceNode
   2402   )
   2403 {
   2404   USB_CLASS_TEXT  UsbClassText;
   2405 
   2406   UsbClassText.ClassExist    = FALSE;
   2407   UsbClassText.Class         = USB_CLASS_HUB;
   2408   UsbClassText.SubClassExist = TRUE;
   2409 
   2410   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2411 }
   2412 
   2413 /**
   2414   Converts a text device path node to USB CDC data device path structure.
   2415 
   2416   @param TextDeviceNode  The input Text device path node.
   2417 
   2418   @return A pointer to the newly-created USB CDC data device path structure.
   2419 
   2420 **/
   2421 EFI_DEVICE_PATH_PROTOCOL *
   2422 DevPathFromTextUsbCDCData (
   2423   IN CHAR16 *TextDeviceNode
   2424   )
   2425 {
   2426   USB_CLASS_TEXT  UsbClassText;
   2427 
   2428   UsbClassText.ClassExist    = FALSE;
   2429   UsbClassText.Class         = USB_CLASS_CDCDATA;
   2430   UsbClassText.SubClassExist = TRUE;
   2431 
   2432   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2433 }
   2434 
   2435 /**
   2436   Converts a text device path node to USB smart card device path structure.
   2437 
   2438   @param TextDeviceNode  The input Text device path node.
   2439 
   2440   @return A pointer to the newly-created USB smart card device path structure.
   2441 
   2442 **/
   2443 EFI_DEVICE_PATH_PROTOCOL *
   2444 DevPathFromTextUsbSmartCard (
   2445   IN CHAR16 *TextDeviceNode
   2446   )
   2447 {
   2448   USB_CLASS_TEXT  UsbClassText;
   2449 
   2450   UsbClassText.ClassExist    = FALSE;
   2451   UsbClassText.Class         = USB_CLASS_SMART_CARD;
   2452   UsbClassText.SubClassExist = TRUE;
   2453 
   2454   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2455 }
   2456 
   2457 /**
   2458   Converts a text device path node to USB video device path structure.
   2459 
   2460   @param TextDeviceNode  The input Text device path node.
   2461 
   2462   @return A pointer to the newly-created USB video device path structure.
   2463 
   2464 **/
   2465 EFI_DEVICE_PATH_PROTOCOL *
   2466 DevPathFromTextUsbVideo (
   2467   IN CHAR16 *TextDeviceNode
   2468   )
   2469 {
   2470   USB_CLASS_TEXT  UsbClassText;
   2471 
   2472   UsbClassText.ClassExist    = FALSE;
   2473   UsbClassText.Class         = USB_CLASS_VIDEO;
   2474   UsbClassText.SubClassExist = TRUE;
   2475 
   2476   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2477 }
   2478 
   2479 /**
   2480   Converts a text device path node to USB diagnostic device path structure.
   2481 
   2482   @param TextDeviceNode  The input Text device path node.
   2483 
   2484   @return A pointer to the newly-created USB diagnostic device path structure.
   2485 
   2486 **/
   2487 EFI_DEVICE_PATH_PROTOCOL *
   2488 DevPathFromTextUsbDiagnostic (
   2489   IN CHAR16 *TextDeviceNode
   2490   )
   2491 {
   2492   USB_CLASS_TEXT  UsbClassText;
   2493 
   2494   UsbClassText.ClassExist    = FALSE;
   2495   UsbClassText.Class         = USB_CLASS_DIAGNOSTIC;
   2496   UsbClassText.SubClassExist = TRUE;
   2497 
   2498   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2499 }
   2500 
   2501 /**
   2502   Converts a text device path node to USB wireless device path structure.
   2503 
   2504   @param TextDeviceNode  The input Text device path node.
   2505 
   2506   @return A pointer to the newly-created USB wireless device path structure.
   2507 
   2508 **/
   2509 EFI_DEVICE_PATH_PROTOCOL *
   2510 DevPathFromTextUsbWireless (
   2511   IN CHAR16 *TextDeviceNode
   2512   )
   2513 {
   2514   USB_CLASS_TEXT  UsbClassText;
   2515 
   2516   UsbClassText.ClassExist    = FALSE;
   2517   UsbClassText.Class         = USB_CLASS_WIRELESS;
   2518   UsbClassText.SubClassExist = TRUE;
   2519 
   2520   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2521 }
   2522 
   2523 /**
   2524   Converts a text device path node to USB device firmware update device path structure.
   2525 
   2526   @param TextDeviceNode  The input Text device path node.
   2527 
   2528   @return A pointer to the newly-created USB device firmware update device path structure.
   2529 
   2530 **/
   2531 EFI_DEVICE_PATH_PROTOCOL *
   2532 DevPathFromTextUsbDeviceFirmwareUpdate (
   2533   IN CHAR16 *TextDeviceNode
   2534   )
   2535 {
   2536   USB_CLASS_TEXT  UsbClassText;
   2537 
   2538   UsbClassText.ClassExist    = FALSE;
   2539   UsbClassText.Class         = USB_CLASS_RESERVE;
   2540   UsbClassText.SubClassExist = FALSE;
   2541   UsbClassText.SubClass      = USB_SUBCLASS_FW_UPDATE;
   2542 
   2543   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2544 }
   2545 
   2546 /**
   2547   Converts a text device path node to USB IRDA bridge device path structure.
   2548 
   2549   @param TextDeviceNode  The input Text device path node.
   2550 
   2551   @return A pointer to the newly-created USB IRDA bridge device path structure.
   2552 
   2553 **/
   2554 EFI_DEVICE_PATH_PROTOCOL *
   2555 DevPathFromTextUsbIrdaBridge (
   2556   IN CHAR16 *TextDeviceNode
   2557   )
   2558 {
   2559   USB_CLASS_TEXT  UsbClassText;
   2560 
   2561   UsbClassText.ClassExist    = FALSE;
   2562   UsbClassText.Class         = USB_CLASS_RESERVE;
   2563   UsbClassText.SubClassExist = FALSE;
   2564   UsbClassText.SubClass      = USB_SUBCLASS_IRDA_BRIDGE;
   2565 
   2566   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2567 }
   2568 
   2569 /**
   2570   Converts a text device path node to USB text and measurement device path structure.
   2571 
   2572   @param TextDeviceNode  The input Text device path node.
   2573 
   2574   @return A pointer to the newly-created USB text and measurement device path structure.
   2575 
   2576 **/
   2577 EFI_DEVICE_PATH_PROTOCOL *
   2578 DevPathFromTextUsbTestAndMeasurement (
   2579   IN CHAR16 *TextDeviceNode
   2580   )
   2581 {
   2582   USB_CLASS_TEXT  UsbClassText;
   2583 
   2584   UsbClassText.ClassExist    = FALSE;
   2585   UsbClassText.Class         = USB_CLASS_RESERVE;
   2586   UsbClassText.SubClassExist = FALSE;
   2587   UsbClassText.SubClass      = USB_SUBCLASS_TEST;
   2588 
   2589   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
   2590 }
   2591 
   2592 /**
   2593   Converts a text device path node to USB WWID device path structure.
   2594 
   2595   @param TextDeviceNode  The input Text device path node.
   2596 
   2597   @return A pointer to the newly-created USB WWID device path structure.
   2598 
   2599 **/
   2600 EFI_DEVICE_PATH_PROTOCOL *
   2601 DevPathFromTextUsbWwid (
   2602   IN CHAR16 *TextDeviceNode
   2603   )
   2604 {
   2605   CHAR16                *VIDStr;
   2606   CHAR16                *PIDStr;
   2607   CHAR16                *InterfaceNumStr;
   2608   CHAR16                *SerialNumberStr;
   2609   USB_WWID_DEVICE_PATH  *UsbWwid;
   2610   UINTN                 SerialNumberStrLen;
   2611 
   2612   VIDStr                   = GetNextParamStr (&TextDeviceNode);
   2613   PIDStr                   = GetNextParamStr (&TextDeviceNode);
   2614   InterfaceNumStr          = GetNextParamStr (&TextDeviceNode);
   2615   SerialNumberStr          = GetNextParamStr (&TextDeviceNode);
   2616   SerialNumberStrLen       = StrLen (SerialNumberStr);
   2617   if (SerialNumberStrLen >= 2 &&
   2618       SerialNumberStr[0] == L'\"' &&
   2619       SerialNumberStr[SerialNumberStrLen - 1] == L'\"'
   2620     ) {
   2621     SerialNumberStr[SerialNumberStrLen - 1] = L'\0';
   2622     SerialNumberStr++;
   2623     SerialNumberStrLen -= 2;
   2624   }
   2625   UsbWwid                  = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (
   2626                                                          MESSAGING_DEVICE_PATH,
   2627                                                          MSG_USB_WWID_DP,
   2628                                                          (UINT16) (sizeof (USB_WWID_DEVICE_PATH) + SerialNumberStrLen * sizeof (CHAR16))
   2629                                                          );
   2630   UsbWwid->VendorId        = (UINT16) Strtoi (VIDStr);
   2631   UsbWwid->ProductId       = (UINT16) Strtoi (PIDStr);
   2632   UsbWwid->InterfaceNumber = (UINT16) Strtoi (InterfaceNumStr);
   2633 
   2634   //
   2635   // There is no memory allocated in UsbWwid for the '\0' in SerialNumberStr.
   2636   // Therefore, the '\0' will not be copied.
   2637   //
   2638   CopyMem (
   2639     (UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH),
   2640     SerialNumberStr,
   2641     SerialNumberStrLen * sizeof (CHAR16)
   2642     );
   2643 
   2644   return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;
   2645 }
   2646 
   2647 /**
   2648   Converts a text device path node to Logic Unit device path structure.
   2649 
   2650   @param TextDeviceNode  The input Text device path node.
   2651 
   2652   @return A pointer to the newly-created Logic Unit device path structure.
   2653 
   2654 **/
   2655 EFI_DEVICE_PATH_PROTOCOL *
   2656 DevPathFromTextUnit (
   2657   IN CHAR16 *TextDeviceNode
   2658   )
   2659 {
   2660   CHAR16                          *LunStr;
   2661   DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;
   2662 
   2663   LunStr      = GetNextParamStr (&TextDeviceNode);
   2664   LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) CreateDeviceNode (
   2665                                                       MESSAGING_DEVICE_PATH,
   2666                                                       MSG_DEVICE_LOGICAL_UNIT_DP,
   2667                                                       (UINT16) sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)
   2668                                                       );
   2669 
   2670   LogicalUnit->Lun  = (UINT8) Strtoi (LunStr);
   2671 
   2672   return (EFI_DEVICE_PATH_PROTOCOL *) LogicalUnit;
   2673 }
   2674 
   2675 /**
   2676   Converts a text device path node to iSCSI device path structure.
   2677 
   2678   @param TextDeviceNode  The input Text device path node.
   2679 
   2680   @return A pointer to the newly-created iSCSI device path structure.
   2681 
   2682 **/
   2683 EFI_DEVICE_PATH_PROTOCOL *
   2684 DevPathFromTextiSCSI (
   2685   IN CHAR16 *TextDeviceNode
   2686   )
   2687 {
   2688   UINT16                      Options;
   2689   CHAR16                      *NameStr;
   2690   CHAR16                      *PortalGroupStr;
   2691   CHAR16                      *LunStr;
   2692   CHAR16                      *HeaderDigestStr;
   2693   CHAR16                      *DataDigestStr;
   2694   CHAR16                      *AuthenticationStr;
   2695   CHAR16                      *ProtocolStr;
   2696   CHAR8                       *AsciiStr;
   2697   ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;
   2698 
   2699   NameStr           = GetNextParamStr (&TextDeviceNode);
   2700   PortalGroupStr    = GetNextParamStr (&TextDeviceNode);
   2701   LunStr            = GetNextParamStr (&TextDeviceNode);
   2702   HeaderDigestStr   = GetNextParamStr (&TextDeviceNode);
   2703   DataDigestStr     = GetNextParamStr (&TextDeviceNode);
   2704   AuthenticationStr = GetNextParamStr (&TextDeviceNode);
   2705   ProtocolStr       = GetNextParamStr (&TextDeviceNode);
   2706   ISCSIDevPath      = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (
   2707                                                         MESSAGING_DEVICE_PATH,
   2708                                                         MSG_ISCSI_DP,
   2709                                                         (UINT16) (sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + StrLen (NameStr))
   2710                                                         );
   2711 
   2712   AsciiStr = ISCSIDevPath->TargetName;
   2713   StrToAscii (NameStr, &AsciiStr);
   2714 
   2715   ISCSIDevPath->TargetPortalGroupTag = (UINT16) Strtoi (PortalGroupStr);
   2716   Strtoi64 (LunStr, &ISCSIDevPath->Lun);
   2717 
   2718   Options = 0x0000;
   2719   if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {
   2720     Options |= 0x0002;
   2721   }
   2722 
   2723   if (StrCmp (DataDigestStr, L"CRC32C") == 0) {
   2724     Options |= 0x0008;
   2725   }
   2726 
   2727   if (StrCmp (AuthenticationStr, L"None") == 0) {
   2728     Options |= 0x0800;
   2729   }
   2730 
   2731   if (StrCmp (AuthenticationStr, L"CHAP_UNI") == 0) {
   2732     Options |= 0x1000;
   2733   }
   2734 
   2735   ISCSIDevPath->LoginOption      = (UINT16) Options;
   2736 
   2737   ISCSIDevPath->NetworkProtocol  = (UINT16) StrCmp (ProtocolStr, L"TCP");
   2738 
   2739   return (EFI_DEVICE_PATH_PROTOCOL *) ISCSIDevPath;
   2740 }
   2741 
   2742 /**
   2743   Converts a text device path node to VLAN device path structure.
   2744 
   2745   @param TextDeviceNode  The input Text device path node.
   2746 
   2747   @return A pointer to the newly-created VLAN device path structure.
   2748 
   2749 **/
   2750 EFI_DEVICE_PATH_PROTOCOL *
   2751 DevPathFromTextVlan (
   2752   IN CHAR16 *TextDeviceNode
   2753   )
   2754 {
   2755   CHAR16            *VlanStr;
   2756   VLAN_DEVICE_PATH  *Vlan;
   2757 
   2758   VlanStr = GetNextParamStr (&TextDeviceNode);
   2759   Vlan    = (VLAN_DEVICE_PATH *) CreateDeviceNode (
   2760                                    MESSAGING_DEVICE_PATH,
   2761                                    MSG_VLAN_DP,
   2762                                    (UINT16) sizeof (VLAN_DEVICE_PATH)
   2763                                    );
   2764 
   2765   Vlan->VlanId = (UINT16) Strtoi (VlanStr);
   2766 
   2767   return (EFI_DEVICE_PATH_PROTOCOL *) Vlan;
   2768 }
   2769 
   2770 /**
   2771   Converts a text device path node to Bluetooth device path structure.
   2772 
   2773   @param TextDeviceNode  The input Text device path node.
   2774 
   2775   @return A pointer to the newly-created Bluetooth device path structure.
   2776 
   2777 **/
   2778 EFI_DEVICE_PATH_PROTOCOL *
   2779 DevPathFromTextBluetooth (
   2780   IN CHAR16 *TextDeviceNode
   2781   )
   2782 {
   2783   CHAR16                  *BluetoothStr;
   2784   CHAR16                  *Walker;
   2785   CHAR16                  *TempNumBuffer;
   2786   UINTN                   TempBufferSize;
   2787   INT32                   Index;
   2788   BLUETOOTH_DEVICE_PATH   *BluetoothDp;
   2789 
   2790   BluetoothStr = GetNextParamStr (&TextDeviceNode);
   2791   BluetoothDp = (BLUETOOTH_DEVICE_PATH *) CreateDeviceNode (
   2792                                    MESSAGING_DEVICE_PATH,
   2793                                    MSG_BLUETOOTH_DP,
   2794                                    (UINT16) sizeof (BLUETOOTH_DEVICE_PATH)
   2795                                    );
   2796 
   2797   Index = sizeof (BLUETOOTH_ADDRESS) - 1;
   2798   Walker = BluetoothStr;
   2799   while (!IS_NULL(*Walker) && Index >= 0) {
   2800     TempBufferSize = 2 * sizeof(CHAR16) + StrSize(L"0x");
   2801     TempNumBuffer = AllocateZeroPool (TempBufferSize);
   2802     if (TempNumBuffer == NULL) {
   2803       break;
   2804     }
   2805     StrCpyS (TempNumBuffer, TempBufferSize / sizeof (CHAR16), L"0x");
   2806     StrnCatS (TempNumBuffer, TempBufferSize / sizeof (CHAR16), Walker, 2);
   2807     BluetoothDp->BD_ADDR.Address[Index] = (UINT8)Strtoi (TempNumBuffer);
   2808     FreePool (TempNumBuffer);
   2809     Walker += 2;
   2810     Index--;
   2811   }
   2812 
   2813   return (EFI_DEVICE_PATH_PROTOCOL *) BluetoothDp;
   2814 }
   2815 
   2816 /**
   2817   Converts a text device path node to Wi-Fi device path structure.
   2818 
   2819   @param TextDeviceNode  The input Text device path node.
   2820 
   2821   @return A pointer to the newly-created Wi-Fi device path structure.
   2822 
   2823 **/
   2824 EFI_DEVICE_PATH_PROTOCOL *
   2825 DevPathFromTextWiFi (
   2826   IN CHAR16 *TextDeviceNode
   2827   )
   2828 {
   2829   CHAR16                *SSIdStr;
   2830   CHAR8                 AsciiStr[33];
   2831   UINTN                 DataLen;
   2832   WIFI_DEVICE_PATH      *WiFiDp;
   2833 
   2834   SSIdStr = GetNextParamStr (&TextDeviceNode);
   2835   WiFiDp  = (WIFI_DEVICE_PATH *) CreateDeviceNode (
   2836                                    MESSAGING_DEVICE_PATH,
   2837                                    MSG_WIFI_DP,
   2838                                    (UINT16) sizeof (WIFI_DEVICE_PATH)
   2839                                    );
   2840 
   2841   if (NULL != SSIdStr) {
   2842     DataLen = StrLen (SSIdStr);
   2843     if (StrLen (SSIdStr) > 32) {
   2844       SSIdStr[32] = L'\0';
   2845       DataLen     = 32;
   2846     }
   2847 
   2848     UnicodeStrToAsciiStr (SSIdStr, AsciiStr);
   2849     CopyMem (WiFiDp->SSId, AsciiStr, DataLen);
   2850   }
   2851 
   2852   return (EFI_DEVICE_PATH_PROTOCOL *) WiFiDp;
   2853 }
   2854 
   2855 /**
   2856   Converts a text device path node to URI device path structure.
   2857 
   2858   @param TextDeviceNode  The input Text device path node.
   2859 
   2860   @return A pointer to the newly-created URI device path structure.
   2861 
   2862 **/
   2863 EFI_DEVICE_PATH_PROTOCOL *
   2864 DevPathFromTextUri (
   2865   IN CHAR16 *TextDeviceNode
   2866   )
   2867 {
   2868   CHAR16           *UriStr;
   2869   UINTN            UriLength;
   2870   URI_DEVICE_PATH  *Uri;
   2871 
   2872   UriStr = GetNextParamStr (&TextDeviceNode);
   2873   UriLength = StrnLenS (UriStr, MAX_UINT16 - sizeof (URI_DEVICE_PATH));
   2874   Uri    = (URI_DEVICE_PATH *) CreateDeviceNode (
   2875                                  MESSAGING_DEVICE_PATH,
   2876                                  MSG_URI_DP,
   2877                                  (UINT16) (sizeof (URI_DEVICE_PATH) + UriLength)
   2878                                  );
   2879 
   2880   while (UriLength-- != 0) {
   2881     Uri->Uri[UriLength] = (CHAR8) UriStr[UriLength];
   2882   }
   2883 
   2884   return (EFI_DEVICE_PATH_PROTOCOL *) Uri;
   2885 }
   2886 
   2887 /**
   2888   Converts a media text device path node to media device path structure.
   2889 
   2890   @param TextDeviceNode  The input Text device path node.
   2891 
   2892   @return A pointer to media device path structure.
   2893 
   2894 **/
   2895 EFI_DEVICE_PATH_PROTOCOL *
   2896 DevPathFromTextMediaPath (
   2897   IN CHAR16 *TextDeviceNode
   2898   )
   2899 {
   2900   return DevPathFromTextGenericPath (MEDIA_DEVICE_PATH, TextDeviceNode);
   2901 }
   2902 
   2903 /**
   2904   Converts a text device path node to HD device path structure.
   2905 
   2906   @param TextDeviceNode  The input Text device path node.
   2907 
   2908   @return A pointer to the newly-created HD device path structure.
   2909 
   2910 **/
   2911 EFI_DEVICE_PATH_PROTOCOL *
   2912 DevPathFromTextHD (
   2913   IN CHAR16 *TextDeviceNode
   2914   )
   2915 {
   2916   CHAR16                *PartitionStr;
   2917   CHAR16                *TypeStr;
   2918   CHAR16                *SignatureStr;
   2919   CHAR16                *StartStr;
   2920   CHAR16                *SizeStr;
   2921   UINT32                Signature32;
   2922   EFI_GUID              SignatureGuid;
   2923   HARDDRIVE_DEVICE_PATH *Hd;
   2924 
   2925   PartitionStr        = GetNextParamStr (&TextDeviceNode);
   2926   TypeStr             = GetNextParamStr (&TextDeviceNode);
   2927   SignatureStr        = GetNextParamStr (&TextDeviceNode);
   2928   StartStr            = GetNextParamStr (&TextDeviceNode);
   2929   SizeStr             = GetNextParamStr (&TextDeviceNode);
   2930   Hd                  = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (
   2931                                                     MEDIA_DEVICE_PATH,
   2932                                                     MEDIA_HARDDRIVE_DP,
   2933                                                     (UINT16) sizeof (HARDDRIVE_DEVICE_PATH)
   2934                                                     );
   2935 
   2936   Hd->PartitionNumber = (UINT32) Strtoi (PartitionStr);
   2937 
   2938   ZeroMem (Hd->Signature, 16);
   2939   Hd->MBRType = (UINT8) 0;
   2940 
   2941   if (StrCmp (TypeStr, L"MBR") == 0) {
   2942     Hd->SignatureType = SIGNATURE_TYPE_MBR;
   2943     Hd->MBRType       = 0x01;
   2944 
   2945     Signature32       = (UINT32) Strtoi (SignatureStr);
   2946     CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));
   2947   } else if (StrCmp (TypeStr, L"GPT") == 0) {
   2948     Hd->SignatureType = SIGNATURE_TYPE_GUID;
   2949     Hd->MBRType       = 0x02;
   2950 
   2951     StrToGuid (SignatureStr, &SignatureGuid);
   2952     CopyMem (Hd->Signature, &SignatureGuid, sizeof (EFI_GUID));
   2953   } else {
   2954     Hd->SignatureType = (UINT8) Strtoi (TypeStr);
   2955   }
   2956 
   2957   Strtoi64 (StartStr, &Hd->PartitionStart);
   2958   Strtoi64 (SizeStr, &Hd->PartitionSize);
   2959 
   2960   return (EFI_DEVICE_PATH_PROTOCOL *) Hd;
   2961 }
   2962 
   2963 /**
   2964   Converts a text device path node to CDROM device path structure.
   2965 
   2966   @param TextDeviceNode  The input Text device path node.
   2967 
   2968   @return A pointer to the newly-created CDROM device path structure.
   2969 
   2970 **/
   2971 EFI_DEVICE_PATH_PROTOCOL *
   2972 DevPathFromTextCDROM (
   2973   IN CHAR16 *TextDeviceNode
   2974   )
   2975 {
   2976   CHAR16            *EntryStr;
   2977   CHAR16            *StartStr;
   2978   CHAR16            *SizeStr;
   2979   CDROM_DEVICE_PATH *CDROMDevPath;
   2980 
   2981   EntryStr              = GetNextParamStr (&TextDeviceNode);
   2982   StartStr              = GetNextParamStr (&TextDeviceNode);
   2983   SizeStr               = GetNextParamStr (&TextDeviceNode);
   2984   CDROMDevPath          = (CDROM_DEVICE_PATH *) CreateDeviceNode (
   2985                                                   MEDIA_DEVICE_PATH,
   2986                                                   MEDIA_CDROM_DP,
   2987                                                   (UINT16) sizeof (CDROM_DEVICE_PATH)
   2988                                                   );
   2989 
   2990   CDROMDevPath->BootEntry = (UINT32) Strtoi (EntryStr);
   2991   Strtoi64 (StartStr, &CDROMDevPath->PartitionStart);
   2992   Strtoi64 (SizeStr, &CDROMDevPath->PartitionSize);
   2993 
   2994   return (EFI_DEVICE_PATH_PROTOCOL *) CDROMDevPath;
   2995 }
   2996 
   2997 /**
   2998   Converts a text device path node to Vendor-defined media device path structure.
   2999 
   3000   @param TextDeviceNode  The input Text device path node.
   3001 
   3002   @return A pointer to the newly-created Vendor-defined media device path structure.
   3003 
   3004 **/
   3005 EFI_DEVICE_PATH_PROTOCOL *
   3006 DevPathFromTextVenMedia (
   3007   IN CHAR16 *TextDeviceNode
   3008   )
   3009 {
   3010   return ConvertFromTextVendor (
   3011            TextDeviceNode,
   3012            MEDIA_DEVICE_PATH,
   3013            MEDIA_VENDOR_DP
   3014            );
   3015 }
   3016 
   3017 /**
   3018   Converts a text device path node to File device path structure.
   3019 
   3020   @param TextDeviceNode  The input Text device path node.
   3021 
   3022   @return A pointer to the newly-created File device path structure.
   3023 
   3024 **/
   3025 EFI_DEVICE_PATH_PROTOCOL *
   3026 DevPathFromTextFilePath (
   3027   IN CHAR16 *TextDeviceNode
   3028   )
   3029 {
   3030   FILEPATH_DEVICE_PATH  *File;
   3031 
   3032   File = (FILEPATH_DEVICE_PATH *) CreateDeviceNode (
   3033                                     MEDIA_DEVICE_PATH,
   3034                                     MEDIA_FILEPATH_DP,
   3035                                     (UINT16) (sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2)
   3036                                     );
   3037 
   3038   StrCpyS (File->PathName, StrLen (TextDeviceNode) + 1, TextDeviceNode);
   3039 
   3040   return (EFI_DEVICE_PATH_PROTOCOL *) File;
   3041 }
   3042 
   3043 /**
   3044   Converts a text device path node to Media protocol device path structure.
   3045 
   3046   @param TextDeviceNode  The input Text device path node.
   3047 
   3048   @return A pointer to the newly-created Media protocol device path structure.
   3049 
   3050 **/
   3051 EFI_DEVICE_PATH_PROTOCOL *
   3052 DevPathFromTextMedia (
   3053   IN CHAR16 *TextDeviceNode
   3054   )
   3055 {
   3056   CHAR16                      *GuidStr;
   3057   MEDIA_PROTOCOL_DEVICE_PATH  *Media;
   3058 
   3059   GuidStr = GetNextParamStr (&TextDeviceNode);
   3060   Media   = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (
   3061                                              MEDIA_DEVICE_PATH,
   3062                                              MEDIA_PROTOCOL_DP,
   3063                                              (UINT16) sizeof (MEDIA_PROTOCOL_DEVICE_PATH)
   3064                                              );
   3065 
   3066   StrToGuid (GuidStr, &Media->Protocol);
   3067 
   3068   return (EFI_DEVICE_PATH_PROTOCOL *) Media;
   3069 }
   3070 
   3071 /**
   3072   Converts a text device path node to firmware volume device path structure.
   3073 
   3074   @param TextDeviceNode  The input Text device path node.
   3075 
   3076   @return A pointer to the newly-created firmware volume device path structure.
   3077 
   3078 **/
   3079 EFI_DEVICE_PATH_PROTOCOL *
   3080 DevPathFromTextFv (
   3081   IN CHAR16 *TextDeviceNode
   3082   )
   3083 {
   3084   CHAR16                    *GuidStr;
   3085   MEDIA_FW_VOL_DEVICE_PATH  *Fv;
   3086 
   3087   GuidStr = GetNextParamStr (&TextDeviceNode);
   3088   Fv      = (MEDIA_FW_VOL_DEVICE_PATH *) CreateDeviceNode (
   3089                                            MEDIA_DEVICE_PATH,
   3090                                            MEDIA_PIWG_FW_VOL_DP,
   3091                                            (UINT16) sizeof (MEDIA_FW_VOL_DEVICE_PATH)
   3092                                            );
   3093 
   3094   StrToGuid (GuidStr, &Fv->FvName);
   3095 
   3096   return (EFI_DEVICE_PATH_PROTOCOL *) Fv;
   3097 }
   3098 
   3099 /**
   3100   Converts a text device path node to firmware file device path structure.
   3101 
   3102   @param TextDeviceNode  The input Text device path node.
   3103 
   3104   @return A pointer to the newly-created firmware file device path structure.
   3105 
   3106 **/
   3107 EFI_DEVICE_PATH_PROTOCOL *
   3108 DevPathFromTextFvFile (
   3109   IN CHAR16 *TextDeviceNode
   3110   )
   3111 {
   3112   CHAR16                             *GuidStr;
   3113   MEDIA_FW_VOL_FILEPATH_DEVICE_PATH  *FvFile;
   3114 
   3115   GuidStr = GetNextParamStr (&TextDeviceNode);
   3116   FvFile  = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) CreateDeviceNode (
   3117                                                     MEDIA_DEVICE_PATH,
   3118                                                     MEDIA_PIWG_FW_FILE_DP,
   3119                                                     (UINT16) sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)
   3120                                                     );
   3121 
   3122   StrToGuid (GuidStr, &FvFile->FvFileName);
   3123 
   3124   return (EFI_DEVICE_PATH_PROTOCOL *) FvFile;
   3125 }
   3126 
   3127 /**
   3128   Converts a text device path node to text relative offset device path structure.
   3129 
   3130   @param TextDeviceNode  The input Text device path node.
   3131 
   3132   @return A pointer to the newly-created Text device path structure.
   3133 
   3134 **/
   3135 EFI_DEVICE_PATH_PROTOCOL *
   3136 DevPathFromTextRelativeOffsetRange (
   3137   IN CHAR16 *TextDeviceNode
   3138   )
   3139 {
   3140   CHAR16                                  *StartingOffsetStr;
   3141   CHAR16                                  *EndingOffsetStr;
   3142   MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;
   3143 
   3144   StartingOffsetStr = GetNextParamStr (&TextDeviceNode);
   3145   EndingOffsetStr   = GetNextParamStr (&TextDeviceNode);
   3146   Offset            = (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *) CreateDeviceNode (
   3147                                                                     MEDIA_DEVICE_PATH,
   3148                                                                     MEDIA_RELATIVE_OFFSET_RANGE_DP,
   3149                                                                     (UINT16) sizeof (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH)
   3150                                                                     );
   3151 
   3152   Strtoi64 (StartingOffsetStr, &Offset->StartingOffset);
   3153   Strtoi64 (EndingOffsetStr, &Offset->EndingOffset);
   3154 
   3155   return (EFI_DEVICE_PATH_PROTOCOL *) Offset;
   3156 }
   3157 
   3158 /**
   3159   Converts a text device path node to text ram disk device path structure.
   3160 
   3161   @param TextDeviceNode  The input Text device path node.
   3162 
   3163   @return A pointer to the newly-created Text device path structure.
   3164 
   3165 **/
   3166 EFI_DEVICE_PATH_PROTOCOL *
   3167 DevPathFromTextRamDisk (
   3168   IN CHAR16 *TextDeviceNode
   3169   )
   3170 {
   3171   CHAR16                                  *StartingAddrStr;
   3172   CHAR16                                  *EndingAddrStr;
   3173   CHAR16                                  *TypeGuidStr;
   3174   CHAR16                                  *InstanceStr;
   3175   MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;
   3176   UINT64                                  StartingAddr;
   3177   UINT64                                  EndingAddr;
   3178 
   3179   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
   3180   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
   3181   InstanceStr     = GetNextParamStr (&TextDeviceNode);
   3182   TypeGuidStr     = GetNextParamStr (&TextDeviceNode);
   3183   RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (
   3184                                                      MEDIA_DEVICE_PATH,
   3185                                                      MEDIA_RAM_DISK_DP,
   3186                                                      (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
   3187                                                      );
   3188 
   3189   Strtoi64 (StartingAddrStr, &StartingAddr);
   3190   WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);
   3191   Strtoi64 (EndingAddrStr, &EndingAddr);
   3192   WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);
   3193   RamDisk->Instance = (UINT16) Strtoi (InstanceStr);
   3194   StrToGuid (TypeGuidStr, &RamDisk->TypeGuid);
   3195 
   3196   return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;
   3197 }
   3198 
   3199 /**
   3200   Converts a text device path node to text virtual disk device path structure.
   3201 
   3202   @param TextDeviceNode  The input Text device path node.
   3203 
   3204   @return A pointer to the newly-created Text device path structure.
   3205 
   3206 **/
   3207 EFI_DEVICE_PATH_PROTOCOL *
   3208 DevPathFromTextVirtualDisk (
   3209   IN CHAR16 *TextDeviceNode
   3210   )
   3211 {
   3212   CHAR16                                  *StartingAddrStr;
   3213   CHAR16                                  *EndingAddrStr;
   3214   CHAR16                                  *InstanceStr;
   3215   MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;
   3216   UINT64                                  StartingAddr;
   3217   UINT64                                  EndingAddr;
   3218 
   3219   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
   3220   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
   3221   InstanceStr     = GetNextParamStr (&TextDeviceNode);
   3222 
   3223   RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (
   3224                                                      MEDIA_DEVICE_PATH,
   3225                                                      MEDIA_RAM_DISK_DP,
   3226                                                      (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
   3227                                                      );
   3228 
   3229   Strtoi64 (StartingAddrStr, &StartingAddr);
   3230   WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);
   3231   Strtoi64 (EndingAddrStr, &EndingAddr);
   3232   WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);
   3233   RamDisk->Instance = (UINT16) Strtoi (InstanceStr);
   3234   CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualDiskGuid);
   3235 
   3236   return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;
   3237 }
   3238 
   3239 /**
   3240   Converts a text device path node to text virtual cd device path structure.
   3241 
   3242   @param TextDeviceNode  The input Text device path node.
   3243 
   3244   @return A pointer to the newly-created Text device path structure.
   3245 
   3246 **/
   3247 EFI_DEVICE_PATH_PROTOCOL *
   3248 DevPathFromTextVirtualCd (
   3249   IN CHAR16 *TextDeviceNode
   3250   )
   3251 {
   3252   CHAR16                                  *StartingAddrStr;
   3253   CHAR16                                  *EndingAddrStr;
   3254   CHAR16                                  *InstanceStr;
   3255   MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;
   3256   UINT64                                  StartingAddr;
   3257   UINT64                                  EndingAddr;
   3258 
   3259   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
   3260   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
   3261   InstanceStr     = GetNextParamStr (&TextDeviceNode);
   3262 
   3263   RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (
   3264                                                      MEDIA_DEVICE_PATH,
   3265                                                      MEDIA_RAM_DISK_DP,
   3266                                                      (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
   3267                                                      );
   3268 
   3269   Strtoi64 (StartingAddrStr, &StartingAddr);
   3270   WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);
   3271   Strtoi64 (EndingAddrStr, &EndingAddr);
   3272   WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);
   3273   RamDisk->Instance = (UINT16) Strtoi (InstanceStr);
   3274   CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualCdGuid);
   3275 
   3276   return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;
   3277 }
   3278 
   3279 /**
   3280   Converts a text device path node to text persistent virtual disk device path structure.
   3281 
   3282   @param TextDeviceNode  The input Text device path node.
   3283 
   3284   @return A pointer to the newly-created Text device path structure.
   3285 
   3286 **/
   3287 EFI_DEVICE_PATH_PROTOCOL *
   3288 DevPathFromTextPersistentVirtualDisk (
   3289   IN CHAR16 *TextDeviceNode
   3290   )
   3291 {
   3292   CHAR16                                  *StartingAddrStr;
   3293   CHAR16                                  *EndingAddrStr;
   3294   CHAR16                                  *InstanceStr;
   3295   MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;
   3296   UINT64                                  StartingAddr;
   3297   UINT64                                  EndingAddr;
   3298 
   3299   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
   3300   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
   3301   InstanceStr     = GetNextParamStr (&TextDeviceNode);
   3302 
   3303   RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (
   3304                                                      MEDIA_DEVICE_PATH,
   3305                                                      MEDIA_RAM_DISK_DP,
   3306                                                      (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
   3307                                                      );
   3308 
   3309   Strtoi64 (StartingAddrStr, &StartingAddr);
   3310   WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);
   3311   Strtoi64 (EndingAddrStr, &EndingAddr);
   3312   WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);
   3313   RamDisk->Instance = (UINT16) Strtoi (InstanceStr);
   3314   CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualDiskGuid);
   3315 
   3316   return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;
   3317 }
   3318 
   3319 /**
   3320   Converts a text device path node to text persistent virtual cd device path structure.
   3321 
   3322   @param TextDeviceNode  The input Text device path node.
   3323 
   3324   @return A pointer to the newly-created Text device path structure.
   3325 
   3326 **/
   3327 EFI_DEVICE_PATH_PROTOCOL *
   3328 DevPathFromTextPersistentVirtualCd (
   3329   IN CHAR16 *TextDeviceNode
   3330   )
   3331 {
   3332   CHAR16                                  *StartingAddrStr;
   3333   CHAR16                                  *EndingAddrStr;
   3334   CHAR16                                  *InstanceStr;
   3335   MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;
   3336   UINT64                                  StartingAddr;
   3337   UINT64                                  EndingAddr;
   3338 
   3339   StartingAddrStr = GetNextParamStr (&TextDeviceNode);
   3340   EndingAddrStr   = GetNextParamStr (&TextDeviceNode);
   3341   InstanceStr     = GetNextParamStr (&TextDeviceNode);
   3342 
   3343   RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (
   3344                                                      MEDIA_DEVICE_PATH,
   3345                                                      MEDIA_RAM_DISK_DP,
   3346                                                      (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)
   3347                                                      );
   3348 
   3349   Strtoi64 (StartingAddrStr, &StartingAddr);
   3350   WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);
   3351   Strtoi64 (EndingAddrStr, &EndingAddr);
   3352   WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);
   3353   RamDisk->Instance = (UINT16) Strtoi (InstanceStr);
   3354   CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualCdGuid);
   3355 
   3356   return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;
   3357 }
   3358 
   3359 /**
   3360   Converts a BBS text device path node to BBS device path structure.
   3361 
   3362   @param TextDeviceNode  The input Text device path node.
   3363 
   3364   @return A pointer to BBS device path structure.
   3365 
   3366 **/
   3367 EFI_DEVICE_PATH_PROTOCOL *
   3368 DevPathFromTextBbsPath (
   3369   IN CHAR16 *TextDeviceNode
   3370   )
   3371 {
   3372   return DevPathFromTextGenericPath (BBS_DEVICE_PATH, TextDeviceNode);
   3373 }
   3374 
   3375 /**
   3376   Converts a text device path node to BIOS Boot Specification device path structure.
   3377 
   3378   @param TextDeviceNode  The input Text device path node.
   3379 
   3380   @return A pointer to the newly-created BIOS Boot Specification device path structure.
   3381 
   3382 **/
   3383 EFI_DEVICE_PATH_PROTOCOL *
   3384 DevPathFromTextBBS (
   3385   IN CHAR16 *TextDeviceNode
   3386   )
   3387 {
   3388   CHAR16              *TypeStr;
   3389   CHAR16              *IdStr;
   3390   CHAR16              *FlagsStr;
   3391   CHAR8               *AsciiStr;
   3392   BBS_BBS_DEVICE_PATH *Bbs;
   3393 
   3394   TypeStr   = GetNextParamStr (&TextDeviceNode);
   3395   IdStr     = GetNextParamStr (&TextDeviceNode);
   3396   FlagsStr  = GetNextParamStr (&TextDeviceNode);
   3397   Bbs       = (BBS_BBS_DEVICE_PATH *) CreateDeviceNode (
   3398                                         BBS_DEVICE_PATH,
   3399                                         BBS_BBS_DP,
   3400                                         (UINT16) (sizeof (BBS_BBS_DEVICE_PATH) + StrLen (IdStr))
   3401                                         );
   3402 
   3403   if (StrCmp (TypeStr, L"Floppy") == 0) {
   3404     Bbs->DeviceType = BBS_TYPE_FLOPPY;
   3405   } else if (StrCmp (TypeStr, L"HD") == 0) {
   3406     Bbs->DeviceType = BBS_TYPE_HARDDRIVE;
   3407   } else if (StrCmp (TypeStr, L"CDROM") == 0) {
   3408     Bbs->DeviceType = BBS_TYPE_CDROM;
   3409   } else if (StrCmp (TypeStr, L"PCMCIA") == 0) {
   3410     Bbs->DeviceType = BBS_TYPE_PCMCIA;
   3411   } else if (StrCmp (TypeStr, L"USB") == 0) {
   3412     Bbs->DeviceType = BBS_TYPE_USB;
   3413   } else if (StrCmp (TypeStr, L"Network") == 0) {
   3414     Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;
   3415   } else {
   3416     Bbs->DeviceType = (UINT16) Strtoi (TypeStr);
   3417   }
   3418 
   3419   AsciiStr = Bbs->String;
   3420   StrToAscii (IdStr, &AsciiStr);
   3421 
   3422   Bbs->StatusFlag = (UINT16) Strtoi (FlagsStr);
   3423 
   3424   return (EFI_DEVICE_PATH_PROTOCOL *) Bbs;
   3425 }
   3426 
   3427 /**
   3428   Converts a text device path node to SATA device path structure.
   3429 
   3430   @param TextDeviceNode  The input Text device path node.
   3431 
   3432   @return A pointer to the newly-created SATA device path structure.
   3433 
   3434 **/
   3435 EFI_DEVICE_PATH_PROTOCOL *
   3436 DevPathFromTextSata (
   3437   IN CHAR16 *TextDeviceNode
   3438   )
   3439 {
   3440   SATA_DEVICE_PATH *Sata;
   3441   CHAR16           *Param1;
   3442   CHAR16           *Param2;
   3443   CHAR16           *Param3;
   3444 
   3445   Param1 = GetNextParamStr (&TextDeviceNode);
   3446   Param2 = GetNextParamStr (&TextDeviceNode);
   3447   Param3 = GetNextParamStr (&TextDeviceNode);
   3448 
   3449   Sata = (SATA_DEVICE_PATH *) CreateDeviceNode (
   3450                                 MESSAGING_DEVICE_PATH,
   3451                                 MSG_SATA_DP,
   3452                                 (UINT16) sizeof (SATA_DEVICE_PATH)
   3453                                 );
   3454   Sata->HBAPortNumber            = (UINT16) Strtoi (Param1);
   3455   Sata->PortMultiplierPortNumber = (UINT16) Strtoi (Param2);
   3456   Sata->Lun                      = (UINT16) Strtoi (Param3);
   3457 
   3458   return (EFI_DEVICE_PATH_PROTOCOL *) Sata;
   3459 }
   3460 
   3461 GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevPathFromTextTable[] = {
   3462   {L"Path",                    DevPathFromTextPath                    },
   3463 
   3464   {L"HardwarePath",            DevPathFromTextHardwarePath            },
   3465   {L"Pci",                     DevPathFromTextPci                     },
   3466   {L"PcCard",                  DevPathFromTextPcCard                  },
   3467   {L"MemoryMapped",            DevPathFromTextMemoryMapped            },
   3468   {L"VenHw",                   DevPathFromTextVenHw                   },
   3469   {L"Ctrl",                    DevPathFromTextCtrl                    },
   3470   {L"BMC",                     DevPathFromTextBmc                     },
   3471 
   3472   {L"AcpiPath",                DevPathFromTextAcpiPath                },
   3473   {L"Acpi",                    DevPathFromTextAcpi                    },
   3474   {L"PciRoot",                 DevPathFromTextPciRoot                 },
   3475   {L"PcieRoot",                DevPathFromTextPcieRoot                },
   3476   {L"Floppy",                  DevPathFromTextFloppy                  },
   3477   {L"Keyboard",                DevPathFromTextKeyboard                },
   3478   {L"Serial",                  DevPathFromTextSerial                  },
   3479   {L"ParallelPort",            DevPathFromTextParallelPort            },
   3480   {L"AcpiEx",                  DevPathFromTextAcpiEx                  },
   3481   {L"AcpiExp",                 DevPathFromTextAcpiExp                 },
   3482   {L"AcpiAdr",                 DevPathFromTextAcpiAdr                 },
   3483 
   3484   {L"Msg",                     DevPathFromTextMsg                     },
   3485   {L"Ata",                     DevPathFromTextAta                     },
   3486   {L"Scsi",                    DevPathFromTextScsi                    },
   3487   {L"Fibre",                   DevPathFromTextFibre                   },
   3488   {L"FibreEx",                 DevPathFromTextFibreEx                 },
   3489   {L"I1394",                   DevPathFromText1394                    },
   3490   {L"USB",                     DevPathFromTextUsb                     },
   3491   {L"I2O",                     DevPathFromTextI2O                     },
   3492   {L"Infiniband",              DevPathFromTextInfiniband              },
   3493   {L"VenMsg",                  DevPathFromTextVenMsg                  },
   3494   {L"VenPcAnsi",               DevPathFromTextVenPcAnsi               },
   3495   {L"VenVt100",                DevPathFromTextVenVt100                },
   3496   {L"VenVt100Plus",            DevPathFromTextVenVt100Plus            },
   3497   {L"VenUtf8",                 DevPathFromTextVenUtf8                 },
   3498   {L"UartFlowCtrl",            DevPathFromTextUartFlowCtrl            },
   3499   {L"SAS",                     DevPathFromTextSAS                     },
   3500   {L"SasEx",                   DevPathFromTextSasEx                   },
   3501   {L"NVMe",                    DevPathFromTextNVMe                    },
   3502   {L"UFS",                     DevPathFromTextUfs                     },
   3503   {L"SD",                      DevPathFromTextSd                      },
   3504   {L"DebugPort",               DevPathFromTextDebugPort               },
   3505   {L"MAC",                     DevPathFromTextMAC                     },
   3506   {L"IPv4",                    DevPathFromTextIPv4                    },
   3507   {L"IPv6",                    DevPathFromTextIPv6                    },
   3508   {L"Uart",                    DevPathFromTextUart                    },
   3509   {L"UsbClass",                DevPathFromTextUsbClass                },
   3510   {L"UsbAudio",                DevPathFromTextUsbAudio                },
   3511   {L"UsbCDCControl",           DevPathFromTextUsbCDCControl           },
   3512   {L"UsbHID",                  DevPathFromTextUsbHID                  },
   3513   {L"UsbImage",                DevPathFromTextUsbImage                },
   3514   {L"UsbPrinter",              DevPathFromTextUsbPrinter              },
   3515   {L"UsbMassStorage",          DevPathFromTextUsbMassStorage          },
   3516   {L"UsbHub",                  DevPathFromTextUsbHub                  },
   3517   {L"UsbCDCData",              DevPathFromTextUsbCDCData              },
   3518   {L"UsbSmartCard",            DevPathFromTextUsbSmartCard            },
   3519   {L"UsbVideo",                DevPathFromTextUsbVideo                },
   3520   {L"UsbDiagnostic",           DevPathFromTextUsbDiagnostic           },
   3521   {L"UsbWireless",             DevPathFromTextUsbWireless             },
   3522   {L"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate },
   3523   {L"UsbIrdaBridge",           DevPathFromTextUsbIrdaBridge           },
   3524   {L"UsbTestAndMeasurement",   DevPathFromTextUsbTestAndMeasurement   },
   3525   {L"UsbWwid",                 DevPathFromTextUsbWwid                 },
   3526   {L"Unit",                    DevPathFromTextUnit                    },
   3527   {L"iSCSI",                   DevPathFromTextiSCSI                   },
   3528   {L"Vlan",                    DevPathFromTextVlan                    },
   3529   {L"Uri",                     DevPathFromTextUri                     },
   3530   {L"Bluetooth",               DevPathFromTextBluetooth               },
   3531   {L"Wi-Fi",                   DevPathFromTextWiFi                    },
   3532   {L"MediaPath",               DevPathFromTextMediaPath               },
   3533   {L"HD",                      DevPathFromTextHD                      },
   3534   {L"CDROM",                   DevPathFromTextCDROM                   },
   3535   {L"VenMedia",                DevPathFromTextVenMedia                },
   3536   {L"Media",                   DevPathFromTextMedia                   },
   3537   {L"Fv",                      DevPathFromTextFv                      },
   3538   {L"FvFile",                  DevPathFromTextFvFile                  },
   3539   {L"Offset",                  DevPathFromTextRelativeOffsetRange     },
   3540   {L"RamDisk",                 DevPathFromTextRamDisk                 },
   3541   {L"VirtualDisk",             DevPathFromTextVirtualDisk             },
   3542   {L"VirtualCD",               DevPathFromTextVirtualCd               },
   3543   {L"PersistentVirtualDisk",   DevPathFromTextPersistentVirtualDisk   },
   3544   {L"PersistentVirtualCD",     DevPathFromTextPersistentVirtualCd     },
   3545 
   3546   {L"BbsPath",                 DevPathFromTextBbsPath                 },
   3547   {L"BBS",                     DevPathFromTextBBS                     },
   3548   {L"Sata",                    DevPathFromTextSata                    },
   3549   {NULL, NULL}
   3550 };
   3551 
   3552 /**
   3553   Convert text to the binary representation of a device node.
   3554 
   3555   @param TextDeviceNode  TextDeviceNode points to the text representation of a device
   3556                          node. Conversion starts with the first character and continues
   3557                          until the first non-device node character.
   3558 
   3559   @return A pointer to the EFI device node or NULL if TextDeviceNode is NULL or there was
   3560           insufficient memory or text unsupported.
   3561 
   3562 **/
   3563 EFI_DEVICE_PATH_PROTOCOL *
   3564 EFIAPI
   3565 UefiDevicePathLibConvertTextToDeviceNode (
   3566   IN CONST CHAR16 *TextDeviceNode
   3567   )
   3568 {
   3569   DEVICE_PATH_FROM_TEXT    FromText;
   3570   CHAR16                   *ParamStr;
   3571   EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
   3572   CHAR16                   *DeviceNodeStr;
   3573   UINTN                    Index;
   3574 
   3575   if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {
   3576     return NULL;
   3577   }
   3578 
   3579   ParamStr      = NULL;
   3580   FromText      = NULL;
   3581   DeviceNodeStr = UefiDevicePathLibStrDuplicate (TextDeviceNode);
   3582   ASSERT (DeviceNodeStr != NULL);
   3583 
   3584   for (Index = 0; mUefiDevicePathLibDevPathFromTextTable[Index].Function != NULL; Index++) {
   3585     ParamStr = GetParamByNodeName (DeviceNodeStr, mUefiDevicePathLibDevPathFromTextTable[Index].DevicePathNodeText);
   3586     if (ParamStr != NULL) {
   3587       FromText = mUefiDevicePathLibDevPathFromTextTable[Index].Function;
   3588       break;
   3589     }
   3590   }
   3591 
   3592   if (FromText == NULL) {
   3593     //
   3594     // A file path
   3595     //
   3596     FromText = DevPathFromTextFilePath;
   3597     DeviceNode = FromText (DeviceNodeStr);
   3598   } else {
   3599     DeviceNode = FromText (ParamStr);
   3600     FreePool (ParamStr);
   3601   }
   3602 
   3603   FreePool (DeviceNodeStr);
   3604 
   3605   return DeviceNode;
   3606 }
   3607 
   3608 /**
   3609   Convert text to the binary representation of a device path.
   3610 
   3611 
   3612   @param TextDevicePath  TextDevicePath points to the text representation of a device
   3613                          path. Conversion starts with the first character and continues
   3614                          until the first non-device node character.
   3615 
   3616   @return A pointer to the allocated device path or NULL if TextDeviceNode is NULL or
   3617           there was insufficient memory.
   3618 
   3619 **/
   3620 EFI_DEVICE_PATH_PROTOCOL *
   3621 EFIAPI
   3622 UefiDevicePathLibConvertTextToDevicePath (
   3623   IN CONST CHAR16 *TextDevicePath
   3624   )
   3625 {
   3626   EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
   3627   EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
   3628   CHAR16                   *DevicePathStr;
   3629   CHAR16                   *Str;
   3630   CHAR16                   *DeviceNodeStr;
   3631   BOOLEAN                  IsInstanceEnd;
   3632   EFI_DEVICE_PATH_PROTOCOL *DevicePath;
   3633 
   3634   if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {
   3635     return NULL;
   3636   }
   3637 
   3638   DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);
   3639   ASSERT (DevicePath != NULL);
   3640   SetDevicePathEndNode (DevicePath);
   3641 
   3642   DevicePathStr = UefiDevicePathLibStrDuplicate (TextDevicePath);
   3643 
   3644   Str           = DevicePathStr;
   3645   while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {
   3646     DeviceNode = UefiDevicePathLibConvertTextToDeviceNode (DeviceNodeStr);
   3647 
   3648     NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);
   3649     FreePool (DevicePath);
   3650     FreePool (DeviceNode);
   3651     DevicePath = NewDevicePath;
   3652 
   3653     if (IsInstanceEnd) {
   3654       DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);
   3655       ASSERT (DeviceNode != NULL);
   3656       SetDevicePathEndNode (DeviceNode);
   3657 
   3658       NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);
   3659       FreePool (DevicePath);
   3660       FreePool (DeviceNode);
   3661       DevicePath = NewDevicePath;
   3662     }
   3663   }
   3664 
   3665   FreePool (DevicePathStr);
   3666   return DevicePath;
   3667 }
   3668