/** @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
-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
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
while ((*Str != 0) && *Str == L'0') {\r
Str ++;\r
}\r
- \r
+\r
return (BOOLEAN) (*Str == L'x' || *Str == L'X');\r
}\r
\r
}\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
(UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL) + DataLength)\r
);\r
\r
- StrToBuf ((UINT8 *) (Node + 1), DataLength, DataStr);\r
+ StrHexToBytes (DataStr, DataLength * 2, (UINT8 *) (Node + 1), DataLength);\r
return Node;\r
}\r
\r
);\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
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
);\r
\r
AcpiEx->HID = EisaIdFromText (HIDStr);\r
- AcpiEx->CID = EisaIdFromText (CIDStr);\r
+ //\r
+ // According to UEFI spec, the CID parametr is optional and has a default value of 0.\r
+ // So when the CID parametr is not specified or specified as 0 in the text device node.\r
+ // Set the CID to 0 in the ACPI extension device path structure.\r
+ //\r
+ if (*CIDStr == L'\0' || *CIDStr == L'0') {\r
+ AcpiEx->CID = 0;\r
+ } else {\r
+ AcpiEx->CID = EisaIdFromText (CIDStr);\r
+ }\r
AcpiEx->UID = 0;\r
\r
AsciiStr = (CHAR8 *) ((UINT8 *)AcpiEx + sizeof (ACPI_EXTENDED_HID_DEVICE_PATH));\r
ASSERT (AcpiAdr != NULL);\r
SetDevicePathNodeLength (AcpiAdr, Length + sizeof (UINT32));\r
}\r
- \r
+\r
(&AcpiAdr->ADR)[Index] = (UINT32) Strtoi (DisplayDeviceStr);\r
}\r
\r
CHAR16 *SidStr;\r
CHAR16 *TidStr;\r
CHAR16 *DidStr;\r
- EFI_GUID PortGid;\r
INFINIBAND_DEVICE_PATH *InfiniBand;\r
\r
FlagsStr = GetNextParamStr (&TextDeviceNode);\r
);\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
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
IN CHAR16 *TextDeviceNode\r
)\r
{\r
- VENDOR_DEFINED_MESSAGING_DEVICE_PATH *Vend;\r
+ VENDOR_DEVICE_PATH *Vend;\r
\r
- Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (\r
+ Vend = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
MESSAGING_DEVICE_PATH,\r
MSG_VENDOR_DP,\r
- (UINT16) sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)\r
+ (UINT16) sizeof (VENDOR_DEVICE_PATH)\r
);\r
\r
CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);\r
MACDevPath->IfType = (UINT8) Strtoi (IfTypeStr);\r
\r
Length = sizeof (EFI_MAC_ADDRESS);\r
- StrToBuf (&MACDevPath->MacAddress.Addr[0], Length, AddressStr);\r
+ if (MACDevPath->IfType == 0x01 || MACDevPath->IfType == 0x00) {\r
+ Length = 6;\r
+ }\r
+\r
+ StrHexToBytes (AddressStr, Length * 2, MACDevPath->MacAddress.Addr, Length);\r
\r
return (EFI_DEVICE_PATH_PROTOCOL *) MACDevPath;\r
}\r
(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
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
(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
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
PIDStr = GetNextParamStr (&TextDeviceNode);\r
if (UsbClassText->ClassExist) {\r
ClassStr = GetNextParamStr (&TextDeviceNode);\r
- UsbClass->DeviceClass = (UINT8) Strtoi (ClassStr);\r
+ if (*ClassStr == L'\0') {\r
+ UsbClass->DeviceClass = 0xFF;\r
+ } else {\r
+ UsbClass->DeviceClass = (UINT8) Strtoi (ClassStr);\r
+ }\r
} else {\r
UsbClass->DeviceClass = UsbClassText->Class;\r
}\r
if (UsbClassText->SubClassExist) {\r
SubClassStr = GetNextParamStr (&TextDeviceNode);\r
- UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);\r
+ if (*SubClassStr == L'\0') {\r
+ UsbClass->DeviceSubClass = 0xFF;\r
+ } else {\r
+ UsbClass->DeviceSubClass = (UINT8) Strtoi (SubClassStr);\r
+ }\r
} else {\r
UsbClass->DeviceSubClass = UsbClassText->SubClass;\r
}\r
\r
ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
\r
- UsbClass->VendorId = (UINT16) Strtoi (VIDStr);\r
- UsbClass->ProductId = (UINT16) Strtoi (PIDStr);\r
- UsbClass->DeviceProtocol = (UINT8) Strtoi (ProtocolStr);\r
+ if (*VIDStr == L'\0') {\r
+ UsbClass->VendorId = 0xFFFF;\r
+ } else {\r
+ UsbClass->VendorId = (UINT16) Strtoi (VIDStr);\r
+ }\r
+ if (*PIDStr == L'\0') {\r
+ UsbClass->ProductId = 0xFFFF;\r
+ } else {\r
+ UsbClass->ProductId = (UINT16) Strtoi (PIDStr);\r
+ }\r
+ if (*ProtocolStr == L'\0') {\r
+ UsbClass->DeviceProtocol = 0xFF;\r
+ } else {\r
+ UsbClass->DeviceProtocol = (UINT8) Strtoi (ProtocolStr);\r
+ }\r
\r
return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;\r
}\r
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
CHAR16 *ProtocolStr;\r
CHAR8 *AsciiStr;\r
ISCSI_DEVICE_PATH_WITH_NAME *ISCSIDevPath;\r
+ UINT64 Lun;\r
\r
NameStr = GetNextParamStr (&TextDeviceNode);\r
PortalGroupStr = GetNextParamStr (&TextDeviceNode);\r
StrToAscii (NameStr, &AsciiStr);\r
\r
ISCSIDevPath->TargetPortalGroupTag = (UINT16) Strtoi (PortalGroupStr);\r
- Strtoi64 (LunStr, &ISCSIDevPath->Lun);\r
+ Strtoi64 (LunStr, &Lun);\r
+ WriteUnaligned64 ((UINT64 *) &ISCSIDevPath->Lun, SwapBytes64 (Lun));\r
\r
Options = 0x0000;\r
if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {\r
\r
ISCSIDevPath->LoginOption = (UINT16) Options;\r
\r
- ISCSIDevPath->NetworkProtocol = (UINT16) StrCmp (ProtocolStr, L"TCP");\r
+ if (IS_NULL (*ProtocolStr) || (StrCmp (ProtocolStr, L"TCP") == 0)) {\r
+ ISCSIDevPath->NetworkProtocol = 0;\r
+ } else {\r
+ //\r
+ // Undefined and reserved.\r
+ //\r
+ ISCSIDevPath->NetworkProtocol = 1;\r
+ }\r
\r
return (EFI_DEVICE_PATH_PROTOCOL *) ISCSIDevPath;\r
}\r
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
+ 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
+ StrHexToBytes (\r
+ BluetoothStr,\r
+ sizeof (BLUETOOTH_ADDRESS) * 2,\r
+ BluetoothDp->BD_ADDR.Address,\r
+ sizeof (BLUETOOTH_ADDRESS)\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 Bluetooth LE device path structure.\r
+\r
+ @param TextDeviceNode The input Text device path node.\r
+\r
+ @return A pointer to the newly-created Bluetooth LE device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextBluetoothLE (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *BluetoothLeAddrStr;\r
+ CHAR16 *BluetoothLeAddrTypeStr;\r
+ BLUETOOTH_LE_DEVICE_PATH *BluetoothLeDp;\r
+\r
+ BluetoothLeAddrStr = GetNextParamStr (&TextDeviceNode);\r
+ BluetoothLeAddrTypeStr = GetNextParamStr (&TextDeviceNode);\r
+ BluetoothLeDp = (BLUETOOTH_LE_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_BLUETOOTH_LE_DP,\r
+ (UINT16) sizeof (BLUETOOTH_LE_DEVICE_PATH)\r
+ );\r
+\r
+ BluetoothLeDp->Address.Type = (UINT8) Strtoi (BluetoothLeAddrTypeStr);\r
+ StrHexToBytes (\r
+ BluetoothLeAddrStr, sizeof (BluetoothLeDp->Address.Address) * 2,\r
+ BluetoothLeDp->Address.Address, sizeof (BluetoothLeDp->Address.Address)\r
+ );\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) BluetoothLeDp;\r
+}\r
+\r
+/**\r
+ Converts a text device path node to DNS device path structure.\r
+\r
+ @param TextDeviceNode The input Text device path node.\r
+\r
+ @return A pointer to the newly-created DNS device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextDns (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *DeviceNodeStr;\r
+ CHAR16 *DeviceNodeStrPtr;\r
+ UINT32 DnsServerIpCount;\r
+ UINT16 DnsDeviceNodeLength;\r
+ DNS_DEVICE_PATH *DnsDeviceNode;\r
+ UINT32 DnsServerIpIndex;\r
+ CHAR16 *DnsServerIp;\r
+\r
+\r
+ //\r
+ // Count the DNS server address number.\r
+ //\r
+ DeviceNodeStr = UefiDevicePathLibStrDuplicate (TextDeviceNode);\r
+ if (DeviceNodeStr == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ DeviceNodeStrPtr = DeviceNodeStr;\r
+\r
+ DnsServerIpCount = 0;\r
+ while (DeviceNodeStrPtr != NULL && *DeviceNodeStrPtr != L'\0') {\r
+ GetNextParamStr (&DeviceNodeStrPtr);\r
+ DnsServerIpCount ++;\r
+ }\r
+\r
+ FreePool (DeviceNodeStr);\r
+ DeviceNodeStr = NULL;\r
+\r
+ //\r
+ // One or more instances of the DNS server address in EFI_IP_ADDRESS,\r
+ // otherwise, NULL will be returned.\r
+ //\r
+ if (DnsServerIpCount == 0) {\r
+ return NULL;\r
+ }\r
+\r
+ //\r
+ // Create the DNS DeviceNode.\r
+ //\r
+ DnsDeviceNodeLength = (UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (UINT8) + DnsServerIpCount * sizeof (EFI_IP_ADDRESS));\r
+ DnsDeviceNode = (DNS_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_DNS_DP,\r
+ DnsDeviceNodeLength\r
+ );\r
+ if (DnsDeviceNode == NULL) {\r
+ return NULL;\r
+ }\r
+\r
+ //\r
+ // Confirm the DNS server address is IPv4 or IPv6 type.\r
+ //\r
+ DeviceNodeStrPtr = TextDeviceNode;\r
+ while (!IS_NULL (*DeviceNodeStrPtr)) {\r
+ if (*DeviceNodeStrPtr == L'.') {\r
+ DnsDeviceNode->IsIPv6 = 0x00;\r
+ break;\r
+ }\r
+\r
+ if (*DeviceNodeStrPtr == L':') {\r
+ DnsDeviceNode->IsIPv6 = 0x01;\r
+ break;\r
+ }\r
+\r
+ DeviceNodeStrPtr++;\r
+ }\r
+\r
+ for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount; DnsServerIpIndex++) {\r
+ DnsServerIp = GetNextParamStr (&TextDeviceNode);\r
+ if (DnsDeviceNode->IsIPv6 == 0x00) {\r
+ StrToIpv4Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v4), NULL);\r
+ } else {\r
+ StrToIpv6Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v6), NULL);\r
+ }\r
+ }\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) DnsDeviceNode;\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
CHAR16 *StartStr;\r
CHAR16 *SizeStr;\r
UINT32 Signature32;\r
- EFI_GUID SignatureGuid;\r
HARDDRIVE_DEVICE_PATH *Hd;\r
\r
PartitionStr = GetNextParamStr (&TextDeviceNode);\r
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
(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
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
(UINT16) sizeof (SATA_DEVICE_PATH)\r
);\r
Sata->HBAPortNumber = (UINT16) Strtoi (Param1);\r
- Sata->PortMultiplierPortNumber = (UINT16) Strtoi (Param2);\r
+\r
+ //\r
+ // According to UEFI spec, if PMPN is not provided, the default is 0xFFFF\r
+ //\r
+ if (*Param2 == L'\0' ) {\r
+ Sata->PortMultiplierPortNumber = 0xFFFF;\r
+ } else {\r
+ Sata->PortMultiplierPortNumber = (UINT16) Strtoi (Param2);\r
+ }\r
Sata->Lun = (UINT16) Strtoi (Param3);\r
\r
return (EFI_DEVICE_PATH_PROTOCOL *) Sata;\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"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
{L"Unit", DevPathFromTextUnit },\r
{L"iSCSI", DevPathFromTextiSCSI },\r
{L"Vlan", DevPathFromTextVlan },\r
-\r
+ {L"Dns", DevPathFromTextDns },\r
+ {L"Uri", DevPathFromTextUri },\r
+ {L"Bluetooth", DevPathFromTextBluetooth },\r
+ {L"Wi-Fi", DevPathFromTextWiFi },\r
+ {L"BluetoothLE", DevPathFromTextBluetoothLE },\r
{L"MediaPath", DevPathFromTextMediaPath },\r
{L"HD", DevPathFromTextHD },\r
{L"CDROM", DevPathFromTextCDROM },\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
DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
ASSERT (DeviceNode != NULL);\r
SetDevicePathEndNode (DeviceNode);\r
+ DeviceNode->SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE;\r
\r
NewDevicePath = AppendDevicePathNode (DevicePath, DeviceNode);\r
FreePool (DevicePath);\r