Jacek Caban : kernelbase: Close handles allocated by AllocConsole in FreeConsole.

Alexandre Julliard julliard at winehq.org
Thu Jul 30 15:31:26 CDT 2020


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Jul 30 17:16:13 2020 +0200

kernelbase: Close handles allocated by AllocConsole in FreeConsole.

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

---

 dlls/kernelbase/console.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c
index d326901eac..be05a535c5 100644
--- a/dlls/kernelbase/console.c
+++ b/dlls/kernelbase/console.c
@@ -55,6 +55,11 @@ static CRITICAL_SECTION_DEBUG critsect_debug =
 static CRITICAL_SECTION console_section = { &critsect_debug, -1, 0, 0, 0, 0 };
 
 static HANDLE console_wait_event;
+static unsigned int console_flags;
+
+#define CONSOLE_INPUT_HANDLE    0x01
+#define CONSOLE_OUTPUT_HANDLE   0x02
+#define CONSOLE_ERROR_HANDLE    0x04
 
 static WCHAR input_exe[MAX_PATH + 1];
 
@@ -191,6 +196,7 @@ static BOOL init_console_std_handles(void)
                                FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_CREATE,
                                FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 );
         if (!set_ntstatus( status )) return FALSE;
+        console_flags |= CONSOLE_INPUT_HANDLE;
         SetStdHandle( STD_INPUT_HANDLE, console_handle_map( handle ));
     }
 
@@ -210,6 +216,7 @@ static BOOL init_console_std_handles(void)
     if (!set_ntstatus( status )) return FALSE;
     if (!std_out)
     {
+        console_flags |= CONSOLE_OUTPUT_HANDLE;
         SetStdHandle( STD_OUTPUT_HANDLE, console_handle_map( handle ));
     }
 
@@ -218,6 +225,7 @@ static BOOL init_console_std_handles(void)
         if (!std_out && !DuplicateHandle( GetCurrentProcess(), handle, GetCurrentProcess(),
                                           &handle, 0, TRUE, DUPLICATE_SAME_ACCESS ))
             return FALSE;
+        console_flags |= CONSOLE_ERROR_HANDLE;
         SetStdHandle( STD_ERROR_HANDLE, console_handle_map( handle ));
     }
 
@@ -504,6 +512,11 @@ BOOL WINAPI DECLSPEC_HOTPATCH FreeConsole(void)
 
     RtlEnterCriticalSection( &console_section );
 
+    if (console_flags & CONSOLE_INPUT_HANDLE)  NtClose( GetStdHandle( STD_INPUT_HANDLE ));
+    if (console_flags & CONSOLE_OUTPUT_HANDLE) NtClose( GetStdHandle( STD_OUTPUT_HANDLE ));
+    if (console_flags & CONSOLE_ERROR_HANDLE)  NtClose( GetStdHandle( STD_ERROR_HANDLE ));
+    console_flags = 0;
+
     SERVER_START_REQ( free_console )
     {
         ret = !wine_server_call_err( req );




More information about the wine-cvs mailing list