currently, conhost delays the start of the input thread until the first console read operation
some PE executables (like mingw's gdb port) just do something like: - WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), INFINITE) and hang for ever (the read operations are done *after* the wait operation succeeds) (of course, the real wait operation is more complex, but the problematic part boils down to that)
I understand that the delay has been introduced so that executables still reading directly from the unix fd will continue to work.
But I could miss some other use cases.
This patch forces the start the tty input thread in conhost if current executable is a PE executable.
This lets mingw's gdb work a bit further (at least allowing some user input <g>) under wine. (x86_64 seems to be quite ok, i686 still needs come cudling)
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/kernelbase/console.c | 8 ++++++-- programs/conhost/conhost.c | 9 +++++++-- 2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c index a7eeb439232..b6f2c4fb394 100644 --- a/dlls/kernelbase/console.c +++ b/dlls/kernelbase/console.c @@ -1694,8 +1694,12 @@ static HANDLE create_pseudo_console( COORD size, HANDLE input, HANDLE output, HA } else { - swprintf( cmd, ARRAY_SIZE(cmd), L""%s" --unix --width %u --height %u --server 0x%x", - conhost_path, size.X, size.Y, server ); + LDR_DATA_TABLE_ENTRY *ldr; + const WCHAR* start_thread = L""; + if (LdrFindEntryForAddress( GetModuleHandleW( NULL) , &ldr ) == STATUS_SUCCESS && + !(ldr->Flags & LDR_WINE_INTERNAL)) start_thread = L"--thread "; + swprintf( cmd, ARRAY_SIZE(cmd), L""%s" --unix %s--width %u --height %u --server 0x%x", + conhost_path, start_thread, size.X, size.Y, server ); } Wow64DisableWow64FsRedirection( &redir ); res = CreateProcessW( conhost_path, cmd, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, diff --git a/programs/conhost/conhost.c b/programs/conhost/conhost.c index 05447d52dd5..27788fbd6a8 100644 --- a/programs/conhost/conhost.c +++ b/programs/conhost/conhost.c @@ -2736,7 +2736,7 @@ static int main_loop( struct console *console, HANDLE signal )
int __cdecl wmain(int argc, WCHAR *argv[]) { - int headless = 0, i, width = 0, height = 0; + int headless = 0, i, width = 0, height = 0, start_thread = 0; HANDLE signal = NULL; WCHAR *end;
@@ -2765,6 +2765,11 @@ int __cdecl wmain(int argc, WCHAR *argv[]) headless = 1; continue; } + if (!wcscmp( argv[i], L"--thread")) + { + start_thread = 1; + continue; + } if (!wcscmp( argv[i], L"--width" )) { if (++i == argc) return 1; @@ -2812,7 +2817,7 @@ int __cdecl wmain(int argc, WCHAR *argv[]) console.tty_input = GetStdHandle( STD_INPUT_HANDLE ); console.tty_output = GetStdHandle( STD_OUTPUT_HANDLE ); init_tty_output( &console ); - if (!console.is_unix && !ensure_tty_input_thread( &console )) return 1; + if ((!console.is_unix || start_thread) && !ensure_tty_input_thread( &console )) return 1; } else {