ReactOS 0.4.17-dev-573-g8315b8c
userinit.c File Reference
#include "userinit.h"
#include <userenv.h>
Include dependency graph for userinit.c:

Go to the source code of this file.

Macros

#define CMP_MAGIC   0x01234567
 

Typedefs

typedef DWORD(WINAPIPCMP_REPORT_LOGON) (DWORD, DWORD)
 

Functions

LONG ReadRegSzKey (IN HKEY hKey, IN LPCWSTR pszKey, OUT LPWSTR *pValue)
 
static BOOL IsConsoleShell (VOID)
 
static BOOL GetShell (OUT WCHAR *CommandLine, IN HKEY hRootKey)
 
static BOOL StartProcess (_In_ PCWSTR CommandLine, _In_opt_ PVOID pEnvironment)
 
static BOOL StartShell (_In_opt_ PVOID pEnvironment)
 
static COLORREF StrToColorref (IN LPWSTR lpszCol)
 
static VOID SetUserSysColors (VOID)
 
static VOID SetUserWallpaper (VOID)
 
static VOID SetUserSettings (VOID)
 
static VOID NotifyLogon (VOID)
 
static BOOL StartInstaller (VOID)
 
static BOOL EnablePrivilege (LPCWSTR lpszPrivilegeName, BOOL bEnablePrivilege)
 
int WINAPI wWinMain (IN HINSTANCE hInst, IN HINSTANCE hPrevInstance, IN LPWSTR lpszCmdLine, IN int nCmdShow)
 

Variables

HINSTANCE hInstance
 
const WCHAR g_RegColorNames [][32]
 

Macro Definition Documentation

◆ CMP_MAGIC

#define CMP_MAGIC   0x01234567

Definition at line 30 of file userinit.c.

Typedef Documentation

◆ PCMP_REPORT_LOGON

typedef DWORD(WINAPI * PCMP_REPORT_LOGON) (DWORD, DWORD)

Definition at line 471 of file userinit.c.

Function Documentation

◆ EnablePrivilege()

static BOOL EnablePrivilege ( LPCWSTR  lpszPrivilegeName,
BOOL  bEnablePrivilege 
)
static

Definition at line 514 of file userinit.c.

515{
517 HANDLE hToken;
519
522 &hToken);
523 if (!Success) return Success;
524
526 lpszPrivilegeName,
527 &tp.Privileges[0].Luid);
528 if (!Success) goto Quit;
529
530 tp.PrivilegeCount = 1;
531 tp.Privileges[0].Attributes = (bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0);
532
533 Success = AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
534
535Quit:
536 CloseHandle(hToken);
537 return Success;
538}
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
BOOL WINAPI LookupPrivilegeValueW(LPCWSTR lpSystemName, LPCWSTR lpPrivilegeName, PLUID lpLuid)
Definition: misc.c:782
BOOL WINAPI AdjustTokenPrivileges(HANDLE TokenHandle, BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength)
Definition: security.c:374
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
Definition: security.c:294
#define CloseHandle
Definition: compat.h:739
#define GetCurrentProcess()
Definition: compat.h:759
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
Definition: btrfs.c:2996
@ Success
Definition: eventcreate.c:712
unsigned int BOOL
Definition: ntddk_ex.h:94
#define TOKEN_ADJUST_PRIVILEGES
Definition: setypes.h:942
#define SE_PRIVILEGE_ENABLED
Definition: setypes.h:63

Referenced by wWinMain().

◆ GetShell()

static BOOL GetShell ( OUT WCHAR CommandLine,
IN HKEY  hRootKey 
)
static

Definition at line 133 of file userinit.c.

