ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

runonce.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:       See COPYING in the top level directory
00003  * PROJECT:         ReactOS runonce.exe
00004  * FILE:            base/system/runonce/runonce.c
00005  * PROGRAMMER:      Dmitry Chapyshev (dmitry@reactos.org)
00006  */
00007 
00008 #include "runonce.h"
00009 
00010 
00011 static
00012 DWORD
00013 WINAPI
00014 StartApplication(LPVOID lpDlg)
00015 {
00016     HWND hList = GetDlgItem((HWND)lpDlg, IDC_COMP_LIST);
00017     INT Index, Count = SendMessage(hList, LB_GETCOUNT, 0, 0);
00018     PROCESS_INFORMATION pi;
00019     STARTUPINFOW si;
00020     TCHAR szData[MAX_PATH];
00021 
00022     for (Index = 0; Index < Count; Index++)
00023     {
00024         SendMessage(hList, LB_GETTEXT, Index, (LPARAM)szData);
00025 
00026         ZeroMemory(&si, sizeof(si));
00027         si.cb = sizeof(si);
00028         si.wShowWindow = SW_SHOW;
00029 
00030         if (!CreateProcess(NULL, szData, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
00031             continue;
00032 
00033         WaitForSingleObjectEx(pi.hProcess, INFINITE, TRUE);
00034 
00035         CloseHandle(pi.hProcess);
00036         CloseHandle(pi.hThread);
00037     }
00038 
00039     RegDeleteKey(HKEY_LOCAL_MACHINE,
00040                  _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce\\Setup"));
00041 
00042     PostMessage((HWND)lpDlg, WM_CLOSE, 0, 0);
00043 
00044     return 0;
00045 }
00046 
00047 static
00048 VOID
00049 InitDialog(HWND hDlg)
00050 {
00051     TCHAR szAppPath[MAX_PATH], szData[MAX_PATH];
00052     DWORD dwIndex, dwSize, dwType, dwData, dwThreadId;
00053     HKEY hKey;
00054 
00055     if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
00056                      _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce\\Setup"),
00057                      0,
00058                      KEY_QUERY_VALUE,
00059                      &hKey) == ERROR_SUCCESS)
00060     {
00061         for (dwIndex = 0; ; dwIndex++)
00062         {
00063             dwSize = sizeof(szAppPath);
00064             dwData = sizeof(szData) / sizeof(TCHAR);
00065 
00066             if (RegEnumValue(hKey,
00067                              dwIndex,
00068                              szAppPath,
00069                              &dwSize,
00070                              NULL,
00071                              &dwType,
00072                              (LPBYTE)szData,
00073                              &dwData) == ERROR_SUCCESS)
00074             {
00075                 if (dwType != REG_SZ) continue;
00076 
00077                 SendMessage(GetDlgItem(hDlg, IDC_COMP_LIST), LB_ADDSTRING, 0, (LPARAM)szData);
00078             }
00079         }
00080 
00081         RegCloseKey(hKey);
00082     }
00083 
00084     CloseHandle(CreateThread(NULL,
00085                              0,
00086                              StartApplication,
00087                              (LPVOID)hDlg,
00088                              0,
00089                              &dwThreadId));
00090 }
00091 
00092 static
00093 INT_PTR
00094 CALLBACK
00095 RunOnceDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
00096 {
00097     switch (Msg)
00098     {
00099         case WM_INITDIALOG:
00100             InitDialog(hDlg);
00101             break;
00102 
00103         case WM_CLOSE:
00104             EndDialog(hDlg, 0);
00105             break;
00106     }
00107 
00108     return 0;
00109 }
00110 
00111 INT
00112 WINAPI
00113 _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdShow)
00114 {
00115     LPCTSTR lpCmd = GetCommandLine();
00116     TCHAR szAppPath[MAX_PATH], szData[MAX_PATH];
00117     DWORD dwIndex, dwSize, dwType, dwData;
00118     PROCESS_INFORMATION pi;
00119     STARTUPINFOW si;
00120     BOOL bRunApps = FALSE;
00121     HKEY hKey;
00122 
00123     while (*lpCmd)
00124     {
00125         while (*lpCmd && *lpCmd != _T('/') && *lpCmd != _T('-')) lpCmd++;
00126         if (!*lpCmd) break;
00127         if (*++lpCmd == _T('r')) bRunApps = TRUE;
00128         lpCmd++;
00129     }
00130 
00131     if (bRunApps)
00132     {
00133         if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
00134                          _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce"),
00135                          0,
00136                          KEY_QUERY_VALUE,
00137                          &hKey) == ERROR_SUCCESS)
00138         {
00139             for (dwIndex = 0; ; dwIndex++)
00140             {
00141                 dwSize = sizeof(szAppPath);
00142                 dwData = sizeof(szData) / sizeof(TCHAR);
00143 
00144                 if (RegEnumValue(hKey,
00145                                  dwIndex,
00146                                  szAppPath,
00147                                  &dwSize,
00148                                  NULL,
00149                                  &dwType,
00150                                  (LPBYTE)szData,
00151                                  &dwData) == ERROR_SUCCESS)
00152                 {
00153                     RegDeleteValue(hKey, szAppPath);
00154 
00155                     if (dwType != REG_SZ) continue;
00156 
00157                     ZeroMemory(&si, sizeof(si));
00158                     si.cb = sizeof(si);
00159                     si.wShowWindow = SW_SHOW;
00160 
00161                     if (!CreateProcess(NULL, szData, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
00162                         continue;
00163 
00164                     WaitForSingleObjectEx(pi.hProcess, INFINITE, TRUE);
00165 
00166                     CloseHandle(pi.hProcess);
00167                     CloseHandle(pi.hThread);
00168                 }
00169             }
00170 
00171             RegCloseKey(hKey);
00172         }
00173 
00174         return 1;
00175     }
00176 
00177     DialogBox(hInst, MAKEINTRESOURCE(IDD_RUNONCE_DLG), NULL, RunOnceDlgProc);
00178 
00179     return 0;
00180 }

Generated on Fri May 25 2012 04:16:57 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.