summaryrefslogtreecommitdiff
path: root/rbutil/rbutilqt/irivertools/irivertools.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rbutil/rbutilqt/irivertools/irivertools.cpp')
-rw-r--r--rbutil/rbutilqt/irivertools/irivertools.cpp101
1 files changed, 48 insertions, 53 deletions
diff --git a/rbutil/rbutilqt/irivertools/irivertools.cpp b/rbutil/rbutilqt/irivertools/irivertools.cpp
index af06e86e06..2bcd9ffb80 100644
--- a/rbutil/rbutilqt/irivertools/irivertools.cpp
+++ b/rbutil/rbutilqt/irivertools/irivertools.cpp
@@ -18,9 +18,9 @@
18 * 18 *
19 ****************************************************************************/ 19 ****************************************************************************/
20 20
21#include <QtCore>
21#include "irivertools.h" 22#include "irivertools.h"
22 23
23
24const unsigned char munge[] = { 24const unsigned char munge[] = {
25 0x7a, 0x36, 0xc4, 0x43, 0x49, 0x6b, 0x35, 0x4e, 0xa3, 0x46, 0x25, 0x84, 25 0x7a, 0x36, 0xc4, 0x43, 0x49, 0x6b, 0x35, 0x4e, 0xa3, 0x46, 0x25, 0x84,
26 0x4d, 0x73, 0x74, 0x61 26 0x4d, 0x73, 0x74, 0x61
@@ -47,7 +47,7 @@ const unsigned char header[][16] = {
47/* begin mkboot.c excerpt */ 47/* begin mkboot.c excerpt */
48unsigned char image[0x400000 + 0x220 + 0x400000/0x200]; 48unsigned char image[0x400000 + 0x220 + 0x400000/0x200];
49 49
50bool mkboot(QString infile, QString outfile,QString bootloader,int origin,ProgressloggerInterface* dp) 50int mkboot(QString infile, QString outfile, QString bootloader, int origin)
51{ 51{
52 int i; 52 int i;
53 int len,bllen; 53 int len,bllen;
@@ -59,13 +59,13 @@ bool mkboot(QString infile, QString outfile,QString bootloader,int origin,Progre
59 QFile f(infile); 59 QFile f(infile);
60 if(!f.open(QIODevice::ReadOnly)) 60 if(!f.open(QIODevice::ReadOnly))
61 { 61 {
62 dp->addItem("Could not open: %1" + infile,LOGERROR); 62 // can't open input file
63 return false; 63 return -1;
64 } 64 }
65 i = f.read((char*)image,16); 65 i = f.read((char*)image,16);
66 if(i < 16) { 66 if(i < 16) {
67 dp->addItem("reading header failed",LOGERROR); 67 // reading header failed
68 return false; 68 return -2;
69 } 69 }
70 70
71 /* This is the length of the binary image without the scrambling 71 /* This is the length of the binary image without the scrambling
@@ -77,8 +77,8 @@ bool mkboot(QString infile, QString outfile,QString bootloader,int origin,Progre
77 len = binary_length+0x200-16; 77 len = binary_length+0x200-16;
78 i = f.read((char*)image+16, len); 78 i = f.read((char*)image+16, len);
79 if(i < len) { 79 if(i < len) {
80 dp->addItem("reading firmware failed",LOGERROR); 80 // reading firmware failed
81 return false; 81 return -3;
82 } 82 }
83 83
84 f.close(); 84 f.close();
@@ -86,24 +86,24 @@ bool mkboot(QString infile, QString outfile,QString bootloader,int origin,Progre
86 f.setFileName(bootloader); 86 f.setFileName(bootloader);
87 if(!f.open(QIODevice::ReadOnly)) 87 if(!f.open(QIODevice::ReadOnly))
88 { 88 {
89 dp->addItem("Could not open: %1" + bootloader,LOGERROR); 89 // can't open bootloader file
90 return false; 90 return -4;
91 } 91 }
92 92
93 bllen = f.size(); 93 bllen = f.size();
94 94
95 i = f.read((char*)image+0x220 + origin, bllen); 95 i = f.read((char*)image+0x220 + origin, bllen);
96 if(i < bllen) { 96 if(i < bllen) {
97 dp->addItem("reading bootloader failed",LOGERROR); 97 // reading bootloader file failed
98 return false; 98 return -5;
99 } 99 }
100 100
101 f.close(); 101 f.close();
102 f.setFileName(outfile); 102 f.setFileName(outfile);
103 if(!f.open(QIODevice::WriteOnly)) 103 if(!f.open(QIODevice::WriteOnly))
104 { 104 {
105 dp->addItem("Could not open: %1" + outfile,LOGERROR); 105 // can't open output file
106 return false; 106 return -6;
107 } 107 }
108 108
109 /* Patch the reset vector to start the boot loader */ 109 /* Patch the reset vector to start the boot loader */
@@ -154,13 +154,13 @@ bool mkboot(QString infile, QString outfile,QString bootloader,int origin,Progre
154 154
155 i = f.write((char*)image,total_length); 155 i = f.write((char*)image,total_length);
156 if(i < total_length) { 156 if(i < total_length) {
157 dp->addItem("writing bootloader failed",LOGERROR); 157 // writing bootloader file failed
158 return false; 158 return -7;
159 } 159 }
160 160
161 f.close(); 161 f.close();
162 162
163 return true; 163 return 0;
164} 164}
165 165
166/* end mkboot.c excerpt */ 166/* end mkboot.c excerpt */
@@ -208,7 +208,7 @@ static void modifyheader( unsigned char * data )
208}; 208};
209 209
210int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify, 210int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify,
211 enum striptype stripmode,ProgressloggerInterface* dp ) 211 enum striptype stripmode)
212{ 212{
213 QFile infile(infile_name); 213 QFile infile(infile_name);
214 QFile outfile(outfile_name); 214 QFile outfile(outfile_name);
@@ -226,32 +226,30 @@ int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify
226 226
227 if(!infile.open(QIODevice::ReadOnly)) 227 if(!infile.open(QIODevice::ReadOnly))
228 { 228 {
229 dp->addItem("Could not open: %1" + infile_name,LOGERROR); 229 // can't open input file
230 return -1; 230 return -1;
231 } 231 }
232 if(!outfile.open(QIODevice::WriteOnly)) 232 if(!outfile.open(QIODevice::WriteOnly))
233 { 233 {
234 dp->addItem("Could not open: %1" + outfile_name,LOGERROR); 234 // can't open output file
235 return -1; 235 return -2;
236 } 236 }
237 lenread = infile.read( (char*)headerdata, 512); 237 lenread = infile.read( (char*)headerdata, 512);
238 if( lenread != 512 ) 238 if( lenread != 512 )
239 { 239 {
240 dp->addItem("This doesn't look like a valid encrypted iHP" 240 // header length doesn't match
241 "firmware - reason: header length.",LOGERROR);
242 infile.close(); 241 infile.close();
243 outfile.close(); 242 outfile.close();
244 return -1; 243 return -3;
245 }; 244 };
246 245
247 i = testheader( headerdata ); 246 i = testheader( headerdata );
248 if( i == -1 ) 247 if( i == -1 )
249 { 248 {
250 dp->addItem("This firmware is for an unknown model, or is not" 249 // header unknown
251 " a valid encrypted iHP firmware.",LOGERROR);
252 infile.close(); 250 infile.close();
253 outfile.close(); 251 outfile.close();
254 return -1; 252 return -4;
255 }; 253 };
256 fprintf( stderr, "Model %s\n", models[ i ] ); 254 fprintf( stderr, "Model %s\n", models[ i ] );
257 255
@@ -270,11 +268,10 @@ int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify
270 dwLength2>>9 != dwLength3 || 268 dwLength2>>9 != dwLength3 ||
271 dwLength2+dwLength3+512 != dwLength1 ) 269 dwLength2+dwLength3+512 != dwLength1 )
272 { 270 {
273 dp->addItem("This doesn't look like a valid encrypted " 271 // file 'length' data is wrong
274 "iHP firmware - reason: file 'length' data.",LOGERROR);
275 infile.close(); 272 infile.close();
276 outfile.close(); 273 outfile.close();
277 return -1; 274 return -5;
278 }; 275 };
279 276
280 pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) ); 277 pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) );
@@ -332,11 +329,10 @@ int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify
332 329
333 if( fp != dwLength2 ) 330 if( fp != dwLength2 )
334 { 331 {
335 dp->addItem("This doesn't look like a valid encrypted " 332 // 'length2' field mismatch
336 "iHP firmware - reason: 'length2' mismatch.",LOGERROR);
337 infile.close(); 333 infile.close();
338 outfile.close(); 334 outfile.close();
339 return -1; 335 return -6;
340 }; 336 };
341 337
342 fp = 0; 338 fp = 0;
@@ -349,22 +345,20 @@ int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify
349 outfile.write((char*) blockdata, lenread ); 345 outfile.write((char*) blockdata, lenread );
350 if( memcmp( ppChecksums, blockdata, lenread ) != 0 ) 346 if( memcmp( ppChecksums, blockdata, lenread ) != 0 )
351 { 347 {
352 dp->addItem("This doesn't look like a valid encrypted " 348 // file checksum wrong
353 "iHP firmware - reason: Checksum mismatch!",LOGERROR);
354 infile.close(); 349 infile.close();
355 outfile.close(); 350 outfile.close();
356 return -1; 351 return -7;
357 }; 352 };
358 ppChecksums += lenread; 353 ppChecksums += lenread;
359 }; 354 };
360 355
361 if( fp != dwLength3 ) 356 if( fp != dwLength3 )
362 { 357 {
363 dp->addItem("This doesn't look like a valid encrypted " 358 // 'length3' field mismatch
364 "iHP firmware - reason: 'length3' mismatch.",LOGERROR);
365 infile.close(); 359 infile.close();
366 outfile.close(); 360 outfile.close();
367 return -1; 361 return -8;
368 }; 362 };
369 363
370 364
@@ -392,7 +386,7 @@ int iriver_decode(QString infile_name, QString outfile_name, unsigned int modify
392 386
393}; 387};
394 388
395int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify,ProgressloggerInterface* dp ) 389int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify)
396{ 390{
397 QFile infile(infile_name); 391 QFile infile(infile_name);
398 QFile outfile(outfile_name); 392 QFile outfile(outfile_name);
@@ -409,22 +403,23 @@ int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify
409 403
410 if(!infile.open(QIODevice::ReadOnly)) 404 if(!infile.open(QIODevice::ReadOnly))
411 { 405 {
412 dp->addItem("Could not open: %1" + infile_name,LOGERROR); 406 // can't open input file
413 return -1; 407 return -1;
414 } 408 }
415 if(!outfile.open(QIODevice::WriteOnly)) 409 if(!outfile.open(QIODevice::WriteOnly))
416 { 410 {
417 dp->addItem("Could not open: %1" + outfile_name,LOGERROR); 411 // can't open output file
418 return -1; 412 infile.close();
413 return -2;
419 } 414 }
420 415
421 lenread = infile.read((char*) headerdata, 512 ); 416 lenread = infile.read((char*) headerdata, 512 );
422 if( lenread != 512 ) 417 if( lenread != 512 )
423 { 418 {
424 dp->addItem("This doesn't look like a valid decoded " 419 // header length error
425 "iHP firmware - reason: header length.",LOGERROR);
426 infile.close(); 420 infile.close();
427 outfile.close(); 421 outfile.close();
422 return -3;
428 }; 423 };
429 424
430 if( modify ) 425 if( modify )
@@ -435,10 +430,10 @@ int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify
435 i = testheader( headerdata ); 430 i = testheader( headerdata );
436 if( i == -1 ) 431 if( i == -1 )
437 { 432 {
438 dp->addItem("This firmware is for an unknown model, or is not" 433 // header verification error
439 " a valid decoded iHP firmware.",LOGERROR);
440 infile.close(); 434 infile.close();
441 outfile.close(); 435 outfile.close();
436 return -4;
442 }; 437 };
443 fprintf( stderr, "Model %s\n", models[ i ] ); 438 fprintf( stderr, "Model %s\n", models[ i ] );
444 439
@@ -456,10 +451,10 @@ int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify
456 dwLength3 > dwLength1 || 451 dwLength3 > dwLength1 ||
457 dwLength2+dwLength3+512 != dwLength1 ) 452 dwLength2+dwLength3+512 != dwLength1 )
458 { 453 {
459 dp->addItem("This doesn't look like a valid decoded " 454 // file 'length' error
460 "iHP firmware - reason:file 'length' data.",LOGERROR);
461 infile.close(); 455 infile.close();
462 outfile.close(); 456 outfile.close();
457 return -5;
463 }; 458 };
464 459
465 pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) ); 460 pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) );
@@ -494,10 +489,10 @@ int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify
494 489
495 if( fp != dwLength2 ) 490 if( fp != dwLength2 )
496 { 491 {
497 dp->addItem("This doesn't look like a valid decoded " 492 // file 'length1' mismatch
498 "iHP firmware - reason: 'length1' mismatch.",LOGERROR);
499 infile.close(); 493 infile.close();
500 outfile.close(); 494 outfile.close();
495 return -6;
501 }; 496 };
502 497
503 /* write out remainder w/out applying descrambler */ 498 /* write out remainder w/out applying descrambler */
@@ -514,10 +509,10 @@ int iriver_encode(QString infile_name, QString outfile_name, unsigned int modify
514 509
515 if( fp != dwLength3 ) 510 if( fp != dwLength3 )
516 { 511 {
517 dp->addItem("This doesn't look like a valid decoded " 512 // 'length2' field mismatch
518 "iHP firmware - 'length2' mismatch.",LOGERROR);
519 infile.close(); 513 infile.close();
520 outfile.close(); 514 outfile.close();
515 return -8;
521 }; 516 };
522 517
523 fprintf( stderr, "File encoded successfully and checksum table built!\n" ); 518 fprintf( stderr, "File encoded successfully and checksum table built!\n" );