https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=ce3889ad551503ddc511a7537360f93ba5ad2b25

commit ce3889ad551503ddc511a7537360f93ba5ad2b25
Author: Takashi Yano <[email protected]>
Date:   Mon Jul 8 23:09:12 2024 +0900

    Cygwin: console: Fix for GNU screen/tmux in ConEmu
    
    If the master process of GNU screen or tmux is started in ConEmu
    and ConEmu is closed, reattaching to the GNU screen/tmux in another
    console will not work correctly. This is because the ConEmu master
    process was already closed even though some console APIs are hooked
    by ConEmuHk64.dll to communicate with ConEmu master process. With
    this patch, to make them unhooked, DllMain() of ConEmuHk64.dll is
    called with DLL_PROCESS_DETACH.
    
    Fixes: 3721a756b0d8 ("Cygwin: console: Make the console accessible from 
other terminals.")
    Signed-off-by: Takashi Yano <[email protected]>
    (cherry picked from commit ac7c0e23d85a638e6f930aa9a0582812e886a688)

Diff:
---
 winsup/cygwin/fhandler/console.cc | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/winsup/cygwin/fhandler/console.cc 
b/winsup/cygwin/fhandler/console.cc
index 8c08a8af8..d4c3f1020 100644
--- a/winsup/cygwin/fhandler/console.cc
+++ b/winsup/cygwin/fhandler/console.cc
@@ -33,6 +33,7 @@ details. */
 #include "child_info.h"
 #include "cygwait.h"
 #include "winf.h"
+#include "psapi.h"
 
 /* Don't make this bigger than NT_MAX_PATH as long as the temporary buffer
    is allocated using tmp_pathbuf!!! */
@@ -1970,7 +1971,23 @@ fhandler_console::close ()
   if (!have_execed && !invisible_console
       && (!CTTY_IS_VALID (myself->ctty)
          || get_device () == (dev_t) myself->ctty))
-    free_console ();
+    {
+      /* ConEmu hack. Detach from ConEmu to unhook console APIs. */
+      HMODULE h = GetModuleHandle ("ConEmuHk64.dll");
+      if (h)
+       {
+         MODULEINFO mi;
+         if (GetModuleInformation (GetCurrentProcess (), h, &mi, sizeof (mi)))
+           {
+             BOOL (*DllMain)(HINSTANCE, DWORD, LPVOID) =
+               (BOOL (*)(HINSTANCE, DWORD, LPVOID)) mi.EntryPoint;
+             DllMain (h, DLL_PROCESS_DETACH, NULL);
+           }
+       }
+
+      /* Freeing console to detach the process from the console. */
+      free_console ();
+    }
 
   release_output_mutex ();

Reply via email to