]> 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 37d7a1752b76a67222c1dd641f8cd2c9cf3a91ff..ae38859542de4b3ecac969bd7777e8acc08784b7 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
 \r
-Copyright (c) 2013 - 2014, 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
@@ -325,187 +325,6 @@ Strtoi64 (
   }\r
 }\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
-\r
-  @retval EFI_SUCCESS    The string was successfully converted to the buffer.\r
-\r
-**/\r
-EFI_STATUS\r
-StrToBuf (\r
-  OUT UINT8    *Buf,\r
-  IN  UINTN    BufferLength,\r
-  IN  CHAR16   *Str\r
-  )\r
-{\r
-  UINTN       Index;\r
-  UINTN       StrLength;\r
-  UINT8       Digit;\r
-  UINT8       Byte;\r
-\r
-  Digit = 0;\r
-\r
-  //\r
-  // Two hex char make up one byte\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
-}\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
-\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
-\r
-**/\r
-EFI_STATUS\r
-StrToGuid (\r
-  IN  CHAR16   *Str,\r
-  OUT EFI_GUID *Guid\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
-\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
-\r
-  if (IS_HYPHEN (*Str)) {\r
-    Str++;\r
-  } else {\r
-    return EFI_UNSUPPORTED;\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
-}\r
-\r
-/**\r
-  Converts a string to IPv4 address\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) Strtoi (SplitStr (Str, L'.'));\r
-  }\r
-}\r
-\r
-/**\r
-  Converts a string to IPv4 address\r
-\r
-  @param Str             A string representation of IPv6 address.\r
-  @param IPv6Addr        A pointer to the converted IPv6 address.\r
-\r
-**/\r
-VOID\r
-StrToIPv6Addr (\r
-  IN OUT CHAR16           **Str,\r
-  OUT    EFI_IPv6_ADDRESS *IPv6Addr\r
-  )\r
-{\r
-  UINTN  Index;\r
-  UINT16 Data;\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
-}\r
-\r
 /**\r
   Converts a Unicode string to ASCII string.\r
 \r
@@ -567,9 +386,7 @@ DevPathFromTextGenericPath (
            (UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL) + DataLength)\r
            );\r
 \r
-  if (DataLength != 0) {\r
-    StrToBuf ((UINT8 *) (Node + 1), DataLength, DataStr);\r
-  }\r
+  StrHexToBytes (DataStr, DataLength * 2, (UINT8 *) (Node + 1), DataLength);\r
   return Node;\r
 }\r
 \r
@@ -741,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
@@ -793,6 +610,40 @@ 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
@@ -1404,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
@@ -1419,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
@@ -1771,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
@@ -1826,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
@@ -1890,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
@@ -1898,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
@@ -1946,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
@@ -1956,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
@@ -2499,7 +2473,16 @@ DevPathFromTextUsbWwid (
   UsbWwid->VendorId        = (UINT16) Strtoi (VIDStr);\r
   UsbWwid->ProductId       = (UINT16) Strtoi (PIDStr);\r
   UsbWwid->InterfaceNumber = (UINT16) Strtoi (InterfaceNumStr);\r
-  StrnCpy ((CHAR16 *) ((UINT8 *) UsbWwid + sizeof (USB_WWID_DEVICE_PATH)), SerialNumberStr, SerialNumberStrLen);\r
+\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
@@ -2627,6 +2610,123 @@ 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
@@ -2662,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
@@ -2691,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
@@ -2778,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
@@ -2898,6 +2996,206 @@ 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
@@ -3010,6 +3308,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {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
@@ -3040,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
@@ -3065,7 +3368,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {L"Unit",                    DevPathFromTextUnit                    },\r
   {L"iSCSI",                   DevPathFromTextiSCSI                   },\r
   {L"Vlan",                    DevPathFromTextVlan                    },\r
-\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
@@ -3074,6 +3379,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {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