19#include <Library/BaseLib.h>
20#include <Library/DebugLib.h>
21#include <Library/MemoryAllocationLib.h>
28#include <Library/PrintLib.h>
29#include <Library/UefiBootServicesTableLib.h>
30#include <Library/UefiRuntimeServicesTableLib.h>
49 IN OUT EFI_LOADED_IMAGE_PROTOCOL *LoadedImage,
50 IN UINT32 Capabilities
53 CONST CHAR8 *KernelArch;
54 CHAR8 *AppleArchValue;
55 CONST CHAR8 *NewArguments[2];
63 DEBUG ((DEBUG_VERBOSE,
"OC: Supported boot capabilities %u\n", Capabilities));
74 if ( (LoadedImage->FilePath == NULL)
93 DEBUG ((DEBUG_INFO,
"OC: Arch %a overrides capabilities %u\n", AppleArchValue, Capabilities));
94 FreePool (AppleArchValue);
125 if (AsciiStrCmp (KernelArch,
"x86_64") == 0) {
127 }
else if (AsciiStrCmp (KernelArch,
"i386") == 0) {
129 }
else if ( AsciiStrCmp (KernelArch,
"i386-user32") == 0
130 #
if defined (MDE_CPU_X64)
131 && (IsSnowLeo || IsLion)
138 DEBUG ((DEBUG_INFO,
"OC: Requested arch i386-user32 is not supported on 10.7, falling back to i386\n"));
149 if ( RequestedArch == 0
150 #
if defined (MDE_CPU_X64)
162 DEBUG ((DEBUG_INFO,
"OC: Missing SSSE3 disables U64 capabilities %u\n", Capabilities));
172 DEBUG ((DEBUG_INFO,
"OC: K64 forbidden due to current platform on version %u\n",
KernelVersion));
180 if ((RequestedArch != 0) && ((Capabilities & RequestedArch) != 0)) {
181 Capabilities = RequestedArch;
199 NewArguments[ArgumentCount++] =
"arch=x86_64";
201 NewArguments[ArgumentCount++] =
"arch=i386";
210 NewArguments[ArgumentCount++] =
"-legacy";
216 if (ArgumentCount > 0) {
236 IN OC_KERNEL_ADD_ENTRY *Kext,
239 IN EFI_FILE_PROTOCOL *RootFile,
241 IN OC_GLOBAL_CONFIG *Config,
244 IN OUT UINT32 *ReservedExeSize,
245 IN OUT UINT32 *ReservedInfoSize,
246 IN OUT UINT32 *NumReservedKexts
255 CHAR8 *ExecutablePath;
258 if (!Kext->Enabled) {
266 if (IsForced && (Kext->PlistData != NULL)) {
267 FreePool (Kext->PlistData);
268 Kext->PlistDataSize = 0;
269 Kext->PlistData = NULL;
271 if (Kext->ImageData != NULL) {
272 FreePool (Kext->ImageData);
273 Kext->ImageDataSize = 0;
274 Kext->ImageData = NULL;
283 if ((BundlePath[0] ==
'\0') || (PlistPath[0] ==
'\0') || (IsForced && (Identifier[0] ==
'\0'))) {
286 "OC: %s kext %u (%a) has invalid info\n",
287 IsForced ? L
"Forced" : L
"Injected",
291 Kext->Enabled = FALSE;
295 if (AsciiStrCmp (Arch, Is32Bit ?
"x86_64" :
"i386") == 0) {
298 "OC: %s kext %a (%a) at %u skipped due to arch %a != %a\n",
299 IsForced ? L
"Forced" : L
"Injected",
304 Is32Bit ?
"i386" :
"x86_64"
324 if (EFI_ERROR (Status)) {
327 "OC: Failed to fit %s kext path %s%a\\%a",
328 IsForced ? L
"forced" : L
"injected",
333 Kext->Enabled = IsForced;
343 &Kext->PlistDataSize,
354 if (Kext->PlistData == NULL) {
356 IsForced ? DEBUG_INFO : DEBUG_ERROR,
357 "OC: Plist %s is missing for %s kext %a (%a)\n",
359 IsForced ? L
"forced" : L
"injected",
363 Kext->Enabled = IsForced;
370 ExecutablePath =
OC_BLOB_GET (&Kext->ExecutablePath);
371 if (ExecutablePath[0] !=
'\0') {
379 if (EFI_ERROR (Status)) {
382 "OC: Failed to fit %s kext path %s%a\\%a",
383 IsForced ? L
"forced" : L
"injected",
388 Kext->Enabled = IsForced;
389 FreePool (Kext->PlistData);
390 Kext->PlistData = NULL;
400 &Kext->ImageDataSize,
411 if (Kext->ImageData == NULL) {
413 IsForced ? DEBUG_INFO : DEBUG_ERROR,
414 "OC: Image %s is missing for %s kext %a (%a)\n",
416 IsForced ? L
"forced" : L
"injected",
420 Kext->Enabled = IsForced;
421 FreePool (Kext->PlistData);
422 Kext->PlistData = NULL;
447 if (EFI_ERROR (Status)) {
450 "OC: Failed to fit %s kext %a (%a) - %r\n",
451 Is32Bit ? L
"32-bit" : L
"64-bit",
456 if (Kext->ImageData != NULL) {
457 FreePool (Kext->ImageData);
458 Kext->ImageData = NULL;
461 FreePool (Kext->PlistData);
462 Kext->PlistData = NULL;
466 (*NumReservedKexts)++;
472 IN EFI_FILE_PROTOCOL *RootFile,
474 IN OC_GLOBAL_CONFIG *Config,
477 OUT UINT32 *ReservedExeSize,
478 OUT UINT32 *ReservedInfoSize,
479 OUT UINT32 *NumReservedKexts
483 OC_KERNEL_ADD_ENTRY *Kext;
486 *ReservedExeSize = 0;
487 *NumReservedKexts = 0;
492 for (Index = 0; Index < Config->Kernel.Force.Count; Index++) {
493 Kext = Config->Kernel.Force.Values[Index];
513 for (Index = 0; Index < Config->Kernel.Add.Count; Index++) {
514 Kext = Config->Kernel.Add.Values[Index];
533 || (*ReservedInfoSize + *ReservedExeSize < *ReservedExeSize))
535 return EFI_UNSUPPORTED;
541 "OC: Kext reservation size info %X exe %X\n",
551 IN OC_KERNEL_ADD_ENTRY *Kext,
556 IN UINT32 DarwinVersion,
561 CONST CHAR8 *Identifier;
562 CONST CHAR8 *BundlePath;
563 CONST CHAR8 *ExecutablePath;
564 CONST CHAR8 *Comment;
570 if (!Kext->Enabled || (Kext->PlistData == NULL)) {
589 "OC: %a%a injection skips %a (%a) kext at %u due to version %u <= %u <= %u\n",
591 IsForced ?
" force" :
"",
602 if (Kext->ImageData != NULL) {
603 ExecutablePath =
OC_BLOB_GET (&Kext->ExecutablePath);
605 ExecutablePath = NULL;
609 Status =
OcAsciiSafeSPrint (FullPath,
sizeof (FullPath),
"/Library/Extensions/%a", BundlePath);
610 if (EFI_ERROR (Status)) {
611 DEBUG ((DEBUG_WARN,
"OC: Failed to fit kext path /Library/Extensions/%a", BundlePath));
618 && (AsciiStrnCmp (BundlePath,
"System\\Library\\Extensions",
L_STR_LEN (
"System\\Library\\Extensions")) == 0))
634 IsForced ? Identifier : NULL,
635 IsForced ? BundlePath : FullPath,
645 IsForced ? Identifier : NULL,
646 IsForced ? BundlePath : FullPath,
655 Status = EFI_UNSUPPORTED;
659 !IsForced && EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO,
660 "OC: %a%a injection %a (%a) - %r\n",
662 IsForced ?
" force" :
"",
673 !IsForced && EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO,
674 "OC: %a%a injection %a v%a\n",
676 IsForced ?
" force" :
"",
686 IN OC_GLOBAL_CONFIG *Config,
689 IN UINT32 DarwinVersion,
691 IN UINT32 LinkedExpansion,
692 IN UINT32 ReservedExeSize
704 if (EFI_ERROR (Status)) {
705 DEBUG ((DEBUG_WARN,
"OC: Prelink inject prepare error - %r\n", Status));
713 for (Index = 0; Index < Config->Kernel.Force.Count; Index++) {
715 Config->Kernel.Force.Values[Index],
728 for (Index = 0; Index < Config->Kernel.Add.Count; Index++) {
730 Config->Kernel.Add.Values[Index],
741 Status = EFI_SUCCESS;
745 "OC: Prelink size %u kext offset %u reserved %u\n",
758 Status = EFI_UNSUPPORTED;
761 if (EFI_ERROR (Status)) {
768 IN OC_GLOBAL_CONFIG *Config,
769 IN UINT32 DarwinVersion,
771 IN OUT UINT8 *Kernel,
772 IN UINT32 *KernelSize,
773 IN UINT32 AllocatedSize,
774 IN UINT32 LinkedExpansion,
775 IN UINT32 ReservedExeSize
783 if (!EFI_ERROR (Status)) {
801 IN OC_GLOBAL_CONFIG *Config,
802 IN UINT32 DarwinVersion,
805 IN OUT UINT32 *MkextSize,
806 IN UINT32 AllocatedSize
813 if (EFI_ERROR (Status)) {
834 IN OC_GLOBAL_CONFIG *Config,
836 IN UINT32 DarwinVersion,
839 IN EFI_FILE_PROTOCOL *ExtensionsDir,
840 OUT EFI_FILE_PROTOCOL **File
852 if (EFI_ERROR (Status)) {
868 IN EFI_FILE_PROTOCOL *RootFile,
869 IN EFI_FILE_PROTOCOL *KernelFile,
872 IN OUT UINT32 *DarwinVersion,
874 OUT UINT32 *KernelSize,
875 OUT UINT32 *AllocatedSize,
876 OUT UINT32 *ReservedExeSize,
877 OUT UINT32 *LinkedExpansion,
878 OUT UINT8 *Digest OPTIONAL
883 UINT32 DarwinVersionNew;
884 BOOLEAN IsKernel32Bit;
886 UINT32 ReservedInfoSize;
887 UINT32 NumReservedKexts;
888 UINT32 ReservedFullSize;
902 if (*LinkedExpansion == 0) {
903 return EFI_UNSUPPORTED;
906 Result = BaseOverflowTriAddU32 (
913 return EFI_UNSUPPORTED;
919 DEBUG ((DEBUG_INFO,
"OC: Trying %a XNU hook on %s\n", Is32Bit ?
"32-bit" :
"64-bit", FileName));
932 "OC: Result of %a XNU hook on %s (%02X%02X%02X%02X) is %r\n",
933 IsKernel32Bit ?
"32-bit" :
"64-bit",
935 Digest != NULL ? Digest[0] : 0,
936 Digest != NULL ? Digest[1] : 0,
937 Digest != NULL ? Digest[2] : 0,
938 Digest != NULL ? Digest[3] : 0,
942 if (!EFI_ERROR (Status)) {
947 if (DarwinVersionNew < *DarwinVersion) {
951 return EFI_INVALID_PARAMETER;
957 if (Is32Bit != IsKernel32Bit) {
958 DEBUG ((DEBUG_WARN,
"OC: %a kernel architecture is not available, aborting.\n", Is32Bit ?
"32-bit" :
"64-bit"));
961 return EFI_NOT_FOUND;
964 *DarwinVersion = DarwinVersionNew;
973 IN EFI_FILE_PROTOCOL *RootFile,
976 IN UINT64 Attributes,
978 IN OUT UINT32 *DarwinVersion,
979 OUT EFI_FILE_PROTOCOL **KernelFile,
981 OUT UINT32 *KernelSize,
982 OUT UINT32 *AllocatedSize,
983 OUT UINT32 *ReservedExeSize,
984 OUT UINT32 *LinkedExpansion,
985 OUT UINT8 *Digest OPTIONAL
989 EFI_FILE_PROTOCOL *FileDirectory;
991 UINTN FileNameDirLength;
993 EFI_FILE_INFO *FileInfo;
994 EFI_FILE_INFO *FileInfoNext;
995 CHAR16 *FileNameCacheNew;
996 UINTN FileNameCacheNewLength;
997 UINTN FileNameCacheNewSize;
1002 FileNameCacheNew = NULL;
1007 FileNameDirLength =
OcStriStr (FileName, L
"\\kernelcache") - FileName;
1008 FileNameDir = AllocateZeroPool (StrnSizeS (FileName, FileNameDirLength));
1009 if (FileNameDir == NULL) {
1010 return EFI_OUT_OF_RESOURCES;
1013 CopyMem (FileNameDir, FileName, StrnSizeS (FileName, FileNameDirLength) -
sizeof (*FileName));
1015 Status =
OcSafeFileOpen (RootFile, &FileDirectory, FileNameDir, EFI_FILE_MODE_READ, 0);
1016 if (EFI_ERROR (Status)) {
1017 FreePool (FileNameDir);
1033 if (EFI_ERROR (Status)) {
1037 if (FileInfo != NULL) {
1038 FreePool (FileInfo);
1041 if (FileNameCacheNew != NULL) {
1042 FreePool (FileNameCacheNew);
1045 FileInfo = FileInfoNext;
1047 FileNameCacheNewLength = FileNameDirLength +
L_STR_LEN (
"\\") + StrLen (FileInfo->FileName);
1048 FileNameCacheNewSize = (FileNameCacheNewLength + 1) *
sizeof (*FileNameCacheNew);
1049 FileNameCacheNew = AllocateZeroPool (FileNameCacheNewSize);
1050 if (FileNameCacheNew == NULL) {
1051 Status = EFI_OUT_OF_RESOURCES;
1055 Status =
OcUnicodeSafeSPrint (FileNameCacheNew, FileNameCacheNewSize, L
"%s\\%s", FileNameDir, FileInfo->FileName);
1056 if (EFI_ERROR (Status)) {
1060 Status =
OcSafeFileOpen (RootFile, KernelFile, FileNameCacheNew, OpenMode, Attributes);
1061 if (EFI_ERROR (Status)) {
1078 }
while (EFI_ERROR (Status));
1080 if (FileInfo != NULL) {
1081 FreePool (FileInfo);
1084 if (FileNameCacheNew != NULL) {
1085 FreePool (FileNameCacheNew);
1088 FreePool (FileNameDir);
1097 IN EFI_FILE_PROTOCOL *This,
1098 OUT EFI_FILE_PROTOCOL **NewHandle,
1099 IN CHAR16 *FileName,
1101 IN UINT64 Attributes
1106 CONST CHAR8 *ForceCacheType;
1107 CONST CHAR8 *SecureBootModel;
1109 BOOLEAN UseSecureBoot;
1113 UINT32 AllocatedSize;
1114 EFI_FILE_PROTOCOL *VirtualFileHandle;
1115 EFI_STATUS PrelinkedStatus;
1116 EFI_TIME ModificationTime;
1117 UINT32 ReservedInfoSize;
1118 UINT32 ReservedExeSize;
1119 UINT32 NumReservedKexts;
1120 UINT32 LinkedExpansion;
1121 UINT32 ReservedFullSize;
1122 CHAR16 *NewFileName;
1123 EFI_FILE_PROTOCOL *EspNewHandle;
1126 DEBUG ((DEBUG_INFO,
"OC: Skipping OpenFile hooking on ESP Kernels directory\n"));
1127 return OcSafeFileOpen (This, NewHandle, FileName, OpenMode, Attributes);
1134 if (AsciiStrCmp (ForceCacheType,
"Cacheless") == 0) {
1136 }
else if (AsciiStrCmp (ForceCacheType,
"Mkext") == 0) {
1138 }
else if (AsciiStrCmp (ForceCacheType,
"Prelinked") == 0) {
1154 && (OpenMode == EFI_FILE_MODE_READ)
1155 && (StrnCmp (FileName, L
"System\\Library\\Extensions\\Oc",
L_STR_LEN (L
"System\\Library\\Extensions\\Oc")) == 0))
1160 "OC: Hooking SLE injected file %s with %u mode gave - %r\n",
1169 Status =
OcSafeFileOpen (This, NewHandle, FileName, OpenMode, Attributes);
1173 "OC: Opening file %s with %u mode gave - %r\n",
1185 && (Status == EFI_NOT_FOUND)
1186 && (OpenMode == EFI_FILE_MODE_READ)
1187 && (StrStr (FileName, L
"\\kernelcache") != NULL))
1193 DEBUG ((DEBUG_INFO,
"OC: Redirecting %s to the custom one on ESP\n", FileName));
1194 NewFileName =
OcStrrChr (FileName, L
'\\');
1195 if (NewFileName == NULL) {
1196 NewFileName = FileName;
1199 DEBUG ((DEBUG_INFO,
"OC: Filename after redirection: %s\n", NewFileName));
1202 FileName = NewFileName;
1205 DEBUG ((DEBUG_INFO,
"OC: Trying kernelcache fuzzy matching on %s\n", FileName));
1224 if (EFI_ERROR (Status)) {
1234 if ( (OpenMode == EFI_FILE_MODE_READ)
1235 && (
OcStriStr (FileName, L
"kernel") != NULL)
1236 && (StrCmp (FileName, L
"System\\Library\\Kernels\\kernel") != 0)
1237 && (
OcStriStr (FileName, L
".kext\\") == NULL)
1238 && (
OcStriStr (FileName, L
".im4m") == NULL))
1244 DEBUG ((DEBUG_INFO,
"OC: Redirecting %s to the custom one on ESP\n", FileName));
1245 NewFileName =
OcStrrChr (FileName, L
'\\');
1246 if (NewFileName == NULL) {
1247 NewFileName = FileName;
1250 DEBUG ((DEBUG_INFO,
"OC: Filename after redirection: %s\n", NewFileName));
1255 if (!EFI_ERROR (Status)) {
1256 (*NewHandle)->Close (*NewHandle);
1259 *NewHandle = EspNewHandle;
1260 FileName = NewFileName;
1267 if (Kernel == NULL) {
1282 if (Status == EFI_NOT_FOUND) {
1283 (*NewHandle)->Close (*NewHandle);
1290 if (!EFI_ERROR (Status)) {
1295 if ( ((
OcStriStr (FileName, L
"kernelcache") != NULL) || (
OcStriStr (FileName, L
"prelinkedkernel") != NULL))
1300 DEBUG ((DEBUG_INFO,
"OC: Blocking prelinked due to ForceKernelCache=%a: %s\n", ForceCacheType, FileName));
1303 (*NewHandle)->Close (*NewHandle);
1306 return EFI_NOT_FOUND;
1334 DEBUG ((DEBUG_INFO,
"OC: Prelinked status - %r\n", PrelinkedStatus));
1337 if (EFI_ERROR (Status)) {
1338 ZeroMem (&ModificationTime,
sizeof (ModificationTime));
1341 (*NewHandle)->Close (*NewHandle);
1347 if (EFI_ERROR (Status)) {
1348 DEBUG ((DEBUG_WARN,
"OC: Failed to virtualise kernel file (%s) - %r\n", FileName, Status));
1350 return EFI_OUT_OF_RESOURCES;
1353 if (UseSecureBoot) {
1360 *NewHandle = VirtualFileHandle;
1365 if ( (OpenMode == EFI_FILE_MODE_READ)
1366 && (
OcStriStr (FileName, L
"Extensions.mkext") != NULL))
1372 DEBUG ((DEBUG_INFO,
"OC: Blocking mkext due to ForceKernelCache=%a: %s\n", ForceCacheType, FileName));
1373 (*NewHandle)->Close (*NewHandle);
1376 return EFI_NOT_FOUND;
1390 Result = BaseOverflowAddU32 (
1396 return EFI_UNSUPPORTED;
1399 DEBUG ((DEBUG_INFO,
"OC: Trying %a mkext hook on %s\n",
mUse32BitKernel ?
"32-bit" :
"64-bit", FileName));
1409 DEBUG ((DEBUG_INFO,
"OC: Result of mkext hook on %s is %r\n", FileName, Status));
1411 if (!EFI_ERROR (Status)) {
1423 DEBUG ((DEBUG_INFO,
"OC: Mkext status - %r\n", Status));
1424 if (!EFI_ERROR (Status)) {
1426 if (EFI_ERROR (Status)) {
1427 ZeroMem (&ModificationTime,
sizeof (ModificationTime));
1430 (*NewHandle)->Close (*NewHandle);
1436 if (EFI_ERROR (Status)) {
1437 DEBUG ((DEBUG_WARN,
"OC: Failed to virtualise mkext file (%s) - %r\n", FileName, Status));
1439 return EFI_OUT_OF_RESOURCES;
1442 *NewHandle = VirtualFileHandle;
1453 if ( (OpenMode == EFI_FILE_MODE_READ)
1454 && (StrCmp (FileName, L
"System\\Library\\Extensions") == 0))
1489 DEBUG ((DEBUG_INFO,
"OC: Result of SLE hook on %s is %r\n", FileName, Status));
1491 if (!EFI_ERROR (Status)) {
1493 *NewHandle = VirtualFileHandle;
1502 && (OpenMode == EFI_FILE_MODE_READ)
1503 && (StrnCmp (FileName, L
"System\\Library\\Extensions\\",
L_STR_LEN (L
"System\\Library\\Extensions\\")) == 0))
1512 if (EFI_ERROR (Status)) {
1513 DEBUG ((DEBUG_INFO,
"OC: Error SLE hooking %s - %r\n", FileName, Status));
1516 if (!EFI_ERROR (Status) && (VirtualFileHandle != NULL)) {
1517 *NewHandle = VirtualFileHandle;
1532 IN OC_GLOBAL_CONFIG *Config,
1537 EFI_FILE_PROTOCOL *Root;
1541 if (!EFI_ERROR (Status)) {
1554 if (!EFI_ERROR (Status)) {
1558 Status = Root->Open (
1565 if (EFI_ERROR (Status)) {
1566 DEBUG ((DEBUG_INFO,
"OC: Unable to open Kernels folder for custom kernel - %r, falling back to normal one\n", Status));
1570 DEBUG ((DEBUG_INFO,
"OC: Unable to find root writable filesystem for custom kernel - %r, falling back to normal one\n", Status));
1576 DEBUG ((DEBUG_ERROR,
"OC: Failed to enable vfs - %r\n", Status));
1590 if (EFI_ERROR (Status)) {
1591 DEBUG ((DEBUG_ERROR,
"OC: Failed to disable vfs - %r\n", Status));
#define CPUID_EXTFEATURE_EM64T
Extended Mem 64 Technology.
#define CPUID_FEATURE_SSSE3
Supplemental SSE3 Instructions.
STATIC UINT32 KernelVersion
VOID OcAppleImg4RegisterOverride(IN CONST UINT8 *OriginalDigest, IN CONST UINT8 *Image, IN UINT32 ImageSize)
#define OC_SB_MODEL_DISABLED
VOID CachelessContextFree(IN OUT CACHELESS_CONTEXT *Context)
#define KERNEL_VERSION_SNOW_LEOPARD_MIN
EFI_STATUS CachelessContextHookBuiltin(IN OUT CACHELESS_CONTEXT *Context, IN CONST CHAR16 *FileName, IN EFI_FILE_PROTOCOL *File, OUT EFI_FILE_PROTOCOL **VirtualFile)
EFI_STATUS ReadAppleKernel(IN EFI_FILE_PROTOCOL *File, IN BOOLEAN Prefer32Bit, OUT BOOLEAN *Is32Bit, OUT UINT8 **Kernel, OUT UINT32 *KernelSize, OUT UINT32 *AllocatedSize, IN UINT32 ReservedSize, OUT UINT8 *Digest OPTIONAL)
enum KERNEL_CACHE_TYPE_ KERNEL_CACHE_TYPE
#define KERNEL_VERSION_LEOPARD_MIN
VOID PrelinkedContextFree(IN OUT PRELINKED_CONTEXT *Context)
EFI_STATUS CachelessContextPerformInject(IN OUT CACHELESS_CONTEXT *Context, IN CONST CHAR16 *FileName, OUT EFI_FILE_PROTOCOL **VirtualFile)
#define PRELINKED_KEXTS_MAX_SIZE
#define KERNEL_VERSION_MOUNTAIN_LION_MIN
EFI_STATUS PrelinkedContextInit(IN OUT PRELINKED_CONTEXT *Context, IN OUT UINT8 *Prelinked, IN UINT32 PrelinkedSize, IN UINT32 PrelinkedAllocSize, IN BOOLEAN Is32Bit)
EFI_STATUS PrelinkedInjectPrepare(IN OUT PRELINKED_CONTEXT *Context, IN UINT32 LinkedExpansion, IN UINT32 ReservedExeSize)
EFI_STATUS MkextInjectPatchComplete(IN OUT MKEXT_CONTEXT *Context)
#define PRINT_KERNEL_CACHE_TYPE(a)
EFI_STATUS MkextReserveKextSize(IN OUT UINT32 *ReservedInfoSize, IN OUT UINT32 *ReservedExeSize, IN UINT32 InfoPlistSize, IN UINT8 *Executable OPTIONAL, IN UINT32 ExecutableSize OPTIONAL, IN BOOLEAN Is32Bit)
EFI_STATUS CachelessContextInit(IN OUT CACHELESS_CONTEXT *Context, IN CONST CHAR16 *FileName, IN EFI_FILE_PROTOCOL *ExtensionsDir, IN UINT32 KernelVersion, IN BOOLEAN Is32Bit)
#define KERNEL_VERSION_MAVERICKS_MAX
#define PRELINK_INFO_RESERVE_SIZE
#define MAX_INFO_BUNDLE_VERSION_KEY_SIZE
EFI_STATUS ReadAppleMkext(IN EFI_FILE_PROTOCOL *File, IN BOOLEAN Prefer32Bit, OUT UINT8 **Mkext, OUT UINT32 *MkextSize, OUT UINT32 *AllocatedSize, IN UINT32 ReservedSize, IN UINT32 NumReservedKexts)
EFI_STATUS CachelessContextAddKext(IN OUT CACHELESS_CONTEXT *Context, IN CONST CHAR8 *InfoPlist, IN UINT32 InfoPlistSize, IN UINT8 *Executable OPTIONAL, IN UINT32 ExecutableSize OPTIONAL, OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL)
#define KERNEL_VERSION_SNOW_LEOPARD_MAX
EFI_STATUS CachelessContextForceKext(IN OUT CACHELESS_CONTEXT *Context, IN CONST CHAR8 *Identifier)
BOOLEAN OcMatchDarwinVersion(IN UINT32 CurrentVersion OPTIONAL, IN UINT32 MinVersion OPTIONAL, IN UINT32 MaxVersion OPTIONAL)
VOID MkextContextFree(IN OUT MKEXT_CONTEXT *Context)
EFI_STATUS PrelinkedReserveKextSize(IN OUT UINT32 *ReservedInfoSize, IN OUT UINT32 *ReservedExeSize, IN UINT32 InfoPlistSize, IN UINT8 *Executable OPTIONAL, IN UINT32 ExecutableSize OPTIONAL, IN BOOLEAN Is32Bit)
EFI_STATUS PrelinkedInjectKext(IN OUT PRELINKED_CONTEXT *Context, IN CONST CHAR8 *Identifier OPTIONAL, IN CONST CHAR8 *BundlePath, IN CONST CHAR8 *InfoPlist, IN UINT32 InfoPlistSize, IN CONST CHAR8 *ExecutablePath OPTIONAL, IN OUT CONST UINT8 *Executable OPTIONAL, IN UINT32 ExecutableSize OPTIONAL, OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL)
EFI_STATUS CachelessContextOverlayExtensionsDir(IN OUT CACHELESS_CONTEXT *Context, OUT EFI_FILE_PROTOCOL **File)
EFI_STATUS MkextContextInit(IN OUT MKEXT_CONTEXT *Context, IN OUT UINT8 *Mkext, IN UINT32 MkextSize, IN UINT32 MkextAllocSize)
EFI_STATUS MkextInjectKext(IN OUT MKEXT_CONTEXT *Context, IN CONST CHAR8 *Identifier OPTIONAL, IN CONST CHAR8 *BundlePath, IN CONST CHAR8 *InfoPlist, IN UINT32 InfoPlistSize, IN UINT8 *Executable OPTIONAL, IN UINT32 ExecutableSize OPTIONAL, OUT CHAR8 BundleVersion[MAX_INFO_BUNDLE_VERSION_KEY_SIZE] OPTIONAL)
UINT32 OcKernelReadDarwinVersion(IN CONST UINT8 *Kernel, IN UINT32 KernelSize)
UINT32 OcParseDarwinVersion(IN CONST CHAR8 *String)
#define KERNEL_VERSION_LEOPARD_MAX
#define KERNEL_VERSION_LION_MIN
EFI_STATUS PrelinkedInjectComplete(IN OUT PRELINKED_CONTEXT *Context)
UINT32 KcGetSegmentFixupChainsSize(IN UINT32 SegmentSize)
#define OC_KERN_CAPABILITY_K64_U64
Supports K64 and U64 (10.6+)
#define OC_KERN_CAPABILITY_ALL
#define OC_BOOT_APPLE_ANY
VOID OcImageLoaderRegisterConfigure(IN OC_IMAGE_LOADER_CONFIGURE Configure OPTIONAL)
#define OC_KERN_CAPABILITY_K32_U64
Supports K32 and U64 (10.4~10.7)
OC_BOOT_ENTRY_TYPE OcGetBootDevicePathType(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, OUT BOOLEAN *IsFolder OPTIONAL, OUT BOOLEAN *IsGeneric OPTIONAL)
#define OC_KERN_CAPABILITY_K32_K64_U64
#define OC_KERN_CAPABILITY_K32_U32
Supports K32 and U32 (10.4~10.6)
BOOLEAN OcAppendArgumentsToLoadedImage(IN OUT EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, IN CONST CHAR8 **Arguments, IN UINT32 ArgumentCount, IN BOOLEAN Replace)
BOOLEAN OcCheckArgumentFromEnv(IN EFI_LOADED_IMAGE *LoadedImage OPTIONAL, IN EFI_GET_VARIABLE GetVariable OPTIONAL, IN CONST CHAR8 *Argument, IN CONST UINTN ArgumentLength, IN OUT CHAR8 **Value OPTIONAL)
#define OC_KERN_CAPABILITY_K32_U32_U64
#define SHA384_DIGEST_SIZE
VOID * OcReadFileFromDirectory(IN CONST EFI_FILE_PROTOCOL *RootDirectory, IN CONST CHAR16 *FilePath, OUT UINT32 *FileSize OPTIONAL, IN UINT32 MaxFileSize OPTIONAL)
EFI_STATUS OcGetFileModificationTime(IN EFI_FILE_PROTOCOL *File, OUT EFI_TIME *Time)
VOID OcDirectorySeachContextInit(IN OUT DIRECTORY_SEARCH_CONTEXT *Context)
EFI_STATUS OcGetNewestFileFromDirectory(IN OUT DIRECTORY_SEARCH_CONTEXT *Context, IN EFI_FILE_PROTOCOL *Directory, IN CHAR16 *FileNameStartsWith OPTIONAL, OUT EFI_FILE_INFO **FileInfo)
EFI_STATUS OcFindWritableOcFileSystem(OUT EFI_FILE_PROTOCOL **FileSystem)
EFI_STATUS OcSafeFileOpen(IN CONST EFI_FILE_PROTOCOL *Directory, OUT EFI_FILE_PROTOCOL **NewHandle, IN CONST CHAR16 *FileName, IN CONST UINT64 OpenMode, IN CONST UINT64 Attributes)
VOID OcKernelApplyPatches(IN OC_GLOBAL_CONFIG *Config, IN OC_CPU_INFO *CpuInfo, IN UINT32 DarwinVersion, IN BOOLEAN Is32Bit, IN KERNEL_CACHE_TYPE CacheType, IN VOID *Context, IN OUT UINT8 *Kernel, IN UINT32 Size)
BOOLEAN OcPlatformIs64BitSupported(IN UINT32 KernelVersion)
VOID OcKernelBlockKexts(IN OC_GLOBAL_CONFIG *Config, IN UINT32 DarwinVersion, IN BOOLEAN Is32Bit, IN KERNEL_CACHE_TYPE CacheType, IN VOID *Context)
#define OPEN_CORE_KEXT_PATH
VOID * OcStorageReadFileUnicode(IN OC_STORAGE_CONTEXT *Context, IN CONST CHAR16 *FilePath, OUT UINT32 *FileSize OPTIONAL)
#define OC_STORAGE_SAFE_PATH_MAX
VOID AsciiUefiSlashes(IN OUT CHAR8 *String)
CHAR16 *EFIAPI OcStrrChr(IN CONST CHAR16 *String, IN CHAR16 Char)
#define L_STR_LEN(String)
VOID UnicodeUefiSlashes(IN OUT CHAR16 *String)
EFI_STATUS EFIAPI OcAsciiSafeSPrint(OUT CHAR8 *StartOfBuffer, IN UINTN BufferSize, IN CONST CHAR8 *FormatString,...)
CHAR16 *EFIAPI OcStriStr(IN CONST CHAR16 *String, IN CONST CHAR16 *SearchString)
EFI_STATUS EFIAPI OcUnicodeSafeSPrint(OUT CHAR16 *StartOfBuffer, IN UINTN BufferSize, IN CONST CHAR16 *FormatString,...)
#define OC_BLOB_GET(Blob)
EFI_STATUS DisableVirtualFs(IN OUT EFI_BOOT_SERVICES *BootServices)
EFI_STATUS EnableVirtualFs(IN OUT EFI_BOOT_SERVICES *BootServices, IN EFI_FILE_OPEN OpenCallback)
EFI_STATUS CreateVirtualFileFileNameCopy(IN CONST CHAR16 *FileName, IN VOID *FileBuffer, IN UINT64 FileSize, IN CONST EFI_TIME *ModificationTime OPTIONAL, OUT EFI_FILE_PROTOCOL **File)
EFI_STATUS CreateRealFile(IN EFI_FILE_PROTOCOL *OriginalFile OPTIONAL, IN EFI_FILE_OPEN OpenCallback OPTIONAL, IN BOOLEAN CloseOnFailure, OUT EFI_FILE_PROTOCOL **File)
STATIC EFI_FILE_PROTOCOL * mCustomKernelDirectory
STATIC OC_CPU_INFO * mOcCpuInfo
STATIC EFI_STATUS OcKernelProcessMkext(IN OC_GLOBAL_CONFIG *Config, IN UINT32 DarwinVersion, IN BOOLEAN Is32Bit, IN OUT UINT8 *Mkext, IN OUT UINT32 *MkextSize, IN UINT32 AllocatedSize)
STATIC OC_GLOBAL_CONFIG * mOcConfiguration
VOID OcUnloadKernelSupport(VOID)
STATIC EFI_STATUS OcKernelReadAppleKernel(IN EFI_FILE_PROTOCOL *RootFile, IN EFI_FILE_PROTOCOL *KernelFile, IN CHAR16 *FileName, IN BOOLEAN Is32Bit, IN OUT UINT32 *DarwinVersion, OUT UINT8 **Kernel, OUT UINT32 *KernelSize, OUT UINT32 *AllocatedSize, OUT UINT32 *ReservedExeSize, OUT UINT32 *LinkedExpansion, OUT UINT8 *Digest OPTIONAL)
STATIC BOOLEAN mOcCachelessInProgress
STATIC UINT8 mKernelDigest[SHA384_DIGEST_SIZE]
STATIC OC_STORAGE_CONTEXT * mOcStorage
VOID OcKernelInjectKexts(IN OC_GLOBAL_CONFIG *Config, IN KERNEL_CACHE_TYPE CacheType, IN VOID *Context, IN UINT32 DarwinVersion, IN BOOLEAN Is32Bit, IN UINT32 LinkedExpansion, IN UINT32 ReservedExeSize)
STATIC VOID OcKernelConfigureCapabilities(IN OUT EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, IN UINT32 Capabilities)
STATIC EFI_STATUS OcKernelInitCacheless(IN OC_GLOBAL_CONFIG *Config, IN CACHELESS_CONTEXT *Context, IN UINT32 DarwinVersion, IN BOOLEAN Is32Bit, IN CHAR16 *FileName, IN EFI_FILE_PROTOCOL *ExtensionsDir, OUT EFI_FILE_PROTOCOL **File)
STATIC CACHELESS_CONTEXT mOcCachelessContext
EFI_STATUS OcKernelProcessPrelinked(IN OC_GLOBAL_CONFIG *Config, IN UINT32 DarwinVersion, IN BOOLEAN Is32Bit, IN OUT UINT8 *Kernel, IN UINT32 *KernelSize, IN UINT32 AllocatedSize, IN UINT32 LinkedExpansion, IN UINT32 ReservedExeSize)
VOID OcLoadKernelSupport(IN OC_STORAGE_CONTEXT *Storage, IN OC_GLOBAL_CONFIG *Config, IN OC_CPU_INFO *CpuInfo)
STATIC EFI_STATUS EFIAPI OcKernelFileOpen(IN EFI_FILE_PROTOCOL *This, OUT EFI_FILE_PROTOCOL **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes)
STATIC EFI_STATUS OcKernelLoadKextsAndReserve(IN EFI_FILE_PROTOCOL *RootFile, IN OC_STORAGE_CONTEXT *Storage, IN OC_GLOBAL_CONFIG *Config, IN KERNEL_CACHE_TYPE CacheType, IN BOOLEAN Is32Bit, OUT UINT32 *ReservedExeSize, OUT UINT32 *ReservedInfoSize, OUT UINT32 *NumReservedKexts)
STATIC BOOLEAN mUse32BitKernel
STATIC BOOLEAN mCustomKernelDirectoryInProgress
STATIC EFI_STATUS OcKernelFuzzyMatch(IN EFI_FILE_PROTOCOL *RootFile, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes, IN BOOLEAN Is32Bit, IN OUT UINT32 *DarwinVersion, OUT EFI_FILE_PROTOCOL **KernelFile, OUT UINT8 **Kernel, OUT UINT32 *KernelSize, OUT UINT32 *AllocatedSize, OUT UINT32 *ReservedExeSize, OUT UINT32 *LinkedExpansion, OUT UINT8 *Digest OPTIONAL)
STATIC UINT32 mOcDarwinVersion
STATIC VOID OcKernelInjectKext(IN OC_KERNEL_ADD_ENTRY *Kext, IN UINT32 Index, IN BOOLEAN IsForced, IN KERNEL_CACHE_TYPE CacheType, IN VOID *Context, IN UINT32 DarwinVersion, IN BOOLEAN Is32Bit)
STATIC VOID OcKernelLoadAndReserveKext(IN OC_KERNEL_ADD_ENTRY *Kext, IN UINT32 Index, IN BOOLEAN IsForced, IN EFI_FILE_PROTOCOL *RootFile, IN OC_STORAGE_CONTEXT *Storage, IN OC_GLOBAL_CONFIG *Config, IN KERNEL_CACHE_TYPE CacheType, IN BOOLEAN Is32Bit, IN OUT UINT32 *ReservedExeSize, IN OUT UINT32 *ReservedInfoSize, IN OUT UINT32 *NumReservedKexts)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_RUNTIME_SERVICES * gRT