16#include <Library/BaseLib.h>
17#include <Library/BaseOverflowLib.h>
18#include <Library/DebugLib.h>
19#include <Library/MemoryAllocationLib.h>
26#include <Library/UefiBootServicesTableLib.h>
27#include <Library/UefiRuntimeServicesTableLib.h>
30#include <Protocol/DevicePath.h>
31#include <Protocol/LoadedImage.h>
32#include <Protocol/SimpleFileSystem.h>
48 4294966999999999999ULL
66 return EFI_UNSUPPORTED;
76 return EFI_UNSUPPORTED;
87 IN VOID *DriverBuffer,
96 BOOLEAN HasLegitVersion;
103 if (EFI_ERROR (Status)) {
106 "OCJS: No APFS driver version found for %g - %r\n",
107 &PrivateData->LocationInfo.ContainerUuid,
114 RealVersion = DriverVersion->
Version;
120 for (Index = 0; Index < 10; ++Index) {
121 if (((Index == 4) || (Index == 7))) {
122 if (DriverVersion->
Date[Index] !=
'/') {
130 if ((DriverVersion->
Date[Index] <
'0') || (DriverVersion->
Date[Index] >
'9')) {
136 RealDate += DriverVersion->
Date[Index] -
'0';
142 "OCJS: APFS driver date is invalid for %g\n",
143 &PrivateData->LocationInfo.ContainerUuid
152 "OCJS: APFS driver version %Lu is blacklisted for %g, treating as 0\n",
154 &PrivateData->LocationInfo.ContainerUuid
166 "OCJS: APFS driver %Lu/%u found for %g, required >= %Lu/%u, %a\n",
169 &PrivateData->LocationInfo.ContainerUuid,
172 HasLegitVersion ?
"allow" :
"prohibited"
175 if (HasLegitVersion) {
179 return EFI_SECURITY_VIOLATION;
186 IN EFI_BLOCK_IO_PROTOCOL *BlockIo,
194 PrivateData = AllocateZeroPool (
sizeof (*PrivateData));
195 if (PrivateData == NULL) {
196 return EFI_OUT_OF_RESOURCES;
205 PrivateData->
BlockIo = BlockIo;
215 Status =
gBS->InstallMultipleProtocolInterfaces (
221 if (EFI_ERROR (Status)) {
222 FreePool (PrivateData);
230 *PrivateDataPointer = PrivateData;
238 IN VOID *DriverBuffer,
243 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
244 EFI_HANDLE ImageHandle;
245 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
251 if (EFI_ERROR (Status)) {
254 "OCJS: Failed to verify signature %g - %r\n",
255 &PrivateData->LocationInfo.ContainerUuid,
266 if (EFI_ERROR (Status)) {
270 Status =
gBS->HandleProtocol (
271 PrivateData->LocationInfo.ControllerHandle,
275 if (EFI_ERROR (Status)) {
296 if (EFI_ERROR (Status)) {
299 "OCJS: Failed to load %g - %r\n",
300 &PrivateData->LocationInfo.ContainerUuid,
311 Status =
gBS->HandleProtocol (
316 if (!EFI_ERROR (Status)) {
327 Status =
gBS->StartImage (
333 if (EFI_ERROR (Status)) {
336 "OCJS: Failed to start %g - %r\n",
337 &PrivateData->LocationInfo.ContainerUuid,
341 gBS->UnloadImage (ImageHandle);
347 "OCJS: Connecting %a%a APFS driver on handle %p\n",
350 PrivateData->LocationInfo.ControllerHandle
377 gBS->ConnectController (PrivateData->LocationInfo.ControllerHandle, NULL, NULL, TRUE);
387 IN EFI_BLOCK_IO_PROTOCOL *BlockIo
400 if (EFI_ERROR (Status)) {
404 DEBUG ((DEBUG_INFO,
"OCJS: Got APFS super block for %g\n", &SuperBlock->
Uuid));
410 FreePool (SuperBlock);
411 if (EFI_ERROR (Status)) {
420 return EFI_NOT_READY;
424 if (EFI_ERROR (Status)) {
429 FreePool (DriverBuffer);
435 IN UINT64 MinVersion,
437 IN UINT32 ScanPolicy,
438 IN BOOLEAN GlobalConnect,
439 IN BOOLEAN DisconnectHandles,
440 IN BOOLEAN IgnoreVerbose
471 IN BOOLEAN VerifyPolicy
476 EFI_BLOCK_IO_PROTOCOL *BlockIo;
483 Status =
gBS->HandleProtocol (
488 if (!EFI_ERROR (Status)) {
489 DEBUG ((DEBUG_VERBOSE,
"OCJS: FS already connected\n"));
490 return EFI_ALREADY_STARTED;
497 Status =
gBS->HandleProtocol (
502 if (EFI_ERROR (Status)) {
503 DEBUG ((DEBUG_INFO,
"OCJS: Cannot connect, BlockIo error - %r\n", Status));
504 return EFI_UNSUPPORTED;
513 if ( (BlockIo->Media == NULL)
514 || !BlockIo->Media->LogicalPartition)
516 return EFI_UNSUPPORTED;
519 if ( (BlockIo->Media->BlockSize == 0)
520 || ((BlockIo->Media->BlockSize & (BlockIo->Media->BlockSize - 1)) != 0))
524 "OCJS: Cannot connect, BlockIo malformed: %d %u\n",
525 BlockIo->Media->LogicalPartition,
526 BlockIo->Media->BlockSize
528 return EFI_UNSUPPORTED;
536 if (EFI_ERROR (Status)) {
537 DEBUG ((DEBUG_INFO,
"OCJS: Cannot connect, Policy error - %r\n", Status));
546 Status =
gBS->HandleProtocol (
551 if (!EFI_ERROR (Status)) {
552 DEBUG ((DEBUG_INFO,
"OCJS: Cannot connect, unsupported BDS\n"));
553 return EFI_UNSUPPORTED;
560 Status =
gBS->HandleProtocol (
565 if (!EFI_ERROR (Status)) {
566 DEBUG ((DEBUG_INFO,
"OCJS: Cannot connect, already handled\n"));
567 return EFI_UNSUPPORTED;
EFI_GUID gApfsEfiBootRecordInfoProtocolGuid
EFI_GUID gApfsUnsupportedBdsProtocolGuid
#define ARRAY_SIZE(Array)
STATIC UINT32 mOcScanPolicy
LIST_ENTRY mApfsPrivateDataList
STATIC EFI_STATUS ApfsCheckOpenCoreScanPolicy(IN EFI_HANDLE Handle)
EFI_STATUS OcApfsConnectHandle(IN EFI_HANDLE Handle, IN BOOLEAN VerifyPolicy)
STATIC UINT64 mApfsBlacklistedVersions[]
VOID OcApfsConfigure(IN UINT64 MinVersion, IN UINT32 MinDate, IN UINT32 ScanPolicy, IN BOOLEAN GlobalConnect, IN BOOLEAN DisconnectHandles, IN BOOLEAN IgnoreVerbose)
STATIC UINT32 mApfsMinimalDate
STATIC EFI_STATUS ApfsStartDriver(IN APFS_PRIVATE_DATA *PrivateData, IN VOID *DriverBuffer, IN UINT32 DriverSize)
STATIC BOOLEAN mGlobalConnect
STATIC EFI_STATUS ApfsVerifyDriverVersion(IN APFS_PRIVATE_DATA *PrivateData, IN VOID *DriverBuffer, IN UINT32 DriverSize)
STATIC BOOLEAN mDisconnectHandles
STATIC EFI_STATUS ApfsConnectDevice(IN EFI_HANDLE Handle, IN EFI_BLOCK_IO_PROTOCOL *BlockIo)
STATIC BOOLEAN mIgnoreVerbose
STATIC EFI_SYSTEM_TABLE * mNullSystemTable
STATIC UINT64 mApfsMinimalVersion
STATIC EFI_STATUS ApfsRegisterPartition(IN EFI_HANDLE Handle, IN EFI_BLOCK_IO_PROTOCOL *BlockIo, IN APFS_NX_SUPERBLOCK *SuperBlock, OUT APFS_PRIVATE_DATA **PrivateDataPointer)
VOID InternalApfsInitFusionData(IN APFS_NX_SUPERBLOCK *SuperBlock, OUT APFS_PRIVATE_DATA *PrivateData)
#define APFS_PRIVATE_DATA_SIGNATURE
EFI_STATUS InternalApfsReadDriver(IN APFS_PRIVATE_DATA *PrivateData, OUT UINT32 *DriverSize, OUT VOID **DriverBuffer)
EFI_STATUS InternalApfsReadSuperBlock(IN EFI_BLOCK_IO_PROTOCOL *BlockIo, OUT APFS_NX_SUPERBLOCK **SuperBlockPtr)
#define OC_APFS_VERSION_DEFAULT
#define OC_APFS_VERSION_ANY
#define OC_APFS_DATE_AUTO
#define OC_APFS_VERSION_AUTO
#define OC_APFS_DATE_DEFAULT
#define OC_SCAN_DEVICE_LOCK
EFI_STATUS EFIAPI OcImageLoaderLoad(IN BOOLEAN BootPolicy, IN EFI_HANDLE ParentImageHandle, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN VOID *SourceBuffer OPTIONAL, IN UINTN SourceSize, OUT EFI_HANDLE *ImageHandle)
UINT32 OcGetDevicePolicyType(IN EFI_HANDLE Handle, OUT BOOLEAN *External OPTIONAL)
#define OC_SCAN_FILE_SYSTEM_LOCK
#define OC_SCAN_ALLOW_FS_APFS
EFI_SYSTEM_TABLE * AllocateNullTextOutSystemTable(IN EFI_SYSTEM_TABLE *SystemTable)
EFI_STATUS OcConnectDrivers(VOID)
EFI_STATUS OcDisconnectDriversOnHandle(IN EFI_HANDLE Controller)
EFI_STATUS PeCoffVerifyAppleSignature(IN OUT VOID *PeImage, IN OUT UINT32 *ImageSize)
EFI_STATUS PeCoffGetApfsDriverVersion(IN VOID *DriverBuffer, IN UINT32 DriverSize, OUT APFS_DRIVER_VERSION **DriverVersionPtr)
APPLE_EVENT_HANDLE Handle
GUID *EFIAPI CopyGuid(OUT GUID *DestinationGuid, IN CONST GUID *SourceGuid)
EFI_GUID gEfiSimpleFileSystemProtocolGuid
EFI_GUID gEfiBlockIoProtocolGuid
EFI_GUID gEfiLoadedImageProtocolGuid
EFI_GUID gEfiDevicePathProtocolGuid
EFI_HANDLE ControllerHandle
APFS_EFIBOOTRECORD_LOCATION_INFO LocationInfo
EFI_BLOCK_IO_PROTOCOL * BlockIo