diff options
author | pixel <pixel> | 2003-09-25 19:53:41 +0000 |
---|---|---|
committer | pixel <pixel> | 2003-09-25 19:53:41 +0000 |
commit | 96507ec5c6715bfcbd38adefbeaaa511844f094f (patch) | |
tree | 07386a657b3e0a13ff079f1d111aa2f9994f3700 /PE | |
parent | 82cd864169e0f3915927d8dcf46045a95d0a0365 (diff) |
Bugfix
Diffstat (limited to 'PE')
-rw-r--r-- | PE/groupe-12.txt | 2 | ||||
-rw-r--r-- | PE/reinsert.cpp | 47 |
2 files changed, 20 insertions, 29 deletions
diff --git a/PE/groupe-12.txt b/PE/groupe-12.txt index 79b487b..12d8f3e 100644 --- a/PE/groupe-12.txt +++ b/PE/groupe-12.txt @@ -1,3 +1,5 @@ 191 +221 +233 239 256 diff --git a/PE/reinsert.cpp b/PE/reinsert.cpp index 61372aa..581c16f 100644 --- a/PE/reinsert.cpp +++ b/PE/reinsert.cpp @@ -43,7 +43,7 @@ virtual int startup() throw (GeneralException) { int patch_img(cdutils * cd) { struct cdutils::DirEntry d_slus, d_pe1; unsigned char * slus; - int i, j, c, fontei; + int i, c, fontei; String s; int groupes[100][20]; int counts[20]; @@ -95,7 +95,7 @@ int patch_img(cdutils * cd) { f->read(script, f->GetSize()); printm(M_INFO, "Groupe %i...\n", i); for (c = 0; c < counts[i]; c++) { - int sector, s1, s2, s3, r, size, size2, ptr, tptr, sig, jptr, sizes[2]; + int sector, s1, s2, s3, r, size, size2, sizes[2], tptr, uptr, aptr, asiz, maxsize; r = groupes[c][i] - 1; unsigned char * room; @@ -111,37 +111,26 @@ int patch_img(cdutils * cd) { room = (unsigned char *) malloc(size); cd->read_datas(room, GUESS, d_pe1.Sector + sector + s1 + s2, size); - -#if 0 - ptr = size - 4; - while (1) { - tptr = *((int *) (room + ptr)); - if ((tptr >> 24) == 1) { - tptr &= 0xffffff; - sig = *((int *) (room + tptr)); - if ((sig & 0xffff) == 0xfe) { - break; - } - } - ptr -= 4; - } - - jptr = *((int *) (room + ptr - 8)); -#else - jptr = *((int *) (room + ((*((int *) (room + size2 + 32))) & 0xfffff) + 4)); -#endif - printm(M_INFO, " Room %i\n", r + 1); - if (size2 < (jptr + f->GetSize())) { - printm(M_ERROR, "size2 = %i, jptr = %i, f = %i, + = %i - script trop gros.\n", size2, jptr, f->GetSize(), jptr + f->GetSize()); - exit(-1); + tptr = *((int *) (room + size2 + 32)) & 0xfffff; + uptr = *((int *) (room + tptr + 4)); + aptr = *((int *) (room + tptr + 12)) & 0xfffff; + asiz = *((int *) (room + tptr + 8)); + maxsize = aptr - uptr + (asiz | 3); +// printm(M_INFO, "size2 = 0x%08x\ntptr = 0x%08x\nuptr = 0x%08x\naptr = 0x%08x\nasiz = 0x%08x\nmaxsize = 0x%08x\nsize = 0x%08x\n", size2, tptr, uptr, aptr, asiz, maxsize, f->GetSize()); + if (f->GetSize() > maxsize) { + printm(M_WARNING, "Script trop grand (%i octets et %i libres)\n", f->GetSize(), maxsize); + free(room); + continue; } - memcpy(room + jptr, script, f->GetSize()); - - *((int *) (room + ptr)) = jptr | 0x01000000; - *((int *) (room + ptr - 4)) = f->GetSize(); + uptr = (uptr + maxsize - f->GetSize()) & (~3); + + memcpy(room + uptr, script, f->GetSize()); + + *((int *) (room + tptr + 12)) = uptr | 0x01000000; + *((int *) (room + tptr + 8)) = f->GetSize(); cd->write_datas(room, GUESS, d_pe1.Sector + sector + s1 + s2, size); |