[PATCH 3/3] dbghelp: Reimplement SymGetLineFromAddr64 using SymGetLineFromAddrW64.

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Mon Jun 3 01:00:02 CDT 2019


Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
 dlls/dbghelp/symbol.c | 34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index 0f133c0d34..fec82950bb 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -1598,6 +1598,23 @@ static void copy_line_32_from_64(IMAGEHLP_LINE* l32, const IMAGEHLP_LINE64* l64)
     l32->Address = l64->Address;
 }
 
+/******************************************************************
+ *		copy_line_64_from_W64 (internal)
+ *
+ */
+static void copy_line_64_from_W64(struct process* pcs, IMAGEHLP_LINE64* l64, const IMAGEHLP_LINEW64* l64w)
+{
+    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);
+
+    l64->Address = l64w->Address;
+}
+
 /******************************************************************
  *		copy_line_32_from_64W (internal)
  *
@@ -1637,23 +1654,16 @@ 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;
 
     TRACE("%p %s %p %p\n", hProcess, wine_dbgstr_longlong(dwAddr), pdwDisplacement, Line);
 
     if (Line->SizeOfStruct < sizeof(*Line)) return FALSE;
 
-    pair.pcs = process_find_by_handle(hProcess);
-    if (!pair.pcs) return FALSE;
-    pair.requested = module_find_by_addr(pair.pcs, dwAddr, DMT_UNKNOWN);
-    if (!module_get_debug(&pair)) return FALSE;
-    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,
-                                  dwAddr, Line)) return FALSE;
-    *pdwDisplacement = dwAddr - Line->Address;
+    line64.SizeOfStruct = sizeof(line64);
+    if(!SymGetLineFromAddrW64(hProcess, dwAddr, pdwDisplacement, &line64))
+        return FALSE;
+    copy_line_64_from_W64(process_find_by_handle(hProcess), Line, &line64);
     return TRUE;
 }
 
-- 
2.17.1



More information about the wine-devel mailing list