From bd09340cf2d4dae6e9abd2dd11c532fee7711c41 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 31 Mar 2008 17:26:42 +0200 Subject: [PATCH] user32: Don't start explorer.exe on non-visible window stations. --- dlls/user32/win.c | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/dlls/user32/win.c b/dlls/user32/win.c index d5d02673771..aa5bd878eca 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -1620,30 +1620,35 @@ HWND WINAPI GetDesktopWindow(void) if (!thread_info->desktop) { - static const WCHAR command_line[] = {'\\','e','x','p','l','o','r','e','r','.','e','x','e',' ','/','d','e','s','k','t','o','p',0}; - STARTUPINFOW si; - PROCESS_INFORMATION pi; - WCHAR cmdline[MAX_PATH + sizeof(command_line)/sizeof(WCHAR)]; - - memset( &si, 0, sizeof(si) ); - si.cb = sizeof(si); - si.dwFlags = STARTF_USESTDHANDLES; - si.hStdInput = 0; - si.hStdOutput = 0; - si.hStdError = GetStdHandle( STD_ERROR_HANDLE ); - - GetSystemDirectoryW( cmdline, MAX_PATH ); - lstrcatW( cmdline, command_line ); - if (CreateProcessW( NULL, cmdline, NULL, NULL, FALSE, DETACHED_PROCESS, - NULL, NULL, &si, &pi )) + USEROBJECTFLAGS flags; + if (!GetUserObjectInformationW( GetProcessWindowStation(), UOI_FLAGS, &flags, + sizeof(flags), NULL ) || (flags.dwFlags & WSF_VISIBLE)) { - TRACE( "started explorer pid %04x tid %04x\n", pi.dwProcessId, pi.dwThreadId ); - WaitForInputIdle( pi.hProcess, 10000 ); - CloseHandle( pi.hThread ); - CloseHandle( pi.hProcess ); + static const WCHAR command_line[] = {'\\','e','x','p','l','o','r','e','r','.','e','x','e',' ','/','d','e','s','k','t','o','p',0}; + STARTUPINFOW si; + PROCESS_INFORMATION pi; + WCHAR cmdline[MAX_PATH + sizeof(command_line)/sizeof(WCHAR)]; + memset( &si, 0, sizeof(si) ); + si.cb = sizeof(si); + si.dwFlags = STARTF_USESTDHANDLES; + si.hStdInput = 0; + si.hStdOutput = 0; + si.hStdError = GetStdHandle( STD_ERROR_HANDLE ); + + GetSystemDirectoryW( cmdline, MAX_PATH ); + lstrcatW( cmdline, command_line ); + if (CreateProcessW( NULL, cmdline, NULL, NULL, FALSE, DETACHED_PROCESS, + NULL, NULL, &si, &pi )) + { + TRACE( "started explorer pid %04x tid %04x\n", pi.dwProcessId, pi.dwThreadId ); + WaitForInputIdle( pi.hProcess, 10000 ); + CloseHandle( pi.hThread ); + CloseHandle( pi.hProcess ); + } + else WARN( "failed to start explorer, err %d\n", GetLastError() ); } - else WARN( "failed to start explorer, err %d\n", GetLastError() ); + else TRACE( "not starting explorer since winstation is not visible\n" ); SERVER_START_REQ( get_desktop_window ) {