ReactOS  0.4.15-dev-3440-g915569a
startup.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2002 Andreas Mohr
3  * Copyright (C) 2002 Shachar Shemesh
4  * Copyright (C) 2013 Edijs Kolesnikovics
5  * Copyright (C) 2018 Katayama Hirofumi MZ
6  * Copyright (C) 2021 He Yang
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 /* Based on the Wine "bootup" handler application
24  *
25  * This app handles the various "hooks" windows allows for applications to perform
26  * as part of the bootstrap process. Theses are roughly devided into three types.
27  * Knowledge base articles that explain this are 137367, 179365, 232487 and 232509.
28  * Also, 119941 has some info on grpconv.exe
29  * The operations performed are (by order of execution):
30  *
31  * After log in
32  * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx (synch)
33  * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce (synch)
34  * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run (asynch)
35  * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (asynch)
36  * - All users Startup folder "%ALLUSERSPROFILE%\Start Menu\Programs\Startup" (asynch, no imp)
37  * - Current user Startup folder "%USERPROFILE%\Start Menu\Programs\Startup" (asynch, no imp)
38  * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce (asynch)
39  *
40  * None is processed in Safe Mode
41  */
42 
43 #include "precomp.h"
44 
45 // For the auto startup process
47 
48 #define INVALID_RUNCMD_RETURN -1
49 
61 static int runCmd(LPWSTR cmdline, LPCWSTR dir, BOOL wait, BOOL minimized)
62 {
63  STARTUPINFOW si;
65  DWORD exit_code = 0;
66 
67  memset(&si, 0, sizeof(si));
68  si.cb = sizeof(si);
69  if (minimized)
70  {
73  }
74  memset(&info, 0, sizeof(info));
75 
76  if (!CreateProcessW(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, dir, &si, &info))
77  {
78  TRACE("Failed to run command (%lu)\n", GetLastError());
79 
80  return INVALID_RUNCMD_RETURN;
81  }
82 
83  TRACE("Successfully ran command\n");
84 
85  if (wait)
86  {
87  HANDLE Handles[] = { info.hProcess };
88  DWORD nCount = _countof(Handles);
89  DWORD dwWait;
90  MSG msg;
91 
92  /* wait for the process to exit */
93  for (;;)
94  {
95  /* We need to keep processing messages,
96  otherwise we will hang anything that is trying to send a message to us */
97  dwWait = MsgWaitForMultipleObjects(nCount, Handles, FALSE, INFINITE, QS_ALLINPUT);
98 
99  /* WAIT_OBJECT_0 + nCount signals an event in the message queue,
100  so anything other than that means we are done. */
101  if (dwWait != WAIT_OBJECT_0 + nCount)
102  {
103  if (dwWait >= WAIT_OBJECT_0 && dwWait < WAIT_OBJECT_0 + nCount)
104  TRACE("Event %u signaled\n", dwWait - WAIT_OBJECT_0);
105  else
106  WARN("Return code: %u\n", dwWait);
107  break;
108  }
109 
110  while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE))
111  {
114  }
115  }
116 
117  GetExitCodeProcess(info.hProcess, &exit_code);
118  }
119 
120  CloseHandle(info.hThread);
121  CloseHandle(info.hProcess);
122 
123  return exit_code;
124 }
125 
126 
136 static BOOL ProcessRunKeys(HKEY hkRoot, LPCWSTR szKeyName, BOOL bDelete,
137  BOOL bSynchronous)
138 {
139  HKEY hkWin = NULL, hkRun = NULL;
141  DWORD i, cbMaxCmdLine = 0, cchMaxValue = 0;
142  WCHAR *szCmdLine = NULL;
143  WCHAR *szValue = NULL;
144 
145  if (hkRoot == HKEY_LOCAL_MACHINE)
146  TRACE("processing %ls entries under HKLM\n", szKeyName);
147  else
148  TRACE("processing %ls entries under HKCU\n", szKeyName);
149 
150  res = RegOpenKeyExW(hkRoot,
151  L"Software\\Microsoft\\Windows\\CurrentVersion",
152  0,
153  KEY_READ,
154  &hkWin);
155  if (res != ERROR_SUCCESS)
156  {
157  TRACE("RegOpenKeyW failed on Software\\Microsoft\\Windows\\CurrentVersion (%ld)\n", res);
158 
159  goto end;
160  }
161 
162  res = RegOpenKeyExW(hkWin,
163  szKeyName,
164  0,
165  bDelete ? KEY_ALL_ACCESS : KEY_READ,
166  &hkRun);
167  if (res != ERROR_SUCCESS)
168  {
169  if (res == ERROR_FILE_NOT_FOUND)
170  {
171  TRACE("Key doesn't exist - nothing to be done\n");
172 
173  res = ERROR_SUCCESS;
174  }
175  else
176  TRACE("RegOpenKeyExW failed on run key (%ld)\n", res);
177 
178  goto end;
179  }
180 
181  res = RegQueryInfoKeyW(hkRun,
182  NULL,
183  NULL,
184  NULL,
185  NULL,
186  NULL,
187  NULL,
188  &i,
189  &cchMaxValue,
190  &cbMaxCmdLine,
191  NULL,
192  NULL);
193  if (res != ERROR_SUCCESS)
194  {
195  TRACE("Couldn't query key info (%ld)\n", res);
196 
197  goto end;
198  }
199 
200  if (i == 0)
201  {
202  TRACE("No commands to execute.\n");
203 
204  res = ERROR_SUCCESS;
205  goto end;
206  }
207 
208  szCmdLine = (WCHAR*)HeapAlloc(hProcessHeap,
209  0,
210  cbMaxCmdLine);
211  if (szCmdLine == NULL)
212  {
213  TRACE("Couldn't allocate memory for the commands to be executed\n");
214 
216  goto end;
217  }
218 
219  ++cchMaxValue;
220  szValue = (WCHAR*)HeapAlloc(hProcessHeap,
221  0,
222  cchMaxValue * sizeof(*szValue));
223  if (szValue == NULL)
224  {
225  TRACE("Couldn't allocate memory for the value names\n");
226 
228  goto end;
229  }
230 
231  while (i > 0)
232  {
233  WCHAR *szCmdLineExp = NULL;
234  DWORD cchValLength = cchMaxValue, cbDataLength = cbMaxCmdLine;
235  DWORD type;
236 
237  --i;
238 
239  res = RegEnumValueW(hkRun,
240  i,
241  szValue,
242  &cchValLength,
243  0,
244  &type,
245  (PBYTE)szCmdLine,
246  &cbDataLength);
247  if (res != ERROR_SUCCESS)
248  {
249  TRACE("Couldn't read in value %lu - %ld\n", i, res);
250 
251  continue;
252  }
253 
254  /* safe mode - force to run if prefixed with asterisk */
255  if (GetSystemMetrics(SM_CLEANBOOT) && (szValue[0] != L'*')) continue;
256 
257  if (bDelete && (res = RegDeleteValueW(hkRun, szValue)) != ERROR_SUCCESS)
258  {
259  TRACE("Couldn't delete value - %lu, %ld. Running command anyways.\n", i, res);
260  }
261 
262  if (type != REG_SZ && type != REG_EXPAND_SZ)
263  {
264  TRACE("Incorrect type of value #%lu (%lu)\n", i, type);
265 
266  continue;
267  }
268 
269  if (type == REG_EXPAND_SZ)
270  {
271  DWORD dwNumOfChars;
272 
273  dwNumOfChars = ExpandEnvironmentStringsW(szCmdLine, NULL, 0);
274  if (dwNumOfChars)
275  {
276  szCmdLineExp = (WCHAR *)HeapAlloc(hProcessHeap, 0, dwNumOfChars * sizeof(*szCmdLineExp));
277 
278  if (szCmdLineExp == NULL)
279  {
280  TRACE("Couldn't allocate memory for the commands to be executed\n");
281 
283  goto end;
284  }
285 
286  ExpandEnvironmentStringsW(szCmdLine, szCmdLineExp, dwNumOfChars);
287  }
288  }
289 
290  res = runCmd(szCmdLineExp ? szCmdLineExp : szCmdLine, NULL, bSynchronous, FALSE);
291  if (res == INVALID_RUNCMD_RETURN)
292  {
293  TRACE("Error running cmd #%lu (%lu)\n", i, GetLastError());
294  }
295 
296  if (szCmdLineExp != NULL)
297  {
298  HeapFree(hProcessHeap, 0, szCmdLineExp);
299  szCmdLineExp = NULL;
300  }
301 
302  TRACE("Done processing cmd #%lu\n", i);
303  }
304 
305  res = ERROR_SUCCESS;
306 end:
307  if (szValue != NULL)
308  HeapFree(hProcessHeap, 0, szValue);
309  if (szCmdLine != NULL)
310  HeapFree(hProcessHeap, 0, szCmdLine);
311  if (hkRun != NULL)
312  RegCloseKey(hkRun);
313  if (hkWin != NULL)
314  RegCloseKey(hkWin);
315 
316  TRACE("done\n");
317 
318  return res == ERROR_SUCCESS ? TRUE : FALSE;
319 }
320 
328 static BOOL ProcessRunOnceEx(HKEY hkRoot)
329 {
330  HKEY hkRunOnceEx = NULL;
332  WCHAR cmdLine[] = L"rundll32 iernonce.dll RunOnceExProcess";
333  DWORD dwSubKeyCnt;
334 
335  res = RegOpenKeyExW(hkRoot,
336  L"Software\\Microsoft\\Windows\\CurrentVersion\\RunOnceEx",
337  0,
338  KEY_READ,
339  &hkRunOnceEx);
340  if (res != ERROR_SUCCESS)
341  {
342  TRACE("RegOpenKeyW failed on Software\\Microsoft\\Windows\\CurrentVersion\\RunOnceEx (%ld)\n", res);
343  goto end;
344  }
345 
346  res = RegQueryInfoKeyW(hkRunOnceEx,
347  NULL,
348  NULL,
349  NULL,
350  &dwSubKeyCnt,
351  NULL,
352  NULL,
353  NULL,
354  NULL,
355  NULL,
356  NULL,
357  NULL);
358 
359  if (res != ERROR_SUCCESS)
360  {
361  TRACE("RegQueryInfoKeyW failed on Software\\Microsoft\\Windows\\CurrentVersion\\RunOnceEx (%ld)\n", res);
362  goto end;
363  }
364 
365  if (dwSubKeyCnt != 0)
366  {
367  if (runCmd(cmdLine, NULL, TRUE, TRUE) == INVALID_RUNCMD_RETURN)
368  {
369  TRACE("runCmd failed (%ld)\n", res = GetLastError());
370  goto end;
371  }
372  }
373 
374 end:
375  if (hkRunOnceEx != NULL)
376  RegCloseKey(hkRunOnceEx);
377 
378  TRACE("done\n");
379 
380  return res == ERROR_SUCCESS ? TRUE : FALSE;
381 }
382 
383 static BOOL
385 {
386  WCHAR szPath[MAX_PATH] = { 0 };
387  HRESULT hResult;
388  HANDLE hFind;
389  WIN32_FIND_DATAW FoundData;
390  size_t cchPathLen;
391 
392  TRACE("(%d)\n", nCSIDL_Folder);
393 
394  // Get the special folder path
395  hResult = SHGetFolderPathW(NULL, nCSIDL_Folder, NULL, SHGFP_TYPE_CURRENT, szPath);
396  cchPathLen = wcslen(szPath);
397  if (!SUCCEEDED(hResult) || cchPathLen == 0)
398  {
399  WARN("SHGetFolderPath() failed with error %lu\n", GetLastError());
400  return FALSE;
401  }
402 
403  // Build a path with wildcard
404  StringCbCatW(szPath, sizeof(szPath), L"\\*");
405 
406  // Start enumeration of files
407  hFind = FindFirstFileW(szPath, &FoundData);
408  if (hFind == INVALID_HANDLE_VALUE)
409  {
410  WARN("FindFirstFile(%s) failed with error %lu\n", debugstr_w(szPath), GetLastError());
411  return FALSE;
412  }
413 
414  // Enumerate the files
415  do
416  {
417  // Ignore "." and ".."
418  if (wcscmp(FoundData.cFileName, L".") == 0 ||
419  wcscmp(FoundData.cFileName, L"..") == 0)
420  {
421  continue;
422  }
423 
424  // Don't run hidden files
425  if (FoundData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
426  continue;
427 
428  // Build the path
429  szPath[cchPathLen + 1] = UNICODE_NULL;
430  StringCbCatW(szPath, sizeof(szPath), FoundData.cFileName);
431 
432  TRACE("Executing %s in directory %s\n", debugstr_w(FoundData.cFileName), debugstr_w(szPath));
433 
434  DWORD dwType;
435  if (GetBinaryTypeW(szPath, &dwType))
436  {
438  }
439  else
440  {
441  SHELLEXECUTEINFOW ExecInfo;
442  ZeroMemory(&ExecInfo, sizeof(ExecInfo));
443  ExecInfo.cbSize = sizeof(ExecInfo);
444  ExecInfo.lpFile = szPath;
445  ShellExecuteExW(&ExecInfo);
446  }
447  } while (FindNextFileW(hFind, &FoundData));
448 
449  FindClose(hFind);
450  return TRUE;
451 }
452 
454 {
455  /* TODO: ProcessRunKeys already checks SM_CLEANBOOT -- items prefixed with * should probably run even in safe mode */
456  BOOL bNormalBoot = GetSystemMetrics(SM_CLEANBOOT) == 0; /* Perform the operations that are performed every boot */
457  /* First, set the current directory to SystemRoot */
458  WCHAR gen_path[MAX_PATH];
459  DWORD res;
460 
461  res = GetWindowsDirectoryW(gen_path, _countof(gen_path));
462  if (res == 0)
463  {
464  TRACE("Couldn't get the windows directory - error %lu\n", GetLastError());
465 
466  return 100;
467  }
468 
469  if (!SetCurrentDirectoryW(gen_path))
470  {
471  TRACE("Cannot set the dir to %ls (%lu)\n", gen_path, GetLastError());
472 
473  return 100;
474  }
475 
476  /* Perform the operations by order checking if policy allows it, checking if this is not Safe Mode,
477  * stopping if one fails, skipping if necessary.
478  */
479  res = TRUE;
480 
481  if (res && bNormalBoot)
483 
486 
487  if (res && bNormalBoot && (SHRestricted(REST_NOLOCALMACHINERUN) == 0))
489 
490  if (res && bNormalBoot && (SHRestricted(REST_NOCURRENTUSERRUNONCE) == 0))
492 
493  /* All users Startup folder */
495 
496  /* Current user Startup folder */
498 
499  /* TODO: HKCU\RunOnce runs even if StartupHasBeenRun exists */
500  if (res && bNormalBoot && (SHRestricted(REST_NOCURRENTUSERRUNONCE) == 0))
502 
503  TRACE("Operation done\n");
504 
505  return res ? 0 : 101;
506 }
507 
509 {
510  if (s_hStartupMutex)
511  {
515  }
516  return TRUE;
517 }
518 
519 BOOL DoStartStartupItems(ITrayWindow *Tray)
520 {
521  DWORD dwWait;
522 
523  if (!bExplorerIsShell)
524  return FALSE;
525 
526  if (!s_hStartupMutex)
527  {
528  // Accidentally, there is possibility that the system starts multiple Explorers
529  // before startup of shell. We use a mutex to match the timing of shell initialization.
530  s_hStartupMutex = CreateMutexW(NULL, FALSE, L"ExplorerIsShellMutex");
531  if (s_hStartupMutex == NULL)
532  return FALSE;
533  }
534 
536  TRACE("dwWait: 0x%08lX\n", dwWait);
537  if (dwWait != WAIT_OBJECT_0)
538  {
539  TRACE("LastError: %ld\n", GetLastError());
540 
542  return FALSE;
543  }
544 
545  const DWORD dwWaitTotal = 3000; // in milliseconds
546  DWORD dwTick = GetTickCount();
547  while (GetShellWindow() == NULL && GetTickCount() - dwTick < dwWaitTotal)
548  {
549  TrayProcessMessages(Tray);
550  }
551 
552  if (GetShellWindow() == NULL)
553  {
555  return FALSE;
556  }
557 
558  // Check the volatile "StartupHasBeenRun" key
559  HKEY hSessionKey, hKey;
560  HRESULT hr = SHCreateSessionKey(KEY_WRITE, &hSessionKey);
561  if (SUCCEEDED(hr))
562  {
563  ASSERT(hSessionKey);
564 
565  DWORD dwDisp;
566  LONG Error = RegCreateKeyExW(hSessionKey, L"StartupHasBeenRun", 0, NULL,
567  REG_OPTION_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp);
568  RegCloseKey(hSessionKey);
569  RegCloseKey(hKey);
570  if (Error == ERROR_SUCCESS && dwDisp == REG_OPENED_EXISTING_KEY)
571  {
572  return FALSE; // Startup programs has already been run
573  }
574  }
575 
576  return TRUE;
577 }
BOOL DoFinishStartupItems(VOID)
Definition: startup.cpp:508
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
HWND WINAPI GetShellWindow(VOID)
Definition: desktop.c:651
BOOL WINAPI TranslateMessage(_In_ const MSG *)
#define CloseHandle
Definition: compat.h:598
BOOL bExplorerIsShell
Definition: explorer.cpp:27
#define ERROR_SUCCESS
Definition: deptool.c:10
HRESULT hr
Definition: shlfolder.c:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define KEY_READ
Definition: nt_native.h:1023
#define TRUE
Definition: types.h:120
BOOL WINAPI GetExitCodeProcess(IN HANDLE hProcess, IN LPDWORD lpExitCode)
Definition: proc.c:1168
#define HKEY_CURRENT_USER
Definition: winreg.h:11
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define WARN(fmt,...)
Definition: debug.h:112
VOID TrayProcessMessages(IN OUT ITrayWindow *Tray)
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:455
#define CSIDL_COMMON_STARTUP
Definition: shlobj.h:2035
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define INVALID_HANDLE_VALUE
Definition: compat.h:590
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
#define ZeroMemory
Definition: winbase.h:1664
#define REG_OPENED_EXISTING_KEY
Definition: nt_native.h:1085
TCHAR * cmdline
Definition: stretchblt.cpp:32
INT ProcessStartupItems(VOID)
Definition: startup.cpp:453
static BOOL ProcessRunKeys(HKEY hkRoot, LPCWSTR szKeyName, BOOL bDelete, BOOL bSynchronous)
Definition: startup.cpp:136
static BOOL ProcessRunOnceEx(HKEY hkRoot)
Definition: startup.cpp:328
BOOL WINAPI GetBinaryTypeW(LPCWSTR lpApplicationName, LPDWORD lpBinaryType)
Definition: vdm.c:1243
int32_t INT
Definition: typedefs.h:58
STRSAFEAPI StringCbCatW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:342
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1091
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2351
BOOL DoStartStartupItems(ITrayWindow *Tray)
Definition: startup.cpp:519
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define L(x)
Definition: ntvdm.h:50
#define FALSE
Definition: types.h:117
#define UNICODE_NULL
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
if SUCCEEDED(hr)
#define debugstr_w
Definition: kernel32.h:32
static BOOL AutoStartupApplications(INT nCSIDL_Folder)
Definition: startup.cpp:384
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
Definition: reg.c:2853
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2263
unsigned int dir
Definition: maze.c:112
#define STARTF_USESHOWWINDOW
Definition: winbase.h:488
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
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:4594
static UINT exit_code
Definition: process.c:78
#define SM_CLEANBOOT
Definition: winuser.h:1021
#define KEY_WRITE
Definition: nt_native.h:1031
#define TRACE(s)
Definition: solgame.cpp:4
#define WAIT_OBJECT_0
Definition: winbase.h:403
HRESULT WINAPI SHCreateSessionKey(REGSAM samDesired, PHKEY phKey)
Definition: shellreg.c:151
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
DWORD cb
Definition: winbase.h:846
#define ASSERT(a)
Definition: mode.c:44
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:34
int WINAPI GetSystemMetrics(_In_ int)
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL Error
Definition: chkdsk.c:66
#define SW_MINIMIZE
Definition: winuser.h:770
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3690
GLuint GLuint end
Definition: gl.h:1545
struct _test_info info[]
Definition: SetCursorPos.c:19
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseMutex(IN HANDLE hMutex)
Definition: synch.c:618
DWORD WINAPI MsgWaitForMultipleObjects(_In_ DWORD nCount, _In_reads_opt_(nCount) CONST HANDLE *pHandles, _In_ BOOL fWaitAll, _In_ DWORD dwMilliseconds, _In_ DWORD dwWakeMask)
WORD wShowWindow
Definition: winbase.h:858
#define CSIDL_STARTUP
Definition: shlobj.h:2019
#define INVALID_RUNCMD_RETURN
Definition: startup.cpp:48
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
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
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Definition: reg.c:2355
static HANDLE s_hStartupMutex
Definition: startup.cpp:46
FxAutoRegKey hKey
LPCWSTR szPath
Definition: env.c:37
#define KEY_ALL_ACCESS
Definition: nt_native.h:1041
BOOL WINAPI SetCurrentDirectoryW(IN LPCWSTR lpPathName)
Definition: path.c:2248
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
#define QS_ALLINPUT
Definition: winuser.h:897
HANDLE WINAPI DECLSPEC_HOTPATCH CreateMutexW(IN LPSECURITY_ATTRIBUTES lpMutexAttributes OPTIONAL, IN BOOL bInitialOwner, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:576
#define FILE_ATTRIBUTE_HIDDEN
Definition: nt_native.h:703
#define NULL
Definition: types.h:112
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define msg(x)
Definition: auth_time.c:54
HRESULT WINAPI SHGetFolderPathW(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath)
Definition: shellpath.c:2447
GLuint res
Definition: glext.h:9613
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3356
DWORD dwFlags
Definition: winbase.h:857
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
BOOL WINAPI PeekMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
#define PM_REMOVE
Definition: winuser.h:1186
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1060
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define INFINITE
Definition: serial.h:102
#define memset(x, y, z)
Definition: compat.h:39
DWORD WINAPI SHRestricted(RESTRICTIONS policy)
Definition: shpolicy.c:836
static int runCmd(LPWSTR cmdline, LPCWSTR dir, BOOL wait, BOOL minimized)
Definition: startup.cpp:61
BYTE * PBYTE
Definition: pedump.c:66
#define HeapFree(x, y, z)
Definition: compat.h:594
#define RegCloseKey(hKey)
Definition: registry.h:40
HANDLE hProcessHeap
Definition: kbswitch.c:25
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define REG_SZ
Definition: layer.c:22
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502