Alexandre Julliard : ntdll: Implemented RtlLookupFunctionEntry for x86_64.
Alexandre Julliard
julliard at winehq.org
Fri May 22 08:25:33 CDT 2009
Module: wine
Branch: master
Commit: 7634ce154a3c56aef1bca170c17bac7a5e5bce52
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7634ce154a3c56aef1bca170c17bac7a5e5bce52
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri May 22 11:48:30 2009 +0200
ntdll: Implemented RtlLookupFunctionEntry for x86_64.
---
dlls/ntdll/signal_x86_64.c | 50 ++++++++++++++++++++++++++++++++++++++++---
1 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index 1c315d1..cc65dc8 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -620,6 +620,31 @@ NTSTATUS context_from_server( CONTEXT *to, const context_t *from )
/**********************************************************************
+ * find_function_info
+ */
+static RUNTIME_FUNCTION *find_function_info( ULONG64 pc, HMODULE module,
+ RUNTIME_FUNCTION *func, ULONG size )
+{
+ int min = 0;
+ int max = size/sizeof(*func) - 1;
+
+ while (min <= max)
+ {
+ int pos = (min + max) / 2;
+ if ((char *)pc < (char *)module + func[pos].BeginAddress) max = pos - 1;
+ else if ((char *)pc >= (char *)module + func[pos].EndAddress) min = pos + 1;
+ else
+ {
+ func += pos;
+ while (func->UnwindData & 1) /* follow chained entry */
+ func = (RUNTIME_FUNCTION *)((char *)module + (func->UnwindData & ~1));
+ return func;
+ }
+ }
+ return NULL;
+}
+
+/**********************************************************************
* call_stack_handlers
*
* Call the stack handlers chain.
@@ -1019,11 +1044,28 @@ void signal_init_process(void)
/**********************************************************************
* RtlLookupFunctionEntry (NTDLL.@)
*/
-PRUNTIME_FUNCTION WINAPI RtlLookupFunctionEntry( ULONG64 pc, ULONG64 *base,
- UNWIND_HISTORY_TABLE *table )
+PRUNTIME_FUNCTION WINAPI RtlLookupFunctionEntry( ULONG64 pc, ULONG64 *base, UNWIND_HISTORY_TABLE *table )
{
- FIXME("stub\n");
- return NULL;
+ LDR_MODULE *module;
+ RUNTIME_FUNCTION *func;
+ ULONG size;
+
+ /* FIXME: should use the history table to make things faster */
+
+ if (LdrFindEntryForAddress( (void *)pc, &module ))
+ {
+ WARN( "module not found for %lx\n", pc );
+ return NULL;
+ }
+ if (!(func = RtlImageDirectoryEntryToData( module->BaseAddress, TRUE,
+ IMAGE_DIRECTORY_ENTRY_EXCEPTION, &size )))
+ {
+ WARN( "no exception table found in module %p pc %lx\n", module->BaseAddress, pc );
+ return NULL;
+ }
+ func = find_function_info( pc, module->BaseAddress, func, size );
+ if (func) *base = (ULONG64)module->BaseAddress;
+ return func;
}
static ULONG64 get_int_reg( CONTEXT *context, int reg )
More information about the wine-cvs
mailing list