[PATCH 2/8] [DbgHelp]: implemented SymFunctionTableAccess
Eric Pouech
eric.pouech at orange.fr
Sat Mar 20 03:47:24 CDT 2010
A+
---
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)
More information about the wine-patches
mailing list