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