Module: wine Branch: master Commit: c050df1250f81a2e7f1658fe282ce207be6c8e5e URL: https://source.winehq.org/git/wine.git/?a=commit;h=c050df1250f81a2e7f1658fe2...
Author: Alexandre Julliard julliard@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@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",