From: Eric Pouech eric.pouech@gmail.com
Signed-off-by: Eric Pouech eric.pouech@gmail.com --- tools/winedump/main.c | 36 +++++++++++++++++++++++++---- tools/winedump/ne.c | 12 ++++------ tools/winedump/pe.c | 48 ++++++++++++++++++--------------------- tools/winedump/winedump.h | 4 +++- 4 files changed, 61 insertions(+), 39 deletions(-)
diff --git a/tools/winedump/main.c b/tools/winedump/main.c index f9557983465..15b1813de5e 100644 --- a/tools/winedump/main.c +++ b/tools/winedump/main.c @@ -169,7 +169,23 @@ static void do_dumphead (const char *arg)
static void do_dumpsect (const char* arg) { - globals.dumpsect = arg; + unsigned count = 2; + char* p; + const char** out; + + for (p = (char*)arg; (p = strchr(p, ',')) != NULL; p++, count++); + out = malloc(count * sizeof(char*)); + globals.dumpsect = out; + count = 0; + p = strdup(arg); + for (;;) + { + out[count++] = p; + p = strchr(p, ','); + if (!p) break; + *p++ = '\0'; + } + out[count] = NULL; }
static void do_rawdebug (const char *arg) @@ -182,7 +198,7 @@ static void do_dumpall(const char *arg) globals.do_dumpheader = TRUE; globals.do_dump_rawdata = TRUE; globals.do_symbol_table = TRUE; - globals.dumpsect = "ALL"; + do_dumpsect ("ALL"); }
static void do_symtable(const char* arg) @@ -207,8 +223,10 @@ static const struct my_option option_table[] = { {"-C", DUMP, 0, do_symdmngl, "-C Turn on symbol demangling"}, {"-f", DUMP, 0, do_dumphead, "-f Dump file header information"}, {"-G", DUMP, 0, do_rawdebug, "-G Dump raw debug information"}, - {"-j", DUMP, 1, do_dumpsect, "-j <sect_name> Dump only the content of section 'sect_name'\n" - " (import, export, debug, resource, tls, loadcfg, clr, reloc, except, apiset)"}, + {"-j", DUMP, 1, do_dumpsect, "-j <sect_name> Dump the content of section 'sect_name'\n" + " (use '-j sect_name,sect_name2' to dump several sections)\n" + " for NE: export, resource\n" + " for PE: import, export, debug, resource, tls, loadcfg, clr, reloc, except, apiset"}, {"-t", DUMP, 0, do_symtable, "-t Dump symbol table"}, {"-x", DUMP, 0, do_dumpall, "-x Dump everything"}, {"sym", DMGL, 0, do_demangle, "sym <sym> Demangle C++ symbol <sym> and exit"}, @@ -370,6 +388,16 @@ static BOOL symbol_finish(void) return started; }
+BOOL globals_dump_sect(const char* s) +{ + const char** sect; + + if (!s || !globals.dumpsect) return FALSE; + for (sect = globals.dumpsect; *sect; sect++) + if (!strcmp(*sect, s) || !strcmp(*sect, "ALL")) return TRUE; + return FALSE; +} + /******************************************************************* * main */ diff --git a/tools/winedump/ne.c b/tools/winedump/ne.c index 9b4ede6c86e..c27d7d6a9b7 100644 --- a/tools/winedump/ne.c +++ b/tools/winedump/ne.c @@ -429,15 +429,11 @@ void ne_dump( void ) dump_ne_header( ne ); if (globals.do_dumpheader) dump_ne_names( ne ); - if (globals.dumpsect) - { - BOOL all = strcmp(globals.dumpsect, "ALL") == 0;
- if (all || !strcmp(globals.dumpsect, "resource")) - dump_ne_resources( ne ); - if (all || !strcmp(globals.dumpsect, "export")) - dump_ne_exports( ne ); - } + if (globals_dump_sect("resource")) + dump_ne_resources( ne ); + if (globals_dump_sect("export")) + dump_ne_exports( ne ); if (globals.do_dumpheader) for (i = 1; i <= ne->ne_cseg; i++) dump_ne_segment( ne, i ); } diff --git a/tools/winedump/pe.c b/tools/winedump/pe.c index ed30d54cece..70961ad5b94 100644 --- a/tools/winedump/pe.c +++ b/tools/winedump/pe.c @@ -2401,8 +2401,6 @@ enum FileSig get_kind_exec(void)
void pe_dump(void) { - int all = (globals.dumpsect != NULL) && strcmp(globals.dumpsect, "ALL") == 0; - PE_nt_headers = get_nt_header(); print_fake_dll();
@@ -2419,32 +2417,30 @@ void pe_dump(void) dump_pe_header(); }
- if (globals.dumpsect) + if (globals_dump_sect("import")) { - if (all || !strcmp(globals.dumpsect, "import")) - { - dump_dir_imported_functions(); - dump_dir_delay_imported_functions(); - } - if (all || !strcmp(globals.dumpsect, "export")) - dump_dir_exported_functions(); - if (all || !strcmp(globals.dumpsect, "debug")) - dump_dir_debug(); - if (all || !strcmp(globals.dumpsect, "resource")) - dump_dir_resource(); - if (all || !strcmp(globals.dumpsect, "tls")) - dump_dir_tls(); - if (all || !strcmp(globals.dumpsect, "loadcfg")) - dump_dir_loadconfig(); - if (all || !strcmp(globals.dumpsect, "clr")) - dump_dir_clr_header(); - if (all || !strcmp(globals.dumpsect, "reloc")) - dump_dir_reloc(); - if (all || !strcmp(globals.dumpsect, "except")) - dump_dir_exceptions(); - if (all || !strcmp(globals.dumpsect, "apiset")) - dump_section_apiset(); + dump_dir_imported_functions(); + dump_dir_delay_imported_functions(); } + if (globals_dump_sect("export")) + dump_dir_exported_functions(); + if (globals_dump_sect("debug")) + dump_dir_debug(); + if (globals_dump_sect("resource")) + dump_dir_resource(); + if (globals_dump_sect("tls")) + dump_dir_tls(); + if (globals_dump_sect("loadcfg")) + dump_dir_loadconfig(); + if (globals_dump_sect("clr")) + dump_dir_clr_header(); + if (globals_dump_sect("reloc")) + dump_dir_reloc(); + if (globals_dump_sect("except")) + dump_dir_exceptions(); + if (globals_dump_sect("apiset")) + dump_section_apiset(); + if (globals.do_symbol_table) dump_symbol_table(); if (globals.do_debug) diff --git a/tools/winedump/winedump.h b/tools/winedump/winedump.h index 84694f21b0b..dec7bc42c9f 100644 --- a/tools/winedump/winedump.h +++ b/tools/winedump/winedump.h @@ -135,13 +135,15 @@ typedef struct __globals const char *uc_dll_name; /* -o */
/* Option arguments: dump mode */ - const char *dumpsect; /* -j */ + const char **dumpsect; /* -j */ } _globals;
extern _globals globals; extern void *dump_base; extern size_t dump_total_len;
+BOOL globals_dump_sect(const char*); + /* Names to use for output DLL */ #define OUTPUT_DLL_NAME \ (globals.dll_name ? globals.dll_name : (globals.input_module ? globals.input_module : globals.input_name))