Eric Pouech : winedump: Dump the EMF files as any other file types.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 30 06:46:28 CST 2006


Module: wine
Branch: master
Commit: c4dc400a8822d9287a658e3946f23c4737cbee59
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c4dc400a8822d9287a658e3946f23c4737cbee59

Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date:   Wed Nov 29 21:40:21 2006 +0100

winedump: Dump the EMF files as any other file types.

Internally, make use of the PRD function for checking available file ranges.

---

 tools/winedump/dump.c     |    1 +
 tools/winedump/emf.c      |   52 +++++++++++++++++++++-----------------------
 tools/winedump/main.c     |   21 +----------------
 tools/winedump/winedump.h |   10 ++++----
 4 files changed, 33 insertions(+), 51 deletions(-)

diff --git a/tools/winedump/dump.c b/tools/winedump/dump.c
index 0aeb474..f8b149d 100644
--- a/tools/winedump/dump.c
+++ b/tools/winedump/dump.c
@@ -159,6 +159,7 @@ dumpers[] =
     {SIG_COFFLIB,       get_kind_lib,   lib_dump},
     {SIG_MDMP,          get_kind_mdmp,  mdmp_dump},
     {SIG_LNK,           get_kind_lnk,   lnk_dump},
+    {SIG_EMF,           get_kind_emf,    emf_dump},
     {SIG_UNKNOWN,       NULL,           NULL} /* sentinel */
 };
 
diff --git a/tools/winedump/emf.c b/tools/winedump/emf.c
index df92e1d..f5375d0 100644
--- a/tools/winedump/emf.c
+++ b/tools/winedump/emf.c
@@ -36,7 +36,7 @@
 #include "winbase.h"
 #include "wingdi.h"
 
