rendered paste body--- 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)<sizeof(ipod_direntry_t)){
+ printf("Rsrc header read errror\n");
+ return -2;
+ }
+ rsrc_entry->devOffset=rsrcoffset;
+ fseek(rsrc_file,512,SEEK_SET);
+ if (fread(outbuf+rsrcoffset+0x200, 1,rsrc_entry->len,rsrc_file)<rsrc_entry->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;