From: Vijay Kiran Kamuju Subject: [PATCH] ntdll: Implement RtlGetCallersAddress function. Message-Id: Date: Sun, 14 Mar 2021 17:48:11 +0100 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50726 Signed-off-by: Vijay Kiran Kamuju
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50726

Signed-off-by: Vijay Kiran Kamuju <infyquest@gmail.com>
From b362227ef02c50153d2386bc8a291a2b8bb94eb3 Mon Sep 17 00:00:00 2001 From: Vijay Kiran Kamuju Date: Sun, 14 Mar 2021 17:44:32 +0100 Subject: [PATCH] ntdll: Implement RtlGetCallersAddress function. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50726 Signed-off-by: Vijay Kiran Kamuju --- dlls/ntdll/ntdll.spec | 2 +- dlls/ntdll/signal_arm.c | 18 ++++++++++++++++++ dlls/ntdll/signal_arm64.c | 18 ++++++++++++++++++ dlls/ntdll/signal_i386.c | 17 +++++++++++++++++ dlls/ntdll/signal_x86_64.c | 17 +++++++++++++++++ 5 files changed, 71 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index c8622ba21f4..0ab551c199f 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -689,7 +689,7 @@ @ stub RtlGenerate8dot3Name @ stdcall RtlGetAce(ptr long ptr) @ stdcall RtlGetActiveActivationContext(ptr) -@ stub RtlGetCallersAddress +@ stdcall RtlGetCallersAddress(ptr ptr) @ stdcall RtlGetCompressionWorkSpaceSize(long ptr ptr) @ stdcall RtlGetControlSecurityDescriptor(ptr ptr ptr) @ stdcall RtlGetCurrentDirectory_U(long ptr) diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index 8b0004e0df0..b51bd0fdd26 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -303,6 +303,24 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, return 0; } +/*********************************************************************** + * RtlGetCallersAddress (NTDLL.@) + */ +VOID WINAPI RtlGetCallersAddress( PVOID *address, PVOID *caller ) +{ + PVOID backtrace[2]; + USHORT framecount = 0; + + TRACE( "(%p, %p)\n", address, caller ); + + *address = NULL; + *caller = NULL; + framecount = RtlCaptureStackBackTrace(2, 2, &backtrace[0], NULL); + + if ( framecount ) *address = backtrace[0]; + if ( framecount > 1 ) *caller = backtrace[1]; +} + /*********************************************************************** * signal_start_thread */ diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index dc6b072fa6c..48d64ad30f1 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -1465,6 +1465,24 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, return 0; } +/*********************************************************************** + * RtlGetCallersAddress (NTDLL.@) + */ +VOID WINAPI RtlGetCallersAddress( PVOID *address, PVOID *caller ) +{ + PVOID backtrace[2]; + USHORT framecount = 0; + + TRACE( "(%p, %p)\n", address, caller ); + + *address = NULL; + *caller = NULL; + framecount = RtlCaptureStackBackTrace(2, 2, &backtrace[0], NULL); + + if ( framecount ) *address = backtrace[0]; + if ( framecount > 1 ) *caller = backtrace[1]; +} + /*********************************************************************** * signal_start_thread */ diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c index 635b8f4de81..3c48ae447f5 100644 --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -498,6 +498,23 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, return i; } +/*********************************************************************** + * RtlGetCallersAddress (NTDLL.@) + */ +VOID WINAPI RtlGetCallersAddress( PVOID *address, PVOID *caller ) +{ + PVOID backtrace[2]; + USHORT framecount = 0; + + TRACE("(%p %p)\n", address, caller); + + *address = NULL; + *caller = NULL; + framecount = RtlCaptureStackBackTrace(2, 2, &backtrace[0], NULL); + + if ( framecount ) *address = backtrace[0]; + if ( framecount > 1 ) *caller = backtrace[1]; +} /*********************************************************************** * signal_start_thread diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index b5be4f35758..6215ea2f7d8 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -1532,6 +1532,23 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, return num_entries; } +/*********************************************************************** + * RtlGetCallersAddress (NTDLL.@) + */ +VOID WINAPI RtlGetCallersAddress( PVOID *address, PVOID *caller ) +{ + PVOID backtrace[2]; + USHORT framecount = 0; + + TRACE("(%p %p)\n", address, caller); + + *address = NULL; + *caller = NULL; + framecount = RtlCaptureStackBackTrace(2, 2, &backtrace[0], NULL); + + if ( framecount ) *address = backtrace[0]; + if ( framecount > 1 ) *caller = backtrace[1]; +} /*********************************************************************** * signal_start_thread -- 2.30.2