summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2005-07-09 12:01:18 +0000
committerJens Arnold <amiconn@rockbox.org>2005-07-09 12:01:18 +0000
commite51fc6d8da1175701f5958081a05deaa457d23e0 (patch)
tree200eaf49f332190cfd05ca89f6d4b5318ff0ce8a
parenta75f0e579f2ef9d1817d363dd76640ea4bb2764f (diff)
downloadrockbox-e51fc6d8da1175701f5958081a05deaa457d23e0.tar.gz
rockbox-e51fc6d8da1175701f5958081a05deaa457d23e0.zip
Adapted fwpatcher to patch both H110/H115 and H120/H140 firmwares. Unpatched firmwares are detected by md5sum, and the patched firmware's md5sum is compared to the matching entry, so it should be even more safe than before.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7086 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--tools/fwpatcher/Makefile12
-rw-r--r--tools/fwpatcher/checksums.h6
-rw-r--r--tools/fwpatcher/h100sums.h9
-rw-r--r--tools/fwpatcher/h120sums.h15
-rw-r--r--tools/fwpatcher/main.c111
-rw-r--r--tools/fwpatcher/resource.h3
-rw-r--r--tools/fwpatcher/resource.rc3
7 files changed, 121 insertions, 38 deletions
diff --git a/tools/fwpatcher/Makefile b/tools/fwpatcher/Makefile
index f5255975f3..7dd56f037b 100644
--- a/tools/fwpatcher/Makefile
+++ b/tools/fwpatcher/Makefile
@@ -7,8 +7,12 @@
7# $Id$ 7# $Id$
8# 8#
9 9
10#value for crosscompiling on linux
10PREFIX=i586-mingw32msvc- 11PREFIX=i586-mingw32msvc-
11 12
13#value for compiling on cygwin
14#PREFIX=
15
12TARGET = fwpatchernu.exe 16TARGET = fwpatchernu.exe
13TARGETU = fwpatcher.exe 17TARGETU = fwpatcher.exe
14 18
@@ -16,9 +20,15 @@ WINDRES = $(PREFIX)windres
16CC = $(PREFIX)gcc 20CC = $(PREFIX)gcc
17 21
18UNICODE = -DUNICODE -D_UNICODE 22UNICODE = -DUNICODE -D_UNICODE
23
24#values for crosscompiling on linux
19CFLAGS = -I. -Os -s -fomit-frame-pointer 25CFLAGS = -I. -Os -s -fomit-frame-pointer
20LDFLAGS = -lmingw32 -mwindows -s 26LDFLAGS = -lmingw32 -mwindows -s
21 27
28#values for compiling on cygwin
29#CFLAGS = -I. -Os -s -fomit-frame-pointer -mno-cygwin -DNOCYGWIN
30#LDFLAGS = -lmingw32 -mwindows -s -mno-cygwin
31
22OBJS= resource.o iriver.o main.o md5.o 32OBJS= resource.o iriver.o main.o md5.o
23OBJSU= resource.o iriveru.o mainu.o md5.o 33OBJSU= resource.o iriveru.o mainu.o md5.o
24 34
@@ -30,7 +40,7 @@ $(TARGET): $(OBJS)
30$(TARGETU): $(OBJSU) 40$(TARGETU): $(OBJSU)
31 $(CC) $(LDFLAGS) $(OBJSU) -o $@ 41 $(CC) $(LDFLAGS) $(OBJSU) -o $@
32 42
33resource.o: resource.rc bootloader.bin rockbox.ico 43resource.o: resource.rc bootloader-h100.bin bootloader-h120.bin rockbox.ico
34 $(WINDRES) -v $< $@ 44 $(WINDRES) -v $< $@
35 45
36iriveru.o: iriver.c iriver.h 46iriveru.o: iriver.c iriver.h
diff --git a/tools/fwpatcher/checksums.h b/tools/fwpatcher/checksums.h
deleted file mode 100644
index 22f0a7f912..0000000000
--- a/tools/fwpatcher/checksums.h
+++ /dev/null
@@ -1,6 +0,0 @@
1"4935d52ad3b720b6a156465201245eab", /* 1.63eu */
2"e87c75ea6788d417d9be7b3700cf0557", /* 1.63k */
3"d302d3b90bb26f55f01332fd47968647", /* 1.63us */
4"ffdf317356cc0a964a2708d6b90f59cb", /* 1.65eu */
5"30a33bbfcc37dd4980e36974a5122f02", /* 1.65k */
6"35b19d2acafe795c30c42d0208af1af8", /* 1.65us */
diff --git a/tools/fwpatcher/h100sums.h b/tools/fwpatcher/h100sums.h
new file mode 100644
index 0000000000..1605fafc4f
--- /dev/null
+++ b/tools/fwpatcher/h100sums.h
@@ -0,0 +1,9 @@
1/* Checksums of firmwares for ihp_100 */
2/* order: unpatched, patched */
3
4/* 1.65-EU */
5{"478dc657b97e77d1b4944ef26c3dcb8e", "b20d9674c449ef6d929ad5fe2ce3132b"},
6/* 1.65-K */
7{"97ba82fb8099bb23ca0c78fc119f8cce", "5851315169e535b7ae69174d888ceec5"},
8/* 1.65-US */
9{"d3725865e0948cd5f604b00db2ec89aa", "4ff207b3034aac0d1e1dfbf93b046624"},
diff --git a/tools/fwpatcher/h120sums.h b/tools/fwpatcher/h120sums.h
new file mode 100644
index 0000000000..70d42d71c3
--- /dev/null
+++ b/tools/fwpatcher/h120sums.h
@@ -0,0 +1,15 @@
1/* Checksums of firmwares for ihp_120 */
2/* order: unpatched, patched */
3
4/* ihp_120-1.63-EU.hex */
5{"14488347a171480c63c94bc7b885225d", "c4c514656277d7bf81c9951cf56bcdbc"},
6/* ihp_120-1.63-K.hex */
7{"3401fe8845e569156abfaddf05ca7771", "3db4a3dbb30e1464ecf0415f27366215"},
8/* ihp_120-1.63-US.hex */
9{"d9078209105c186cee5246055fdb99c9", "c8531d1b614a1ca514631fc94e2ced21"},
10/* ihp_120-1.65-EU.hex */
11{"c9e71aac4a498f1e2f0e684c2d554ea1", "e41a9c06b7233d62bee044a8942e6b57"},
12/* ihp_120-1.65-K.hex */
13{"360c0c565266f84e9bca610c596f3207", "928120696964d3f71bf81fbfbf4819c4"},
14/* ihp_120-1.65-US.hex */
15{"b9e516d4b8a0265605f46f254897bfb0", "b341f2360a981f7ce21b24c312152cbf"},
diff --git a/tools/fwpatcher/main.c b/tools/fwpatcher/main.c
index 0d0cc1956f..c16696a01c 100644
--- a/tools/fwpatcher/main.c
+++ b/tools/fwpatcher/main.c
@@ -39,9 +39,19 @@
39 39
40#define CTL_NUM 4 40#define CTL_NUM 4
41 41
42/* include precalculated checksums */ 42struct sumpairs {
43static char *checksums[] = { 43 char *unpatched;
44#include "checksums.h" 44 char *patched;
45};
46
47/* precalculated checksums for H110/H115 */
48static struct sumpairs h100pairs[] = {
49#include "h100sums.h"
50};
51
52/* precalculated checksums for H120/H140 */
53static struct sumpairs h120pairs[] = {
54#include "h120sums.h"
45}; 55};
46 56
47HICON rbicon; 57HICON rbicon;
@@ -156,6 +166,17 @@ int mkboot(TCHAR *infile, TCHAR *outfile, unsigned char *bldata, int bllen)
156 166
157/* end mkboot.c excerpt */ 167/* end mkboot.c excerpt */
158 168
169int intable(char *md5, struct sumpairs *table, int len)
170{
171 int i;
172 for (i = 0; i < len; i++) {
173 if (strncmp(md5, table[i].unpatched, 32) == 0) {
174 return i;
175 }
176 }
177 return -1;
178}
179
159int FileMD5(TCHAR *name, char *md5) 180int FileMD5(TCHAR *name, char *md5)
160{ 181{
161 int i, read; 182 int i, read;
@@ -182,7 +203,7 @@ int FileMD5(TCHAR *name, char *md5)
182 return 1; 203 return 1;
183} 204}
184 205
185int PatchFirmware() 206int PatchFirmware(int series, int table_entry)
186{ 207{
187 TCHAR fn[MAX_PATH]; 208 TCHAR fn[MAX_PATH];
188 TCHAR name1[MAX_PATH], name2[MAX_PATH], name3[MAX_PATH]; 209 TCHAR name1[MAX_PATH], name2[MAX_PATH], name3[MAX_PATH];
@@ -192,9 +213,19 @@ int PatchFirmware()
192 unsigned char md5sum_str[256]; 213 unsigned char md5sum_str[256];
193 DWORD blsize; 214 DWORD blsize;
194 int i; 215 int i;
195 216 struct sumpairs *sums;
196 /* get pointer to bootloader.bin */ 217
197 res = FindResource(NULL, MAKEINTRESOURCE(IDI_BOOTLOADER), TEXT("BIN")); 218 /* get pointer to the correct bootloader.bin */
219 switch(series) {
220 case 100:
221 res = FindResource(NULL, MAKEINTRESOURCE(IDI_BOOTLOADERH100), TEXT("BIN"));
222 sums = &h100pairs[0];
223 break;
224 case 120:
225 res = FindResource(NULL, MAKEINTRESOURCE(IDI_BOOTLOADERH120), TEXT("BIN"));
226 sums = &h120pairs[0];
227 break;
228 }
198 resload = LoadResource(NULL, res); 229 resload = LoadResource(NULL, res);
199 bootloader = (unsigned char *)LockResource(resload); 230 bootloader = (unsigned char *)LockResource(resload);
200 blsize = SizeofResource(NULL, res); 231 blsize = SizeofResource(NULL, res);
@@ -229,26 +260,24 @@ int PatchFirmware()
229 TEXT("Error"), MB_ICONERROR); 260 TEXT("Error"), MB_ICONERROR);
230 goto error; 261 goto error;
231 } 262 }
232 for (i = 0; i < sizeof(checksums)/sizeof(char *); ++i) { 263 if (strncmp(sums[table_entry].patched, md5sum_str, 32) == 0) {
233 if (strncmp(checksums[i], md5sum_str, 32) == 0) { 264 /* delete temp files */
234 /* delete temp files */ 265 DeleteFile(name1);
235 DeleteFile(name1); 266 DeleteFile(name2);
236 DeleteFile(name2); 267 /* all is fine, rename the patched file to original name of the firmware */
237 /* all is fine, rename the patched file to original name of the firmware */ 268 if (DeleteFile(fn) && MoveFile(name3, fn)) {
238 if (DeleteFile(fn) && MoveFile(name3, fn)) { 269 return 1;
239 return 1; 270 }
240 } 271 else {
241 else { 272 DeleteFile(name3); /* Deleting a perfectly good firmware here really */
242 DeleteFile(name3); /* Deleting a perfectly good firmware here really */ 273 MessageBox(NULL,
243 MessageBox(NULL, 274 TEXT("Couldn't modify existing file.\n")
244 TEXT("Couldn't modify existing file.\n") 275 TEXT("Check if file is write protected, then try again."),
245 TEXT("Check if file is write protected, then try again."), 276 TEXT("Error"), MB_ICONERROR);
246 TEXT("Error"), MB_ICONERROR); 277 return 0;
247 return 0;
248 }
249 } 278 }
250 } 279 }
251 MessageBox(NULL, 280 MessageBox(NULL,
252 TEXT("Checksum doesn't match known good patched firmware.\n") 281 TEXT("Checksum doesn't match known good patched firmware.\n")
253 TEXT("Download another firmware image, then try again."), 282 TEXT("Download another firmware image, then try again."),
254 TEXT("Error"), MB_ICONERROR); 283 TEXT("Error"), MB_ICONERROR);
@@ -286,8 +315,10 @@ int FileDialog(TCHAR *fn)
286 315
287LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 316LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
288{ 317{
289 int i; 318 int i, series, table_entry;
319 unsigned char md5sum_str[256];
290 switch (msg) { 320 switch (msg) {
321 TCHAR fn[MAX_PATH];
291 case WM_CREATE: 322 case WM_CREATE:
292 /* text label */ 323 /* text label */
293 controls[LABEL_FILENAME] = 324 controls[LABEL_FILENAME] =
@@ -332,9 +363,31 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
332 } 363 }
333 /* user pressed patch button */ 364 /* user pressed patch button */
334 if (((HWND)lParam == controls[BUTTON_PATCH])) { 365 if (((HWND)lParam == controls[BUTTON_PATCH])) {
335 if (PatchFirmware()) 366 GetWindowText(controls[EDIT_FILENAME], fn, MAX_PATH);
336 MessageBox(NULL, TEXT("Firmware patched successfully"), 367 if (!FileMD5(fn, md5sum_str)) {
337 TEXT("Success"), MB_OK); 368 MessageBox(NULL, TEXT("Couldn't open firmware"), TEXT("Fail"), MB_OK);
369 }
370 else {
371 /* Check firmware against md5sums in h120sums and h100sums */
372 series = 0;
373 table_entry = intable(md5sum_str, &h120pairs[0],
374 sizeof(h120pairs)/sizeof(struct sumpairs));
375 if (table_entry >= 0) {
376 series = 120;
377 }
378 else {
379 table_entry = intable(md5sum_str, &h100pairs[0],
380 sizeof(h100pairs)/sizeof(struct sumpairs));
381 if (table_entry >= 0)
382 series = 100;
383 }
384 if (series == 0) {
385 MessageBox(NULL, TEXT("Unrecognised firmware"), TEXT("Fail"), MB_OK);
386 }
387 else if (PatchFirmware(series, table_entry))
388 MessageBox(NULL, TEXT("Firmware patched successfully"),
389 TEXT("Success"), MB_OK);
390 }
338 } 391 }
339 break; 392 break;
340 case WM_USER: 393 case WM_USER:
diff --git a/tools/fwpatcher/resource.h b/tools/fwpatcher/resource.h
index 9847eee88c..c255bff0b4 100644
--- a/tools/fwpatcher/resource.h
+++ b/tools/fwpatcher/resource.h
@@ -1,3 +1,4 @@
1#define IDI_RBICON 101 1#define IDI_RBICON 101
2#define IDI_BOOTLOADER 102 2#define IDI_BOOTLOADERH100 102
3#define IDI_BOOTLOADERH120 103
3 4
diff --git a/tools/fwpatcher/resource.rc b/tools/fwpatcher/resource.rc
index f1196df3cd..a1dcb4835f 100644
--- a/tools/fwpatcher/resource.rc
+++ b/tools/fwpatcher/resource.rc
@@ -1,4 +1,5 @@
1#include "resource.h" 1#include "resource.h"
2 2
3IDI_RBICON ICON "rockbox.ico" 3IDI_RBICON ICON "rockbox.ico"
4IDI_BOOTLOADER BIN "bootloader.bin" 4IDI_BOOTLOADERH100 BIN "bootloader-h100.bin"
5IDI_BOOTLOADERH120 BIN "bootloader-h120.bin"