Fixed and globalized some path and module name handling.

Tweaked the demangling of function pointers as function parameters.
This commit is contained in:
Eric Pouech 2001-11-05 23:54:11 +00:00 committed by Alexandre Julliard
parent 2f9eb3b0cb
commit de6d4e211b
5 changed files with 69 additions and 27 deletions

View File

@ -36,7 +36,7 @@ static void do_spec (const char *arg)
{ {
if (globals.mode != NONE) fatal("Only one mode can be specified\n"); if (globals.mode != NONE) fatal("Only one mode can be specified\n");
globals.mode = SPEC; 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'"}, {"-e", SPEC, 1, do_end, "-e num End prototype search after symbol 'num'"},
{"-q", SPEC, 0, do_quiet, "-q Don't show progress (quiet)."}, {"-q", SPEC, 0, do_quiet, "-q Don't show progress (quiet)."},
{"-v", SPEC, 0, do_verbose, "-v Show lots of detail while working (verbose)."}, {"-v", SPEC, 0, do_verbose, "-v Show lots of detail while working (verbose)."},
{"dump", DUMP, 2, do_dump, "dump <dll> Dumps the content of the dll named <dll>"}, {"dump", DUMP, 2, do_dump, "dump <mod> Dumps the content of the module (dll, exe...) named <mod>"},
{"-C", DUMP, 0, do_symdmngl, "-C Turns on symbol demangling"}, {"-C", DUMP, 0, do_symdmngl, "-C Turns on symbol demangling"},
{"-f", DUMP, 0, do_dumphead, "-f Dumps file header information"}, {"-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)"}, {"-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"); 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 * main
@ -274,6 +297,7 @@ int main (int argc, char *argv[])
VERBOSE = 1; VERBOSE = 1;
symbol_init (&symbol, globals.input_name); symbol_init (&symbol, globals.input_name);
globals.input_module = "";
if (symbol_demangle (&symbol) == -1) if (symbol_demangle (&symbol) == -1)
fatal( "Symbol hasn't got a mangled name\n"); fatal( "Symbol hasn't got a mangled name\n");
if (symbol.flags & SYM_DATA) if (symbol.flags & SYM_DATA)
@ -285,6 +309,7 @@ int main (int argc, char *argv[])
break; break;
case SPEC: case SPEC:
set_module_name(1);
dll_open (globals.input_name); dll_open (globals.input_name);
output_spec_preamble (); output_spec_preamble ();
@ -335,7 +360,7 @@ int main (int argc, char *argv[])
do_usage(); do_usage();
break; break;
case DUMP: case DUMP:
globals.uc_dll_name = ""; set_module_name(0);
dump_file(globals.input_name); dump_file(globals.input_name);
break; break;
} }

View File

@ -487,15 +487,43 @@ static char *demangle_datatype (char **str, compound_type *ct,
/* FIXME: P6 = Function pointer, others who knows.. */ /* FIXME: P6 = Function pointer, others who knows.. */
if (isdigit (*iter)) if (isdigit (*iter))
{ {
if (*iter == '6') printf("Function pointer in argument list is not handled yet\n"); if (*iter == '6')
return NULL; {
/* 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 */ ct->expression = get_pointer_type_string (ct, sub_ct.expression);
if (!demangle_datatype (&iter, &sub_ct, sym)) }
return NULL;
ct->expression = get_pointer_type_string (ct, sub_ct.expression);
FREE_CT (sub_ct); FREE_CT (sub_ct);
} }

View File

@ -33,7 +33,7 @@ void output_spec_preamble (void)
puts ("Creating .spec preamble"); puts ("Creating .spec preamble");
fprintf (specfile, 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" "type win32\ninit %s_Init\n\nimport kernel32.dll\n"
"import ntdll.dll\n", globals.input_name, OUTPUT_DLL_NAME, "import ntdll.dll\n", globals.input_name, OUTPUT_DLL_NAME,
OUTPUT_UC_DLL_NAME); OUTPUT_UC_DLL_NAME);
@ -199,7 +199,7 @@ void output_c_preamble (void)
atexit (output_c_postamble); atexit (output_c_postamble);
fprintf (cfile, 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 */" " * DO NOT SUBMIT GENERATED DLLS FOR INCLUSION INTO WINE!\n * \n */"
"\n\n#include \"%s_dll.h\"\n\nDEFAULT_DEBUG_CHANNEL(%s);\n\n", "\n\n#include \"%s_dll.h\"\n\nDEFAULT_DEBUG_CHANNEL(%s);\n\n",
OUTPUT_DLL_NAME, globals.input_name, OUTPUT_DLL_NAME, OUTPUT_DLL_NAME, globals.input_name, OUTPUT_DLL_NAME,
@ -419,7 +419,7 @@ void output_makefile (void)
puts ("Creating makefile"); puts ("Creating makefile");
fprintf (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" "TOPOBJDIR = ../..\nSRCDIR = @srcdir@\nVPATH = @srcdir@\n"
"MODULE = %s\nEXTRALIBS = $(LIBUNICODE)\n\n" "MODULE = %s\nEXTRALIBS = $(LIBUNICODE)\n\n"
"LDDLLFLAGS = @LDDLLFLAGS@\nSYMBOLFILE = $(MODULE).tmp.o\n\n" "LDDLLFLAGS = @LDDLLFLAGS@\nSYMBOLFILE = $(MODULE).tmp.o\n\n"

View File

@ -653,20 +653,13 @@ static enum FileSig check_headers(void)
int pe_analysis(const char* name, void (*fn)(void), enum FileSig wanted_sig) int pe_analysis(const char* name, void (*fn)(void), enum FileSig wanted_sig)
{ {
int fd; int fd;
int len;
enum FileSig effective_sig; enum FileSig effective_sig;
int ret = 1; int ret = 1;
struct stat s; struct stat s;
char *name_suffix;
setbuf(stdout, NULL); 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 (fd == -1) fatal("Can't open file");
if (fstat(fd, &s) < 0) fatal("Can't get size"); 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)); pFunc = RVA(exportDir->AddressOfFunctions, exportDir->NumberOfFunctions * sizeof(DWORD));
if (!pFunc) {printf("Can't grab functions' address table\n"); return;} 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++) for (i = 0; i < exportDir->NumberOfFunctions; i++)
{ {
if (pFunc[i] && !(map[i / 32] & (1 << (i % 32)))) if (pFunc[i] && !(map[i / 32] & (1 << (i % 32))))

View File

@ -88,6 +88,7 @@ typedef struct __globals
/* Option arguments: generic */ /* Option arguments: generic */
const char *input_name; /* */ const char *input_name; /* */
const char *input_module; /* input module name generated after input_name according mode */
/* Options: spec mode */ /* Options: spec mode */
int do_code; /* -c, -t, -f */ int do_code; /* -c, -t, -f */
@ -118,7 +119,7 @@ extern _globals globals;
/* Names to use for output DLL */ /* Names to use for output DLL */
#define OUTPUT_DLL_NAME \ #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 #define OUTPUT_UC_DLL_NAME globals.uc_dll_name
/* Verbosity levels */ /* Verbosity levels */