[PATCH] dbghelp: Make SymGetLineFromAddr64 call SymGetLineFromAddrW64

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Thu Mar 9 21:24:50 CST 2017


Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
 dlls/dbghelp/dbghelp_private.h |  3 ++
 dlls/dbghelp/symbol.c          | 96 ++++++++++++++++++++++++++++++------------
 2 files changed, 73 insertions(+), 26 deletions(-)

diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index 684111c..f2bda8d 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -727,6 +727,9 @@ extern struct symt_hierarchy_point*
 extern BOOL         symt_fill_func_line_info(const struct module* module,
                                              const struct symt_function* func,
                                              DWORD64 addr, IMAGEHLP_LINE64* line) DECLSPEC_HIDDEN;
+extern BOOL         symt_fill_func_line_info64W(const struct module* module,
+                                             const struct symt_function* func,
+                                             DWORD64 addr, IMAGEHLP_LINEW64* line) DECLSPEC_HIDDEN;
 extern BOOL         symt_get_func_line_next(const struct module* module, PIMAGEHLP_LINE64 line) DECLSPEC_HIDDEN;
 extern struct symt_thunk*
                     symt_new_thunk(struct module* module, 
diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index 08ea834..7a18d8b 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -1456,6 +1456,48 @@ BOOL symt_fill_func_line_info(const struct module* module, const struct symt_fun
         if (found)
         {
             line->FileName = (char*)source_get(module, dli->u.source_file);
+
+            return TRUE;
+        }
+    }
+    return FALSE;
+}
+
+/******************************************************************
+ *		sym_fill_func_line_info64W
+ *
+ * fills information about a file
+ */
+BOOL symt_fill_func_line_info64W(const struct module* module, const struct symt_function* func,
+                              DWORD64 addr, IMAGEHLP_LINEW64* line)
+{
+    struct line_info*   dli = NULL;
+    BOOL                found = FALSE;
+    int                 i;
+
+    assert(func->symt.tag == SymTagFunction);
+
+    for (i=vector_length(&func->vlines)-1; i>=0; i--)
+    {
+        dli = vector_at(&func->vlines, i);
+        if (!dli->is_source_file)
+        {
+            if (found || dli->u.pc_offset > addr) continue;
+            line->LineNumber = dli->line_number;
+            line->Address    = dli->u.pc_offset;
+            line->Key        = dli;
+            found = TRUE;
+            continue;
+        }
+        if (found)
+        {
+            char *filename = (char*)source_get(module, dli->u.source_file);
+            int len = lstrlenA(filename)+1;
+
+            line->FileName = fetch_buffer(module->process, len * sizeof(WCHAR));
+
+            MultiByteToWideChar(CP_ACP, 0, filename, -1, line->FileName, len);
+
             return TRUE;
         }
     }
@@ -1525,16 +1567,17 @@ static void copy_line_64_from_32(IMAGEHLP_LINE64* l64, const IMAGEHLP_LINE* l32)
  *		copy_line_W64_from_32 (internal)
  *
  */
-static void copy_line_W64_from_64(struct process* pcs, IMAGEHLP_LINEW64* l64w, const IMAGEHLP_LINE64* l64)
+static void copy_line_64_from_W64(struct process* pcs, IMAGEHLP_LINE64* l64, const IMAGEHLP_LINEW64* l64w)
 {
-    unsigned len;
+    char path[MAX_PATH];
+    unsigned len = WideCharToMultiByte(CP_ACP, 0, l64w->FileName, -1, path, MAX_PATH, NULL, NULL);
+
+    l64->Key = l64w->Key;
+    l64->LineNumber = l64w->LineNumber;
+    l64->FileName = fetch_buffer(pcs, len + 1);
+    lstrcpyA(l64->FileName, path);
 
-    l64w->Key = l64->Key;
-    l64w->LineNumber = l64->LineNumber;
-    len = MultiByteToWideChar(CP_ACP, 0, l64->FileName, -1, NULL, 0);
-    if ((l64w->FileName = fetch_buffer(pcs, len * sizeof(WCHAR))))
-        MultiByteToWideChar(CP_ACP, 0, l64->FileName, -1, l64w->FileName, len);
-    l64w->Address = l64->Address;
+    l64->Address = l64w->Address;
 }
 
 /******************************************************************
@@ -1573,13 +1616,29 @@ BOOL WINAPI SymGetLineFromAddr(HANDLE hProcess, DWORD dwAddr,
 BOOL WINAPI SymGetLineFromAddr64(HANDLE hProcess, DWORD64 dwAddr, 
                                  PDWORD pdwDisplacement, PIMAGEHLP_LINE64 Line)
 {
-    struct module_pair  pair;
-    struct symt_ht*     symt;
+    IMAGEHLP_LINEW64 line64;
+    BOOL ret;
 
     TRACE("%p %s %p %p\n", hProcess, wine_dbgstr_longlong(dwAddr), pdwDisplacement, Line);
 
     if (Line->SizeOfStruct < sizeof(*Line)) return FALSE;
 
+    line64.SizeOfStruct = sizeof(line64);
+    ret = SymGetLineFromAddrW64(hProcess, dwAddr, pdwDisplacement, &line64);
+    copy_line_64_from_W64(process_find_by_handle(hProcess), Line, &line64);
+    return ret;
+}
+
+/******************************************************************
+ *		SymGetLineFromAddrW64 (DBGHELP.@)
+ *
+ */
+BOOL WINAPI SymGetLineFromAddrW64(HANDLE hProcess, DWORD64 dwAddr,
+                                  PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line)
+{
+    struct module_pair  pair;
+    struct symt_ht*     symt;
+
     pair.pcs = process_find_by_handle(hProcess);
     if (!pair.pcs) return FALSE;
     pair.requested = module_find_by_addr(pair.pcs, dwAddr, DMT_UNKNOWN);
@@ -1587,25 +1646,10 @@ BOOL WINAPI SymGetLineFromAddr64(HANDLE hProcess, DWORD64 dwAddr,
     if ((symt = symt_find_nearest(pair.effective, dwAddr)) == NULL) return FALSE;
 
     if (symt->symt.tag != SymTagFunction) return FALSE;
-    if (!symt_fill_func_line_info(pair.effective, (struct symt_function*)symt,
+    if (!symt_fill_func_line_info64W(pair.effective, (struct symt_function*)symt,
                                   dwAddr, Line)) return FALSE;
     *pdwDisplacement = dwAddr - Line->Address;
-    return TRUE;
-}
-
-/******************************************************************
- *		SymGetLineFromAddrW64 (DBGHELP.@)
- *
- */
-BOOL WINAPI SymGetLineFromAddrW64(HANDLE hProcess, DWORD64 dwAddr, 
-                                  PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line)
-{
-    IMAGEHLP_LINE64     il64;
 
-    il64.SizeOfStruct = sizeof(il64);
-    if (!SymGetLineFromAddr64(hProcess, dwAddr, pdwDisplacement, &il64))
-        return FALSE;
-    copy_line_W64_from_64(process_find_by_handle(hProcess), Line, &il64);
     return TRUE;
 }
 
-- 
1.9.1




More information about the wine-patches mailing list