136{
137 HKEY hKey;
138 DWORD Type, Size;
140 BOOL ConsoleShell = IsConsoleShell();
141 LONG rc;
142
143 rc = RegOpenKeyExW(hRootKey, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
144 0, KEY_QUERY_VALUE, &hKey);
145 if (rc != ERROR_SUCCESS)
146 {
147 WARN("RegOpenKeyEx() failed with error %lu\n", rc);
148 return FALSE;
149 }
150
151 Size = sizeof(Shell);
153 ConsoleShell ? L"ConsoleShell" : L"Shell",
154 NULL,
155 &Type,
156 (LPBYTE)Shell,
157 &Size);
159
160 if (rc != ERROR_SUCCESS)
161 {
162 WARN("RegQueryValueEx() failed with error %lu\n", rc);
163 return FALSE;
164 }
165
166 if ((Type == REG_SZ) || (Type == REG_EXPAND_SZ))
167 {
168 TRACE("Found command line %s\n", debugstr_w(Shell));
169 wcscpy(CommandLine, Shell);
170 return TRUE;
171 }
172 else
173 {
174 WARN("Wrong type %lu (expected %u or %u)\n", Type, REG_SZ, REG_EXPAND_SZ);
175 return FALSE;
176 }
177}
Type
Definition: Type.h:7
#define WARN(fmt,...)
Definition: precomp.h:61
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_SUCCESS
Definition: deptool.c:10
#define TRUE
Definition: types.h:120
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
#define MAX_PATH
Definition: compat.h:34
#define L(x)
Definition: resources.c:13
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
#define debugstr_w
Definition: kernel32.h:32
#define REG_SZ
Definition: layer.c:22
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
#define REG_EXPAND_SZ
Definition: nt_native.h:1497
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
wcscpy
#define TRACE(s)
Definition: solgame.cpp:4
unsigned char * LPBYTE
Definition: typedefs.h:53
static BOOL IsConsoleShell(VOID)
Definition: userinit.c:81
static int Shell(const char **args)
Definition: vfdcmd.c:1020
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539

Referenced by StartShell().

◆ IsConsoleShell()

static BOOL IsConsoleShell ( VOID  )
static

Definition at line 81 of file userinit.c.

82{
83 HKEY ControlKey = NULL;
84 LPWSTR SystemStartOptions = NULL;
85 LPWSTR CurrentOption, NextOption; /* Pointers into SystemStartOptions */
86 LONG rc;
87 BOOL ret = FALSE;
88
91 0,
93 &ControlKey);
94 if (rc != ERROR_SUCCESS)
95 {
96 WARN("RegOpenKeyEx() failed with error %lu\n", rc);
97 goto cleanup;
98 }
99
100 rc = ReadRegSzKey(ControlKey, L"SystemStartOptions", &SystemStartOptions);
101 if (rc != ERROR_SUCCESS)
102 {
103 WARN("ReadRegSzKey() failed with error %lu\n", rc);
104 goto cleanup;
105 }
106
107 /* Check for CONSOLE switch in SystemStartOptions */
108 CurrentOption = SystemStartOptions;
109 while (CurrentOption)
110 {
111 NextOption = wcschr(CurrentOption, L' ');
112 if (NextOption)
113 *NextOption = L'\0';
114 if (_wcsicmp(CurrentOption, L"CONSOLE") == 0)
115 {
116 TRACE("Found 'CONSOLE' boot option\n");
117 ret = TRUE;
118 goto cleanup;
119 }
120 CurrentOption = NextOption ? NextOption + 1 : NULL;
121 }
122
123cleanup:
124 if (ControlKey != NULL)
125 RegCloseKey(ControlKey);
126 HeapFree(GetProcessHeap(), 0, SystemStartOptions);
127
128 TRACE("IsConsoleShell() returning %u\n", ret);
129 return ret;
130}
#define wcschr
Definition: compat.h:17
#define GetProcessHeap()
Definition: compat.h:736
#define HeapFree(x, y, z)
Definition: compat.h:735
static void cleanup(void)
Definition: main.c:1335
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:164
return ret
Definition: mutex.c:146
static char * NextOption(const char *const ostr)
Definition: getopt.c:31
#define REGSTR_PATH_CURRENT_CONTROL_SET
Definition: regstr.h:564
uint16_t * LPWSTR
Definition: typedefs.h:56
LONG ReadRegSzKey(IN HKEY hKey, IN LPCWSTR pszKey, OUT LPWSTR *pValue)
Definition: userinit.c:39
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12

Referenced by GetShell(), and StartShell().

◆ NotifyLogon()

static VOID NotifyLogon ( VOID  )
static

Definition at line 474 of file userinit.c.

475{
478
479 hModule = LoadLibraryW(L"setupapi.dll");
480 if (!hModule)
481 {
482 WARN("LoadLibrary() failed with error %lu\n", GetLastError());
483 return;
484 }
485
489 else
490 WARN("GetProcAddress() failed\n");
491
493}
CONFIGRET WINAPI CMP_Report_LogOn(_In_ DWORD dwMagic, _In_ DWORD dwProcessId)
Definition: cfgmgr.c:739
HMODULE hModule
Definition: animate.c:44
#define GetProcAddress(x, y)
Definition: compat.h:753
#define FreeLibrary(x)
Definition: compat.h:748
#define LoadLibraryW(x)
Definition: compat.h:747
DWORD(WINAPI * PCMP_REPORT_LOGON)(DWORD, DWORD)
Definition: userinit.c:471
#define CMP_MAGIC
Definition: userinit.c:30
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1155

