[PATCH] [WineDump]: fake dlls
Eric Pouech
eric.pouech at wanadoo.fr
Mon Apr 10 03:54:30 CDT 2006
- now that setupapi generates fake DLLs, add the recognition of
those in winedump
A+
---
tools/winedump/dump.c | 42 ++++++++++++++++++++++++++++--------------
tools/winedump/pe.c | 2 +-
tools/winedump/winedump.h | 2 +-
3 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/tools/winedump/dump.c b/tools/winedump/dump.c
index 91f4b0b..ab39d74 100644
--- a/tools/winedump/dump.c
+++ b/tools/winedump/dump.c
@@ -144,24 +144,30 @@ unsigned long Offset(void* ptr)
return (char*)ptr - (char*)dump_base;
}
-static void do_dump( enum FileSig sig, void* pmt )
+static void do_dump( enum FileSig sig, void* pmt, unsigned faked )
{
- if (sig == SIG_NE)
+ switch (sig)
{
+ case SIG_NE:
ne_dump( dump_base, dump_total_len );
- return;
- }
-
- if (sig == SIG_LE)
- {
+ break;
+ case SIG_LE:
le_dump( dump_base, dump_total_len );
- return;
+ break;
+ case SIG_PE:
+ if (faked) printf("********************************\n"
+ "*** This is a Wine fake DLL! ***\n"
+ "********************************\n\n");
+ pe_dump(pmt);
+ break;
+ default:
+ assert(0);
}
-
- pe_dump(pmt);
}
-static enum FileSig check_headers(void** pmt)
+static const char fakedll_signature[] = "Wine placeholder DLL";
+
+static enum FileSig check_headers(void** pmt, unsigned* faked)
{
WORD* pw;
DWORD* pdw;
@@ -171,6 +177,7 @@ static enum FileSig check_headers(void**
pw = PRD(0, sizeof(WORD));
if (!pw) {printf("Can't get main signature, aborting\n"); return 0;}
+ *faked = FALSE;
*pmt = NULL;
switch (*pw)
{
@@ -179,6 +186,12 @@ static enum FileSig check_headers(void**
dh = PRD(0, sizeof(IMAGE_DOS_HEADER));
if (dh && dh->e_lfanew >= sizeof(*dh)) /* reasonable DOS header ? */
{
+ if (dh->e_lfanew >= sizeof(*dh) + sizeof(fakedll_signature))
+ {
+ const char* tmp = PRD(sizeof(*dh), sizeof(fakedll_signature));
+ if (tmp && !strcmp(tmp, fakedll_signature))
+ *faked = TRUE;
+ }
/* the signature is the first DWORD */
pdw = PRD(dh->e_lfanew, sizeof(DWORD));
if (pdw)
@@ -225,13 +238,14 @@ static enum FileSig check_headers(void**
return sig;
}
-int dump_analysis(const char* name, void (*fn)(enum FileSig, void*), enum FileSig wanted_sig)
+int dump_analysis(const char* name, file_dumper fn, enum FileSig wanted_sig)
{
int fd;
enum FileSig effective_sig;
int ret = 1;
struct stat s;
void* pmt;
+ BOOL faked;
setbuf(stdout, NULL);
@@ -249,7 +263,7 @@ int dump_analysis(const char* name, void
if ((unsigned long)read( fd, dump_base, dump_total_len ) != dump_total_len) fatal( "Cannot read file" );
}
- effective_sig = check_headers(&pmt);
+ effective_sig = check_headers(&pmt, &faked);
if (effective_sig == SIG_UNKNOWN)
{
@@ -266,7 +280,7 @@ int dump_analysis(const char* name, void
case SIG_NE:
case SIG_LE:
printf("Contents of \"%s\": %ld bytes\n\n", name, dump_total_len);
- (*fn)(effective_sig, pmt);
+ (*fn)(effective_sig, pmt, faked);
break;
case SIG_DBG:
dump_separate_dbg();
diff --git a/tools/winedump/pe.c b/tools/winedump/pe.c
index eb70faa..28914a0 100644
--- a/tools/winedump/pe.c
+++ b/tools/winedump/pe.c
@@ -1135,7 +1135,7 @@ static void dll_close (void)
}
*/
-static void do_grab_sym( enum FileSig sig, void* pmt )
+static void do_grab_sym( enum FileSig sig, void* pmt, unsigned faked )
{
IMAGE_EXPORT_DIRECTORY *exportDir;
unsigned i, j;
diff --git a/tools/winedump/winedump.h b/tools/winedump/winedump.h
index 2fefbda..c58c837 100644
--- a/tools/winedump/winedump.h
+++ b/tools/winedump/winedump.h
@@ -228,7 +228,7 @@ enum FileSig {SIG_UNKNOWN, SIG_DOS, SIG_
void* PRD(unsigned long prd, unsigned long len);
unsigned long Offset(void* ptr);
-typedef void (*file_dumper)(enum FileSig, void*);
+typedef void (*file_dumper)(enum FileSig, void*, unsigned);
int dump_analysis(const char*, file_dumper, enum FileSig);
void dump_data( const unsigned char *ptr, unsigned int size, const char *prefix );
More information about the wine-patches
mailing list