diff --git a/dlls/dbghelp/cpu_i386.c b/dlls/dbghelp/cpu_i386.c index f3de6523539..47610e69676 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 fca5ec76ccf..6efa3f85362 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 cd0e32c5081..a56a80015bf 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 42234ee16cc..54b7272b211 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 250c5a5854a..eadc67a9ada 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 650f6a28086..fa9459e451b 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -1793,24 +1793,6 @@ BOOL WINAPI SymGetLineNext(HANDLE hProcess, PIMAGEHLP_LINE Line) return TRUE; } -/*********************************************************************** - * 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.@) */