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