Alexandre Julliard : winedbg: Use GetMappedFileNameW() as fallback when fetching module names.
Alexandre Julliard
julliard at winehq.org
Tue Apr 13 16:31:20 CDT 2021
Module: wine
Branch: master
Commit: c050df1250f81a2e7f1658fe282ce207be6c8e5e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c050df1250f81a2e7f1658fe282ce207be6c8e5e
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Apr 13 12:29:38 2021 +0200
winedbg: Use GetMappedFileNameW() as fallback when fetching module names.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/winedbg/debugger.h | 1 +
programs/winedbg/gdbproxy.c | 6 ++----
programs/winedbg/tgt_active.c | 23 ++++++++++++++---------
3 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index 3bcf9d37f23..b7c765ac545 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -419,6 +419,7 @@ extern enum dbg_start dbg_active_auto(int argc, char* argv[]);
extern enum dbg_start dbg_active_minidump(int argc, char* argv[]);
extern void dbg_active_wait_for_first_exception(void);
extern BOOL dbg_attach_debuggee(DWORD pid);
+extern void fetch_module_name(void* name_addr, void* mod_addr, WCHAR* buffer, size_t bufsz);
/* tgt_minidump.c */
extern void minidump_write(const char*, const EXCEPTION_RECORD*);
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 4fd669032ec..478e0d16fe0 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -443,10 +443,8 @@ static BOOL handle_debug_event(struct gdb_context* gdbctx)
return TRUE;
case LOAD_DLL_DEBUG_EVENT:
- memory_get_string_indirect(gdbctx->process,
- de->u.LoadDll.lpImageName,
- de->u.LoadDll.fUnicode,
- u.buffer, ARRAY_SIZE(u.buffer));
+ fetch_module_name( de->u.LoadDll.lpImageName, de->u.LoadDll.lpBaseOfDll,
+ u.buffer, ARRAY_SIZE(u.buffer) );
fprintf(stderr, "%04x:%04x: loads DLL %s @%p (%u<%u>)\n",
de->dwProcessId, de->dwThreadId,
dbg_W2A(u.buffer, -1),
diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c
index a38fe41dfc5..c9072d5b81c 100644
--- a/programs/winedbg/tgt_active.c
+++ b/programs/winedbg/tgt_active.c
@@ -296,16 +296,23 @@ static DWORD dbg_handle_exception(const EXCEPTION_RECORD* rec, BOOL first_chance
static BOOL tgt_process_active_close_process(struct dbg_process* pcs, BOOL kill);
-static void fetch_module_name(void* name_addr, BOOL unicode, void* mod_addr,
- WCHAR* buffer, size_t bufsz)
+void fetch_module_name(void* name_addr, void* mod_addr, WCHAR* buffer, size_t bufsz)
{
static const WCHAR dlladdr[] = {'D','L','L','_','%','0','8','l','x',0};
- memory_get_string_indirect(dbg_curr_process, name_addr, unicode, buffer, bufsz);
- if (!buffer[0] &&
- !GetModuleFileNameExW(dbg_curr_process->handle, mod_addr, buffer, bufsz))
+ memory_get_string_indirect(dbg_curr_process, name_addr, TRUE, buffer, bufsz);
+ if (!buffer[0] && !GetModuleFileNameExW(dbg_curr_process->handle, mod_addr, buffer, bufsz))
{
- snprintfW(buffer, bufsz, dlladdr, (ULONG_PTR)mod_addr);
+ if (GetMappedFileNameW( dbg_curr_process->handle, mod_addr, buffer, bufsz ))
+ {
+ /* FIXME: proper NT->Dos conversion */
+ static const WCHAR nt_prefixW[] = {'\\','?','?','\\'};
+
+ if (!strncmpW( buffer, nt_prefixW, 4 ))
+ memmove( buffer, buffer + 4, (lstrlenW(buffer + 4) + 1) * sizeof(WCHAR) );
+ }
+ else
+ snprintfW(buffer, bufsz, dlladdr, (ULONG_PTR)mod_addr);
}
}
@@ -462,9 +469,7 @@ static unsigned dbg_handle_debug_event(DEBUG_EVENT* de)
WINE_ERR("Unknown thread\n");
break;
}
- fetch_module_name(de->u.LoadDll.lpImageName,
- de->u.LoadDll.fUnicode,
- de->u.LoadDll.lpBaseOfDll,
+ fetch_module_name(de->u.LoadDll.lpImageName, de->u.LoadDll.lpBaseOfDll,
u.buffer, ARRAY_SIZE(u.buffer));
WINE_TRACE("%04x:%04x: loads DLL %s @%p (%u<%u>)\n",
More information about the wine-cvs
mailing list