Cygwin: console: Add workaround for ConEmu cygwin connector.

- ConEmu cygwin connector conflicts with cons_master_thread since
  it does not use read() to read console input. With this patch,
  cons_master_thread is disabled in ConEmu cygwin connector.
This commit is contained in:
Takashi Yano 2022-07-28 21:58:04 +09:00
parent d4aacd50e6
commit f2e39d5230
1 changed files with 25 additions and 0 deletions

View File

@ -1604,6 +1604,8 @@ fhandler_console::dup (fhandler_base *child, int flags)
return 0; return 0;
} }
static void hook_conemu_cygwin_connector();
int int
fhandler_console::open (int flags, mode_t) fhandler_console::open (int flags, mode_t)
{ {
@ -1691,6 +1693,8 @@ fhandler_console::open (int flags, mode_t)
if (myself->pid == con.owner) if (myself->pid == con.owner)
{ {
if (GetModuleHandle ("ConEmuHk64.dll"))
hook_conemu_cygwin_connector ();
char name[MAX_PATH]; char name[MAX_PATH];
shared_name (name, CONS_THREAD_SYNC, get_minor ()); shared_name (name, CONS_THREAD_SYNC, get_minor ());
thread_sync_event = CreateEvent(NULL, FALSE, FALSE, name); thread_sync_event = CreateEvent(NULL, FALSE, FALSE, name);
@ -3982,6 +3986,7 @@ fhandler_console::set_console_mode_to_native ()
DEF_HOOK (CreateProcessA); DEF_HOOK (CreateProcessA);
DEF_HOOK (CreateProcessW); DEF_HOOK (CreateProcessW);
DEF_HOOK (ContinueDebugEvent); DEF_HOOK (ContinueDebugEvent);
DEF_HOOK (LoadLibraryA); /* Hooked for ConEmu cygwin connector */
static BOOL WINAPI static BOOL WINAPI
CreateProcessA_Hooked CreateProcessA_Hooked
@ -4023,6 +4028,20 @@ ContinueDebugEvent_Hooked
return ContinueDebugEvent_Orig (p, t, s); return ContinueDebugEvent_Orig (p, t, s);
} }
/* Hooked for ConEmu cygwin connector */
static HMODULE WINAPI
LoadLibraryA_Hooked (LPCSTR m)
{
const char *p;
if ((p = strrchr(m, '\\')))
p++;
else
p = m;
if (strcasecmp(p, "ConEmuHk64.dll") == 0)
fhandler_console::set_disable_master_thread (true);
return LoadLibraryA_Orig (m);
}
void void
fhandler_console::fixup_after_fork_exec (bool execing) fhandler_console::fixup_after_fork_exec (bool execing)
{ {
@ -4046,6 +4065,12 @@ fhandler_console::fixup_after_fork_exec (bool execing)
DO_HOOK (NULL, ContinueDebugEvent); DO_HOOK (NULL, ContinueDebugEvent);
} }
static void
hook_conemu_cygwin_connector()
{
DO_HOOK (NULL, LoadLibraryA);
}
/* Ugly workaround to create invisible console required since Windows 7. /* Ugly workaround to create invisible console required since Windows 7.
First try to just attach to any console which may have started this First try to just attach to any console which may have started this