Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/ntdll/signal_i386.c | 22 ++++++++++++++++------ dlls/ntdll/signal_x86_64.c | 35 +++++++++++++++++++++++------------ 2 files changed, 39 insertions(+), 18 deletions(-)
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 14971032ce6..0245aa602a1 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -481,17 +481,15 @@ __ASM_STDCALL_FUNC( RtlRaiseException, 4,
/************************************************************************* - * RtlCaptureStackBackTrace (NTDLL.@) + * capture_stack_back_trace */ -USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash ) +static USHORT capture_stack_back_trace( CONTEXT *context, ULONG skip, ULONG count, PVOID *buffer, ULONG *hash ) { - CONTEXT context; - ULONG i; ULONG *frame; + ULONG i;
- RtlCaptureContext( &context ); if (hash) *hash = 0; - frame = (ULONG *)context.Ebp; + frame = (ULONG *)context->Ebp;
while (skip--) { @@ -510,6 +508,18 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, }
+/************************************************************************* + * RtlCaptureStackBackTrace (NTDLL.@) + */ +USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash ) +{ + CONTEXT context; + + RtlCaptureContext( &context ); + return capture_stack_back_trace( &context, skip, count, buffer, hash ); +} + + /*********************************************************************** * signal_start_thread */ diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index ef32eba68b7..dbf622392b7 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -1490,27 +1490,23 @@ static inline ULONG hash_pointers( void **ptrs, ULONG count )
/************************************************************************* - * RtlCaptureStackBackTrace (NTDLL.@) + * capture_stack_back_trace */ -USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash ) +static USHORT capture_stack_back_trace( CONTEXT *context, ULONG skip, ULONG count, PVOID *buffer, ULONG *hash ) { - UNWIND_HISTORY_TABLE table; DISPATCHER_CONTEXT dispatch; - CONTEXT context; + UNWIND_HISTORY_TABLE table; + USHORT num_entries = 0; NTSTATUS status; ULONG i; - USHORT num_entries = 0;
- TRACE( "(%u, %u, %p, %p)\n", skip, count, buffer, hash ); - - RtlCaptureContext( &context ); dispatch.TargetIp = 0; - dispatch.ContextRecord = &context; + dispatch.ContextRecord = context; dispatch.HistoryTable = &table; if (hash) *hash = 0; for (i = 0; i < skip + count; i++) { - status = virtual_unwind( UNW_FLAG_NHANDLER, &dispatch, &context ); + status = virtual_unwind( UNW_FLAG_NHANDLER, &dispatch, context ); if (status != STATUS_SUCCESS) return i;
if (!dispatch.EstablisherFrame) break; @@ -1524,9 +1520,9 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, break; }
- if (context.Rsp == (ULONG64)NtCurrentTeb()->Tib.StackBase) break; + if (context->Rsp == (ULONG64)NtCurrentTeb()->Tib.StackBase) break;
- if (i >= skip) buffer[num_entries++] = (void *)context.Rip; + if (i >= skip) buffer[num_entries++] = (void *)context->Rip; } if (hash && num_entries > 0) *hash = hash_pointers( buffer, num_entries ); TRACE( "captured %hu frames\n", num_entries ); @@ -1534,6 +1530,21 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, }
+/************************************************************************* + * RtlCaptureStackBackTrace (NTDLL.@) + */ +USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash ) +{ + CONTEXT context; + + TRACE( "(%u, %u, %p, %p)\n", skip, count, buffer, hash ); + + RtlCaptureContext( &context ); + + return capture_stack_back_trace( &context, skip, count, buffer, hash ); +} + + /*********************************************************************** * signal_start_thread */