Referenced by wWinMain().

◆ ReadRegSzKey()

LONG ReadRegSzKey ( IN HKEY  hKey,
IN LPCWSTR  pszKey,
OUT LPWSTR pValue 
)

Definition at line 39 of file userinit.c.

43{
44 LONG rc;
45 DWORD dwType;
46 DWORD cbData = 0;
48
49 rc = RegQueryValueExW(hKey, pszKey, NULL, &dwType, NULL, &cbData);
50 if (rc != ERROR_SUCCESS)
51 {
52 WARN("RegQueryValueEx(%s) failed with error %lu\n", debugstr_w(pszKey), rc);
53 return rc;
54 }
55 if (dwType != REG_SZ)
56 {
57 WARN("Wrong registry data type (%u vs %u)\n", dwType, REG_SZ);
59 }
60 Value = (WCHAR*) HeapAlloc(GetProcessHeap(), 0, cbData + sizeof(WCHAR));
61 if (!Value)
62 {
63 WARN("No memory\n");
65 }
66 rc = RegQueryValueExW(hKey, pszKey, NULL, NULL, (LPBYTE)Value, &cbData);
67 if (rc != ERROR_SUCCESS)
68 {
69 WARN("RegQueryValueEx(%s) failed with error %lu\n", debugstr_w(pszKey), rc);
71 return rc;
72 }
73 /* NULL-terminate the string */
74 Value[cbData / sizeof(WCHAR)] = L'\0';
75
76 *pValue = Value;
77 return ERROR_SUCCESS;
78}
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define HeapAlloc
Definition: compat.h:733
PWCHAR pValue
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
_In_opt_ _In_opt_ _In_ _In_ DWORD cbData
Definition: shlwapi.h:761
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413

Referenced by IsConsoleShell().

◆ SetUserSettings()

static VOID SetUserSettings ( VOID  )
static

Definition at line 464 of file userinit.c.

465{
469}
DWORD WINAPI UpdatePerUserSystemParameters(DWORD dw1, DWORD dw2)
static VOID SetUserWallpaper(VOID)
Definition: userinit.c:423
static VOID SetUserSysColors(VOID)
Definition: userinit.c:385

Referenced by wWinMain().

◆ SetUserSysColors()

static VOID SetUserSysColors ( VOID  )
static

Definition at line 385 of file userinit.c.

386{
387 HKEY hKey;
388 INT i;
389 WCHAR szColor[25];
390 DWORD Type, Size;
391 COLORREF crColor;
392 LONG rc;
393
395 0, KEY_QUERY_VALUE, &hKey);
396 if (rc != ERROR_SUCCESS)
397 {
398 WARN("RegOpenKeyEx() failed with error %lu\n", rc);
399 return;
400 }
401
402 for (i = 0; i < ARRAYSIZE(g_RegColorNames); i++)
403 {
404 Size = sizeof(szColor);
406 (LPBYTE)szColor, &Size);
407 if (rc == ERROR_SUCCESS && Type == REG_SZ)
408 {
409 crColor = StrToColorref(szColor);
410 SetSysColors(1, &i, &crColor);
411 }
412 else
413 {
414 WARN("RegQueryValueEx(%s) failed with error %lu\n",
416 }
417 }
418
420}
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define REGSTR_PATH_COLORS
Definition: regstr.h:662
int32_t INT
Definition: typedefs.h:58
const WCHAR g_RegColorNames[][32]
Definition: userinit.c:338
static COLORREF StrToColorref(IN LPWSTR lpszCol)
Definition: userinit.c:373
DWORD COLORREF
Definition: windef.h:100
#define HKEY_CURRENT_USER
Definition: winreg.h:11
BOOL WINAPI SetSysColors(_In_ int cElements, _In_reads_(cElements) CONST INT *lpaElements, _In_reads_(cElements) CONST COLORREF *lpaRgbValues)

Referenced by SetUserSettings().

◆ SetUserWallpaper()

static VOID SetUserWallpaper ( VOID  )
static

Definition at line 423 of file userinit.c.

