17#include <IndustryStandard/Mbr.h>
19#include <Protocol/BlockIo.h>
20#include <Protocol/BlockIo2.h>
21#include <Protocol/DiskIo.h>
22#include <Protocol/DiskIo2.h>
24#include <Library/BaseLib.h>
25#include <Library/BaseMemoryLib.h>
26#include <Library/BaseOverflowLib.h>
27#include <Library/DebugLib.h>
28#include <Library/DevicePathLib.h>
29#include <Library/MemoryAllocationLib.h>
33#include <Library/UefiBootServicesTableLib.h>
36 0x1A81704, 0x3442, 0x4A7D, { 0x87, 0x40, 0xF4, 0xEC, 0x5B, 0xBE, 0x59, 0x77 }
40 0x9FC6B19, 0xB8A1, 0x4A01, { 0x8D, 0xB1, 0x87, 0x94, 0xE7, 0x63, 0x4C, 0xA5 }
43#define MBR_PARTITION_ACTIVE 0x80
48 IN EFI_HANDLE DiskHandle,
49 IN BOOLEAN UseBlockIo2
55 ASSERT (DiskHandle != NULL);
61 Status =
gBS->HandleProtocol (
63 &gEfiBlockIo2ProtocolGuid,
64 (VOID **)&Context->BlockIo2
67 Context->BlockIo2 = NULL;
71 if (EFI_ERROR (Status)) {
72 Status =
gBS->HandleProtocol (
75 (VOID **)&Context->BlockIo
78 Context->BlockIo = NULL;
81 if (EFI_ERROR (Status)) {
84 "OCPI: Block I/O (%d/%d) protocols (%d) are not present on %p - %r\n",
85 Context->BlockIo != NULL,
86 Context->BlockIo2 != NULL,
94 if ((Context->BlockIo2 != NULL) && (Context->BlockIo2->Media != NULL)) {
95 Context->BlockSize = Context->BlockIo2->Media->BlockSize;
96 Context->MediaId = Context->BlockIo2->Media->MediaId;
97 }
else if ((Context->BlockIo != NULL) && (Context->BlockIo->Media != NULL)) {
98 Context->BlockSize = Context->BlockIo->Media->BlockSize;
99 Context->MediaId = Context->BlockIo->Media->MediaId;
101 return EFI_UNSUPPORTED;
107 if ((Context->BlockSize == 0) || ((Context->BlockSize & (Context->BlockSize - 1)) != 0)) {
108 DEBUG ((DEBUG_INFO,
"OCPI: Block I/O has invalid block size %u\n", Context->BlockSize));
109 return EFI_UNSUPPORTED;
125 ASSERT (Context->BlockIo != NULL || Context->BlockIo2 != NULL);
126 ASSERT ((BufferSize & (Context->BlockSize - 1)) == 0);
128 if (Context->BlockIo2 != NULL) {
129 Status = Context->BlockIo2->ReadBlocksEx (
138 Status = Context->BlockIo->ReadBlocks (
160 ASSERT (Context->BlockIo != NULL || Context->BlockIo2 != NULL);
161 ASSERT ((BufferSize & (Context->BlockSize - 1)) == 0);
163 if (Context->BlockIo2 != NULL) {
164 Status = Context->BlockIo2->WriteBlocksEx (
173 Status = Context->BlockIo->WriteBlocks (
189 IN CONST CHAR8 *Message,
190 IN CONST EFI_PARTITION_ENTRY *PartitionEntry
193 ASSERT (PartitionEntry != NULL);
198 "- PartitionTypeGUID: %g\n"
199 "- UniquePartitionGUID: %g\n"
200 "- StartingLBA: %lx\n"
202 "- Attributes: %lx\n"
203 "- PartitionName: %s\n",
205 PartitionEntry->PartitionTypeGUID,
206 PartitionEntry->UniquePartitionGUID,
207 PartitionEntry->StartingLBA,
208 PartitionEntry->EndingLBA,
209 PartitionEntry->Attributes,
210 PartitionEntry->PartitionName
217 IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath,
218 IN BOOLEAN IsPartitionPath,
219 OUT BOOLEAN *HasBlockIo2
222 EFI_HANDLE DiskHandle;
226 EFI_DEVICE_PATH_PROTOCOL *DiskPath;
227 EFI_DEVICE_PATH_PROTOCOL *TempPath;
229 ASSERT (HdDevicePath != NULL);
230 ASSERT (HasBlockIo2 != NULL);
232 if (IsPartitionPath) {
235 DiskPath = HdDevicePath;
239 Status =
gBS->LocateDevicePath (
240 &gEfiBlockIo2ProtocolGuid,
244 *HasBlockIo2 = !EFI_ERROR (Status);
246 if (EFI_ERROR (Status)) {
248 Status =
gBS->LocateDevicePath (
255 if (EFI_ERROR (Status)) {
258 "OCPI: Failed to locate disk",
265 if (IsPartitionPath && (DiskPath != NULL)) {
279EFI_DEVICE_PATH_PROTOCOL *
281 IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath
284 EFI_DEVICE_PATH_PROTOCOL *PrefixPath;
285 EFI_DEVICE_PATH_PROTOCOL *TempPath;
286 CONST EFI_DEVICE_PATH_PROTOCOL *HdNode;
288 ASSERT (HdDevicePath != NULL);
295 if (HdNode == NULL) {
301 if (HdNode == NULL) {
306 PrefixPath = DuplicateDevicePath (HdDevicePath);
307 if (PrefixPath == NULL) {
308 DEBUG ((DEBUG_INFO,
"OCPI: DP allocation error\n"));
316 TempPath = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)PrefixPath + ((UINTN)HdNode - (UINTN)HdDevicePath));
317 SetDevicePathEndNode (TempPath);
319 TempPath = PrefixPath;
332 IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath
337 ASSERT (HdDevicePath != NULL);
354 IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath
359 ASSERT (HdDevicePath != NULL);
370 IN EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath
373 EFI_DEVICE_PATH_PROTOCOL *DevicePathWalker;
375 ASSERT (DiskDevicePath != NULL);
377 DevicePathWalker = DiskDevicePath;
378 while (!IsDevicePathEnd (DevicePathWalker)) {
379 if ( (DevicePathType (DevicePathWalker) == MEDIA_DEVICE_PATH)
380 && (DevicePathSubType (DevicePathWalker) == MEDIA_CDROM_DP))
385 DevicePathWalker = NextDevicePathNode (DevicePathWalker);
393 IN EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath,
395 OUT UINTN *BufferSize
400 UINTN BootBufferSize;
402 CDROM_DEVICE_PATH *CdNode;
403 EFI_HANDLE DiskHandle;
406 ASSERT (DiskDevicePath != NULL);
408 ASSERT (BufferSize != NULL);
413 CdNode = (CDROM_DEVICE_PATH *)(
420 if (CdNode == NULL) {
421 DEBUG ((DEBUG_INFO,
"OCPI: Device Path does not describe a CD-ROM\n"));
422 return EFI_UNSUPPORTED;
428 if (EFI_ERROR (Status)) {
435 BootBufferSize = (UINTN)(CdNode->PartitionSize * DiskContext.
BlockSize);
436 BootBuffer = AllocatePool (BootBufferSize);
437 if (BootBuffer == NULL) {
438 return EFI_OUT_OF_RESOURCES;
443 CdNode->PartitionStart,
447 if (EFI_ERROR (Status)) {
448 FreePool (BootBuffer);
453 *BufferSize = BootBufferSize;
457EFI_DEVICE_PATH_PROTOCOL *
459 IN CONST EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath,
460 OUT UINTN *EspDevicePathSize,
461 OUT EFI_HANDLE *EspDeviceHandle
464 EFI_DEVICE_PATH_PROTOCOL *EspDevicePath;
477 EFI_DEVICE_PATH_PROTOCOL *HdDevicePath;
480 CONST EFI_PARTITION_ENTRY *PartEntry;
482 ASSERT (DiskDevicePath != NULL);
483 ASSERT (EspDevicePathSize != NULL);
484 ASSERT (EspDeviceHandle != NULL);
488 "OCPI: Locating disk's ESP",
489 (EFI_DEVICE_PATH_PROTOCOL *)DiskDevicePath
492 Status =
gBS->LocateHandleBuffer (
499 if (EFI_ERROR (Status)) {
500 DEBUG ((DEBUG_INFO,
"OCPI: Failed to locate FS handles\n"));
504 EspDevicePath = NULL;
506 DiskDpSize = GetDevicePathSize (DiskDevicePath);
511 Result = BaseOverflowAddUN (
513 sizeof (HARDDRIVE_DEVICE_PATH),
517 DEBUG ((DEBUG_INFO,
"OCPI: HD node would overflow DP\n"));
521 for (Index = 0; Index < NumHandles; ++Index) {
525 if (HdDevicePath == NULL) {
529 HdDpSize = GetDevicePathSize (HdDevicePath);
530 if (HdDpSize < DiskDpCmpSize) {
540 DiskDpSize - END_DEVICE_PATH_LENGTH
542 if (CmpResult != 0) {
549 if (PartEntry == NULL) {
555 "OCPI: Discovered PartEntry",
559 if (
CompareGuid (&PartEntry->PartitionTypeGUID, &gEfiPartTypeSystemPartGuid)) {
560 EspDevicePath = HdDevicePath;
561 *EspDevicePathSize = HdDpSize;
562 *EspDeviceHandle =
Handle;
569 return EspDevicePath;
574 IN EFI_HANDLE DiskHandle,
575 IN BOOLEAN UseBlockIo2
585 EFI_LBA PartEntryLBA;
586 UINT32 NumPartitions;
587 UINT32 PartEntrySize;
588 UINTN PartEntriesSize;
589 UINTN PartEntriesStructSize;
591 EFI_PARTITION_TABLE_HEADER *GptHeader;
593 ASSERT (DiskHandle != NULL);
595 Status =
gBS->HandleProtocol (
598 (VOID **)&PartEntries
600 if (!EFI_ERROR (Status)) {
601 DEBUG ((DEBUG_VERBOSE,
"OCPI: Located cached partition entries\n"));
606 if (EFI_ERROR (Status)) {
613 BufferSize = ALIGN_VALUE (
sizeof (*GptHeader), DiskContext.
BlockSize);
614 GptHeader = AllocatePool (BufferSize);
615 if (GptHeader == NULL) {
616 DEBUG ((DEBUG_INFO,
"OCPI: GPT header allocation error\n"));
622 PRIMARY_PART_HEADER_LBA,
626 if (EFI_ERROR (Status)) {
627 FreePool (GptHeader);
630 "OCPI: ReadDisk1 (block: %u, io1: %d, io2: %d, size: %u) %r\n",
640 if (GptHeader->Header.Signature != EFI_PTAB_HEADER_ID) {
641 FreePool (GptHeader);
642 DEBUG ((DEBUG_INFO,
"OCPI: Partition table not supported\n"));
646 PartEntrySize = GptHeader->SizeOfPartitionEntry;
647 if (PartEntrySize <
sizeof (EFI_PARTITION_ENTRY)) {
648 FreePool (GptHeader);
649 DEBUG ((DEBUG_INFO,
"OCPI: GPT header is malformed\n"));
653 NumPartitions = GptHeader->NumberOfPartitionEntries;
654 PartEntryLBA = GptHeader->PartitionEntryLBA;
656 FreePool (GptHeader);
658 Result = BaseOverflowMulUN (NumPartitions, PartEntrySize, &PartEntriesSize);
659 if (Result || (MAX_UINTN - DiskContext.
BlockSize < PartEntriesSize)) {
660 DEBUG ((DEBUG_INFO,
"OCPI: Partition entries size overflows\n"));
664 PartEntriesSize = ALIGN_VALUE (PartEntriesSize, DiskContext.
BlockSize);
666 Result = BaseOverflowAddUN (
667 sizeof (PartEntries),
669 &PartEntriesStructSize
672 DEBUG ((DEBUG_INFO,
"OCPI: Partition entries struct size overflows\n"));
679 PartEntries = AllocatePool (PartEntriesStructSize);
680 if (PartEntries == NULL) {
681 DEBUG ((DEBUG_INFO,
"OCPI: Partition entries allocation error\n"));
691 if (EFI_ERROR (Status)) {
692 FreePool (PartEntries);
695 "OCPI: ReadDisk2 (block: %u, io1: %d, io2: %d, size: %u) %r\n",
699 (UINT32)PartEntriesSize,
710 Status =
gBS->InstallMultipleProtocolInterfaces (
716 if (EFI_ERROR (Status)) {
717 DEBUG ((DEBUG_INFO,
"OCPI: Failed to cache partition entries\n"));
718 FreePool (PartEntries);
731CONST EFI_PARTITION_ENTRY *
733 IN EFI_HANDLE FsHandle
736 CONST EFI_PARTITION_ENTRY *PartEntry;
740 EFI_DEVICE_PATH_PROTOCOL *FsDevicePath;
741 CONST HARDDRIVE_DEVICE_PATH *HdNode;
742 EFI_HANDLE DiskHandle;
746 ASSERT (FsHandle != NULL);
748 Status =
gBS->HandleProtocol (
753 if (!EFI_ERROR (Status)) {
754 DEBUG ((DEBUG_VERBOSE,
"OCPI: Located cached partition entry\n"));
762 if (FsDevicePath == NULL) {
763 DEBUG ((DEBUG_INFO,
"OCPI: Failed to retrieve Device Path\n"));
767 HdNode = (HARDDRIVE_DEVICE_PATH *)(
774 if (HdNode == NULL) {
775 DEBUG ((DEBUG_INFO,
"OCPI: Device Path does not describe a partition\n"));
784 if (DiskHandle == NULL) {
787 "OCPI: Could not locate partition's disk",
797 if (Partitions == NULL) {
798 DEBUG ((DEBUG_INFO,
"OCPI: Failed to retrieve disk info\n"));
802 if (HdNode->PartitionNumber > Partitions->NumPartitions) {
803 DEBUG ((DEBUG_INFO,
"OCPI: Partition is OOB\n"));
807 ASSERT (HdNode->PartitionNumber > 0);
808 Offset = ((UINTN)(HdNode->PartitionNumber - 1) * Partitions->PartitionEntrySize);
809 PartEntry = (EFI_PARTITION_ENTRY *)((UINTN)Partitions->FirstEntry + Offset);
813 Status =
gBS->InstallMultipleProtocolInterfaces (
819 if (EFI_ERROR (Status)) {
820 DEBUG ((DEBUG_INFO,
"OCPI: Failed to cache partition entry\n"));
829 IN EFI_HANDLE DiskHandle,
830 IN BOOLEAN CheckPartitions
834 MASTER_BOOT_RECORD *Mbr;
838 BOOLEAN IsProtectiveMbr;
840 ASSERT (DiskHandle != NULL);
850 if (EFI_ERROR (Status)) {
854 MbrSize = ALIGN_VALUE (
sizeof (*Mbr), DiskContext.
BlockSize);
855 Mbr = (MASTER_BOOT_RECORD *)AllocatePool (MbrSize);
866 if (EFI_ERROR (Status)) {
877 if (Mbr->Signature != MBR_SIGNATURE) {
882 if (CheckPartitions) {
883 if ( (Mbr->Partition[0].OSIndicator == PMBR_GPT_PARTITION)
887 IsProtectiveMbr = TRUE;
888 for (Index = 1; Index < MAX_MBR_PARTITIONS; Index++) {
889 if ( (
ReadUnaligned32 ((UINT32 *)Mbr->Partition[Index].StartingLBA) != 0)
892 IsProtectiveMbr = FALSE;
897 if (IsProtectiveMbr) {
909 IN EFI_HANDLE PartitionHandle,
910 OUT UINT8 *PartitionIndex
914 MASTER_BOOT_RECORD *Mbr;
915 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
916 EFI_HANDLE DiskHandle;
917 CONST HARDDRIVE_DEVICE_PATH *HdNode;
920 ASSERT (PartitionHandle != NULL);
921 ASSERT (PartitionIndex != NULL);
927 if (DevicePath == NULL) {
928 DEBUG ((DEBUG_INFO,
"OCPI: Failed to retrieve Device Path\n"));
929 return EFI_UNSUPPORTED;
932 HdNode = (HARDDRIVE_DEVICE_PATH *)(
939 if (HdNode == NULL) {
940 DEBUG ((DEBUG_INFO,
"OCPI: Device Path does not describe a partition\n"));
941 return EFI_UNSUPPORTED;
945 if (DiskHandle == NULL) {
946 return EFI_UNSUPPORTED;
957 DEBUG ((DEBUG_INFO,
"OCPI: Disk does not have an MBR partition table\n"));
958 return EFI_UNSUPPORTED;
961 Status = EFI_NOT_FOUND;
962 for (Index = 0; Index < MAX_MBR_PARTITIONS; Index++) {
963 if ( (
ReadUnaligned32 ((UINT32 *)Mbr->Partition[Index].StartingLBA) == HdNode->PartitionStart)
964 && (
ReadUnaligned32 ((UINT32 *)Mbr->Partition[Index].SizeInLBA) == HdNode->PartitionSize))
966 *PartitionIndex = Index;
967 Status = EFI_SUCCESS;
979 IN EFI_HANDLE DiskHandle,
980 IN UINT8 PartitionIndex
984 MASTER_BOOT_RECORD *Mbr;
989 ASSERT (DiskHandle != NULL);
990 ASSERT (PartitionIndex < MAX_MBR_PARTITIONS);
1000 if (EFI_ERROR (Status)) {
1004 MbrSize = ALIGN_VALUE (
sizeof (*Mbr), DiskContext.
BlockSize);
1005 Mbr = (MASTER_BOOT_RECORD *)AllocatePool (MbrSize);
1007 return EFI_OUT_OF_RESOURCES;
1016 if (EFI_ERROR (Status)) {
1027 if (Mbr->Signature != MBR_SIGNATURE) {
1029 return EFI_UNSUPPORTED;
1035 for (Index = 0; Index < MAX_MBR_PARTITIONS; Index++) {
1036 Mbr->Partition[Index].BootIndicator = 0x00;
1056EFI_DEVICE_PATH_PROTOCOL *
1058 IN EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath,
1059 OUT UINTN *PartitionDevicePathSize,
1060 OUT EFI_HANDLE *PartitionDeviceHandle
1064 EFI_HANDLE DiskHandle;
1065 BOOLEAN HasBlockIo2;
1067 INT32 ActivePartition;
1072 EFI_HANDLE *Handles;
1073 EFI_DEVICE_PATH_PROTOCOL *PartitionDevicePath;
1074 HARDDRIVE_DEVICE_PATH *HdNode;
1075 MASTER_BOOT_RECORD *Mbr;
1078 UINTN DiskDpCmpSize;
1079 EFI_DEVICE_PATH_PROTOCOL *HdDevicePath;
1082 ASSERT (DiskDevicePath != NULL);
1083 ASSERT (PartitionDevicePathSize != NULL);
1084 ASSERT (PartitionDeviceHandle != NULL);
1088 "OCPI: Locating MBR disk's active partition",
1089 (EFI_DEVICE_PATH_PROTOCOL *)DiskDevicePath
1092 Status =
gBS->LocateHandleBuffer (
1099 if (EFI_ERROR (Status)) {
1100 DEBUG ((DEBUG_INFO,
"OCPI: Failed to locate Block I/O handles\n"));
1112 if (DiskHandle == NULL) {
1128 ActivePartition = -1;
1129 for (Index = 0; Index < MAX_MBR_PARTITIONS; Index++) {
1131 ActivePartition = (INT32)Index;
1139 if (ActivePartition == -1) {
1140 DEBUG ((DEBUG_INFO,
"OCPI: No active partitions found in MBR\n"));
1149 DiskDpSize = GetDevicePathSize (DiskDevicePath);
1150 Result = BaseOverflowAddUN (
1152 sizeof (HARDDRIVE_DEVICE_PATH),
1156 DEBUG ((DEBUG_INFO,
"OCPI: HD node would overflow DP\n"));
1161 PartitionDevicePath = NULL;
1163 for (Index = 0; Index < NoHandles; Index++) {
1165 if (HdDevicePath == NULL) {
1169 HdDpSize = GetDevicePathSize (HdDevicePath);
1170 if (HdDpSize < DiskDpCmpSize) {
1180 DiskDpSize - END_DEVICE_PATH_LENGTH
1182 if (CmpResult != 0) {
1186 if (
CompareMem (HdDevicePath, DiskDevicePath, GetDevicePathSize (DiskDevicePath) - END_DEVICE_PATH_LENGTH) == 0) {
1192 if (HdNode != NULL) {
1193 if (HdNode->PartitionStart == *((UINT32 *)Mbr->Partition[ActivePartition].StartingLBA)) {
1196 PartitionDevicePath = HdDevicePath;
1197 *PartitionDevicePathSize = HdDpSize;
1198 *PartitionDeviceHandle = Handles[Index];
1208 return PartitionDevicePath;
EFI_HANDLE OcPartitionGetPartitionHandle(IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath)
EFI_STATUS OcDiskGetMbrPartitionIndex(IN EFI_HANDLE PartitionHandle, OUT UINT8 *PartitionIndex)
EFI_HANDLE OcPartitionGetDiskHandle(IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath)
EFI_DEVICE_PATH_PROTOCOL * OcDiskGetDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath)
EFI_DEVICE_PATH_PROTOCOL * OcDiskFindSystemPartitionPath(IN CONST EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath, OUT UINTN *EspDevicePathSize, OUT EFI_HANDLE *EspDeviceHandle)
EFI_STATUS OcDiskWrite(IN OC_DISK_CONTEXT *Context, IN UINT64 Lba, IN UINTN BufferSize, IN VOID *Buffer)
EFI_STATUS OcDiskReadElTorito(IN EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath, OUT UINT8 **Buffer, OUT UINTN *BufferSize)
BOOLEAN OcIsDiskCdRom(IN EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath)
EFI_STATUS OcDiskRead(IN OC_DISK_CONTEXT *Context, IN UINT64 Lba, IN UINTN BufferSize, OUT VOID *Buffer)
STATIC EFI_GUID mInternalDiskPartitionEntriesProtocolGuid
STATIC EFI_HANDLE InternalGetDiskHandle(IN EFI_DEVICE_PATH_PROTOCOL *HdDevicePath, IN BOOLEAN IsPartitionPath, OUT BOOLEAN *HasBlockIo2)
CONST OC_PARTITION_ENTRIES * OcGetDiskPartitions(IN EFI_HANDLE DiskHandle, IN BOOLEAN UseBlockIo2)
EFI_STATUS OcDiskInitializeContext(OUT OC_DISK_CONTEXT *Context, IN EFI_HANDLE DiskHandle, IN BOOLEAN UseBlockIo2)
STATIC EFI_GUID mInternalPartitionEntryProtocolGuid
EFI_DEVICE_PATH_PROTOCOL * OcDiskFindActiveMbrPartitionPath(IN EFI_DEVICE_PATH_PROTOCOL *DiskDevicePath, OUT UINTN *PartitionDevicePathSize, OUT EFI_HANDLE *PartitionDeviceHandle)
#define MBR_PARTITION_ACTIVE
MASTER_BOOT_RECORD * OcGetDiskMbrTable(IN EFI_HANDLE DiskHandle, IN BOOLEAN CheckPartitions)
STATIC VOID InternalDebugPrintPartitionEntry(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN CONST EFI_PARTITION_ENTRY *PartitionEntry)
CONST EFI_PARTITION_ENTRY * OcGetGptPartitionEntry(IN EFI_HANDLE FsHandle)
EFI_STATUS OcDiskMarkMbrPartitionActive(IN EFI_HANDLE DiskHandle, IN UINT8 PartitionIndex)
VOID DebugPrintDevicePath(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL)
EFI_DEVICE_PATH_PROTOCOL * FindDevicePathNodeWithType(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN UINT8 Type, IN UINT8 SubType OPTIONAL)
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)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
UINT32 EFIAPI ReadUnaligned32(IN CONST UINT32 *Buffer)
EFI_GUID gEfiSimpleFileSystemProtocolGuid
EFI_GUID gEfiBlockIoProtocolGuid
EFI_DEVICE_PATH_PROTOCOL *EFIAPI DevicePathFromHandle(IN EFI_HANDLE Handle)
EFI_BLOCK_IO_PROTOCOL * BlockIo
EFI_BLOCK_IO2_PROTOCOL * BlockIo2
EFI_PARTITION_ENTRY FirstEntry[]
UINT32 PartitionEntrySize