From 173644b08fae3f45149b7b6351f572ad22215e7a Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Sat, 6 Jun 2020 16:43:48 +0200 Subject: [PATCH] kernel32: Use a vectored exception handler to catch Ctrl-C. Signed-off-by: Alexandre Julliard --- 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 4e1c15cb718..02aa0d6f6f9 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 dc487009004..2943d48a60d 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 d312f110812..f7f87d2a708 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) {