aboutsummaryrefslogtreecommitdiff
path: root/winsup/cygwin
diff options
context:
space:
mode:
authorTakashi Yano <takashi.yano@nifty.ne.jp>2024-07-08 23:09:12 +0900
committerTakashi Yano <takashi.yano@nifty.ne.jp>2024-07-09 00:05:43 +0900
commit1fb17a4b2d54ec1662bcca5001deb8b781981568 (patch)
treec30602d27feebd91648e4e8aa09b8c489074d163 /winsup/cygwin
parent10477d95ec401213d5bded5ae3600ab0d2d5ed94 (diff)
downloadnewlib-1fb17a4b2d54ec1662bcca5001deb8b781981568.zip
newlib-1fb17a4b2d54ec1662bcca5001deb8b781981568.tar.gz
newlib-1fb17a4b2d54ec1662bcca5001deb8b781981568.tar.bz2
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 <takashi.yano@nifty.ne.jp>
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/fhandler/console.cc19
1 files changed, 18 insertions, 1 deletions
diff --git a/winsup/cygwin/fhandler/console.cc b/winsup/cygwin/fhandler/console.cc
index 8c08a8a..d4c3f10 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 ();