Jacek Caban : kernelbase: Move CONTROL_C_EXIT handler to kernelbase.

Alexandre Julliard julliard at winehq.org
Thu Aug 13 15:11:52 CDT 2020


Module: wine
Branch: master
Commit: 43ce429234a568cca6d563e0464acc3cfbbdbd50
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=43ce429234a568cca6d563e0464acc3cfbbdbd50

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Aug 13 16:02:04 2020 +0200

kernelbase: Move CONTROL_C_EXIT handler to kernelbase.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/console.c         | 31 -------------------------------
 dlls/kernel32/console_private.h |  1 -
 dlls/kernel32/kernel_main.c     |  3 ---
 dlls/kernelbase/console.c       | 19 +++++++++++++++++++
 dlls/kernelbase/kernelbase.h    |  1 +
 dlls/kernelbase/main.c          |  1 +
 6 files changed, 21 insertions(+), 35 deletions(-)

diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c
index ab97144e98..c38fa5d0c2 100644
--- a/dlls/kernel32/console.c
+++ b/dlls/kernel32/console.c
@@ -648,37 +648,6 @@ BOOL WINAPI GetNumberOfConsoleMouseButtons(LPDWORD nrofbuttons)
     return TRUE;
 }
 
-/******************************************************************
- *		CONSOLE_HandleCtrlC
- *
- * Check whether the shall manipulate CtrlC events
- */
-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;
-    if (!RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle)  return EXCEPTION_CONTINUE_SEARCH;
-
-    /* check if we have to ignore ctrl-C events */
-    if (!(NtCurrentTeb()->Peb->ProcessParameters->ConsoleFlags & 1))
-    {
-        /* Create a separate thread to signal all the events. 
-         * This is needed because:
-         *  - this function can be called in an Unix signal handler (hence on an
-         *    different stack than the thread that's running). This breaks the 
-         *    Win32 exception mechanisms (where the thread's stack is checked).
-         *  - since the current thread, while processing the signal, can hold the
-         *    console critical section, we need another execution environment where
-         *    we can wait on this critical section 
-         */
-        thread = CreateThread(NULL, 0, CtrlRoutine, (void*)CTRL_C_EVENT, 0, NULL);
-        if (thread) CloseHandle(thread);
-    }
-    return EXCEPTION_CONTINUE_EXECUTION;
-}
-
 /******************************************************************
  *		CONSOLE_WriteChars
  *
diff --git a/dlls/kernel32/console_private.h b/dlls/kernel32/console_private.h
index 2943d48a60..0b033b3550 100644
--- a/dlls/kernel32/console_private.h
+++ b/dlls/kernel32/console_private.h
@@ -22,7 +22,6 @@
 #define __WINE_CONSOLE_PRIVATE_H
 
 /* 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 f7f87d2a70..c7a10d233a 100644
--- a/dlls/kernel32/kernel_main.c
+++ b/dlls/kernel32/kernel_main.c
@@ -147,9 +147,6 @@ static BOOL process_attach( HMODULE module )
             LoadLibraryA( "krnl386.exe16" );
     }
 
-    /* finish the process initialisation for console bits, if needed */
-    RtlAddVectoredExceptionHandler( FALSE, CONSOLE_HandleCtrlC );
-
     if (params->ConsoleHandle == KERNEL32_CONSOLE_ALLOC)
     {
         HMODULE mod = GetModuleHandleA(0);
diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c
index c7513601f8..71dacb9ff4 100644
--- a/dlls/kernelbase/console.c
+++ b/dlls/kernelbase/console.c
@@ -421,6 +421,20 @@ DWORD WINAPI CtrlRoutine( void *arg )
 }
 
 
+static LONG WINAPI handle_ctrl_c( EXCEPTION_POINTERS *eptr )
+{
+    if (eptr->ExceptionRecord->ExceptionCode != CONTROL_C_EXIT) return EXCEPTION_CONTINUE_SEARCH;
+    if (!RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle)  return EXCEPTION_CONTINUE_SEARCH;
+
+    if (!(NtCurrentTeb()->Peb->ProcessParameters->ConsoleFlags & 1))
+    {
+        HANDLE thread = CreateThread( NULL, 0, CtrlRoutine, (void*)CTRL_C_EVENT, 0, NULL );
+        if (thread) CloseHandle( thread );
+    }
+    return EXCEPTION_CONTINUE_EXECUTION;
+}
+
+
 /******************************************************************************
  *	FillConsoleOutputAttribute   (kernelbase.@)
  */
@@ -1626,3 +1640,8 @@ HRESULT WINAPI ResizePseudoConsole( HPCON handle, COORD size )
     FIXME( "%p (%u,%u)\n", handle, size.X, size.Y );
     return E_NOTIMPL;
 }
+
+void init_console( void )
+{
+    RtlAddVectoredExceptionHandler( FALSE, handle_ctrl_c );
+}
diff --git a/dlls/kernelbase/kernelbase.h b/dlls/kernelbase/kernelbase.h
index 9fb4434fbb..59265bab2c 100644
--- a/dlls/kernelbase/kernelbase.h
+++ b/dlls/kernelbase/kernelbase.h
@@ -28,6 +28,7 @@ extern WCHAR *file_name_AtoW( LPCSTR name, BOOL alloc ) DECLSPEC_HIDDEN;
 extern DWORD file_name_WtoA( LPCWSTR src, INT srclen, LPSTR dest, INT destlen ) DECLSPEC_HIDDEN;
 extern void init_startup_info( RTL_USER_PROCESS_PARAMETERS *params ) DECLSPEC_HIDDEN;
 extern void init_locale(void) DECLSPEC_HIDDEN;
+extern void init_console(void) DECLSPEC_HIDDEN;
 extern HANDLE get_console_wait_handle( HANDLE handle ) DECLSPEC_HIDDEN;
 
 extern const WCHAR windows_dir[] DECLSPEC_HIDDEN;
diff --git a/dlls/kernelbase/main.c b/dlls/kernelbase/main.c
index f1edf8614e..e85586a075 100644
--- a/dlls/kernelbase/main.c
+++ b/dlls/kernelbase/main.c
@@ -47,6 +47,7 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
         IsWow64Process( GetCurrentProcess(), &is_wow64 );
         init_locale();
         init_startup_info( NtCurrentTeb()->Peb->ProcessParameters );
+        init_console();
     }
     return TRUE;
 }




More information about the wine-cvs mailing list