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