/** @file\r
DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
\r
-Copyright (c) 2013 - 2015, 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
}\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
- 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
);\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
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 *) 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
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
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
\r
ISCSIDevPath->LoginOption = (UINT16) Options;\r
\r
- ISCSIDevPath->NetworkProtocol = (UINT16) StrCmp (ProtocolStr, L"TCP");\r
+ if (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
)\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
- while (!IS_NULL(BluetoothStr) && Index >= 0) {\r
- Walker = SplitStr (&BluetoothStr, L':');\r
- TempBufferSize = StrSize (Walker) + StrLen (L"0x") * sizeof (CHAR16);\r
- TempNumBuffer = AllocateZeroPool (TempBufferSize);\r
- if (TempNumBuffer == NULL) {\r
- break;\r
- }\r
- StrnCpy (TempNumBuffer, L"0x", TempBufferSize / sizeof (CHAR16));\r
- StrnCat (TempNumBuffer + StrLen (L"0x"), Walker, TempBufferSize / sizeof (CHAR16) - StrLen (L"0x") );\r
- BluetoothDp->BD_ADDR.Address[Index] = (UINT8)Strtoi (TempNumBuffer);\r
- FreePool (TempNumBuffer);\r
- Index--;\r
- }\r
- \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
{\r
CHAR16 *SSIdStr;\r
- CHAR8 *AsciiStr;\r
+ CHAR8 AsciiStr[33];\r
+ UINTN DataLen;\r
WIFI_DEVICE_PATH *WiFiDp;\r
\r
SSIdStr = GetNextParamStr (&TextDeviceNode);\r
(UINT16) sizeof (WIFI_DEVICE_PATH)\r
);\r
\r
- AsciiStr = (CHAR8 *) WiFiDp->SSId;\r
- StrToAscii (SSIdStr, &AsciiStr);\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
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
{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"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
+ {L"Dns", DevPathFromTextDns },\r
{L"Uri", DevPathFromTextUri },\r
{L"Bluetooth", DevPathFromTextBluetooth },\r
- {L"WiFi", DevPathFromTextWiFi },\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