From bcec1fd6c37677d46d6890d270bb1e27d17f8f34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Tue, 17 Jul 2018 01:49:07 +0200 Subject: [PATCH] [WINLOGON] When starting Setup (which runs with SYSTEM credentials), explicitly specify on which window station and desktop we start it, so as to avoid the default choice of the non-interactive Service-0x0-3e7$ window station. Also, switch to the WinSta0\Default desktop just only before starting Setup, and restore Winlogon setup when it finishes. --- base/system/winlogon/setup.c | 9 +++++++-- base/system/winlogon/winlogon.c | 6 +++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/base/system/winlogon/setup.c b/base/system/winlogon/setup.c index 7cec968e0e4..f5ef3673186 100644 --- a/base/system/winlogon/setup.c +++ b/base/system/winlogon/setup.c @@ -96,7 +96,7 @@ RunSetupThreadProc( /* Expand string (if applicable) */ if (dwType == REG_EXPAND_SZ) - ExpandEnvironmentStringsW(Shell, CommandLine, MAX_PATH); + ExpandEnvironmentStringsW(Shell, CommandLine, ARRAYSIZE(CommandLine)); else if (dwType == REG_SZ) wcscpy(CommandLine, Shell); else @@ -104,10 +104,12 @@ RunSetupThreadProc( TRACE("Should run '%s' now\n", debugstr_w(CommandLine)); + SwitchDesktop(WLSession->ApplicationDesktop); + /* Start process */ StartupInfo.cb = sizeof(StartupInfo); StartupInfo.lpReserved = NULL; - StartupInfo.lpDesktop = NULL; + StartupInfo.lpDesktop = L"WinSta0\\Default"; StartupInfo.lpTitle = NULL; StartupInfo.dwFlags = 0; StartupInfo.cbReserved2 = 0; @@ -126,6 +128,7 @@ RunSetupThreadProc( if (!Result) { TRACE("Failed to run setup process\n"); + SwitchDesktop(WLSession->WinlogonDesktop); return FALSE; } @@ -138,6 +141,8 @@ RunSetupThreadProc( CloseHandle(ProcessInformation.hThread); CloseHandle(ProcessInformation.hProcess); + SwitchDesktop(WLSession->WinlogonDesktop); + TRACE ("RunSetup() done\n"); return TRUE; diff --git a/base/system/winlogon/winlogon.c b/base/system/winlogon/winlogon.c index 2b2e5303f6e..eeba3a2334b 100644 --- a/base/system/winlogon/winlogon.c +++ b/base/system/winlogon/winlogon.c @@ -453,14 +453,14 @@ WinMain( /* Check for pending setup */ if (GetSetupType() != 0) { - TRACE("WL: Setup mode detected\n"); - /* Run setup and reboot when done */ - SwitchDesktop(WLSession->ApplicationDesktop); + TRACE("WL: Setup mode detected\n"); RunSetup(); } else + { PostMessageW(WLSession->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_CTRL_ALT_DEL, 0); + } (void)LoadLibraryW(L"sfc_os.dll");