Signed-off-by: Paul Gofman pgofman@codeweavers.com --- dlls/ntdll/signal_i386.c | 24 ++++++++++++++++++++++-- dlls/ntdll/tests/exception.c | 2 -- 2 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 9390ffa3df3..108f140aeb8 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -480,6 +480,25 @@ __ASM_STDCALL_FUNC( RtlRaiseException, 4, "ret $4" ) /* actually never returns */
+/*********************************************************************** + * capture_context_wrapper (NTDLL.@) + */ +void WINAPI capture_context_wrapper(CONTEXT *); +__ASM_STDCALL_FUNC( capture_context_wrapper, 4, + "pushl %ebp\n\t" + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") + __ASM_CFI(".cfi_rel_offset %ebp,0\n\t") + "movl %esp,%ebp\n\t" + __ASM_CFI(".cfi_def_cfa_register %ebp\n\t") + "mov 8(%ebp),%eax\n\t" /* context */ + "pushl %eax\n\t" + "call " __ASM_STDCALL("RtlCaptureContext",4) "\n\t" + "leave\n\t" + __ASM_CFI(".cfi_def_cfa %esp,4\n\t") + __ASM_CFI(".cfi_same_value %ebp\n\t") + "ret $4" ) + + /************************************************************************* * capture_stack_back_trace */ @@ -515,7 +534,8 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, { CONTEXT context;
- RtlCaptureContext( &context ); + /* Need a wrapper as RtlCaptureContext() skips the last frame. */ + capture_context_wrapper( &context ); return capture_stack_back_trace( &context, skip, count, buffer, hash ); }
@@ -531,7 +551,7 @@ ULONG WINAPI RtlWalkFrameChain(void **callers, ULONG count, ULONG flags)
TRACE( "callers %p, count %u, flags %#x.\n", callers, count, flags );
- RtlCaptureContext( &context ); + capture_context_wrapper( &context );
skip = (flags >> 8) & 0xff; flags &= ~0xff00; diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c index 63b1edeebc9..1d7f5ed4408 100644 --- a/dlls/ntdll/tests/exception.c +++ b/dlls/ntdll/tests/exception.c @@ -9134,10 +9134,8 @@ static void test_walk_stack(void)
start = test_walk_stack; end = (BYTE *)start + 0x1000; - todo_wine_if(sizeof(void *) == 4) ok(addrs[0] >= start && addrs[0] < end, "Address is not inside test function, start %p, end %p, addr %p.\n", start, end, addrs[0]); - todo_wine_if(sizeof(void *) == 4) ok(addrs2[0] >= start && addrs2[0] < end, "Address is not inside test function, start %p, end %p, addr %p.\n", start, end, addrs2[0]);