Jump to content

Clover Problems and Solutions


ErmaC
3,206 posts in this topic

Recommended Posts

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);
}
  • Like 1
Link to comment
Share on other sites

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.  :thumbsup_anim:

And @Slice may consider committing this?

Link to comment
Share on other sites

Bad idea :P . 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

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.

  • Like 1
Link to comment
Share on other sites

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

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.

  • Like 1
Link to comment
Share on other sites

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;
        }
    }
}
  • Like 1
Link to comment
Share on other sites

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.

//

:)

  • Like 2
Link to comment
Share on other sites

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

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

  • Like 1
Link to comment
Share on other sites

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

 

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

 

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

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   :D

Link to comment
Share on other sites

Someone have to create a code for that, test its functionality and make a request to the mantainer (Slice)  :D

:D 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

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

..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.

  • Like 3
Link to comment
Share on other sites

@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

post-980913-0-78420800-1485601107_thumb.png

 

 

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.

  • Like 1
Link to comment
Share on other sites

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

×
×
  • Create New...