[SYSDM] Fix version string cutoff CORE-17429
[reactos.git] / dll / cpl / sysdm / sysdm.c
1 /*
2 * PROJECT: ReactOS System Control Panel Applet
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/sysdm/sysdm.c
5 * PURPOSE: dll entry file
6 * COPYRIGHT: Copyright Thomas Weidenmueller <w3seek@reactos.org>
7 *
8 */
9
10 #include "precomp.h"
11
12 #include <regstr.h>
13
14 static LONG APIENTRY SystemApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam);
15 HINSTANCE hApplet = 0;
16
17 /* Applets */
18 APPLET Applets[NUM_APPLETS] =
19 {
20 {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet}
21 };
22
23 #define MAX_SYSTEM_PAGES 32
24
25
26 INT
27 ResourceMessageBox(
28 IN HINSTANCE hInstance,
29 IN HWND hwnd,
30 IN UINT uType,
31 IN UINT uCaption,
32 IN UINT uText)
33 {
34 WCHAR szCaption[256];
35 WCHAR szText[256];
36
37 LoadStringW(hInstance, uCaption, szCaption, 256);
38 LoadStringW(hInstance, uText, szText, 256);
39
40 return MessageBoxW(hwnd,
41 szText,
42 szCaption,
43 uType);
44 }
45
46
47 static BOOL CALLBACK
48 PropSheetAddPage(HPROPSHEETPAGE hpage, LPARAM lParam)
49 {
50 PROPSHEETHEADER *ppsh = (PROPSHEETHEADER *)lParam;
51 if (ppsh != NULL && ppsh->nPages < MAX_SYSTEM_PAGES)
52 {
53 ppsh->phpage[ppsh->nPages++] = hpage;
54 return TRUE;
55 }
56
57 return FALSE;
58 }
59
60 static BOOL
61 InitPropSheetPage(PROPSHEETHEADER *ppsh, WORD idDlg, DLGPROC DlgProc)
62 {
63 HPROPSHEETPAGE hPage;
64 PROPSHEETPAGE psp;
65
66 if (ppsh->nPages < MAX_SYSTEM_PAGES)
67 {
68 ZeroMemory(&psp, sizeof(psp));
69 psp.dwSize = sizeof(psp);
70 psp.dwFlags = PSP_DEFAULT;
71 psp.hInstance = hApplet;
72 psp.pszTemplate = MAKEINTRESOURCE(idDlg);
73 psp.pfnDlgProc = DlgProc;
74
75 hPage = CreatePropertySheetPage(&psp);
76 if (hPage != NULL)
77 {
78 return PropSheetAddPage(hPage, (LPARAM)ppsh);
79 }
80 }
81
82 return FALSE;
83 }
84
85 typedef HPROPSHEETPAGE (WINAPI *PCreateNetIDPropertyPage)(VOID);
86
87 static HMODULE
88 AddNetIdPage(PROPSHEETHEADER *ppsh)
89 {
90 HPROPSHEETPAGE hPage;
91 HMODULE hMod;
92 PCreateNetIDPropertyPage pCreateNetIdPage;
93
94 hMod = LoadLibrary(TEXT("netid.dll"));
95 if (hMod != NULL)
96 {
97 pCreateNetIdPage = (PCreateNetIDPropertyPage)GetProcAddress(hMod,
98 "CreateNetIDPropertyPage");
99 if (pCreateNetIdPage != NULL)
100 {
101 hPage = pCreateNetIdPage();
102 if (hPage == NULL)
103 goto Fail;
104
105 if (!PropSheetAddPage(hPage, (LPARAM)ppsh))
106 {
107 DestroyPropertySheetPage(hPage);
108 goto Fail;
109 }
110 }
111 else
112 {
113 Fail:
114 FreeLibrary(hMod);
115 hMod = NULL;
116 }
117 }
118
119 return hMod;
120 }
121
122 static int CALLBACK
123 PropSheetProc(HWND hwndDlg, UINT uMsg, LPARAM lParam)
124 {
125 // NOTE: This callback is needed to set large icon correctly.
126 HICON hIcon;
127 switch (uMsg)
128 {
129 case PSCB_INITIALIZED:
130 {
131 hIcon = LoadIconW(hApplet, MAKEINTRESOURCEW(IDI_CPLSYSTEM));
132 SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
133 break;
134 }
135 }
136 return 0;
137 }
138
139 /* First Applet */
140 LONG CALLBACK
141 SystemApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam)
142 {
143 HPROPSHEETPAGE hpsp[MAX_SYSTEM_PAGES];
144 PROPSHEETHEADER psh;
145 HMODULE hNetIdDll;
146 HPSXA hpsxa = NULL;
147 INT nPage = 0;
148 LONG Ret;
149 static INITCOMMONCONTROLSEX icc = {sizeof(INITCOMMONCONTROLSEX), ICC_LINK_CLASS};
150
151 if (!InitCommonControlsEx(&icc))
152 return 0;
153
154 if (uMsg == CPL_STARTWPARMSW && lParam != 0)
155 {
156 nPage = _wtoi((PWSTR)lParam);
157 }
158
159 ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
160 psh.dwSize = sizeof(PROPSHEETHEADER);
161 psh.dwFlags = PSH_PROPTITLE | PSH_USEICONID | PSH_USECALLBACK;
162 psh.hwndParent = hwnd;
163 psh.hInstance = hApplet;
164 psh.pszIcon = MAKEINTRESOURCEW(IDI_CPLSYSTEM);
165 psh.pszCaption = MAKEINTRESOURCE(IDS_CPLSYSTEMNAME);
166 psh.nPages = 0;
167 psh.nStartPage = 0;
168 psh.phpage = hpsp;
169 psh.pfnCallback = PropSheetProc;
170
171 InitPropSheetPage(&psh, IDD_PROPPAGEGENERAL, GeneralPageProc);
172 hNetIdDll = AddNetIdPage(&psh);
173 InitPropSheetPage(&psh, IDD_PROPPAGEHARDWARE, HardwarePageProc);
174 InitPropSheetPage(&psh, IDD_PROPPAGEADVANCED, AdvancedPageProc);
175
176 /* Load additional pages provided by shell extensions */
177 hpsxa = SHCreatePropSheetExtArray(HKEY_LOCAL_MACHINE, REGSTR_PATH_CONTROLSFOLDER TEXT("\\System"), MAX_SYSTEM_PAGES - psh.nPages);
178 if (hpsxa != NULL)
179 {
180 SHAddFromPropSheetExtArray(hpsxa, PropSheetAddPage, (LPARAM)&psh);
181 }
182
183 if (nPage != 0 && nPage <= psh.nPages)
184 psh.nStartPage = nPage;
185
186 Ret = (LONG)(PropertySheet(&psh) != -1);
187
188 if (hpsxa != NULL)
189 {
190 SHDestroyPropSheetExtArray(hpsxa);
191 }
192
193 if (hNetIdDll != NULL)
194 FreeLibrary(hNetIdDll);
195
196 return Ret;
197 }
198
199 /* Control Panel Callback */
200 LONG CALLBACK
201 CPlApplet(HWND hwndCPl,
202 UINT uMsg,
203 LPARAM lParam1,
204 LPARAM lParam2)
205 {
206 INT i = (INT)lParam1;
207
208 UNREFERENCED_PARAMETER(hwndCPl);
209
210 switch (uMsg)
211 {
212 case CPL_INIT:
213 return TRUE;
214
215 case CPL_GETCOUNT:
216 return NUM_APPLETS;
217
218 case CPL_INQUIRE:
219 {
220 CPLINFO *CPlInfo = (CPLINFO*)lParam2;
221 CPlInfo->lData = 0;
222 CPlInfo->idIcon = Applets[i].idIcon;
223 CPlInfo->idName = Applets[i].idName;
224 CPlInfo->idInfo = Applets[i].idDescription;
225 }
226 break;
227
228 case CPL_DBLCLK:
229 Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2);
230 break;
231
232 case CPL_STARTWPARMSW:
233 return Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2);
234
235 }
236
237 return FALSE;
238 }
239
240
241 BOOL WINAPI
242 DllMain(HINSTANCE hinstDLL,
243 DWORD dwReason,
244 LPVOID lpvReserved)
245 {
246 UNREFERENCED_PARAMETER(lpvReserved);
247
248 switch (dwReason)
249 {
250 case DLL_PROCESS_ATTACH:
251 case DLL_THREAD_ATTACH:
252 hApplet = hinstDLL;
253 break;
254 }
255
256 return TRUE;
257 }