diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c index f4dd06ae2da..eff63a29a12 100644 --- a/dlls/kernelbase/console.c +++ b/dlls/kernelbase/console.c @@ -54,6 +54,7 @@ static CRITICAL_SECTION_DEBUG critsect_debug = }; static CRITICAL_SECTION console_section = { &critsect_debug, -1, 0, 0, 0, 0 }; +static HANDLE console_connection; static HANDLE console_wait_event; static unsigned int console_flags; @@ -208,6 +209,21 @@ static HANDLE create_console_reference( HANDLE root ) return set_ntstatus( status ) ? handle : NULL; } +static BOOL create_console_connection( HANDLE root ) +{ + OBJECT_ATTRIBUTES attr = {sizeof(attr)}; + UNICODE_STRING string; + IO_STATUS_BLOCK iosb; + NTSTATUS status; + + RtlInitUnicodeString( &string, root ? L"Connection" : L"\\Device\\ConDrv\\Connection" ); + attr.RootDirectory = root; + attr.ObjectName = &string; + status = NtCreateFile( &console_connection, FILE_WRITE_PROPERTIES | FILE_READ_PROPERTIES | SYNCHRONIZE, &attr, + &iosb, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN, FILE_NON_DIRECTORY_FILE, NULL, 0 ); + return set_ntstatus( status ); +} + static BOOL init_console_std_handles(void) { HANDLE std_out = NULL, std_err = NULL, handle; @@ -568,6 +584,9 @@ BOOL WINAPI DECLSPEC_HOTPATCH FreeConsole(void) RtlEnterCriticalSection( &console_section ); + NtClose( console_connection ); + console_connection = NULL; + NtClose( RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle ); RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle = NULL; @@ -1734,6 +1753,7 @@ void init_console( void ) if (RtlImageNtHeader( mod )->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI) AllocConsole(); } + else if (params->ConsoleHandle) create_console_connection( params->ConsoleHandle ); RtlAddVectoredExceptionHandler( FALSE, handle_ctrl_c ); } diff --git a/server/console.c b/server/console.c index 108371080ef..50698a727fc 100644 --- a/server/console.c +++ b/server/console.c @@ -799,14 +799,12 @@ obj_handle_t inherit_console( struct thread *parent_thread, obj_handle_t handle, { struct console_input *console = NULL; - if (handle && !(console = (struct console_input *)get_handle_obj( current->process, handle, 0, - &console_input_ops ))) - return 0; + if (handle) return duplicate_handle( current->process, handle, process, 0, 0, DUP_HANDLE_SAME_ACCESS ); /* if parent is a renderer, then attach current process to its console * a bit hacky.... */ - if (!console && hconin && parent_thread) + if (hconin && parent_thread) { /* FIXME: should we check some access rights ? */ if (!(console = (struct console_input *)get_handle_obj( parent_thread->process, hconin,