Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenrunonce.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
1.7.6.1
|