3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 DevicePathFromText protocol as defined in the UEFI 2.0 specification.
22 #include "DevicePath.h"
45 Length
= StrLen ((CHAR16
*) Src
);
47 ReturnStr
= AllocateCopyPool ((Length
+ 1) * sizeof (CHAR16
), (VOID
*) Src
);
61 Get parameter in a pair of parentheses follow the given node name.
62 For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".
65 Str - Device Path Text
66 NodeName - Name of the node
69 Parameter text for the node
76 UINTN ParameterLength
;
79 // Check whether the node name matchs
81 NodeNameLength
= StrLen (NodeName
);
82 if (CompareMem (Str
, NodeName
, NodeNameLength
* sizeof (CHAR16
)) != 0) {
86 ParamStr
= Str
+ NodeNameLength
;
87 if (!IS_LEFT_PARENTH (*ParamStr
)) {
92 // Skip the found '(' and find first occurrence of ')'
96 StrPointer
= ParamStr
;
97 while (!IS_NULL (*StrPointer
)) {
98 if (IS_RIGHT_PARENTH (*StrPointer
)) {
104 if (IS_NULL (*StrPointer
)) {
111 ParamStr
= AllocateCopyPool ((ParameterLength
+ 1) * sizeof (CHAR16
), ParamStr
);
112 if (ParamStr
== NULL
) {
116 // Terminate the parameter string
118 ParamStr
[ParameterLength
] = L
'\0';
126 IN OUT CHAR16
**List
,
132 Get current sub-string from a string list, before return
133 the list header is moved to next sub-string. The sub-string is separated
134 by the specified character. For example, the separator is ',', the string
135 list is "2,0,3", it returns "2", the remain list move to "0,3"
138 List - A string list separated by the specified separator
139 Separator - The separator character
142 pointer - The current sub-string
152 if (IS_NULL (*Str
)) {
157 // Find first occurrence of the separator
159 while (!IS_NULL (*Str
)) {
160 if (*Str
== Separator
) {
166 if (*Str
== Separator
) {
168 // Find a sub-string, terminate it
175 // Move to next sub-string
189 // The separator is comma
191 return SplitStr (List
, L
',');
196 GetNextDeviceNodeStr (
197 IN OUT CHAR16
**DevicePath
,
198 OUT BOOLEAN
*IsInstanceEnd
203 Get one device node from entire device path text.
206 Str - The entire device path text string
207 IsInstanceEnd - This node is the end of a device path instance
210 a pointer - A device node text
211 NULL - No more device node available
217 UINTN ParenthesesStack
;
220 if (IS_NULL (*Str
)) {
225 // Skip the leading '/', '(', ')' and ','
227 while (!IS_NULL (*Str
)) {
228 if (!IS_SLASH (*Str
) &&
230 !IS_LEFT_PARENTH (*Str
) &&
231 !IS_RIGHT_PARENTH (*Str
)) {
240 // Scan for the separator of this device node, '/' or ','
242 ParenthesesStack
= 0;
243 while (!IS_NULL (*Str
)) {
244 if ((IS_COMMA (*Str
) || IS_SLASH (*Str
)) && (ParenthesesStack
== 0)) {
248 if (IS_LEFT_PARENTH (*Str
)) {
250 } else if (IS_RIGHT_PARENTH (*Str
)) {
257 if (ParenthesesStack
!= 0) {
259 // The '(' doesn't pair with ')', invalid device path text
264 if (IS_COMMA (*Str
)) {
265 *IsInstanceEnd
= TRUE
;
269 *IsInstanceEnd
= FALSE
;
270 if (!IS_NULL (*Str
)) {
290 Determines if a Unicode character is a hexadecimal digit.
291 The test is case insensitive.
294 Digit - Pointer to byte that receives the value of the hex character.
295 Char - Unicode character to test.
298 TRUE - If the character is a hexadecimal digit.
303 if ((Char
>= L
'0') && (Char
<= L
'9')) {
304 *Digit
= (UINT8
) (Char
- L
'0');
308 if ((Char
>= L
'A') && (Char
<= L
'F')) {
309 *Digit
= (UINT8
) (Char
- L
'A' + 0x0A);
313 if ((Char
>= L
'a') && (Char
<= L
'f')) {
314 *Digit
= (UINT8
) (Char
- L
'a' + 0x0A);
327 OUT UINTN
*ConvertedStrLen OPTIONAL
332 Converts Unicode string to binary buffer.
333 The conversion may be partial.
334 The first character in the string that is not hex digit stops the conversion.
335 At a minimum, any blob of data could be represented as a hex string.
338 Buf - Pointer to buffer that receives the data.
339 Len - Length in bytes of the buffer to hold converted data.
340 If routine return with EFI_SUCCESS, containing length of converted data.
341 If routine return with EFI_BUFFER_TOO_SMALL, containg length of buffer desired.
342 Str - String to be converted from.
343 ConvertedStrLen - Length of the Hex String consumed.
346 EFI_SUCCESS: Routine Success.
347 EFI_BUFFER_TOO_SMALL: The buffer is too small to hold converted data.
359 // Find out how many hex characters the string has.
361 for (Idx
= 0, HexCnt
= 0; IsHexDigit (&Digit
, Str
[Idx
]); Idx
++, HexCnt
++);
368 // Two Unicode characters make up 1 buffer byte. Round up.
370 BufferLength
= (HexCnt
+ 1) / 2;
373 // Test if buffer is passed enough.
375 if (BufferLength
> (*Len
)) {
377 return EFI_BUFFER_TOO_SMALL
;
382 for (Idx
= 0; Idx
< HexCnt
; Idx
++) {
384 IsHexDigit (&Digit
, Str
[HexCnt
- 1 - Idx
]);
387 // For odd charaters, write the lower nibble for each buffer byte,
388 // and for even characters, the upper nibble.
390 if ((Idx
& 1) == 0) {
395 Byte
= (UINT8
) (Byte
| Digit
<< 4);
401 if (ConvertedStrLen
!= NULL
) {
402 *ConvertedStrLen
= HexCnt
;
417 Skip the leading white space and '0x' or '0X' of a integer string
420 Str - The integer string
421 IsHex - 1: Hex string, 0: Decimal string
430 // skip preceeding white space
432 while (*Str
&& *Str
== ' ') {
436 // skip preceeding zeros
438 while (*Str
&& *Str
== '0') {
442 // skip preceeding character 'x' or 'X'
444 if (*Str
&& (*Str
== 'x' || *Str
== 'X')) {
461 Convert hex string to uint
474 ASSERT (Str
!= NULL
);
477 // convert hex digits
480 Length
= sizeof (UINTN
);
481 HexStringToBuf ((UINT8
*) &Rvalue
, &Length
, Str
, NULL
);
496 Convert hex string to 64 bit data.
509 Length
= sizeof (UINT64
);
510 HexStringToBuf ((UINT8
*) Data
, &Length
, Str
, NULL
);
522 Convert decimal string to uint
537 ASSERT (str
!= NULL
);
539 High
= (UINTN
) -1 / 10;
540 Low
= (UINTN
) -1 % 10;
542 // skip preceeding white space
544 while (*str
&& *str
== ' ') {
553 if (Char
>= '0' && Char
<= '9') {
554 if ((Rvalue
> High
|| Rvalue
== High
) && (Char
- '0' > (INTN
) Low
)) {
558 Rvalue
= (Rvalue
* 10) + Char
- '0';
579 Convert decimal string to uint
594 ASSERT (str
!= NULL
);
595 ASSERT (Data
!= NULL
);
598 // skip preceeding white space
600 while (*str
&& *str
== ' ') {
609 if (Char
>= '0' && Char
<= '9') {
610 High
= LShiftU64 (Rvalue
, 3);
611 Low
= LShiftU64 (Rvalue
, 1);
612 Rvalue
= High
+ Low
+ Char
- '0';
632 Convert integer string to uint.
636 Str - The integer string. If leading with "0x" or "0X", it's heximal.
644 Str
= TrimHexStr (Str
, &IsHex
);
663 Convert integer string to 64 bit data.
667 Str - The integer string. If leading with "0x" or "0X", it's heximal.
675 Str
= TrimHexStr (Str
, &IsHex
);
688 IN UINTN BufferLength
,
698 // Two hex char make up one byte
700 StrLength
= BufferLength
* sizeof (CHAR16
);
702 for(Index
= 0; Index
< StrLength
; Index
++, Str
++) {
704 IsHexDigit (&Digit
, *Str
);
707 // For odd charaters, write the upper nibble for each buffer byte,
708 // and for even characters, the lower nibble.
710 if ((Index
& 1) == 0) {
711 Byte
= (UINT8
) (Digit
<< 4);
713 Byte
= Buf
[Index
/ 2];
715 Byte
= (UINT8
) (Byte
| Digit
);
718 Buf
[Index
/ 2] = Byte
;
732 UINTN ConvertedStrLen
;
735 BufferLength
= sizeof (Guid
->Data1
);
736 Status
= HexStringToBuf ((UINT8
*) &Guid
->Data1
, &BufferLength
, Str
, &ConvertedStrLen
);
737 if (EFI_ERROR (Status
)) {
740 Str
+= ConvertedStrLen
;
741 if (IS_HYPHEN (*Str
)) {
744 return EFI_UNSUPPORTED
;
747 BufferLength
= sizeof (Guid
->Data2
);
748 Status
= HexStringToBuf ((UINT8
*) &Guid
->Data2
, &BufferLength
, Str
, &ConvertedStrLen
);
749 if (EFI_ERROR (Status
)) {
752 Str
+= ConvertedStrLen
;
753 if (IS_HYPHEN (*Str
)) {
756 return EFI_UNSUPPORTED
;
759 BufferLength
= sizeof (Guid
->Data3
);
760 Status
= HexStringToBuf ((UINT8
*) &Guid
->Data3
, &BufferLength
, Str
, &ConvertedStrLen
);
761 if (EFI_ERROR (Status
)) {
764 Str
+= ConvertedStrLen
;
765 if (IS_HYPHEN (*Str
)) {
768 return EFI_UNSUPPORTED
;
771 StrToBuf (&Guid
->Data4
[0], 2, Str
);
773 // Skip 2 byte hex chars
777 if (IS_HYPHEN (*Str
)) {
780 return EFI_UNSUPPORTED
;
782 StrToBuf (&Guid
->Data4
[2], 6, Str
);
791 OUT EFI_IPv4_ADDRESS
*IPv4Addr
796 for (Index
= 0; Index
< 4; Index
++) {
797 IPv4Addr
->Addr
[Index
] = (UINT8
) Dtoi (SplitStr (Str
, L
'.'));
805 OUT EFI_IPv6_ADDRESS
*IPv6Addr
811 for (Index
= 0; Index
< 8; Index
++) {
812 Data
= (UINT16
) Xtoi (SplitStr (Str
, L
':'));
813 IPv6Addr
->Addr
[Index
* 2] = (UINT8
) (Data
>> 8);
814 IPv6Addr
->Addr
[Index
* 2 + 1] = (UINT8
) (Data
& 0xff);
822 IN OUT CHAR8
**AsciiStr
828 while (!IS_NULL (*Str
)) {
829 *(Dest
++) = (CHAR8
) *(Str
++);
834 // Return the string next to it
836 *AsciiStr
= Dest
+ 1;
840 EFI_DEVICE_PATH_PROTOCOL
*
842 IN CHAR16
*TextDeviceNode
847 PCI_DEVICE_PATH
*Pci
;
849 DeviceStr
= GetNextParamStr (&TextDeviceNode
);
850 FunctionStr
= GetNextParamStr (&TextDeviceNode
);
851 Pci
= (PCI_DEVICE_PATH
*) CreateDeviceNode (
852 HARDWARE_DEVICE_PATH
,
854 sizeof (PCI_DEVICE_PATH
)
857 Pci
->Function
= (UINT8
) Strtoi (FunctionStr
);
858 Pci
->Device
= (UINT8
) Strtoi (DeviceStr
);
860 return (EFI_DEVICE_PATH_PROTOCOL
*) Pci
;
864 EFI_DEVICE_PATH_PROTOCOL
*
865 DevPathFromTextPcCard (
866 IN CHAR16
*TextDeviceNode
869 CHAR16
*FunctionNumberStr
;
870 PCCARD_DEVICE_PATH
*Pccard
;
872 FunctionNumberStr
= GetNextParamStr (&TextDeviceNode
);
873 Pccard
= (PCCARD_DEVICE_PATH
*) CreateDeviceNode (
874 HARDWARE_DEVICE_PATH
,
876 sizeof (PCCARD_DEVICE_PATH
)
879 Pccard
->FunctionNumber
= (UINT8
) Strtoi (FunctionNumberStr
);
881 return (EFI_DEVICE_PATH_PROTOCOL
*) Pccard
;
885 EFI_DEVICE_PATH_PROTOCOL
*
886 DevPathFromTextMemoryMapped (
887 IN CHAR16
*TextDeviceNode
890 CHAR16
*MemoryTypeStr
;
891 CHAR16
*StartingAddressStr
;
892 CHAR16
*EndingAddressStr
;
893 MEMMAP_DEVICE_PATH
*MemMap
;
895 MemoryTypeStr
= GetNextParamStr (&TextDeviceNode
);
896 StartingAddressStr
= GetNextParamStr (&TextDeviceNode
);
897 EndingAddressStr
= GetNextParamStr (&TextDeviceNode
);
898 MemMap
= (MEMMAP_DEVICE_PATH
*) CreateDeviceNode (
899 HARDWARE_DEVICE_PATH
,
901 sizeof (MEMMAP_DEVICE_PATH
)
904 MemMap
->MemoryType
= (UINT32
) Strtoi (MemoryTypeStr
);
905 Strtoi64 (StartingAddressStr
, &MemMap
->StartingAddress
);
906 Strtoi64 (EndingAddressStr
, &MemMap
->EndingAddress
);
908 return (EFI_DEVICE_PATH_PROTOCOL
*) MemMap
;
912 EFI_DEVICE_PATH_PROTOCOL
*
913 ConvertFromTextVendor (
914 IN CHAR16
*TextDeviceNode
,
922 VENDOR_DEVICE_PATH
*Vendor
;
924 GuidStr
= GetNextParamStr (&TextDeviceNode
);
926 DataStr
= GetNextParamStr (&TextDeviceNode
);
927 Length
= StrLen (DataStr
);
929 // Two hex characters make up 1 buffer byte
931 Length
= (Length
+ 1) / 2;
933 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
936 (UINT16
) (sizeof (VENDOR_DEVICE_PATH
) + Length
)
939 StrToGuid (GuidStr
, &Vendor
->Guid
);
940 StrToBuf (((UINT8
*) Vendor
) + sizeof (VENDOR_DEVICE_PATH
), Length
, DataStr
);
942 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
946 EFI_DEVICE_PATH_PROTOCOL
*
947 DevPathFromTextVenHw (
948 IN CHAR16
*TextDeviceNode
951 return ConvertFromTextVendor (
953 HARDWARE_DEVICE_PATH
,
959 EFI_DEVICE_PATH_PROTOCOL
*
960 DevPathFromTextCtrl (
961 IN CHAR16
*TextDeviceNode
964 CHAR16
*ControllerStr
;
965 CONTROLLER_DEVICE_PATH
*Controller
;
967 ControllerStr
= GetNextParamStr (&TextDeviceNode
);
968 Controller
= (CONTROLLER_DEVICE_PATH
*) CreateDeviceNode (
969 HARDWARE_DEVICE_PATH
,
971 sizeof (CONTROLLER_DEVICE_PATH
)
973 Controller
->ControllerNumber
= (UINT32
) Strtoi (ControllerStr
);
975 return (EFI_DEVICE_PATH_PROTOCOL
*) Controller
;
987 PnpId
= Xtoi (Text
+ 3);
988 *EisaId
= (((Text
[0] - '@') & 0x1f) << 10) +
989 (((Text
[1] - '@') & 0x1f) << 5) +
990 ((Text
[2] - '@') & 0x1f) +
991 (UINT32
) (PnpId
<< 16);
994 EFI_DEVICE_PATH_PROTOCOL
*
995 DevPathFromTextAcpi (
996 IN CHAR16
*TextDeviceNode
1001 ACPI_HID_DEVICE_PATH
*Acpi
;
1003 HIDStr
= GetNextParamStr (&TextDeviceNode
);
1004 UIDStr
= GetNextParamStr (&TextDeviceNode
);
1005 Acpi
= (ACPI_HID_DEVICE_PATH
*) CreateDeviceNode (
1008 sizeof (ACPI_HID_DEVICE_PATH
)
1011 EisaIdFromText (HIDStr
, &Acpi
->HID
);
1012 Acpi
->UID
= (UINT32
) Strtoi (UIDStr
);
1014 return (EFI_DEVICE_PATH_PROTOCOL
*) Acpi
;
1018 EFI_DEVICE_PATH_PROTOCOL
*
1019 ConvertFromTextAcpi (
1020 IN CHAR16
*TextDeviceNode
,
1025 ACPI_HID_DEVICE_PATH
*Acpi
;
1027 UIDStr
= GetNextParamStr (&TextDeviceNode
);
1028 Acpi
= (ACPI_HID_DEVICE_PATH
*) CreateDeviceNode (
1031 sizeof (ACPI_HID_DEVICE_PATH
)
1034 Acpi
->HID
= EFI_PNP_ID (PnPId
);
1035 Acpi
->UID
= (UINT32
) Strtoi (UIDStr
);
1037 return (EFI_DEVICE_PATH_PROTOCOL
*) Acpi
;
1041 EFI_DEVICE_PATH_PROTOCOL
*
1042 DevPathFromTextPciRoot (
1043 IN CHAR16
*TextDeviceNode
1046 return ConvertFromTextAcpi (TextDeviceNode
, 0x0a03);
1050 EFI_DEVICE_PATH_PROTOCOL
*
1051 DevPathFromTextFloppy (
1052 IN CHAR16
*TextDeviceNode
1055 return ConvertFromTextAcpi (TextDeviceNode
, 0x0604);
1059 EFI_DEVICE_PATH_PROTOCOL
*
1060 DevPathFromTextKeyboard (
1061 IN CHAR16
*TextDeviceNode
1064 return ConvertFromTextAcpi (TextDeviceNode
, 0x0301);
1068 EFI_DEVICE_PATH_PROTOCOL
*
1069 DevPathFromTextSerial (
1070 IN CHAR16
*TextDeviceNode
1073 return ConvertFromTextAcpi (TextDeviceNode
, 0x0501);
1077 EFI_DEVICE_PATH_PROTOCOL
*
1078 DevPathFromTextParallelPort (
1079 IN CHAR16
*TextDeviceNode
1082 return ConvertFromTextAcpi (TextDeviceNode
, 0x0401);
1086 EFI_DEVICE_PATH_PROTOCOL
*
1087 DevPathFromTextAcpiEx (
1088 IN CHAR16
*TextDeviceNode
1099 ACPI_EXTENDED_HID_DEVICE_PATH
*AcpiEx
;
1101 HIDStr
= GetNextParamStr (&TextDeviceNode
);
1102 CIDStr
= GetNextParamStr (&TextDeviceNode
);
1103 UIDStr
= GetNextParamStr (&TextDeviceNode
);
1104 HIDSTRStr
= GetNextParamStr (&TextDeviceNode
);
1105 CIDSTRStr
= GetNextParamStr (&TextDeviceNode
);
1106 UIDSTRStr
= GetNextParamStr (&TextDeviceNode
);
1108 Length
= (UINT16
) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH
) + StrLen (HIDSTRStr
) + 1);
1109 Length
= (UINT16
) (Length
+ StrLen (UIDSTRStr
) + 1);
1110 Length
= (UINT16
) (Length
+ StrLen (CIDSTRStr
) + 1);
1111 AcpiEx
= (ACPI_EXTENDED_HID_DEVICE_PATH
*) CreateDeviceNode (
1117 EisaIdFromText (HIDStr
, &AcpiEx
->HID
);
1118 EisaIdFromText (CIDStr
, &AcpiEx
->CID
);
1119 AcpiEx
->UID
= (UINT32
) Strtoi (UIDStr
);
1121 AsciiStr
= (CHAR8
*) ((UINT8
*)AcpiEx
+ sizeof (ACPI_EXTENDED_HID_DEVICE_PATH
));
1122 StrToAscii (HIDSTRStr
, &AsciiStr
);
1123 StrToAscii (UIDSTRStr
, &AsciiStr
);
1124 StrToAscii (CIDSTRStr
, &AsciiStr
);
1126 return (EFI_DEVICE_PATH_PROTOCOL
*) AcpiEx
;
1130 EFI_DEVICE_PATH_PROTOCOL
*
1131 DevPathFromTextAcpiExp (
1132 IN CHAR16
*TextDeviceNode
1140 ACPI_EXTENDED_HID_DEVICE_PATH
*AcpiEx
;
1142 HIDStr
= GetNextParamStr (&TextDeviceNode
);
1143 CIDStr
= GetNextParamStr (&TextDeviceNode
);
1144 UIDSTRStr
= GetNextParamStr (&TextDeviceNode
);
1145 Length
= (UINT16
) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH
) + StrLen (UIDSTRStr
) + 3);
1146 AcpiEx
= (ACPI_EXTENDED_HID_DEVICE_PATH
*) CreateDeviceNode (
1152 EisaIdFromText (HIDStr
, &AcpiEx
->HID
);
1153 EisaIdFromText (CIDStr
, &AcpiEx
->CID
);
1156 AsciiStr
= (CHAR8
*) ((UINT8
*)AcpiEx
+ sizeof (ACPI_EXTENDED_HID_DEVICE_PATH
));
1158 // HID string is NULL
1162 // Convert UID string
1165 StrToAscii (UIDSTRStr
, &AsciiStr
);
1167 // CID string is NULL
1171 return (EFI_DEVICE_PATH_PROTOCOL
*) AcpiEx
;
1175 EFI_DEVICE_PATH_PROTOCOL
*
1176 DevPathFromTextAta (
1177 IN CHAR16
*TextDeviceNode
1180 CHAR16
*PrimarySecondaryStr
;
1181 CHAR16
*SlaveMasterStr
;
1183 ATAPI_DEVICE_PATH
*Atapi
;
1185 Atapi
= (ATAPI_DEVICE_PATH
*) CreateDeviceNode (
1186 MESSAGING_DEVICE_PATH
,
1188 sizeof (ATAPI_DEVICE_PATH
)
1191 PrimarySecondaryStr
= GetNextParamStr (&TextDeviceNode
);
1192 SlaveMasterStr
= GetNextParamStr (&TextDeviceNode
);
1193 LunStr
= GetNextParamStr (&TextDeviceNode
);
1195 Atapi
->PrimarySecondary
= (UINT8
) ((StrCmp (PrimarySecondaryStr
, L
"Primary") == 0) ? 0 : 1);
1196 Atapi
->SlaveMaster
= (UINT8
) ((StrCmp (SlaveMasterStr
, L
"Master") == 0) ? 0 : 1);
1197 Atapi
->Lun
= (UINT16
) Strtoi (LunStr
);
1199 return (EFI_DEVICE_PATH_PROTOCOL
*) Atapi
;
1203 EFI_DEVICE_PATH_PROTOCOL
*
1204 DevPathFromTextScsi (
1205 IN CHAR16
*TextDeviceNode
1210 SCSI_DEVICE_PATH
*Scsi
;
1212 PunStr
= GetNextParamStr (&TextDeviceNode
);
1213 LunStr
= GetNextParamStr (&TextDeviceNode
);
1214 Scsi
= (SCSI_DEVICE_PATH
*) CreateDeviceNode (
1215 MESSAGING_DEVICE_PATH
,
1217 sizeof (SCSI_DEVICE_PATH
)
1220 Scsi
->Pun
= (UINT16
) Strtoi (PunStr
);
1221 Scsi
->Lun
= (UINT16
) Strtoi (LunStr
);
1223 return (EFI_DEVICE_PATH_PROTOCOL
*) Scsi
;
1227 EFI_DEVICE_PATH_PROTOCOL
*
1228 DevPathFromTextFibre (
1229 IN CHAR16
*TextDeviceNode
1234 FIBRECHANNEL_DEVICE_PATH
*Fibre
;
1236 WWNStr
= GetNextParamStr (&TextDeviceNode
);
1237 LunStr
= GetNextParamStr (&TextDeviceNode
);
1238 Fibre
= (FIBRECHANNEL_DEVICE_PATH
*) CreateDeviceNode (
1239 MESSAGING_DEVICE_PATH
,
1240 MSG_FIBRECHANNEL_DP
,
1241 sizeof (FIBRECHANNEL_DEVICE_PATH
)
1244 Fibre
->Reserved
= 0;
1245 Strtoi64 (WWNStr
, &Fibre
->WWN
);
1246 Strtoi64 (LunStr
, &Fibre
->Lun
);
1248 return (EFI_DEVICE_PATH_PROTOCOL
*) Fibre
;
1252 EFI_DEVICE_PATH_PROTOCOL
*
1253 DevPathFromText1394 (
1254 IN CHAR16
*TextDeviceNode
1258 F1394_DEVICE_PATH
*F1394
;
1260 GuidStr
= GetNextParamStr (&TextDeviceNode
);
1261 F1394
= (F1394_DEVICE_PATH
*) CreateDeviceNode (
1262 MESSAGING_DEVICE_PATH
,
1264 sizeof (F1394_DEVICE_PATH
)
1267 F1394
->Reserved
= 0;
1268 Xtoi64 (GuidStr
, &F1394
->Guid
);
1270 return (EFI_DEVICE_PATH_PROTOCOL
*) F1394
;
1274 EFI_DEVICE_PATH_PROTOCOL
*
1275 DevPathFromTextUsb (
1276 IN CHAR16
*TextDeviceNode
1280 CHAR16
*InterfaceStr
;
1281 USB_DEVICE_PATH
*Usb
;
1283 PortStr
= GetNextParamStr (&TextDeviceNode
);
1284 InterfaceStr
= GetNextParamStr (&TextDeviceNode
);
1285 Usb
= (USB_DEVICE_PATH
*) CreateDeviceNode (
1286 MESSAGING_DEVICE_PATH
,
1288 sizeof (USB_DEVICE_PATH
)
1291 Usb
->ParentPortNumber
= (UINT8
) Strtoi (PortStr
);
1292 Usb
->InterfaceNumber
= (UINT8
) Strtoi (InterfaceStr
);
1294 return (EFI_DEVICE_PATH_PROTOCOL
*) Usb
;
1298 EFI_DEVICE_PATH_PROTOCOL
*
1299 DevPathFromTextI2O (
1300 IN CHAR16
*TextDeviceNode
1304 I2O_DEVICE_PATH
*I2O
;
1306 TIDStr
= GetNextParamStr (&TextDeviceNode
);
1307 I2O
= (I2O_DEVICE_PATH
*) CreateDeviceNode (
1308 MESSAGING_DEVICE_PATH
,
1310 sizeof (I2O_DEVICE_PATH
)
1313 I2O
->Tid
= (UINT32
) Strtoi (TIDStr
);
1315 return (EFI_DEVICE_PATH_PROTOCOL
*) I2O
;
1319 EFI_DEVICE_PATH_PROTOCOL
*
1320 DevPathFromTextInfiniband (
1321 IN CHAR16
*TextDeviceNode
1330 INFINIBAND_DEVICE_PATH
*InfiniBand
;
1332 FlagsStr
= GetNextParamStr (&TextDeviceNode
);
1333 GuidStr
= GetNextParamStr (&TextDeviceNode
);
1334 SidStr
= GetNextParamStr (&TextDeviceNode
);
1335 TidStr
= GetNextParamStr (&TextDeviceNode
);
1336 DidStr
= GetNextParamStr (&TextDeviceNode
);
1337 InfiniBand
= (INFINIBAND_DEVICE_PATH
*) CreateDeviceNode (
1338 MESSAGING_DEVICE_PATH
,
1340 sizeof (INFINIBAND_DEVICE_PATH
)
1343 InfiniBand
->ResourceFlags
= (UINT32
) Strtoi (FlagsStr
);
1344 StrToGuid (GuidStr
, &PortGid
);
1345 CopyMem (InfiniBand
->PortGid
, &PortGid
, sizeof (EFI_GUID
));
1346 Strtoi64 (SidStr
, &InfiniBand
->ServiceId
);
1347 Strtoi64 (TidStr
, &InfiniBand
->TargetPortId
);
1348 Strtoi64 (DidStr
, &InfiniBand
->DeviceId
);
1350 return (EFI_DEVICE_PATH_PROTOCOL
*) InfiniBand
;
1354 EFI_DEVICE_PATH_PROTOCOL
*
1355 DevPathFromTextVenMsg (
1356 IN CHAR16
*TextDeviceNode
1359 return ConvertFromTextVendor (
1361 MESSAGING_DEVICE_PATH
,
1367 EFI_DEVICE_PATH_PROTOCOL
*
1368 DevPathFromTextVenPcAnsi (
1369 IN CHAR16
*TextDeviceNode
1372 VENDOR_DEVICE_PATH
*Vendor
;
1374 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
1375 MESSAGING_DEVICE_PATH
,
1377 sizeof (VENDOR_DEVICE_PATH
));
1378 CopyGuid (&Vendor
->Guid
, &gEfiPcAnsiGuid
);
1380 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
1384 EFI_DEVICE_PATH_PROTOCOL
*
1385 DevPathFromTextVenVt100 (
1386 IN CHAR16
*TextDeviceNode
1389 VENDOR_DEVICE_PATH
*Vendor
;
1391 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
1392 MESSAGING_DEVICE_PATH
,
1394 sizeof (VENDOR_DEVICE_PATH
));
1395 CopyGuid (&Vendor
->Guid
, &gEfiVT100Guid
);
1397 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
1401 EFI_DEVICE_PATH_PROTOCOL
*
1402 DevPathFromTextVenVt100Plus (
1403 IN CHAR16
*TextDeviceNode
1406 VENDOR_DEVICE_PATH
*Vendor
;
1408 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
1409 MESSAGING_DEVICE_PATH
,
1411 sizeof (VENDOR_DEVICE_PATH
));
1412 CopyGuid (&Vendor
->Guid
, &gEfiVT100PlusGuid
);
1414 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
1418 EFI_DEVICE_PATH_PROTOCOL
*
1419 DevPathFromTextVenUtf8 (
1420 IN CHAR16
*TextDeviceNode
1423 VENDOR_DEVICE_PATH
*Vendor
;
1425 Vendor
= (VENDOR_DEVICE_PATH
*) CreateDeviceNode (
1426 MESSAGING_DEVICE_PATH
,
1428 sizeof (VENDOR_DEVICE_PATH
));
1429 CopyGuid (&Vendor
->Guid
, &gEfiVTUTF8Guid
);
1431 return (EFI_DEVICE_PATH_PROTOCOL
*) Vendor
;
1435 EFI_DEVICE_PATH_PROTOCOL
*
1436 DevPathFromTextUartFlowCtrl (
1437 IN CHAR16
*TextDeviceNode
1441 UART_FLOW_CONTROL_DEVICE_PATH
*UartFlowControl
;
1443 ValueStr
= GetNextParamStr (&TextDeviceNode
);
1444 UartFlowControl
= (UART_FLOW_CONTROL_DEVICE_PATH
*) CreateDeviceNode (
1445 MESSAGING_DEVICE_PATH
,
1447 sizeof (UART_FLOW_CONTROL_DEVICE_PATH
)
1450 CopyGuid (&UartFlowControl
->Guid
, &mEfiDevicePathMessagingUartFlowControlGuid
);
1451 if (StrCmp (ValueStr
, L
"XonXoff") == 0) {
1452 UartFlowControl
->FlowControlMap
= 2;
1453 } else if (StrCmp (ValueStr
, L
"Hardware") == 0) {
1454 UartFlowControl
->FlowControlMap
= 1;
1456 UartFlowControl
->FlowControlMap
= 0;
1459 return (EFI_DEVICE_PATH_PROTOCOL
*) UartFlowControl
;
1463 EFI_DEVICE_PATH_PROTOCOL
*
1464 DevPathFromTextSAS (
1465 IN CHAR16
*TextDeviceNode
1472 CHAR16
*LocationStr
;
1474 CHAR16
*DriveBayStr
;
1475 CHAR16
*ReservedStr
;
1477 SAS_DEVICE_PATH
*Sas
;
1479 AddressStr
= GetNextParamStr (&TextDeviceNode
);
1480 LunStr
= GetNextParamStr (&TextDeviceNode
);
1481 RTPStr
= GetNextParamStr (&TextDeviceNode
);
1482 SASSATAStr
= GetNextParamStr (&TextDeviceNode
);
1483 LocationStr
= GetNextParamStr (&TextDeviceNode
);
1484 ConnectStr
= GetNextParamStr (&TextDeviceNode
);
1485 DriveBayStr
= GetNextParamStr (&TextDeviceNode
);
1486 ReservedStr
= GetNextParamStr (&TextDeviceNode
);
1488 Sas
= (SAS_DEVICE_PATH
*) CreateDeviceNode (
1489 MESSAGING_DEVICE_PATH
,
1491 sizeof (SAS_DEVICE_PATH
)
1494 CopyGuid (&Sas
->Guid
, &mEfiDevicePathMessagingSASGuid
);
1495 Strtoi64 (AddressStr
, &Sas
->SasAddress
);
1496 Strtoi64 (LunStr
, &Sas
->Lun
);
1497 Sas
->RelativeTargetPort
= (UINT16
) Strtoi (RTPStr
);
1498 if (StrCmp (SASSATAStr
, L
"NoTopology") != 0) {
1499 if (StrCmp (DriveBayStr
, L
"0") == 0) {
1503 Info
= (UINT16
) (Info
| (Strtoi (DriveBayStr
) << 8));
1506 if (StrCmp (SASSATAStr
, L
"SATA") == 0) {
1510 if (StrCmp (LocationStr
, L
"External") == 0) {
1514 if (StrCmp (ConnectStr
, L
"Expanded") == 0) {
1519 Sas
->DeviceTopology
= Info
;
1520 Sas
->Reserved
= (UINT32
) Strtoi (ReservedStr
);
1522 return (EFI_DEVICE_PATH_PROTOCOL
*) Sas
;
1526 EFI_DEVICE_PATH_PROTOCOL
*
1527 DevPathFromTextDebugPort (
1528 IN CHAR16
*TextDeviceNode
1531 VENDOR_DEFINED_MESSAGING_DEVICE_PATH
*Vend
;
1533 Vend
= (VENDOR_DEFINED_MESSAGING_DEVICE_PATH
*) CreateDeviceNode (
1534 MESSAGING_DEVICE_PATH
,
1536 sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH
)
1539 CopyGuid (&Vend
->Guid
, &gEfiDebugPortProtocolGuid
);
1541 return (EFI_DEVICE_PATH_PROTOCOL
*) Vend
;
1545 EFI_DEVICE_PATH_PROTOCOL
*
1546 DevPathFromTextMAC (
1547 IN CHAR16
*TextDeviceNode
1553 MAC_ADDR_DEVICE_PATH
*MAC
;
1555 AddressStr
= GetNextParamStr (&TextDeviceNode
);
1556 IfTypeStr
= GetNextParamStr (&TextDeviceNode
);
1557 MAC
= (MAC_ADDR_DEVICE_PATH
*) CreateDeviceNode (
1558 MESSAGING_DEVICE_PATH
,
1560 sizeof (MAC_ADDR_DEVICE_PATH
)
1563 MAC
->IfType
= (UINT8
) Strtoi (IfTypeStr
);
1565 Length
= sizeof (EFI_MAC_ADDRESS
);
1566 StrToBuf (&MAC
->MacAddress
.Addr
[0], Length
, AddressStr
);
1568 return (EFI_DEVICE_PATH_PROTOCOL
*) MAC
;
1572 EFI_DEVICE_PATH_PROTOCOL
*
1573 DevPathFromTextIPv4 (
1574 IN CHAR16
*TextDeviceNode
1577 CHAR16
*RemoteIPStr
;
1578 CHAR16
*ProtocolStr
;
1581 IPv4_DEVICE_PATH
*IPv4
;
1583 RemoteIPStr
= GetNextParamStr (&TextDeviceNode
);
1584 ProtocolStr
= GetNextParamStr (&TextDeviceNode
);
1585 TypeStr
= GetNextParamStr (&TextDeviceNode
);
1586 LocalIPStr
= GetNextParamStr (&TextDeviceNode
);
1587 IPv4
= (IPv4_DEVICE_PATH
*) CreateDeviceNode (
1588 MESSAGING_DEVICE_PATH
,
1590 sizeof (IPv4_DEVICE_PATH
)
1593 StrToIPv4Addr (&RemoteIPStr
, &IPv4
->RemoteIpAddress
);
1594 IPv4
->Protocol
= (UINT16
) ((StrCmp (ProtocolStr
, L
"UDP") == 0) ? 0 : 1);
1595 if (StrCmp (TypeStr
, L
"Static") == 0) {
1596 IPv4
->StaticIpAddress
= TRUE
;
1598 IPv4
->StaticIpAddress
= FALSE
;
1601 StrToIPv4Addr (&LocalIPStr
, &IPv4
->LocalIpAddress
);
1603 IPv4
->LocalPort
= 0;
1604 IPv4
->RemotePort
= 0;
1606 return (EFI_DEVICE_PATH_PROTOCOL
*) IPv4
;
1610 EFI_DEVICE_PATH_PROTOCOL
*
1611 DevPathFromTextIPv6 (
1612 IN CHAR16
*TextDeviceNode
1615 CHAR16
*RemoteIPStr
;
1616 CHAR16
*ProtocolStr
;
1619 IPv6_DEVICE_PATH
*IPv6
;
1621 RemoteIPStr
= GetNextParamStr (&TextDeviceNode
);
1622 ProtocolStr
= GetNextParamStr (&TextDeviceNode
);
1623 TypeStr
= GetNextParamStr (&TextDeviceNode
);
1624 LocalIPStr
= GetNextParamStr (&TextDeviceNode
);
1625 IPv6
= (IPv6_DEVICE_PATH
*) CreateDeviceNode (
1626 MESSAGING_DEVICE_PATH
,
1628 sizeof (IPv6_DEVICE_PATH
)
1631 StrToIPv6Addr (&RemoteIPStr
, &IPv6
->RemoteIpAddress
);
1632 IPv6
->Protocol
= (UINT16
) ((StrCmp (ProtocolStr
, L
"UDP") == 0) ? 0 : 1);
1633 if (StrCmp (TypeStr
, L
"Static") == 0) {
1634 IPv6
->StaticIpAddress
= TRUE
;
1636 IPv6
->StaticIpAddress
= FALSE
;
1639 StrToIPv6Addr (&LocalIPStr
, &IPv6
->LocalIpAddress
);
1641 IPv6
->LocalPort
= 0;
1642 IPv6
->RemotePort
= 0;
1644 return (EFI_DEVICE_PATH_PROTOCOL
*) IPv6
;
1648 EFI_DEVICE_PATH_PROTOCOL
*
1649 DevPathFromTextUart (
1650 IN CHAR16
*TextDeviceNode
1654 CHAR16
*DataBitsStr
;
1656 CHAR16
*StopBitsStr
;
1657 UART_DEVICE_PATH
*Uart
;
1659 BaudStr
= GetNextParamStr (&TextDeviceNode
);
1660 DataBitsStr
= GetNextParamStr (&TextDeviceNode
);
1661 ParityStr
= GetNextParamStr (&TextDeviceNode
);
1662 StopBitsStr
= GetNextParamStr (&TextDeviceNode
);
1663 Uart
= (UART_DEVICE_PATH
*) CreateDeviceNode (
1664 MESSAGING_DEVICE_PATH
,
1666 sizeof (UART_DEVICE_PATH
)
1669 Uart
->BaudRate
= (StrCmp (BaudStr
, L
"DEFAULT") == 0) ? 115200 : Dtoi (BaudStr
);
1670 Uart
->DataBits
= (UINT8
) ((StrCmp (DataBitsStr
, L
"DEFAULT") == 0) ? 8 : Dtoi (DataBitsStr
));
1671 switch (*ParityStr
) {
1696 Uart
->Parity
= 0xff;
1699 if (StrCmp (StopBitsStr
, L
"D") == 0) {
1700 Uart
->StopBits
= (UINT8
) 0;
1701 } else if (StrCmp (StopBitsStr
, L
"1") == 0) {
1702 Uart
->StopBits
= (UINT8
) 1;
1703 } else if (StrCmp (StopBitsStr
, L
"1.5") == 0) {
1704 Uart
->StopBits
= (UINT8
) 2;
1705 } else if (StrCmp (StopBitsStr
, L
"2") == 0) {
1706 Uart
->StopBits
= (UINT8
) 3;
1708 Uart
->StopBits
= 0xff;
1711 return (EFI_DEVICE_PATH_PROTOCOL
*) Uart
;
1715 EFI_DEVICE_PATH_PROTOCOL
*
1716 ConvertFromTextUsbClass (
1717 IN CHAR16
*TextDeviceNode
,
1718 IN USB_CLASS_TEXT
*UsbClassText
1724 CHAR16
*SubClassStr
;
1725 CHAR16
*ProtocolStr
;
1726 USB_CLASS_DEVICE_PATH
*UsbClass
;
1728 UsbClass
= (USB_CLASS_DEVICE_PATH
*) CreateDeviceNode (
1729 MESSAGING_DEVICE_PATH
,
1731 sizeof (USB_CLASS_DEVICE_PATH
)
1734 VIDStr
= GetNextParamStr (&TextDeviceNode
);
1735 PIDStr
= GetNextParamStr (&TextDeviceNode
);
1736 if (UsbClassText
->ClassExist
) {
1737 ClassStr
= GetNextParamStr (&TextDeviceNode
);
1738 UsbClass
->DeviceClass
= (UINT8
) Strtoi (ClassStr
);
1740 UsbClass
->DeviceClass
= UsbClassText
->Class
;
1742 if (UsbClassText
->SubClassExist
) {
1743 SubClassStr
= GetNextParamStr (&TextDeviceNode
);
1744 UsbClass
->DeviceSubClass
= (UINT8
) Strtoi (SubClassStr
);
1746 UsbClass
->DeviceSubClass
= UsbClassText
->SubClass
;
1749 ProtocolStr
= GetNextParamStr (&TextDeviceNode
);
1751 UsbClass
->VendorId
= (UINT16
) Strtoi (VIDStr
);
1752 UsbClass
->ProductId
= (UINT16
) Strtoi (PIDStr
);
1753 UsbClass
->DeviceProtocol
= (UINT8
) Strtoi (ProtocolStr
);
1755 return (EFI_DEVICE_PATH_PROTOCOL
*) UsbClass
;
1760 EFI_DEVICE_PATH_PROTOCOL
*
1761 DevPathFromTextUsbClass (
1762 IN CHAR16
*TextDeviceNode
1765 USB_CLASS_TEXT UsbClassText
;
1767 UsbClassText
.ClassExist
= TRUE
;
1768 UsbClassText
.SubClassExist
= TRUE
;
1770 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1774 EFI_DEVICE_PATH_PROTOCOL
*
1775 DevPathFromTextUsbAudio (
1776 IN CHAR16
*TextDeviceNode
1779 USB_CLASS_TEXT UsbClassText
;
1781 UsbClassText
.ClassExist
= FALSE
;
1782 UsbClassText
.Class
= USB_CLASS_AUDIO
;
1783 UsbClassText
.SubClassExist
= TRUE
;
1785 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1789 EFI_DEVICE_PATH_PROTOCOL
*
1790 DevPathFromTextUsbCDCControl (
1791 IN CHAR16
*TextDeviceNode
1794 USB_CLASS_TEXT UsbClassText
;
1796 UsbClassText
.ClassExist
= FALSE
;
1797 UsbClassText
.Class
= USB_CLASS_CDCCONTROL
;
1798 UsbClassText
.SubClassExist
= TRUE
;
1800 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1804 EFI_DEVICE_PATH_PROTOCOL
*
1805 DevPathFromTextUsbHID (
1806 IN CHAR16
*TextDeviceNode
1809 USB_CLASS_TEXT UsbClassText
;
1811 UsbClassText
.ClassExist
= FALSE
;
1812 UsbClassText
.Class
= USB_CLASS_HID
;
1813 UsbClassText
.SubClassExist
= TRUE
;
1815 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1819 EFI_DEVICE_PATH_PROTOCOL
*
1820 DevPathFromTextUsbImage (
1821 IN CHAR16
*TextDeviceNode
1824 USB_CLASS_TEXT UsbClassText
;
1826 UsbClassText
.ClassExist
= FALSE
;
1827 UsbClassText
.Class
= USB_CLASS_IMAGE
;
1828 UsbClassText
.SubClassExist
= TRUE
;
1830 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1834 EFI_DEVICE_PATH_PROTOCOL
*
1835 DevPathFromTextUsbPrinter (
1836 IN CHAR16
*TextDeviceNode
1839 USB_CLASS_TEXT UsbClassText
;
1841 UsbClassText
.ClassExist
= FALSE
;
1842 UsbClassText
.Class
= USB_CLASS_PRINTER
;
1843 UsbClassText
.SubClassExist
= TRUE
;
1845 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1849 EFI_DEVICE_PATH_PROTOCOL
*
1850 DevPathFromTextUsbMassStorage (
1851 IN CHAR16
*TextDeviceNode
1854 USB_CLASS_TEXT UsbClassText
;
1856 UsbClassText
.ClassExist
= FALSE
;
1857 UsbClassText
.Class
= USB_CLASS_MASS_STORAGE
;
1858 UsbClassText
.SubClassExist
= TRUE
;
1860 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1864 EFI_DEVICE_PATH_PROTOCOL
*
1865 DevPathFromTextUsbHub (
1866 IN CHAR16
*TextDeviceNode
1869 USB_CLASS_TEXT UsbClassText
;
1871 UsbClassText
.ClassExist
= FALSE
;
1872 UsbClassText
.Class
= USB_CLASS_HUB
;
1873 UsbClassText
.SubClassExist
= TRUE
;
1875 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1879 EFI_DEVICE_PATH_PROTOCOL
*
1880 DevPathFromTextUsbCDCData (
1881 IN CHAR16
*TextDeviceNode
1884 USB_CLASS_TEXT UsbClassText
;
1886 UsbClassText
.ClassExist
= FALSE
;
1887 UsbClassText
.Class
= USB_CLASS_CDCDATA
;
1888 UsbClassText
.SubClassExist
= TRUE
;
1890 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1894 EFI_DEVICE_PATH_PROTOCOL
*
1895 DevPathFromTextUsbSmartCard (
1896 IN CHAR16
*TextDeviceNode
1899 USB_CLASS_TEXT UsbClassText
;
1901 UsbClassText
.ClassExist
= FALSE
;
1902 UsbClassText
.Class
= USB_CLASS_SMART_CARD
;
1903 UsbClassText
.SubClassExist
= TRUE
;
1905 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1909 EFI_DEVICE_PATH_PROTOCOL
*
1910 DevPathFromTextUsbVideo (
1911 IN CHAR16
*TextDeviceNode
1914 USB_CLASS_TEXT UsbClassText
;
1916 UsbClassText
.ClassExist
= FALSE
;
1917 UsbClassText
.Class
= USB_CLASS_VIDEO
;
1918 UsbClassText
.SubClassExist
= TRUE
;
1920 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1924 EFI_DEVICE_PATH_PROTOCOL
*
1925 DevPathFromTextUsbDiagnostic (
1926 IN CHAR16
*TextDeviceNode
1929 USB_CLASS_TEXT UsbClassText
;
1931 UsbClassText
.ClassExist
= FALSE
;
1932 UsbClassText
.Class
= USB_CLASS_DIAGNOSTIC
;
1933 UsbClassText
.SubClassExist
= TRUE
;
1935 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1939 EFI_DEVICE_PATH_PROTOCOL
*
1940 DevPathFromTextUsbWireless (
1941 IN CHAR16
*TextDeviceNode
1944 USB_CLASS_TEXT UsbClassText
;
1946 UsbClassText
.ClassExist
= FALSE
;
1947 UsbClassText
.Class
= USB_CLASS_WIRELESS
;
1948 UsbClassText
.SubClassExist
= TRUE
;
1950 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1954 EFI_DEVICE_PATH_PROTOCOL
*
1955 DevPathFromTextUsbDeviceFirmwareUpdate (
1956 IN CHAR16
*TextDeviceNode
1959 USB_CLASS_TEXT UsbClassText
;
1961 UsbClassText
.ClassExist
= FALSE
;
1962 UsbClassText
.Class
= USB_CLASS_RESERVE
;
1963 UsbClassText
.SubClassExist
= FALSE
;
1964 UsbClassText
.SubClass
= USB_SUBCLASS_FW_UPDATE
;
1966 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1970 EFI_DEVICE_PATH_PROTOCOL
*
1971 DevPathFromTextUsbIrdaBridge (
1972 IN CHAR16
*TextDeviceNode
1975 USB_CLASS_TEXT UsbClassText
;
1977 UsbClassText
.ClassExist
= FALSE
;
1978 UsbClassText
.Class
= USB_CLASS_RESERVE
;
1979 UsbClassText
.SubClassExist
= FALSE
;
1980 UsbClassText
.SubClass
= USB_SUBCLASS_IRDA_BRIDGE
;
1982 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
1986 EFI_DEVICE_PATH_PROTOCOL
*
1987 DevPathFromTextUsbTestAndMeasurement (
1988 IN CHAR16
*TextDeviceNode
1991 USB_CLASS_TEXT UsbClassText
;
1993 UsbClassText
.ClassExist
= FALSE
;
1994 UsbClassText
.Class
= USB_CLASS_RESERVE
;
1995 UsbClassText
.SubClassExist
= FALSE
;
1996 UsbClassText
.SubClass
= USB_SUBCLASS_TEST
;
1998 return ConvertFromTextUsbClass (TextDeviceNode
, &UsbClassText
);
2002 EFI_DEVICE_PATH_PROTOCOL
*
2003 DevPathFromTextUsbWwid (
2004 IN CHAR16
*TextDeviceNode
2009 CHAR16
*InterfaceNumStr
;
2010 CHAR16
*SerialNumberStr
;
2011 USB_WWID_DEVICE_PATH
*UsbWwid
;
2013 VIDStr
= GetNextParamStr (&TextDeviceNode
);
2014 PIDStr
= GetNextParamStr (&TextDeviceNode
);
2015 InterfaceNumStr
= GetNextParamStr (&TextDeviceNode
);
2016 SerialNumberStr
= GetNextParamStr (&TextDeviceNode
);
2017 UsbWwid
= (USB_WWID_DEVICE_PATH
*) CreateDeviceNode (
2018 MESSAGING_DEVICE_PATH
,
2020 (UINT16
) (sizeof (USB_WWID_DEVICE_PATH
) + StrSize (SerialNumberStr
))
2023 UsbWwid
->VendorId
= (UINT16
) Strtoi (VIDStr
);
2024 UsbWwid
->ProductId
= (UINT16
) Strtoi (PIDStr
);
2025 UsbWwid
->InterfaceNumber
= (UINT16
) Strtoi (InterfaceNumStr
);
2026 StrCpy ((CHAR16
*) ((UINT8
*) UsbWwid
+ sizeof (USB_WWID_DEVICE_PATH
)), SerialNumberStr
);
2028 return (EFI_DEVICE_PATH_PROTOCOL
*) UsbWwid
;
2032 EFI_DEVICE_PATH_PROTOCOL
*
2033 DevPathFromTextUnit (
2034 IN CHAR16
*TextDeviceNode
2038 DEVICE_LOGICAL_UNIT_DEVICE_PATH
*LogicalUnit
;
2040 LunStr
= GetNextParamStr (&TextDeviceNode
);
2041 LogicalUnit
= (DEVICE_LOGICAL_UNIT_DEVICE_PATH
*) CreateDeviceNode (
2042 MESSAGING_DEVICE_PATH
,
2043 MSG_DEVICE_LOGICAL_UNIT_DP
,
2044 (UINT16
) sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH
)
2047 LogicalUnit
->Lun
= (UINT8
) Strtoi (LunStr
);
2049 return (EFI_DEVICE_PATH_PROTOCOL
*) LogicalUnit
;
2053 EFI_DEVICE_PATH_PROTOCOL
*
2054 DevPathFromTextiSCSI (
2055 IN CHAR16
*TextDeviceNode
2060 CHAR16
*PortalGroupStr
;
2062 CHAR16
*HeaderDigestStr
;
2063 CHAR16
*DataDigestStr
;
2064 CHAR16
*AuthenticationStr
;
2065 CHAR16
*ProtocolStr
;
2067 ISCSI_DEVICE_PATH_WITH_NAME
*iSCSI
;
2069 NameStr
= GetNextParamStr (&TextDeviceNode
);
2070 PortalGroupStr
= GetNextParamStr (&TextDeviceNode
);
2071 LunStr
= GetNextParamStr (&TextDeviceNode
);
2072 HeaderDigestStr
= GetNextParamStr (&TextDeviceNode
);
2073 DataDigestStr
= GetNextParamStr (&TextDeviceNode
);
2074 AuthenticationStr
= GetNextParamStr (&TextDeviceNode
);
2075 ProtocolStr
= GetNextParamStr (&TextDeviceNode
);
2076 iSCSI
= (ISCSI_DEVICE_PATH_WITH_NAME
*) CreateDeviceNode (
2077 MESSAGING_DEVICE_PATH
,
2079 (UINT16
) (sizeof (ISCSI_DEVICE_PATH_WITH_NAME
) + StrLen (NameStr
) * 2)
2082 AsciiStr
= iSCSI
->iSCSITargetName
;
2083 StrToAscii (NameStr
, &AsciiStr
);
2085 iSCSI
->TargetPortalGroupTag
= (UINT16
) Strtoi (PortalGroupStr
);
2086 Strtoi64 (LunStr
, &iSCSI
->Lun
);
2089 if (StrCmp (HeaderDigestStr
, L
"CRC32C") == 0) {
2093 if (StrCmp (DataDigestStr
, L
"CRC32C") == 0) {
2097 if (StrCmp (AuthenticationStr
, L
"None") == 0) {
2101 if (StrCmp (AuthenticationStr
, L
"CHAP_UNI") == 0) {
2105 iSCSI
->LoginOption
= (UINT16
) Options
;
2107 iSCSI
->NetworkProtocol
= (UINT16
) StrCmp (ProtocolStr
, L
"TCP");
2109 return (EFI_DEVICE_PATH_PROTOCOL
*) iSCSI
;
2113 EFI_DEVICE_PATH_PROTOCOL
*
2115 IN CHAR16
*TextDeviceNode
2118 CHAR16
*PartitionStr
;
2120 CHAR16
*SignatureStr
;
2124 EFI_GUID SignatureGuid
;
2125 HARDDRIVE_DEVICE_PATH
*Hd
;
2127 PartitionStr
= GetNextParamStr (&TextDeviceNode
);
2128 TypeStr
= GetNextParamStr (&TextDeviceNode
);
2129 SignatureStr
= GetNextParamStr (&TextDeviceNode
);
2130 StartStr
= GetNextParamStr (&TextDeviceNode
);
2131 SizeStr
= GetNextParamStr (&TextDeviceNode
);
2132 Hd
= (HARDDRIVE_DEVICE_PATH
*) CreateDeviceNode (
2135 sizeof (HARDDRIVE_DEVICE_PATH
)
2138 Hd
->PartitionNumber
= (UINT32
) Dtoi (PartitionStr
);
2140 ZeroMem (Hd
->Signature
, 16);
2141 Hd
->MBRType
= (UINT8
) 0;
2143 if (StrCmp (TypeStr
, L
"MBR") == 0) {
2144 Hd
->SignatureType
= SIGNATURE_TYPE_MBR
;
2147 Signature32
= (UINT32
) Strtoi (SignatureStr
);
2148 CopyMem (Hd
->Signature
, &Signature32
, sizeof (UINT32
));
2149 } else if (StrCmp (TypeStr
, L
"GPT") == 0) {
2150 Hd
->SignatureType
= SIGNATURE_TYPE_GUID
;
2153 StrToGuid (SignatureStr
, &SignatureGuid
);
2154 CopyMem (Hd
->Signature
, &SignatureGuid
, sizeof (EFI_GUID
));
2156 Hd
->SignatureType
= (UINT8
) Strtoi (TypeStr
);
2159 Strtoi64 (StartStr
, &Hd
->PartitionStart
);
2160 Strtoi64 (SizeStr
, &Hd
->PartitionSize
);
2162 return (EFI_DEVICE_PATH_PROTOCOL
*) Hd
;
2166 EFI_DEVICE_PATH_PROTOCOL
*
2167 DevPathFromTextCDROM (
2168 IN CHAR16
*TextDeviceNode
2174 CDROM_DEVICE_PATH
*CDROM
;
2176 EntryStr
= GetNextParamStr (&TextDeviceNode
);
2177 StartStr
= GetNextParamStr (&TextDeviceNode
);
2178 SizeStr
= GetNextParamStr (&TextDeviceNode
);
2179 CDROM
= (CDROM_DEVICE_PATH
*) CreateDeviceNode (
2182 sizeof (CDROM_DEVICE_PATH
)
2185 CDROM
->BootEntry
= (UINT32
) Strtoi (EntryStr
);
2186 Strtoi64 (StartStr
, &CDROM
->PartitionStart
);
2187 Strtoi64 (SizeStr
, &CDROM
->PartitionSize
);
2189 return (EFI_DEVICE_PATH_PROTOCOL
*) CDROM
;
2193 EFI_DEVICE_PATH_PROTOCOL
*
2194 DevPathFromTextVenMEDIA (
2195 IN CHAR16
*TextDeviceNode
2198 return ConvertFromTextVendor (
2206 EFI_DEVICE_PATH_PROTOCOL
*
2207 DevPathFromTextFilePath (
2208 IN CHAR16
*TextDeviceNode
2211 FILEPATH_DEVICE_PATH
*File
;
2213 File
= (FILEPATH_DEVICE_PATH
*) CreateDeviceNode (
2216 (UINT16
) (sizeof (FILEPATH_DEVICE_PATH
) + StrLen (TextDeviceNode
) * 2)
2219 StrCpy (File
->PathName
, TextDeviceNode
);
2221 return (EFI_DEVICE_PATH_PROTOCOL
*) File
;
2225 EFI_DEVICE_PATH_PROTOCOL
*
2226 DevPathFromTextMedia (
2227 IN CHAR16
*TextDeviceNode
2231 MEDIA_PROTOCOL_DEVICE_PATH
*Media
;
2233 GuidStr
= GetNextParamStr (&TextDeviceNode
);
2234 Media
= (MEDIA_PROTOCOL_DEVICE_PATH
*) CreateDeviceNode (
2237 sizeof (MEDIA_PROTOCOL_DEVICE_PATH
)
2240 StrToGuid (GuidStr
, &Media
->Protocol
);
2242 return (EFI_DEVICE_PATH_PROTOCOL
*) Media
;
2246 EFI_DEVICE_PATH_PROTOCOL
*
2248 IN CHAR16
*TextDeviceNode
2252 MEDIA_FW_VOL_DEVICE_PATH
*Fv
;
2254 GuidStr
= GetNextParamStr (&TextDeviceNode
);
2255 Fv
= (MEDIA_FW_VOL_DEVICE_PATH
*) CreateDeviceNode (
2257 MEDIA_PIWG_FW_VOL_DP
,
2258 sizeof (MEDIA_FW_VOL_DEVICE_PATH
)
2261 StrToGuid (GuidStr
, &Fv
->FvName
);
2263 return (EFI_DEVICE_PATH_PROTOCOL
*) Fv
;
2267 EFI_DEVICE_PATH_PROTOCOL
*
2268 DevPathFromTextFvFile (
2269 IN CHAR16
*TextDeviceNode
2273 MEDIA_FW_VOL_FILEPATH_DEVICE_PATH
*FvFile
;
2275 GuidStr
= GetNextParamStr (&TextDeviceNode
);
2276 FvFile
= (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH
*) CreateDeviceNode (
2278 MEDIA_PIWG_FW_FILE_DP
,
2279 sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH
)
2282 StrToGuid (GuidStr
, &FvFile
->FvFileName
);
2284 return (EFI_DEVICE_PATH_PROTOCOL
*) FvFile
;
2288 EFI_DEVICE_PATH_PROTOCOL
*
2289 DevPathFromTextBBS (
2290 IN CHAR16
*TextDeviceNode
2297 BBS_BBS_DEVICE_PATH
*Bbs
;
2299 TypeStr
= GetNextParamStr (&TextDeviceNode
);
2300 IdStr
= GetNextParamStr (&TextDeviceNode
);
2301 FlagsStr
= GetNextParamStr (&TextDeviceNode
);
2302 Bbs
= (BBS_BBS_DEVICE_PATH
*) CreateDeviceNode (
2305 (UINT16
) (sizeof (BBS_BBS_DEVICE_PATH
) + StrLen (IdStr
))
2308 if (StrCmp (TypeStr
, L
"Floppy") == 0) {
2309 Bbs
->DeviceType
= BBS_TYPE_FLOPPY
;
2310 } else if (StrCmp (TypeStr
, L
"HD") == 0) {
2311 Bbs
->DeviceType
= BBS_TYPE_HARDDRIVE
;
2312 } else if (StrCmp (TypeStr
, L
"CDROM") == 0) {
2313 Bbs
->DeviceType
= BBS_TYPE_CDROM
;
2314 } else if (StrCmp (TypeStr
, L
"PCMCIA") == 0) {
2315 Bbs
->DeviceType
= BBS_TYPE_PCMCIA
;
2316 } else if (StrCmp (TypeStr
, L
"USB") == 0) {
2317 Bbs
->DeviceType
= BBS_TYPE_USB
;
2318 } else if (StrCmp (TypeStr
, L
"Network") == 0) {
2319 Bbs
->DeviceType
= BBS_TYPE_EMBEDDED_NETWORK
;
2321 Bbs
->DeviceType
= (UINT16
) Strtoi (TypeStr
);
2324 AsciiStr
= Bbs
->String
;
2325 StrToAscii (IdStr
, &AsciiStr
);
2327 Bbs
->StatusFlag
= (UINT16
) Strtoi (FlagsStr
);
2329 return (EFI_DEVICE_PATH_PROTOCOL
*) Bbs
;
2333 EFI_DEVICE_PATH_PROTOCOL
*
2334 DevPathFromTextSata (
2335 IN CHAR16
*TextDeviceNode
2338 SATA_DEVICE_PATH
*Sata
;
2344 // The PMPN is optional.
2346 Param1
= GetNextParamStr (&TextDeviceNode
);
2347 Param2
= GetNextParamStr (&TextDeviceNode
);
2349 if (!IS_NULL (TextDeviceNode
)) {
2350 Param3
= GetNextParamStr (&TextDeviceNode
);
2353 Sata
= (SATA_DEVICE_PATH
*) CreateDeviceNode (
2354 MESSAGING_DEVICE_PATH
,
2356 sizeof (SATA_DEVICE_PATH
)
2358 Sata
->HbaPortNumber
= (UINT16
) Xtoi (Param1
);
2359 if (Param3
!= NULL
) {
2360 Sata
->PortMultiplierPort
= (UINT16
) Xtoi (Param2
);
2363 Sata
->PortMultiplierPort
= 0;
2365 Sata
->LogicalUnitNumber
= (UINT16
) Xtoi (Param2
);
2367 return (EFI_DEVICE_PATH_PROTOCOL
*) Sata
;
2370 GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable
[] = {
2371 {L
"Pci", DevPathFromTextPci
},
2372 {L
"PcCard", DevPathFromTextPcCard
},
2373 {L
"MemoryMapped", DevPathFromTextMemoryMapped
},
2374 {L
"VenHw", DevPathFromTextVenHw
},
2375 {L
"Ctrl", DevPathFromTextCtrl
},
2376 {L
"Acpi", DevPathFromTextAcpi
},
2377 {L
"PciRoot", DevPathFromTextPciRoot
},
2378 {L
"Floppy", DevPathFromTextFloppy
},
2379 {L
"Keyboard", DevPathFromTextKeyboard
},
2380 {L
"Serial", DevPathFromTextSerial
},
2381 {L
"ParallelPort", DevPathFromTextParallelPort
},
2382 {L
"AcpiEx", DevPathFromTextAcpiEx
},
2383 {L
"AcpiExp", DevPathFromTextAcpiExp
},
2384 {L
"Ata", DevPathFromTextAta
},
2385 {L
"Scsi", DevPathFromTextScsi
},
2386 {L
"Fibre", DevPathFromTextFibre
},
2387 {L
"I1394", DevPathFromText1394
},
2388 {L
"USB", DevPathFromTextUsb
},
2389 {L
"I2O", DevPathFromTextI2O
},
2390 {L
"Infiniband", DevPathFromTextInfiniband
},
2391 {L
"VenMsg", DevPathFromTextVenMsg
},
2392 {L
"VenPcAnsi", DevPathFromTextVenPcAnsi
},
2393 {L
"VenVt100", DevPathFromTextVenVt100
},
2394 {L
"VenVt100Plus", DevPathFromTextVenVt100Plus
},
2395 {L
"VenUtf8", DevPathFromTextVenUtf8
},
2396 {L
"UartFlowCtrl", DevPathFromTextUartFlowCtrl
},
2397 {L
"SAS", DevPathFromTextSAS
},
2398 {L
"DebugPort", DevPathFromTextDebugPort
},
2399 {L
"MAC", DevPathFromTextMAC
},
2400 {L
"IPv4", DevPathFromTextIPv4
},
2401 {L
"IPv6", DevPathFromTextIPv6
},
2402 {L
"Uart", DevPathFromTextUart
},
2403 {L
"UsbClass", DevPathFromTextUsbClass
},
2404 {L
"UsbAudio", DevPathFromTextUsbAudio
},
2405 {L
"UsbCDCControl", DevPathFromTextUsbCDCControl
},
2406 {L
"UsbHID", DevPathFromTextUsbHID
},
2407 {L
"UsbImage", DevPathFromTextUsbImage
},
2408 {L
"UsbPrinter", DevPathFromTextUsbPrinter
},
2409 {L
"UsbMassStorage", DevPathFromTextUsbMassStorage
},
2410 {L
"UsbHub", DevPathFromTextUsbHub
},
2411 {L
"UsbCDCData", DevPathFromTextUsbCDCData
},
2412 {L
"UsbSmartCard", DevPathFromTextUsbSmartCard
},
2413 {L
"UsbVideo", DevPathFromTextUsbVideo
},
2414 {L
"UsbDiagnostic", DevPathFromTextUsbDiagnostic
},
2415 {L
"UsbWireless", DevPathFromTextUsbWireless
},
2416 {L
"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate
},
2417 {L
"UsbIrdaBridge", DevPathFromTextUsbIrdaBridge
},
2418 {L
"UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement
},
2419 {L
"UsbWwid", DevPathFromTextUsbWwid
},
2420 {L
"Unit", DevPathFromTextUnit
},
2421 {L
"iSCSI", DevPathFromTextiSCSI
},
2422 {L
"HD", DevPathFromTextHD
},
2423 {L
"CDROM", DevPathFromTextCDROM
},
2424 {L
"VenMEDIA", DevPathFromTextVenMEDIA
},
2425 {L
"Media", DevPathFromTextMedia
},
2426 {L
"Fv", DevPathFromTextFv
},
2427 {L
"FvFile", DevPathFromTextFvFile
},
2428 {L
"BBS", DevPathFromTextBBS
},
2429 {L
"Sata", DevPathFromTextSata
},
2433 EFI_DEVICE_PATH_PROTOCOL
*
2434 ConvertTextToDeviceNode (
2435 IN CONST CHAR16
*TextDeviceNode
2439 Routine Description:
2440 Convert text to the binary representation of a device node.
2443 TextDeviceNode - TextDeviceNode points to the text representation of a device
2444 node. Conversion starts with the first character and continues
2445 until the first non-device node character.
2448 A pointer - Pointer to the EFI device node.
2449 NULL - If TextDeviceNode is NULL or there was insufficient memory or text unsupported.
2453 EFI_DEVICE_PATH_PROTOCOL
* (*DumpNode
) (CHAR16
*);
2455 EFI_DEVICE_PATH_PROTOCOL
*DeviceNode
;
2456 CHAR16
*DeviceNodeStr
;
2459 if ((TextDeviceNode
== NULL
) || (IS_NULL (*TextDeviceNode
))) {
2465 DeviceNodeStr
= StrDuplicate (TextDeviceNode
);
2467 for (Index
= 0; DevPathFromTextTable
[Index
].Function
; Index
++) {
2468 ParamStr
= GetParamByNodeName (DeviceNodeStr
, DevPathFromTextTable
[Index
].DevicePathNodeText
);
2469 if (ParamStr
!= NULL
) {
2470 DumpNode
= DevPathFromTextTable
[Index
].Function
;
2475 if (DumpNode
== NULL
) {
2479 DumpNode
= DevPathFromTextFilePath
;
2480 DeviceNode
= DumpNode (DeviceNodeStr
);
2482 DeviceNode
= DumpNode (ParamStr
);
2483 FreePool (ParamStr
);
2486 FreePool (DeviceNodeStr
);
2491 EFI_DEVICE_PATH_PROTOCOL
*
2492 ConvertTextToDevicePath (
2493 IN CONST CHAR16
*TextDevicePath
2497 Routine Description:
2498 Convert text to the binary representation of a device path.
2501 TextDevicePath - TextDevicePath points to the text representation of a device
2502 path. Conversion starts with the first character and continues
2503 until the first non-device node character.
2506 A pointer - Pointer to the allocated device path.
2507 NULL - If TextDeviceNode is NULL or there was insufficient memory.
2511 EFI_DEVICE_PATH_PROTOCOL
* (*DumpNode
) (CHAR16
*);
2513 EFI_DEVICE_PATH_PROTOCOL
*DeviceNode
;
2515 EFI_DEVICE_PATH_PROTOCOL
*NewDevicePath
;
2516 CHAR16
*DevicePathStr
;
2518 CHAR16
*DeviceNodeStr
;
2519 UINT8 IsInstanceEnd
;
2520 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
2522 if ((TextDevicePath
== NULL
) || (IS_NULL (*TextDevicePath
))) {
2526 DevicePath
= (EFI_DEVICE_PATH_PROTOCOL
*) AllocatePool (END_DEVICE_PATH_LENGTH
);
2527 SetDevicePathEndNode (DevicePath
);
2530 DeviceNodeStr
= NULL
;
2531 DevicePathStr
= StrDuplicate (TextDevicePath
);
2533 Str
= DevicePathStr
;
2534 while ((DeviceNodeStr
= GetNextDeviceNodeStr (&Str
, &IsInstanceEnd
)) != NULL
) {
2536 for (Index
= 0; DevPathFromTextTable
[Index
].Function
; Index
++) {
2537 ParamStr
= GetParamByNodeName (DeviceNodeStr
, DevPathFromTextTable
[Index
].DevicePathNodeText
);
2538 if (ParamStr
!= NULL
) {
2539 DumpNode
= DevPathFromTextTable
[Index
].Function
;
2544 if (DumpNode
== NULL
) {
2548 DumpNode
= DevPathFromTextFilePath
;
2549 DeviceNode
= DumpNode (DeviceNodeStr
);
2551 DeviceNode
= DumpNode (ParamStr
);
2552 FreePool (ParamStr
);
2555 NewDevicePath
= AppendDeviceNodeProtocolInterface (DevicePath
, DeviceNode
);
2556 FreePool (DevicePath
);
2557 FreePool (DeviceNode
);
2558 DevicePath
= NewDevicePath
;
2560 if (IsInstanceEnd
) {
2561 DeviceNode
= (EFI_DEVICE_PATH_PROTOCOL
*) AllocatePool (END_DEVICE_PATH_LENGTH
);
2562 SetDevicePathInstanceEndNode (DeviceNode
);
2564 NewDevicePath
= AppendDeviceNodeProtocolInterface (DevicePath
, DeviceNode
);
2565 FreePool (DevicePath
);
2566 FreePool (DeviceNode
);
2567 DevicePath
= NewDevicePath
;
2571 FreePool (DevicePathStr
);