424{
425 HKEY hKey;
426 DWORD Type, Size;
427 WCHAR szWallpaper[MAX_PATH + 1];
428 LONG rc;
429
431 0, KEY_QUERY_VALUE, &hKey);
432 if (rc != ERROR_SUCCESS)
433 {
434 WARN("RegOpenKeyEx() failed with error %lu\n", rc);
435 return;
436 }
437
438 Size = sizeof(szWallpaper);
440 L"Wallpaper",
441 NULL,
442 &Type,
443 (LPBYTE)szWallpaper,
444 &Size);
446
447 if (rc == ERROR_SUCCESS && Type == REG_SZ)
448 {
449 ExpandEnvironmentStringsW(szWallpaper, szWallpaper, ARRAYSIZE(szWallpaper));
450 TRACE("Using wallpaper %s\n", debugstr_w(szWallpaper));
451
452 /* Load and change the wallpaper */
454 }
455 else
456 {
457 /* Remove the wallpaper */
458 TRACE("No wallpaper set in registry (error %lu)\n", rc);
460 }
461}
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:492
#define REGSTR_PATH_DESKTOP
Definition: regstr.h:659
#define SPI_SETDESKWALLPAPER
Definition: winuser.h:1380
#define SPIF_SENDCHANGE
Definition: winuser.h:1600
BOOL WINAPI SystemParametersInfoW(_In_ UINT uiAction, _In_ UINT uiParam, _Inout_opt_ PVOID pvParam, _In_ UINT fWinIni)

Referenced by SetUserSettings().

◆ StartInstaller()

static BOOL StartInstaller ( VOID  )
static

Definition at line 496 of file userinit.c.

497{
498 extern WCHAR Installer[MAX_PATH]; // In livecd.c
500
501 /* If we have found the ReactOS Installer, start it */
503 return TRUE;
504
505 /* We failed, display an error message and quit */
506 ERR("Failed to start the installer '%s'\n", debugstr_w(Installer));
508 MessageBoxW(NULL, szMsg, NULL, MB_OK);
509 return FALSE;
510}
#define RC_STRING_MAX_SIZE
Definition: resource.h:3
#define ERR(fmt,...)
Definition: precomp.h:57
#define IDS_INSTALLER_FAIL
Definition: resource.h:29
WCHAR Installer[MAX_PATH]
Definition: livecd.c:14
#define LoadStringW
Definition: utils.h:64
static BOOL StartProcess(_In_ PCWSTR CommandLine, _In_opt_ PVOID pEnvironment)
Definition: userinit.c:180
#define GetModuleHandle
Definition: winbase.h:3548
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
#define MB_OK
Definition: winuser.h:801

Referenced by wWinMain().

◆ StartProcess()

static BOOL StartProcess ( _In_ PCWSTR  CommandLine,
_In_opt_ PVOID  pEnvironment 
)
static

Definition at line 180 of file userinit.c.

183{
186 WCHAR ExpandedCmdLine[MAX_PATH], ProfilePath[MAX_PATH];
187 HANDLE hToken;
189
190 ExpandEnvironmentStringsW(CommandLine, ExpandedCmdLine, ARRAYSIZE(ExpandedCmdLine));
191
192 ZeroMemory(&si, sizeof(si));
193 si.cb = sizeof(si);
194 si.dwFlags = STARTF_USESHOWWINDOW;
195 si.wShowWindow = SW_SHOWNORMAL;
196 ZeroMemory(&pi, sizeof(pi));
197
199 {
200 DWORD PathSize = _countof(ProfilePath);
201 if (GetUserProfileDirectoryW(hToken, ProfilePath, &PathSize))
202 WorkingDir = ProfilePath;
203 CloseHandle(hToken);
204 }
205
206 if (!CreateProcessW(NULL,
207 ExpandedCmdLine,
208 NULL,
209 NULL,
210 FALSE,
212 pEnvironment,
214 &si,
215 &pi))
216 {
217 WARN("CreateProcessW() failed with error %lu\n", GetLastError());
218 return FALSE;
219 }
220
223 return TRUE;
224}
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
Definition: proc.c:4441
static const WCHAR WorkingDir[]
Definition: install.c:50
BOOL WINAPI GetUserProfileDirectoryW(_In_ HANDLE hToken, _Out_opt_ LPWSTR lpProfileDir, _Inout_ LPDWORD lpcchSize)
Definition: profile.c:1792
#define ZeroMemory
Definition: minwinbase.h:31
static PROCESS_INFORMATION pi
Definition: debugger.c:2303
static SYSTEM_INFO si
Definition: virtual.c:39
#define _countof(array)
Definition: sndvol32.h:70
uint16_t * PWCHAR
Definition: typedefs.h:56
#define NORMAL_PRIORITY_CLASS
Definition: winbase.h:186
#define STARTF_USESHOWWINDOW
Definition: winbase.h:468
#define CREATE_UNICODE_ENVIRONMENT
Definition: winbase.h:191
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define TOKEN_QUERY
Definition: setypes.h:940

