]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
MdePkg/UefiDevicePathLib: Use BaseLib string conversion services
[mirror_edk2.git] / MdePkg / Library / UefiDevicePathLib / DevicePathFromText.c
index 91203190ea72388c145b20d7b7aa46ace8acee18..ae38859542de4b3ecac969bd7777e8acc08784b7 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
 \r
-Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2013 - 2017, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -326,212 +326,104 @@ Strtoi64 (
 }\r
 \r
 /**\r
-  Converts a list of string to a specified buffer.\r
-\r
-  @param Buf             The output buffer that contains the string.\r
-  @param BufferLength    The length of the buffer\r
-  @param Str             The input string that contains the hex number\r
+  Converts a Unicode string to ASCII string.\r
 \r
-  @retval EFI_SUCCESS    The string was successfully converted to the buffer.\r
+  @param Str             The equivalent Unicode string\r
+  @param AsciiStr        On input, it points to destination ASCII string buffer; on output, it points\r
+                         to the next ASCII string next to it\r
 \r
 **/\r
-EFI_STATUS\r
-StrToBuf (\r
-  OUT UINT8    *Buf,\r
-  IN  UINTN    BufferLength,\r
-  IN  CHAR16   *Str\r
+VOID\r
+StrToAscii (\r
+  IN     CHAR16 *Str,\r
+  IN OUT CHAR8  **AsciiStr\r
   )\r
 {\r
-  UINTN       Index;\r
-  UINTN       StrLength;\r
-  UINT8       Digit;\r
-  UINT8       Byte;\r
+  CHAR8 *Dest;\r
 \r
-  Digit = 0;\r
+  Dest = *AsciiStr;\r
+  while (!IS_NULL (*Str)) {\r
+    *(Dest++) = (CHAR8) *(Str++);\r
+  }\r
+  *Dest = 0;\r
 \r
   //\r
-  // Two hex char make up one byte\r
+  // Return the string next to it\r
   //\r
-  StrLength = BufferLength * sizeof (CHAR16);\r
-\r
-  for(Index = 0; Index < StrLength; Index++, Str++) {\r
-\r
-    if ((*Str >= L'a') && (*Str <= L'f')) {\r
-      Digit = (UINT8) (*Str - L'a' + 0x0A);\r
-    } else if ((*Str >= L'A') && (*Str <= L'F')) {\r
-      Digit = (UINT8) (*Str - L'A' + 0x0A);\r
-    } else if ((*Str >= L'0') && (*Str <= L'9')) {\r
-      Digit = (UINT8) (*Str - L'0');\r
-    } else {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    //\r
-    // For odd characters, write the upper nibble for each buffer byte,\r
-    // and for even characters, the lower nibble.\r
-    //\r
-    if ((Index & 1) == 0) {\r
-      Byte = (UINT8) (Digit << 4);\r
-    } else {\r
-      Byte = Buf[Index / 2];\r
-      Byte &= 0xF0;\r
-      Byte = (UINT8) (Byte | Digit);\r
-    }\r
-\r
-    Buf[Index / 2] = Byte;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
+  *AsciiStr = Dest + 1;\r
 }\r
 \r
 /**\r
-  Converts a string to GUID value.\r
-  Guid Format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\r
-\r
-  @param Str              The registry format GUID string that contains the GUID value.\r
-  @param Guid             A pointer to the converted GUID value.\r
+  Converts a generic text device path node to device path structure.\r
 \r
-  @retval EFI_SUCCESS     The GUID string was successfully converted to the GUID value.\r
-  @retval EFI_UNSUPPORTED The input string is not in registry format.\r
-  @return others          Some error occurred when converting part of GUID value.\r
+  @param Type            The type of the device path node.\r
+  @param TextDeviceNode  The input text device path node.\r
 \r
+  @return A pointer to device path structure.\r
 **/\r
-EFI_STATUS\r
-StrToGuid (\r
-  IN  CHAR16   *Str,\r
-  OUT EFI_GUID *Guid\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextGenericPath (\r
+  IN UINT8  Type,\r
+  IN CHAR16 *TextDeviceNode\r
   )\r
 {\r
-  //\r
-  // Get the first UINT32 data\r
-  //\r
-  Guid->Data1 = (UINT32) StrHexToUint64  (Str);\r
-  while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {\r
-    Str ++;\r
-  }\r
-  \r
-  if (IS_HYPHEN (*Str)) {\r
-    Str++;\r
-  } else {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-  \r
-  //\r
-  // Get the second UINT16 data\r
-  //\r
-  Guid->Data2 = (UINT16) StrHexToUint64  (Str);\r
-  while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {\r
-    Str ++;\r
-  }\r
+  EFI_DEVICE_PATH_PROTOCOL *Node;\r
+  CHAR16                   *SubtypeStr;\r
+  CHAR16                   *DataStr;\r
+  UINTN                    DataLength;\r
 \r
-  if (IS_HYPHEN (*Str)) {\r
-    Str++;\r
-  } else {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-  \r
-  //\r
-  // Get the third UINT16 data\r
-  //\r
-  Guid->Data3 = (UINT16) StrHexToUint64  (Str);\r
-  while (!IS_HYPHEN (*Str) && !IS_NULL (*Str)) {\r
-    Str ++;\r
-  }\r
+  SubtypeStr = GetNextParamStr (&TextDeviceNode);\r
+  DataStr    = GetNextParamStr (&TextDeviceNode);\r
 \r
-  if (IS_HYPHEN (*Str)) {\r
-    Str++;\r
+  if (DataStr == NULL) {\r
+    DataLength = 0;\r
   } else {\r
-    return EFI_UNSUPPORTED;\r
+    DataLength = StrLen (DataStr) / 2;\r
   }\r
+  Node = CreateDeviceNode (\r
+           Type,\r
+           (UINT8) Strtoi (SubtypeStr),\r
+           (UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL) + DataLength)\r
+           );\r
 \r
-  //\r
-  // Get the following 8 bytes data\r
-  //  \r
-  StrToBuf (&Guid->Data4[0], 2, Str);\r
-  //\r
-  // Skip 2 byte hex chars\r
-  //\r
-  Str += 2 * 2;\r
-\r
-  if (IS_HYPHEN (*Str)) {\r
-    Str++;\r
-  } else {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-  StrToBuf (&Guid->Data4[2], 6, Str);\r
-\r
-  return EFI_SUCCESS;\r
+  StrHexToBytes (DataStr, DataLength * 2, (UINT8 *) (Node + 1), DataLength);\r
+  return Node;\r
 }\r
 \r
 /**\r
-  Converts a string to IPv4 address\r
+  Converts a generic text device path node to device path structure.\r
 \r
-  @param Str             A string representation of IPv4 address.\r
-  @param IPv4Addr        A pointer to the converted IPv4 address.\r
-\r
-**/\r
-VOID\r
-StrToIPv4Addr (\r
-  IN OUT CHAR16           **Str,\r
-  OUT    EFI_IPv4_ADDRESS *IPv4Addr\r
-  )\r
-{\r
-  UINTN  Index;\r
-\r
-  for (Index = 0; Index < 4; Index++) {\r
-    IPv4Addr->Addr[Index] = (UINT8) StrDecimalToUintn (SplitStr (Str, L'.'));\r
-  }\r
-}\r
-\r
-/**\r
-  Converts a string to IPv4 address\r
+  @param TextDeviceNode  The input Text device path node.\r
 \r
-  @param Str             A string representation of IPv6 address.\r
-  @param IPv6Addr        A pointer to the converted IPv6 address.\r
+  @return A pointer to device path structure.\r
 \r
 **/\r
-VOID\r
-StrToIPv6Addr (\r
-  IN OUT CHAR16           **Str,\r
-  OUT    EFI_IPv6_ADDRESS *IPv6Addr\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPath (\r
+  IN CHAR16 *TextDeviceNode\r
   )\r
 {\r
-  UINTN  Index;\r
-  UINT16 Data;\r
+  CHAR16                   *TypeStr;\r
 \r
-  for (Index = 0; Index < 8; Index++) {\r
-    Data = (UINT16) StrHexToUintn (SplitStr (Str, L':'));\r
-    IPv6Addr->Addr[Index * 2] = (UINT8) (Data >> 8);\r
-    IPv6Addr->Addr[Index * 2 + 1] = (UINT8) (Data & 0xff);\r
-  }\r
+  TypeStr    = GetNextParamStr (&TextDeviceNode);\r
+\r
+  return DevPathFromTextGenericPath ((UINT8) Strtoi (TypeStr), TextDeviceNode);\r
 }\r
 \r
 /**\r
-  Converts a Unicode string to ASCII string.\r
+  Converts a generic hardware text device path node to Hardware device path structure.\r
 \r
-  @param Str             The equivalent Unicode string\r
-  @param AsciiStr        On input, it points to destination ASCII string buffer; on output, it points\r
-                         to the next ASCII string next to it\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to Hardware device path structure.\r
 \r
 **/\r
-VOID\r
-StrToAscii (\r
-  IN     CHAR16 *Str,\r
-  IN OUT CHAR8  **AsciiStr\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextHardwarePath (\r
+  IN CHAR16 *TextDeviceNode\r
   )\r
 {\r
-  CHAR8 *Dest;\r
-\r
-  Dest = *AsciiStr;\r
-  while (!IS_NULL (*Str)) {\r
-    *(Dest++) = (CHAR8) *(Str++);\r
-  }\r
-  *Dest = 0;\r
-\r
-  //\r
-  // Return the string next to it\r
-  //\r
-  *AsciiStr = Dest + 1;\r
+  return DevPathFromTextGenericPath (HARDWARE_DEVICE_PATH, TextDeviceNode);\r
 }\r
 \r
 /**\r
@@ -666,7 +558,7 @@ ConvertFromTextVendor (
                                      );\r
 \r
   StrToGuid (GuidStr, &Vendor->Guid);\r
-  StrToBuf (((UINT8 *) Vendor) + sizeof (VENDOR_DEVICE_PATH), Length, DataStr);\r
+  StrHexToBytes (DataStr, Length * 2, (UINT8 *) (Vendor + 1), Length);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
 }\r
@@ -718,6 +610,56 @@ DevPathFromTextCtrl (
   return (EFI_DEVICE_PATH_PROTOCOL *) Controller;\r
 }\r
 \r
+/**\r
+  Converts a text device path node to BMC device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created BMC device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextBmc (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                *InterfaceTypeStr;\r
+  CHAR16                *BaseAddressStr;\r
+  BMC_DEVICE_PATH       *BmcDp;\r
+\r
+  InterfaceTypeStr = GetNextParamStr (&TextDeviceNode);\r
+  BaseAddressStr   = GetNextParamStr (&TextDeviceNode);\r
+  BmcDp            = (BMC_DEVICE_PATH *) CreateDeviceNode (\r
+                                           HARDWARE_DEVICE_PATH,\r
+                                           HW_BMC_DP,\r
+                                           (UINT16) sizeof (BMC_DEVICE_PATH)\r
+                                           );\r
+\r
+  BmcDp->InterfaceType = (UINT8) Strtoi (InterfaceTypeStr);\r
+  WriteUnaligned64 (\r
+    (UINT64 *) (&BmcDp->BaseAddress),\r
+    StrHexToUint64 (BaseAddressStr)\r
+    );\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) BmcDp;\r
+}\r
+\r
+/**\r
+  Converts a generic ACPI text device path node to ACPI device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to ACPI device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextAcpiPath (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return DevPathFromTextGenericPath (ACPI_DEVICE_PATH, TextDeviceNode);\r
+}\r
+\r
 /**\r
   Converts a string to EisaId.\r
 \r
@@ -1045,6 +987,22 @@ DevPathFromTextAcpiAdr (
   return (EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr;\r
 }\r
 \r
+/**\r
+  Converts a generic messaging text device path node to messaging device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to messaging device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextMsg (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return DevPathFromTextGenericPath (MESSAGING_DEVICE_PATH, TextDeviceNode);\r
+}\r
+\r
 /**\r
   Converts a text device path node to Parallel Port device path structure.\r
 \r
@@ -1055,8 +1013,8 @@ DevPathFromTextAcpiAdr (
 **/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
 DevPathFromTextAta (\r
-  IN CHAR16 *TextDeviceNode\r
-  )\r
+IN CHAR16 *TextDeviceNode\r
+)\r
 {\r
   CHAR16            *PrimarySecondaryStr;\r
   CHAR16            *SlaveMasterStr;\r
@@ -1064,18 +1022,31 @@ DevPathFromTextAta (
   ATAPI_DEVICE_PATH *Atapi;\r
 \r
   Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (\r
-                                  MESSAGING_DEVICE_PATH,\r
-                                  MSG_ATAPI_DP,\r
-                                  (UINT16) sizeof (ATAPI_DEVICE_PATH)\r
-                                  );\r
-\r
-  PrimarySecondaryStr     = GetNextParamStr (&TextDeviceNode);\r
-  SlaveMasterStr          = GetNextParamStr (&TextDeviceNode);\r
-  LunStr                  = GetNextParamStr (&TextDeviceNode);\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_ATAPI_DP,\r
+    (UINT16) sizeof (ATAPI_DEVICE_PATH)\r
+    );\r
+\r
+  PrimarySecondaryStr = GetNextParamStr (&TextDeviceNode);\r
+  SlaveMasterStr      = GetNextParamStr (&TextDeviceNode);\r
+  LunStr              = GetNextParamStr (&TextDeviceNode);\r
+\r
+  if (StrCmp (PrimarySecondaryStr, L"Primary") == 0) {\r
+    Atapi->PrimarySecondary = 0;\r
+  } else if (StrCmp (PrimarySecondaryStr, L"Secondary") == 0) {\r
+    Atapi->PrimarySecondary = 1;\r
+  } else {\r
+    Atapi->PrimarySecondary = (UINT8) Strtoi (PrimarySecondaryStr);\r
+  }\r
+  if (StrCmp (SlaveMasterStr, L"Master") == 0) {\r
+    Atapi->SlaveMaster      = 0;\r
+  } else if (StrCmp (SlaveMasterStr, L"Slave") == 0) {\r
+    Atapi->SlaveMaster      = 1;\r
+  } else {\r
+    Atapi->SlaveMaster      = (UINT8) Strtoi (SlaveMasterStr);\r
+  }\r
 \r
-  Atapi->PrimarySecondary = (UINT8) ((StrCmp (PrimarySecondaryStr, L"Primary") == 0) ? 0 : 1);\r
-  Atapi->SlaveMaster      = (UINT8) ((StrCmp (SlaveMasterStr, L"Master") == 0) ? 0 : 1);\r
-  Atapi->Lun              = (UINT16) Strtoi (LunStr);\r
+  Atapi->Lun                = (UINT16) Strtoi (LunStr);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;\r
 }\r
@@ -1284,7 +1255,6 @@ DevPathFromTextInfiniband (
   CHAR16                  *SidStr;\r
   CHAR16                  *TidStr;\r
   CHAR16                  *DidStr;\r
-  EFI_GUID                PortGid;\r
   INFINIBAND_DEVICE_PATH  *InfiniBand;\r
 \r
   FlagsStr   = GetNextParamStr (&TextDeviceNode);\r
@@ -1299,8 +1269,7 @@ DevPathFromTextInfiniband (
                                             );\r
 \r
   InfiniBand->ResourceFlags = (UINT32) Strtoi (FlagsStr);\r
-  StrToGuid (GuidStr, &PortGid);\r
-  CopyMem (InfiniBand->PortGid, &PortGid, sizeof (EFI_GUID));\r
+  StrToGuid (GuidStr, (EFI_GUID *) InfiniBand->PortGid);\r
   Strtoi64 (SidStr, &InfiniBand->ServiceId);\r
   Strtoi64 (TidStr, &InfiniBand->TargetPortId);\r
   Strtoi64 (DidStr, &InfiniBand->DeviceId);\r
@@ -1651,6 +1620,131 @@ DevPathFromTextSasEx (
   return (EFI_DEVICE_PATH_PROTOCOL *) SasEx;\r
 }\r
 \r
+/**\r
+  Converts a text device path node to NVM Express Namespace device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created NVM Express Namespace device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextNVMe (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                     *NamespaceIdStr;\r
+  CHAR16                     *NamespaceUuidStr;\r
+  NVME_NAMESPACE_DEVICE_PATH *Nvme;\r
+  UINT8                      *Uuid;\r
+  UINTN                      Index;\r
+\r
+  NamespaceIdStr   = GetNextParamStr (&TextDeviceNode);\r
+  NamespaceUuidStr = GetNextParamStr (&TextDeviceNode);\r
+  Nvme = (NVME_NAMESPACE_DEVICE_PATH *) CreateDeviceNode (\r
+    MESSAGING_DEVICE_PATH,\r
+    MSG_NVME_NAMESPACE_DP,\r
+    (UINT16) sizeof (NVME_NAMESPACE_DEVICE_PATH)\r
+    );\r
+\r
+  Nvme->NamespaceId = (UINT32) Strtoi (NamespaceIdStr);\r
+  Uuid = (UINT8 *) &Nvme->NamespaceUuid;\r
+\r
+  Index = sizeof (Nvme->NamespaceUuid) / sizeof (UINT8);\r
+  while (Index-- != 0) {\r
+    Uuid[Index] = (UINT8) StrHexToUintn (SplitStr (&NamespaceUuidStr, L'-'));\r
+  }\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Nvme;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to UFS device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created UFS device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUfs (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *PunStr;\r
+  CHAR16            *LunStr;\r
+  UFS_DEVICE_PATH   *Ufs;\r
+\r
+  PunStr = GetNextParamStr (&TextDeviceNode);\r
+  LunStr = GetNextParamStr (&TextDeviceNode);\r
+  Ufs    = (UFS_DEVICE_PATH *) CreateDeviceNode (\r
+                                 MESSAGING_DEVICE_PATH,\r
+                                 MSG_UFS_DP,\r
+                                 (UINT16) sizeof (UFS_DEVICE_PATH)\r
+                                 );\r
+\r
+  Ufs->Pun = (UINT8) Strtoi (PunStr);\r
+  Ufs->Lun = (UINT8) Strtoi (LunStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Ufs;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to SD (Secure Digital) device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created SD device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextSd (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *SlotNumberStr;\r
+  SD_DEVICE_PATH    *Sd;\r
+\r
+  SlotNumberStr = GetNextParamStr (&TextDeviceNode);\r
+  Sd            = (SD_DEVICE_PATH *) CreateDeviceNode (\r
+                                       MESSAGING_DEVICE_PATH,\r
+                                       MSG_SD_DP,\r
+                                       (UINT16) sizeof (SD_DEVICE_PATH)\r
+                                       );\r
+\r
+  Sd->SlotNumber = (UINT8) Strtoi (SlotNumberStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Sd;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to EMMC (Embedded MMC) device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created EMMC device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextEmmc (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *SlotNumberStr;\r
+  EMMC_DEVICE_PATH  *Emmc;\r
+\r
+  SlotNumberStr = GetNextParamStr (&TextDeviceNode);\r
+  Emmc          = (EMMC_DEVICE_PATH *) CreateDeviceNode (\r
+                                       MESSAGING_DEVICE_PATH,\r
+                                       MSG_EMMC_DP,\r
+                                       (UINT16) sizeof (EMMC_DEVICE_PATH)\r
+                                       );\r
+\r
+  Emmc->SlotNumber = (UINT8) Strtoi (SlotNumberStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Emmc;\r
+}\r
+\r
 /**\r
   Converts a text device path node to Debug Port device path structure.\r
 \r
@@ -1706,7 +1800,7 @@ DevPathFromTextMAC (
   MACDevPath->IfType   = (UINT8) Strtoi (IfTypeStr);\r
 \r
   Length = sizeof (EFI_MAC_ADDRESS);\r
-  StrToBuf (&MACDevPath->MacAddress.Addr[0], Length, AddressStr);\r
+  StrHexToBytes (AddressStr, Length * 2, MACDevPath->MacAddress.Addr, Length);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) MACDevPath;\r
 }\r
@@ -1770,7 +1864,7 @@ DevPathFromTextIPv4 (
                                                  (UINT16) sizeof (IPv4_DEVICE_PATH)\r
                                                  );\r
 \r
-  StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);\r
+  StrToIpv4Address (RemoteIPStr, NULL, &IPv4->RemoteIpAddress, NULL);\r
   IPv4->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
   if (StrCmp (TypeStr, L"Static") == 0) {\r
     IPv4->StaticIpAddress = TRUE;\r
@@ -1778,10 +1872,10 @@ DevPathFromTextIPv4 (
     IPv4->StaticIpAddress = FALSE;\r
   }\r
 \r
-  StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);\r
+  StrToIpv4Address (LocalIPStr, NULL, &IPv4->LocalIpAddress, NULL);\r
   if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*SubnetMaskStr)) {\r
-    StrToIPv4Addr (&GatewayIPStr,  &IPv4->GatewayIpAddress);\r
-    StrToIPv4Addr (&SubnetMaskStr, &IPv4->SubnetMask);\r
+    StrToIpv4Address (GatewayIPStr,  NULL, &IPv4->GatewayIpAddress, NULL);\r
+    StrToIpv4Address (SubnetMaskStr, NULL, &IPv4->SubnetMask,       NULL);\r
   } else {\r
     ZeroMem (&IPv4->GatewayIpAddress, sizeof (IPv4->GatewayIpAddress));\r
     ZeroMem (&IPv4->SubnetMask,    sizeof (IPv4->SubnetMask));\r
@@ -1826,7 +1920,7 @@ DevPathFromTextIPv6 (
                                                  (UINT16) sizeof (IPv6_DEVICE_PATH)\r
                                                  );\r
 \r
-  StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);\r
+  StrToIpv6Address (RemoteIPStr, NULL, &IPv6->RemoteIpAddress, NULL);\r
   IPv6->Protocol        = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
   if (StrCmp (TypeStr, L"Static") == 0) {\r
     IPv6->IpAddressOrigin = 0;\r
@@ -1836,9 +1930,9 @@ DevPathFromTextIPv6 (
     IPv6->IpAddressOrigin = 2;\r
   }\r
 \r
-  StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);\r
+  StrToIpv6Address (LocalIPStr, NULL, &IPv6->LocalIpAddress, NULL);\r
   if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*PrefixLengthStr)) {\r
-    StrToIPv6Addr (&GatewayIPStr, &IPv6->GatewayIpAddress);\r
+    StrToIpv6Address (GatewayIPStr, NULL, &IPv6->GatewayIpAddress, NULL);\r
     IPv6->PrefixLength = (UINT8) Strtoi (PrefixLengthStr);\r
   } else {\r
     ZeroMem (&IPv6->GatewayIpAddress, sizeof (IPv6->GatewayIpAddress));\r
@@ -1880,8 +1974,12 @@ DevPathFromTextUart (
                                            (UINT16) sizeof (UART_DEVICE_PATH)\r
                                            );\r
 \r
-  Uart->BaudRate  = (StrCmp (BaudStr, L"DEFAULT") == 0) ? 115200 : StrDecimalToUintn (BaudStr);\r
-  Uart->DataBits  = (UINT8) ((StrCmp (DataBitsStr, L"DEFAULT") == 0) ? 8 : StrDecimalToUintn (DataBitsStr));\r
+  if (StrCmp (BaudStr, L"DEFAULT") == 0) {\r
+    Uart->BaudRate = 115200;\r
+  } else {\r
+    Strtoi64 (BaudStr, &Uart->BaudRate);\r
+  }\r
+  Uart->DataBits  = (UINT8) ((StrCmp (DataBitsStr, L"DEFAULT") == 0) ? 8 : Strtoi (DataBitsStr));\r
   switch (*ParityStr) {\r
   case L'D':\r
     Uart->Parity = 0;\r
@@ -1908,7 +2006,8 @@ DevPathFromTextUart (
     break;\r
 \r
   default:\r
-    Uart->Parity = 0xff;\r
+    Uart->Parity = (UINT8) Strtoi (ParityStr);\r
+    break;\r
   }\r
 \r
   if (StrCmp (StopBitsStr, L"D") == 0) {\r
@@ -1920,7 +2019,7 @@ DevPathFromTextUart (
   } else if (StrCmp (StopBitsStr, L"2") == 0) {\r
     Uart->StopBits = (UINT8) 3;\r
   } else {\r
-    Uart->StopBits = 0xff;\r
+    Uart->StopBits = (UINT8) Strtoi (StopBitsStr);\r
   }\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Uart;\r
@@ -2351,21 +2450,39 @@ DevPathFromTextUsbWwid (
   CHAR16                *InterfaceNumStr;\r
   CHAR16                *SerialNumberStr;\r
   USB_WWID_DEVICE_PATH  *UsbWwid;\r
-\r
-  VIDStr                    = GetNextParamStr (&TextDeviceNode);\r
-  PIDStr                    = GetNextParamStr (&TextDeviceNode);\r
-  InterfaceNumStr           = GetNextParamStr (&TextDeviceNode);\r
-  SerialNumberStr           = GetNextParamStr (&TextDeviceNode);\r
-  UsbWwid                   = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (\r
+  UINTN                 SerialNumberStrLen;\r
+\r
+  VIDStr                   = GetNextParamStr (&TextDeviceNode);\r
+  PIDStr                   = GetNextParamStr (&TextDeviceNode);\r
+  InterfaceNumStr          = GetNextParamStr (&TextDeviceNode);\r
+  SerialNumberStr          = GetNextParamStr (&TextDeviceNode);\r
+  SerialNumberStrLen       = StrLen (SerialNumberStr);\r
+  if (SerialNumberStrLen >= 2 &&\r
+      SerialNumberStr[0] == L'\"' &&\r
+      SerialNumberStr[SerialNumberStrLen - 1] == L'\"'\r
+    ) {\r
+    SerialNumberStr[SerialNumberStrLen - 1] = L'\0';\r
+    SerialNumberStr++;\r
+    SerialNumberStrLen -= 2;\r
+  }\r
+  UsbWwid                  = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (\r
                                                          MESSAGING_DEVICE_PATH,\r
                                                          MSG_USB_WWID_DP,\r
-                                                         (UINT16) (sizeof (USB_WWID_DEVICE_PATH) + StrSize (SerialNumberStr))\r
+                                                         (UINT16) (sizeof (USB_WWID_DEVICE_PATH) + SerialNumberStrLen * sizeof (CHAR16))\r
                                                          );\r
+  UsbWwid->VendorId        = (UINT16) Strtoi (VIDStr);\r
+  UsbWwid->ProductId       = (UINT16) Strtoi (PIDStr);\r
+  UsbWwid->InterfaceNumber = (UINT16) Strtoi (InterfaceNumStr);\r
 \r
-  UsbWwid->VendorId         = (UINT16) Strtoi (VIDStr);\r
-  UsbWwid->ProductId        = (UINT16) Strtoi (PIDStr);\r
-  UsbWwid->InterfaceNumber  = (UINT16) Strtoi (InterfaceNumStr);\r
-  StrCpy ((CHAR16 *) ((UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH)), SerialNumberStr);\r
+  //\r
+  // There is no memory allocated in UsbWwid for the '\0' in SerialNumberStr.\r
+  // Therefore, the '\0' will not be copied.\r
+  //\r
+  CopyMem (\r
+    (UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH),\r
+    SerialNumberStr,\r
+    SerialNumberStrLen * sizeof (CHAR16)\r
+    );\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;\r
 }\r
@@ -2493,6 +2610,139 @@ DevPathFromTextVlan (
   return (EFI_DEVICE_PATH_PROTOCOL *) Vlan;\r
 }\r
 \r
+/**\r
+  Converts a text device path node to Bluetooth device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Bluetooth device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextBluetooth (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                  *BluetoothStr;\r
+  CHAR16                  *Walker;\r
+  CHAR16                  *TempNumBuffer;\r
+  UINTN                   TempBufferSize;\r
+  INT32                   Index;\r
+  BLUETOOTH_DEVICE_PATH   *BluetoothDp;\r
+\r
+  BluetoothStr = GetNextParamStr (&TextDeviceNode);\r
+  BluetoothDp = (BLUETOOTH_DEVICE_PATH *) CreateDeviceNode (\r
+                                   MESSAGING_DEVICE_PATH,\r
+                                   MSG_BLUETOOTH_DP,\r
+                                   (UINT16) sizeof (BLUETOOTH_DEVICE_PATH)\r
+                                   );\r
+\r
+  Index = sizeof (BLUETOOTH_ADDRESS) - 1;\r
+  Walker = BluetoothStr;\r
+  while (!IS_NULL(*Walker) && Index >= 0) {\r
+    TempBufferSize = 2 * sizeof(CHAR16) + StrSize(L"0x");\r
+    TempNumBuffer = AllocateZeroPool (TempBufferSize);\r
+    if (TempNumBuffer == NULL) {\r
+      break;\r
+    }\r
+    StrCpyS (TempNumBuffer, TempBufferSize / sizeof (CHAR16), L"0x");\r
+    StrnCatS (TempNumBuffer, TempBufferSize / sizeof (CHAR16), Walker, 2);\r
+    BluetoothDp->BD_ADDR.Address[Index] = (UINT8)Strtoi (TempNumBuffer);\r
+    FreePool (TempNumBuffer);\r
+    Walker += 2;\r
+    Index--;\r
+  }\r
+  \r
+  return (EFI_DEVICE_PATH_PROTOCOL *) BluetoothDp;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to Wi-Fi device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Wi-Fi device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextWiFi (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                *SSIdStr;\r
+  CHAR8                 AsciiStr[33];\r
+  UINTN                 DataLen;\r
+  WIFI_DEVICE_PATH      *WiFiDp;\r
+\r
+  SSIdStr = GetNextParamStr (&TextDeviceNode);\r
+  WiFiDp  = (WIFI_DEVICE_PATH *) CreateDeviceNode (\r
+                                   MESSAGING_DEVICE_PATH,\r
+                                   MSG_WIFI_DP,\r
+                                   (UINT16) sizeof (WIFI_DEVICE_PATH)\r
+                                   );\r
+\r
+  if (NULL != SSIdStr) {\r
+    DataLen = StrLen (SSIdStr);\r
+    if (StrLen (SSIdStr) > 32) {\r
+      SSIdStr[32] = L'\0';\r
+      DataLen     = 32;\r
+    }\r
+\r
+    UnicodeStrToAsciiStrS (SSIdStr, AsciiStr, sizeof (AsciiStr));\r
+    CopyMem (WiFiDp->SSId, AsciiStr, DataLen);\r
+  }\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) WiFiDp;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to URI device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created URI device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUri (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16           *UriStr;\r
+  UINTN            UriLength;\r
+  URI_DEVICE_PATH  *Uri;\r
+\r
+  UriStr = GetNextParamStr (&TextDeviceNode);\r
+  UriLength = StrnLenS (UriStr, MAX_UINT16 - sizeof (URI_DEVICE_PATH));\r
+  Uri    = (URI_DEVICE_PATH *) CreateDeviceNode (\r
+                                 MESSAGING_DEVICE_PATH,\r
+                                 MSG_URI_DP,\r
+                                 (UINT16) (sizeof (URI_DEVICE_PATH) + UriLength)\r
+                                 );\r
+\r
+  while (UriLength-- != 0) {\r
+    Uri->Uri[UriLength] = (CHAR8) UriStr[UriLength];\r
+  }\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Uri;\r
+}\r
+\r
+/**\r
+  Converts a media text device path node to media device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to media device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextMediaPath (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return DevPathFromTextGenericPath (MEDIA_DEVICE_PATH, TextDeviceNode);\r
+}\r
+\r
 /**\r
   Converts a text device path node to HD device path structure.\r
 \r
@@ -2512,7 +2762,6 @@ DevPathFromTextHD (
   CHAR16                *StartStr;\r
   CHAR16                *SizeStr;\r
   UINT32                Signature32;\r
-  EFI_GUID              SignatureGuid;\r
   HARDDRIVE_DEVICE_PATH *Hd;\r
 \r
   PartitionStr        = GetNextParamStr (&TextDeviceNode);\r
@@ -2526,7 +2775,7 @@ DevPathFromTextHD (
                                                     (UINT16) sizeof (HARDDRIVE_DEVICE_PATH)\r
                                                     );\r
 \r
-  Hd->PartitionNumber = (UINT32) StrDecimalToUintn (PartitionStr);\r
+  Hd->PartitionNumber = (UINT32) Strtoi (PartitionStr);\r
 \r
   ZeroMem (Hd->Signature, 16);\r
   Hd->MBRType = (UINT8) 0;\r
@@ -2541,8 +2790,7 @@ DevPathFromTextHD (
     Hd->SignatureType = SIGNATURE_TYPE_GUID;\r
     Hd->MBRType       = 0x02;\r
 \r
-    StrToGuid (SignatureStr, &SignatureGuid);\r
-    CopyMem (Hd->Signature, &SignatureGuid, sizeof (EFI_GUID));\r
+    StrToGuid (SignatureStr, (EFI_GUID *) Hd->Signature);\r
   } else {\r
     Hd->SignatureType = (UINT8) Strtoi (TypeStr);\r
   }\r
@@ -2596,7 +2844,7 @@ DevPathFromTextCDROM (
 \r
 **/\r
 EFI_DEVICE_PATH_PROTOCOL *\r
-DevPathFromTextVenMEDIA (\r
+DevPathFromTextVenMedia (\r
   IN CHAR16 *TextDeviceNode\r
   )\r
 {\r
@@ -2628,7 +2876,7 @@ DevPathFromTextFilePath (
                                     (UINT16) (sizeof (FILEPATH_DEVICE_PATH) + StrLen (TextDeviceNode) * 2)\r
                                     );\r
 \r
-  StrCpy (File->PathName, TextDeviceNode);\r
+  StrCpyS (File->PathName, StrLen (TextDeviceNode) + 1, TextDeviceNode);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) File;\r
 }\r
@@ -2748,6 +2996,223 @@ DevPathFromTextRelativeOffsetRange (
   return (EFI_DEVICE_PATH_PROTOCOL *) Offset;\r
 }\r
 \r
+/**\r
+  Converts a text device path node to text ram disk device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Text device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextRamDisk (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *StartingAddrStr;\r
+  CHAR16                                  *EndingAddrStr;\r
+  CHAR16                                  *TypeGuidStr;\r
+  CHAR16                                  *InstanceStr;\r
+  MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;\r
+  UINT64                                  StartingAddr;\r
+  UINT64                                  EndingAddr;\r
+\r
+  StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
+  EndingAddrStr   = GetNextParamStr (&TextDeviceNode);\r
+  InstanceStr     = GetNextParamStr (&TextDeviceNode);\r
+  TypeGuidStr     = GetNextParamStr (&TextDeviceNode);\r
+  RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
+                                                     MEDIA_DEVICE_PATH,\r
+                                                     MEDIA_RAM_DISK_DP,\r
+                                                     (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
+                                                     );\r
+\r
+  Strtoi64 (StartingAddrStr, &StartingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
+  Strtoi64 (EndingAddrStr, &EndingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
+  RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
+  StrToGuid (TypeGuidStr, &RamDisk->TypeGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to text virtual disk device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Text device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVirtualDisk (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *StartingAddrStr;\r
+  CHAR16                                  *EndingAddrStr;\r
+  CHAR16                                  *InstanceStr;\r
+  MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;\r
+  UINT64                                  StartingAddr;\r
+  UINT64                                  EndingAddr;\r
+\r
+  StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
+  EndingAddrStr   = GetNextParamStr (&TextDeviceNode);\r
+  InstanceStr     = GetNextParamStr (&TextDeviceNode);\r
+\r
+  RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
+                                                     MEDIA_DEVICE_PATH,\r
+                                                     MEDIA_RAM_DISK_DP,\r
+                                                     (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
+                                                     );\r
+\r
+  Strtoi64 (StartingAddrStr, &StartingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
+  Strtoi64 (EndingAddrStr, &EndingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
+  RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
+  CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualDiskGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to text virtual cd device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Text device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVirtualCd (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *StartingAddrStr;\r
+  CHAR16                                  *EndingAddrStr;\r
+  CHAR16                                  *InstanceStr;\r
+  MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;\r
+  UINT64                                  StartingAddr;\r
+  UINT64                                  EndingAddr;\r
+\r
+  StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
+  EndingAddrStr   = GetNextParamStr (&TextDeviceNode);\r
+  InstanceStr     = GetNextParamStr (&TextDeviceNode);\r
+\r
+  RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
+                                                     MEDIA_DEVICE_PATH,\r
+                                                     MEDIA_RAM_DISK_DP,\r
+                                                     (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
+                                                     );\r
+\r
+  Strtoi64 (StartingAddrStr, &StartingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
+  Strtoi64 (EndingAddrStr, &EndingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
+  RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
+  CopyGuid (&RamDisk->TypeGuid, &gEfiVirtualCdGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to text persistent virtual disk device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Text device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPersistentVirtualDisk (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *StartingAddrStr;\r
+  CHAR16                                  *EndingAddrStr;\r
+  CHAR16                                  *InstanceStr;\r
+  MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;\r
+  UINT64                                  StartingAddr;\r
+  UINT64                                  EndingAddr;\r
+\r
+  StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
+  EndingAddrStr   = GetNextParamStr (&TextDeviceNode);\r
+  InstanceStr     = GetNextParamStr (&TextDeviceNode);\r
+\r
+  RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
+                                                     MEDIA_DEVICE_PATH,\r
+                                                     MEDIA_RAM_DISK_DP,\r
+                                                     (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
+                                                     );\r
+\r
+  Strtoi64 (StartingAddrStr, &StartingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
+  Strtoi64 (EndingAddrStr, &EndingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
+  RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
+  CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualDiskGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
+}\r
+\r
+/**\r
+  Converts a text device path node to text persistent virtual cd device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Text device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPersistentVirtualCd (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *StartingAddrStr;\r
+  CHAR16                                  *EndingAddrStr;\r
+  CHAR16                                  *InstanceStr;\r
+  MEDIA_RAM_DISK_DEVICE_PATH              *RamDisk;\r
+  UINT64                                  StartingAddr;\r
+  UINT64                                  EndingAddr;\r
+\r
+  StartingAddrStr = GetNextParamStr (&TextDeviceNode);\r
+  EndingAddrStr   = GetNextParamStr (&TextDeviceNode);\r
+  InstanceStr     = GetNextParamStr (&TextDeviceNode);\r
+\r
+  RamDisk         = (MEDIA_RAM_DISK_DEVICE_PATH *) CreateDeviceNode (\r
+                                                     MEDIA_DEVICE_PATH,\r
+                                                     MEDIA_RAM_DISK_DP,\r
+                                                     (UINT16) sizeof (MEDIA_RAM_DISK_DEVICE_PATH)\r
+                                                     );\r
+\r
+  Strtoi64 (StartingAddrStr, &StartingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->StartingAddr[0]), StartingAddr);\r
+  Strtoi64 (EndingAddrStr, &EndingAddr);\r
+  WriteUnaligned64 ((UINT64 *) &(RamDisk->EndingAddr[0]), EndingAddr);\r
+  RamDisk->Instance = (UINT16) Strtoi (InstanceStr);\r
+  CopyGuid (&RamDisk->TypeGuid, &gEfiPersistentVirtualCdGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) RamDisk;\r
+}\r
+\r
+/**\r
+  Converts a BBS text device path node to BBS device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to BBS device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextBbsPath (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return DevPathFromTextGenericPath (BBS_DEVICE_PATH, TextDeviceNode);\r
+}\r
+\r
 /**\r
   Converts a text device path node to BIOS Boot Specification device path structure.\r
 \r
@@ -2818,39 +3283,34 @@ DevPathFromTextSata (
   CHAR16           *Param2;\r
   CHAR16           *Param3;\r
 \r
-  //\r
-  // The PMPN is optional.\r
-  //\r
   Param1 = GetNextParamStr (&TextDeviceNode);\r
   Param2 = GetNextParamStr (&TextDeviceNode);\r
-  Param3 = NULL;\r
-  if (!IS_NULL (TextDeviceNode)) {\r
-    Param3 = GetNextParamStr (&TextDeviceNode);\r
-  }\r
+  Param3 = GetNextParamStr (&TextDeviceNode);\r
 \r
   Sata = (SATA_DEVICE_PATH *) CreateDeviceNode (\r
                                 MESSAGING_DEVICE_PATH,\r
                                 MSG_SATA_DP,\r
                                 (UINT16) sizeof (SATA_DEVICE_PATH)\r
                                 );\r
-  Sata->HBAPortNumber = (UINT16) StrHexToUintn (Param1);\r
-  if (Param3 != NULL) {\r
-    Sata->PortMultiplierPortNumber = (UINT16) StrHexToUintn (Param2);\r
-    Param2                   = Param3;\r
-  } else {\r
-    Sata->PortMultiplierPortNumber = SATA_HBA_DIRECT_CONNECT_FLAG;\r
-  }\r
-  Sata->Lun = (UINT16) StrHexToUintn (Param2);\r
+  Sata->HBAPortNumber            = (UINT16) Strtoi (Param1);\r
+  Sata->PortMultiplierPortNumber = (UINT16) Strtoi (Param2);\r
+  Sata->Lun                      = (UINT16) Strtoi (Param3);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Sata;\r
 }\r
 \r
 GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevPathFromTextTable[] = {\r
+  {L"Path",                    DevPathFromTextPath                    },\r
+\r
+  {L"HardwarePath",            DevPathFromTextHardwarePath            },\r
   {L"Pci",                     DevPathFromTextPci                     },\r
   {L"PcCard",                  DevPathFromTextPcCard                  },\r
   {L"MemoryMapped",            DevPathFromTextMemoryMapped            },\r
   {L"VenHw",                   DevPathFromTextVenHw                   },\r
   {L"Ctrl",                    DevPathFromTextCtrl                    },\r
+  {L"BMC",                     DevPathFromTextBmc                     },\r
+\r
+  {L"AcpiPath",                DevPathFromTextAcpiPath                },\r
   {L"Acpi",                    DevPathFromTextAcpi                    },\r
   {L"PciRoot",                 DevPathFromTextPciRoot                 },\r
   {L"PcieRoot",                DevPathFromTextPcieRoot                },\r
@@ -2861,6 +3321,8 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {L"AcpiEx",                  DevPathFromTextAcpiEx                  },\r
   {L"AcpiExp",                 DevPathFromTextAcpiExp                 },\r
   {L"AcpiAdr",                 DevPathFromTextAcpiAdr                 },\r
+\r
+  {L"Msg",                     DevPathFromTextMsg                     },\r
   {L"Ata",                     DevPathFromTextAta                     },\r
   {L"Scsi",                    DevPathFromTextScsi                    },\r
   {L"Fibre",                   DevPathFromTextFibre                   },\r
@@ -2877,6 +3339,10 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {L"UartFlowCtrl",            DevPathFromTextUartFlowCtrl            },\r
   {L"SAS",                     DevPathFromTextSAS                     },\r
   {L"SasEx",                   DevPathFromTextSasEx                   },\r
+  {L"NVMe",                    DevPathFromTextNVMe                    },\r
+  {L"UFS",                     DevPathFromTextUfs                     },\r
+  {L"SD",                      DevPathFromTextSd                      },\r
+  {L"eMMC",                    DevPathFromTextEmmc                    },\r
   {L"DebugPort",               DevPathFromTextDebugPort               },\r
   {L"MAC",                     DevPathFromTextMAC                     },\r
   {L"IPv4",                    DevPathFromTextIPv4                    },\r
@@ -2902,13 +3368,24 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {L"Unit",                    DevPathFromTextUnit                    },\r
   {L"iSCSI",                   DevPathFromTextiSCSI                   },\r
   {L"Vlan",                    DevPathFromTextVlan                    },\r
+  {L"Uri",                     DevPathFromTextUri                     },\r
+  {L"Bluetooth",               DevPathFromTextBluetooth               },\r
+  {L"Wi-Fi",                   DevPathFromTextWiFi                    },\r
+  {L"MediaPath",               DevPathFromTextMediaPath               },\r
   {L"HD",                      DevPathFromTextHD                      },\r
   {L"CDROM",                   DevPathFromTextCDROM                   },\r
-  {L"VenMEDIA",                DevPathFromTextVenMEDIA                },\r
+  {L"VenMedia",                DevPathFromTextVenMedia                },\r
   {L"Media",                   DevPathFromTextMedia                   },\r
   {L"Fv",                      DevPathFromTextFv                      },\r
   {L"FvFile",                  DevPathFromTextFvFile                  },\r
   {L"Offset",                  DevPathFromTextRelativeOffsetRange     },\r
+  {L"RamDisk",                 DevPathFromTextRamDisk                 },\r
+  {L"VirtualDisk",             DevPathFromTextVirtualDisk             },\r
+  {L"VirtualCD",               DevPathFromTextVirtualCd               },\r
+  {L"PersistentVirtualDisk",   DevPathFromTextPersistentVirtualDisk   },\r
+  {L"PersistentVirtualCD",     DevPathFromTextPersistentVirtualCd     },\r
+\r
+  {L"BbsPath",                 DevPathFromTextBbsPath                 },\r
   {L"BBS",                     DevPathFromTextBBS                     },\r
   {L"Sata",                    DevPathFromTextSata                    },\r
   {NULL, NULL}\r