[EXPLORER] Improve CTrayWindow::OnCopyData (#3028)
[reactos.git] / base / system / winlogon / setup.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Winlogon
4 * FILE: base/system/winlogon/setup.c
5 * PURPOSE: Setup support functions
6 * PROGRAMMERS: Eric Kohl
7 */
8
9 /* INCLUDES *****************************************************************/
10
11 #include "winlogon.h"
12
13 /* FUNCTIONS ****************************************************************/
14
15 DWORD
16 GetSetupType(VOID)
17 {
18 DWORD dwError;
19 HKEY hKey;
20 DWORD dwType;
21 DWORD dwSize;
22 DWORD dwSetupType;
23
24 TRACE("GetSetupType()\n");
25
26 /* Open key */
27 dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
28 L"SYSTEM\\Setup",
29 0,
30 KEY_QUERY_VALUE,
31 &hKey);
32 if (dwError != ERROR_SUCCESS)
33 return 0;
34
35 /* Read key */
36 dwSize = sizeof(DWORD);
37 dwError = RegQueryValueExW(hKey,
38 L"SetupType",
39 NULL,
40 &dwType,
41 (LPBYTE)&dwSetupType,
42 &dwSize);
43
44 /* Close key, and check if returned values are correct */
45 RegCloseKey(hKey);
46 if (dwError != ERROR_SUCCESS || dwType != REG_DWORD || dwSize != sizeof(DWORD))
47 return 0;
48
49 TRACE("GetSetupType() returns %lu\n", dwSetupType);
50 return dwSetupType;
51 }
52
53
54 static
55 DWORD
56 WINAPI
57 RunSetupThreadProc(
58 IN LPVOID lpParameter)
59 {
60 PROCESS_INFORMATION ProcessInformation;
61 STARTUPINFOW StartupInfo;
62 WCHAR Shell[MAX_PATH];
63 WCHAR CommandLine[MAX_PATH];
64 BOOL Result;
65 DWORD dwError;
66 HKEY hKey;
67 DWORD dwType;
68 DWORD dwSize;
69 DWORD dwExitCode;
70
71 TRACE("RunSetup() called\n");
72
73 /* Open key */
74 dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
75 L"SYSTEM\\Setup",
76 0,
77 KEY_QUERY_VALUE,
78 &hKey);
79 if (dwError != ERROR_SUCCESS)
80 return FALSE;
81
82 /* Read key */
83 dwSize = sizeof(Shell);
84 dwError = RegQueryValueExW(hKey,
85 L"CmdLine",
86 NULL,
87 &dwType,
88 (LPBYTE)Shell,
89 &dwSize);
90 RegCloseKey(hKey);
91 if (dwError != ERROR_SUCCESS)
92 return FALSE;
93
94 /* Finish string */
95 Shell[dwSize / sizeof(WCHAR)] = UNICODE_NULL;
96
97 /* Expand string (if applicable) */
98 if (dwType == REG_EXPAND_SZ)
99 ExpandEnvironmentStringsW(Shell, CommandLine, ARRAYSIZE(CommandLine));
100 else if (dwType == REG_SZ)
101 wcscpy(CommandLine, Shell);
102 else
103 return FALSE;
104
105 TRACE("Should run '%s' now\n", debugstr_w(CommandLine));
106
107 SwitchDesktop(WLSession->ApplicationDesktop);
108
109 /* Start process */
110 StartupInfo.cb = sizeof(StartupInfo);
111 StartupInfo.lpReserved = NULL;
112 StartupInfo.lpDesktop = L"WinSta0\\Default";
113 StartupInfo.lpTitle = NULL;
114 StartupInfo.dwFlags = 0;
115 StartupInfo.cbReserved2 = 0;
116 StartupInfo.lpReserved2 = 0;
117
118 Result = CreateProcessW(NULL,
119 CommandLine,
120 NULL,
121 NULL,
122 FALSE,
123 DETACHED_PROCESS,
124 NULL,
125 NULL,
126 &StartupInfo,
127 &ProcessInformation);
128 if (!Result)
129 {
130 TRACE("Failed to run setup process\n");
131 SwitchDesktop(WLSession->WinlogonDesktop);
132 return FALSE;
133 }
134
135 /* Wait for process termination */
136 WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
137
138 GetExitCodeProcess(ProcessInformation.hProcess, &dwExitCode);
139
140 /* Close handles */
141 CloseHandle(ProcessInformation.hThread);
142 CloseHandle(ProcessInformation.hProcess);
143
144 // SwitchDesktop(WLSession->WinlogonDesktop);
145
146 TRACE ("RunSetup() done\n");
147
148 return TRUE;
149 }
150
151
152 BOOL
153 RunSetup(VOID)
154 {
155 HANDLE hThread;
156
157 hThread = CreateThread(NULL,
158 0,
159 RunSetupThreadProc,
160 NULL,
161 0,
162 NULL);
163 if (hThread != NULL)
164 CloseHandle(hThread);
165
166 return hThread != NULL;
167 }
168
169 /* EOF */