Module: wine Branch: master Commit: bf97b03db5daea7d0d622fa21d2a40875fe259f2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bf97b03db5daea7d0d622fa21d...
Author: Eric Pouech eric.pouech@orange.fr Date: Sat Mar 20 09:47:24 2010 +0100
dbghelp: Implemented SymFunctionTableAccess.
---
dlls/dbghelp/cpu_i386.c | 1 + dlls/dbghelp/cpu_ppc.c | 1 + dlls/dbghelp/cpu_x86_64.c | 30 ++++++++++++++++++++++++++++++ dlls/dbghelp/dbghelp_private.h | 3 +++ dlls/dbghelp/module.c | 23 +++++++++++++++++++++++ dlls/dbghelp/symbol.c | 18 ------------------ 6 files changed, 58 insertions(+), 18 deletions(-)
diff --git a/dlls/dbghelp/cpu_i386.c b/dlls/dbghelp/cpu_i386.c index f3de652..47610e6 100644 --- a/dlls/dbghelp/cpu_i386.c +++ b/dlls/dbghelp/cpu_i386.c @@ -409,4 +409,5 @@ struct cpu cpu_i386 = { 4, i386_get_addr, i386_stack_walk, + NULL, }; diff --git a/dlls/dbghelp/cpu_ppc.c b/dlls/dbghelp/cpu_ppc.c index fca5ec7..6efa3f8 100644 --- a/dlls/dbghelp/cpu_ppc.c +++ b/dlls/dbghelp/cpu_ppc.c @@ -59,4 +59,5 @@ struct cpu cpu_ppc = { 4, ppc_get_addr, ppc_stack_walk, + NULL, }; diff --git a/dlls/dbghelp/cpu_x86_64.c b/dlls/dbghelp/cpu_x86_64.c index cd0e32c..a56a800 100644 --- a/dlls/dbghelp/cpu_x86_64.c +++ b/dlls/dbghelp/cpu_x86_64.c @@ -124,9 +124,39 @@ done_err: return FALSE; }
+static void* x86_64_find_runtime_function(struct module* module, DWORD64 addr) +{ +#ifdef __x86_64__ + RUNTIME_FUNCTION* rtf; + ULONG size; + int min, max; + + rtf = (RUNTIME_FUNCTION*)pe_map_directory(module, IMAGE_DIRECTORY_ENTRY_EXCEPTION, &size); + if (rtf) for (min = 0, max = size / sizeof(*rtf); min <= max; ) + { + int pos = (min + max) / 2; + if (addr < module->module.BaseOfImage + rtf[pos].BeginAddress) max = pos - 1; + else if (addr >= module->module.BaseOfImage + rtf[pos].EndAddress) min = pos + 1; + else + { + rtf += pos; + while (rtf->UnwindData & 1) /* follow chained entry */ + { + FIXME("RunTime_Function outside IMAGE_DIRECTORY_ENTRY_EXCEPTION unimplemented yet!\n"); + /* we need to read into the other process */ + /* rtf = (RUNTIME_FUNCTION*)(module->module.BaseOfImage + (rtf->UnwindData & ~1)); */ + } + return rtf; + } + } +#endif + return NULL; +} + struct cpu cpu_x86_64 = { IMAGE_FILE_MACHINE_AMD64, 8, x86_64_get_addr, x86_64_stack_walk, + x86_64_find_runtime_function, }; diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index 42234ee..54b7272 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -475,6 +475,9 @@ struct cpu
/* stack manipulation */ BOOL (*stack_walk)(struct cpu_stack_walk* csw, LPSTACKFRAME64 frame); + + /* module manipulation */ + void* (*find_runtime_function)(struct module*, DWORD64 addr); };
extern struct cpu* dbghelp_current_cpu; diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c index 250c5a5..eadc67a 100644 --- a/dlls/dbghelp/module.c +++ b/dlls/dbghelp/module.c @@ -1087,3 +1087,26 @@ BOOL WINAPI SymRefreshModuleList(HANDLE hProcess)
return refresh_module_list(pcs); } + +/*********************************************************************** + * SymFunctionTableAccess (DBGHELP.@) + */ +PVOID WINAPI SymFunctionTableAccess(HANDLE hProcess, DWORD AddrBase) +{ + return SymFunctionTableAccess64(hProcess, AddrBase); +} + +/*********************************************************************** + * SymFunctionTableAccess64 (DBGHELP.@) + */ +PVOID WINAPI SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase) +{ + struct process* pcs = process_find_by_handle(hProcess); + struct module* module; + + if (!pcs || !dbghelp_current_cpu->find_runtime_function) return NULL; + module = module_find_by_addr(pcs, AddrBase, DMT_UNKNOWN); + if (!module) return NULL; + + return dbghelp_current_cpu->find_runtime_function(module, AddrBase); +} diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 650f6a2..fa9459e 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -1794,24 +1794,6 @@ BOOL WINAPI SymGetLineNext(HANDLE hProcess, PIMAGEHLP_LINE Line) }
/*********************************************************************** - * SymFunctionTableAccess (DBGHELP.@) - */ -PVOID WINAPI SymFunctionTableAccess(HANDLE hProcess, DWORD AddrBase) -{ - WARN("(%p, 0x%08x): stub\n", hProcess, AddrBase); - return NULL; -} - -/*********************************************************************** - * SymFunctionTableAccess64 (DBGHELP.@) - */ -PVOID WINAPI SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase) -{ - WARN("(%p, %s): stub\n", hProcess, wine_dbgstr_longlong(AddrBase)); - return NULL; -} - -/*********************************************************************** * SymUnDName (DBGHELP.@) */ BOOL WINAPI SymUnDName(PIMAGEHLP_SYMBOL sym, PSTR UnDecName, DWORD UnDecNameLength)