-static unsigned int read_int(unsigned char *buffer)
+static unsigned int read_int(const unsigned char *buffer)
 {
     return buffer[0]
      + (buffer[1]<<8)
@@ -46,18 +46,18 @@ static unsigned int read_int(unsigned ch
 
 #define EMRCASE(x) case x: printf("%-20s %08x\n", #x, length); break
 
-static int dump_emfrecord(int fd)
+static unsigned offset = 0;
+
+static int dump_emfrecord(void)
 {
-    unsigned char buffer[8];
-    int r;
+    const unsigned char*        ptr;
     unsigned int type, length, i;
 
-    r = read(fd, buffer, 8);
-    if(r!=8)
-        return -1;
+    ptr = PRD(offset, 8);
+    if (!ptr) return -1;
 
-    type = read_int(buffer);
-    length = read_int(buffer+4);
+    type = read_int(ptr);
+    length = read_int(ptr + 4);
 
     switch(type)
     {
@@ -96,36 +96,34 @@ static int dump_emfrecord(int fd)
 
     length -= 8;
 
+    offset += 8;
+
     for(i=0; i<length; i+=4)
     {
          if (i%16 == 0)
              printf("   ");
-         memset(buffer,0,sizeof buffer);
-         r = read(fd,buffer,4);
-         if(r!=4)
-             return -1;
-         printf("%08x ", read_int(buffer));
-         if ( (i%16 == 12) || ((i+4)==length) )
+         if (!(ptr = PRD(offset, 4))) return -1;
+         offset += 4;
+         printf("%08x ", read_int(ptr));
+         if ( (i % 16 == 12) || (i + 4 == length))
              printf("\n");
     }
 
     return 0;
 }
 
-static int dump_emf_records(int fd)
+enum FileSig get_kind_emf(void)
 {
-    while(!dump_emfrecord(fd))
-        ;
-    return 0;
+    const ENHMETAHEADER*        hdr;
+
+    hdr = PRD(0, sizeof(*hdr));
+    if (hdr && hdr->iType == EMR_HEADER && hdr->dSignature == ENHMETA_SIGNATURE)
+        return SIG_EMF;
+    return SIG_UNKNOWN;
 }
 
-int dump_emf(const char *emf)
+void emf_dump(void)
 {
-    int fd;
-
-    fd = open(emf,O_RDONLY);
-    if (fd<0) return -1;
-    dump_emf_records(fd);
-    close(fd);
-    return 0;
+    offset = 0;
+    while (!dump_emfrecord());
 }
diff --git a/tools/winedump/main.c b/tools/winedump/main.c
index 22c3210..193fb74 100644
--- a/tools/winedump/main.c
+++ b/tools/winedump/main.c
@@ -80,13 +80,6 @@ static void do_dump (const char *arg)
 }
 
 
-static void do_dumpemf(void)
-{
-    if (globals.mode != NONE) fatal("Only one mode can be specified\n");
-    globals.mode = EMF;
-}
-
-
 static void do_code (void)
 {
   globals.do_code = 1;
@@ -223,20 +216,19 @@ static const struct my_option option_tab
   {"-S",    SPEC, 1, do_symfile,  "-S symfile   Search only prototype names found in 'symfile'"},
   {"-q",    SPEC, 0, do_quiet,    "-q           Don't show progress (quiet)."},
   {"-v",    SPEC, 0, do_verbose,  "-v           Show lots of detail while working (verbose)."},
-  {"dump",  DUMP, 0, do_dump,     "dump <file>  Dumps the contents of the file (dll, exe, lib...)"},
+  {"dump",  DUMP, 0, do_dump,     "dump <file>  Dumps the contents of a file (dll, exe, lib...)"},
   {"-C",    DUMP, 0, do_symdmngl, "-C           Turns on symbol demangling"},
   {"-f",    DUMP, 0, do_dumphead, "-f           Dumps file header information"},
   {"-G",    DUMP, 0, do_rawdebug, "-G           Dumps raw debug information"},
   {"-j",    DUMP, 1, do_dumpsect, "-j sect_name Dumps only the content of section sect_name (import, export, debug, resource, tls)"},
   {"-x",    DUMP, 0, do_dumpall,  "-x           Dumps everything"},
-  {"emf",   EMF,  0, do_dumpemf,  "emf          Dumps an Enhanced Meta File"},
   {NULL,    NONE, 0, NULL,        NULL}
 };
 
 void do_usage (void)
 {
     const struct my_option *opt;
-    printf ("Usage: winedump [-h | sym <sym> | spec <dll> | dump <file> | emf <emf>]\n");
+    printf ("Usage: winedump [-h | sym <sym> | spec <dll> | dump <file>]\n");
     printf ("Mode options (can be put as the mode (sym/spec/dump...) is declared):\n");
     printf ("\tWhen used in --help mode\n");
     for (opt = option_table; opt->name; opt++)
@@ -254,10 +246,6 @@ void do_usage (void)
     for (opt = option_table; opt->name; opt++)
 	if (opt->mode == DUMP)
 	    printf ("\t   %s\n", opt->usage);
-    printf ("\tWhen used in emf mode\n");
-    for (opt = option_table; opt->name; opt++)
-	if (opt->mode == EMF)
-	    printf ("\t   %s\n", opt->usage);
 
     puts ("");
     exit (1);
@@ -489,11 +477,6 @@ int   main (int argc, char *argv[])
 	set_module_name(0);
 	dump_file(globals.input_name);
 	break;
-    case EMF:
-        if (globals.input_name == NULL)
-            fatal("No file name has been given\n");
-        dump_emf(globals.input_name);
-        break;
     }
 
     return 0;
diff --git a/tools/winedump/winedump.h b/tools/winedump/winedump.h
index 37d9056..4c97fd0 100644
--- a/tools/winedump/winedump.h
+++ b/tools/winedump/winedump.h
@@ -72,7 +72,7 @@
 #define SYM_THISCALL        0x4
 #define SYM_DATA            0x8 /* Data, not a function */
 
-typedef enum {NONE, DMGL, SPEC, DUMP, EMF} Mode;
+typedef enum {NONE, DMGL, SPEC, DUMP} Mode;
 
 /* Structure holding a parsed symbol */
 typedef struct __parsed_symbol
@@ -156,9 +156,6 @@ extern _globals globals;
 /* Default calling convention */
 #define CALLING_CONVENTION (globals.do_cdecl ? SYM_CDECL : SYM_STDCALL)
 
-/* EMF functions */
-int   dump_emf (const char *emf);
-
 /* Image functions */
 void	dump_file(const char* name);
 
@@ -221,7 +218,7 @@ char *str_toupper (char *str);
 const char *get_machine_str(int mach);
 
 /* file dumping functions */
-enum FileSig {SIG_UNKNOWN, SIG_DOS, SIG_PE, SIG_DBG, SIG_NE, SIG_LE, SIG_MDMP, SIG_COFFLIB, SIG_LNK};
+enum FileSig {SIG_UNKNOWN, SIG_DOS, SIG_PE, SIG_DBG, SIG_NE, SIG_LE, SIG_MDMP, SIG_COFFLIB, SIG_LNK, SIG_EMF};
 
 const void*	PRD(unsigned long prd, unsigned long len);
 unsigned long	Offset(const void* ptr);
@@ -246,6 +243,9 @@ enum FileSig    get_kind_dbg(void);
 void	        dbg_dump( void );
 enum FileSig    get_kind_lnk(void);
 void	        lnk_dump( void );
+enum FileSig    get_kind_emf(void);
+void            emf_dump( void );
+
 
 void            dump_stabs(const void* pv_stabs, unsigned szstabs, const char* stabstr, unsigned szstr);
 void		dump_codeview(unsigned long ptr, unsigned long len);




More information about the wine-cvs mailing list