[PATCH v5 1/4] ntdll: Factor out capture_stack_back_trace() helper.
Paul Gofman
pgofman at codeweavers.com
Wed Nov 3 05:41:24 CDT 2021
Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
v5:
- fix max USHORT value.
dlls/ntdll/exception.c | 12 ++++++++++++
dlls/ntdll/ntdll_misc.h | 2 ++
dlls/ntdll/signal_arm.c | 4 ++--
dlls/ntdll/signal_arm64.c | 4 ++--
dlls/ntdll/signal_i386.c | 6 ++++--
dlls/ntdll/signal_x86_64.c | 10 ++++++----
6 files changed, 28 insertions(+), 10 deletions(-)
diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c
index c3714e8369b..e956d8a722f 100644
--- a/dlls/ntdll/exception.c
+++ b/dlls/ntdll/exception.c
@@ -1065,3 +1065,15 @@ NTSTATUS WINAPI RtlCopyExtendedContext( CONTEXT_EX *dst, ULONG context_flags, CO
memcpy( &dst_xs->YmmContext, &src_xs->YmmContext, sizeof(dst_xs->YmmContext) );
return STATUS_SUCCESS;
}
+
+
+/*************************************************************************
+ * RtlCaptureStackBackTrace (NTDLL.@)
+ */
+USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash )
+{
+ ULONG ret;
+
+ ret = capture_stack_back_trace( skip, count, buffer, hash );
+ return min( ret, (USHORT)~0 );
+}
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index 34af6b780cf..31a33b04dbf 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -57,6 +57,8 @@ extern void WINAPI KiUserCallbackDispatcher(ULONG,void*,ULONG) DECLSPEC_HIDDEN;
extern RUNTIME_FUNCTION *lookup_function_info( ULONG_PTR pc, ULONG_PTR *base, LDR_DATA_TABLE_ENTRY **module ) DECLSPEC_HIDDEN;
#endif
+extern ULONG WINAPI capture_stack_back_trace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash ) DECLSPEC_HIDDEN;
+
/* debug helpers */
extern LPCSTR debugstr_us( const UNICODE_STRING *str ) DECLSPEC_HIDDEN;
extern const char *debugstr_exception_code( DWORD code ) DECLSPEC_HIDDEN;
diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c
index 0ef210a0331..241ddc3ce70 100644
--- a/dlls/ntdll/signal_arm.c
+++ b/dlls/ntdll/signal_arm.c
@@ -300,9 +300,9 @@ __ASM_STDCALL_FUNC( RtlRaiseException, 4,
"bl " __ASM_NAME("RtlRaiseStatus") )
/*************************************************************************
- * RtlCaptureStackBackTrace (NTDLL.@)
+ * capture_stack_back_trace
*/
-USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash )
+ULONG WINAPI capture_stack_back_trace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash )
{
FIXME( "(%d, %d, %p, %p) stub!\n", skip, count, buffer, hash );
return 0;
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index 290639b676b..1bffbe7efe9 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -1473,9 +1473,9 @@ __ASM_STDCALL_FUNC( RtlRaiseException, 4,
"bl " __ASM_NAME("RtlRaiseStatus") /* does not return */ );
/*************************************************************************
- * RtlCaptureStackBackTrace (NTDLL.@)
+ * capture_stack_back_trace
*/
-USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash )
+ULONG WINAPI capture_stack_back_trace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash )
{
FIXME( "(%d, %d, %p, %p) stub!\n", skip, count, buffer, hash );
return 0;
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index 14971032ce6..26150ce877b 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -481,14 +481,16 @@ __ASM_STDCALL_FUNC( RtlRaiseException, 4,
/*************************************************************************
- * RtlCaptureStackBackTrace (NTDLL.@)
+ * capture_stack_back_trace
*/
-USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash )
+ULONG WINAPI capture_stack_back_trace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash )
{
CONTEXT context;
ULONG i;
ULONG *frame;
+ ++skip;
+
RtlCaptureContext( &context );
if (hash) *hash = 0;
frame = (ULONG *)context.Ebp;
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index ef32eba68b7..5f3c8f70208 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -1490,19 +1490,21 @@ 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 )
+ULONG WINAPI capture_stack_back_trace( ULONG skip, ULONG count, PVOID *buffer, ULONG *hash )
{
UNWIND_HISTORY_TABLE table;
DISPATCHER_CONTEXT dispatch;
CONTEXT context;
NTSTATUS status;
ULONG i;
- USHORT num_entries = 0;
+ ULONG num_entries = 0;
TRACE( "(%u, %u, %p, %p)\n", skip, count, buffer, hash );
+ ++skip;
+
RtlCaptureContext( &context );
dispatch.TargetIp = 0;
dispatch.ContextRecord = &context;
@@ -1529,7 +1531,7 @@ USHORT WINAPI RtlCaptureStackBackTrace( ULONG skip, ULONG count, PVOID *buffer,
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 );
+ TRACE( "captured %u frames\n", num_entries );
return num_entries;
}
--
2.31.1
More information about the wine-devel
mailing list