22#include <Guid/FileInfo.h>
23#include <Guid/GlobalVariable.h>
28#include <Protocol/SimpleFileSystem.h>
29#include <Protocol/SimpleTextOut.h>
30#include <Protocol/LoadedImage.h>
32#include <Library/BaseMemoryLib.h>
33#include <Library/DebugLib.h>
34#include <Library/DevicePathLib.h>
35#include <Library/MemoryAllocationLib.h>
40#include <Library/UefiBootServicesTableLib.h>
41#include <Library/UefiLib.h>
42#include <Library/UefiRuntimeServicesTableLib.h>
47 OUT BOOLEAN *External OPTIONAL
51 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
52 EFI_DEVICE_PATH_PROTOCOL *DevicePathWalker;
53 ACPI_HID_DEVICE_PATH *Acpi;
54 HARDDRIVE_DEVICE_PATH *HardDrive;
57 if (External != NULL) {
62 if (EFI_ERROR (Status)) {
72 DevicePathWalker = DevicePath;
73 while (!IsDevicePathEnd (DevicePathWalker)) {
74 if (DevicePathType (DevicePathWalker) == MESSAGING_DEVICE_PATH) {
75 SubType = DevicePathSubType (DevicePathWalker);
81 DevicePathWalker = NextDevicePathNode (DevicePathWalker);
82 if ( !IsDevicePathEnd (DevicePathWalker)
83 && (DevicePathType (DevicePathWalker) == MEDIA_DEVICE_PATH)
84 && (DevicePathSubType (DevicePathWalker) == MEDIA_CDROM_DP))
86 if (External != NULL) {
97 case MSG_NVME_NAMESPACE_DP:
104 DevicePathWalker = NextDevicePathNode (DevicePathWalker);
105 HardDrive = (HARDDRIVE_DEVICE_PATH *)DevicePathWalker;
106 if ( !IsDevicePathEnd (DevicePathWalker)
107 && (DevicePathType (DevicePathWalker) == MEDIA_DEVICE_PATH)
108 && (DevicePathSubType (DevicePathWalker) == MEDIA_HARDDRIVE_DP)
109 && ( (HardDrive->SignatureType == SIGNATURE_TYPE_MBR)
110 || (HardDrive->SignatureType == SIGNATURE_TYPE_GUID)))
118 if (External != NULL) {
124 if (External != NULL) {
130 if (External != NULL) {
137 if (External != NULL) {
157 DevicePathWalker = NextDevicePathNode (DevicePathWalker);
160 DevicePathWalker = DevicePath;
161 while (!IsDevicePathEnd (DevicePathWalker)) {
162 if (DevicePathType (DevicePathWalker) == MEDIA_DEVICE_PATH) {
166 if (DevicePathType (DevicePathWalker) == ACPI_DEVICE_PATH) {
167 Acpi = (ACPI_HID_DEVICE_PATH *)DevicePathWalker;
168 if ( ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST)
169 && (EISA_ID_TO_NUM (Acpi->HID) == 0x0A03))
174 DevicePathWalker = NextDevicePathNode (DevicePathWalker);
177 }
else if ( (DevicePathType (DevicePathWalker) == HARDWARE_DEVICE_PATH)
178 && (DevicePathSubType (DevicePathWalker) == HW_PCI_DP))
183 DevicePathWalker = NextDevicePathNode (DevicePathWalker);
185 }
else if ( (DevicePathType (DevicePathWalker) == MESSAGING_DEVICE_PATH)
186 && (DevicePathSubType (DevicePathWalker) == MSG_DEVICE_LOGICAL_UNIT_DP))
192 DevicePathWalker = NextDevicePathNode (DevicePathWalker);
210 0xEBD0A0A2, 0xB9E5, 0x4433, { 0x87, 0xC0, 0x68, 0xB6, 0xB7, 0x26, 0x99, 0xC7 }
214 0xE3C9E316, 0x0B5C, 0x4DB8, { 0x81, 0x7D, 0xF9, 0x2D, 0xF0, 0x02, 0x15, 0xAE }
218 0xDE94BBA4, 0x06D1, 0x4D40, { 0xA1, 0x6A, 0xBF, 0xD5, 0x01, 0x79, 0xD6, 0xAC }
227 0x44479540, 0xF297, 0x41B2, { 0x9A, 0xF7, 0xD1, 0x31, 0xD5, 0xF0, 0x45, 0x8A }
231 0x4F68BCE3, 0xE8CD, 0x4DB1, { 0x96, 0xE7, 0xFB, 0xCA, 0xF9, 0x84, 0xB7, 0x09 }
235 0x0FC63DAF, 0x8483, 0x4772, { 0x8E, 0x79, 0x3D, 0x69, 0xD8, 0x47, 0x7D, 0xE4 }
243 0xBC13C2FF, 0x59E6, 0x4262, { 0xA3, 0x52, 0xB2, 0x75, 0xFD, 0x6F, 0x71, 0x72 }
251 CONST EFI_PARTITION_ENTRY *PartitionEntry;
255 if (PartitionEntry == NULL) {
256 DEBUG ((DEBUG_INFO,
"OCB: Missing partition info for %p\n",
Handle));
264 if (
CompareGuid (&PartitionEntry->PartitionTypeGUID, &gEfiPartTypeSystemPartGuid)) {
302 OUT BOOLEAN *External OPTIONAL
306 UINT32 FileSystemPolicy;
313 DEBUG ((DEBUG_INFO,
"OCB: Invalid device policy (%x/%x) for %p\n", DevicePolicy, Policy,
Handle));
314 return EFI_SECURITY_VIOLATION;
320 if ((Policy & FileSystemPolicy) == 0) {
321 DEBUG ((DEBUG_INFO,
"OCB: Invalid file system policy (%x/%x) for %p\n", FileSystemPolicy, Policy,
Handle));
322 return EFI_SECURITY_VIOLATION;
331 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
332 OUT BOOLEAN *IsFolder OPTIONAL,
333 OUT BOOLEAN *IsGeneric OPTIONAL
343 if (IsGeneric != NULL) {
347 if (IsFolder != NULL) {
357 if ((DevicePath->Type == MEDIA_DEVICE_PATH) && (DevicePath->SubType == MEDIA_PIWG_FW_FILE_DP)) {
366 PathLen = StrLen (Path);
371 if ((IsFolder != NULL) && (Path[PathLen - 1] == L
'\\')) {
378 if (
OcStrStrLength (Path, PathLen, L
"com.apple.recovery.boot",
L_STR_LEN (L
"com.apple.recovery.boot")) != NULL) {
392 STATIC CONST CHAR16 *Bootloaders[] = {
398 STATIC CONST UINTN BootloaderLengths[] = {
410 for (Index = 0; Index <
ARRAY_SIZE (Bootloaders); ++Index) {
411 if (PathLen < BootloaderLengths[Index]) {
415 RestLen = PathLen - BootloaderLengths[Index];
416 if ( ((RestLen == 0) || (Path[RestLen - 1] == L
'\\'))
417 && (
OcStrniCmp (&Path[RestLen], Bootloaders[Index], BootloaderLengths[Index]) == 0))
420 return BootloaderTypes[Index];
424 CONST CHAR16 *GenericBootloader = &EFI_REMOVABLE_MEDIA_FILE_NAME[
L_STR_LEN (L
"\\EFI\\BOOT\\")];
425 CONST UINTN GenericBootloaderLength =
L_STR_LEN (EFI_REMOVABLE_MEDIA_FILE_NAME) -
L_STR_LEN (L
"\\EFI\\BOOT\\");
427 if ((IsGeneric != NULL) && (PathLen >= GenericBootloaderLength)) {
428 RestLen = PathLen - GenericBootloaderLength;
429 if ( ((RestLen == 0) || (Path[RestLen - 1] == L
'\\'))
430 && (
OcStrniCmp (&Path[RestLen], GenericBootloader, GenericBootloaderLength) == 0))
440EFI_LOADED_IMAGE_PROTOCOL *
442 IN EFI_HANDLE ImageHandle
446 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
448 Status =
gBS->HandleProtocol (
451 (VOID **)&LoadedImage
454 if ( !EFI_ERROR (Status)
455 && (LoadedImage->FilePath != NULL)
EFI_GUID gAppleApfsPartitionTypeGuid
EFI_GUID gAppleHfsBootPartitionTypeGuid
EFI_GUID gAppleHfsPartitionTypeGuid
#define ARRAY_SIZE(Array)
#define OC_SCAN_ALLOW_DEVICE_SASEX
#define OC_SCAN_ALLOW_DEVICE_ATAPI
#define OC_SCAN_ALLOW_DEVICE_FIREWIRE
#define OC_BOOT_APPLE_TIME_MACHINE
#define OC_SCAN_ALLOW_FS_HFS
#define OC_SCAN_ALLOW_FS_LINUX_DATA
#define OC_SCAN_ALLOW_DEVICE_SATA
#define OC_SCAN_DEVICE_LOCK
#define OC_SCAN_ALLOW_DEVICE_NVME
#define OC_BOOT_APPLE_ANY
UINT32 OC_BOOT_ENTRY_TYPE
#define OC_SCAN_ALLOW_DEVICE_USB
#define OC_BOOT_APPLE_RECOVERY
#define OC_SCAN_ALLOW_DEVICE_SDCARD
#define OC_SCAN_ALLOW_FS_LINUX_ROOT
#define OC_SCAN_ALLOW_DEVICE_SCSI
#define OC_BOOT_APPLE_FW_UPDATE
#define OC_SCAN_FILE_SYSTEM_LOCK
#define OC_SCAN_ALLOW_FS_ESP
#define OC_SCAN_ALLOW_FS_APFS
#define OC_SCAN_ALLOW_FS_NTFS
#define OC_SCAN_ALLOW_FS_XBOOTLDR
#define OC_SCAN_ALLOW_DEVICE_PCI
#define MSG_APPLE_NVME_NAMESPACE_DP
CHAR16 * OcCopyDevicePathFullName(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, OUT EFI_DEVICE_PATH_PROTOCOL **FileDevicePath OPTIONAL)
CONST EFI_PARTITION_ENTRY * OcGetGptPartitionEntry(IN EFI_HANDLE FsHandle)
#define L_STR_LEN(String)
INTN EFIAPI OcStrniCmp(IN CONST CHAR16 *FirstString, IN CONST CHAR16 *SecondString, IN UINTN Length)
CONST CHAR16 * OcStrStrLength(IN CONST CHAR16 *String, IN UINTN StringLength, IN CONST CHAR16 *SearchString, IN UINTN SearchStringLength)
APPLE_EVENT_HANDLE Handle
UINT32 OcGetFileSystemPolicyType(IN EFI_HANDLE Handle)
EFI_LOADED_IMAGE_PROTOCOL * OcGetAppleBootLoadedImage(IN EFI_HANDLE ImageHandle)
EFI_GUID mXBootLdrPartitionTypeGuid
EFI_GUID mLinuxRootX86PartitionTypeGuid
EFI_GUID mMsftRecoveryPartitionTypeGuid
EFI_GUID mLinuxFileSystemPartitionTypeGuid
OC_BOOT_ENTRY_TYPE OcGetBootDevicePathType(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, OUT BOOLEAN *IsFolder OPTIONAL, OUT BOOLEAN *IsGeneric OPTIONAL)
EFI_GUID mLinuxRootX8664PartitionTypeGuid
UINT32 OcGetDevicePolicyType(IN EFI_HANDLE Handle, OUT BOOLEAN *External OPTIONAL)
EFI_GUID mMsftBasicDataPartitionTypeGuid
EFI_GUID mMsftReservedPartitionTypeGuid
EFI_STATUS InternalCheckScanPolicy(IN EFI_HANDLE Handle, IN UINT32 Policy, OUT BOOLEAN *External OPTIONAL)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
EFI_GUID gEfiLoadedImageProtocolGuid
EFI_GUID gEfiDevicePathProtocolGuid