summaryrefslogtreecommitdiffstats
path: root/input
diff options
context:
space:
mode:
Diffstat (limited to 'input')
-rw-r--r--input/pipe-win32.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/input/pipe-win32.c b/input/pipe-win32.c
index 816bdcffed..4077ea84ee 100644
--- a/input/pipe-win32.c
+++ b/input/pipe-win32.c
@@ -45,6 +45,16 @@ static void read_pipe_thread(struct mp_input_src *src, void *param)
goto done;
}
+ // If we're reading from stdin, unset it. All I/O on synchronous handles is
+ // serialized, so stupid DLLs that call GetFileType on stdin can hang the
+ // process if they do it while we're reading from it. At least, the
+ // VirtualBox OpenGL ICD is affected by this, but only on Windows XP.
+ // GetFileType works differently in later versions of Windows. See:
+ // https://support.microsoft.com/kb/2009703
+ // http://blogs.msdn.com/b/oldnewthing/archive/2011/12/02/10243553.aspx
+ if ((void*)_get_osfhandle(fd) == GetStdHandle(STD_INPUT_HANDLE))
+ SetStdHandle(STD_INPUT_HANDLE, NULL);
+
waio = waio_alloc((void *)_get_osfhandle(fd), 0, NULL, NULL);
if (!waio) {
MP_ERR(src, "Can't initialize win32 file reader.\n");