reactos/base/system/winlogon/setup.c
2018-08-06 17:38:00 +02:00

169 lines
4.3 KiB
C

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Winlogon
* FILE: base/system/winlogon/setup.c
* PURPOSE: Setup support functions
* PROGRAMMERS: Eric Kohl
*/
/* INCLUDES *****************************************************************/
#include "winlogon.h"
/* FUNCTIONS ****************************************************************/
DWORD
GetSetupType(VOID)
{
DWORD dwError;
HKEY hKey;
DWORD dwType;
DWORD dwSize;
DWORD dwSetupType;
TRACE("GetSetupType()\n");
/* Open key */
dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SYSTEM\\Setup",
0,
KEY_QUERY_VALUE,
&hKey);
if (dwError != ERROR_SUCCESS)
return 0;
/* Read key */
dwSize = sizeof(DWORD);
dwError = RegQueryValueExW(hKey,
L"SetupType",
NULL,
&dwType,
(LPBYTE)&dwSetupType,
&dwSize);
/* Close key, and check if returned values are correct */
RegCloseKey(hKey);
if (dwError != ERROR_SUCCESS || dwType != REG_DWORD || dwSize != sizeof(DWORD))
return 0;
TRACE("GetSetupType() returns %lu\n", dwSetupType);
return dwSetupType;
}
static
DWORD
WINAPI
RunSetupThreadProc(
IN LPVOID lpParameter)
{
PROCESS_INFORMATION ProcessInformation;
STARTUPINFOW StartupInfo;
WCHAR Shell[MAX_PATH];
WCHAR CommandLine[MAX_PATH];
BOOL Result;
DWORD dwError;
HKEY hKey;
DWORD dwType;
DWORD dwSize;
DWORD dwExitCode;
TRACE("RunSetup() called\n");
/* Open key */
dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SYSTEM\\Setup",
0,
KEY_QUERY_VALUE,
&hKey);
if (dwError != ERROR_SUCCESS)
return FALSE;
/* Read key */
dwSize = sizeof(Shell);
dwError = RegQueryValueExW(hKey,
L"CmdLine",
NULL,
&dwType,
(LPBYTE)Shell,
&dwSize);
RegCloseKey(hKey);
if (dwError != ERROR_SUCCESS)
return FALSE;
/* Finish string */
Shell[dwSize / sizeof(WCHAR)] = UNICODE_NULL;
/* Expand string (if applicable) */
if (dwType == REG_EXPAND_SZ)
ExpandEnvironmentStringsW(Shell, CommandLine, ARRAYSIZE(CommandLine));
else if (dwType == REG_SZ)
wcscpy(CommandLine, Shell);
else
return FALSE;
TRACE("Should run '%s' now\n", debugstr_w(CommandLine));
SwitchDesktop(WLSession->ApplicationDesktop);
/* Start process */
StartupInfo.cb = sizeof(StartupInfo);
StartupInfo.lpReserved = NULL;
StartupInfo.lpDesktop = L"WinSta0\\Default";
StartupInfo.lpTitle = NULL;
StartupInfo.dwFlags = 0;
StartupInfo.cbReserved2 = 0;
StartupInfo.lpReserved2 = 0;
Result = CreateProcessW(NULL,
CommandLine,
NULL,
NULL,
FALSE,
DETACHED_PROCESS,
NULL,
NULL,
&StartupInfo,
&ProcessInformation);
if (!Result)
{
TRACE("Failed to run setup process\n");
SwitchDesktop(WLSession->WinlogonDesktop);
return FALSE;
}
/* Wait for process termination */
WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
GetExitCodeProcess(ProcessInformation.hProcess, &dwExitCode);
/* Close handles */
CloseHandle(ProcessInformation.hThread);
CloseHandle(ProcessInformation.hProcess);
// SwitchDesktop(WLSession->WinlogonDesktop);
TRACE ("RunSetup() done\n");
return TRUE;
}
BOOL
RunSetup(VOID)
{
HANDLE hThread;
hThread = CreateThread(NULL,
0,
RunSetupThreadProc,
NULL,
0,
NULL);
if (hThread != NULL)
CloseHandle(hThread);
return hThread != NULL;
}
/* EOF */