Referenced by StartInstaller(), and StartShell().

◆ StartShell()

static BOOL StartShell ( _In_opt_ PVOID  pEnvironment)
static

Definition at line 227 of file userinit.c.

229{
230 DWORD Type, Size;
231 DWORD Value = 0;
232 LONG rc;
233 HKEY hKey;
236
237 /* Safe Mode shell run */
239 L"SYSTEM\\CurrentControlSet\\Control\\SafeBoot\\Option",
240 0, KEY_QUERY_VALUE, &hKey);
241 if (rc == ERROR_SUCCESS)
242 {
243 Size = sizeof(Value);
244 rc = RegQueryValueExW(hKey, L"UseAlternateShell", NULL,
245 &Type, (LPBYTE)&Value, &Size);
247
248 if (rc == ERROR_SUCCESS)
249 {
250 if (Type == REG_DWORD)
251 {
252 if (Value)
253 {
254 /* Safe Mode Alternate Shell required */
256 L"SYSTEM\\CurrentControlSet\\Control\\SafeBoot",
257 0, KEY_READ, &hKey);
258 if (rc == ERROR_SUCCESS)
259 {
260 Size = sizeof(Shell);
261 rc = RegQueryValueExW(hKey, L"AlternateShell", NULL,
262 &Type, (LPBYTE)Shell, &Size);
264
265 if (rc == ERROR_SUCCESS)
266 {
267 if ((Type == REG_SZ) || (Type == REG_EXPAND_SZ))
268 {
269 TRACE("Key located - %s\n", debugstr_w(Shell));
270
271 /* Try to run alternate shell */
272 if (StartProcess(Shell, pEnvironment))
273 {
274 TRACE("Alternate shell started (Safe Mode)\n");
275 return TRUE;
276 }
277 }
278 else
279 {
280 WARN("Wrong type %lu (expected %u or %u)\n",
282 }
283 }
284 else
285 {
286 WARN("Alternate shell in Safe Mode required but not specified.\n");
287 }
288 }
289 }
290 }
291 else
292 {
293 WARN("Wrong type %lu (expected %u)\n", Type, REG_DWORD);
294 }
295 }
296 }
297
298 /* Try to run shell in user key */
299 if (GetShell(Shell, HKEY_CURRENT_USER) && StartProcess(Shell, pEnvironment))
300 {
301 TRACE("Started shell from HKEY_CURRENT_USER\n");
302 return TRUE;
303 }
304
305 /* Try to run shell in local machine key */
306 if (GetShell(Shell, HKEY_LOCAL_MACHINE) && StartProcess(Shell, pEnvironment))
307 {
308 TRACE("Started shell from HKEY_LOCAL_MACHINE\n");
309 return TRUE;
310 }
311
312 /* Try default shell */
313 if (IsConsoleShell())
314 {
318 StringCchCatW(Shell, ARRAYSIZE(Shell), L"cmd.exe");
319 }
320 else
321 {
325 StringCchCatW(Shell, ARRAYSIZE(Shell), L"explorer.exe");
326 }
327
328 if (StartProcess(Shell, pEnvironment))
329 return TRUE;
330
331 /* We failed, display an error message and quit */
332 ERR("Failed to start default shell '%s'\n", debugstr_w(Shell));
334 MessageBoxW(NULL, szMsg, NULL, MB_OK);
335 return FALSE;
336}
#define IDS_SHELL_FAIL
Definition: resource.h:28
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2232
UINT WINAPI GetSystemWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2316
#define KEY_READ
Definition: nt_native.h:1026
#define UNICODE_NULL
#define REG_DWORD
Definition: sdbapi.c:615
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
static BOOL GetShell(OUT WCHAR *CommandLine, IN HKEY hRootKey)
Definition: userinit.c:133

Referenced by wWinMain().

◆ StrToColorref()

static COLORREF StrToColorref ( IN LPWSTR  lpszCol)
static

Definition at line 373 of file userinit.c.

