summaryrefslogtreecommitdiff
path: root/PE/reinsert.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'PE/reinsert.cpp')
-rw-r--r--PE/reinsert.cpp47
1 files changed, 18 insertions, 29 deletions
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);