Module: wine Branch: master Commit: 08f4705e4416c55ba9b941cc7c380d5e61a4715a URL: https://gitlab.winehq.org/wine/wine/-/commit/08f4705e4416c55ba9b941cc7c380d5...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Jan 30 15:51:01 2024 +0100
ntdll: Use a .seh handler for DbgUiRemoteBreakin().
---
dlls/ntdll/signal_arm.c | 16 ++++++++++++++++ dlls/ntdll/signal_arm64.c | 30 ++++++++++++++---------------- dlls/ntdll/signal_x86_64.c | 19 ++++++++++++++++++- 3 files changed, 48 insertions(+), 17 deletions(-)
diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c index 80d722ccacb..0e6c36e3340 100644 --- a/dlls/ntdll/signal_arm.c +++ b/dlls/ntdll/signal_arm.c @@ -1688,6 +1688,21 @@ void WINAPI process_breakpoint(void) /*********************************************************************** * DbgUiRemoteBreakin (NTDLL.@) */ +#ifdef __WINE_PE_BUILD +__ASM_GLOBAL_FUNC( DbgUiRemoteBreakin, + ".seh_endprologue\n\t" + ".seh_handler DbgUiRemoteBreakin_handler, %except\n\t" + "mrc p15, 0, r0, c13, c0, 2\n\t" /* NtCurrentTeb() */ + "ldr r0, [r0, #0x30]\n\t" /* NtCurrentTeb()->Peb */ + "ldrb r0, [r0, 0x02]\n\t" /* peb->BeingDebugged */ + "cbz r0, 1f\n\t" + "bl " __ASM_NAME("DbgBreakPoint") "\n" + "1:\tmov r0, #0\n\t" + "bl " __ASM_NAME("RtlExitUserThread") "\n" + "DbgUiRemoteBreakin_handler:\n\t" + "mov sp, r1\n\t" /* frame */ + "b 1b" ) +#else void WINAPI DbgUiRemoteBreakin( void *arg ) { if (NtCurrentTeb()->Peb->BeingDebugged) @@ -1704,6 +1719,7 @@ void WINAPI DbgUiRemoteBreakin( void *arg ) } RtlExitUserThread( STATUS_SUCCESS ); } +#endif
/********************************************************************** * DbgBreakPoint (NTDLL.@) diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c index 477f22029bd..82466e926c2 100644 --- a/dlls/ntdll/signal_arm64.c +++ b/dlls/ntdll/signal_arm64.c @@ -1585,22 +1585,20 @@ __ASM_GLOBAL_FUNC( process_breakpoint, /*********************************************************************** * DbgUiRemoteBreakin (NTDLL.@) */ -void WINAPI DbgUiRemoteBreakin( void *arg ) -{ - if (NtCurrentTeb()->Peb->BeingDebugged) - { - __TRY - { - DbgBreakPoint(); - } - __EXCEPT_ALL - { - /* do nothing */ - } - __ENDTRY - } - RtlExitUserThread( STATUS_SUCCESS ); -} +__ASM_GLOBAL_FUNC( DbgUiRemoteBreakin, + "stp x29, x30, [sp, #-16]!\n\t" + ".seh_save_fplr_x 16\n\t" + ".seh_endprologue\n\t" + ".seh_handler DbgUiRemoteBreakin_handler, @except\n\t" + "ldr x0, [x18, #0x60]\n\t" /* NtCurrentTeb()->Peb */ + "ldrb w0, [x0, 0x02]\n\t" /* peb->BeingDebugged */ + "cbz w0, 1f\n\t" + "bl " __ASM_NAME("DbgBreakPoint") "\n" + "1:\tmov w0, #0\n\t" + "bl " __ASM_NAME("RtlExitUserThread") "\n" + "DbgUiRemoteBreakin_handler:\n\t" + "mov sp, x1\n\t" /* frame */ + "b 1b" )
/********************************************************************** * DbgBreakPoint (NTDLL.@) diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index be5851b8c31..e63837d3eac 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -1748,6 +1748,23 @@ void WINAPI process_breakpoint(void) /*********************************************************************** * DbgUiRemoteBreakin (NTDLL.@) */ +#ifdef __WINE_PE_BUILD +__ASM_GLOBAL_FUNC( DbgUiRemoteBreakin, + "subq $0x28,%rsp\n\t" + ".seh_stackalloc 0x28\n\t" + ".seh_endprologue\n\t" + ".seh_handler DbgUiRemoteBreakin_handler, @except\n\t" + "mov %gs:0x30,%rax\n\t" + "mov 0x60(%rax),%rax\n\t" + "cmpb $0,2(%rax)\n\t" + "je 1f\n\t" + "call " __ASM_NAME("DbgBreakPoint") "\n" + "1:\txorl %ecx,%ecx\n\t" + "call " __ASM_NAME("RtlExitUserThread") "\n" + "DbgUiRemoteBreakin_handler:\n\t" + "movq %rdx,%rsp\n\t" /* frame */ + "jmp 1b" ) +#else void WINAPI DbgUiRemoteBreakin( void *arg ) { if (NtCurrentTeb()->Peb->BeingDebugged) @@ -1764,7 +1781,7 @@ void WINAPI DbgUiRemoteBreakin( void *arg ) } RtlExitUserThread( STATUS_SUCCESS ); } - +#endif
/********************************************************************** * DbgBreakPoint (NTDLL.@)