Sherlocks Posted January 27, 2017 Share Posted January 27, 2017 Ah that's Slice did. Not me. Yes. You can merge all Sierra versions. And that will be: 1. DP1 ==> YosEXT* and SieSIP* 2. DP2 ~ 10.12.3 ==> SieEXT* and SieSIP* 3. 10.12.4 ==> Sie4EXT* and SieSIP* But I think it will be a little complicated. And I have a new idea: 1. First run SieSIP* cuz it is universal. 2. And then use "brute-force" way (Try to patch) to divide DP1/DP2~10123/10124 But... To tired today and have no ability to test recently... BTW. Happy Chinese New Year. no need to make complicate code. already slice made code work enough. just combine 10.12.4 into 10.12 part better like you did if divide each sierra version, Uniformity of code is poor. ofc, divide code is more correct. but make complicate. I wonder if this is all right to reduce boot time. Since the current standard is "AsciiOSVersionToUint64" else if ((os_version >= AsciiOSVersionToUint64("10.12")) && (os_version <= AsciiOSVersionToUint64("10.12.3"))) { Num = SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBEYosSearchEXT, sizeof(KBEYosSearchEXT), KBEYosReplaceEXT, 1) + // SieDP1 SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBESieSearchEXT, sizeof(KBESieSearchEXT), KBESieReplaceEXT, 1) + // Missing KBESie* for 10.12 DP2 - 10.12.3, filled by PMheart. SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBESieSearchSIP, sizeof(KBESieSearchSIP), KBESieReplaceSIP, 1); // Universal. DBG_RT(Entry, "==> kernel Sierra: %d replaces done.\n", Num); } else if ((os_version >= AsciiOSVersionToUint64("10.12.4")) /* && (os_version <= AsciiOSVersionToUint64("10.12.4"))*/) { Num = SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBESie4SearchEXT, sizeof(KBESie4SearchEXT), KBESie4ReplaceEXT, 1) + SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBESieSearchSIP, sizeof(KBESieSearchSIP), KBESieReplaceSIP, 1); DBG_RT(Entry, "==> kernel Sierra 10.12.4: %d replaces done.\n", Num); to else if ((os_version >= AsciiOSVersionToUint64("10.12")) && (os_version < AsciiOSVersionToUint64("10.13"))) { Num = SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBEYosSearchEXT, sizeof(KBEYosSearchEXT), KBEYosReplaceEXT, 1) + SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBESieSearchEXT, sizeof(KBESieSearchEXT), KBESieReplaceEXT, 1) + SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBESie4SearchEXT, sizeof(KBESie4SearchEXT), KBESie4ReplaceEXT, 1) + SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBESieSearchSIP, sizeof(KBESieSearchSIP), KBESieReplaceSIP, 1); DBG_RT(Entry, "==> kernel Sierra: %d replaces done.\n", Num); } 1 Link to comment Share on other sites More sharing options...
PMheart Posted January 27, 2017 Share Posted January 27, 2017 no need to make complicate code. already slice made code work enough. just combine 10.12.4 into 10.12 part if divide each sierra version, Uniformity of code is poor. to I see. Good idea! And also it's better to add a comment that we need YosEXT* for SieDP1. And @Slice may consider committing this? Link to comment Share on other sites More sharing options...
Micky1979 Posted January 27, 2017 Share Posted January 27, 2017 Bad idea . Installers has no 'SystemVersion.plist'. Better should be to find the Darwin kernel version string instead. 3 Link to comment Share on other sites More sharing options...
PMheart Posted January 27, 2017 Share Posted January 27, 2017 Bad idea . Installers has no 'SystemVersion.plist. Better should be to find the Darwin kernel version string instead. Whoops. In this case how Clover read System Version? But... Why installers have no 'SV.plist', IMHO /S*/L*/CoreServices/SV.plist still exists? Link to comment Share on other sites More sharing options...
Micky1979 Posted January 27, 2017 Share Posted January 27, 2017 because is inside BaseSystem.dmg. But is only a disk image used to transfer things to destination ( Installer is loading the prelinkedkernel with arguments loaded from com.apple.boot.plist). In those arguments anyway you will find the name of the app: char *LionPattern = "Install%20Mac%20OS%20X%20Lion"; char *MLPattern = "Install%20OS%20X%20Mountain%20Lion"; char *MavPattern = "Install%20OS%20X%20Mavericks"; char *YosPattern = "Install%20OS%20X%20Yosemite"; char *ECPattern = "Install%20OS%20X%20El%20Capitan"; char *SierraPattern = "Install%macOS%20Sierra"; (used in Enoch to know the location of the kernelcache/prelinkedkernel). As I said to patch the kernel is used, anyway, the Darwin version. 1 Link to comment Share on other sites More sharing options...
PMheart Posted January 27, 2017 Share Posted January 27, 2017 because is inside BaseSystem.dmg. But is only a disk image used to transfer things to destination ( Installer is loading the prelinkedkernel with arguments loaded from com.apple.boot.plist). In those arguments anyway you will find the name of the app: char *LionPattern = "Install%20Mac%20OS%20X%20Lion"; char *MLPattern = "Install%20OS%20X%20Mountain%20Lion"; char *MavPattern = "Install%20OS%20X%20Mavericks"; char *YosPattern = "Install%20OS%20X%20Yosemite"; char *ECPattern = "Install%20OS%20X%20El%20Capitan"; char *SierraPattern = "Install%macOS%20Sierra"; (used in Enoch to know the location of the kernelcache/prelinkedkernel). As I said to patch the kernel is used, anyway, the Darwin version. A little clearer. Thanks. But IMHO. An installer made by `createinstallmedia` will contain invisible /S*/L*/CS/SV.plist and also boot.efi is located in /S*/L*/CS. An installer based on BaseSystem and Packages folder will obviously contain above. BTW. We may just try to patch like previously we did? - To revert back... Link to comment Share on other sites More sharing options...
Micky1979 Posted January 27, 2017 Share Posted January 27, 2017 If you load "Install macOS Sierra.app" from your running OS you will have "/.IAProductInfo" and "OS X Install Data" or something new for Sierra dir ..but not the SystemVersion.plist. In this case will fail. Also installers with createinstallmedia create some temporary folders like these, so probably the installer will fail after the first reboot. 1 Link to comment Share on other sites More sharing options...
PMheart Posted January 27, 2017 Share Posted January 27, 2017 If you load "Install macOS Sierra.app" from your running OS you will have "/.IAProductInfo" and "OS X Install Data" or something new for Sierra dir ..but not the SystemVersion.plist. In this case will fail. Also installers with createinstallmedia create some temporary folders like these, so probably the installer will fail after the first reboot. Thanks for the excellent clarifications/evidence! BTW. Unsupported CPU Patch is still using this way - gather something we need from SV.plist. (See kernel_patcher.c) //TimeWalker - extended and corrected for systems up to Yosemite VOID KernelPatcher_64(VOID* kernelData, LOADER_ENTRY *Entry) { UINT8 *bytes = (UINT8*)kernelData; UINT32 patchLocation=0, patchLocation1=0; UINT32 i; UINT32 switchaddr=0; UINT32 mask_family=0, mask_model=0; UINT32 cpuid_family_addr=0, cpuid_model_addr=0; UINT64 os_version; DBG_RT(Entry, "\nLooking for _cpuid_set_info _panic ...\n"); // Determine location of _cpuid_set_info _panic call for reference // basically looking for info_p->cpuid_model = bitfield32(reg[eax], 7, 4); for (i=0; i<0x1000000; i++) { if (bytes[i+ 0] == 0xC7 && bytes[i+ 1] == 0x05 && bytes[i+ 5] == 0x00 && bytes[i+ 6] == 0x07 && bytes[i+ 7] == 0x00 && bytes[i+ 8] == 0x00 && bytes[i+ 9] == 0x00 && bytes[i-5] == 0xE8) { // matching 0xE8 for _panic call start patchLocation = i-5; break; } } if (!patchLocation) { DBG_RT(Entry, "_cpuid_set_info Unsupported CPU _panic not found \n"); return; } os_version = AsciiOSVersionToUint64(Entry->OSVersion); // make sure only kernels for OSX 10.6.0 to 10.7.3 are being patched by this approach if (os_version >= AsciiOSVersionToUint64("10.6") && os_version <= AsciiOSVersionToUint64("10.7.3")) { DBG_RT(Entry, "will patch kernel for macOS 10.6.0 to 10.7.3\n"); // remove tsc_init: unknown CPU family panic for kernels prior to 10.6.2 which still had Atom support if (os_version < AsciiOSVersionToUint64("10.6.2")) { for (i=0; i<0x1000000; i++) { // find _tsc_init panic address by byte sequence 488d3df4632a00 if (bytes[i] == 0x48 && bytes[i+1] == 0x8D && bytes[i+2] == 0x3D && bytes[i+3] == 0xF4 && bytes[i+4] == 0x63 && bytes[i+5] == 0x2A && bytes[i+6] == 0x00) { patchLocation1 = i+9; DBG_RT(Entry, "Found _tsc_init _panic address at 0x%08x\n",patchLocation1); break; } } // NOP _panic call if (patchLocation1) { bytes[patchLocation1 + 0] = 0x90; bytes[patchLocation1 + 1] = 0x90; bytes[patchLocation1 + 2] = 0x90; bytes[patchLocation1 + 3] = 0x90; bytes[patchLocation1 + 4] = 0x90; } } else { // assume patching logic for OSX 10.6.2 to 10.7.3 /* Here is our case from CPUID switch statement, it sets CPUFAMILY_UNKNOWN C7051C2C5F0000000000 mov dword [ds:0xffffff80008a22c0], 0x0 (example from 10.7) */ switchaddr = patchLocation - 19; DBG_RT(Entry, "switch statement patch location is 0x%08x\n", (switchaddr+6)); if (bytes[switchaddr + 0] == 0xC7 && bytes[switchaddr + 1] == 0x05 && bytes[switchaddr + 5] == 0x00 && bytes[switchaddr + 6] == 0x00 && bytes[switchaddr + 7] == 0x00 && bytes[switchaddr + 8] == 0x00) { // Determine cpuid_family address from above mov operation cpuid_family_addr = bytes[switchaddr + 2] << 0 | bytes[switchaddr + 3] << 8 | bytes[switchaddr + 4] << 16 | bytes[switchaddr + 5] << 24; cpuid_family_addr = cpuid_family_addr + (switchaddr + 10); if (cpuid_family_addr) { // Determine cpuid_model address // for 10.6.2 kernels it's offset by 299 bytes from cpuid_family address if (os_version == AsciiOSVersionToUint64("10.6.2")) { cpuid_model_addr = cpuid_family_addr - 0X12B; } // for 10.6.3 to 10.6.7 it's offset by 303 bytes else if (os_version <= AsciiOSVersionToUint64("10.6.7")) { cpuid_model_addr = cpuid_family_addr - 0X12F; } // for 10.6.8 to 10.7.3 kernels - by 339 bytes else { cpuid_model_addr = cpuid_family_addr - 0X153; } DBG_RT(Entry, "cpuid_family address: 0x%08x\n", cpuid_family_addr); DBG_RT(Entry, "cpuid_model address: 0x%08x\n", cpuid_model_addr); switchaddr += 6; // offset 6 bytes in mov operation to write a dword instead of zero // calculate mask for patching, cpuid_family mask not needed as we offset on a valid mask mask_model = cpuid_model_addr - (switchaddr+14); DBG_RT(Entry, "model mask 0x%08x\n", mask_model); DBG_RT(Entry, "overriding cpuid_family and cpuid_model as CPUID_INTEL_PENRYN\n"); bytes[switchaddr+0] = (CPUFAMILY_INTEL_PENRYN & 0x000000FF) >> 0; bytes[switchaddr+1] = (CPUFAMILY_INTEL_PENRYN & 0x0000FF00) >> 8; bytes[switchaddr+2] = (CPUFAMILY_INTEL_PENRYN & 0x00FF0000) >> 16; bytes[switchaddr+3] = (CPUFAMILY_INTEL_PENRYN & 0xFF000000) >> 24; // mov dword [ds:0xffffff80008a216d], 0x2000117 bytes[switchaddr+4] = 0xC7; bytes[switchaddr+5] = 0x05; bytes[switchaddr+6] = (UINT8)((mask_model & 0x000000FF) >> 0); bytes[switchaddr+7] = (UINT8)((mask_model & 0x0000FF00) >> 8); bytes[switchaddr+8] = (UINT8)((mask_model & 0x00FF0000) >> 16); bytes[switchaddr+9] = (UINT8)((mask_model & 0xFF000000) >> 24); bytes[switchaddr+10] = 0x17; // cpuid_model (Penryn) bytes[switchaddr+11] = 0x01; // cpuid_extmodel bytes[switchaddr+12] = 0x00; // cpuid_extfamily bytes[switchaddr+13] = 0x02; // cpuid_stepping // fill remainder with 4 NOPs for (i=14; i<18; i++) { bytes[switchaddr+i] = 0x90; } } } else { DBG_RT(Entry, "Unable to determine cpuid_family address, patching aborted\n"); return; } } // patch ssse3 if (!SSSE3 && (AsciiStrnCmp(Entry->OSVersion,"10.6",4)==0)) { Patcher_SSE3_6((VOID*)bytes); } if (!SSSE3 && (AsciiStrnCmp(Entry->OSVersion,"10.7",4)==0)) { Patcher_SSE3_7((VOID*)bytes); } } // all 10.7.4+ kernels share common CPUID switch statement logic, // it needs to be exploited in diff manner due to the lack of space else if (os_version >= AsciiOSVersionToUint64("10.7.4")) { DBG_RT(Entry, "will patch kernel for macOS 10.7.4+\n"); /* Here is our switchaddress location ... it should be case 20 from CPUID switch statement 833D78945F0000 cmp dword [ds:0xffffff80008a21d0], 0x0; 7417 je 0xffffff80002a8d71 */ switchaddr = patchLocation-45; DBG_RT(Entry, "switch statement patch location is 0x%08x\n", switchaddr); if(bytes[switchaddr + 0] == 0x83 && bytes[switchaddr + 1] == 0x3D && bytes[switchaddr + 5] == 0x00 && bytes[switchaddr + 6] == 0x00 && bytes[switchaddr + 7] == 0x74) { // Determine cpuid_family address // 891D4F945F00 mov dword [ds:0xffffff80008a21a0], ebx cpuid_family_addr = bytes[switchaddr - 4] << 0 | bytes[switchaddr - 3] << 8 | bytes[switchaddr - 2] << 16 | bytes[switchaddr - 1] << 24; cpuid_family_addr = cpuid_family_addr + switchaddr; if (cpuid_family_addr) { // Determine cpuid_model address // for 10.6.8+ kernels it's 339 bytes apart from cpuid_family address cpuid_model_addr = cpuid_family_addr - 0X153; DBG_RT(Entry, "cpuid_family address: 0x%08x\n", cpuid_family_addr); DBG_RT(Entry, "cpuid_model address: 0x%08x\n", cpuid_model_addr); // Calculate masks for patching mask_family = cpuid_family_addr - (switchaddr +15); mask_model = cpuid_model_addr - (switchaddr +25); DBG_RT(Entry, "\nfamily mask: 0x%08x \nmodel mask: 0x%08x\n", mask_family, mask_model); // retain original // test ebx, ebx bytes[switchaddr+0] = bytes[patchLocation-13]; bytes[switchaddr+1] = bytes[patchLocation-12]; // retain original, but move jump offset by 20 bytes forward // jne for above test bytes[switchaddr+2] = bytes[patchLocation-11]; bytes[switchaddr+3] = bytes[patchLocation-10]+0x20; // mov ebx, 0x78ea4fbc bytes[switchaddr+4] = 0xBB; bytes[switchaddr+5] = (CPUFAMILY_INTEL_PENRYN & 0x000000FF) >> 0; bytes[switchaddr+6] = (CPUFAMILY_INTEL_PENRYN & 0x0000FF00) >> 8; bytes[switchaddr+7] = (CPUFAMILY_INTEL_PENRYN & 0x00FF0000) >> 16; bytes[switchaddr+8] = (CPUFAMILY_INTEL_PENRYN & 0xFF000000) >> 24; // mov dword, ebx bytes[switchaddr+9] = 0x89; bytes[switchaddr+10] = 0x1D; // cpuid_cpufamily address 0xffffff80008a21a0 bytes[switchaddr+11] = (UINT8)((mask_family & 0x000000FF) >> 0); bytes[switchaddr+12] = (UINT8)((mask_family & 0x0000FF00) >> 8); bytes[switchaddr+13] = (UINT8)((mask_family & 0x00FF0000) >> 16); bytes[switchaddr+14] = (UINT8)((mask_family & 0xFF000000) >> 24); // mov dword bytes[switchaddr+15] = 0xC7; bytes[switchaddr+16] = 0x05; // cpuid_model address 0xffffff80008b204d bytes[switchaddr+17] = (UINT8)((mask_model & 0x000000FF) >> 0); bytes[switchaddr+18] = (UINT8)((mask_model & 0x0000FF00) >> 8); bytes[switchaddr+19] = (UINT8)((mask_model & 0x00FF0000) >> 16); bytes[switchaddr+20] = (UINT8)((mask_model & 0xFF000000) >> 24); bytes[switchaddr+21] = 0x17; // cpuid_model bytes[switchaddr+22] = 0x01; // cpuid_extmodel bytes[switchaddr+23] = 0x00; // cpuid_extfamily bytes[switchaddr+24] = 0x02; // cpuid_stepping // fill remainder with 25 NOPs for (i=25; i<25+25; i++) { bytes[switchaddr+i] = 0x90; } } } else { DBG_RT(Entry, "Unable to determine cpuid_family address, patching aborted\n"); return; } } } 1 Link to comment Share on other sites More sharing options...
Micky1979 Posted January 27, 2017 Share Posted January 27, 2017 Timing. Ther's a structure containing the OSVersion somewhere, but must be already loaded. You will see that someone has also made this comment: // // We can not rely on OSVersion global variable for OS version detection, // since in some cases it is not correct (install of ML from Lion, for example). // So, we'll use "brute-force" method - just try to patch. // Actually, we'll at least check that if we can find only one instance of code that // we are planning to patch. // 2 Link to comment Share on other sites More sharing options...
PMheart Posted January 27, 2017 Share Posted January 27, 2017 Timing. Ther's a structure containing the OSVersion somewhere, but must be already loaded. You will see that someone has also made this comment: // // We can not rely on OSVersion global variable for OS version detection, // since in some cases it is not correct (install of ML from Lion, for example). // So, we'll use "brute-force" method - just try to patch. // Actually, we'll at least check that if we can find only one instance of code that // we are planning to patch. // Yes. This has been a long time... But really make sense! Try to patch is the most excellent way for patching but sometimes it may cause problems. Link to comment Share on other sites More sharing options...
Micky1979 Posted January 27, 2017 Share Posted January 27, 2017 Don't know if we can extract the Darwin version in getPrelink(), later will be possible to associate that with a OS version useDarwinVersion = true; uint32_t offset = 0; strncpy(gDarwinBuildVerStr, "Darwin Kernel Version", sizeof(gDarwinBuildVerStr)); while ((offset < 0xFFFFFFFF - (uint32_t)binary - 256) && memcmp(binary + offset, gDarwinBuildVerStr, 21)) { offset++; } if (offset < 0xFFFFFFFF - (uint32_t)binary - 256) { strncpy(gDarwinBuildVerStr, (char *)(binary + offset), sizeof(gDarwinBuildVerStr)); } else { strcat(gDarwinBuildVerStr, ": Unknown"); useDarwinVersion = false; } // Micky1979 use Bungo gDarwinBuildVerStr and split into gDarwinMajor, gDarwinMinor and gDarwinRev if (useDarwinVersion) { useDarwinVersion = false; const char *pattern = strstr(gDarwinBuildVerStr, "Darwin Kernel Version ")+22; const char *until = strstr(pattern, ":"); size_t vlen = until - pattern; char *ver = (char *)malloc(sizeof(char)*(len+1)); strncpy(ver, pattern, vlen); ver[vlen] = '\0'; char *delim; char *temp; gDarwinMajor = -1; gDarwinMinor = -1; gDarwinRev = -1; if (ver != NULL) { temp = ver; int count = 1; while ((delim = strsep_c(&ver, ".")) != NULL) { switch (count) { case 1: gDarwinMajor = atoi(delim); break; case 2: gDarwinMinor = atoi(delim); break; case 3: gDarwinRev = atoi(delim); break; default: break; } count ++; } free(temp); } if (gDarwinMajor >= 0 && gDarwinMinor >= 0 && gDarwinRev >= 0) { useDarwinVersion = true; } switch (gDarwinMajor) { case 10: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA060000; break; case 1: kernelOSVer = 0xA060100; break; case 2: kernelOSVer = 0xA060200; break; case 3: kernelOSVer = 0xA060300; break; case 4: kernelOSVer = 0xA060400; break; case 5: kernelOSVer = 0xA060500; break; case 6: kernelOSVer = 0xA060600; break; case 7: kernelOSVer = 0xA060700; break; case 8: kernelOSVer = 0xA060800; break; default:kernelOSVer = 0xA060800; break; //Last known kernel } break; case 11: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA070000; break; case 1: kernelOSVer = 0xA070100; break; case 2: kernelOSVer = 0xA070200; break; case 3: kernelOSVer = 0xA070300; break; case 4: switch (gDarwinRev) { case 0: kernelOSVer = 0xA070400; break; case 1: kernelOSVer = 0xA070400; break; case 2: kernelOSVer = 0xA070500; break; default:kernelOSVer = 0xA070500; break; //Last known kernel } default:kernelOSVer = 0xA070500; break; //Last known kernel } break; case 12: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA080000; break; case 1: kernelOSVer = 0xA080100; break; case 2: kernelOSVer = 0xA080200; break; case 3: kernelOSVer = 0xA080300; break; case 4: kernelOSVer = 0xA080400; break; case 5: kernelOSVer = 0xA080500; break; // 10.8.5 case 6: kernelOSVer = 0xA080500; break; // 10.8.5 update default:kernelOSVer = 0xA080500; break; //Last known kernel } break; case 13: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA090000; switch (gDarwinRev) { case 0: kernelOSVer = 0xA090000; break; case 1: kernelOSVer = 0xA090000; break; // never exist (or released) case 2: kernelOSVer = 0xA090100; break; default:kernelOSVer = 0xA090100; break; //Last known kernel } break; case 1: kernelOSVer = 0xA090100; break; // never exist (or released) case 2: kernelOSVer = 0xA090200; break; case 3: kernelOSVer = 0xA090300; break; case 4: kernelOSVer = 0xA090400; break; case 5: kernelOSVer = 0xA090500; break; default:kernelOSVer = 0xA090500; break; //Last known kernel } break; case 14: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA0A0000; break; // same kernel of 10.10.1 case 1: kernelOSVer = 0xA0A0100; break; // same kernel of 10.10 case 2: kernelOSVer = 0xA0A0200; break; case 3: kernelOSVer = 0xA0A0300; break; case 4: kernelOSVer = 0xA0A0400; break; case 5: kernelOSVer = 0xA0A0500; break; default:kernelOSVer = 0xA0A0500; break; //Last known kernel } break; case 15: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA0B0000; break; case 1: kernelOSVer = 0xA0B0100; break; case 2: kernelOSVer = 0xA0B0200; break; case 3: kernelOSVer = 0xA0B0300; break; case 4: kernelOSVer = 0xA0B0400; break; case 5: kernelOSVer = 0xA0B0500; break; case 6: kernelOSVer = 0xA0B0600; break; default:kernelOSVer = 0xA0B0600; break; //Last known kernel (add here updates) } break; case 16: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA0C0000; break; default:kernelOSVer = 0xA0C0000; break; //Last known kernel (add here updates) } break; default: kernelOSVer = 0xA0B0100; break; //Last known kernel } } else { switch (MacOSVerCurrent) { // Snow case 0xA060000: gDarwinMajor = 10; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.6 case 0xA060100: gDarwinMajor = 10; gDarwinMinor = 1; gDarwinRev = 0; break; // 10.6.1 case 0xA060200: gDarwinMajor = 10; gDarwinMinor = 2; gDarwinRev = 0; break; // 10.6.2 case 0xA060300: gDarwinMajor = 10; gDarwinMinor = 3; gDarwinRev = 0; break; // 10.6.3 case 0xA060400: gDarwinMajor = 10; gDarwinMinor = 4; gDarwinRev = 0; break; // 10.6.4 case 0xA060500: gDarwinMajor = 10; gDarwinMinor = 5; gDarwinRev = 0; break; // 10.6.5 case 0xA060600: gDarwinMajor = 10; gDarwinMinor = 6; gDarwinRev = 0; break; // 10.6.6 case 0xA060700: gDarwinMajor = 10; gDarwinMinor = 7; gDarwinRev = 0; break; // 10.6.7 case 0xA060800: gDarwinMajor = 10; gDarwinMinor = 8; gDarwinRev = 0; break; // 10.6.8 // Lion case 0xA070000: gDarwinMajor = 11; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.7 case 0xA070100: gDarwinMajor = 11; gDarwinMinor = 1; gDarwinRev = 0; break; // 10.7.1 case 0xA070200: gDarwinMajor = 11; gDarwinMinor = 2; gDarwinRev = 0; break; // 10.7.2 case 0xA070300: gDarwinMajor = 11; gDarwinMinor = 3; gDarwinRev = 0; break; // 10.7.3 case 0xA070400: gDarwinMajor = 11; gDarwinMinor = 4; gDarwinRev = 0; break; // 10.7.4 case 0xA070500: gDarwinMajor = 11; gDarwinMinor = 4; gDarwinRev = 2; break; // 10.7.5 // ML case 0xA080000: gDarwinMajor = 12; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.8 case 0xA080100: gDarwinMajor = 12; gDarwinMinor = 1; gDarwinRev = 0; break; // 10.8.1 case 0xA080200: gDarwinMajor = 12; gDarwinMinor = 2; gDarwinRev = 0; break; // 10.8.2 case 0xA080300: gDarwinMajor = 12; gDarwinMinor = 3; gDarwinRev = 0; break; // 10.8.3 case 0xA080400: gDarwinMajor = 12; gDarwinMinor = 4; gDarwinRev = 0; break; // 10.8.4 case 0xA080500: gDarwinMajor = 12; gDarwinMinor = 5; gDarwinRev = 0; break; // 10.8.5 // Mavericks case 0xA090000: gDarwinMajor = 13; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.9 case 0xA090100: gDarwinMajor = 13; gDarwinMinor = 1; gDarwinRev = 0; break; // 10.9.1 case 0xA090200: gDarwinMajor = 13; gDarwinMinor = 2; gDarwinRev = 0; break; // 10.9.2 case 0xA090300: gDarwinMajor = 13; gDarwinMinor = 3; gDarwinRev = 0; break; // 10.9.3 case 0xA090400: gDarwinMajor = 13; gDarwinMinor = 4; gDarwinRev = 0; break; // 10.9.4 case 0xA090500: gDarwinMajor = 13; gDarwinMinor = 5; gDarwinRev = 0; break; // 10.9.5 // Yosemite case 0xA0A0000: gDarwinMajor = 14; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.10 case 0xA0A0100: gDarwinMajor = 14; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.10.1 case 0xA0A0200: gDarwinMajor = 14; gDarwinMinor = 2; gDarwinRev = 0; break; // 10.10.2 case 0xA0A0300: gDarwinMajor = 14; gDarwinMinor = 3; gDarwinRev = 0; break; // 10.10.3 case 0xA0A0400: gDarwinMajor = 14; gDarwinMinor = 4; gDarwinRev = 0; break; // 10.10.4 case 0xA0A0500: gDarwinMajor = 14; gDarwinMinor = 5; gDarwinRev = 0; break; // 10.10.5 // El Capitan case 0xA0B0000: gDarwinMajor = 15; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.11 case 0xA0B0100: gDarwinMajor = 15; gDarwinMinor = 1; gDarwinRev = 0; break; // 10.11.1 case 0xA0B0200: gDarwinMajor = 15; gDarwinMinor = 2; gDarwinRev = 0; break; // 10.11.2 case 0xA0B0300: gDarwinMajor = 15; gDarwinMinor = 3; gDarwinRev = 0; break; // 10.11.3 case 0xA0B0400: gDarwinMajor = 15; gDarwinMinor = 4; gDarwinRev = 0; break; // 10.11.4 case 0xA0B0500: gDarwinMajor = 15; gDarwinMinor = 5; gDarwinRev = 0; break; // 10.11.5 case 0xA0B0600: gDarwinMajor = 15; gDarwinMinor = 6; gDarwinRev = 0; break; // 10.11.6 // Sierra case 0xA0C0000: gDarwinMajor = 16; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.12 // default = last known kernel default: gDarwinMajor = 16; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.12; } } and know it some time before/or overwrite it if wrong 1 Link to comment Share on other sites More sharing options...
bs0d Posted January 27, 2017 Share Posted January 27, 2017 why not just do the checks during BootExitServices ie once the kernel/prelink is loaded into ram by boot.efi. simple and always accurate if you use the kernel versions instead. 4 Link to comment Share on other sites More sharing options...
PMheart Posted January 27, 2017 Share Posted January 27, 2017 Don't know if we can extract the Darwin version in getPrelink(), later will be possible to associate that with a OS version useDarwinVersion = true; uint32_t offset = 0; strncpy(gDarwinBuildVerStr, "Darwin Kernel Version", sizeof(gDarwinBuildVerStr)); while ((offset < 0xFFFFFFFF - (uint32_t)binary - 256) && memcmp(binary + offset, gDarwinBuildVerStr, 21)) { offset++; } if (offset < 0xFFFFFFFF - (uint32_t)binary - 256) { strncpy(gDarwinBuildVerStr, (char *)(binary + offset), sizeof(gDarwinBuildVerStr)); } else { strcat(gDarwinBuildVerStr, ": Unknown"); useDarwinVersion = false; } // Micky1979 use Bungo gDarwinBuildVerStr and split into gDarwinMajor, gDarwinMinor and gDarwinRev if (useDarwinVersion) { useDarwinVersion = false; const char *pattern = strstr(gDarwinBuildVerStr, "Darwin Kernel Version ")+22; const char *until = strstr(pattern, ":"); size_t vlen = until - pattern; char *ver = (char *)malloc(sizeof(char)*(len+1)); strncpy(ver, pattern, vlen); ver[vlen] = '\0'; char *delim; char *temp; gDarwinMajor = -1; gDarwinMinor = -1; gDarwinRev = -1; if (ver != NULL) { temp = ver; int count = 1; while ((delim = strsep_c(&ver, ".")) != NULL) { switch (count) { case 1: gDarwinMajor = atoi(delim); break; case 2: gDarwinMinor = atoi(delim); break; case 3: gDarwinRev = atoi(delim); break; default: break; } count ++; } free(temp); } if (gDarwinMajor >= 0 && gDarwinMinor >= 0 && gDarwinRev >= 0) { useDarwinVersion = true; } switch (gDarwinMajor) { case 10: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA060000; break; case 1: kernelOSVer = 0xA060100; break; case 2: kernelOSVer = 0xA060200; break; case 3: kernelOSVer = 0xA060300; break; case 4: kernelOSVer = 0xA060400; break; case 5: kernelOSVer = 0xA060500; break; case 6: kernelOSVer = 0xA060600; break; case 7: kernelOSVer = 0xA060700; break; case 8: kernelOSVer = 0xA060800; break; default:kernelOSVer = 0xA060800; break; //Last known kernel } break; case 11: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA070000; break; case 1: kernelOSVer = 0xA070100; break; case 2: kernelOSVer = 0xA070200; break; case 3: kernelOSVer = 0xA070300; break; case 4: switch (gDarwinRev) { case 0: kernelOSVer = 0xA070400; break; case 1: kernelOSVer = 0xA070400; break; case 2: kernelOSVer = 0xA070500; break; default:kernelOSVer = 0xA070500; break; //Last known kernel } default:kernelOSVer = 0xA070500; break; //Last known kernel } break; case 12: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA080000; break; case 1: kernelOSVer = 0xA080100; break; case 2: kernelOSVer = 0xA080200; break; case 3: kernelOSVer = 0xA080300; break; case 4: kernelOSVer = 0xA080400; break; case 5: kernelOSVer = 0xA080500; break; // 10.8.5 case 6: kernelOSVer = 0xA080500; break; // 10.8.5 update default:kernelOSVer = 0xA080500; break; //Last known kernel } break; case 13: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA090000; switch (gDarwinRev) { case 0: kernelOSVer = 0xA090000; break; case 1: kernelOSVer = 0xA090000; break; // never exist (or released) case 2: kernelOSVer = 0xA090100; break; default:kernelOSVer = 0xA090100; break; //Last known kernel } break; case 1: kernelOSVer = 0xA090100; break; // never exist (or released) case 2: kernelOSVer = 0xA090200; break; case 3: kernelOSVer = 0xA090300; break; case 4: kernelOSVer = 0xA090400; break; case 5: kernelOSVer = 0xA090500; break; default:kernelOSVer = 0xA090500; break; //Last known kernel } break; case 14: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA0A0000; break; // same kernel of 10.10.1 case 1: kernelOSVer = 0xA0A0100; break; // same kernel of 10.10 case 2: kernelOSVer = 0xA0A0200; break; case 3: kernelOSVer = 0xA0A0300; break; case 4: kernelOSVer = 0xA0A0400; break; case 5: kernelOSVer = 0xA0A0500; break; default:kernelOSVer = 0xA0A0500; break; //Last known kernel } break; case 15: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA0B0000; break; case 1: kernelOSVer = 0xA0B0100; break; case 2: kernelOSVer = 0xA0B0200; break; case 3: kernelOSVer = 0xA0B0300; break; case 4: kernelOSVer = 0xA0B0400; break; case 5: kernelOSVer = 0xA0B0500; break; case 6: kernelOSVer = 0xA0B0600; break; default:kernelOSVer = 0xA0B0600; break; //Last known kernel (add here updates) } break; case 16: switch (gDarwinMinor) { case 0: kernelOSVer = 0xA0C0000; break; default:kernelOSVer = 0xA0C0000; break; //Last known kernel (add here updates) } break; default: kernelOSVer = 0xA0B0100; break; //Last known kernel } } else { switch (MacOSVerCurrent) { // Snow case 0xA060000: gDarwinMajor = 10; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.6 case 0xA060100: gDarwinMajor = 10; gDarwinMinor = 1; gDarwinRev = 0; break; // 10.6.1 case 0xA060200: gDarwinMajor = 10; gDarwinMinor = 2; gDarwinRev = 0; break; // 10.6.2 case 0xA060300: gDarwinMajor = 10; gDarwinMinor = 3; gDarwinRev = 0; break; // 10.6.3 case 0xA060400: gDarwinMajor = 10; gDarwinMinor = 4; gDarwinRev = 0; break; // 10.6.4 case 0xA060500: gDarwinMajor = 10; gDarwinMinor = 5; gDarwinRev = 0; break; // 10.6.5 case 0xA060600: gDarwinMajor = 10; gDarwinMinor = 6; gDarwinRev = 0; break; // 10.6.6 case 0xA060700: gDarwinMajor = 10; gDarwinMinor = 7; gDarwinRev = 0; break; // 10.6.7 case 0xA060800: gDarwinMajor = 10; gDarwinMinor = 8; gDarwinRev = 0; break; // 10.6.8 // Lion case 0xA070000: gDarwinMajor = 11; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.7 case 0xA070100: gDarwinMajor = 11; gDarwinMinor = 1; gDarwinRev = 0; break; // 10.7.1 case 0xA070200: gDarwinMajor = 11; gDarwinMinor = 2; gDarwinRev = 0; break; // 10.7.2 case 0xA070300: gDarwinMajor = 11; gDarwinMinor = 3; gDarwinRev = 0; break; // 10.7.3 case 0xA070400: gDarwinMajor = 11; gDarwinMinor = 4; gDarwinRev = 0; break; // 10.7.4 case 0xA070500: gDarwinMajor = 11; gDarwinMinor = 4; gDarwinRev = 2; break; // 10.7.5 // ML case 0xA080000: gDarwinMajor = 12; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.8 case 0xA080100: gDarwinMajor = 12; gDarwinMinor = 1; gDarwinRev = 0; break; // 10.8.1 case 0xA080200: gDarwinMajor = 12; gDarwinMinor = 2; gDarwinRev = 0; break; // 10.8.2 case 0xA080300: gDarwinMajor = 12; gDarwinMinor = 3; gDarwinRev = 0; break; // 10.8.3 case 0xA080400: gDarwinMajor = 12; gDarwinMinor = 4; gDarwinRev = 0; break; // 10.8.4 case 0xA080500: gDarwinMajor = 12; gDarwinMinor = 5; gDarwinRev = 0; break; // 10.8.5 // Mavericks case 0xA090000: gDarwinMajor = 13; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.9 case 0xA090100: gDarwinMajor = 13; gDarwinMinor = 1; gDarwinRev = 0; break; // 10.9.1 case 0xA090200: gDarwinMajor = 13; gDarwinMinor = 2; gDarwinRev = 0; break; // 10.9.2 case 0xA090300: gDarwinMajor = 13; gDarwinMinor = 3; gDarwinRev = 0; break; // 10.9.3 case 0xA090400: gDarwinMajor = 13; gDarwinMinor = 4; gDarwinRev = 0; break; // 10.9.4 case 0xA090500: gDarwinMajor = 13; gDarwinMinor = 5; gDarwinRev = 0; break; // 10.9.5 // Yosemite case 0xA0A0000: gDarwinMajor = 14; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.10 case 0xA0A0100: gDarwinMajor = 14; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.10.1 case 0xA0A0200: gDarwinMajor = 14; gDarwinMinor = 2; gDarwinRev = 0; break; // 10.10.2 case 0xA0A0300: gDarwinMajor = 14; gDarwinMinor = 3; gDarwinRev = 0; break; // 10.10.3 case 0xA0A0400: gDarwinMajor = 14; gDarwinMinor = 4; gDarwinRev = 0; break; // 10.10.4 case 0xA0A0500: gDarwinMajor = 14; gDarwinMinor = 5; gDarwinRev = 0; break; // 10.10.5 // El Capitan case 0xA0B0000: gDarwinMajor = 15; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.11 case 0xA0B0100: gDarwinMajor = 15; gDarwinMinor = 1; gDarwinRev = 0; break; // 10.11.1 case 0xA0B0200: gDarwinMajor = 15; gDarwinMinor = 2; gDarwinRev = 0; break; // 10.11.2 case 0xA0B0300: gDarwinMajor = 15; gDarwinMinor = 3; gDarwinRev = 0; break; // 10.11.3 case 0xA0B0400: gDarwinMajor = 15; gDarwinMinor = 4; gDarwinRev = 0; break; // 10.11.4 case 0xA0B0500: gDarwinMajor = 15; gDarwinMinor = 5; gDarwinRev = 0; break; // 10.11.5 case 0xA0B0600: gDarwinMajor = 15; gDarwinMinor = 6; gDarwinRev = 0; break; // 10.11.6 // Sierra case 0xA0C0000: gDarwinMajor = 16; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.12 // default = last known kernel default: gDarwinMajor = 16; gDarwinMinor = 0; gDarwinRev = 0; break; // 10.12; } } and know it some time before... This will be a little complicated cuz we may have to update Clover for every macOS update? In this case I think try to patch will be better. why not just do the checks during BootExitServices ie once the kernel/prelink is loaded into ram by boot.efi. simple and always accurate if you use the kernel versions instead. This can be only used when bin-patching. We may also need to print something like the system version in Clover GUI. Sorry. I have reached my quota of positive votes today... Link to comment Share on other sites More sharing options...
bs0d Posted January 27, 2017 Share Posted January 27, 2017 This can be only used when bin-patching. We may also need to print something like the system version in Clover GUI. Sorry. I have reached my quota of positive votes today... that makes absolutely no sense. Link to comment Share on other sites More sharing options...
Micky1979 Posted January 27, 2017 Share Posted January 27, 2017 why not just do the checks during BootExitServices ie once the kernel/prelink is loaded into ram by boot.efi. simple and always accurate if you use the kernel versions instead. Yes! This will be a little complicated cuz we may have to update Clover for every macOS update? In this case I think try to patch will be better. If the kernel is no longer compatible with the last known version of the kernel.. also Clover needs to be updated. Link to comment Share on other sites More sharing options...
PMheart Posted January 27, 2017 Share Posted January 27, 2017 Yes! If the kernel is no longer compatible with the last known version of the kernel.. also Clover needs to be updated. Seems to make sense. But your code sets each version of darwin... e.g. 16.0.0 16.1.0 etc. So we may need to update Clover as the new system has been out? Link to comment Share on other sites More sharing options...
Micky1979 Posted January 27, 2017 Share Posted January 27, 2017 in this case the switch case statement will break on default: granting that latest patches will applied to an unknown kernel (unknown kernel = newer kernel) Someone have to create a code for that, test its functionality and make a request to the mantainer (Slice) ..but is another story Link to comment Share on other sites More sharing options...
PMheart Posted January 27, 2017 Share Posted January 27, 2017 Someone have to create a code for that, test its functionality and make a request to the mantainer (Slice) Thanks to Slice for his hard work and also thanks to all Clover developers! But anyway... Typically a same major ver but a different minor ver is almost the same... We nearly did the same thing on the same major ver kernel, right? Link to comment Share on other sites More sharing options...
Micky1979 Posted January 27, 2017 Share Posted January 27, 2017 But anyway... Typically a same major ver but a different minor ver is almost the same... We nearly did the same thing on the same major ver kernel, right? ..noo, look better Guys, should I move our posts to Clover General Discussion? edit waiting Slice if want that.. Link to comment Share on other sites More sharing options...
PMheart Posted January 27, 2017 Share Posted January 27, 2017 ..noo, look better Guys, should I move our posts to Clover General Discussion? Sure. If needed. Link to comment Share on other sites More sharing options...
Slice Posted January 28, 2017 Share Posted January 28, 2017 ..noo, look better Guys, should I move our posts to Clover General Discussion? edit waiting Slice if want that.. I think this discussion is mostly relevant to the topic. 3 Link to comment Share on other sites More sharing options...
Sherlocks Posted January 28, 2017 Share Posted January 28, 2017 @Slice back home now. i installed official clover pkg r3994 but i can't still get sound. still have problem in "String.c" i use binary patch for applehda 0:110 0:000 - [00]: com.apple.driver.AppleHDA (AppleHDA for Reset Codec) :: BinPatch :: data len: 4 0:110 0:000 - [01]: com.apple.driver.AppleHDA (AppleHDA for Conexant CX20753/4) :: BinPatch :: data len: 4 0:110 0:000 - [02]: com.apple.driver.AppleHDA (AppleHDA for Reset Codec) :: BinPatch :: data len: 4 thank you add. clean kext_inject.c i checked kext_inject. if 1 rootine - i think we use it after installed macos. else rootine - recovery and usb installer all cases are working in my cases. MacOS boot, usb installer boot, recovery boot in r3994. 1 Link to comment Share on other sites More sharing options...
PMheart Posted January 28, 2017 Share Posted January 28, 2017 @Slice back home now. i installed official clover pkg r3994 but i can't still get sound. i use binary patch for applehda 스크린샷 2017-01-28 오후 8.04.36.png thank you add. clean kext_inject.c A minor typo. L635 - L637. The comment should be 10.12.0 instead of 10.12.1. 1 Link to comment Share on other sites More sharing options...
Sherlocks Posted January 28, 2017 Share Posted January 28, 2017 A minor typo. L635 - L637. The comment should be 10.12.0 instead of 10.12.1. right. i did report with kext_inject. when it, i miss it. edited now. thank you kext_inject.c - clean.zip 1 Link to comment Share on other sites More sharing options...
PMheart Posted January 28, 2017 Share Posted January 28, 2017 right. i did report with kext_inject. when it, i miss it. edited now. thank you BTW. Seems to miss KBESieDebug* here though I don't know how to use them: // //Slice: for these rare cases I may propose to use Clover GUI "Use OS version if not set" // or write specific patterns into config.plist->KernelPatches with MatchOS // Now I want to make this procedure faster and secure #if 1 //need testing VOID EFIAPI KernelBooterExtensionsPatch(IN UINT8 *Kernel, LOADER_ENTRY *Entry) { UINTN Num = 0; UINTN NumSnow_i386 = 0; UINTN NumLion_i386 = 0; UINT64 os_version = AsciiOSVersionToUint64(Entry->OSVersion); DBG_RT(Entry, "\nPatching kernel for injected kexts...\n"); if (os_version >= AsciiOSVersionToUint64("10.6.0") && os_version <= AsciiOSVersionToUint64("10.7.5") && !is64BitKernel) { NumSnow_i386 = SearchAndCount(Kernel, KERNEL_MAX_SIZE, KBESnowSearchEXT_i386, sizeof(KBESnowSearchEXT_i386)); NumLion_i386 = SearchAndCount(Kernel, KERNEL_MAX_SIZE, KBELionSearchEXT_i386, sizeof(KBELionSearchEXT_i386)); if (NumSnow_i386 + NumLion_i386 > 1) { // more then one pattern found - we do not know what to do with it // and we'll skipp it AsciiPrint("\nERROR patching kernel for injected kexts:\nmultiple patterns found (Snowi386: %d, Lioni386: %d) - skipping patching!\n", NumSnow_i386, NumLion_i386); gBS->Stall(10000000); return; } if (NumSnow_i386 == 1) { Num = SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBESnowSearchEXT_i386, sizeof(KBESnowSearchEXT_i386), KBESnowReplaceEXT_i386, 1); DBG_RT(Entry, "==> kernel Snow Leopard i386: %d replaces done.\n", Num); } else if (NumLion_i386 == 1) { Num = SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBELionSearchEXT_i386, sizeof(KBELionSearchEXT_i386), KBELionReplaceEXT_i386, 1); DBG_RT(Entry, "==> kernel Lion i386: %d replaces done.\n", Num); } } else if ((os_version >= AsciiOSVersionToUint64("10.6")) && (os_version < AsciiOSVersionToUint64("10.7"))) { Num = SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBESnowSearchEXT_X64, sizeof(KBESnowSearchEXT_X64), KBESnowReplaceEXT_X64, 1); DBG_RT(Entry, "==> kernel Snow Leopard X64: %d replaces done.\n", Num); } else if ((os_version >= AsciiOSVersionToUint64("10.7")) && (os_version < AsciiOSVersionToUint64("10.8"))) { Num = SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBELionSearchEXT_X64, sizeof(KBELionSearchEXT_X64), KBELionReplaceEXT_X64, 1); DBG_RT(Entry, "==> kernel Lion X64: %d replaces done.\n", Num); } else if ((os_version >= AsciiOSVersionToUint64("10.8")) && (os_version < AsciiOSVersionToUint64("10.10"))) { Num = SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBEMLMavSearchEXT, sizeof(KBEMLMavSearchEXT), KBEMLMavReplaceEXT, 1); DBG_RT(Entry, "==> kernel Mountain Lion/Mavericks: %d replaces done.\n", Num); } else if ((os_version >= AsciiOSVersionToUint64("10.10")) && (os_version < AsciiOSVersionToUint64("10.11"))) { Num = SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBEYosSearchEXT, sizeof(KBEYosSearchEXT), KBEYosReplaceEXT, 1); DBG_RT(Entry, "==> kernel Yosemite: %d replaces done.\n", Num); } else if ((os_version >= AsciiOSVersionToUint64("10.11")) && (os_version < AsciiOSVersionToUint64("10.12"))) { Num = SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBEYosSearchEXT, sizeof(KBEYosSearchEXT), KBEYosReplaceEXT, 1) + SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBEECSearchSIP, sizeof(KBEECSearchSIP), KBEECReplaceSIP, 1); DBG_RT(Entry, "==> kernel El Capitan: %d replaces done.\n", Num); } else if ((os_version >= AsciiOSVersionToUint64("10.12")) && (os_version < AsciiOSVersionToUint64("10.13"))) { Num = SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBEYosSearchEXT, sizeof(KBEYosSearchEXT), KBEYosReplaceEXT, 1) + // Sierra 10.12.0 DP1 SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBESieSearchEXT, sizeof(KBESieSearchEXT), KBESieReplaceEXT, 1) + // Sierra 10.12.0 DP2+ SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBESie4SearchEXT, sizeof(KBESie4SearchEXT), KBESie4ReplaceEXT, 1) + // Sierra 10.12.4 DP1+ SearchAndReplace(Kernel, KERNEL_MAX_SIZE, KBESieSearchSIP, sizeof(KBESieSearchSIP), KBESieReplaceSIP, 1); DBG_RT(Entry, "==> kernel Sierra: %d replaces done.\n", Num); } if (Entry->KernelAndKextPatches->KPDebug) { DBG_RT(Entry, "Pausing 5 secs ...\n"); gBS->Stall(5000000); } } And here's the fixed one. Link to comment Share on other sites More sharing options...
Recommended Posts