Skip to content

Commit 7ce4040

Browse files
committed
set c::STARTF_USESTDHANDLES when PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE
1 parent 7a7d88e commit 7ce4040

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

library/std/src/sys/pal/windows/process.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -353,12 +353,21 @@ impl Command {
353353

354354
let mut si = zeroed_startupinfo();
355355

356+
// if STARTF_USESTDHANDLES is not used with PSEUDOCONSOLE,
357+
// it is not guaranteed that all the desired stdio of the new process are
358+
// really connected to the new console.
359+
// The problem + solution is described here:
360+
// https://github.com/microsoft/terminal/issues/4380#issuecomment-580865346
361+
const PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE: usize = 0x20016;
362+
let force_use_std_handles =
363+
self.proc_thread_attributes.contains_key(&PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE);
364+
356365
// If at least one of stdin, stdout or stderr are set (i.e. are non null)
357366
// then set the `hStd` fields in `STARTUPINFO`.
358367
// Otherwise skip this and allow the OS to apply its default behaviour.
359368
// This provides more consistent behaviour between Win7 and Win8+.
360369
let is_set = |stdio: &Handle| !stdio.as_raw_handle().is_null();
361-
if is_set(&stderr) || is_set(&stdout) || is_set(&stdin) {
370+
if force_use_std_handles || is_set(&stderr) || is_set(&stdout) || is_set(&stdin) {
362371
si.dwFlags |= c::STARTF_USESTDHANDLES;
363372
si.hStdInput = stdin.as_raw_handle();
364373
si.hStdOutput = stdout.as_raw_handle();

0 commit comments

Comments
 (0)