--- scrambleORIG.c 2006-07-22 23:50:32.000000000 +0200 +++ scramble.c 2006-07-22 23:52:30.000000000 +0200 @@ -493,6 +493,22 @@ "----------------"\ "----------------"\ "---------------"; + + typedef struct _ipod_direntry { + char dev[4]; /* '!ATA' */ + char type[4]; /* '' */ + unsigned id; /* */ + /*char pad1[4];*/ /* 0000 0000 */ + unsigned devOffset; /* byte offset of start of image code */ + unsigned len; /* length in bytes of image */ + unsigned addr; /* load address */ + unsigned entryOffset; /* execution start within image */ + unsigned chksum; /* checksum for image */ + unsigned vers; /* image version */ + unsigned loadAddr; /* load address for image */ + } ipod_direntry_t; + + size_t len; int length; int rsrclength; @@ -503,6 +519,19 @@ unsigned char *outbuf; int bufsize; int i; + + FILE *rsrc_file; + int rsrc_len=0; + rsrc_file = fopen("apple_sw_5g_rcsc.bin", "rb"); + if (rsrc_file) { + fprintf(stderr, "Including real rsrc for native firmware support in a file for iPod video\n"); + fseek(rsrc_file,0,SEEK_END); + rsrc_len = ftell(rsrc_file)+0x200;/*is this enough for malloc? + (if not then we get a segment error at line 605 (fread)*/ + fseek(rsrc_file,0,SEEK_SET); + }else if(fake_rsrc){ + fprintf(stderr, "Including fake rsrc, supports booting rockbox & ipodlinux, but not for native firmware support for iPod video\n"); + } file = fopen(iname, "rb"); if (!file) { @@ -511,11 +540,10 @@ } fseek(file,0,SEEK_END); length = ftell(file); - fseek(file,0,SEEK_SET); - bufsize=(length+0x4600); - if (fake_rsrc) { + bufsize=(length+0x4600+rsrc_len); + if (fake_rsrc&&rsrc_len==0) { bufsize = (bufsize + 0x400) & ~0x200; } @@ -533,7 +561,7 @@ } fclose(file); - /* Calculate checksum for later use in header */ + /* Calculate checksum for later use in header */ for(i = 0x4600; i < 0x4600+length;i++) sum += outbuf[i]; @@ -562,19 +590,48 @@ /* "rsrc" entry (if applicable) */ if (fake_rsrc) { - rsrcoffset=(length+0x4600+0x200) & ~0x200; - rsrclength=0x200; - rsrcsum=0; - - memcpy(&outbuf[0x4228],"!ATAcrsr",8); /* dev and type */ - int2le(0, &outbuf[0x4230]); /* id */ - int2le(rsrcoffset, &outbuf[0x4234]); /* devOffset */ - int2le(rsrclength, &outbuf[0x4238]); /* Length of firmware */ - int2le(0x10000000, &outbuf[0x423c]); /* Addr */ - int2le(0, &outbuf[0x4240]); /* Entry Offset */ - int2le(rsrcsum, &outbuf[0x4244]); /* Checksum */ - int2le(0x0000b000, &outbuf[0x4248]); /* vers */ - int2le(0xffffffff, &outbuf[0x424c]); /* LoadAddr - for flash images */ + /*rsrcoffset=(length+0x4600+0x200) & ~0x200;*/ + rsrcoffset = 0x4400 + length; + rsrcoffset = ((rsrcoffset + 0x1ff) & ~0x1ff) + 0x200; + ipod_direntry_t *rsrc_entry =malloc(sizeof(ipod_direntry_t)); + memset(rsrc_entry,0,sizeof(ipod_direntry_t)); + if(rsrc_len>0){ /*real rsrc*/ + fseek(rsrc_file,0,SEEK_SET); + if (fread(rsrc_entry, 1,sizeof(ipod_direntry_t),rsrc_file)devOffset=rsrcoffset; + fseek(rsrc_file,512,SEEK_SET); + if (fread(outbuf+rsrcoffset+0x200, 1,rsrc_entry->len,rsrc_file)len){/*dangerous*/ + printf("Rsrc read errror\n"); + return -2; + } + rsrclength=rsrc_entry->len; + for(i = rsrcoffset+0x200; i < rsrcoffset+0x200+rsrc_entry->len;i++) + rsrcsum += outbuf[i]; + if(rsrcsum!=rsrc_entry->chksum){ + printf("rsrc checksum errror, corrupt file: apple_sw_5g_rcsc.bin\n"); + return -2; + } + /*fclose(rsrc_file);*/ + rsrclength+=0x400;/*padding*/ + }else{/*fake rsrc*/ + rsrclength=0x200; + rsrcsum=0; + memcpy(rsrc_entry->dev,"!ATA",4); /* dev and type */ + memcpy(rsrc_entry->type,"crsr",4); /* dev and type */ + rsrc_entry->devOffset=rsrcoffset; + rsrc_entry->len=rsrclength; + rsrc_entry->addr=0x10000000; + rsrc_entry->chksum=rsrcsum; + rsrc_entry->vers=0x0000b000; + rsrc_entry->loadAddr=0xffffffff; + rsrclength=0; + } + memcpy(&outbuf[0x4228],rsrc_entry,sizeof(ipod_direntry_t)); + free(rsrc_entry); + rsrclength=rsrcoffset+rsrclength; } file = fopen(oname, "wb"); @@ -582,8 +639,7 @@ perror(oname); return -3; } - - len = fwrite(outbuf, 1, length+0x4600, file); + len = fwrite(outbuf, 1, rsrclength==0?length+0x4600:rsrclength, file); if(len < length) { perror(oname); return -4;