LZMA for dos/exe integration work. Does not work yet.
This commit is contained in:
+14
-2
@@ -62,11 +62,13 @@ const int *PackExe::getCompressionMethods(int method, int level) const
|
|||||||
static const int m_nrv2b[] = { M_NRV2B_8, M_END };
|
static const int m_nrv2b[] = { M_NRV2B_8, M_END };
|
||||||
static const int m_nrv2d[] = { M_NRV2D_8, M_END };
|
static const int m_nrv2d[] = { M_NRV2D_8, M_END };
|
||||||
static const int m_nrv2e[] = { M_NRV2E_8, M_END };
|
static const int m_nrv2e[] = { M_NRV2E_8, M_END };
|
||||||
|
static const int m_lzma[] = { M_LZMA, M_END };
|
||||||
|
|
||||||
if (method == M_ALL) return m_all;
|
if (method == M_ALL) return m_all;
|
||||||
if (M_IS_NRV2B(method)) return m_nrv2b;
|
if (M_IS_NRV2B(method)) return m_nrv2b;
|
||||||
if (M_IS_NRV2D(method)) return m_nrv2d;
|
if (M_IS_NRV2D(method)) return m_nrv2d;
|
||||||
if (M_IS_NRV2E(method)) return m_nrv2e;
|
if (M_IS_NRV2E(method)) return m_nrv2e;
|
||||||
|
if (M_IS_LZMA(method)) return m_lzma;
|
||||||
bool small = ih_imagesize <= 256*1024;
|
bool small = ih_imagesize <= 256*1024;
|
||||||
if (level == 1 || small)
|
if (level == 1 || small)
|
||||||
return m_nrv2b;
|
return m_nrv2b;
|
||||||
@@ -94,7 +96,10 @@ int PackExe::fillExeHeader(struct exe_header_t *eh) const
|
|||||||
oh.ident = 'M' + 'Z' * 256;
|
oh.ident = 'M' + 'Z' * 256;
|
||||||
oh.headsize16 = 2;
|
oh.headsize16 = 2;
|
||||||
|
|
||||||
oh.sp = ih.sp > 0x200 ? (unsigned) ih.sp : 0x200;
|
unsigned minsp = M_IS_LZMA(ph.method) ? getDecompressorWrkmemSize() + 0x1100 : 0x200;
|
||||||
|
assert(minsp < 0xff00);
|
||||||
|
|
||||||
|
oh.sp = ih.sp > minsp ? (unsigned) ih.sp : minsp;
|
||||||
|
|
||||||
unsigned destpara = (ph.u_len + ph.overlap_overhead - ph.c_len + 31) / 16;
|
unsigned destpara = (ph.u_len + ph.overlap_overhead - ph.c_len + 31) / 16;
|
||||||
oh.ss = ph.c_len/16 + destpara;
|
oh.ss = ph.c_len/16 + destpara;
|
||||||
@@ -165,6 +170,8 @@ void PackExe::buildLoader(const Filter *)
|
|||||||
"NRV2EEX9",
|
"NRV2EEX9",
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
else if (ph.method == M_LZMA)
|
||||||
|
addLoader("LZMA_DEC00,LZMA_DEC10,LZMA_DEC99", NULL);
|
||||||
else
|
else
|
||||||
throwInternalError("unknown compression method");
|
throwInternalError("unknown compression method");
|
||||||
addLoader("EXEMAIN5", NULL);
|
addLoader("EXEMAIN5", NULL);
|
||||||
@@ -505,7 +512,11 @@ void PackExe::pack(OutputFile *fo)
|
|||||||
(ph.u_len <= DI_LIMIT || (ph.u_len & 0x7fff)
|
(ph.u_len <= DI_LIMIT || (ph.u_len & 0x7fff)
|
||||||
>= relocsize ? 0 : MAXRELOCS) - relocsize);
|
>= relocsize ? 0 : MAXRELOCS) - relocsize);
|
||||||
linker->defineSymbol("bx_magic", 0x7FFF + 0x10 * ((packedsize & 15) + 1));
|
linker->defineSymbol("bx_magic", 0x7FFF + 0x10 * ((packedsize & 15) + 1));
|
||||||
linker->defineSymbol("decompressor_entry", (packedsize & 15) + 1);
|
|
||||||
|
unsigned decompressor_entry = packedsize & 15;
|
||||||
|
if (M_IS_NRV2B(ph.method) || M_IS_NRV2D(ph.method) || M_IS_NRV2E(ph.method))
|
||||||
|
decompressor_entry++;
|
||||||
|
linker->defineSymbol("decompressor_entry", decompressor_entry);
|
||||||
|
|
||||||
// patch loader
|
// patch loader
|
||||||
if (flag & USEJUMP)
|
if (flag & USEJUMP)
|
||||||
@@ -543,6 +554,7 @@ void PackExe::pack(OutputFile *fo)
|
|||||||
|
|
||||||
oh.ip = device_driver ? getLoaderSection("EXEENTRY") - 2 : 0;
|
oh.ip = device_driver ? getLoaderSection("EXEENTRY") - 2 : 0;
|
||||||
|
|
||||||
|
defineDecompressorSymbols();
|
||||||
relocateLoader();
|
relocateLoader();
|
||||||
memcpy(loader, getLoader(), lsize);
|
memcpy(loader, getLoader(), lsize);
|
||||||
patchPackHeader(loader,e_len);
|
patchPackHeader(loader,e_len);
|
||||||
|
|||||||
@@ -272,6 +272,14 @@ void Packer::defineDecompressorSymbols()
|
|||||||
linker->defineSymbol("lzma_u_len", ph.u_len);
|
linker->defineSymbol("lzma_u_len", ph.u_len);
|
||||||
unsigned stack = getDecompressorWrkmemSize();
|
unsigned stack = getDecompressorWrkmemSize();
|
||||||
linker->defineSymbol("lzma_stack_adjust", 0u - stack);
|
linker->defineSymbol("lzma_stack_adjust", 0u - stack);
|
||||||
|
|
||||||
|
if (ph.format == UPX_F_DOS_EXE)
|
||||||
|
{
|
||||||
|
linker->defineSymbol("lzma_properties_hi", properties / 65536);
|
||||||
|
// -2 for properties
|
||||||
|
linker->defineSymbol("lzma_c_len_hi", (ph.c_len - 2) / 65536);
|
||||||
|
linker->defineSymbol("lzma_u_len_hi", ph.u_len / 65536);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1593
-1543
File diff suppressed because it is too large
Load Diff
@@ -122,7 +122,49 @@ __U4M_V01:
|
|||||||
|
|
||||||
// init
|
// init
|
||||||
section LZMA_DEC00
|
section LZMA_DEC00
|
||||||
|
.byte 0xcc
|
||||||
|
mov bp, sp
|
||||||
|
lea bx, [bp + lzma_stack_adjust]
|
||||||
|
xor ax, ax
|
||||||
|
.clearstack:
|
||||||
|
push ax
|
||||||
|
cmp sp, bx
|
||||||
|
jnz .clearstack
|
||||||
|
|
||||||
|
inc si
|
||||||
|
inc si
|
||||||
|
|
||||||
|
push ss // outSizeProcessed
|
||||||
|
push bx
|
||||||
|
mov ax, offset lzma_u_len_hi
|
||||||
|
push ax
|
||||||
|
mov ax, offset lzma_u_len
|
||||||
|
push ax // outSize
|
||||||
|
push es
|
||||||
|
push di // out
|
||||||
|
|
||||||
|
add bx, 4
|
||||||
|
push ss // inSizeProcessed
|
||||||
|
push bx
|
||||||
|
mov ax, offset lzma_c_len_hi
|
||||||
|
push ax
|
||||||
|
mov ax, offset lzma_c_len
|
||||||
|
push ax // inSize
|
||||||
|
push ds
|
||||||
|
push si // in
|
||||||
|
|
||||||
|
add bx, 4
|
||||||
|
push ss
|
||||||
|
push bx
|
||||||
|
mov ax, offset lzma_properties_hi
|
||||||
|
mov ss:[bx + 2], ax
|
||||||
|
mov ax, offset lzma_properties
|
||||||
|
mov ss:[bx], ax
|
||||||
|
call LZMA_DEC10
|
||||||
|
|
||||||
|
mov sp, bp
|
||||||
|
// FIXME 'es:di' should be set
|
||||||
|
lret
|
||||||
|
|
||||||
section LZMA_DEC10
|
section LZMA_DEC10
|
||||||
.arch i8086, nojumps
|
.arch i8086, nojumps
|
||||||
|
|||||||
@@ -45,25 +45,25 @@ Idx Name Size VMA LMA File off Algn Flags
|
|||||||
40 N2E64K02 0000000b 00000000 00000000 00000290 2**0 CONTENTS, READONLY
|
40 N2E64K02 0000000b 00000000 00000000 00000290 2**0 CONTENTS, READONLY
|
||||||
41 NRV2EEX9 00000004 00000000 00000000 0000029b 2**0 CONTENTS, READONLY
|
41 NRV2EEX9 00000004 00000000 00000000 0000029b 2**0 CONTENTS, READONLY
|
||||||
42 LZMA_DEC99 0000005d 00000000 00000000 0000029f 2**0 CONTENTS, READONLY
|
42 LZMA_DEC99 0000005d 00000000 00000000 0000029f 2**0 CONTENTS, READONLY
|
||||||
43 LZMA_DEC00 00000000 00000000 00000000 000002fc 2**0 CONTENTS, READONLY
|
43 LZMA_DEC00 00000043 00000000 00000000 000002fc 2**0 CONTENTS, RELOC, READONLY
|
||||||
44 LZMA_DEC10 00000ea2 00000000 00000000 000002fc 2**0 CONTENTS, RELOC, READONLY
|
44 LZMA_DEC10 00000ea2 00000000 00000000 0000033f 2**0 CONTENTS, RELOC, READONLY
|
||||||
45 LZMA_DEC20 00000ea2 00000000 00000000 0000119e 2**0 CONTENTS, RELOC, READONLY
|
45 LZMA_DEC20 00000ea2 00000000 00000000 000011e1 2**0 CONTENTS, RELOC, READONLY
|
||||||
46 LZMA_DEC30 00000000 00000000 00000000 00002040 2**0 CONTENTS, READONLY
|
46 LZMA_DEC30 00000000 00000000 00000000 00002083 2**0 CONTENTS, READONLY
|
||||||
47 EXEMAIN5 00000001 00000000 00000000 00002040 2**0 CONTENTS, READONLY
|
47 EXEMAIN5 00000001 00000000 00000000 00002083 2**0 CONTENTS, READONLY
|
||||||
48 EXEADJUS 00000007 00000000 00000000 00002041 2**0 CONTENTS, READONLY
|
48 EXEADJUS 00000007 00000000 00000000 00002084 2**0 CONTENTS, READONLY
|
||||||
49 EXENOADJ 00000002 00000000 00000000 00002048 2**0 CONTENTS, READONLY
|
49 EXENOADJ 00000002 00000000 00000000 0000208b 2**0 CONTENTS, READONLY
|
||||||
50 EXERELO1 0000001e 00000000 00000000 0000204a 2**0 CONTENTS, RELOC, READONLY
|
50 EXERELO1 0000001e 00000000 00000000 0000208d 2**0 CONTENTS, RELOC, READONLY
|
||||||
51 EXEREL9A 00000012 00000000 00000000 00002068 2**0 CONTENTS, RELOC, READONLY
|
51 EXEREL9A 00000012 00000000 00000000 000020ab 2**0 CONTENTS, RELOC, READONLY
|
||||||
52 EXERELO2 00000004 00000000 00000000 0000207a 2**0 CONTENTS, READONLY
|
52 EXERELO2 00000004 00000000 00000000 000020bd 2**0 CONTENTS, READONLY
|
||||||
53 EXEREBIG 00000002 00000000 00000000 0000207e 2**0 CONTENTS, RELOC, READONLY
|
53 EXEREBIG 00000002 00000000 00000000 000020c1 2**0 CONTENTS, RELOC, READONLY
|
||||||
54 EXERELO3 00000002 00000000 00000000 00002080 2**0 CONTENTS, RELOC, READONLY
|
54 EXERELO3 00000002 00000000 00000000 000020c3 2**0 CONTENTS, RELOC, READONLY
|
||||||
55 EXEMAIN8 00000003 00000000 00000000 00002082 2**0 CONTENTS, READONLY
|
55 EXEMAIN8 00000003 00000000 00000000 000020c5 2**0 CONTENTS, READONLY
|
||||||
56 DEVICEEND 00000013 00000000 00000000 00002085 2**0 CONTENTS, READONLY
|
56 DEVICEEND 00000013 00000000 00000000 000020c8 2**0 CONTENTS, READONLY
|
||||||
57 EXESTACK 00000006 00000000 00000000 00002098 2**0 CONTENTS, RELOC, READONLY
|
57 EXESTACK 00000006 00000000 00000000 000020db 2**0 CONTENTS, RELOC, READONLY
|
||||||
58 EXESTASP 00000003 00000000 00000000 0000209e 2**0 CONTENTS, RELOC, READONLY
|
58 EXESTASP 00000003 00000000 00000000 000020e1 2**0 CONTENTS, RELOC, READONLY
|
||||||
59 EXEJUMPF 00000005 00000000 00000000 000020a1 2**0 CONTENTS, RELOC, READONLY
|
59 EXEJUMPF 00000005 00000000 00000000 000020e4 2**0 CONTENTS, RELOC, READONLY
|
||||||
60 EXERCSPO 00000004 00000000 00000000 000020a6 2**0 CONTENTS, RELOC, READONLY
|
60 EXERCSPO 00000004 00000000 00000000 000020e9 2**0 CONTENTS, RELOC, READONLY
|
||||||
61 EXERETIP 00000006 00000000 00000000 000020aa 2**0 CONTENTS, RELOC, READONLY
|
61 EXERETIP 00000006 00000000 00000000 000020ed 2**0 CONTENTS, RELOC, READONLY
|
||||||
SYMBOL TABLE:
|
SYMBOL TABLE:
|
||||||
00000000 l d DEVICEENTRY 00000000 DEVICEENTRY
|
00000000 l d DEVICEENTRY 00000000 DEVICEENTRY
|
||||||
00000000 l d EXEENTRY 00000000 EXEENTRY
|
00000000 l d EXEENTRY 00000000 EXEENTRY
|
||||||
@@ -80,6 +80,7 @@ SYMBOL TABLE:
|
|||||||
00000000 l d NRV2EEX3 00000000 NRV2EEX3
|
00000000 l d NRV2EEX3 00000000 NRV2EEX3
|
||||||
00000000 l d NRV2EEX9 00000000 NRV2EEX9
|
00000000 l d NRV2EEX9 00000000 NRV2EEX9
|
||||||
00000000 l d LZMA_DEC99 00000000 LZMA_DEC99
|
00000000 l d LZMA_DEC99 00000000 LZMA_DEC99
|
||||||
|
00000000 l d LZMA_DEC10 00000000 LZMA_DEC10
|
||||||
00000000 l d EXERELO1 00000000 EXERELO1
|
00000000 l d EXERELO1 00000000 EXERELO1
|
||||||
00000000 l d EXERELO2 00000000 EXERELO2
|
00000000 l d EXERELO2 00000000 EXERELO2
|
||||||
00000000 l d DEVICESUB 00000000 DEVICESUB
|
00000000 l d DEVICESUB 00000000 DEVICESUB
|
||||||
@@ -111,7 +112,6 @@ SYMBOL TABLE:
|
|||||||
00000000 l d N2E28602 00000000 N2E28602
|
00000000 l d N2E28602 00000000 N2E28602
|
||||||
00000000 l d N2E64K02 00000000 N2E64K02
|
00000000 l d N2E64K02 00000000 N2E64K02
|
||||||
00000000 l d LZMA_DEC00 00000000 LZMA_DEC00
|
00000000 l d LZMA_DEC00 00000000 LZMA_DEC00
|
||||||
00000000 l d LZMA_DEC10 00000000 LZMA_DEC10
|
|
||||||
00000000 l d LZMA_DEC20 00000000 LZMA_DEC20
|
00000000 l d LZMA_DEC20 00000000 LZMA_DEC20
|
||||||
00000000 l d LZMA_DEC30 00000000 LZMA_DEC30
|
00000000 l d LZMA_DEC30 00000000 LZMA_DEC30
|
||||||
00000000 l d EXEMAIN5 00000000 EXEMAIN5
|
00000000 l d EXEMAIN5 00000000 EXEMAIN5
|
||||||
@@ -138,6 +138,13 @@ SYMBOL TABLE:
|
|||||||
00000000 *UND* 00000000 destination_segment
|
00000000 *UND* 00000000 destination_segment
|
||||||
00000000 *UND* 00000000 decompressor_entry
|
00000000 *UND* 00000000 decompressor_entry
|
||||||
00000000 *UND* 00000000 bx_magic
|
00000000 *UND* 00000000 bx_magic
|
||||||
|
00000000 *UND* 00000000 lzma_stack_adjust
|
||||||
|
00000000 *UND* 00000000 lzma_u_len_hi
|
||||||
|
00000000 *UND* 00000000 lzma_u_len
|
||||||
|
00000000 *UND* 00000000 lzma_c_len_hi
|
||||||
|
00000000 *UND* 00000000 lzma_c_len
|
||||||
|
00000000 *UND* 00000000 lzma_properties_hi
|
||||||
|
00000000 *UND* 00000000 lzma_properties
|
||||||
00000000 *UND* 00000000 reloc_size
|
00000000 *UND* 00000000 reloc_size
|
||||||
00000000 *UND* 00000000 original_ss
|
00000000 *UND* 00000000 original_ss
|
||||||
00000000 *UND* 00000000 original_sp
|
00000000 *UND* 00000000 original_sp
|
||||||
@@ -242,6 +249,17 @@ OFFSET TYPE VALUE
|
|||||||
00000005 R_386_PC8 NRV2EEX2
|
00000005 R_386_PC8 NRV2EEX2
|
||||||
00000012 R_386_PC8 NRV2EEX9
|
00000012 R_386_PC8 NRV2EEX9
|
||||||
|
|
||||||
|
RELOCATION RECORDS FOR [LZMA_DEC00]:
|
||||||
|
OFFSET TYPE VALUE
|
||||||
|
00000005 R_386_16 lzma_stack_adjust
|
||||||
|
00000013 R_386_16 lzma_u_len_hi
|
||||||
|
00000017 R_386_16 lzma_u_len
|
||||||
|
00000022 R_386_16 lzma_c_len_hi
|
||||||
|
00000026 R_386_16 lzma_c_len
|
||||||
|
00000031 R_386_16 lzma_properties_hi
|
||||||
|
00000038 R_386_16 lzma_properties
|
||||||
|
0000003e R_386_PC16 LZMA_DEC10
|
||||||
|
|
||||||
RELOCATION RECORDS FOR [LZMA_DEC10]:
|
RELOCATION RECORDS FOR [LZMA_DEC10]:
|
||||||
OFFSET TYPE VALUE
|
OFFSET TYPE VALUE
|
||||||
000000e5 R_386_PC16 LZMA_DEC99
|
000000e5 R_386_PC16 LZMA_DEC99
|
||||||
|
|||||||
Reference in New Issue
Block a user