All pastes #96398 Raw Edit

scramble.c patch

public text v1 · immutable
#96398 ·published 2006-07-22 21:57 UTC
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;