Module: wine Branch: refs/heads/master Commit: 6cff43fd72d5434623b74b557d0cfdaefd0728dc URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=6cff43fd72d5434623b74b55...
Author: Eric Pouech eric.pouech@wanadoo.fr Date: Mon Jun 26 21:37:42 2006 +0200
winedbg: Module info.
when requesting info on a module by address, always print the module ELF/PE pair (if this applies) (and not only the embedded PE), which can be confusing.
---
programs/winedbg/info.c | 100 ++++++++++++++++++++++------------------------- 1 files changed, 46 insertions(+), 54 deletions(-)
diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c index 8584d47..d2042bf 100644 --- a/programs/winedbg/info.c +++ b/programs/winedbg/info.c @@ -146,6 +146,7 @@ static const char* get_symtype_str(const struct info_module { IMAGEHLP_MODULE64* mi; + DWORD base; unsigned num_alloc; unsigned num_used; }; @@ -199,79 +200,70 @@ static BOOL CALLBACK info_mod_cb(PSTR mo */ void info_win32_module(DWORD base) { + struct info_module im; + int i, j, num_printed = 0; + DWORD opt; + if (!dbg_curr_process || !dbg_curr_thread) { dbg_printf("Cannot get info on module while no process is loaded\n"); return; }
- if (base) - { - IMAGEHLP_MODULE64 mi; - - mi.SizeOfStruct = sizeof(mi); - - if (!SymGetModuleInfo64(dbg_curr_process->handle, base, &mi)) - { - dbg_printf("'0x%08lx' is not a valid module address\n", base); - return; - } - module_print_info(&mi, FALSE); - } - else - { - struct info_module im; - int i, j; - DWORD opt; - - im.mi = NULL; - im.num_alloc = im.num_used = 0; + im.mi = NULL; + im.num_alloc = im.num_used = 0;
- /* this is a wine specific options to return also ELF modules in the - * enumeration - */ - SymSetOptions((opt = SymGetOptions()) | 0x40000000); - SymEnumerateModules64(dbg_curr_process->handle, info_mod_cb, (void*)&im); - SymSetOptions(opt); + /* this is a wine specific options to return also ELF modules in the + * enumeration + */ + SymSetOptions((opt = SymGetOptions()) | 0x40000000); + SymEnumerateModules64(dbg_curr_process->handle, info_mod_cb, (void*)&im); + SymSetOptions(opt);
- qsort(im.mi, im.num_used, sizeof(im.mi[0]), module_compare); + qsort(im.mi, im.num_used, sizeof(im.mi[0]), module_compare);
- dbg_printf("Module\tAddress\t\t\tDebug info\tName (%d modules)\n", im.num_used); + dbg_printf("Module\tAddress\t\t\tDebug info\tName (%d modules)\n", im.num_used);
- for (i = 0; i < im.num_used; i++) + for (i = 0; i < im.num_used; i++) + { + if (base && + (base < im.mi[i].BaseOfImage || base >= im.mi[i].BaseOfImage + im.mi[i].ImageSize)) + continue; + if (strstr(im.mi[i].ModuleName, "<elf>")) { - if (strstr(im.mi[i].ModuleName, "<elf>")) + dbg_printf("ELF\t"); + module_print_info(&im.mi[i], FALSE); + /* print all modules embedded in this one */ + for (j = 0; j < im.num_used; j++) { - dbg_printf("ELF\t"); - module_print_info(&im.mi[i], FALSE); - /* print all modules embedded in this one */ - for (j = 0; j < im.num_used; j++) + if (!strstr(im.mi[j].ModuleName, "<elf>") && module_is_container(&im.mi[i], &im.mi[j])) { - if (!strstr(im.mi[j].ModuleName, "<elf>") && module_is_container(&im.mi[i], &im.mi[j])) - { - dbg_printf(" \-PE\t"); - module_print_info(&im.mi[j], TRUE); - } + dbg_printf(" \-PE\t"); + module_print_info(&im.mi[j], TRUE); } } - else + } + else + { + /* check module is not embedded in another module */ + for (j = 0; j < im.num_used; j++) { - /* check module is not embedded in another module */ - for (j = 0; j < im.num_used; j++) - { - if (strstr(im.mi[j].ModuleName, "<elf>") && module_is_container(&im.mi[j], &im.mi[i])) - break; - } - if (j < im.num_used) continue; - if (strstr(im.mi[i].ModuleName, ".so") || strchr(im.mi[i].ModuleName, '<')) - dbg_printf("ELF\t"); - else - dbg_printf("PE\t"); - module_print_info(&im.mi[i], FALSE); + if (strstr(im.mi[j].ModuleName, "<elf>") && module_is_container(&im.mi[j], &im.mi[i])) + break; } + if (j < im.num_used) continue; + if (strstr(im.mi[i].ModuleName, ".so") || strchr(im.mi[i].ModuleName, '<')) + dbg_printf("ELF\t"); + else + dbg_printf("PE\t"); + module_print_info(&im.mi[i], FALSE); } - HeapFree(GetProcessHeap(), 0, im.mi); + num_printed++; } + HeapFree(GetProcessHeap(), 0, im.mi); + + if (base && !num_printed) + dbg_printf("'0x%08lx' is not a valid module address\n", base); }
struct class_walker