Create the AHCI branch for Aman's work
[reactos.git] / base / applications / msconfig / startuppage.c
1 /*
2 * PROJECT: ReactOS Applications
3 * LICENSE: LGPL - See COPYING in the top level directory
4 * FILE: base/applications/msconfig/startuppage.c
5 * PURPOSE: Startup page message handler
6 * COPYRIGHT: Copyright 2005-2006 Christoph von Wittich <Christoph@ApiViewer.de>
7 *
8 */
9
10 #include "precomp.h"
11
12 HWND hStartupPage;
13 HWND hStartupListCtrl;
14 HWND hStartupDialog;
15
16 void GetAutostartEntriesFromRegistry ( HKEY hRootKey, TCHAR* KeyName );
17 void GetDisabledAutostartEntriesFromRegistry (TCHAR * szBasePath);
18
19 INT_PTR CALLBACK
20 StartupPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
21 {
22 LV_COLUMN column;
23 TCHAR szTemp[256];
24 DWORD dwStyle;
25
26 UNREFERENCED_PARAMETER(lParam);
27 UNREFERENCED_PARAMETER(wParam);
28
29 switch (message) {
30 case WM_INITDIALOG:
31
32 hStartupListCtrl = GetDlgItem(hDlg, IDC_STARTUP_LIST);
33 hStartupDialog = hDlg;
34
35 dwStyle = (DWORD) SendMessage(hStartupListCtrl, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
36 dwStyle = dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES;
37 SendMessage(hStartupListCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
38
39 SetWindowPos(hDlg, NULL, 10, 32, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
40
41 // Initialize the application page's controls
42 column.mask = LVCF_TEXT | LVCF_WIDTH;
43
44 LoadString(hInst, IDS_STARTUP_COLUMN_ELEMENT, szTemp, 256);
45 column.pszText = szTemp;
46 column.cx = 150;
47 (void)ListView_InsertColumn(hStartupListCtrl, 0, &column);
48
49 column.mask = LVCF_TEXT | LVCF_WIDTH;
50 LoadString(hInst, IDS_STARTUP_COLUMN_CMD, szTemp, 256);
51 column.pszText = szTemp;
52 column.cx = 150;
53 (void)ListView_InsertColumn(hStartupListCtrl, 1, &column);
54
55 column.mask = LVCF_TEXT | LVCF_WIDTH;
56 LoadString(hInst, IDS_STARTUP_COLUMN_PATH, szTemp, 256);
57 column.pszText = szTemp;
58 column.cx = 250;
59 (void)ListView_InsertColumn(hStartupListCtrl, 2, &column);
60
61 GetAutostartEntriesFromRegistry(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"));
62 GetAutostartEntriesFromRegistry(HKEY_CURRENT_USER, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"));
63 GetDisabledAutostartEntriesFromRegistry (_T("SOFTWARE\\Microsoft\\Shared Tools\\MSConfig\\startupreg"));
64 GetDisabledAutostartEntriesFromRegistry (_T("SOFTWARE\\Microsoft\\Shared Tools\\MSConfig\\startupfolder"));
65
66 //FIXME: What about HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
67 //FIXME: Common Startup (startmenu)
68
69 return TRUE;
70 }
71
72 return 0;
73 }
74
75
76 void
77 GetDisabledAutostartEntriesFromRegistry (TCHAR * szBasePath)
78 {
79 HKEY hKey, hSubKey;
80 DWORD Index, SubIndex, dwValues, dwSubValues;
81 DWORD dwValueLength, dwDataLength = MAX_VALUE_NAME;
82 LV_ITEM item;
83 TCHAR* Data;
84 TCHAR szValueName[MAX_KEY_LENGTH];
85 TCHAR szSubValueName[MAX_KEY_LENGTH];
86 TCHAR szSubPath[MAX_KEY_LENGTH];
87
88 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szBasePath, 0, KEY_READ | KEY_ENUMERATE_SUB_KEYS, &hKey) == ERROR_SUCCESS)
89 {
90 if (RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwValues, NULL, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
91 {
92 for (Index = 0; Index < dwValues; Index++)
93 {
94 dwValueLength = MAX_KEY_LENGTH;
95 dwDataLength = MAX_VALUE_NAME;
96 Data = HeapAlloc(GetProcessHeap(), 0, MAX_VALUE_NAME * sizeof(TCHAR));
97 if (Data == NULL)
98 break;
99
100 if(RegEnumKeyEx(hKey, Index, szValueName, &dwValueLength, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
101 {
102 HeapFree(GetProcessHeap(), 0, Data);
103 continue;
104 }
105 _stprintf(szSubPath, _T("%s\\%s"), szBasePath, szValueName);
106 memset(&item, 0, sizeof(LV_ITEM));
107 item.mask = LVIF_TEXT;
108 item.iImage = 0;
109 item.pszText = szValueName;
110 item.iItem = ListView_GetItemCount(hStartupListCtrl);
111 item.lParam = 0;
112 (void)ListView_InsertItem(hStartupListCtrl, &item);
113 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubPath, 0, KEY_READ | KEY_ENUMERATE_SUB_KEYS, &hSubKey) == ERROR_SUCCESS)
114 {
115 if (RegQueryInfoKey(hSubKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwSubValues, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
116 {
117 for(SubIndex = 0; SubIndex < dwSubValues; SubIndex++)
118 {
119 dwValueLength = MAX_KEY_LENGTH;
120 dwDataLength = MAX_VALUE_NAME;
121 if(RegEnumValue(hSubKey, SubIndex, szSubValueName, &dwValueLength, NULL, NULL, (LPBYTE)Data, &dwDataLength) == ERROR_SUCCESS)
122 {
123 item.iSubItem = -1;
124 if (!_tcscmp(szSubValueName, _T("command")))
125 item.iSubItem = 1;
126 else if (!_tcscmp(szSubValueName, _T("key")) || !_tcscmp(szSubValueName, _T("location")))
127 item.iSubItem = 2;
128 else if (!_tcscmp(szSubValueName, _T("item")))
129 item.iSubItem = 0;
130 if (item.iSubItem != -1)
131 {
132 GetLongPathName(Data, Data, (DWORD) _tcsclen(Data));
133 item.pszText = Data;
134 SendMessage(hStartupListCtrl, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
135 }
136 }
137 }
138 }
139 }
140 RegCloseKey(hSubKey);
141 HeapFree(GetProcessHeap(), 0, Data);
142 }
143 }
144 RegCloseKey(hKey);
145 }
146 }
147
148 void
149 GetAutostartEntriesFromRegistry ( HKEY hRootKey, TCHAR* KeyName )
150 {
151 HKEY hKey;
152 DWORD Index, dwValues, retVal, dwType;
153 DWORD dwValueLength, dwDataLength = MAX_VALUE_NAME;
154 TCHAR* Data;
155 TCHAR lpValueName[MAX_KEY_LENGTH];
156 TCHAR Path[MAX_KEY_LENGTH + 5];
157 LV_ITEM item;
158
159 if (RegOpenKeyEx(hRootKey, KeyName, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
160 {
161 if (RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValues, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
162 {
163 for (Index = 0, retVal = ERROR_SUCCESS; Index < dwValues; Index++)
164 {
165 dwValueLength = MAX_KEY_LENGTH;
166 dwDataLength = MAX_VALUE_NAME;
167 Data = HeapAlloc(GetProcessHeap(), 0, MAX_VALUE_NAME * sizeof(TCHAR));
168 if (Data == NULL)
169 break;
170 retVal = RegEnumValue(hKey, Index, lpValueName, &dwValueLength, NULL, &dwType, (LPBYTE)Data, &dwDataLength);
171 if (retVal == ERROR_SUCCESS)
172 {
173 memset(&item, 0, sizeof(LV_ITEM));
174 item.mask = LVIF_TEXT;
175 item.iImage = 0;
176 item.pszText = lpValueName;
177 item.iItem = ListView_GetItemCount(hStartupListCtrl);
178 item.lParam = 0;
179 (void)ListView_InsertItem(hStartupListCtrl, &item);
180 ListView_SetCheckState(hStartupListCtrl, item.iItem, TRUE);
181
182 if ((dwType == REG_SZ) || (dwType == REG_EXPAND_SZ))
183 {
184 GetLongPathName(Data, Data, (DWORD) _tcsclen(Data));
185 item.pszText = Data;
186 item.iSubItem = 1;
187 SendMessage(hStartupListCtrl, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
188 }
189
190 switch (PtrToLong(hRootKey))
191 {
192 case (ULONG_PTR)HKEY_LOCAL_MACHINE:
193 _tcscpy(Path, _T("HKLM\\\0"));
194 break;
195 case (ULONG_PTR)HKEY_CURRENT_USER:
196 _tcscpy(Path, _T("HKCU\\\0"));
197 break;
198 default:
199 _tcscpy(Path, _T("\0"));
200 }
201
202 _tcscat(Path, KeyName);
203 item.pszText = Path;
204 item.iSubItem = 2;
205 SendMessage(hStartupListCtrl, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item);
206 }
207 HeapFree(GetProcessHeap(), 0, Data);
208 }
209 }
210 RegCloseKey(hKey);
211 }
212
213 }