Index: branches/meklort/i386/libsaio/saio_types.h =================================================================== --- branches/meklort/i386/libsaio/saio_types.h (revision 605) +++ branches/meklort/i386/libsaio/saio_types.h (revision 606) @@ -56,6 +56,7 @@ struct Tag { long type; char *string; + long offset; struct Tag *tag; struct Tag *tagNext; }; Index: branches/meklort/i386/boot2/boot.c =================================================================== --- branches/meklort/i386/boot2/boot.c (revision 605) +++ branches/meklort/i386/boot2/boot.c (revision 606) @@ -74,6 +74,7 @@ bool gScanSingleDrive; #endif + int bvCount = 0; //int menucount = 0; int gDeviceCount = 0; Index: branches/meklort/i386/boot2/modules.c =================================================================== --- branches/meklort/i386/boot2/modules.c (revision 605) +++ branches/meklort/i386/boot2/modules.c (revision 606) @@ -846,6 +846,7 @@ else if(strcmp(symbolName, SYMBOL_DYLD_STUB_BINDER) != 0) { printf("Unable to bind symbol %s\n", symbolName); + getc(); } segmentAddress += sizeof(void*); @@ -876,6 +877,7 @@ else if(strcmp(symbolName, SYMBOL_DYLD_STUB_BINDER) != 0) { printf("Unable to bind symbol %s\n", symbolName); + getc(); } segmentAddress += tmp + sizeof(void*); @@ -894,6 +896,7 @@ else if(strcmp(symbolName, SYMBOL_DYLD_STUB_BINDER) != 0) { printf("Unable to bind symbol %s\n", symbolName); + getc(); } segmentAddress += (immediate * sizeof(void*)) + sizeof(void*); @@ -940,6 +943,7 @@ else if(strcmp(symbolName, SYMBOL_DYLD_STUB_BINDER) != 0) { printf("Unable to bind symbol %s\n", symbolName); + getc(); } @@ -1121,7 +1125,7 @@ if(strcmp(name, SYMBOL_DYLD_STUB_BINDER) != 0) { verbose("Unable to locate symbol %s\n", name); - //getc(); + getc(); } #endif return 0xFFFFFFFF; Index: branches/meklort/i386/boot2/boot.h =================================================================== --- branches/meklort/i386/boot2/boot.h (revision 605) +++ branches/meklort/i386/boot2/boot.h (revision 606) @@ -156,12 +156,8 @@ extern void initialize_runtime(); extern void common_boot(int biosdev); +extern char* updateBooter; /* - * usb.c - */ -extern int usb_loop(); - -/* * graphics.c */ extern void printVBEModeInfo(); Index: branches/meklort/i386/boot2/drivers.c =================================================================== --- branches/meklort/i386/boot2/drivers.c (revision 605) +++ branches/meklort/i386/boot2/drivers.c (revision 606) @@ -47,7 +47,7 @@ long (*LoadExtraDrivers_p)(FileLoadDrivers_t FileLoadDrivers_p); #endif -static unsigned long Alder32( unsigned char * buffer, long length ); +unsigned long Mkext_Alder32( unsigned char * buffer, long length ); long FileLoadDrivers(char *dirSpec, long plugin); #ifndef OPTION_ROM @@ -73,8 +73,8 @@ char * gTempSpec; char * gFileName; -static unsigned long -Alder32( unsigned char * buffer, long length ) +unsigned long +Mkext_Alder32( unsigned char * buffer, long length ) { long cnt; unsigned long result, lowHalf, highHalf; @@ -376,7 +376,7 @@ if (length < sizeof (DriversPackage)) return -1; // call hook to notify modules that the mkext has been loaded - execute_hook("LoadDriverMKext", (void*)fileSpec, (void*)package, (void*) length, NULL); + execute_hook("LoadDriverMKext", (void*)fileSpec, (void*)package, (void*) &length, NULL); // Verify the MKext. @@ -384,12 +384,11 @@ ( GetPackageElement(signature2) != kDriverPackageSignature2) || ( GetPackageElement(length) > kLoadSize ) || ( GetPackageElement(alder32) != - Alder32((unsigned char *)&package->version, GetPackageElement(length) - 0x10) ) ) + Mkext_Alder32((unsigned char *)&package->version, GetPackageElement(length) - 0x10) ) ) { return -1; } - // Make space for the MKext. driversLength = GetPackageElement(length); driversAddr = AllocateKernelMemory(driversLength); @@ -785,7 +784,7 @@ return -1; } if (OSSwapBigToHostInt32(kernel_header->adler32) != - Alder32(binary, uncompressed_size)) { + Mkext_Alder32(binary, uncompressed_size)) { printf("adler mismatch\n"); return -1; } Index: branches/meklort/i386/modules/KextPatcher/hex_editor.h =================================================================== --- branches/meklort/i386/modules/KextPatcher/hex_editor.h (revision 605) +++ branches/meklort/i386/modules/KextPatcher/hex_editor.h (revision 606) @@ -12,6 +12,6 @@ int replace_patern(char* pattern, char* repalcement, char* buffer, long buffer_size); int replace_word(uint32_t pattern, uint32_t repalcement, char* buffer, long buffer_size); +void replace_string(char* find, char* replace, char* string); - #endif /* H_HEX_EDITOR */ \ No newline at end of file Index: branches/meklort/i386/modules/KextPatcher/kext_patcher.c =================================================================== --- branches/meklort/i386/modules/KextPatcher/kext_patcher.c (revision 605) +++ branches/meklort/i386/modules/KextPatcher/kext_patcher.c (revision 606) @@ -17,8 +17,18 @@ #include "modules.h" #include "hex_editor.h" -bool patch_kext(TagPtr plist, void* start); +#ifndef DEBUG_KEXT_PATCHER +#define DEBUG_KEXT_PATCHER 0 +#endif + +#if DEBUG_KEXT_PATCHER +#define DBG(x...) printf(x) +#else +#define DBG(x...) +#endif +bool patch_kext(TagPtr plist, char* plistbuffer, void* start); + static void * z_alloc(void *, u_int items, u_int size); static void z_free(void *, void *ptr); @@ -106,7 +116,7 @@ void mkext_loaded(void* filespec, void* packagetmp, void* lengthtmp, void* arg3) { int version = 0; - int length = (int) lengthtmp; + //int length = *((int*)lengthtmp); mkext_basic_header* package = packagetmp; // Verify the MKext. @@ -141,7 +151,7 @@ int i; for(i = 0; i < MKEXT_GET_COUNT(package); i++) { - printf("Parsing kext %d\n", i); + DBG("Parsing kext %d\n", i); //mkext_kext* kext = MKEXT1_GET_KEXT(package, i); // uses decompress_lzss // TODO: handle kext @@ -150,7 +160,7 @@ } else if((version & 0xFFFF0000) == 0x02000000) // mkext2 { - printf("Mkext2 package located at 0x%X\n", package); + DBG("Mkext2 package located at 0x%X\n", package); // mkext2 uses zlib mkext2_header* package = packagetmp; @@ -184,57 +194,95 @@ zlib_result = inflate(&zstream, Z_FINISH); - printf("Inflated result is %d, in: %d bytes, out: %d bytes\n", zlib_result, zstream.total_in, zstream.total_out); + if (zstream_inited) inflateEnd(&zstream); + + DBG("Inflated result is %d, in: %d bytes, out: %d bytes\n", zlib_result, zstream.total_in, zstream.total_out); if (zlib_result == Z_STREAM_END || zlib_result == Z_OK) - { - //printf("Plist contains %s\n", plist); - + { config_file_t plistData; config_file_t allDicts; bzero(&plistData, sizeof(plistData)); bzero(&allDicts, sizeof(allDicts)); - //plist += strlen("_MKEXTInfoDictionaries"); // Skip kMKEXTInfoDictionariesKey. Causes issues - // NOTE: there will be an extra at the end - /*int len =*/ XMLParseFile( plist, &plistData.dictionary ); + XMLParseFile( plist, &plistData.dictionary ); int count = 0; - count = XMLTagCount(plistData.dictionary); - if(count != 1) - { - error("Mkext has more than one entry, unable to patch."); - getc(); - return; - } allDicts.dictionary = XMLGetProperty(plistData.dictionary, kMKEXTInfoDictionariesKey); count = XMLTagCount(allDicts.dictionary); - /*printf("Element type: %d\n", allDicts.dictionary->type); - printf("Element tag: %d\n", allDicts.dictionary->tag); - printf("Element tagNext: %d\n", allDicts.dictionary->tagNext); - */ - printf("Plist contains %d kexts\n", count); + + DBG("Plist contains %d kexts\n", count); bool patched = false; for(; count--; count > 0) { TagPtr kextEntry = XMLGetElement(allDicts.dictionary, count); - patched |= patch_kext(kextEntry, package); + patched |= patch_kext(kextEntry, plist, package); } + if(patched) { + zstream_inited = false; + // Recompress the plist + bzero(&zstream, sizeof(zstream)); + zstream.next_in = (UInt8*)plist; + zstream.next_out = (UInt8*)package + plist_offset; + zstream.avail_in = MKEXT2_GET_PLIST_FULLSIZE(package); + zstream.avail_out = MKEXT2_GET_PLIST_FULLSIZE(package)<<2; // Give us some extra free space, just in case + zstream.zalloc = Z_NULL; + zstream.zfree = Z_NULL; + zstream.opaque = Z_NULL; + + + zlib_result = deflateInit2(&zstream, Z_DEFAULT_COMPRESSION, Z_DEFLATED,15, 8 /* memLevel */, Z_DEFAULT_STRATEGY); + if (Z_OK != zlib_result) { + printf("ZLIB Deflate Error: %s\n", zstream.msg); + getc(); + } + else + { + zstream_inited = true; + } + + zlib_result = deflate(&zstream, Z_FINISH); + + if (zlib_result == Z_STREAM_END) + { + DBG("Deflated result is %d, in: %d bytes, out: %d bytes, full: %d\n", zlib_result, zstream.total_in, zstream.total_out, MKEXT2_GET_PLIST_FULLSIZE(package)); + } + else if (zlib_result == Z_OK) + { + /* deflate filled output buffer, meaning the data doesn't compress. + */ + DBG("Deflated result is %d, in: %d bytes, out: %d bytes, full: %d\n", zlib_result, zstream.total_in, zstream.total_out, MKEXT2_GET_PLIST_FULLSIZE(package)); + + } + else if (zlib_result != Z_STREAM_ERROR) + { + printf("ZLIB Deflate Error: %s\n", zstream.msg); + getc(); + } + + if(zstream.total_out != MKEXT2_GET_PLIST_COMPSIZE(package)) + { + // Update the mkext length + MKEXT2_HDR_CAST(package)->length = MKEXT_SWAP(MKEXT_GET_LENGTH(package) - MKEXT2_GET_PLIST_COMPSIZE(package) + zstream.total_out); + MKEXT2_HDR_CAST(package)->plist_compressed_size = MKEXT_SWAP(zstream.total_out); + *((int*)lengthtmp) -= MKEXT2_GET_PLIST_COMPSIZE(package); + *((int*)lengthtmp) += zstream.total_out; + } + + if (zstream_inited) deflateEnd(&zstream); + + + // re alder32 the new mkext2 package MKEXT_HDR_CAST(package)->adler32 = MKEXT_SWAP(Mkext_Alder32((unsigned char *)&package->version, MKEXT_GET_LENGTH(package) - 0x10)); - } - - printf("kexts parsed\n"); - - } else { @@ -256,17 +304,16 @@ } */ - if (zstream_inited) inflateEnd(&zstream); } - printf("Loading %s, length %d, version 0x%x\n", filespec, length, version); - getc(); + DBG("Loading %s, length %d, version 0x%x\n", filespec, length, version); + //getc(); } -// TODO: only handles mkext2 entries -bool patch_kext(TagPtr plist, void* start) +// FIXME: only handles mkext2 entries +bool patch_kext(TagPtr plist, char* plistbuffer, void* start) { int exeutable_offset; mkext2_file_entry* kext; @@ -276,11 +323,14 @@ z_stream zstream; bool zstream_inited = false; int zlib_result; + TagPtr personality; if(XMLGetProperty(plist, kMKEXTExecutableKey) == NULL) return false; // Kext is a plist only kext, don't patch bundleID = XMLCastString(XMLGetProperty(plist, kPropCFBundleIdentifier)); exeutable_offset = XMLCastInteger(XMLGetProperty(plist, kMKEXTExecutableKey)); + + kext = (void*)((char*)start + exeutable_offset); full_size = MKEXT2_GET_ENTRY_FULLSIZE(kext); @@ -290,9 +340,26 @@ if( (strcmp(bundleID, "com.apple.driver.AppleIntelGMA950") == 0) || (strcmp(bundleID, "com.apple.driver.AppleIntelIntegratedFramebuffer") == 0)) { - printf("Located kext %s\n", bundleID); - printf("offset is 0x%x\n", exeutable_offset); + + personality = XMLCastDict(XMLGetProperty(plist, kPropIOKitPersonalities)); + if(XMLGetProperty(personality, (const char*)"Intel915")) + { + personality = XMLGetProperty(personality, (const char*)"Intel915"); + } + else + { + personality = XMLGetProperty(personality, (const char*)"AppleIntelIntegratedFramebuffer"); + } +#if DEBUG_KEXT_PATCHER + char* pcimatch = XMLCastString(XMLGetProperty(personality, (const char*)"IOPCIPrimaryMatch")); +#endif + long offset = XMLCastStringOffset(XMLGetProperty(personality, (const char*)"IOPCIPrimaryMatch")); + + replace_string("0x27A28086", "0x27AE8086", plistbuffer + offset); + + DBG("Located kext %s\n", bundleID); + DBG("PCI Match offset = %d, string = %s\n", offset, pcimatch); char* executable = malloc(full_size); bzero(&zstream, sizeof(zstream)); @@ -319,15 +386,16 @@ zlib_result = inflate(&zstream, Z_FINISH); - printf("Inflated result is %d, in: %d bytes, out: %d bytes, full: %d\n", zlib_result, zstream.total_in, zstream.total_out, full_size); + DBG("Inflated result is %d, in: %d bytes, out: %d bytes, full: %d\n", zlib_result, zstream.total_in, zstream.total_out, full_size); - printf("Replaced 0x27A28086 %d times.\n", - replace_word(0x27A28086, 0x27AE8086, executable, zstream.total_out)); + replace_word(0x27A28086, 0x27AE8086, executable, zstream.total_out); if (zstream_inited) inflateEnd(&zstream); zstream.next_in = (UInt8*)executable; + // zstream.next_out = (UInt8*)((int)compressed_data<<1); zstream.next_out = (UInt8*)compressed_data; + zstream.avail_in = full_size; zstream.avail_out = compressed_size; zstream.zalloc = Z_NULL; @@ -351,13 +419,13 @@ if (zlib_result == Z_STREAM_END) { - printf("Deflated result is %d, in: %d bytes, out: %d bytes, full: %d\n", zlib_result, zstream.total_in, zstream.total_out, full_size); + DBG("Deflated result is %d, in: %d bytes, out: %d bytes, full: %d\n", zlib_result, zstream.total_in, zstream.total_out, full_size); } else if (zlib_result == Z_OK) { /* deflate filled output buffer, meaning the data doesn't compress. */ - printf("Deflated result is %d, in: %d bytes, out: %d bytes, full: %d\n", zlib_result, zstream.total_in, zstream.total_out, full_size); + DBG("Deflated result is %d, in: %d bytes, out: %d bytes, full: %d\n", zlib_result, zstream.total_in, zstream.total_out, full_size); } else if (zlib_result != Z_STREAM_ERROR) @@ -366,9 +434,6 @@ getc(); } - /* TODO: Only accept the compression if it actually shrinks the file. - */ - if (zstream_inited) deflateEnd(&zstream); @@ -379,7 +444,7 @@ //printf("\n"); - getc(); + //getc(); return true; } Index: branches/meklort/i386/modules/KextPatcher/hex_editor.c =================================================================== --- branches/meklort/i386/modules/KextPatcher/hex_editor.c (revision 605) +++ branches/meklort/i386/modules/KextPatcher/hex_editor.c (revision 606) @@ -74,3 +74,18 @@ return num_replaced; } + +void replace_string(char* find, char* replace, char* string) +{ + if(!find || + !replace || + !string || + strlen(find) != strlen(replace)) return; + + char* str = string; + while(strncmp(str, find, strlen(find)-1)) + { + str++; + } + strncpy(str, replace, strlen(replace) - 1); // don't copy the null char +} Index: branches/meklort/i386/libsa/zalloc.c =================================================================== --- branches/meklort/i386/libsa/zalloc.c (revision 605) +++ branches/meklort/i386/libsa/zalloc.c (revision 606) @@ -250,7 +250,7 @@ return; } -static void +void zallocate(char * start,int size) { #if ZDEBUG