Signed-off-by: Alistair Leslie-Hughes leslie_alistair@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; }