From 9a67ce5968af168c8b37b5d94485b89a29e81db5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Moln=C3=A1r?= Date: Sun, 19 Dec 2010 23:22:58 +0100 Subject: [PATCH] do not skip dlls with no imports from the preprocessed import data (sf.net bug 3125753) --- src/p_armpe.cpp | 8 +++++++- src/p_w32pe.cpp | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/p_armpe.cpp b/src/p_armpe.cpp index ee07521c..f61c75f2 100644 --- a/src/p_armpe.cpp +++ b/src/p_armpe.cpp @@ -202,6 +202,7 @@ unsigned PackArmPe::processImports() // pass 1 unsigned iat; LE32 *lookupt; unsigned npos; + unsigned original_position; bool isk32; static int __acc_cdecl_qsort compare(const void *p1, const void *p2) @@ -210,6 +211,8 @@ unsigned PackArmPe::processImports() // pass 1 const udll *u2 = * (const udll * const *) p2; if (u1->isk32) return -1; if (u2->isk32) return 1; + if (!*u1->lookupt) return 1; + if (!*u2->lookupt) return -1; int rc = strcasecmp(u1->name,u2->name); if (rc) return rc; if (u1->ordinal) return -1; @@ -236,6 +239,7 @@ unsigned PackArmPe::processImports() // pass 1 dlls[ic].iat = im->iat; dlls[ic].lookupt = (LE32*) (ibuf + (im->oft ? im->oft : im->iat)); dlls[ic].npos = 0; + dlls[ic].original_position = ic; dlls[ic].isk32 = strcasecmp(kernel32dll,dlls[ic].name) == 0; soimport += strlen(dlls[ic].name) + 1 + 4; @@ -343,8 +347,10 @@ unsigned PackArmPe::processImports() // pass 1 for (ic = 0; ic < dllnum; ic++) { LE32 *tarr = idlls[ic]->lookupt; +#if 0 && ENABLE_THIS_AND_UNCOMPRESSION_WILL_BREAK if (!*tarr) // no imports from this dll continue; +#endif set_le32(ppi,idlls[ic]->npos); set_le32(ppi+4,idlls[ic]->iat - rvamin); ppi += 8; @@ -412,7 +418,7 @@ unsigned PackArmPe::processImports() // pass 1 for (ic = 0; ic < dllnum; ic++, im++) { memset(im,FILLVAL,sizeof(*im)); - im->dllname = ptr_diff(idlls[ic]->name,ibuf); // I only need this info + im->dllname = ptr_diff(dlls[idlls[ic]->original_position].name,ibuf); } } else diff --git a/src/p_w32pe.cpp b/src/p_w32pe.cpp index f3ad5edf..6032f2fe 100644 --- a/src/p_w32pe.cpp +++ b/src/p_w32pe.cpp @@ -365,6 +365,7 @@ unsigned PackW32Pe::processImports() // pass 1 unsigned iat; LE32 *lookupt; unsigned npos; + unsigned original_position; bool isk32; static int __acc_cdecl_qsort compare(const void *p1, const void *p2) @@ -373,6 +374,8 @@ unsigned PackW32Pe::processImports() // pass 1 const udll *u2 = * (const udll * const *) p2; if (u1->isk32) return -1; if (u2->isk32) return 1; + if (!*u1->lookupt) return 1; + if (!*u2->lookupt) return -1; int rc = strcasecmp(u1->name,u2->name); if (rc) return rc; if (u1->ordinal) return -1; @@ -399,6 +402,7 @@ unsigned PackW32Pe::processImports() // pass 1 dlls[ic].iat = im->iat; dlls[ic].lookupt = (LE32*) (ibuf + (im->oft ? im->oft : im->iat)); dlls[ic].npos = 0; + dlls[ic].original_position = ic; dlls[ic].isk32 = strcasecmp(kernel32dll,dlls[ic].name) == 0; soimport += strlen(dlls[ic].name) + 1 + 4; @@ -510,8 +514,10 @@ unsigned PackW32Pe::processImports() // pass 1 for (ic = 0; ic < dllnum; ic++) { LE32 *tarr = idlls[ic]->lookupt; +#if 0 && ENABLE_THIS_AND_UNCOMPRESSION_WILL_BREAK if (!*tarr) // no imports from this dll continue; +#endif set_le32(ppi,idlls[ic]->npos); set_le32(ppi+4,idlls[ic]->iat - rvamin); ppi += 8; @@ -579,7 +585,7 @@ unsigned PackW32Pe::processImports() // pass 1 for (ic = 0; ic < dllnum; ic++, im++) { memset(im,FILLVAL,sizeof(*im)); - im->dllname = ptr_diff(idlls[ic]->name,ibuf); // I only need this info + im->dllname = ptr_diff(dlls[idlls[ic]->original_position].name,ibuf); } } else