From 9500df82f1d64cb413527b182b8805b8f990c60b Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Mon, 14 Dec 2009 22:06:17 +0100 Subject: [PATCH] dbghelp: Move the core of some line related functions to 64bit interface. --- dlls/dbghelp/dbghelp_private.h | 4 +- dlls/dbghelp/stabs.c | 2 +- dlls/dbghelp/symbol.c | 178 ++++++++++++++++----------------- 3 files changed, 89 insertions(+), 95 deletions(-) diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index fd5ec0db284..b793d144990 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -589,8 +589,8 @@ extern struct symt_hierarchy_point* const char* name); extern BOOL symt_fill_func_line_info(const struct module* module, const struct symt_function* func, - DWORD addr, IMAGEHLP_LINE* line); -extern BOOL symt_get_func_line_next(const struct module* module, PIMAGEHLP_LINE line); + DWORD64 addr, IMAGEHLP_LINE64* line); +extern BOOL symt_get_func_line_next(const struct module* module, PIMAGEHLP_LINE64 line); extern struct symt_thunk* symt_new_thunk(struct module* module, struct symt_compiland* parent, diff --git a/dlls/dbghelp/stabs.c b/dlls/dbghelp/stabs.c index 8d2c12d1cc2..bc5b67409ad 100644 --- a/dlls/dbghelp/stabs.c +++ b/dlls/dbghelp/stabs.c @@ -1235,7 +1235,7 @@ static void pending_flush(struct pending_list* pending, struct module* module, static void stabs_finalize_function(struct module* module, struct symt_function* func, unsigned long size) { - IMAGEHLP_LINE il; + IMAGEHLP_LINE64 il; struct location loc; if (!func) return; diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index d686b4ace0b..32090671d37 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -1486,7 +1486,7 @@ BOOL WINAPI SymGetSymFromName(HANDLE hProcess, PCSTR Name, PIMAGEHLP_SYMBOL Symb * fills information about a file */ BOOL symt_fill_func_line_info(const struct module* module, const struct symt_function* func, - DWORD addr, IMAGEHLP_LINE* line) + DWORD64 addr, IMAGEHLP_LINE64* line) { struct line_info* dli = NULL; BOOL found = FALSE; @@ -1561,17 +1561,75 @@ BOOL WINAPI SymGetSymPrev(HANDLE hProcess, PIMAGEHLP_SYMBOL Symbol) return FALSE; } +/****************************************************************** + * copy_line_64_from_32 (internal) + * + */ +static void copy_line_64_from_32(IMAGEHLP_LINE64* l64, const IMAGEHLP_LINE* l32) + +{ + l64->Key = l32->Key; + l64->LineNumber = l32->LineNumber; + l64->FileName = l32->FileName; + l64->Address = l32->Address; +} + +/****************************************************************** + * copy_line_W64_from_32 (internal) + * + */ +static void copy_line_W64_from_64(struct process* pcs, IMAGEHLP_LINEW64* l64w, const IMAGEHLP_LINE64* l64) +{ + unsigned len; + + 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; +} + +/****************************************************************** + * copy_line_32_from_64 (internal) + * + */ +static void copy_line_32_from_64(IMAGEHLP_LINE* l32, const IMAGEHLP_LINE64* l64) + +{ + l32->Key = l64->Key; + l32->LineNumber = l64->LineNumber; + l32->FileName = l64->FileName; + l32->Address = l64->Address; +} + /****************************************************************** * SymGetLineFromAddr (DBGHELP.@) * */ -BOOL WINAPI SymGetLineFromAddr(HANDLE hProcess, DWORD dwAddr, +BOOL WINAPI SymGetLineFromAddr(HANDLE hProcess, DWORD dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINE Line) +{ + IMAGEHLP_LINE64 il64; + + il64.SizeOfStruct = sizeof(il64); + if (!SymGetLineFromAddr64(hProcess, dwAddr, pdwDisplacement, &il64)) + return FALSE; + copy_line_32_from_64(Line, &il64); + return TRUE; +} + +/****************************************************************** + * SymGetLineFromAddr64 (DBGHELP.@) + * + */ +BOOL WINAPI SymGetLineFromAddr64(HANDLE hProcess, DWORD64 dwAddr, + PDWORD pdwDisplacement, PIMAGEHLP_LINE64 Line) { struct module_pair pair; struct symt_ht* symt; - TRACE("%p %08x %p %p\n", hProcess, dwAddr, pdwDisplacement, Line); + TRACE("%p %s %p %p\n", hProcess, wine_dbgstr_longlong(dwAddr), pdwDisplacement, Line); if (Line->SizeOfStruct < sizeof(*Line)) return FALSE; @@ -1588,66 +1646,6 @@ BOOL WINAPI SymGetLineFromAddr(HANDLE hProcess, DWORD dwAddr, return TRUE; } -/****************************************************************** - * copy_line_64_from_32 (internal) - * - */ -static void copy_line_64_from_32(IMAGEHLP_LINE64* l64, const IMAGEHLP_LINE* l32) - -{ - l64->Key = l32->Key; - l64->LineNumber = l32->LineNumber; - l64->FileName = l32->FileName; - l64->Address = l32->Address; -} - -/****************************************************************** - * copy_line_W64_from_32 (internal) - * - */ -static void copy_line_W64_from_32(struct process* pcs, IMAGEHLP_LINEW64* l64, const IMAGEHLP_LINE* l32) -{ - unsigned len; - - l64->Key = l32->Key; - l64->LineNumber = l32->LineNumber; - len = MultiByteToWideChar(CP_ACP, 0, l32->FileName, -1, NULL, 0); - if ((l64->FileName = fetch_buffer(pcs, len * sizeof(WCHAR)))) - MultiByteToWideChar(CP_ACP, 0, l32->FileName, -1, l64->FileName, len); - l64->Address = l32->Address; -} - -/****************************************************************** - * copy_line_32_from_64 (internal) - * - */ -static void copy_line_32_from_64(IMAGEHLP_LINE* l32, const IMAGEHLP_LINE64* l64) - -{ - l32->Key = l64->Key; - l32->LineNumber = l64->LineNumber; - l32->FileName = l64->FileName; - l32->Address = l64->Address; -} - -/****************************************************************** - * SymGetLineFromAddr64 (DBGHELP.@) - * - */ -BOOL WINAPI SymGetLineFromAddr64(HANDLE hProcess, DWORD64 dwAddr, - PDWORD pdwDisplacement, PIMAGEHLP_LINE64 Line) -{ - IMAGEHLP_LINE line32; - - if (Line->SizeOfStruct < sizeof(*Line)) return FALSE; - if (!validate_addr64(dwAddr)) return FALSE; - line32.SizeOfStruct = sizeof(line32); - if (!SymGetLineFromAddr(hProcess, (DWORD)dwAddr, pdwDisplacement, &line32)) - return FALSE; - copy_line_64_from_32(Line, &line32); - return TRUE; -} - /****************************************************************** * SymGetLineFromAddrW64 (DBGHELP.@) * @@ -1655,24 +1653,20 @@ BOOL WINAPI SymGetLineFromAddr64(HANDLE hProcess, DWORD64 dwAddr, BOOL WINAPI SymGetLineFromAddrW64(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line) { - struct process* pcs = process_find_by_handle(hProcess); - IMAGEHLP_LINE line32; + IMAGEHLP_LINE64 il64; - if (!pcs) return FALSE; - if (Line->SizeOfStruct < sizeof(*Line)) return FALSE; - if (!validate_addr64(dwAddr)) return FALSE; - line32.SizeOfStruct = sizeof(line32); - if (!SymGetLineFromAddr(hProcess, (DWORD)dwAddr, pdwDisplacement, &line32)) + il64.SizeOfStruct = sizeof(il64); + if (!SymGetLineFromAddr64(hProcess, dwAddr, pdwDisplacement, &il64)) return FALSE; - copy_line_W64_from_32(pcs, Line, &line32); + copy_line_W64_from_64(process_find_by_handle(hProcess), Line, &il64); return TRUE; } /****************************************************************** - * SymGetLinePrev (DBGHELP.@) + * SymGetLinePrev64 (DBGHELP.@) * */ -BOOL WINAPI SymGetLinePrev(HANDLE hProcess, PIMAGEHLP_LINE Line) +BOOL WINAPI SymGetLinePrev64(HANDLE hProcess, PIMAGEHLP_LINE64 Line) { struct module_pair pair; struct line_info* li; @@ -1719,21 +1713,21 @@ BOOL WINAPI SymGetLinePrev(HANDLE hProcess, PIMAGEHLP_LINE Line) } /****************************************************************** - * SymGetLinePrev64 (DBGHELP.@) + * SymGetLinePrev (DBGHELP.@) * */ -BOOL WINAPI SymGetLinePrev64(HANDLE hProcess, PIMAGEHLP_LINE64 Line) +BOOL WINAPI SymGetLinePrev(HANDLE hProcess, PIMAGEHLP_LINE Line) { - IMAGEHLP_LINE line32; + IMAGEHLP_LINE64 line64; - line32.SizeOfStruct = sizeof(line32); - copy_line_32_from_64(&line32, Line); - if (!SymGetLinePrev(hProcess, &line32)) return FALSE; - copy_line_64_from_32(Line, &line32); + line64.SizeOfStruct = sizeof(line64); + copy_line_64_from_32(&line64, Line); + if (!SymGetLinePrev64(hProcess, &line64)) return FALSE; + copy_line_32_from_64(Line, &line64); return TRUE; } - -BOOL symt_get_func_line_next(const struct module* module, PIMAGEHLP_LINE line) + +BOOL symt_get_func_line_next(const struct module* module, PIMAGEHLP_LINE64 line) { struct line_info* li; @@ -1755,10 +1749,10 @@ BOOL symt_get_func_line_next(const struct module* module, PIMAGEHLP_LINE line) } /****************************************************************** - * SymGetLineNext (DBGHELP.@) + * SymGetLineNext64 (DBGHELP.@) * */ -BOOL WINAPI SymGetLineNext(HANDLE hProcess, PIMAGEHLP_LINE Line) +BOOL WINAPI SymGetLineNext64(HANDLE hProcess, PIMAGEHLP_LINE64 Line) { struct module_pair pair; @@ -1776,20 +1770,20 @@ BOOL WINAPI SymGetLineNext(HANDLE hProcess, PIMAGEHLP_LINE Line) } /****************************************************************** - * SymGetLineNext64 (DBGHELP.@) + * SymGetLineNext (DBGHELP.@) * */ -BOOL WINAPI SymGetLineNext64(HANDLE hProcess, PIMAGEHLP_LINE64 Line) +BOOL WINAPI SymGetLineNext(HANDLE hProcess, PIMAGEHLP_LINE Line) { - IMAGEHLP_LINE line32; + IMAGEHLP_LINE64 line64; - line32.SizeOfStruct = sizeof(line32); - copy_line_32_from_64(&line32, Line); - if (!SymGetLineNext(hProcess, &line32)) return FALSE; - copy_line_64_from_32(Line, &line32); + line64.SizeOfStruct = sizeof(line64); + copy_line_64_from_32(&line64, Line); + if (!SymGetLineNext64(hProcess, &line64)) return FALSE; + copy_line_32_from_64(Line, &line64); return TRUE; } - + /*********************************************************************** * SymFunctionTableAccess (DBGHELP.@) */