[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