[PATCH v5 1/4] ntdll: Factor out capture_stack_back_trace() helper.
Giovanni Mascellani
gmascellani at codeweavers.com
Wed Nov 3 07:49:07 CDT 2021
Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
On 03/11/21 11:41, Paul Gofman wrote:
> 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;
> }
>
>
More information about the wine-devel
mailing list