Module: wine Branch: master Commit: 173644b08fae3f45149b7b6351f572ad22215e7a URL: https://source.winehq.org/git/wine.git/?a=commit;h=173644b08fae3f45149b7b635...
Author: Alexandre Julliard julliard@winehq.org Date: Sat Jun 6 16:43:48 2020 +0200
kernel32: Use a vectored exception handler to catch Ctrl-C.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/kernel32/console.c | 14 ++++++-------- dlls/kernel32/console_private.h | 3 +-- dlls/kernel32/kernel_main.c | 4 +--- 3 files changed, 8 insertions(+), 13 deletions(-)
diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c index 4e1c15cb71..02aa0d6f6f 100644 --- a/dlls/kernel32/console.c +++ b/dlls/kernel32/console.c @@ -894,14 +894,15 @@ BOOL WINAPI GetNumberOfConsoleMouseButtons(LPDWORD nrofbuttons) * * Check whether the shall manipulate CtrlC events */ -int CONSOLE_HandleCtrlC(unsigned sig) +LONG CALLBACK CONSOLE_HandleCtrlC( EXCEPTION_POINTERS *eptr ) { extern DWORD WINAPI CtrlRoutine( void *arg ); HANDLE thread;
+ if (eptr->ExceptionRecord->ExceptionCode != CONTROL_C_EXIT) return EXCEPTION_CONTINUE_SEARCH; + /* FIXME: better test whether a console is attached to this process ??? */ - extern unsigned CONSOLE_GetNumHistoryEntries(void); - if (CONSOLE_GetNumHistoryEntries() == (unsigned)-1) return 0; + if (CONSOLE_GetNumHistoryEntries() == (unsigned)-1) return EXCEPTION_CONTINUE_SEARCH;
/* check if we have to ignore ctrl-C events */ if (!(NtCurrentTeb()->Peb->ProcessParameters->ConsoleFlags & 1)) @@ -916,12 +917,9 @@ int CONSOLE_HandleCtrlC(unsigned sig) * we can wait on this critical section */ thread = CreateThread(NULL, 0, CtrlRoutine, (void*)CTRL_C_EVENT, 0, NULL); - if (thread == NULL) - return 0; - - CloseHandle(thread); + if (thread) CloseHandle(thread); } - return 1; + return EXCEPTION_CONTINUE_EXECUTION; }
/****************************************************************** diff --git a/dlls/kernel32/console_private.h b/dlls/kernel32/console_private.h index dc48700900..2943d48a60 100644 --- a/dlls/kernel32/console_private.h +++ b/dlls/kernel32/console_private.h @@ -22,8 +22,7 @@ #define __WINE_CONSOLE_PRIVATE_H
/* console.c */ -extern int CONSOLE_HandleCtrlC(unsigned) DECLSPEC_HIDDEN; -/* console.c */ +extern LONG CALLBACK CONSOLE_HandleCtrlC( EXCEPTION_POINTERS *eptr ) DECLSPEC_HIDDEN; extern int CONSOLE_GetHistory(int idx, WCHAR* buf, int buf_len) DECLSPEC_HIDDEN; extern BOOL CONSOLE_AppendHistory(const WCHAR *p) DECLSPEC_HIDDEN; extern unsigned CONSOLE_GetNumHistoryEntries(void) DECLSPEC_HIDDEN; diff --git a/dlls/kernel32/kernel_main.c b/dlls/kernel32/kernel_main.c index d312f11081..f7f87d2a70 100644 --- a/dlls/kernel32/kernel_main.c +++ b/dlls/kernel32/kernel_main.c @@ -39,8 +39,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(process);
-extern int CDECL __wine_set_signal_handler(unsigned, int (*)(unsigned)); - static STARTUPINFOA startup_infoA;
/*********************************************************************** @@ -150,7 +148,7 @@ static BOOL process_attach( HMODULE module ) }
/* finish the process initialisation for console bits, if needed */ - __wine_set_signal_handler(SIGINT, CONSOLE_HandleCtrlC); + RtlAddVectoredExceptionHandler( FALSE, CONSOLE_HandleCtrlC );
if (params->ConsoleHandle == KERNEL32_CONSOLE_ALLOC) {