Jacek Caban : kernelbase: Use console connection object in AttachConsole.

Alexandre Julliard julliard at winehq.org
Wed Sep 16 15:37:34 CDT 2020


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Sep 16 20:39:45 2020 +0200

kernelbase: Use console connection object in AttachConsole.

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

---

 dlls/kernelbase/console.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c
index eff63a29a1..8c39cde30a 100644
--- a/dlls/kernelbase/console.c
+++ b/dlls/kernelbase/console.c
@@ -293,24 +293,23 @@ BOOL WINAPI DECLSPEC_HOTPATCH AttachConsole( DWORD pid )
 
     RtlEnterCriticalSection( &console_section );
 
-    SERVER_START_REQ( attach_console )
+    if (RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle)
     {
-        req->pid = pid;
-        ret = !wine_server_call_err( req );
+        RtlLeaveCriticalSection( &console_section );
+        WARN( "console already attached\n" );
+        SetLastError( ERROR_ACCESS_DENIED );
+        return FALSE;
     }
-    SERVER_END_REQ;
 
+    ret = create_console_connection( NULL ) &&
+        console_ioctl( console_connection, IOCTL_CONDRV_BIND_PID, &pid, sizeof(pid), NULL, 0, NULL );
     if (ret)
     {
-        if ((ret = init_console_std_handles()))
-        {
-            HANDLE console = CreateFileW( L"CONIN$", GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, 0, NULL, OPEN_EXISTING, 0, 0 );
-            if (console != INVALID_HANDLE_VALUE) RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle = console;
-            else ret = FALSE;
-        }
-        if (!ret) FreeConsole();
+        RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle = create_console_reference( console_connection );
+        ret = RtlGetCurrentPeb()->ProcessParameters->ConsoleHandle && init_console_std_handles();
     }
 
+    if (!ret) FreeConsole();
     RtlLeaveCriticalSection( &console_section );
     return ret;
 }




More information about the wine-cvs mailing list