From d5c0533b74ce4cff4942fc47bd458ca99247dac5 Mon Sep 17 00:00:00 2001 From: "Markus F.X.J. Oberhumer" Date: Fri, 17 Mar 2006 13:53:10 +0000 Subject: [PATCH] Allow the PE sections to cross a page boundary. committer: mfx 1142603590 +0000 --- src/p_w32pe.cpp | 13 +++++++------ src/stub/l_w32pe.asm | 2 +- src/stub/l_w32pe.h | 8 ++++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/p_w32pe.cpp b/src/p_w32pe.cpp index 6236fbf1..10a828e7 100644 --- a/src/p_w32pe.cpp +++ b/src/p_w32pe.cpp @@ -1930,18 +1930,19 @@ void PackW32Pe::pack(OutputFile *fo) if (swri >= 0x1000) throwCantPack("swri >= 0x1000! Send a bug report please!"); patch_le32(loader, codesize, "SWRI", swri); + patch_le32(loader, codesize, "IMGL", 0x1000); // one page patch_le32(loader, codesize, "IMGB", 0u - rvamin); #else - // make sure we only touch exactly one page + // make sure we only touch the minimum number of pages const unsigned addr = 0u - rvamin + swri; patch_le32(loader, codesize, "SWRI", addr & 0xfff); // page offset - patch_le32(loader, codesize, "IMGB", addr &~ 0xfff); // page mask - // check whether osection[0].flags and osection[1].flags // are on the same page - if ((swri & ~0xfff) != ((swri + sizeof(pe_section_t)) & ~0xfff)) - throwCantPack("DEPHAK: page crossing problem! " - "Send a bug report please!"); + if ((addr & 0xfff) + 0x28 >= 0x1000) + patch_le32(loader, codesize, "IMGL", 0x2000); // two pages + else + patch_le32(loader, codesize, "IMGL", 0x1000); // one page + patch_le32(loader, codesize, "IMGB", addr &~ 0xfff); // page mask #endif patch_le32(loader, codesize, "VPRO", myimport + get_le32(oimpdlls + 16) + 8); } diff --git a/src/stub/l_w32pe.asm b/src/stub/l_w32pe.asm index 5f95e685..f0fef338 100644 --- a/src/stub/l_w32pe.asm +++ b/src/stub/l_w32pe.asm @@ -203,7 +203,7 @@ relhi0: %ifdef __PEDEPHAK__ mov ebp, [esi + 'VPRO'] ; VirtualProtect lea edi, [esi + 'IMGB'] - mov ebx, 0x1000 + mov ebx, 'IMGL' ; 0x1000 or 0x2000 push eax ; provide 4 bytes stack diff --git a/src/stub/l_w32pe.h b/src/stub/l_w32pe.h index b12c2b41..d4b7b7a2 100644 --- a/src/stub/l_w32pe.h +++ b/src/stub/l_w32pe.h @@ -28,8 +28,8 @@ #define NRV_LOADER_SIZE 4365 -#define NRV_LOADER_ADLER32 0x1dcf1745 -#define NRV_LOADER_CRC32 0xc6ba51c8 +#define NRV_LOADER_ADLER32 0xf651185e +#define NRV_LOADER_CRC32 0x6461513e unsigned char nrv_loader[4365] = { 128,124, 36, 8, 1, 15,133, 0, 0, 0, 0, 96,190, 69, 83, 73, /* 0x 0 */ @@ -102,8 +102,8 @@ unsigned char nrv_loader[4365] = { 224, 16,102,139, 7,131,199, 2, 9,192,117, 0,139, 7,131,199, /* 0x 430 */ 4,235, 0,135,254,141,143, 68, 69, 76, 84,169,102, 1, 12, 7, /* 0x 440 */ 173, 9,192,117,247,193,233, 16,169,102, 1, 12, 7,173, 9,192, /* 0x 450 */ -117,247,139,174, 86, 80, 82, 79,141,190, 73, 77, 71, 66,187, 0, /* 0x 460 */ - 16, 0, 0, 80, 84,106, 4, 83, 87,255,213,141,135, 83, 87, 82, /* 0x 470 */ +117,247,139,174, 86, 80, 82, 79,141,190, 73, 77, 71, 66,187, 73, /* 0x 460 */ + 77, 71, 76, 80, 84,106, 4, 83, 87,255,213,141,135, 83, 87, 82, /* 0x 470 */ 73,128, 32,127,128, 96, 40,127, 88, 80, 84, 80, 83, 87,255,213, /* 0x 480 */ 88, 97,141, 68, 36,128,106, 0, 57,196,117,250,131,236,128,141, /* 0x 490 */ 68, 36,128,106, 0, 57,196,117,250,131,236,128, 49,192, 64,194, /* 0x 4a0 */