17#include <Protocol/DevicePathToText.h>
18#include <Protocol/SimpleFileSystem.h>
20#include <Library/DebugLib.h>
21#include <Library/BaseLib.h>
22#include <Library/BaseMemoryLib.h>
23#include <Library/BaseOverflowLib.h>
24#include <Library/DevicePathLib.h>
25#include <Library/MemoryAllocationLib.h>
28#include <Library/UefiBootServicesTableLib.h>
32EFI_DEVICE_PATH_PROTOCOL *
34 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
38 EFI_DEVICE_PATH_PROTOCOL *AppendedDevicePath;
40 FILEPATH_DEVICE_PATH *FilePathNode;
41 EFI_DEVICE_PATH_PROTOCOL *DevicePathEndNode;
43 UINTN FileDevicePathNodeSize;
45 AppendedDevicePath = NULL;
47 if ((DevicePath != NULL) && (FileName != NULL)) {
48 FileNameSize = StrSize (FileName);
49 FileDevicePathNodeSize = (FileNameSize + SIZE_OF_FILEPATH_DEVICE_PATH + END_DEVICE_PATH_LENGTH);
50 FilePathNode = AllocateZeroPool (FileDevicePathNodeSize);
52 if (FilePathNode != NULL) {
53 FilePathNode->Header.Type = MEDIA_DEVICE_PATH;
54 FilePathNode->Header.SubType = MEDIA_FILEPATH_DP;
56 SetDevicePathNodeLength (&FilePathNode->Header, FileNameSize + SIZE_OF_FILEPATH_DEVICE_PATH);
58 CopyMem (FilePathNode->PathName, FileName, FileNameSize);
60 DevicePathEndNode = NextDevicePathNode (&FilePathNode->Header);
62 SetDevicePathEndNode (DevicePathEndNode);
64 AppendedDevicePath = AppendDevicePath (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)FilePathNode);
66 FreePool (FilePathNode);
70 return AppendedDevicePath;
73EFI_DEVICE_PATH_PROTOCOL *
75 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
78 while (!IsDevicePathEnd (DevicePath)) {
79 DevicePath = NextDevicePathNode (DevicePath);
85EFI_DEVICE_PATH_PROTOCOL *
87 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
89 IN UINT8 SubType OPTIONAL
92 EFI_DEVICE_PATH_PROTOCOL *DevicePathNode;
94 DevicePathNode = NULL;
96 while (!IsDevicePathEnd (DevicePath)) {
97 if ( (DevicePathType (DevicePath) == Type)
98 && ((SubType == 0) || (DevicePathSubType (DevicePath) == SubType)))
100 DevicePathNode = DevicePath;
105 DevicePath = NextDevicePathNode (DevicePath);
108 return DevicePathNode;
111EFI_DEVICE_PATH_PROTOCOL *
114 IN EFI_DEVICE_PATH_PROTOCOL *RelativePath OPTIONAL
117 EFI_DEVICE_PATH_PROTOCOL *HandlePath;
118 EFI_DEVICE_PATH_PROTOCOL *NewPath;
121 if (HandlePath == NULL) {
125 if (RelativePath == NULL) {
126 return DuplicateDevicePath (HandlePath);
129 NewPath = AppendDevicePath (HandlePath, RelativePath);
131 if (NewPath == NULL) {
132 return DuplicateDevicePath (HandlePath);
138EFI_DEVICE_PATH_PROTOCOL *
140 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
143 EFI_DEVICE_PATH_PROTOCOL *DevicePathWalker;
144 EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
146 FILEPATH_DEVICE_PATH *NewFilePath;
150 DevicePathWalker = DevicePath;
152 while (!IsDevicePathEnd (DevicePathWalker)) {
153 if ( (DevicePathType (DevicePathWalker) == MEDIA_DEVICE_PATH)
154 && (DevicePathSubType (DevicePathWalker) == MEDIA_FILEPATH_DP)
155 && IsDevicePathEnd (NextDevicePathNode (DevicePathWalker)))
157 FilePath = (FILEPATH_DEVICE_PATH *)DevicePathWalker;
177 Size = GetDevicePathSize (DevicePath);
178 NewDevicePath = (EFI_DEVICE_PATH_PROTOCOL *)AllocatePool (
Size +
sizeof (CHAR16));
179 if (NewDevicePath == NULL) {
189 CopyMem (NewDevicePath, DevicePath,
Size -
sizeof (CHAR16) - END_DEVICE_PATH_LENGTH);
190 NewFilePath = (FILEPATH_DEVICE_PATH *)((UINT8 *)DevicePathWalker - (UINT8 *)DevicePath + (UINT8 *)NewDevicePath);
191 Size = DevicePathNodeLength (DevicePathWalker) +
sizeof (CHAR16);
192 SetDevicePathNodeLength (NewFilePath,
Size);
193 NewFilePath->PathName[
Length] = L
'\\';
194 NewFilePath->PathName[
Length+1] = L
'\0';
195 SetDevicePathEndNode ((UINT8 *)NewFilePath +
Size);
196 return NewDevicePath;
201 DevicePathWalker = NextDevicePathNode (DevicePathWalker);
212 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
213 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNode,
217 EFI_DEV_PATH_PTR Node;
226 Node.DevPath = *DevicePathNode;
228 NodeType = DevicePathType (Node.DevPath);
229 NodeSubType = DevicePathSubType (Node.DevPath);
231 if (RestoreContext->OldPath != NULL) {
235 *DevicePathNode = (EFI_DEVICE_PATH_PROTOCOL *)(
236 (UINTN)RestoreContext->OldPath +
237 ((UINTN)*DevicePathNode - (UINTN)*DevicePath)
239 FreePool (*DevicePath);
240 *DevicePath = RestoreContext->OldPath;
244 if (NodeType == MESSAGING_DEVICE_PATH) {
245 switch (NodeSubType) {
247 Node.Sata->PortMultiplierPortNumber = RestoreContext->Types.Sata.PortMultiplierPortNumber;
256 case MSG_NVME_NAMESPACE_DP:
258 Node.NvmeNamespace->Header.SubType = RestoreContext->Types.SasExNvme.SubType;
264 }
else if (NodeType == ACPI_DEVICE_PATH) {
265 switch (NodeSubType) {
267 Node.Acpi->HID = RestoreContext->Types.Acpi.HID;
268 Node.Acpi->UID = RestoreContext->Types.Acpi.UID;
271 case ACPI_EXTENDED_DP:
272 Node.ExtendedAcpi->HID = RestoreContext->Types.ExtendedAcpi.HID;
273 Node.ExtendedAcpi->CID = RestoreContext->Types.ExtendedAcpi.CID;
284 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathNode,
296 if (RestoreContext->OldPath != NULL) {
297 FreePool (RestoreContext->OldPath);
325 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
326 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNode
329 EFI_DEVICE_PATH_PROTOCOL *HdNode;
331 EFI_DEVICE_PATH_PROTOCOL *ExpandedPath;
332 EFI_DEVICE_PATH_PROTOCOL *ExpandedNode;
348 if (HdNode == NULL) {
349 DEBUG ((DEBUG_VERBOSE,
"Failed to find HD node\n"));
356 PrefixSize = (UINTN)*DevicePathNode - (UINTN)*DevicePath;
363 ExpandedPath != NULL;
371 if ( (GetDevicePathSize (ExpandedPath) < PrefixSize)
372 || (
CompareMem (ExpandedPath, *DevicePath, PrefixSize) != 0))
374 DEBUG ((DEBUG_VERBOSE,
"Prefix does not match\n"));
383 ExpandedNode = (EFI_DEVICE_PATH_PROTOCOL *)(
384 (UINTN)ExpandedPath + PrefixSize
391 EFI_DEVICE_PATH_PROTOCOL *RemDevPath = ExpandedPath;
394 if (EFI_ERROR (Status) || (RemDevPath->Type != END_DEVICE_PATH_TYPE) || (RemDevPath->SubType != END_ENTIRE_DEVICE_PATH_SUBTYPE)) {
395 DEBUG ((DEBUG_VERBOSE,
"borked piece of crap\n"));
400 *DevicePath = ExpandedPath;
401 *DevicePathNode = ExpandedNode;
436 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
437 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNode,
444 EFI_HANDLE *HandleBuffer;
446 UINTN DevicePathSize;
447 UINTN ValidPrefixSize;
448 EFI_DEVICE_PATH_PROTOCOL *TestedDevicePath;
449 EFI_DEVICE_PATH_PROTOCOL *TestedDeviceNode;
450 EFI_DEVICE_PATH_PROTOCOL *NewDeviceNode;
451 EFI_DEVICE_PATH_PROTOCOL *FixedDevicePath;
453 UINT8 TestedNodeType;
454 UINT8 TestedNodeSubType;
465 Status =
gBS->LocateHandleBuffer (
473 if (EFI_ERROR (Status)) {
474 DEBUG ((DEBUG_VERBOSE,
"Failed to locate any block i/o to fixup DP\n"));
481 DevicePathSize = GetDevicePathSize (*DevicePath);
482 ValidPrefixSize = DevicePathSize - GetDevicePathSize (*DevicePathNode);
484 for (Index = 0; Index < HandleCount; ++Index) {
488 Status =
gBS->HandleProtocol (
491 (VOID **)&TestedDevicePath
494 if (EFI_ERROR (Status)) {
501 TestedSize = GetDevicePathSize (TestedDevicePath);
506 if (TestedSize != ValidPrefixSize +
sizeof (HARDDRIVE_DEVICE_PATH) + END_DEVICE_PATH_LENGTH) {
513 if (
CompareMem (TestedDevicePath, *DevicePath, ValidPrefixSize) != 0) {
520 TestedDeviceNode = (VOID *)((UINTN)TestedDevicePath + ValidPrefixSize);
521 TestedNodeType = DevicePathType (TestedDeviceNode);
522 TestedNodeSubType = DevicePathSubType (TestedDeviceNode);
523 if ( (TestedNodeType != MEDIA_DEVICE_PATH)
524 || (TestedNodeSubType != MEDIA_HARDDRIVE_DP))
532 FixedDevicePath = AllocatePool (DevicePathSize +
sizeof (HARDDRIVE_DEVICE_PATH));
533 if (FixedDevicePath == NULL) {
534 FreePool (HandleBuffer);
541 ValidPrefixSize +
sizeof (HARDDRIVE_DEVICE_PATH)
544 TestedDeviceNode = (VOID *)((UINTN)FixedDevicePath + ValidPrefixSize +
sizeof (HARDDRIVE_DEVICE_PATH));
548 (VOID *)((UINTN)*DevicePath + ValidPrefixSize),
549 DevicePathSize - ValidPrefixSize
555 NewDeviceNode = FixedDevicePath;
556 Status =
gBS->LocateDevicePath (
561 if (EFI_ERROR (Status)) {
562 FreePool (FixedDevicePath);
570 if ((UINTN)NewDeviceNode > (UINTN)TestedDeviceNode) {
571 RestoreContext->OldPath = *DevicePath;
572 *DevicePath = FixedDevicePath;
573 *DevicePathNode = TestedDeviceNode;
574 FreePool (HandleBuffer);
578 FreePool (FixedDevicePath);
581 FreePool (HandleBuffer);
591 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
592 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNode,
594 IN EFI_HANDLE ValidDevice OPTIONAL
598 EFI_DEVICE_PATH_PROTOCOL *OldPath;
599 EFI_DEV_PATH_PTR Node;
604 ASSERT (DevicePathNode != NULL);
611 if (RestoreContext != NULL) {
612 RestoreContext->OldPath = NULL;
615 Node.DevPath = *DevicePathNode;
617 NodeType = DevicePathType (Node.DevPath);
618 NodeSubType = DevicePathSubType (Node.DevPath);
620 if (NodeType == MESSAGING_DEVICE_PATH) {
621 switch (NodeSubType) {
623 if (Node.Sata->PortMultiplierPortNumber != 0xFFFF) {
624 if (RestoreContext != NULL) {
625 RestoreContext->Types.Sata.PortMultiplierPortNumber = Node.Sata->PortMultiplierPortNumber;
635 Node.Sata->PortMultiplierPortNumber = 0xFFFF;
646 OldPath = *DevicePath;
655 if (RestoreContext != NULL) {
656 RestoreContext->OldPath = OldPath;
672 if (RestoreContext != NULL) {
673 RestoreContext->Types.SasExNvme.SubType = Node.DevPath->SubType;
677 sizeof (SASEX_DEVICE_PATH) !=
sizeof (NVME_NAMESPACE_DEVICE_PATH),
678 "SasEx and NVMe DPs must differ in size for fixing to be accurate."
681 NodeSize = DevicePathNodeLength (Node.DevPath);
682 if (NodeSize ==
sizeof (NVME_NAMESPACE_DEVICE_PATH)) {
683 Node.SasEx->Header.SubType = MSG_NVME_NAMESPACE_DP;
689 case MSG_NVME_NAMESPACE_DP:
693 if (RestoreContext != NULL) {
694 RestoreContext->Types.SasExNvme.SubType = Node.DevPath->SubType;
703 }
else if (NodeType == ACPI_DEVICE_PATH) {
704 switch (NodeSubType) {
706 if (RestoreContext != NULL) {
707 RestoreContext->Types.Acpi.HID = Node.Acpi->HID;
708 RestoreContext->Types.Acpi.UID = Node.Acpi->UID;
711 if (EISA_ID_TO_NUM (Node.Acpi->HID) == 0x0A03) {
722 switch (Node.Acpi->UID) {
758 Node.Acpi->HID = BitFieldWrite32 (
769 case ACPI_EXTENDED_DP:
770 if (RestoreContext != NULL) {
771 RestoreContext->Types.ExtendedAcpi.HID = Node.ExtendedAcpi->HID;
772 RestoreContext->Types.ExtendedAcpi.CID = Node.ExtendedAcpi->CID;
779 if (EISA_ID_TO_NUM (Node.ExtendedAcpi->HID) == 0x0A03) {
780 Node.ExtendedAcpi->HID = BitFieldWrite32 (
781 Node.ExtendedAcpi->HID,
789 if ( (EISA_ID_TO_NUM (Node.ExtendedAcpi->CID) == 0x0A03)
790 && (EISA_ID_TO_NUM (Node.ExtendedAcpi->HID) != 0x0A08))
792 Node.ExtendedAcpi->CID = BitFieldWrite32 (
793 Node.ExtendedAcpi->CID,
806 }
else if ((NodeType == MEDIA_DEVICE_PATH) && (NodeSubType == MEDIA_VENDOR_DP)) {
807 if (ValidDevice == NULL) {
823 IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
824 OUT EFI_DEVICE_PATH_PROTOCOL **RemainingDevicePath
829 UINTN DevicePathSize;
836 ASSERT (DevicePath != NULL);
837 ASSERT (*DevicePath != NULL);
838 ASSERT (IsDevicePathValid (*DevicePath, 0));
843 RestoreContextPtr = &FirstNodeRestoreContext;
849 *RemainingDevicePath = *DevicePath;
850 gBS->LocateDevicePath (
870 RestoreContextPtr = NULL;
874 NodePatched |= Result > 0;
875 }
while (Result > 0);
878 if (NodePatched != 0) {
879 if (*RemainingDevicePath == *DevicePath) {
891 &FirstNodeRestoreContext
899 &FirstNodeRestoreContext
911 DevicePathSize = GetDevicePathSize (*DevicePath);
912 ASSERT ((UINTN)*RemainingDevicePath >= (UINTN)*DevicePath);
913 ASSERT ((UINTN)*RemainingDevicePath < ((UINTN)*DevicePath) + DevicePathSize);
922 IN CONST FILEPATH_DEVICE_PATH *
FilePath,
923 IN OUT UINTN *FilePathLength,
924 IN OUT UINTN *ClipIndex
929 ASSERT (FilePathLength != NULL);
930 ASSERT (*FilePathLength != 0);
932 ASSERT (ClipIndex != NULL);
935 if (
FilePath->PathName[Index] == L
'\\') {
936 *ClipIndex = Index + 1;
951 EFI_DEV_PATH_PTR DevPath;
955 EFI_DEVICE_PATH_PROTOCOL *NextNode;
958 ASSERT (ClipIndex != NULL);
963 Length = 0, NextNode = &(*FilePath)->Header;
965 NextNode = NextDevicePathNode (DevPath.DevPath)
968 DevPath.DevPath = NextNode;
970 if ( (DevicePathType (DevPath.DevPath) != MEDIA_DEVICE_PATH)
971 || (DevicePathSubType (DevPath.DevPath) != MEDIA_FILEPATH_DP))
982 && (DevPath.FilePath->PathName[Index +
Length - 1] == L
'\\'))
1003 ASSERT (ClipIndex != NULL);
1011 IN FILEPATH_DEVICE_PATH **FilePath1,
1012 IN FILEPATH_DEVICE_PATH **FilePath2
1025 ASSERT (FilePath1 != NULL);
1026 ASSERT (*FilePath1 != NULL);
1027 ASSERT (FilePath2 != NULL);
1028 ASSERT (*FilePath2 != NULL);
1030 ASSERT (IsDevicePathValid (&(*FilePath1)->Header, 0));
1031 ASSERT (IsDevicePathValid (&(*FilePath2)->Header, 0));
1037 if ((Len1 == 0) && (Len2 == 0)) {
1041 CurrentLen =
MIN (Len1, Len2);
1042 if (CurrentLen == 0) {
1050 for (Index = 0; Index < CurrentLen; ++Index) {
1051 Char1 = CharToUpper ((*FilePath1)->PathName[Clip1Index + Index]);
1052 Char2 = CharToUpper ((*FilePath2)->PathName[Clip2Index + Index]);
1053 if (Char1 != Char2) {
1061 }
else if (Len1 < Len2) {
1068 Clip2Index += CurrentLen;
1084 Clip1Index += CurrentLen;
1108 IN FILEPATH_DEVICE_PATH *FilePath1,
1109 IN FILEPATH_DEVICE_PATH *FilePath2
1112 ASSERT (FilePath1 != NULL);
1113 ASSERT (FilePath2 != NULL);
1121 IN EFI_DEVICE_PATH_PROTOCOL *ParentPath,
1122 IN EFI_DEVICE_PATH_PROTOCOL *ChildPath,
1123 IN BOOLEAN CheckChild
1129 EFI_DEV_PATH_PTR ChildPathPtr;
1130 EFI_DEV_PATH_PTR ParentPathPtr;
1136 ASSERT (ParentPath != NULL);
1137 ASSERT (IsDevicePathValid (ParentPath, 0));
1138 ASSERT (ChildPath != NULL);
1139 ASSERT (IsDevicePathValid (ChildPath, 0));
1141 ParentPathPtr.DevPath = ParentPath;
1142 ChildPathPtr.DevPath = ChildPath;
1145 NodeType = DevicePathType (ChildPathPtr.DevPath);
1146 NodeSubType = DevicePathSubType (ChildPathPtr.DevPath);
1148 if (NodeType == END_DEVICE_PATH_TYPE) {
1152 ASSERT (NodeSubType == END_ENTIRE_DEVICE_PATH_SUBTYPE);
1154 || (DevicePathType (ParentPathPtr.DevPath) == END_DEVICE_PATH_TYPE));
1157 if ( (DevicePathType (ParentPathPtr.DevPath) != NodeType)
1158 || (DevicePathSubType (ParentPathPtr.DevPath) != NodeSubType))
1163 if ( (NodeType == MEDIA_DEVICE_PATH)
1164 && (NodeSubType == MEDIA_FILEPATH_DP))
1171 &ParentPathPtr.FilePath,
1172 &ChildPathPtr.FilePath
1182 NodeSize = DevicePathNodeLength (ChildPathPtr.DevPath);
1183 if (DevicePathNodeLength (ParentPathPtr.DevPath) != NodeSize) {
1188 (
sizeof (*ChildPathPtr.DevPath) == 4),
1189 "The Device Path comparison logic depends on the entire header being checked"
1193 (ChildPathPtr.DevPath + 1),
1194 (ParentPathPtr.DevPath + 1),
1195 (NodeSize - sizeof (*ChildPathPtr.DevPath))
1197 if (CmpResult != 0) {
1201 ParentPathPtr.DevPath = NextDevicePathNode (ParentPathPtr.DevPath);
1202 ChildPathPtr.DevPath = NextDevicePathNode (ChildPathPtr.DevPath);
1210 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath1,
1211 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath2
1220 IN EFI_DEVICE_PATH_PROTOCOL *ParentPath,
1221 IN EFI_DEVICE_PATH_PROTOCOL *ChildPath
1229 IN CONST FILEPATH_DEVICE_PATH *
FilePath
1239 IN CONST FILEPATH_DEVICE_PATH *
FilePath
1248 Size = DevicePathNodeLength (
FilePath) - SIZE_OF_FILEPATH_DEVICE_PATH;
1272 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
1276 CONST FILEPATH_DEVICE_PATH *
FilePath;
1278 ASSERT (DevicePath != NULL);
1279 ASSERT (IsDevicePathValid (DevicePath, 0));
1287 if ( (DevicePath->Type != MEDIA_DEVICE_PATH)
1288 || (DevicePath->SubType != MEDIA_FILEPATH_DP))
1293 FilePath = (FILEPATH_DEVICE_PATH *)DevicePath;
1299 DevicePath = NextDevicePathNode (DevicePath);
1300 }
while (!IsDevicePathEnd (DevicePath));
1302 return PathLength - 1;
1317 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
1328 return (
Len + 1) *
sizeof (CHAR16);
1345 IN CONST FILEPATH_DEVICE_PATH *
FilePath,
1346 IN UINTN PathNameSize
1367 PathLen * sizeof (*
FilePath->PathName)
1373 }
while (!IsDevicePathEnd (
FilePath));
1380 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
1381 OUT EFI_DEVICE_PATH_PROTOCOL **FileDevicePath OPTIONAL
1385 EFI_DEVICE_PATH_PROTOCOL *CurrNode;
1390 if (FileDevicePath != NULL) {
1391 *FileDevicePath = NULL;
1394 for (CurrNode = DevicePath; !IsDevicePathEnd (CurrNode); CurrNode = NextDevicePathNode (CurrNode)) {
1395 if ( (DevicePathType (CurrNode) == MEDIA_DEVICE_PATH)
1396 && (DevicePathSubType (CurrNode) == MEDIA_FILEPATH_DP))
1398 if (FileDevicePath != NULL) {
1399 *FileDevicePath = CurrNode;
1406 if (PathSize == 0) {
1410 Path = AllocatePool (PathSize);
1423EFI_DEVICE_PATH_PROTOCOL *
1425 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL,
1426 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathInstance
1431 EFI_DEVICE_PATH_PROTOCOL *DevPathWalker;
1432 EFI_DEVICE_PATH_PROTOCOL *CurrentInstance;
1434 UINTN AppendInstanceSize;
1435 UINTN CurrentInstanceSize;
1437 ASSERT (DevicePathInstance != NULL);
1439 if (DevicePath != NULL) {
1440 AppendInstanceSize = GetDevicePathSize (DevicePathInstance);
1441 DevPathWalker = DevicePath;
1444 CurrentInstance = GetNextDevicePathInstance (
1446 &CurrentInstanceSize
1448 if (CurrentInstance == NULL) {
1452 if (CurrentInstanceSize != AppendInstanceSize) {
1453 FreePool (CurrentInstance);
1463 FreePool (CurrentInstance);
1465 if (CmpResult == 0) {
1466 return DuplicateDevicePath (DevicePath);
1471 return AppendDevicePathInstance (DevicePath, DevicePathInstance);
1476 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
1483 while (!IsDevicePathEnd (DevicePath)) {
1484 if (IsDevicePathEndInstance (DevicePath)) {
1488 DevicePath = NextDevicePathNode (DevicePath);
1491 return NumInstances;
1496 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
1497 IN CONST CHAR16 *Suffix,
1510 ASSERT (SuffixLen == StrLen (Suffix));
1522 if (PathNameLen < SuffixLen) {
1526 PathNameSize = (PathNameLen + 1) *
sizeof (CHAR16);
1528 PathName = AllocatePool (PathNameSize);
1536 &
PathName[PathNameLen - SuffixLen],
CHAR16 PathName[DMG_FILE_PATH_LEN]
DMG_FILEPATH_DEVICE_PATH FilePath
DMG_SIZE_DEVICE_PATH Size
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
VOID DebugPrintDevicePath(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL)
STATIC BOOLEAN InternalDevicePathCmpWorker(IN EFI_DEVICE_PATH_PROTOCOL *ParentPath, IN EFI_DEVICE_PATH_PROTOCOL *ChildPath, IN BOOLEAN CheckChild)
BOOLEAN InternalFileDevicePathsEqualWorker(IN FILEPATH_DEVICE_PATH **FilePath1, IN FILEPATH_DEVICE_PATH **FilePath2)
UINTN OcFileDevicePathFullNameLen(IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath)
UINTN OcFileDevicePathNameLen(IN CONST FILEPATH_DEVICE_PATH *FilePath)
INTN OcFixAppleBootDevicePath(IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, OUT EFI_DEVICE_PATH_PROTOCOL **RemainingDevicePath)
EFI_DEVICE_PATH_PROTOCOL * FindDevicePathEndNode(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
VOID OcFixAppleBootDevicePathNodeRestoreFree(IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathNode, IN OUT APPLE_BOOT_DP_PATCH_CONTEXT *RestoreContext)
UINTN OcFileDevicePathNameSize(IN CONST FILEPATH_DEVICE_PATH *FilePath)
BOOLEAN EFIAPI IsDevicePathChild(IN EFI_DEVICE_PATH_PROTOCOL *ParentPath, IN EFI_DEVICE_PATH_PROTOCOL *ChildPath)
CHAR16 * OcCopyDevicePathFullName(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, OUT EFI_DEVICE_PATH_PROTOCOL **FileDevicePath OPTIONAL)
STATIC UINTN InternalFileDevicePathsEqualClipNextNode(IN FILEPATH_DEVICE_PATH **FilePath, OUT UINTN *ClipIndex)
STATIC BOOLEAN InternalFileDevicePathsEqualClipBottom(IN CONST FILEPATH_DEVICE_PATH *FilePath, IN OUT UINTN *FilePathLength, IN OUT UINTN *ClipIndex)
VOID OcFixAppleBootDevicePathNodeRestore(IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNode, IN CONST APPLE_BOOT_DP_PATCH_CONTEXT *RestoreContext)
STATIC INTN InternalFixAppleBootDevicePathVirtioNode(IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNode, OUT APPLE_BOOT_DP_PATCH_CONTEXT *RestoreContext OPTIONAL)
BOOLEAN OcDevicePathHasFilePathSuffix(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN CONST CHAR16 *Suffix, IN UINTN SuffixLen)
EFI_DEVICE_PATH_PROTOCOL * AbsoluteDevicePath(IN EFI_HANDLE Handle, IN EFI_DEVICE_PATH_PROTOCOL *RelativePath OPTIONAL)
STATIC UINTN InternalFileDevicePathsEqualClipNode(IN FILEPATH_DEVICE_PATH **FilePath, OUT UINTN *ClipIndex)
STATIC INTN InternalExpandNewPath(IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNode)
EFI_DEVICE_PATH_PROTOCOL * OcAppendDevicePathInstanceDedupe(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL, IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathInstance)
VOID OcFileDevicePathFullName(OUT CHAR16 *PathName, IN CONST FILEPATH_DEVICE_PATH *FilePath, IN UINTN PathNameSize)
INTN OcFixAppleBootDevicePathNode(IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath, IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePathNode, OUT APPLE_BOOT_DP_PATCH_CONTEXT *RestoreContext OPTIONAL, IN EFI_HANDLE ValidDevice OPTIONAL)
EFI_DEVICE_PATH_PROTOCOL * TrailedBooterDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
UINTN OcGetNumDevicePathInstances(IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath)
EFI_DEVICE_PATH_PROTOCOL * FindDevicePathNodeWithType(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN UINT8 Type, IN UINT8 SubType OPTIONAL)
BOOLEAN FileDevicePathsEqual(IN FILEPATH_DEVICE_PATH *FilePath1, IN FILEPATH_DEVICE_PATH *FilePath2)
EFI_DEVICE_PATH_PROTOCOL * AppendFileNameDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN CHAR16 *FileName)
UINTN OcFileDevicePathFullNameSize(IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath)
BOOLEAN EFIAPI IsDevicePathEqual(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath1, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath2)
EFI_DEVICE_PATH_PROTOCOL * OcGetNextLoadOptionDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *FilePath, IN EFI_DEVICE_PATH_PROTOCOL *FullPath)
#define MSG_APPLE_NVME_NAMESPACE_DP
INTN EFIAPI OcStriCmp(IN CONST CHAR16 *FirstString, IN CONST CHAR16 *SecondString)
APPLE_EVENT_HANDLE Handle
INTN EFIAPI CompareMem(IN CONST VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
EFI_GUID gEfiBlockIoProtocolGuid
EFI_GUID gEfiDevicePathProtocolGuid
EFI_DEVICE_PATH_PROTOCOL *EFIAPI DevicePathFromHandle(IN EFI_HANDLE Handle)