12#include <IndustryStandard/Pci.h>
17#include <Protocol/BlockIo.h>
18#include <Protocol/LoadFile.h>
19#include <Protocol/PciIo.h>
20#include <Protocol/SimpleFileSystem.h>
21#include <Protocol/UsbIo.h>
23#include <Library/BaseLib.h>
24#include <Library/BaseMemoryLib.h>
26#include <Library/DevicePathLib.h>
28#include <Library/MemoryAllocationLib.h>
30#include <Library/UefiBootServicesTableLib.h>
32#define ACPI_VMD0001_HID 0x000159A4
33#define ACPI_VBS0001_HID 0x00015853
54 EFI_HANDLE *HandleBuffer;
64 Status =
gBS->LocateHandleBuffer (
71 if (!EFI_ERROR (Status)) {
72 for (Index = 0; Index < HandleCount; Index++) {
73 gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
76 FreePool (HandleBuffer);
94 IN EFI_USB_IO_PROTOCOL *UsbIo,
95 IN USB_CLASS_DEVICE_PATH *UsbClass
99 EFI_USB_DEVICE_DESCRIPTOR DevDesc;
100 EFI_USB_INTERFACE_DESCRIPTOR IfDesc;
102 UINT8 DeviceSubClass;
103 UINT8 DeviceProtocol;
105 if ((DevicePathType (UsbClass) != MESSAGING_DEVICE_PATH) ||
106 (DevicePathSubType (UsbClass) != MSG_USB_CLASS_DP))
114 Status = UsbIo->UsbGetDeviceDescriptor (UsbIo, &DevDesc);
115 if (EFI_ERROR (Status)) {
119 if ((UsbClass->VendorId != 0xffff) &&
120 (UsbClass->VendorId != DevDesc.IdVendor))
125 if ((UsbClass->ProductId != 0xffff) &&
126 (UsbClass->ProductId != DevDesc.IdProduct))
131 DeviceClass = DevDesc.DeviceClass;
132 DeviceSubClass = DevDesc.DeviceSubClass;
133 DeviceProtocol = DevDesc.DeviceProtocol;
134 if (DeviceClass == 0) {
139 Status = UsbIo->UsbGetInterfaceDescriptor (UsbIo, &IfDesc);
140 if (EFI_ERROR (Status)) {
144 DeviceClass = IfDesc.InterfaceClass;
145 DeviceSubClass = IfDesc.InterfaceSubClass;
146 DeviceProtocol = IfDesc.InterfaceProtocol;
152 if ((UsbClass->DeviceClass != 0xff) &&
153 (UsbClass->DeviceClass != DeviceClass))
158 if ((UsbClass->DeviceSubClass != 0xff) &&
159 (UsbClass->DeviceSubClass != DeviceSubClass))
164 if ((UsbClass->DeviceProtocol != 0xff) &&
165 (UsbClass->DeviceProtocol != DeviceProtocol))
187 IN EFI_USB_IO_PROTOCOL *UsbIo,
188 IN USB_WWID_DEVICE_PATH *UsbWwid
192 EFI_USB_DEVICE_DESCRIPTOR DevDesc;
193 EFI_USB_INTERFACE_DESCRIPTOR IfDesc;
199 CHAR16 *SerialNumberStr;
202 if ((DevicePathType (UsbWwid) != MESSAGING_DEVICE_PATH) ||
203 (DevicePathSubType (UsbWwid) != MSG_USB_WWID_DP))
211 Status = UsbIo->UsbGetDeviceDescriptor (UsbIo, &DevDesc);
212 if (EFI_ERROR (Status)) {
216 if ((DevDesc.IdVendor != UsbWwid->VendorId) ||
217 (DevDesc.IdProduct != UsbWwid->ProductId))
225 Status = UsbIo->UsbGetInterfaceDescriptor (UsbIo, &IfDesc);
226 if (EFI_ERROR (Status)) {
230 if (IfDesc.InterfaceNumber != UsbWwid->InterfaceNumber) {
237 if (DevDesc.StrSerialNumber == 0) {
246 Status = UsbIo->UsbGetSupportedLanguages (UsbIo, &LangIdTable, &TableSize);
247 if (EFI_ERROR (Status) || (TableSize == 0) || (LangIdTable == NULL)) {
254 CompareStr = (CHAR16 *)(UINTN)(UsbWwid + 1);
255 CompareLen = (DevicePathNodeLength (UsbWwid) -
sizeof (USB_WWID_DEVICE_PATH)) /
sizeof (CHAR16);
256 if (CompareStr[CompareLen - 1] == L
'\0') {
263 for (Index = 0; Index < TableSize /
sizeof (UINT16); Index++) {
264 SerialNumberStr = NULL;
265 Status = UsbIo->UsbGetStringDescriptor (
268 DevDesc.StrSerialNumber,
271 if (EFI_ERROR (Status) || (SerialNumberStr == NULL)) {
275 Length = StrLen (SerialNumberStr);
276 if ((
Length >= CompareLen) &&
277 (
CompareMem (SerialNumberStr +
Length - CompareLen, CompareStr, CompareLen *
sizeof (CHAR16)) == 0))
279 FreePool (SerialNumberStr);
283 FreePool (SerialNumberStr);
307 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
308 IN UINTN ParentDevicePathSize,
309 OUT UINTN *UsbIoHandleCount
313 EFI_HANDLE *UsbIoHandles;
314 EFI_DEVICE_PATH_PROTOCOL *UsbIoDevicePath;
315 EFI_USB_IO_PROTOCOL *UsbIo;
319 ASSERT (UsbIoHandleCount != NULL);
324 Status =
gBS->LocateHandleBuffer (
326 &gEfiUsbIoProtocolGuid,
331 if (EFI_ERROR (Status)) {
332 *UsbIoHandleCount = 0;
336 for (Index = 0; Index < *UsbIoHandleCount; ) {
340 Status =
gBS->HandleProtocol (
342 &gEfiUsbIoProtocolGuid,
347 if (!EFI_ERROR (Status) && (UsbIoDevicePath != NULL)) {
351 if (
CompareMem (UsbIoDevicePath, DevicePath, ParentDevicePathSize) == 0) {
352 if (
BmMatchUsbClass (UsbIo, (USB_CLASS_DEVICE_PATH *)((UINTN)DevicePath + ParentDevicePathSize)) ||
353 BmMatchUsbWwid (UsbIo, (USB_WWID_DEVICE_PATH *)((UINTN)DevicePath + ParentDevicePathSize)))
361 (*UsbIoHandleCount)--;
362 CopyMem (&UsbIoHandles[Index], &UsbIoHandles[Index + 1], (*UsbIoHandleCount - Index) *
sizeof (EFI_HANDLE));
398EFI_DEVICE_PATH_PROTOCOL *
400 IN EFI_DEVICE_PATH_PROTOCOL *
FilePath,
401 IN EFI_DEVICE_PATH_PROTOCOL *FullPath,
402 IN EFI_DEVICE_PATH_PROTOCOL *ShortformNode
405 UINTN ParentDevicePathSize;
406 EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
407 EFI_DEVICE_PATH_PROTOCOL *NextFullPath;
414 GetNext = (BOOLEAN)(FullPath == NULL);
415 ParentDevicePathSize = (UINTN)ShortformNode - (UINTN)
FilePath;
416 RemainingDevicePath = NextDevicePathNode (ShortformNode);
419 for (Index = 0; Index < HandleCount; Index++) {
430 if (NextFullPath == NULL) {
440 GetNext = (BOOLEAN)(
CompareMem (NextFullPath, FullPath, GetDevicePathSize (NextFullPath)) == 0);
441 FreePool (NextFullPath);
446 if (Handles != NULL) {
464EFI_DEVICE_PATH_PROTOCOL *
466 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
467 IN EFI_DEVICE_PATH_PROTOCOL *FullPath,
472 EFI_BLOCK_IO_PROTOCOL *BlockIo;
474 EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
475 EFI_DEVICE_PATH_PROTOCOL *NextFullPath;
478 EFI_HANDLE *SimpleFileSystemHandles;
479 UINTN NumberSimpleFileSystemHandles;
483 GetNext = (BOOLEAN)(FullPath == NULL);
496 gBS->ConnectController (
Handle, NULL, NULL, TRUE);
507 if (EFI_ERROR (Status)) {
511 Buffer = AllocatePool (BlockIo->Media->BlockSize);
513 BlockIo->ReadBlocks (
515 BlockIo->Media->MediaId,
517 BlockIo->Media->BlockSize,
527 Size = GetDevicePathSize (DevicePath) - END_DEVICE_PATH_LENGTH;
528 gBS->LocateHandleBuffer (
532 &NumberSimpleFileSystemHandles,
533 &SimpleFileSystemHandles
535 for (Index = 0; Index < NumberSimpleFileSystemHandles; Index++) {
540 TempSize = GetDevicePathSize (TempDevicePath) - END_DEVICE_PATH_LENGTH;
546 NextFullPath = DuplicateDevicePath (TempDevicePath);
550 GetNext = (BOOLEAN)(
CompareMem (NextFullPath, FullPath, GetDevicePathSize (NextFullPath)) == 0);
551 FreePool (NextFullPath);
557 if (SimpleFileSystemHandles != NULL) {
558 FreePool (SimpleFileSystemHandles);
582 IN EFI_DEVICE_PATH_PROTOCOL *BlockIoDevicePath,
583 IN HARDDRIVE_DEVICE_PATH *HardDriveDevicePath,
587 HARDDRIVE_DEVICE_PATH *Node;
588 CONST EFI_PARTITION_ENTRY *PartEntry;
590 if ((BlockIoDevicePath == NULL) || (HardDriveDevicePath == NULL)) {
596 && ( (HardDriveDevicePath->MBRType != MBR_TYPE_EFI_PARTITION_TABLE_HEADER)
597 || (HardDriveDevicePath->SignatureType != SIGNATURE_TYPE_GUID)))
605 while (!IsDevicePathEnd (BlockIoDevicePath)) {
606 if ((DevicePathType (BlockIoDevicePath) == MEDIA_DEVICE_PATH) &&
607 (DevicePathSubType (BlockIoDevicePath) == MEDIA_HARDDRIVE_DP)
613 Node = (HARDDRIVE_DEVICE_PATH *)BlockIoDevicePath;
619 if ((Node->MBRType == HardDriveDevicePath->MBRType) &&
620 (Node->SignatureType == HardDriveDevicePath->SignatureType) &&
621 (
CompareMem (Node->Signature, HardDriveDevicePath->Signature, sizeof (Node->Signature)) == 0))
625 if (Node->PartitionNumber == HardDriveDevicePath->PartitionNumber) {
630 if ( (PartEntry != NULL)
631 &&
CompareGuid (&PartEntry->PartitionTypeGUID, &gEfiPartTypeSystemPartGuid))
639 BlockIoDevicePath = NextDevicePathNode (BlockIoDevicePath);
659EFI_DEVICE_PATH_PROTOCOL *
661 IN EFI_DEVICE_PATH_PROTOCOL *
FilePath
665 UINTN BlockIoHandleCount;
666 EFI_HANDLE *BlockIoBuffer;
667 EFI_DEVICE_PATH_PROTOCOL *BlockIoDevicePath;
669 EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
670 EFI_DEVICE_PATH_PROTOCOL *FullPath;
683 if (EFI_ERROR (Status)) {
684 BlockIoHandleCount = 0;
685 BlockIoBuffer = NULL;
694 for (Index = 0; Index < BlockIoHandleCount; Index++) {
696 if (BlockIoDevicePath == NULL) {
704 TempDevicePath = AppendDevicePath (BlockIoDevicePath, NextDevicePathNode (
FilePath));
706 FreePool (TempDevicePath);
708 if (FullPath != NULL) {
714 if (FullPath != NULL) {
731 if (BlockIoBuffer != NULL) {
732 FreePool (BlockIoBuffer);
756 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath
763 EFI_PCI_IO_PROTOCOL *PciIo;
765 BOOLEAN AtLeastOneConnected;
770 if (DevicePath == NULL) {
771 return EFI_INVALID_PARAMETER;
774 if ((DevicePathType (DevicePath) != MESSAGING_DEVICE_PATH) ||
775 ((DevicePathSubType (DevicePath) != MSG_USB_CLASS_DP) && (DevicePathSubType (DevicePath) != MSG_USB_WWID_DP))
778 return EFI_INVALID_PARAMETER;
784 AtLeastOneConnected = FALSE;
785 Status =
gBS->LocateHandleBuffer (
787 &gEfiPciIoProtocolGuid,
792 if (!EFI_ERROR (Status)) {
793 for (Index = 0; Index < HandleCount; Index++) {
794 Status =
gBS->HandleProtocol (
796 &gEfiPciIoProtocolGuid,
799 if (!EFI_ERROR (Status)) {
803 Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class);
804 if (!EFI_ERROR (Status) &&
805 ((PCI_CLASS_SERIAL == Class[2]) && (PCI_CLASS_SERIAL_USB == Class[1]))
808 Status =
gBS->ConnectController (
814 if (!EFI_ERROR (Status)) {
815 AtLeastOneConnected = TRUE;
821 if (Handles != NULL) {
826 return AtLeastOneConnected ? EFI_SUCCESS : EFI_NOT_FOUND;
850EFI_DEVICE_PATH_PROTOCOL *
852 IN EFI_DEVICE_PATH_PROTOCOL *
FilePath
858 EFI_HANDLE *HandleBuffer;
859 EFI_DEVICE_PATH_PROTOCOL *HvDevicePath;
860 EFI_DEVICE_PATH_PROTOCOL *Node;
861 EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
864 SCSI_DEVICE_PATH *FileScsiPath;
865 SCSI_DEVICE_PATH *HvScsiPath;
869 FilePathSize = GetDevicePathSize (
FilePath);
875 if ( (DevicePathType (
FilePath) == MESSAGING_DEVICE_PATH)
876 && (DevicePathSubType (
FilePath) == MSG_SCSI_DP))
878 FileScsiPath = (SCSI_DEVICE_PATH *)
FilePath;
882 Status =
gBS->LocateHandleBuffer (
890 if (EFI_ERROR (Status)) {
894 for (Index = 0; Index < HandleCount; ++Index) {
895 Status =
gBS->HandleProtocol (
898 (VOID **)&HvDevicePath
900 if (EFI_ERROR (Status)) {
906 for (Node = HvDevicePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {
910 if ( (FileScsiPath != NULL)
911 && (DevicePathType (Node) == MESSAGING_DEVICE_PATH)
912 && (DevicePathSubType (Node) == MSG_SCSI_DP))
914 HvScsiPath = (SCSI_DEVICE_PATH *)Node;
915 if ((HvScsiPath->Pun == FileScsiPath->Lun) && (HvScsiPath->Lun == FileScsiPath->Pun)) {
925 if ( (DevicePathType (Node) == DevicePathType (
FilePath))
926 && (DevicePathSubType (Node) == DevicePathSubType (
FilePath)))
931 HvSuffixSize = GetDevicePathSize (Node) - END_DEVICE_PATH_LENGTH;
932 if (FilePathSize < HvSuffixSize) {
937 NewDevicePath = AppendDevicePath (
939 (VOID *)((UINTN)
FilePath + HvSuffixSize)
941 if (NewDevicePath != NULL) {
945 FreePool (HandleBuffer);
946 return NewDevicePath;
952 FreePool (HandleBuffer);
976EFI_DEVICE_PATH_PROTOCOL *
978 IN EFI_DEVICE_PATH_PROTOCOL *
FilePath
984 EFI_HANDLE *HandleBuffer;
985 EFI_DEVICE_PATH_PROTOCOL *SdDevicePath;
986 EFI_DEVICE_PATH_PROTOCOL *Node;
987 EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
993 FilePathSize = GetDevicePathSize (
FilePath);
995 Status =
gBS->LocateHandleBuffer (
1003 if (EFI_ERROR (Status)) {
1007 for (Index = 0; Index < HandleCount; ++Index) {
1008 Status =
gBS->HandleProtocol (
1009 HandleBuffer[Index],
1011 (VOID **)&SdDevicePath
1013 if (EFI_ERROR (Status)) {
1019 for (Node = SdDevicePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {
1023 if ( (DevicePathType (Node) == DevicePathType (
FilePath))
1024 && (DevicePathSubType (Node) == DevicePathSubType (
FilePath)))
1029 SdSuffixSize = GetDevicePathSize (Node) - END_DEVICE_PATH_LENGTH;
1030 if (FilePathSize < SdSuffixSize) {
1035 NewDevicePath = AppendDevicePath (
1037 (VOID *)((UINTN)
FilePath + SdSuffixSize)
1039 if (NewDevicePath != NULL) {
1043 FreePool (HandleBuffer);
1044 return NewDevicePath;
1050 FreePool (HandleBuffer);
1054EFI_DEVICE_PATH_PROTOCOL *
1056 IN EFI_DEVICE_PATH_PROTOCOL *
FilePath,
1057 IN EFI_DEVICE_PATH_PROTOCOL *FullPath
1061 EFI_DEVICE_PATH_PROTOCOL *Node;
1062 EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
1063 ACPI_HID_DEVICE_PATH *AcpiNode;
1064 VENDOR_DEFINED_DEVICE_PATH *VendorNode;
1074 if (!EFI_ERROR (Status)) {
1075 if (FullPath != NULL) {
1079 return DuplicateDevicePath (
FilePath);
1087 if ( (FullPath == NULL)
1088 && (DevicePathType (Node) == ACPI_DEVICE_PATH)
1089 && (DevicePathSubType (Node) == ACPI_DP)
1090 && (DevicePathNodeLength (Node) ==
sizeof (ACPI_HID_DEVICE_PATH)))
1092 AcpiNode = (ACPI_HID_DEVICE_PATH *)Node;
1097 Node = NextDevicePathNode (Node);
1098 if ( (DevicePathType (Node) == ACPI_DEVICE_PATH)
1099 && (DevicePathSubType (Node) == ACPI_DP)
1100 && (DevicePathNodeLength (Node) ==
sizeof (ACPI_HID_DEVICE_PATH)))
1102 AcpiNode = (ACPI_HID_DEVICE_PATH *)Node;
1104 Node = NextDevicePathNode (Node);
1116 if (FullPath == NULL) {
1117 for (DeviceNode = Node; !IsDevicePathEnd (DeviceNode); DeviceNode = NextDevicePathNode (DeviceNode)) {
1118 if ((DevicePathType (DeviceNode) == MESSAGING_DEVICE_PATH) && (DevicePathSubType (DeviceNode) == MSG_VENDOR_DP)) {
1119 VendorNode = (VENDOR_DEFINED_DEVICE_PATH *)DeviceNode;
1121 Node = NextDevicePathNode (DeviceNode);
1129 if (!EFI_ERROR (Status) && IsDevicePathEnd (Node)) {
1138 if ((DevicePathType (
FilePath) == MEDIA_DEVICE_PATH) &&
1139 (DevicePathSubType (
FilePath) == MEDIA_HARDDRIVE_DP))
1144 if (FullPath == NULL) {
1149 }
else if ((DevicePathType (
FilePath) == MESSAGING_DEVICE_PATH) &&
1150 (DevicePathSubType (
FilePath) == MSG_URI_DP))
1158 Status =
gBS->LocateDevicePath (&gEfiUsbIoProtocolGuid, &Node, &
Handle);
1159 if (EFI_ERROR (Status)) {
1165 for (Node =
FilePath; !IsDevicePathEnd (Node); Node = NextDevicePathNode (Node)) {
1166 if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) &&
1167 ((DevicePathSubType (Node) == MSG_USB_CLASS_DP) || (DevicePathSubType (Node) == MSG_USB_WWID_DP)))
1176 if (!IsDevicePathEnd (Node)) {
1195 if (FullPath != NULL) {
EFI_GUID gAppleSdCardVendorDevicePathGuid
STATIC BOOLEAN mConnectAllExecuted
EFI_DEVICE_PATH_PROTOCOL * OcGetNextLoadOptionDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *FilePath, IN EFI_DEVICE_PATH_PROTOCOL *FullPath)
STATIC EFI_STATUS BmConnectUsbShortFormDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath)
VOID InternalConnectAll(VOID)
STATIC EFI_DEVICE_PATH_PROTOCOL * BmExpandUsbDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *FilePath, IN EFI_DEVICE_PATH_PROTOCOL *FullPath, IN EFI_DEVICE_PATH_PROTOCOL *ShortformNode)
STATIC EFI_DEVICE_PATH_PROTOCOL * BmExpandHyperVDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *FilePath)
STATIC EFI_DEVICE_PATH_PROTOCOL * BmExpandMediaDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN EFI_DEVICE_PATH_PROTOCOL *FullPath, IN EFI_HANDLE Handle)
STATIC BOOLEAN BmMatchPartitionDevicePathNode(IN EFI_HANDLE Handle, IN EFI_DEVICE_PATH_PROTOCOL *BlockIoDevicePath, IN HARDDRIVE_DEVICE_PATH *HardDriveDevicePath, IN BOOLEAN LocateEsp)
STATIC EFI_DEVICE_PATH_PROTOCOL * BmExpandPartitionDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *FilePath)
STATIC BOOLEAN BmMatchUsbClass(IN EFI_USB_IO_PROTOCOL *UsbIo, IN USB_CLASS_DEVICE_PATH *UsbClass)
STATIC EFI_HANDLE * BmFindUsbDevice(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN UINTN ParentDevicePathSize, OUT UINTN *UsbIoHandleCount)
STATIC BOOLEAN BmMatchUsbWwid(IN EFI_USB_IO_PROTOCOL *UsbIo, IN USB_WWID_DEVICE_PATH *UsbWwid)
STATIC EFI_DEVICE_PATH_PROTOCOL * BmExpandAppleSDCardDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *FilePath)
DMG_FILEPATH_DEVICE_PATH FilePath
DMG_SIZE_DEVICE_PATH Size
VOID DebugPrintDevicePath(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL)
CONST EFI_PARTITION_ENTRY * OcGetGptPartitionEntry(IN EFI_HANDLE FsHandle)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
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)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
EFI_GUID gEfiSimpleFileSystemProtocolGuid
EFI_GUID gEfiBlockIoProtocolGuid
EFI_GUID gEfiDevicePathProtocolGuid
EFI_DEVICE_PATH_PROTOCOL *EFIAPI DevicePathFromHandle(IN EFI_HANDLE Handle)