[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.
This commit is contained in:
Hermès Bélusca-Maïto 2018-07-17 01:49:07 +02:00
parent b1c7fd08e9
commit bcec1fd6c3
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
2 changed files with 10 additions and 5 deletions

View file

@ -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;

View file

@ -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");