Alexandre Julliard : kernel32: Use a vectored exception handler to catch Ctrl-C.
Alexandre Julliard
julliard at winehq.org
Mon Jun 8 15:19:54 CDT 2020
Module: wine
Branch: master
Commit: 173644b08fae3f45149b7b6351f572ad22215e7a
URL: https://source.winehq.org/git/wine.git/?a=commit;h=173644b08fae3f45149b7b6351f572ad22215e7a
Author: Alexandre Julliard <julliard at 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 at 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)
{
More information about the wine-cvs
mailing list