dos/exe: clear the dirty stack.
This commit is contained in:
+15
-7
@@ -53,11 +53,11 @@ PackExe::PackExe(InputFile *f) :
|
|||||||
bele = &N_BELE_RTP::le_policy;
|
bele = &N_BELE_RTP::le_policy;
|
||||||
COMPILE_TIME_ASSERT(sizeof(exe_header_t) == 32);
|
COMPILE_TIME_ASSERT(sizeof(exe_header_t) == 32);
|
||||||
ih_exesize = ih_imagesize = ih_overlay = 0;
|
ih_exesize = ih_imagesize = ih_overlay = 0;
|
||||||
|
stack_for_lzma = 0;
|
||||||
|
|
||||||
// disable lzma for "--brute" unless explicitly given "--lzma"
|
// disable lzma for "--brute" unless explicitly given "--lzma"
|
||||||
if (opt->all_methods_use_lzma && !opt->method_lzma_seen)
|
if (opt->all_methods_use_lzma && !opt->method_lzma_seen)
|
||||||
opt->all_methods_use_lzma = false;
|
opt->all_methods_use_lzma = false;
|
||||||
stack_for_lzma = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -161,8 +161,22 @@ void PackExe::buildLoader(const Filter *)
|
|||||||
|
|
||||||
addLoaderEpilogue(flag);
|
addLoaderEpilogue(flag);
|
||||||
defineDecompressorSymbols();
|
defineDecompressorSymbols();
|
||||||
|
const unsigned lsize0 = getLoaderSize();
|
||||||
|
|
||||||
|
// Lzma decompression code starts at ss:0x10, and its size is
|
||||||
|
// lsize bytes. It also needs getDecompressorWrkmemSize() bytes
|
||||||
|
// during uncompression. It also uses some stack, so 0x100
|
||||||
|
// more bytes are allocated
|
||||||
|
stack_for_lzma = 0x10 + lsize0 + getDecompressorWrkmemSize() + 0x100;
|
||||||
|
stack_for_lzma = ALIGN_UP(stack_for_lzma, 16u);
|
||||||
|
|
||||||
|
unsigned clear_dirty_stack_low = 0x10 + lsize0;
|
||||||
|
clear_dirty_stack_low = ALIGN_UP(clear_dirty_stack_low, 2u);
|
||||||
|
linker->defineSymbol("clear_dirty_stack_low", clear_dirty_stack_low);
|
||||||
|
|
||||||
relocateLoader();
|
relocateLoader();
|
||||||
const unsigned lsize = getLoaderSize();
|
const unsigned lsize = getLoaderSize();
|
||||||
|
assert(lsize0 == lsize);
|
||||||
MemBuffer loader(lsize);
|
MemBuffer loader(lsize);
|
||||||
memcpy(loader, getLoader(), lsize);
|
memcpy(loader, getLoader(), lsize);
|
||||||
|
|
||||||
@@ -184,12 +198,6 @@ void PackExe::buildLoader(const Filter *)
|
|||||||
addLoader("LZMAENTRY,NRV2B160,NRVDDONE,NRVDECO1,NRVGTD00,NRVDECO2",
|
addLoader("LZMAENTRY,NRV2B160,NRVDDONE,NRVDECO1,NRVGTD00,NRVDECO2",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
// Lzma decompression code starts at ss:0x10, and its size is
|
|
||||||
// lsize bytes. It also needs getDecompressorWrkmemSize() bytes
|
|
||||||
// during uncompression. It also uses some stack, so 0x100
|
|
||||||
// more bytes are allocated
|
|
||||||
stack_for_lzma = getDecompressorWrkmemSize() + lsize + 0x100;
|
|
||||||
stack_for_lzma = stack_for_lzma & ~0xf;
|
|
||||||
}
|
}
|
||||||
else if (device_driver)
|
else if (device_driver)
|
||||||
addLoader("DEVICEENTRY,DEVICEENTRY2", NULL);
|
addLoader("DEVICEENTRY,DEVICEENTRY2", NULL);
|
||||||
|
|||||||
+1248
-1240
File diff suppressed because it is too large
Load Diff
@@ -244,7 +244,7 @@ section LZMA_DEC00
|
|||||||
xor ax, ax
|
xor ax, ax
|
||||||
1: push ax
|
1: push ax
|
||||||
cmp sp, bx
|
cmp sp, bx
|
||||||
jnz 1b
|
jnzs 1b
|
||||||
#else
|
#else
|
||||||
mov sp, bx
|
mov sp, bx
|
||||||
#endif
|
#endif
|
||||||
@@ -269,7 +269,7 @@ section LZMA_DEC00
|
|||||||
push ds // in [bp + 8]
|
push ds // in [bp + 8]
|
||||||
push si // [bp + 6]
|
push si // [bp + 6]
|
||||||
|
|
||||||
// enter small model
|
// enter small memory model
|
||||||
push ss
|
push ss
|
||||||
pop ds
|
pop ds
|
||||||
|
|
||||||
@@ -299,14 +299,14 @@ section LZMA_DEC20
|
|||||||
|
|
||||||
// cleanup
|
// cleanup
|
||||||
section LZMA_DEC30
|
section LZMA_DEC30
|
||||||
#if 0
|
#if 1
|
||||||
// clear dirty stack
|
// clear dirty stack
|
||||||
lea bx, [bp + lzma_stack_adjust - 256]
|
|
||||||
mov sp, bp
|
mov sp, bp
|
||||||
|
mov bx, offset clear_dirty_stack_low
|
||||||
xor ax, ax
|
xor ax, ax
|
||||||
1: push ax
|
1: push ax
|
||||||
cmp sp, bx
|
cmp sp, bx
|
||||||
jnz 1b
|
jnzs 1b
|
||||||
#endif
|
#endif
|
||||||
mov sp, bp
|
mov sp, bp
|
||||||
pop ds
|
pop ds
|
||||||
|
|||||||
@@ -74,23 +74,23 @@ Idx Name Size VMA LMA File off Algn Flags
|
|||||||
69 ignore_reloc_overflow 00000008 00000000 00000000 00000375 2**0 CONTENTS, RELOC, READONLY
|
69 ignore_reloc_overflow 00000008 00000000 00000000 00000375 2**0 CONTENTS, RELOC, READONLY
|
||||||
70 LZMA_DEC10 000011a4 00000000 00000000 0000037d 2**0 CONTENTS, READONLY
|
70 LZMA_DEC10 000011a4 00000000 00000000 0000037d 2**0 CONTENTS, READONLY
|
||||||
71 LZMA_DEC20 000011a4 00000000 00000000 00001521 2**0 CONTENTS, READONLY
|
71 LZMA_DEC20 000011a4 00000000 00000000 00001521 2**0 CONTENTS, READONLY
|
||||||
72 LZMA_DEC30 00000006 00000000 00000000 000026c5 2**0 CONTENTS, RELOC, READONLY
|
72 LZMA_DEC30 00000012 00000000 00000000 000026c5 2**0 CONTENTS, RELOC, READONLY
|
||||||
73 LZMA_DEC31 00000007 00000000 00000000 000026cb 2**0 CONTENTS, RELOC, READONLY
|
73 LZMA_DEC31 00000007 00000000 00000000 000026d7 2**0 CONTENTS, RELOC, READONLY
|
||||||
74 EXEMAIN5 00000001 00000000 00000000 000026d2 2**0 CONTENTS, READONLY
|
74 EXEMAIN5 00000001 00000000 00000000 000026de 2**0 CONTENTS, READONLY
|
||||||
75 EXEADJUS 00000007 00000000 00000000 000026d3 2**0 CONTENTS, READONLY
|
75 EXEADJUS 00000007 00000000 00000000 000026df 2**0 CONTENTS, READONLY
|
||||||
76 EXENOADJ 00000002 00000000 00000000 000026da 2**0 CONTENTS, READONLY
|
76 EXENOADJ 00000002 00000000 00000000 000026e6 2**0 CONTENTS, READONLY
|
||||||
77 EXERELO1 0000001e 00000000 00000000 000026dc 2**0 CONTENTS, RELOC, READONLY
|
77 EXERELO1 0000001e 00000000 00000000 000026e8 2**0 CONTENTS, RELOC, READONLY
|
||||||
78 EXEREL9A 00000012 00000000 00000000 000026fa 2**0 CONTENTS, RELOC, READONLY
|
78 EXEREL9A 00000012 00000000 00000000 00002706 2**0 CONTENTS, RELOC, READONLY
|
||||||
79 EXERELO2 00000004 00000000 00000000 0000270c 2**0 CONTENTS, READONLY
|
79 EXERELO2 00000004 00000000 00000000 00002718 2**0 CONTENTS, READONLY
|
||||||
80 EXEREBIG 00000002 00000000 00000000 00002710 2**0 CONTENTS, RELOC, READONLY
|
80 EXEREBIG 00000002 00000000 00000000 0000271c 2**0 CONTENTS, RELOC, READONLY
|
||||||
81 EXERELO3 00000002 00000000 00000000 00002712 2**0 CONTENTS, RELOC, READONLY
|
81 EXERELO3 00000002 00000000 00000000 0000271e 2**0 CONTENTS, RELOC, READONLY
|
||||||
82 EXEMAIN8 00000003 00000000 00000000 00002714 2**0 CONTENTS, READONLY
|
82 EXEMAIN8 00000003 00000000 00000000 00002720 2**0 CONTENTS, READONLY
|
||||||
83 DEVICEEND 00000013 00000000 00000000 00002717 2**0 CONTENTS, READONLY
|
83 DEVICEEND 00000013 00000000 00000000 00002723 2**0 CONTENTS, READONLY
|
||||||
84 EXESTACK 00000006 00000000 00000000 0000272a 2**0 CONTENTS, RELOC, READONLY
|
84 EXESTACK 00000006 00000000 00000000 00002736 2**0 CONTENTS, RELOC, READONLY
|
||||||
85 EXESTASP 00000003 00000000 00000000 00002730 2**0 CONTENTS, RELOC, READONLY
|
85 EXESTASP 00000003 00000000 00000000 0000273c 2**0 CONTENTS, RELOC, READONLY
|
||||||
86 EXEJUMPF 00000005 00000000 00000000 00002733 2**0 CONTENTS, RELOC, READONLY
|
86 EXEJUMPF 00000005 00000000 00000000 0000273f 2**0 CONTENTS, RELOC, READONLY
|
||||||
87 EXERCSPO 00000004 00000000 00000000 00002738 2**0 CONTENTS, RELOC, READONLY
|
87 EXERCSPO 00000004 00000000 00000000 00002744 2**0 CONTENTS, RELOC, READONLY
|
||||||
88 EXERETIP 00000006 00000000 00000000 0000273c 2**0 CONTENTS, RELOC, READONLY
|
88 EXERETIP 00000006 00000000 00000000 00002748 2**0 CONTENTS, RELOC, READONLY
|
||||||
SYMBOL TABLE:
|
SYMBOL TABLE:
|
||||||
00000000 l d DEVICEENTRY 00000000 DEVICEENTRY
|
00000000 l d DEVICEENTRY 00000000 DEVICEENTRY
|
||||||
00000000 l d COMPRESSED_LZMA_START 00000000 COMPRESSED_LZMA_START
|
00000000 l d COMPRESSED_LZMA_START 00000000 COMPRESSED_LZMA_START
|
||||||
@@ -200,6 +200,7 @@ SYMBOL TABLE:
|
|||||||
00000000 *UND* 00000000 lzma_c_len
|
00000000 *UND* 00000000 lzma_c_len
|
||||||
00000000 *UND* 00000000 lzma_properties_hi
|
00000000 *UND* 00000000 lzma_properties_hi
|
||||||
00000000 *UND* 00000000 lzma_properties
|
00000000 *UND* 00000000 lzma_properties
|
||||||
|
00000000 *UND* 00000000 clear_dirty_stack_low
|
||||||
00000000 *UND* 00000000 lzma_u_len_segment
|
00000000 *UND* 00000000 lzma_u_len_segment
|
||||||
00000000 *UND* 00000000 reloc_size
|
00000000 *UND* 00000000 reloc_size
|
||||||
00000000 *UND* 00000000 original_ss
|
00000000 *UND* 00000000 original_ss
|
||||||
@@ -389,7 +390,8 @@ OFFSET TYPE VALUE
|
|||||||
|
|
||||||
RELOCATION RECORDS FOR [LZMA_DEC30]:
|
RELOCATION RECORDS FOR [LZMA_DEC30]:
|
||||||
OFFSET TYPE VALUE
|
OFFSET TYPE VALUE
|
||||||
00000004 R_386_16 lzma_u_len
|
00000003 R_386_16 clear_dirty_stack_low
|
||||||
|
00000010 R_386_16 lzma_u_len
|
||||||
|
|
||||||
RELOCATION RECORDS FOR [LZMA_DEC31]:
|
RELOCATION RECORDS FOR [LZMA_DEC31]:
|
||||||
OFFSET TYPE VALUE
|
OFFSET TYPE VALUE
|
||||||
|
|||||||
Reference in New Issue
Block a user