Jacek Caban : kernelbase: Invalidate console wait handle in FreeConsole.

Alexandre Julliard julliard at winehq.org
Wed Jul 1 15:22:49 CDT 2020


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Jul  1 16:27:05 2020 +0200

kernelbase: Invalidate console wait handle in FreeConsole.

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

---

 dlls/kernelbase/console.c    | 22 ++++++++++++++++++++++
 dlls/kernelbase/kernelbase.h |  1 +
 dlls/kernelbase/sync.c       | 20 +-------------------
 3 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c
index 5fb84c0bd9..bd927c9b83 100644
--- a/dlls/kernelbase/console.c
+++ b/dlls/kernelbase/console.c
@@ -53,6 +53,8 @@ static CRITICAL_SECTION_DEBUG critsect_debug =
 };
 static CRITICAL_SECTION console_section = { &critsect_debug, -1, 0, 0, 0, 0 };
 
+static HANDLE console_wait_event;
+
 static WCHAR input_exe[MAX_PATH + 1];
 
 struct ctrl_handler
@@ -345,12 +347,31 @@ BOOL WINAPI DECLSPEC_HOTPATCH FillConsoleOutputCharacterW( HANDLE handle, WCHAR
     return ret;
 }
 
+HANDLE get_console_wait_handle( HANDLE handle )
+{
+    HANDLE event = 0;
+
+    SERVER_START_REQ( get_console_wait_event )
+    {
+        req->handle = wine_server_obj_handle( console_handle_map( handle ));
+        if (!wine_server_call( req )) event = wine_server_ptr_handle( reply->event );
+    }
+    SERVER_END_REQ;
+    if (event)
+    {
+        if (InterlockedCompareExchangePointer( &console_wait_event, event, 0 )) NtClose( event );
+        handle = console_wait_event;
+    }
+    return handle;
+}
+
 
 /***********************************************************************
  *	FreeConsole   (kernelbase.@)
  */
 BOOL WINAPI DECLSPEC_HOTPATCH FreeConsole(void)
 {
+    HANDLE event;
     BOOL ret;
 
     SERVER_START_REQ( free_console )
@@ -358,6 +379,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH FreeConsole(void)
         ret = !wine_server_call_err( req );
     }
     SERVER_END_REQ;
+    if ((event = InterlockedExchangePointer( &console_wait_event, NULL ))) NtClose( event );
     return ret;
 }
 
diff --git a/dlls/kernelbase/kernelbase.h b/dlls/kernelbase/kernelbase.h
index 88765df3d1..9fb4434fbb 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 HANDLE get_console_wait_handle( HANDLE handle ) DECLSPEC_HIDDEN;
 
 extern const WCHAR windows_dir[] DECLSPEC_HIDDEN;
 extern const WCHAR system_dir[] DECLSPEC_HIDDEN;
diff --git a/dlls/kernelbase/sync.c b/dlls/kernelbase/sync.c
index 7ea70202c2..13a9938e7c 100644
--- a/dlls/kernelbase/sync.c
+++ b/dlls/kernelbase/sync.c
@@ -213,8 +213,6 @@ ULONGLONG WINAPI DECLSPEC_HOTPATCH GetTickCount64(void)
 
 static HANDLE normalize_handle_if_console( HANDLE handle )
 {
-    static HANDLE wait_event;
-
     if ((handle == (HANDLE)STD_INPUT_HANDLE) ||
         (handle == (HANDLE)STD_OUTPUT_HANDLE) ||
         (handle == (HANDLE)STD_ERROR_HANDLE))
@@ -223,23 +221,7 @@ static HANDLE normalize_handle_if_console( HANDLE handle )
     /* even screen buffer console handles are waitable, and are
      * handled as a handle to the console itself
      */
-    if (is_console_handle( handle ))
-    {
-        HANDLE event = 0;
-
-        SERVER_START_REQ( get_console_wait_event )
-        {
-            req->handle = wine_server_obj_handle( console_handle_map( handle ));
-            if (!wine_server_call( req )) event = wine_server_ptr_handle( reply->event );
-        }
-        SERVER_END_REQ;
-        if (event)
-        {
-            if (InterlockedCompareExchangePointer( &wait_event, event, 0 )) NtClose( event );
-            handle = wait_event;
-        }
-    }
-    return handle;
+    return is_console_handle( handle ) ? get_console_wait_handle( handle ) : handle;
 }
 
 




More information about the wine-cvs mailing list