diff --git a/tools/winedump/main.c b/tools/winedump/main.c index 700bc00870d..55199a2b82a 100644 --- a/tools/winedump/main.c +++ b/tools/winedump/main.c @@ -36,7 +36,7 @@ static void do_spec (const char *arg) { if (globals.mode != NONE) fatal("Only one mode can be specified\n"); globals.mode = SPEC; - globals.input_name = strip_ext (arg); + globals.input_name = arg; } @@ -162,7 +162,7 @@ static const struct option option_table[] = { {"-e", SPEC, 1, do_end, "-e num End prototype search after symbol 'num'"}, {"-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, 2, do_dump, "dump Dumps the content of the dll named "}, + {"dump", DUMP, 2, do_dump, "dump Dumps the content of the module (dll, exe...) named "}, {"-C", DUMP, 0, do_symdmngl, "-C Turns on symbol demangling"}, {"-f", DUMP, 0, do_dumphead, "-f Dumps file header information"}, {"-j", DUMP, 1, do_dumpsect, "-j sect_name Dumps only the content of section sect_name (import, export, debug)"}, @@ -247,6 +247,29 @@ static void parse_options (char *argv[]) fatal ("Options -v and -q are mutually exclusive"); } +static void set_module_name(unsigned setUC) +{ + const char* ptr; + char* buf; + int len; + + /* FIXME: we shouldn't assume all module extensions are .dll in winedump + * in some cases, we could have some .drv for example + */ + /* get module name from name */ + if ((ptr = strrchr (globals.input_name, '/'))) + ptr++; + else + ptr = globals.input_name; + len = strlen(ptr); + if (len > 4 && strcmp(ptr + len - 4, ".dll") == 0) + len -= 4; + buf = malloc(len + 1); + memcpy(buf, (void*)ptr, len); + buf[len] = 0; + globals.input_module = buf; + OUTPUT_UC_DLL_NAME = (setUC) ? str_toupper( strdup (OUTPUT_DLL_NAME)) : ""; +} /******************************************************************* * main @@ -274,6 +297,7 @@ int main (int argc, char *argv[]) VERBOSE = 1; symbol_init (&symbol, globals.input_name); + globals.input_module = ""; if (symbol_demangle (&symbol) == -1) fatal( "Symbol hasn't got a mangled name\n"); if (symbol.flags & SYM_DATA) @@ -285,6 +309,7 @@ int main (int argc, char *argv[]) break; case SPEC: + set_module_name(1); dll_open (globals.input_name); output_spec_preamble (); @@ -335,7 +360,7 @@ int main (int argc, char *argv[]) do_usage(); break; case DUMP: - globals.uc_dll_name = ""; + set_module_name(0); dump_file(globals.input_name); break; } diff --git a/tools/winedump/msmangle.c b/tools/winedump/msmangle.c index 64f58f0d18e..adee2ac69ab 100644 --- a/tools/winedump/msmangle.c +++ b/tools/winedump/msmangle.c @@ -487,15 +487,43 @@ static char *demangle_datatype (char **str, compound_type *ct, /* FIXME: P6 = Function pointer, others who knows.. */ if (isdigit (*iter)) { - if (*iter == '6') printf("Function pointer in argument list is not handled yet\n"); - return NULL; + if (*iter == '6') + { + /* FIXME: there are a tons of memory leaks here */ + /* FIXME: this is still broken in some cases and it has to be + * merged with the function prototype parsing above... + */ + iter += 3; /* FIXME */ + if (!demangle_datatype (&iter, &sub_ct, sym)) + return NULL; + ct->expression = str_create(2, sub_ct.expression, " (*)("); + if (*iter != '@') + { + while (*iter != 'Z') + { + FREE_CT (sub_ct); + INIT_CT (sub_ct); + if (!demangle_datatype (&iter, &sub_ct, sym)) + return NULL; + ct->expression = str_create(3, ct->expression, ", ", sub_ct.expression); + while (*iter == '@') iter++; + } + } else while (*iter == '@') iter++; + iter++; + ct->expression = str_create(2, ct->expression, ")"); + FREE_CT (sub_ct); + } + else + return NULL; } + else + { + /* Recurse to get the pointed-to type */ + if (!demangle_datatype (&iter, &sub_ct, sym)) + return NULL; - /* Recurse to get the pointed-to type */ - if (!demangle_datatype (&iter, &sub_ct, sym)) - return NULL; - - ct->expression = get_pointer_type_string (ct, sub_ct.expression); + ct->expression = get_pointer_type_string (ct, sub_ct.expression); + } FREE_CT (sub_ct); } diff --git a/tools/winedump/output.c b/tools/winedump/output.c index b9ebee019fc..15bb7ed6d00 100644 --- a/tools/winedump/output.c +++ b/tools/winedump/output.c @@ -33,7 +33,7 @@ void output_spec_preamble (void) puts ("Creating .spec preamble"); fprintf (specfile, - "# Generated from %s.dll by winedump\nname %s\n" + "# Generated from %s by winedump\nname %s\n" "type win32\ninit %s_Init\n\nimport kernel32.dll\n" "import ntdll.dll\n", globals.input_name, OUTPUT_DLL_NAME, OUTPUT_UC_DLL_NAME); @@ -199,7 +199,7 @@ void output_c_preamble (void) atexit (output_c_postamble); fprintf (cfile, - "/*\n * %s.dll\n *\n * Generated from %s.dll by winedump.\n *\n" + "/*\n * %s.dll\n *\n * Generated from %s by winedump.\n *\n" " * DO NOT SUBMIT GENERATED DLLS FOR INCLUSION INTO WINE!\n * \n */" "\n\n#include \"%s_dll.h\"\n\nDEFAULT_DEBUG_CHANNEL(%s);\n\n", OUTPUT_DLL_NAME, globals.input_name, OUTPUT_DLL_NAME, @@ -419,7 +419,7 @@ void output_makefile (void) puts ("Creating makefile"); fprintf (makefile, - "# Generated from %s.dll by winedump.\nTOPSRCDIR = @top_srcdir@\n" + "# Generated from %s by winedump.\nTOPSRCDIR = @top_srcdir@\n" "TOPOBJDIR = ../..\nSRCDIR = @srcdir@\nVPATH = @srcdir@\n" "MODULE = %s\nEXTRALIBS = $(LIBUNICODE)\n\n" "LDDLLFLAGS = @LDDLLFLAGS@\nSYMBOLFILE = $(MODULE).tmp.o\n\n" diff --git a/tools/winedump/pe.c b/tools/winedump/pe.c index bd6e21de4b3..221fea5cbbc 100644 --- a/tools/winedump/pe.c +++ b/tools/winedump/pe.c @@ -653,20 +653,13 @@ static enum FileSig check_headers(void) int pe_analysis(const char* name, void (*fn)(void), enum FileSig wanted_sig) { int fd; - int len; enum FileSig effective_sig; int ret = 1; struct stat s; - char *name_suffix; setbuf(stdout, NULL); - - len = strlen(name) + 5; - name_suffix = malloc(len); - strcpy(name_suffix, name); - strcat(name_suffix, ".dll"); - fd = open(name_suffix, O_RDONLY); + fd = open(name, O_RDONLY); if (fd == -1) fatal("Can't open file"); if (fstat(fd, &s) < 0) fatal("Can't get size"); @@ -798,11 +791,6 @@ static void do_grab_sym(void) pFunc = RVA(exportDir->AddressOfFunctions, exportDir->NumberOfFunctions * sizeof(DWORD)); if (!pFunc) {printf("Can't grab functions' address table\n"); return;} - /* Set DLL output names */ - if ((ptr = strrchr (globals.input_name, '/'))) - globals.input_name = ptr + 1; /* Strip path */ - OUTPUT_UC_DLL_NAME = str_toupper( strdup (OUTPUT_DLL_NAME)); - for (i = 0; i < exportDir->NumberOfFunctions; i++) { if (pFunc[i] && !(map[i / 32] & (1 << (i % 32)))) diff --git a/tools/winedump/winedump.h b/tools/winedump/winedump.h index b31fbc5b8fb..4882b0e9159 100644 --- a/tools/winedump/winedump.h +++ b/tools/winedump/winedump.h @@ -88,6 +88,7 @@ typedef struct __globals /* Option arguments: generic */ const char *input_name; /* */ + const char *input_module; /* input module name generated after input_name according mode */ /* Options: spec mode */ int do_code; /* -c, -t, -f */ @@ -118,7 +119,7 @@ extern _globals globals; /* Names to use for output DLL */ #define OUTPUT_DLL_NAME \ - (globals.dll_name ? globals.dll_name : globals.input_name) + (globals.dll_name ? globals.dll_name : (globals.input_module ? globals.input_module : globals.input_name)) #define OUTPUT_UC_DLL_NAME globals.uc_dll_name /* Verbosity levels */