Author: tfaber Date: Sat Feb 2 10:49:58 2013 New Revision: 58262
URL: http://svn.reactos.org/svn/reactos?rev=58262&view=rev Log: [EXPLORER_NEW] - Process startup items before creating the desktop. Fix some comments, add TODOs. Based on patch by Edijs Kolesnikovičs. CORE-6896 #resolve
Modified: trunk/reactos/base/shell/explorer-new/explorer.c trunk/reactos/base/shell/explorer-new/startup.c
Modified: trunk/reactos/base/shell/explorer-new/explorer.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer-new/exp... ============================================================================== --- trunk/reactos/base/shell/explorer-new/explorer.c [iso-8859-1] (original) +++ trunk/reactos/base/shell/explorer-new/explorer.c [iso-8859-1] Sat Feb 2 10:49:58 2013 @@ -401,6 +401,8 @@ InitCommonControls(); OleInitialize(NULL);
+ ProcessStartupItems(); + if (GetShellWindow() == NULL) CreateShellDesktop = TRUE;
@@ -424,8 +426,6 @@ /* WinXP: Notify msgina to hide the welcome screen */ if (!SetShellReadyEvent(TEXT("msgina: ShellReadyEvent"))) SetShellReadyEvent(TEXT("Global\msgina: ShellReadyEvent")); - - ProcessStartupItems(); } else {
Modified: trunk/reactos/base/shell/explorer-new/startup.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer-new/sta... ============================================================================== --- trunk/reactos/base/shell/explorer-new/startup.c [iso-8859-1] (original) +++ trunk/reactos/base/shell/explorer-new/startup.c [iso-8859-1] Sat Feb 2 10:49:58 2013 @@ -26,19 +26,16 @@ * Also, 119941 has some info on grpconv.exe * The operations performed are (by order of execution): * - * Startup (before the user logs in) - * - Services (NT, ?semi-synchronous?, not implemented yet) - * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce (9x, asynch) - * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices (9x, asynch) - * * After log in - * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce (all, synch) - * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run (all, asynch) - * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (all, asynch) - * - Startup folders (all, ?asynch?, no imp) - * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce (all, asynch) - * - * Somewhere in there is processing the RunOnceEx entries (also no imp) + * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx (synch, no imp) + * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce (synch) + * - HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run (asynch) + * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run (asynch) + * - All users Startup folder "%ALLUSERSPROFILE%\Start Menu\Programs\Startup" (asynch, no imp) + * - Current user Startup folder "%USERPROFILE%\Start Menu\Programs\Startup" (asynch, no imp) + * - HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce (asynch) + * + * None is processed in Safe Mode // FIXME: Check RunOnceEx in Safe Mode */
#include "precomp.h" @@ -110,9 +107,6 @@ static BOOL ProcessRunKeys(HKEY hkRoot, LPCWSTR szKeyName, BOOL bDelete, BOOL bSynchronous) { - static const WCHAR WINKEY_NAME[]={'S','o','f','t','w','a','r','e','\', - 'M','i','c','r','o','s','o','f','t','\','W','i','n','d','o','w','s','\', - 'C','u','r','r','e','n','t','V','e','r','s','i','o','n',0}; HKEY hkWin = NULL, hkRun=NULL; LONG res = ERROR_SUCCESS; DWORD i, nMaxCmdLine = 0, nMaxValue = 0; @@ -124,7 +118,7 @@ else wprintf(L"processing %s entries under HKCU\n", szKeyName);
- if ((res = RegOpenKeyExW(hkRoot, WINKEY_NAME, 0, KEY_READ, &hkWin)) != ERROR_SUCCESS) + if ((res = RegOpenKeyExW(hkRoot, L"Software\Microsoft\Windows\CurrentVersion", 0, KEY_READ, &hkWin)) != ERROR_SUCCESS) { printf("RegOpenKey failed on Software\Microsoft\Windows\CurrentVersion (%ld)\n", res); @@ -180,9 +174,9 @@ goto end; }
- while(i > 0) - { - DWORD nValLength=nMaxValue, nDataLength=nMaxCmdLine; + while (i > 0) + { + DWORD nValLength = nMaxValue, nDataLength = nMaxCmdLine; DWORD type;
--i; @@ -237,6 +231,7 @@ int ProcessStartupItems(VOID) { + /* TODO: ProcessRunKeys already checks SM_CLEANBOOT -- items prefixed with * should probably run even in safe mode */ BOOL bNormalBoot = GetSystemMetrics(SM_CLEANBOOT) == 0; /* Perform the operations that are performed every boot */ /* First, set the current directory to SystemRoot */ TCHAR gen_path[MAX_PATH]; @@ -284,6 +279,8 @@ * stopping if one fails, skipping if necessary. */ res = TRUE; + /* TODO: RunOnceEx */ + if (res && (SHRestricted(REST_NOLOCALMACHINERUNONCE) == 0)) res = ProcessRunKeys(HKEY_LOCAL_MACHINE, L"RunOnce", TRUE, TRUE);
@@ -293,6 +290,11 @@ if (res && bNormalBoot && (SHRestricted(REST_NOCURRENTUSERRUNONCE) == 0)) res = ProcessRunKeys(HKEY_CURRENT_USER, L"Run", FALSE, FALSE);
+ /* TODO: All users Startup folder */ + + /* TODO: Current user Startup folder */ + + /* TODO: HKCU\RunOnce runs even if StartupHasBeenRun exists */ if (res && bNormalBoot && (SHRestricted(REST_NOCURRENTUSERRUNONCE) == 0)) res = ProcessRunKeys(HKEY_CURRENT_USER, L"RunOnce", TRUE, FALSE);