mirror of
https://github.com/reactos/reactos.git
synced 2024-10-30 11:35:58 +00:00
170 lines
4.3 KiB
C
170 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 */
|