diff --git a/src/p_djgpp2.cpp b/src/p_djgpp2.cpp index 9679c4dc..6a59bc5f 100644 --- a/src/p_djgpp2.cpp +++ b/src/p_djgpp2.cpp @@ -329,7 +329,7 @@ void PackDjgpp2::pack(OutputFile *fo) // patch loader patchPackHeader(loader,lsize); patch_le32(loader,lsize,"ENTR",coff_hdr.a_entry); - patchFilter32(ft, loader, lsize); + patchFilter32(loader, lsize, &ft); patch_le32(loader,lsize,"BSSL",overlapoh/4); assert(bss->vaddr == ((size + 0x1ff) &~ 0x1ff) + (text->vaddr &~ 0x1ff)); patch_le32(loader,lsize,"OUTP",text->vaddr &~ 0x1ff); diff --git a/src/p_tmt.cpp b/src/p_tmt.cpp index ea90598d..a4c696f9 100644 --- a/src/p_tmt.cpp +++ b/src/p_tmt.cpp @@ -223,7 +223,7 @@ void PackTmt::pack(OutputFile *fo) // patch loader patch_le32(loader,lsize,"JMPO",ih.entry-(ph.u_len+overlapoh+d_len)); - patchFilter32(ft, loader, lsize); + patchFilter32(loader, lsize, &ft); patchPackHeader(loader,e_len); const unsigned jmp_pos = find_le32(loader,e_len,get_le32("JMPD")); diff --git a/src/p_vmlinz.cpp b/src/p_vmlinz.cpp index 224e9cf3..5543d07d 100644 --- a/src/p_vmlinz.cpp +++ b/src/p_vmlinz.cpp @@ -217,7 +217,7 @@ void PackVmlinuzI386::pack(OutputFile *fo) memcpy(loader, getLoader(), lsize); patchPackHeader(loader, lsize); - patchFilter32(ft, loader, lsize); + patchFilter32(loader, lsize, &ft); patch_le32(loader, lsize, "ESI1", zimage_offset + lsize); patch_le32(loader, lsize, "KEIP", kernel_entry); patch_le32(loader, lsize, "STAK", stack_during_uncompression); @@ -298,7 +298,7 @@ void PackBvmlinuzI386::pack(OutputFile *fo) MemBuffer loader(lsize); memcpy(loader, getLoader(), lsize); - patchFilter32(ft, loader, lsize); + patchFilter32(loader, lsize, &ft); patchPackHeader(loader, lsize); const int e_len = getLoaderSectionStart("LZCUTPOI"); diff --git a/src/p_w32pe.cpp b/src/p_w32pe.cpp index 37b025a2..22fc0404 100644 --- a/src/p_w32pe.cpp +++ b/src/p_w32pe.cpp @@ -1721,7 +1721,7 @@ void PackW32Pe::pack(OutputFile *fo) patch_le32(loader,codesize,"BIMP",cimports); } - if (patchFilter32(ft, loader, lsize)) + if (patchFilter32(loader, lsize, &ft)) { const unsigned texv = ih.codebase - rvamin; if (texv) diff --git a/src/p_wcle.cpp b/src/p_wcle.cpp index 6c82e85d..4acfd3e4 100644 --- a/src/p_wcle.cpp +++ b/src/p_wcle.cpp @@ -513,7 +513,7 @@ void PackWcle::pack(OutputFile *fo) upx_byte *p = oimage+soimage-d_len; patch_le32(p,d_len,"JMPO",ih.init_eip_offset+text_vaddr-(ic+d_len)); patch_le32(p,d_len,"ESP0",ih.init_esp_offset+IOT(ih.init_ss_object-1,my_base_address)); - if (patchFilter32(ft, p, d_len) && text_vaddr) + if (patchFilter32(p, d_len, &ft) && text_vaddr) patch_le32(p, d_len, "TEXV", text_vaddr); patch_le32(p,d_len,"RELO",mps*pages); diff --git a/src/packer.cpp b/src/packer.cpp index 53ef666a..6b2792ec 100644 --- a/src/packer.cpp +++ b/src/packer.cpp @@ -1301,15 +1301,15 @@ void Packer::scanFilters(Filter *ft, const upx_byte *buf, unsigned buf_len, } -bool Packer::patchFilter32(const Filter &ft, void *loader, unsigned lsize) +bool Packer::patchFilter32(void *loader, int lsize, const Filter *ft) { - if (ft.id == 0) + if (ft->id == 0) return false; - assert(ft.calls > 0); - if (ft.id > 0x20) - patch_le16(loader, lsize, "??", '?' + (ft.cto << 8)); - patch_le32(loader, lsize, "TEXL", (ft.id & 0xf) % 3 == 0 ? ft.calls : - ft.lastcall - ft.calls * 4); + assert(ft->calls > 0); + if (ft->id > 0x20) + patch_le16(loader, lsize, "??", '?' + (ft->cto << 8)); + patch_le32(loader, lsize, "TEXL", (ft->id & 0xf) % 3 == 0 ? ft->calls : + ft->lastcall - ft->calls * 4); return true; } diff --git a/src/packer.h b/src/packer.h index 0eb133f5..53f29f64 100644 --- a/src/packer.h +++ b/src/packer.h @@ -192,7 +192,7 @@ protected: unsigned addvalue=0) const; virtual void optimizeFilter(Filter *, const upx_byte *, unsigned) const { } - virtual bool patchFilter32(const Filter &, void *, unsigned); + virtual bool patchFilter32(void *, int, const Filter *ft); // loader util virtual int buildLoader(const Filter *) { return getLoaderSize(); }