Eric Pouech : winedbg: Use 64 bit version of imagehlp_module.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jun 27 04:53:43 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 82ed6a45786c6abdc5dbcb76c7171812fc5af61f
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=82ed6a45786c6abdc5dbcb76c7171812fc5af61f
Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date: Mon Jun 26 21:37:39 2006 +0200
winedbg: Use 64 bit version of imagehlp_module.
This allows reimplementing the module list command and do less black
magic to guess the ELF debug format.
---
programs/winedbg/info.c | 62 ++++++++++++++++++++++++++++-------------------
1 files changed, 37 insertions(+), 25 deletions(-)
diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c
index 6fc5b3f..8584d47 100644
--- a/programs/winedbg/info.c
+++ b/programs/winedbg/info.c
@@ -117,11 +117,10 @@ void info_help(void)
while (infotext[i]) dbg_printf("%s\n", infotext[i++]);
}
-static const char* get_symtype_str(SYM_TYPE st)
+static const char* get_symtype_str(const IMAGEHLP_MODULE64* mi)
{
- switch (st)
+ switch (mi->SymType)
{
- case -1: return "\\";
default:
case SymNone: return "--none--";
case SymCoff: return "COFF";
@@ -130,40 +129,53 @@ static const char* get_symtype_str(SYM_T
case SymExport: return "Export";
case SymDeferred: return "Deferred";
case SymSym: return "Sym";
- case SymDia: return "DIA";
- case NumSymTypes: return "Stabs";
+ case SymDia:
+ switch (mi->CVSig)
+ {
+ case 'S' | ('T' << 8) | ('A' << 16) | ('B' << 24):
+ return "Stabs";
+ case 'D' | ('W' << 8) | ('A' << 16) | ('R' << 24):
+ return "Dwarf";
+ default:
+ return "DIA";
+
+ }
}
}
struct info_module
{
- IMAGEHLP_MODULE* mi;
+ IMAGEHLP_MODULE64* mi;
unsigned num_alloc;
unsigned num_used;
};
-static void module_print_info(const IMAGEHLP_MODULE* mi, SYM_TYPE st)
+static void module_print_info(const IMAGEHLP_MODULE64* mi, BOOL is_embedded)
{
- dbg_printf("0x%08lx-%08lx\t%-16s%s\n",
- mi->BaseOfImage, mi->BaseOfImage + mi->ImageSize,
- get_symtype_str(st), mi->ModuleName);
+ dbg_printf("%s-%s\t%-16s%s\n",
+ wine_dbgstr_longlong(mi->BaseOfImage),
+ wine_dbgstr_longlong(mi->BaseOfImage + mi->ImageSize),
+ is_embedded ? "\\" : get_symtype_str(mi), mi->ModuleName);
}
static int module_compare(const void* p1, const void* p2)
{
- return (char*)(((const IMAGEHLP_MODULE*)p1)->BaseOfImage) -
- (char*)(((const IMAGEHLP_MODULE*)p2)->BaseOfImage);
+ LONGLONG val = ((const IMAGEHLP_MODULE64*)p1)->BaseOfImage -
+ ((const IMAGEHLP_MODULE64*)p2)->BaseOfImage;
+ if (val < 0) return -1;
+ else if (val > 0) return 1;
+ else return 0;
}
-static inline BOOL module_is_container(const IMAGEHLP_MODULE* wmod_cntnr,
- const IMAGEHLP_MODULE* wmod_child)
+static inline BOOL module_is_container(const IMAGEHLP_MODULE64* wmod_cntnr,
+ const IMAGEHLP_MODULE64* wmod_child)
{
return wmod_cntnr->BaseOfImage <= wmod_child->BaseOfImage &&
- (DWORD)wmod_cntnr->BaseOfImage + wmod_cntnr->ImageSize >=
- (DWORD)wmod_child->BaseOfImage + wmod_child->ImageSize;
+ wmod_cntnr->BaseOfImage + wmod_cntnr->ImageSize >=
+ wmod_child->BaseOfImage + wmod_child->ImageSize;
}
-static BOOL CALLBACK info_mod_cb(PSTR mod_name, DWORD base, void* ctx)
+static BOOL CALLBACK info_mod_cb(PSTR mod_name, DWORD64 base, void* ctx)
{
struct info_module* im = (struct info_module*)ctx;
@@ -173,7 +185,7 @@ static BOOL CALLBACK info_mod_cb(PSTR mo
im->mi = dbg_heap_realloc(im->mi, im->num_alloc * sizeof(*im->mi));
}
im->mi[im->num_used].SizeOfStruct = sizeof(im->mi[im->num_used]);
- if (SymGetModuleInfo(dbg_curr_process->handle, base, &im->mi[im->num_used]))
+ if (SymGetModuleInfo64(dbg_curr_process->handle, base, &im->mi[im->num_used]))
{
im->num_used++;
}
@@ -195,16 +207,16 @@ void info_win32_module(DWORD base)
if (base)
{
- IMAGEHLP_MODULE mi;
+ IMAGEHLP_MODULE64 mi;
mi.SizeOfStruct = sizeof(mi);
- if (!SymGetModuleInfo(dbg_curr_process->handle, base, &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, mi.SymType);
+ module_print_info(&mi, FALSE);
}
else
{
@@ -219,7 +231,7 @@ void info_win32_module(DWORD base)
* enumeration
*/
SymSetOptions((opt = SymGetOptions()) | 0x40000000);
- SymEnumerateModules(dbg_curr_process->handle, info_mod_cb, (void*)&im);
+ SymEnumerateModules64(dbg_curr_process->handle, info_mod_cb, (void*)&im);
SymSetOptions(opt);
qsort(im.mi, im.num_used, sizeof(im.mi[0]), module_compare);
@@ -231,14 +243,14 @@ void info_win32_module(DWORD base)
if (strstr(im.mi[i].ModuleName, "<elf>"))
{
dbg_printf("ELF\t");
- module_print_info(&im.mi[i], (im.mi[i].SymType == SymDia) ? NumSymTypes : im.mi[i].SymType);
+ 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]))
{
dbg_printf(" \\-PE\t");
- module_print_info(&im.mi[j], -1);
+ module_print_info(&im.mi[j], TRUE);
}
}
}
@@ -255,7 +267,7 @@ void info_win32_module(DWORD base)
dbg_printf("ELF\t");
else
dbg_printf("PE\t");
- module_print_info(&im.mi[i], im.mi[i].SymType);
+ module_print_info(&im.mi[i], FALSE);
}
}
HeapFree(GetProcessHeap(), 0, im.mi);
More information about the wine-cvs
mailing list