375{
376 BYTE rgb[3];
377
378 rgb[0] = (BYTE)wcstoul(lpszCol, &lpszCol, 10);
379 rgb[1] = (BYTE)wcstoul(lpszCol, &lpszCol, 10);
380 rgb[2] = (BYTE)wcstoul(lpszCol, &lpszCol, 10);
381 return RGB(rgb[0], rgb[1], rgb[2]);
382}
_ACRTIMP __msvcrt_ulong __cdecl wcstoul(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2917
#define RGB(r, g, b)
Definition: precomp.h:67
_In_ ULONG _In_ ULONG rgb
Definition: winddi.h:3521
unsigned char BYTE
Definition: xxhash.c:193

Referenced by SetUserSysColors().

◆ wWinMain()

int WINAPI wWinMain ( IN HINSTANCE  hInst,
IN HINSTANCE  hPrevInstance,
IN LPWSTR  lpszCmdLine,
IN int  nCmdShow 
)

Definition at line 542 of file userinit.c.

546{
547 BOOL bIsLiveCD, Success = TRUE;
548 STATE State;
549
551
552 bIsLiveCD = IsMiniNT();
553
554Restart:
556
557 if (bIsLiveCD)
558 {
559 State.NextPage = LOCALEPAGE;
560 State.Run = SHELL;
561 }
562 else
563 {
564 State.NextPage = DONE;
565 State.Run = SHELL;
566 }
567
568 if (State.NextPage != DONE) // && bIsLiveCD
569 {
571 }
572
573 switch (State.Run)
574 {
575 case SHELL:
576 {
577 /* In LiveCD mode, create a suitable environment block for the
578 * shell; otherwise, use the current one (built by WinLogon) */
579 PVOID pEnvironment = NULL;
580 if (bIsLiveCD && /* In LiveCD mode we run under the LocalSystem account */
581 !CreateEnvironmentBlock(&pEnvironment, NULL, TRUE))
582 {
583 WARN("CreateEnvironmentBlock() failed, fall back to default (error %lu)\n",
584 GetLastError());
585 }
586 Success = StartShell(pEnvironment);
587 if (pEnvironment)
588 DestroyEnvironmentBlock(pEnvironment);
589 if (Success)
590 NotifyLogon();
591 break;
592 }
593
594 case INSTALLER:
596 break;
597
598 case REBOOT:
599 {
603 Success = TRUE;
604 break;
605 }
606
607 default:
608 Success = FALSE;
609 break;
610 }
611
612 /*
613 * In LiveCD mode, go back to the main menu if we failed
614 * to either start the shell or the installer.
615 */
616 if (bIsLiveCD && !Success)
617 goto Restart;
618
619 return 0;
620}
BOOL WINAPI DestroyEnvironmentBlock(IN LPVOID lpEnvironment)
Definition: environment.c:725
BOOL WINAPI CreateEnvironmentBlock(OUT LPVOID *lpEnvironment, IN HANDLE hToken, IN BOOL bInherit)
Definition: environment.c:503
HINSTANCE hInst
Definition: dxdiag.c:13
VOID RunLiveCD(PSTATE pState)
Definition: livecd.c:978
#define DONE
Definition: rnr20lib.h:14
@ Restart
Definition: sacdrv.h:269
Definition: userinit.h:57
static BOOL IsMiniNT(VOID)
Check whether we are running in MiniNT mode (e.g. live medium).
Definition: umpnpmgr.c:208
static VOID SetUserSettings(VOID)
Definition: userinit.c:464
static BOOL EnablePrivilege(LPCWSTR lpszPrivilegeName, BOOL bEnablePrivilege)
Definition: userinit.c:514
static BOOL StartInstaller(VOID)
Definition: userinit.c:496
static BOOL StartShell(_In_opt_ PVOID pEnvironment)
Definition: userinit.c:227
HINSTANCE hInstance
Definition: userinit.c:34
static VOID NotifyLogon(VOID)
Definition: userinit.c:474
@ REBOOT
Definition: userinit.h:44
@ INSTALLER
Definition: userinit.h:43
@ SHELL
Definition: userinit.h:42
@ LOCALEPAGE
Definition: userinit.h:35
#define SE_SHUTDOWN_NAME
Definition: winnt_old.h:427
#define EWX_REBOOT
Definition: winuser.h:646
BOOL WINAPI ExitWindowsEx(_In_ UINT, _In_ DWORD)

Variable Documentation

◆ g_RegColorNames

const WCHAR g_RegColorNames[][32]

Definition at line 338 of file userinit.c.

Referenced by SetUserSysColors().

◆ hInstance

HINSTANCE hInstance

Definition at line 34 of file userinit.c.

Referenced by wWinMain().