1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 /* ====================================================================
18 * prunmgr -- Service Manager Application.
19 * Contributed by Mladen Turk <mturk@apache.org>
20 * 05 Aug 2003
21 * ====================================================================
22 */
23
24 /* Force the JNI vprintf functions */
25 #define _DEBUG_JNI 1
26 #include "apxwin.h"
27 #include "prunmgr.h"
28
29 LPAPXGUISTORE _gui_store = NULL;
30 #define PRUNMGR_CLASS TEXT("PRUNMGR")
31 #define TMNU_CONF TEXT("Configure...")
32 #define TMNU_START TEXT("Start service")
33 #define TMNU_STOP TEXT("Stop service")
34 #define TMNU_EXIT TEXT("Exit")
35 #define TMNU_ABOUT TEXT("About")
36 #define TMNU_DUMP TEXT("Thread Dump")
37
38 /* Display only Started/Paused status */
39 #define STAT_STARTED TEXT("Started")
40 #define STAT_PAUSED TEXT("Paused")
41 #define STAT_STOPPED TEXT("Stopped")
42 #define STAT_DISABLED TEXT("Disabled")
43 #define STAT_NONE TEXT("")
44
45 #define STAT_SERVICE L"NT AUTHORITY\\LocalService"
46 #define STAT_NET_SERVICE L"NT AUTHORITY\\NetworkService"
47 #define STAT_SYSTEM L"LocalSystem"
48
49 #define LOGL_ERROR L"Error"
50 #define LOGL_DEBUG L"Debug"
51 #define LOGL_INFO L"Info"
52 #define LOGL_WARN L"Warn"
53
54 #define START_DELAYED L"Automatic (Delayed Start)"
55 #define START_AUTO L"Automatic"
56 #define START_MANUAL L"Manual"
57 #define START_DISABLED L"Disabled"
58
59 #define EMPTY_PASSWORD L" "
60
61 #ifdef WIN64
62 #define KREG_WOW6432 KEY_WOW64_32KEY
63 #else
64 #define KREG_WOW6432 0
65 #endif
66
67 /* Main application pool */
68 APXHANDLE hPool = NULL;
69 APXHANDLE hService = NULL;
70 APXHANDLE hRegistry = NULL;
71 APXHANDLE hRegserv = NULL;
72 HICON hIcoRun = NULL;
73 HICON hIcoStop = NULL;
74
75 LPAPXSERVENTRY _currentEntry = NULL;
76
77 BOOL bEnableTry = FALSE;
78 DWORD startPage = 0;
79
80 static LPCWSTR _s_log = L"Log";
81 static LPCWSTR _s_java = L"Java";
82 static LPCWSTR _s_start = L"Start";
83 static LPCWSTR _s_stop = L"Stop";
84
85 /* Allowed prunmgr commands */
86 static LPCWSTR _commands[] = {
87 L"ES", /* 1 Manage Service (default)*/
88 L"MS", /* 2 Monitor Service */
89 L"MR", /* 3 Monitor Service and start if not runing */
90 L"MQ", /* 4 Quit all running Monitor applications */
91 NULL
92 };
93
94 static LPCWSTR _altcmds[] = {
95 L"manage", /* 1 Manage Service (default)*/
96 L"monitor", /* 2 Monitor Service */
97 L"start", /* 3 Monitor Service and start if not runing */
98 L"quit", /* 4 Quit all running Monitor applications */
99 NULL
100 };
101
102
103 /* Allowed procrun parameters */
104 static APXCMDLINEOPT _options[] = {
105 /* 0 */ { L"AllowMultiInstances", NULL, NULL, APXCMDOPT_INT, NULL, 0},
106 /* NULL terminate the array */
107 { NULL }
108 };
109
110 /* Create RBUTTON try menu
111 * Configure... (default, or lbutton dblclick)
112 * Start <service name>
113 * Stop <service name>
114 * Exit
115 * Logo
116 */
createRbuttonTryMenu(HWND hWnd)117 static void createRbuttonTryMenu(HWND hWnd)
118 {
119 HMENU hMnu;
120 POINT pt;
121 BOOL canStop = FALSE;
122 BOOL canStart = FALSE;
123 hMnu = CreatePopupMenu();
124
125 if (_currentEntry) {
126 if (_currentEntry->stServiceStatus.dwCurrentState == SERVICE_RUNNING) {
127 if (_currentEntry->stServiceStatus.dwControlsAccepted & SERVICE_ACCEPT_STOP)
128 canStop = TRUE;
129 }
130 else if (_currentEntry->stServiceStatus.dwCurrentState == SERVICE_STOPPED) {
131 if (_currentEntry->lpConfig->dwStartType != SERVICE_DISABLED)
132 canStart = TRUE;
133 }
134 }
135 apxAppendMenuItem(hMnu, IDM_TM_CONFIG, TMNU_CONF, TRUE, TRUE);
136 apxAppendMenuItem(hMnu, IDM_TM_START, TMNU_START, FALSE, canStart);
137 apxAppendMenuItem(hMnu, IDM_TM_STOP, TMNU_STOP, FALSE, canStop);
138 apxAppendMenuItem(hMnu, IDM_TM_DUMP, TMNU_DUMP, FALSE, canStop);
139 apxAppendMenuItem(hMnu, IDM_TM_EXIT, TMNU_EXIT, FALSE, TRUE);
140 apxAppendMenuItem(hMnu, 0, NULL, FALSE, FALSE);
141 apxAppendMenuItem(hMnu, IDM_TM_ABOUT, TMNU_ABOUT, FALSE, TRUE);
142
143 /* Ensure we have a focus */
144 if (!SetForegroundWindow(hWnd))
145 SetForegroundWindow(NULL);
146 GetCursorPos(&pt);
147 /* Display the try menu */
148 TrackPopupMenu(hMnu, TPM_LEFTALIGN | TPM_RIGHTBUTTON,
149 pt.x, pt.y, 0, hWnd, NULL);
150 DestroyMenu(hMnu);
151 }
152
153 /* wParam progress dialog handle
154 */
__startServiceCallback(APXHANDLE hObject,UINT uMsg,WPARAM wParam,LPARAM lParam)155 static BOOL __startServiceCallback(APXHANDLE hObject, UINT uMsg,
156 WPARAM wParam, LPARAM lParam)
157 {
158 HWND hDlg = (HWND)hObject;
159
160 switch (uMsg) {
161 case WM_USER+1:
162 hDlg = (HWND)lParam;
163 if (IS_INVALID_HANDLE(hService)) {
164 EndDialog(hDlg, IDOK);
165 PostMessage(_gui_store->hMainWnd, WM_COMMAND,
166 MAKEWPARAM(IDMS_REFRESH, 0), 0);
167 return FALSE;
168 }
169 if (apxServiceControl(hService, SERVICE_CONTROL_CONTINUE, WM_USER+2,
170 __startServiceCallback, hDlg)) {
171 _currentEntry->stServiceStatus.dwCurrentState = SERVICE_RUNNING;
172 _currentEntry->stStatusProcess.dwCurrentState = SERVICE_RUNNING;
173
174 }
175 EndDialog(hDlg, IDOK);
176 PostMessage(_gui_store->hMainWnd, WM_COMMAND,
177 MAKEWPARAM(IDMS_REFRESH, 0), 0);
178 break;
179 case WM_USER+2:
180 SendMessage(hDlg, WM_USER+1, 0, 0);
181 Sleep(500);
182 break;
183 }
184 return TRUE;
185 UNREFERENCED_PARAMETER(wParam);
186 }
187
__stopServiceCallback(APXHANDLE hObject,UINT uMsg,WPARAM wParam,LPARAM lParam)188 static BOOL __stopServiceCallback(APXHANDLE hObject, UINT uMsg,
189 WPARAM wParam, LPARAM lParam)
190 {
191 HWND hDlg = (HWND)hObject;
192
193 switch (uMsg) {
194 case WM_USER+1:
195 hDlg = (HWND)lParam;
196 if (IS_INVALID_HANDLE(hService))
197 return FALSE;
198 if (apxServiceControl(hService, SERVICE_CONTROL_STOP, WM_USER+2,
199 __stopServiceCallback, hDlg)) {
200 }
201 EndDialog(hDlg, IDOK);
202 PostMessage(_gui_store->hMainWnd, WM_COMMAND,
203 MAKEWPARAM(IDMS_REFRESH, 0), 0);
204 break;
205 case WM_USER+2:
206 if (wParam == 4)
207 AplCopyMemory(&_currentEntry->stServiceStatus,
208 (LPVOID)lParam, sizeof(SERVICE_STATUS));
209 SendMessage(hDlg, WM_USER+1, 0, 0);
210 Sleep(100);
211 break;
212 }
213 return TRUE;
214 }
215
__restartServiceCallback(APXHANDLE hObject,UINT uMsg,WPARAM wParam,LPARAM lParam)216 static BOOL __restartServiceCallback(APXHANDLE hObject, UINT uMsg,
217 WPARAM wParam, LPARAM lParam)
218 {
219 HWND hDlg = (HWND)hObject;
220 switch (uMsg) {
221 case WM_USER+1:
222 hDlg = (HWND)lParam;
223 if (IS_INVALID_HANDLE(hService))
224 return FALSE;
225 /* TODO: use 128 as control code */
226 if (apxServiceControl(hService, 128, WM_USER+2,
227 __restartServiceCallback, hDlg)) {
228
229 }
230 EndDialog(hDlg, IDOK);
231 PostMessage(_gui_store->hMainWnd, WM_COMMAND,
232 MAKEWPARAM(IDMS_REFRESH, 0), 0);
233 break;
234 case WM_USER+2:
235 if (wParam == 4)
236 AplCopyMemory(&_currentEntry->stServiceStatus,
237 (LPVOID)lParam, sizeof(SERVICE_STATUS));
238
239 SendMessage(hDlg, WM_USER+1, 0, 0);
240 Sleep(100);
241 break;
242 }
243 return TRUE;
244 }
245
__pauseServiceCallback(APXHANDLE hObject,UINT uMsg,WPARAM wParam,LPARAM lParam)246 static BOOL __pauseServiceCallback(APXHANDLE hObject, UINT uMsg,
247 WPARAM wParam, LPARAM lParam)
248 {
249 HWND hDlg = (HWND)hObject;
250 switch (uMsg) {
251 case WM_USER+1:
252 hDlg = (HWND)lParam;
253 if (IS_INVALID_HANDLE(hService))
254 return FALSE;
255 if (apxServiceControl(hService, SERVICE_CONTROL_PAUSE, WM_USER+2,
256 __pauseServiceCallback, hDlg)) {
257 }
258 EndDialog(hDlg, IDOK);
259 PostMessage(_gui_store->hMainWnd, WM_COMMAND,
260 MAKEWPARAM(IDMS_REFRESH, 0), 0);
261 break;
262 case WM_USER+2:
263 if (wParam == 4)
264 AplCopyMemory(&_currentEntry->stServiceStatus,
265 (LPVOID)lParam, sizeof(SERVICE_STATUS));
266 SendMessage(hDlg, WM_USER+1, 0, 0);
267 Sleep(100);
268 break;
269 }
270 return TRUE;
271 }
272
273 static DWORD _propertyChanged;
274 static BOOL _propertyOpened = FALSE;
275 static HWND _propertyHwnd = NULL;
276 /* Service property pages */
__propertyCallback(HWND hwndPropSheet,UINT uMsg,LPARAM lParam)277 int CALLBACK __propertyCallback(HWND hwndPropSheet, UINT uMsg, LPARAM lParam)
278 {
279 switch(uMsg) {
280 case PSCB_PRECREATE:
281 {
282 LPDLGTEMPLATE lpTemplate = (LPDLGTEMPLATE)lParam;
283 if (!(lpTemplate->style & WS_SYSMENU))
284 lpTemplate->style |= WS_SYSMENU;
285 _propertyHwnd = hwndPropSheet;
286
287 _propertyChanged = 0;
288 _propertyOpened = TRUE;
289 return TRUE;
290 }
291 break;
292 case PSCB_INITIALIZED:
293 break;
294 }
295 return TRUE;
296 }
297
__generalPropertySave(HWND hDlg)298 BOOL __generalPropertySave(HWND hDlg)
299 {
300 WCHAR szN[SIZ_RESLEN];
301 WCHAR szD[SIZ_DESLEN];
302 DWORD dwStartType = SERVICE_NO_CHANGE;
303 BOOL bDelayedStart = FALSE;
304
305 int i;
306
307 if (!(TST_BIT_FLAG(_propertyChanged, 1)))
308 return TRUE;
309 CLR_BIT_FLAG(_propertyChanged, 1);
310
311 if (IS_INVALID_HANDLE(hService))
312 return FALSE;
313 GetDlgItemTextW(hDlg, IDC_PPSGDISP, szN, SIZ_RESMAX);
314 GetDlgItemTextW(hDlg, IDC_PPSGDESC, szD, SIZ_DESMAX);
315 i = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_PPSGCMBST));
316 if (i == 0) {
317 dwStartType = SERVICE_AUTO_START;
318 bDelayedStart = TRUE;
319 }
320 else if (i == 1)
321 dwStartType = SERVICE_AUTO_START;
322 else if (i == 2)
323 dwStartType = SERVICE_DEMAND_START;
324 else if (i == 3)
325 dwStartType = SERVICE_DISABLED;
326 apxServiceSetNames(hService, NULL, szN, szD, NULL, NULL);
327 apxServiceSetOptions(hService, SERVICE_NO_CHANGE, dwStartType, bDelayedStart, SERVICE_NO_CHANGE);
328
329 if (!(TST_BIT_FLAG(_propertyChanged, 2)))
330 PostMessage(_gui_store->hMainWnd, WM_COMMAND, MAKEWPARAM(IDMS_REFRESH, 0), 0);
331
332 return TRUE;
333 }
334
__generalLogonSave(HWND hDlg)335 BOOL __generalLogonSave(HWND hDlg)
336 {
337 WCHAR szU[SIZ_RESLEN];
338 WCHAR szP[SIZ_RESLEN];
339 WCHAR szC[SIZ_RESLEN];
340
341 if (!(TST_BIT_FLAG(_propertyChanged, 2)))
342 return TRUE;
343 CLR_BIT_FLAG(_propertyChanged, 2);
344
345 if (IS_INVALID_HANDLE(hService))
346 return FALSE;
347 GetDlgItemTextW(hDlg, IDC_PPSLUSER, szU, SIZ_RESMAX);
348 GetDlgItemTextW(hDlg, IDC_PPSLPASS, szP, SIZ_RESMAX);
349 GetDlgItemTextW(hDlg, IDC_PPSLCPASS, szC, SIZ_RESMAX);
350
351 if (lstrlenW(szU) == 0 || lstrcmpiW(szU, STAT_SERVICE) == 0) {
352 apxServiceSetNames(hService, NULL, NULL, NULL, STAT_SERVICE, L"");
353 lstrlcpyW(_currentEntry->szObjectName, SIZ_RESLEN, STAT_SERVICE);
354 }
355 else if (lstrcmpiW(szU, STAT_NET_SERVICE) == 0) {
356 apxServiceSetNames(hService, NULL, NULL, NULL, STAT_NET_SERVICE, L"");
357 lstrlcpyW(_currentEntry->szObjectName, SIZ_RESLEN, STAT_NET_SERVICE);
358 }
359 else if (lstrcmpiW(szU, STAT_SYSTEM) == 0) {
360 apxServiceSetNames(hService, NULL, NULL, NULL, STAT_SYSTEM, L"");
361 lstrlcpyW(_currentEntry->szObjectName, SIZ_RESLEN, STAT_SYSTEM);
362 if (IsDlgButtonChecked(hDlg, IDC_PPSLID) == BST_CHECKED) {
363 apxServiceSetOptions(hService,
364 _currentEntry->stServiceStatus.dwServiceType | SERVICE_INTERACTIVE_PROCESS,
365 SERVICE_NO_CHANGE, FALSE, SERVICE_NO_CHANGE);
366 }
367 else {
368 apxServiceSetOptions(hService,
369 _currentEntry->stServiceStatus.dwServiceType & ~SERVICE_INTERACTIVE_PROCESS,
370 SERVICE_NO_CHANGE, FALSE, SERVICE_NO_CHANGE);
371 }
372 } else {
373 if (szP[0] != L' ' && szC[0] != L' ' && !lstrcmpW(szP, szC)) {
374 apxServiceSetNames(hService, NULL, NULL, NULL, szU, szP);
375 lstrlcpyW(_currentEntry->szObjectName, SIZ_RESLEN, szU);
376 }
377 else {
378 MessageBoxW(hDlg, apxLoadResourceW(IDS_VALIDPASS, 0),
379 apxLoadResourceW(IDS_APPLICATION, 1),
380 MB_OK | MB_ICONSTOP);
381 return FALSE;
382 }
383 }
384
385 if (!(TST_BIT_FLAG(_propertyChanged, 1)))
386 PostMessage(_gui_store->hMainWnd, WM_COMMAND, MAKEWPARAM(IDMS_REFRESH, 0), 0);
387 return TRUE;
388 }
389
__generalLoggingSave(HWND hDlg)390 BOOL __generalLoggingSave(HWND hDlg)
391 {
392 WCHAR szB[SIZ_DESLEN];
393
394 if (!(TST_BIT_FLAG(_propertyChanged, 3)))
395 return TRUE;
396 CLR_BIT_FLAG(_propertyChanged, 3);
397
398 if (IS_INVALID_HANDLE(hService))
399 return FALSE;
400
401 GetDlgItemTextW(hDlg, IDC_PPLGLEVEL, szB, SIZ_DESMAX);
402 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_log, L"Level", szB);
403 GetDlgItemTextW(hDlg, IDC_PPLGPATH, szB, SIZ_DESMAX);
404 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_log, L"Path", szB);
405 GetDlgItemTextW(hDlg, IDC_PPLGPREFIX, szB, SIZ_DESMAX);
406 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_log, L"Prefix", szB);
407 GetDlgItemTextW(hDlg, IDC_PPLGPIDFILE, szB, SIZ_DESMAX);
408 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_log, L"PidFile", szB);
409 GetDlgItemTextW(hDlg, IDC_PPLGSTDOUT, szB, SIZ_DESMAX);
410 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_log, L"StdOutput", szB);
411 GetDlgItemTextW(hDlg, IDC_PPLGSTDERR, szB, SIZ_DESMAX);
412 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_log, L"StdError", szB);
413
414 if (!(TST_BIT_FLAG(_propertyChanged, 1)))
415 PostMessage(_gui_store->hMainWnd, WM_COMMAND, MAKEWPARAM(IDMS_REFRESH, 0), 0);
416 return TRUE;
417 }
418
__generalJvmSave(HWND hDlg)419 BOOL __generalJvmSave(HWND hDlg)
420 {
421 WCHAR szB[SIZ_HUGLEN];
422 LPWSTR p, s;
423 DWORD l;
424 if (!(TST_BIT_FLAG(_propertyChanged, 4)))
425 return TRUE;
426 CLR_BIT_FLAG(_propertyChanged, 4);
427
428 if (IS_INVALID_HANDLE(hService))
429 return FALSE;
430 if (!IsDlgButtonChecked(hDlg, IDC_PPJAUTO)) {
431 GetDlgItemTextW(hDlg, IDC_PPJJVM, szB, SIZ_HUGMAX);
432 }
433 else
434 lstrcpyW(szB, L"auto");
435 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_java, L"Jvm", szB);
436 GetDlgItemTextW(hDlg, IDC_PPJCLASSPATH, szB, SIZ_HUGMAX);
437 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_java, L"Classpath", szB);
438
439 l = GetWindowTextLength(GetDlgItem(hDlg, IDC_PPJOPTIONS));
440 p = apxPoolAlloc(hPool, (l + 2) * sizeof(WCHAR));
441 GetDlgItemTextW(hDlg, IDC_PPJOPTIONS, p, l + 1);
442 s = apxCRLFToMszW(hPool, p, &l);
443 apxFree(p);
444 apxRegistrySetMzStrW(hRegserv, APXREG_PARAMSOFTWARE,
445 _s_java, L"Options", s, l);
446 if (!GetDlgItemTextW(hDlg, IDC_PPJMS, szB, SIZ_HUGMAX))
447 szB[0] = L'\0';
448
449 l = GetWindowTextLength(GetDlgItem(hDlg, IDC_PPJOPTIONS9));
450 p = apxPoolAlloc(hPool, (l + 2) * sizeof(WCHAR));
451 GetDlgItemTextW(hDlg, IDC_PPJOPTIONS9, p, l + 1);
452 s = apxCRLFToMszW(hPool, p, &l);
453 apxFree(p);
454 apxRegistrySetMzStrW(hRegserv, APXREG_PARAMSOFTWARE,
455 _s_java, L"Options9", s, l);
456 if (!GetDlgItemTextW(hDlg, IDC_PPJMS, szB, SIZ_HUGMAX))
457 szB[0] = L'\0';
458
459 apxRegistrySetNumW(hRegserv, APXREG_PARAMSOFTWARE, _s_java, L"JvmMs",
460 apxAtoulW(szB));
461 if (!GetDlgItemTextW(hDlg, IDC_PPJMX, szB, SIZ_DESMAX))
462 szB[0] = L'\0';
463 apxRegistrySetNumW(hRegserv, APXREG_PARAMSOFTWARE, _s_java, L"JvmMx",
464 apxAtoulW(szB));
465 if (!GetDlgItemTextW(hDlg, IDC_PPJSS, szB, SIZ_DESMAX))
466 szB[0] = L'\0';
467 apxRegistrySetNumW(hRegserv, APXREG_PARAMSOFTWARE, _s_java, L"JvmSs",
468 apxAtoulW(szB));
469 apxFree(s);
470 if (!(TST_BIT_FLAG(_propertyChanged, 1)))
471 PostMessage(_gui_store->hMainWnd, WM_COMMAND, MAKEWPARAM(IDMS_REFRESH, 0), 0);
472 return TRUE;
473 }
474
__generalStartSave(HWND hDlg)475 BOOL __generalStartSave(HWND hDlg)
476 {
477 WCHAR szB[SIZ_HUGLEN];
478 LPWSTR p, s;
479 DWORD l;
480
481 if (!(TST_BIT_FLAG(_propertyChanged, 5)))
482 return TRUE;
483 CLR_BIT_FLAG(_propertyChanged, 5);
484
485 if (IS_INVALID_HANDLE(hService))
486 return FALSE;
487
488 GetDlgItemTextW(hDlg, IDC_PPRCLASS, szB, SIZ_HUGMAX);
489 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_start, L"Class", szB);
490 GetDlgItemTextW(hDlg, IDC_PPRIMAGE, szB, SIZ_HUGMAX);
491 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_start, L"Image", szB);
492 GetDlgItemTextW(hDlg, IDC_PPRWPATH, szB, SIZ_HUGMAX);
493 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_start, L"WorkingPath", szB);
494 GetDlgItemTextW(hDlg, IDC_PPRMETHOD, szB, SIZ_HUGMAX);
495 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_start, L"Method", szB);
496 GetDlgItemTextW(hDlg, IDC_PPRMODE, szB, SIZ_HUGMAX);
497 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_start, L"Mode", szB);
498
499 l = GetWindowTextLength(GetDlgItem(hDlg, IDC_PPRARGS));
500 p = apxPoolAlloc(hPool, (l + 2) * sizeof(WCHAR));
501 GetDlgItemTextW(hDlg, IDC_PPRARGS, p, l + 1);
502 s = apxCRLFToMszW(hPool, p, &l);
503 apxFree(p);
504 apxRegistrySetMzStrW(hRegserv, APXREG_PARAMSOFTWARE,
505 _s_start, L"Params", s, l);
506 apxFree(s);
507
508 if (!(TST_BIT_FLAG(_propertyChanged, 1)))
509 PostMessage(_gui_store->hMainWnd, WM_COMMAND, MAKEWPARAM(IDMS_REFRESH, 0), 0);
510 return TRUE;
511 }
512
__generalStopSave(HWND hDlg)513 BOOL __generalStopSave(HWND hDlg)
514 {
515 WCHAR szB[SIZ_HUGLEN];
516 LPWSTR p, s;
517 DWORD l;
518
519 if (!(TST_BIT_FLAG(_propertyChanged, 6)))
520 return TRUE;
521 CLR_BIT_FLAG(_propertyChanged, 6);
522
523 if (IS_INVALID_HANDLE(hService))
524 return FALSE;
525
526 GetDlgItemTextW(hDlg, IDC_PPSCLASS, szB, SIZ_HUGMAX);
527 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_stop, L"Class", szB);
528 GetDlgItemTextW(hDlg, IDC_PPSIMAGE, szB, SIZ_HUGMAX);
529 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_stop, L"Image", szB);
530 GetDlgItemTextW(hDlg, IDC_PPSWPATH, szB, SIZ_HUGMAX);
531 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_stop, L"WorkingPath", szB);
532 GetDlgItemTextW(hDlg, IDC_PPSMETHOD, szB, SIZ_HUGMAX);
533 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_stop, L"Method", szB);
534 GetDlgItemTextW(hDlg, IDC_PPSTIMEOUT, szB, SIZ_HUGMAX);
535 apxRegistrySetNumW(hRegserv, APXREG_PARAMSOFTWARE, _s_stop, L"Timeout", apxAtoulW(szB));
536 GetDlgItemTextW(hDlg, IDC_PPSMODE, szB, SIZ_HUGMAX);
537 apxRegistrySetStrW(hRegserv, APXREG_PARAMSOFTWARE, _s_stop, L"Mode", szB);
538
539 l = GetWindowTextLength(GetDlgItem(hDlg, IDC_PPSARGS));
540 p = apxPoolAlloc(hPool, (l + 2) * sizeof(WCHAR));
541 GetDlgItemTextW(hDlg, IDC_PPSARGS, p, l + 1);
542 s = apxCRLFToMszW(hPool, p, &l);
543 apxFree(p);
544 apxRegistrySetMzStrW(hRegserv, APXREG_PARAMSOFTWARE,
545 _s_stop, L"Params", s, l);
546 apxFree(s);
547
548 if (!(TST_BIT_FLAG(_propertyChanged, 1)))
549 PostMessage(_gui_store->hMainWnd, WM_COMMAND, MAKEWPARAM(IDMS_REFRESH, 0), 0);
550 return TRUE;
551 }
552
__generalPropertyRefresh(HWND hDlg)553 void __generalPropertyRefresh(HWND hDlg)
554 {
555 Button_Enable(GetDlgItem(hDlg, IDC_PPSGSTART), FALSE);
556 Button_Enable(GetDlgItem(hDlg, IDC_PPSGSTOP), FALSE);
557 Button_Enable(GetDlgItem(hDlg, IDC_PPSGPAUSE), FALSE);
558 Button_Enable(GetDlgItem(hDlg, IDC_PPSGRESTART), FALSE);
559 switch (_currentEntry->stServiceStatus.dwCurrentState) {
560 case SERVICE_RUNNING:
561 if (_currentEntry->stServiceStatus.dwControlsAccepted & SERVICE_ACCEPT_STOP ||
562 _currentEntry->lpConfig->dwStartType != SERVICE_DISABLED) {
563 Button_Enable(GetDlgItem(hDlg, IDC_PPSGSTOP), TRUE);
564 SetDlgItemText(hDlg, IDC_PPSGSTATUS, STAT_STARTED);
565 }
566 else
567 SetDlgItemText(hDlg, IDC_PPSGSTATUS, STAT_DISABLED);
568 if (_currentEntry->stServiceStatus.dwControlsAccepted & SERVICE_ACCEPT_PAUSE_CONTINUE) {
569 Button_Enable(GetDlgItem(hDlg, IDC_PPSGPAUSE), TRUE);
570 Button_Enable(GetDlgItem(hDlg, IDC_PPSGRESTART), TRUE);
571 }
572 break;
573 case SERVICE_PAUSED:
574 Button_Enable(GetDlgItem(hDlg, IDC_PPSGSTART), TRUE);
575 Button_Enable(GetDlgItem(hDlg, IDC_PPSGRESTART), TRUE);
576 SetDlgItemText(hDlg, IDC_PPSGSTATUS, STAT_PAUSED);
577 break;
578 case SERVICE_STOPPED:
579 if (_currentEntry->lpConfig->dwStartType != SERVICE_DISABLED) {
580 Button_Enable(GetDlgItem(hDlg, IDC_PPSGSTART), TRUE);
581 SetDlgItemText(hDlg, IDC_PPSGSTATUS, STAT_STOPPED);
582 }
583 else
584 SetDlgItemText(hDlg, IDC_PPSGSTATUS, STAT_DISABLED);
585 break;
586 default:
587 break;
588 }
589 }
590
591 static BOOL bpropCentered = FALSE;
592 static HWND _generalPropertyHwnd = NULL;
593
__generalProperty(HWND hDlg,UINT uMessage,WPARAM wParam,LPARAM lParam)594 INT_PTR CALLBACK __generalProperty(HWND hDlg,
595 UINT uMessage,
596 WPARAM wParam,
597 LPARAM lParam)
598 {
599 LPPSHNOTIFY lpShn;
600 WCHAR szBuf[SIZ_DESLEN];
601
602 switch (uMessage) {
603 case WM_INITDIALOG:
604 {
605 _generalPropertyHwnd = hDlg;
606 if (!bEnableTry)
607 apxCenterWindow(GetParent(hDlg), NULL);
608 else if (!bpropCentered)
609 apxCenterWindow(GetParent(hDlg), NULL);
610 bpropCentered = TRUE;
611 startPage = 0;
612 if (!bEnableTry)
613 apxCenterWindow(GetParent(hDlg), NULL);
614 SendMessage(GetDlgItem(hDlg, IDC_PPSGDISP), EM_LIMITTEXT, SIZ_RESMAX, 0);
615 SendMessage(GetDlgItem(hDlg, IDC_PPSGDESC), EM_LIMITTEXT, SIZ_DESMAX, 0);
616
617 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSGCMBST), START_DELAYED);
618 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSGCMBST), START_AUTO);
619 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSGCMBST), START_MANUAL);
620 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSGCMBST), START_DISABLED);
621 if (_currentEntry->lpConfig->dwStartType == SERVICE_AUTO_START) {
622 if (_currentEntry->bDelayedStart) {
623 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPSGCMBST), 0);
624 }
625 else {
626 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPSGCMBST), 1);
627 }
628 }
629 else if (_currentEntry->lpConfig->dwStartType == SERVICE_DEMAND_START)
630 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPSGCMBST), 2);
631 else if (_currentEntry->lpConfig->dwStartType == SERVICE_DISABLED)
632 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPSGCMBST), 3);
633
634 SetDlgItemTextW(hDlg, IDC_PPSGNAME, _currentEntry->szServiceName);
635 SetDlgItemTextW(hDlg, IDC_PPSGDISP, _currentEntry->lpConfig->lpDisplayName);
636 SetDlgItemTextW(hDlg, IDC_PPSGDESC, _currentEntry->szServiceDescription);
637 SetDlgItemTextW(hDlg, IDC_PPSGDEXE, _currentEntry->lpConfig->lpBinaryPathName);
638 __generalPropertyRefresh(hDlg);
639 }
640 break;
641 case WM_COMMAND:
642 switch (LOWORD(wParam)) {
643 case IDC_PPSGCMBST:
644 if (HIWORD(wParam) == CBN_SELCHANGE) {
645 PropSheet_Changed(GetParent(hDlg), hDlg);
646 SET_BIT_FLAG(_propertyChanged, 1);
647 }
648 break;
649 case IDC_PPSGDISP:
650 if (HIWORD(wParam) == EN_CHANGE) {
651 GetDlgItemTextW(hDlg, IDC_PPSGDISP, szBuf, SIZ_RESMAX);
652 if (!lstrcmpW(szBuf, _currentEntry->lpConfig->lpDisplayName)) {
653 PropSheet_UnChanged(GetParent(hDlg), hDlg);
654 CLR_BIT_FLAG(_propertyChanged, 1);
655 }
656 else {
657 PropSheet_Changed(GetParent(hDlg), hDlg);
658 SET_BIT_FLAG(_propertyChanged, 1);
659 }
660 }
661 break;
662 case IDC_PPSGDESC:
663 if (HIWORD(wParam) == EN_CHANGE) {
664 GetDlgItemTextW(hDlg, IDC_PPSGDESC, szBuf, SIZ_DESMAX);
665 if (!lstrcmpW(szBuf, _currentEntry->szServiceDescription)) {
666 PropSheet_UnChanged(GetParent(hDlg), hDlg);
667 CLR_BIT_FLAG(_propertyChanged, 1);
668 }
669 else {
670 PropSheet_Changed(GetParent(hDlg), hDlg);
671 SET_BIT_FLAG(_propertyChanged, 1);
672 }
673 }
674 break;
675 case IDC_PPSGSTART:
676 apxProgressBox(hDlg, apxLoadResourceW(IDS_HSSTART, 0),
677 _currentEntry->lpConfig->lpDisplayName,
678 __startServiceCallback, NULL);
679 __generalPropertyRefresh(hDlg);
680 break;
681 case IDC_PPSGSTOP:
682 apxProgressBox(hDlg, apxLoadResourceW(IDS_HSSTOP, 0),
683 _currentEntry->lpConfig->lpDisplayName,
684 __stopServiceCallback, NULL);
685 __generalPropertyRefresh(hDlg);
686 break;
687 case IDC_PPSGPAUSE:
688 apxProgressBox(hDlg, apxLoadResourceW(IDS_HSPAUSE, 0),
689 _currentEntry->lpConfig->lpDisplayName,
690 __pauseServiceCallback, NULL);
691 __generalPropertyRefresh(hDlg);
692 break;
693 case IDC_PPSGRESTART:
694 apxProgressBox(hDlg, apxLoadResourceW(IDS_HSRESTART, 0),
695 _currentEntry->lpConfig->lpDisplayName,
696 __restartServiceCallback, NULL);
697 __generalPropertyRefresh(hDlg);
698 break;
699 }
700 break;
701 case WM_NOTIFY:
702 lpShn = (LPPSHNOTIFY )lParam;
703 switch (lpShn->hdr.code) {
704 case PSN_APPLY: /* sent when OK or Apply button pressed */
705 if (__generalPropertySave(hDlg)) {
706 PropSheet_UnChanged(GetParent(hDlg), hDlg);
707 }
708 else {
709 SET_BIT_FLAG(_propertyChanged, 1);
710 SetWindowLong(hDlg, DWLP_MSGRESULT,
711 PSNRET_INVALID_NOCHANGEPAGE);
712 return TRUE;
713 }
714
715 break;
716 default:
717 break;
718 }
719 break;
720 default:
721 break;
722 }
723
724 return FALSE;
725 }
726
__logonProperty(HWND hDlg,UINT uMessage,WPARAM wParam,LPARAM lParam)727 INT_PTR CALLBACK __logonProperty(HWND hDlg,
728 UINT uMessage,
729 WPARAM wParam,
730 LPARAM lParam)
731 {
732 LPPSHNOTIFY lpShn;
733 WCHAR szBuf[SIZ_DESLEN];
734 switch (uMessage) {
735 case WM_INITDIALOG:
736 {
737 BOOL bNamedAccount = FALSE;
738 BOOL bLocalSystemAccount = FALSE;
739
740 startPage = 1;
741 if (!bpropCentered)
742 apxCenterWindow(GetParent(hDlg), NULL);
743 bpropCentered = TRUE;
744
745 SendMessage(GetDlgItem(hDlg, IDC_PPSLUSER), EM_LIMITTEXT, 63, 0);
746 SendMessage(GetDlgItem(hDlg, IDC_PPSLPASS), EM_LIMITTEXT, 63, 0);
747 SendMessage(GetDlgItem(hDlg, IDC_PPSLCPASS), EM_LIMITTEXT, 63, 0);
748
749 // LocalService
750 if (lstrcmpiW(_currentEntry->szObjectName, STAT_SERVICE) == 0) {
751 CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, IDC_PPSLLSRV);
752 SetDlgItemTextW(hDlg, IDC_PPSLUSER, STAT_SERVICE);
753 }
754 // NetworkService
755 else if (lstrcmpiW(_currentEntry->szObjectName, STAT_NET_SERVICE) == 0) {
756 CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, IDC_PPSLNSRV);
757 SetDlgItemTextW(hDlg, IDC_PPSLUSER, STAT_NET_SERVICE);
758 }
759 // LocalSystem
760 else if (lstrcmpiW(_currentEntry->szObjectName, STAT_SYSTEM) == 0) {
761 CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, IDC_PPSLLSYS);
762 SetDlgItemTextW(hDlg, IDC_PPSLUSER, STAT_SYSTEM);
763 bLocalSystemAccount = TRUE;
764 if (_currentEntry->lpConfig->dwServiceType & SERVICE_INTERACTIVE_PROCESS) {
765 CheckDlgButton(hDlg, IDC_PPSLID, BST_CHECKED);
766 }
767 }
768 else {
769 bNamedAccount = TRUE;
770 CheckRadioButton(hDlg, IDC_PPSLLSYS, IDC_PPSLUA, IDC_PPSLUA);
771 SetDlgItemTextW(hDlg, IDC_PPSLUSER, _currentEntry->szObjectName);
772 SetDlgItemTextW(hDlg, IDC_PPSLPASS, EMPTY_PASSWORD);
773 SetDlgItemTextW(hDlg, IDC_PPSLCPASS, EMPTY_PASSWORD);
774 }
775
776 EnableWindow(GetDlgItem(hDlg, IDC_PPSLID), bLocalSystemAccount);
777 EnableWindow(GetDlgItem(hDlg, IDC_PPSLUSER), bNamedAccount);
778 EnableWindow(GetDlgItem(hDlg, IDC_PPSLBROWSE), bNamedAccount);
779 EnableWindow(GetDlgItem(hDlg, IDL_PPSLPASS), bNamedAccount);
780 EnableWindow(GetDlgItem(hDlg, IDC_PPSLPASS), bNamedAccount);
781 EnableWindow(GetDlgItem(hDlg, IDL_PPSLCPASS), bNamedAccount);
782 EnableWindow(GetDlgItem(hDlg, IDC_PPSLCPASS), bNamedAccount);
783 }
784 break;
785 case WM_COMMAND:
786 switch (LOWORD(wParam)) {
787 case IDC_PPSLLSRV:
788 SetDlgItemTextW(hDlg, IDC_PPSLUSER, STAT_SERVICE);
789 SetDlgItemTextW(hDlg, IDC_PPSLPASS, L"");
790 SetDlgItemTextW(hDlg, IDC_PPSLCPASS, L"");
791 EnableWindow(GetDlgItem(hDlg, IDC_PPSLID), FALSE);
792 EnableWindow(GetDlgItem(hDlg, IDC_PPSLUSER), FALSE);
793 EnableWindow(GetDlgItem(hDlg, IDC_PPSLBROWSE), FALSE);
794 EnableWindow(GetDlgItem(hDlg, IDL_PPSLPASS), FALSE);
795 EnableWindow(GetDlgItem(hDlg, IDC_PPSLPASS), FALSE);
796 EnableWindow(GetDlgItem(hDlg, IDL_PPSLCPASS), FALSE);
797 EnableWindow(GetDlgItem(hDlg, IDC_PPSLCPASS), FALSE);
798 CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, (INT)wParam);
799 if (lstrcmpiW(_currentEntry->szObjectName, STAT_SERVICE)) {
800 PropSheet_Changed(GetParent(hDlg), hDlg);
801 SET_BIT_FLAG(_propertyChanged, 2);
802 }
803 else {
804 PropSheet_UnChanged(GetParent(hDlg), hDlg);
805 CLR_BIT_FLAG(_propertyChanged, 2);
806 }
807 break;
808 case IDC_PPSLNSRV:
809 SetDlgItemTextW(hDlg, IDC_PPSLUSER, STAT_NET_SERVICE);
810 SetDlgItemTextW(hDlg, IDC_PPSLPASS, L"");
811 SetDlgItemTextW(hDlg, IDC_PPSLCPASS, L"");
812 EnableWindow(GetDlgItem(hDlg, IDC_PPSLID), FALSE);
813 EnableWindow(GetDlgItem(hDlg, IDC_PPSLUSER), FALSE);
814 EnableWindow(GetDlgItem(hDlg, IDC_PPSLBROWSE), FALSE);
815 EnableWindow(GetDlgItem(hDlg, IDL_PPSLPASS), FALSE);
816 EnableWindow(GetDlgItem(hDlg, IDC_PPSLPASS), FALSE);
817 EnableWindow(GetDlgItem(hDlg, IDL_PPSLCPASS), FALSE);
818 EnableWindow(GetDlgItem(hDlg, IDC_PPSLCPASS), FALSE);
819 CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, (INT)wParam);
820 if (lstrcmpiW(_currentEntry->szObjectName, STAT_NET_SERVICE)) {
821 PropSheet_Changed(GetParent(hDlg), hDlg);
822 SET_BIT_FLAG(_propertyChanged, 2);
823 }
824 else {
825 PropSheet_UnChanged(GetParent(hDlg), hDlg);
826 CLR_BIT_FLAG(_propertyChanged, 2);
827 }
828 break;
829 case IDC_PPSLLSYS:
830 SetDlgItemTextW(hDlg, IDC_PPSLUSER, STAT_SYSTEM);
831 SetDlgItemTextW(hDlg, IDC_PPSLPASS, L"");
832 SetDlgItemTextW(hDlg, IDC_PPSLCPASS, L"");
833 EnableWindow(GetDlgItem(hDlg, IDC_PPSLID), TRUE);
834 EnableWindow(GetDlgItem(hDlg, IDC_PPSLUSER), FALSE);
835 EnableWindow(GetDlgItem(hDlg, IDC_PPSLBROWSE), FALSE);
836 EnableWindow(GetDlgItem(hDlg, IDL_PPSLPASS), FALSE);
837 EnableWindow(GetDlgItem(hDlg, IDC_PPSLPASS), FALSE);
838 EnableWindow(GetDlgItem(hDlg, IDL_PPSLCPASS), FALSE);
839 EnableWindow(GetDlgItem(hDlg, IDC_PPSLCPASS), FALSE);
840 CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, (INT)wParam);
841 if (lstrcmpiW(_currentEntry->szObjectName, STAT_SYSTEM)) {
842 PropSheet_Changed(GetParent(hDlg), hDlg);
843 SET_BIT_FLAG(_propertyChanged, 2);
844 }
845 else {
846 PropSheet_UnChanged(GetParent(hDlg), hDlg);
847 CLR_BIT_FLAG(_propertyChanged, 2);
848 }
849 break;
850 case IDC_PPSLUA:
851 SetDlgItemTextW(hDlg, IDC_PPSLUSER, _currentEntry->szObjectName);
852 SetDlgItemTextW(hDlg, IDC_PPSLPASS, EMPTY_PASSWORD);
853 SetDlgItemTextW(hDlg, IDC_PPSLCPASS, EMPTY_PASSWORD);
854 EnableWindow(GetDlgItem(hDlg, IDC_PPSLID), FALSE);
855 EnableWindow(GetDlgItem(hDlg, IDC_PPSLUSER), TRUE);
856 EnableWindow(GetDlgItem(hDlg, IDC_PPSLBROWSE), TRUE);
857 EnableWindow(GetDlgItem(hDlg, IDL_PPSLPASS), TRUE);
858 EnableWindow(GetDlgItem(hDlg, IDC_PPSLPASS), TRUE);
859 EnableWindow(GetDlgItem(hDlg, IDL_PPSLCPASS), TRUE);
860 EnableWindow(GetDlgItem(hDlg, IDC_PPSLCPASS), TRUE);
861 CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, (INT)wParam);
862 PropSheet_UnChanged(GetParent(hDlg), hDlg);
863 CLR_BIT_FLAG(_propertyChanged, 2);
864 break;
865 case IDC_PPSLID:
866 PropSheet_Changed(GetParent(hDlg), hDlg);
867 SET_BIT_FLAG(_propertyChanged, 2);
868 break;
869 case IDC_PPSLUSER:
870 if (HIWORD(wParam) == EN_CHANGE) {
871 GetDlgItemTextW(hDlg, IDC_PPSLUSER, szBuf, SIZ_RESMAX);
872 if (!lstrcmpiW(szBuf, _currentEntry->szObjectName)) {
873 PropSheet_UnChanged(GetParent(hDlg), hDlg);
874 CLR_BIT_FLAG(_propertyChanged, 2);
875 }
876 else {
877 PropSheet_Changed(GetParent(hDlg), hDlg);
878 SET_BIT_FLAG(_propertyChanged, 2);
879 }
880 }
881 break;
882 case IDC_PPSLPASS:
883 case IDC_PPSLCPASS:
884 if (HIWORD(wParam) == EN_CHANGE) {
885 WCHAR szP[SIZ_RESLEN];
886 WCHAR szC[SIZ_RESLEN];
887 GetDlgItemTextW(hDlg, IDC_PPSLPASS, szP, SIZ_RESMAX);
888 GetDlgItemTextW(hDlg, IDC_PPSLCPASS, szC, SIZ_RESMAX);
889 /* check for valid password match */
890 if (szP[0] == L' ' && szC[0] == L' ') {
891 PropSheet_UnChanged(GetParent(hDlg), hDlg);
892 CLR_BIT_FLAG(_propertyChanged, 2);
893 }
894 else if (!lstrcmpW(szP, szC)) {
895 PropSheet_Changed(GetParent(hDlg), hDlg);
896 SET_BIT_FLAG(_propertyChanged, 2);
897 }
898 }
899 break;
900 case IDC_PPSLBROWSE:
901 {
902 WCHAR szUser[SIZ_RESLEN];
903 if (apxDlgSelectUser(hDlg, szUser))
904 SetDlgItemTextW(hDlg, IDC_PPSLUSER, szUser);
905 }
906 break;
907 }
908 break;
909 case WM_NOTIFY:
910 lpShn = (LPPSHNOTIFY )lParam;
911 switch (lpShn->hdr.code) {
912 case PSN_APPLY: /* sent when OK or Apply button pressed */
913 if (__generalLogonSave(hDlg))
914 PropSheet_UnChanged(GetParent(hDlg), hDlg);
915 else {
916 SET_BIT_FLAG(_propertyChanged, 2);
917 SetWindowLong(hDlg, DWLP_MSGRESULT,
918 PSNRET_INVALID_NOCHANGEPAGE);
919 return TRUE;
920 }
921
922 break;
923 }
924 break;
925
926 default:
927 break;
928 }
929 return FALSE;
930 }
931
__loggingProperty(HWND hDlg,UINT uMessage,WPARAM wParam,LPARAM lParam)932 INT_PTR CALLBACK __loggingProperty(HWND hDlg,
933 UINT uMessage,
934 WPARAM wParam,
935 LPARAM lParam)
936 {
937 LPPSHNOTIFY lpShn;
938 LPWSTR lpBuf;
939
940 switch (uMessage) {
941 case WM_INITDIALOG:
942 {
943 LPWSTR b;
944 startPage = 2;
945 if (!bpropCentered)
946 apxCenterWindow(GetParent(hDlg), NULL);
947 bpropCentered = TRUE;
948 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPLGLEVEL), LOGL_ERROR);
949 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPLGLEVEL), LOGL_WARN);
950 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPLGLEVEL), LOGL_INFO);
951 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPLGLEVEL), LOGL_DEBUG);
952 if ((b = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
953 _s_log, L"Level")) != NULL) {
954 if (!lstrcmpiW(b, LOGL_ERROR))
955 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPLGLEVEL), 0);
956 else if (!lstrcmpiW(b, LOGL_WARN))
957 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPLGLEVEL), 1);
958 else if (!lstrcmpiW(b, LOGL_INFO))
959 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPLGLEVEL), 2);
960 else
961 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPLGLEVEL), 3);
962 apxFree(b);
963 }
964 else
965 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPLGLEVEL), 2);
966 if ((b = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
967 _s_log, L"Path")) != NULL) {
968 SetDlgItemTextW(hDlg, IDC_PPLGPATH, b);
969 apxFree(b);
970 }
971 if ((b = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
972 _s_log, L"Prefix")) != NULL) {
973 SetDlgItemTextW(hDlg, IDC_PPLGPREFIX, b);
974 apxFree(b);
975 }
976 else
977 SetDlgItemTextW(hDlg, IDC_PPLGPREFIX, L"commons-daemon");
978 if ((b = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
979 _s_log, L"PidFile")) != NULL) {
980 SetDlgItemTextW(hDlg, IDC_PPLGPIDFILE, b);
981 apxFree(b);
982 }
983 if ((b = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
984 _s_log, L"StdOutput")) != NULL) {
985 SetDlgItemTextW(hDlg, IDC_PPLGSTDOUT, b);
986 apxFree(b);
987 }
988 if ((b = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
989 _s_log, L"StdError")) != NULL) {
990 SetDlgItemTextW(hDlg, IDC_PPLGSTDERR, b);
991 apxFree(b);
992 }
993 }
994 break;
995 case WM_COMMAND:
996 switch (LOWORD(wParam)) {
997 case IDC_PPLGLEVEL:
998 if (HIWORD(wParam) == CBN_SELCHANGE) {
999 PropSheet_Changed(GetParent(hDlg), hDlg);
1000 SET_BIT_FLAG(_propertyChanged, 3);
1001 }
1002 break;
1003 case IDC_PPLGPATH:
1004 if (HIWORD(wParam) == EN_CHANGE) {
1005 PropSheet_Changed(GetParent(hDlg), hDlg);
1006 SET_BIT_FLAG(_propertyChanged, 3);
1007 }
1008 break;
1009 case IDC_PPLGPREFIX:
1010 if (HIWORD(wParam) == EN_CHANGE) {
1011 PropSheet_Changed(GetParent(hDlg), hDlg);
1012 SET_BIT_FLAG(_propertyChanged, 3);
1013 }
1014 break;
1015 case IDC_PPLGPIDFILE:
1016 if (HIWORD(wParam) == EN_CHANGE) {
1017 PropSheet_Changed(GetParent(hDlg), hDlg);
1018 SET_BIT_FLAG(_propertyChanged, 3);
1019 }
1020 break;
1021 case IDC_PPLGSTDERR:
1022 if (HIWORD(wParam) == EN_CHANGE) {
1023 PropSheet_Changed(GetParent(hDlg), hDlg);
1024 SET_BIT_FLAG(_propertyChanged, 3);
1025 }
1026 break;
1027 case IDC_PPLGSTDOUT:
1028 if (HIWORD(wParam) == EN_CHANGE) {
1029 PropSheet_Changed(GetParent(hDlg), hDlg);
1030 SET_BIT_FLAG(_propertyChanged, 3);
1031 }
1032 break;
1033 case IDC_PPLGBPATH:
1034 lpBuf = apxBrowseForFolderW(hDlg, apxLoadResourceW(IDS_LGPATHTITLE, 0));
1035 if (lpBuf) {
1036 SetDlgItemTextW(hDlg, IDC_PPLGPATH, lpBuf);
1037 apxFree(lpBuf);
1038 PropSheet_Changed(GetParent(hDlg), hDlg);
1039 SET_BIT_FLAG(_propertyChanged, 3);
1040 }
1041 break;
1042 case IDC_PPLGBSTDOUT:
1043 lpBuf = apxGetFileNameW(hDlg, apxLoadResourceW(IDS_LGSTDOUT, 0),
1044 apxLoadResourceW(IDS_ALLFILES, 1), NULL,
1045 NULL, FALSE, NULL);
1046 if (lpBuf) {
1047 SetDlgItemTextW(hDlg, IDC_PPLGSTDOUT, lpBuf);
1048 apxFree(lpBuf);
1049 PropSheet_Changed(GetParent(hDlg), hDlg);
1050 SET_BIT_FLAG(_propertyChanged, 3);
1051 }
1052 break;
1053 case IDC_PPLGBSTDERR:
1054 lpBuf = apxGetFileNameW(hDlg, apxLoadResourceW(IDS_LGSTDERR, 0),
1055 apxLoadResourceW(IDS_ALLFILES, 1), NULL,
1056 NULL, FALSE, NULL);
1057 if (lpBuf) {
1058 SetDlgItemTextW(hDlg, IDC_PPLGSTDERR, lpBuf);
1059 apxFree(lpBuf);
1060 PropSheet_Changed(GetParent(hDlg), hDlg);
1061 SET_BIT_FLAG(_propertyChanged, 3);
1062 }
1063 break;
1064 }
1065 break;
1066 case WM_NOTIFY:
1067 lpShn = (LPPSHNOTIFY )lParam;
1068 switch (lpShn->hdr.code) {
1069 case PSN_APPLY: /* sent when OK or Apply button pressed */
1070 if (__generalLoggingSave(hDlg))
1071 PropSheet_UnChanged(GetParent(hDlg), hDlg);
1072 else {
1073 SET_BIT_FLAG(_propertyChanged, 3);
1074 SetWindowLong(hDlg, DWLP_MSGRESULT,
1075 PSNRET_INVALID_NOCHANGEPAGE);
1076 return TRUE;
1077 }
1078
1079 break;
1080 }
1081 break;
1082
1083 default:
1084 break;
1085 }
1086 return FALSE;
1087 }
1088
__jvmProperty(HWND hDlg,UINT uMessage,WPARAM wParam,LPARAM lParam)1089 INT_PTR CALLBACK __jvmProperty(HWND hDlg,
1090 UINT uMessage,
1091 WPARAM wParam,
1092 LPARAM lParam)
1093 {
1094 LPPSHNOTIFY lpShn;
1095 LPWSTR lpBuf, b;
1096 DWORD v;
1097 CHAR bn[32];
1098
1099 switch (uMessage) {
1100 case WM_INITDIALOG:
1101 {
1102 startPage = 3;
1103 if (!bpropCentered)
1104 apxCenterWindow(GetParent(hDlg), NULL);
1105 bpropCentered = TRUE;
1106 if ((lpBuf = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
1107 _s_java, L"Jvm")) != NULL) {
1108 if (!lstrcmpiW(lpBuf, L"auto")) {
1109 CheckDlgButton(hDlg, IDC_PPJAUTO, BST_CHECKED);
1110 apxFree(lpBuf);
1111 lpBuf = apxGetJavaSoftRuntimeLib(hPool);
1112 EnableWindow(GetDlgItem(hDlg, IDC_PPJJVM), FALSE);
1113 EnableWindow(GetDlgItem(hDlg, IDC_PPJBJVM), FALSE);
1114 }
1115 if (lpBuf) {
1116 SetDlgItemTextW(hDlg, IDC_PPJJVM, lpBuf);
1117 apxFree(lpBuf);
1118 }
1119 }
1120 if ((lpBuf = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
1121 _s_java, L"Classpath")) != NULL) {
1122 SetDlgItemTextW(hDlg, IDC_PPJCLASSPATH, lpBuf);
1123 apxFree(lpBuf);
1124 }
1125 if ((lpBuf = apxRegistryGetMzStrW(hRegserv, APXREG_PARAMSOFTWARE,
1126 _s_java, L"Options", NULL, NULL)) != NULL) {
1127 LPWSTR p = apxMszToCRLFW(hPool, lpBuf);
1128 SetDlgItemTextW(hDlg, IDC_PPJOPTIONS, p);
1129 apxFree(lpBuf);
1130 apxFree(p);
1131 }
1132 if ((lpBuf = apxRegistryGetMzStrW(hRegserv, APXREG_PARAMSOFTWARE,
1133 _s_java, L"Options9", NULL, NULL)) != NULL) {
1134 LPWSTR p = apxMszToCRLFW(hPool, lpBuf);
1135 SetDlgItemTextW(hDlg, IDC_PPJOPTIONS9, p);
1136 apxFree(lpBuf);
1137 apxFree(p);
1138 }
1139 v = apxRegistryGetNumberW(hRegserv, APXREG_PARAMSOFTWARE,
1140 _s_java, L"JvmMs");
1141 if (v && v != 0xFFFFFFFF) {
1142 wsprintfA(bn, "%d", v);
1143 SetDlgItemTextA(hDlg, IDC_PPJMS, bn);
1144 }
1145 v = apxRegistryGetNumberW(hRegserv, APXREG_PARAMSOFTWARE,
1146 _s_java, L"JvmMx");
1147 if (v && v != 0xFFFFFFFF) {
1148 wsprintfA(bn, "%d", v);
1149 SetDlgItemTextA(hDlg, IDC_PPJMX, bn);
1150 }
1151 v = apxRegistryGetNumberW(hRegserv, APXREG_PARAMSOFTWARE,
1152 _s_java, L"JvmSs");
1153 if (v && v != 0xFFFFFFFF) {
1154 wsprintfA(bn, "%d", v);
1155 SetDlgItemTextA(hDlg, IDC_PPJSS, bn);
1156 }
1157
1158 }
1159 break;
1160 case WM_COMMAND:
1161 switch (LOWORD(wParam)) {
1162 case IDC_PPJBJVM:
1163 b = apxGetJavaSoftHome(hPool, TRUE);
1164 lpBuf = apxGetFileNameW(hDlg, apxLoadResourceW(IDS_PPJBJVM, 0),
1165 apxLoadResourceW(IDS_DLLFILES, 1), NULL,
1166 b,
1167 TRUE, NULL);
1168 apxFree(b);
1169 if (lpBuf) {
1170 SetDlgItemTextW(hDlg, IDC_PPJJVM, lpBuf);
1171 apxFree(lpBuf);
1172 PropSheet_Changed(GetParent(hDlg), hDlg);
1173 SET_BIT_FLAG(_propertyChanged, 4);
1174 }
1175 break;
1176 case IDC_PPJAUTO:
1177 PropSheet_Changed(GetParent(hDlg), hDlg);
1178 SET_BIT_FLAG(_propertyChanged, 4);
1179 if (IsDlgButtonChecked(hDlg, IDC_PPJAUTO)) {
1180 EnableWindow(GetDlgItem(hDlg, IDC_PPJJVM), FALSE);
1181 EnableWindow(GetDlgItem(hDlg, IDC_PPJBJVM), FALSE);
1182 lpBuf = apxGetJavaSoftRuntimeLib(hPool);
1183 if (lpBuf) {
1184 SetDlgItemTextW(hDlg, IDC_PPJJVM, lpBuf);
1185 apxFree(lpBuf);
1186 }
1187 }
1188 else {
1189 EnableWindow(GetDlgItem(hDlg, IDC_PPJJVM), TRUE);
1190 EnableWindow(GetDlgItem(hDlg, IDC_PPJBJVM), TRUE);
1191 }
1192 break;
1193 case IDC_PPJJVM:
1194 case IDC_PPJCLASSPATH:
1195 case IDC_PPJOPTIONS:
1196 case IDC_PPJOPTIONS9:
1197 case IDC_PPJMX:
1198 case IDC_PPJMS:
1199 case IDC_PPJSS:
1200 if (HIWORD(wParam) == EN_CHANGE) {
1201 PropSheet_Changed(GetParent(hDlg), hDlg);
1202 SET_BIT_FLAG(_propertyChanged, 4);
1203 }
1204 break;
1205 }
1206 break;
1207 case WM_NOTIFY:
1208 lpShn = (LPPSHNOTIFY )lParam;
1209 switch (lpShn->hdr.code) {
1210 case PSN_APPLY: /* sent when OK or Apply button pressed */
1211 if (__generalJvmSave(hDlg))
1212 PropSheet_UnChanged(GetParent(hDlg), hDlg);
1213 else {
1214 SET_BIT_FLAG(_propertyChanged, 4);
1215 SetWindowLong(hDlg, DWLP_MSGRESULT,
1216 PSNRET_INVALID_NOCHANGEPAGE);
1217 return TRUE;
1218 }
1219
1220 break;
1221 }
1222 break;
1223
1224 default:
1225 break;
1226 }
1227 return FALSE;
1228 }
1229
__startProperty(HWND hDlg,UINT uMessage,WPARAM wParam,LPARAM lParam)1230 INT_PTR CALLBACK __startProperty(HWND hDlg,
1231 UINT uMessage,
1232 WPARAM wParam,
1233 LPARAM lParam)
1234 {
1235 LPPSHNOTIFY lpShn;
1236 LPWSTR lpBuf, b;
1237
1238 switch (uMessage) {
1239 case WM_INITDIALOG:
1240 {
1241 startPage = 4;
1242 if (!bpropCentered)
1243 apxCenterWindow(GetParent(hDlg), NULL);
1244 bpropCentered = TRUE;
1245
1246 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPRMODE), L"exe");
1247 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPRMODE), L"jvm");
1248 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPRMODE), _s_java);
1249
1250 if ((lpBuf = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
1251 _s_start, L"Class")) != NULL) {
1252 SetDlgItemTextW(hDlg, IDC_PPRCLASS, lpBuf);
1253 apxFree(lpBuf);
1254 }
1255 if ((lpBuf = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
1256 _s_start, L"Image")) != NULL) {
1257 SetDlgItemTextW(hDlg, IDC_PPRIMAGE, lpBuf);
1258 apxFree(lpBuf);
1259 }
1260 if ((lpBuf = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
1261 _s_start, L"WorkingPath")) != NULL) {
1262 SetDlgItemTextW(hDlg, IDC_PPRWPATH, lpBuf);
1263 apxFree(lpBuf);
1264 }
1265 if ((lpBuf = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
1266 _s_start, L"Method")) != NULL) {
1267 SetDlgItemTextW(hDlg, IDC_PPRMETHOD, lpBuf);
1268 apxFree(lpBuf);
1269 }
1270 if ((lpBuf = apxRegistryGetMzStrW(hRegserv, APXREG_PARAMSOFTWARE,
1271 _s_start, L"Params", NULL, NULL)) != NULL) {
1272 b = apxMszToCRLFW(hPool, lpBuf);
1273 SetDlgItemTextW(hDlg, IDC_PPRARGS, b);
1274 apxFree(lpBuf);
1275 apxFree(b);
1276 }
1277 if ((lpBuf = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
1278 _s_start, L"Mode")) != NULL) {
1279 if (!lstrcmpiW(lpBuf, L"jvm")) {
1280 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPRMODE), 1);
1281 }
1282 else if (!lstrcmpiW(lpBuf, _s_java)) {
1283 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPRMODE), 2);
1284 EnableWindow(GetDlgItem(hDlg, IDC_PPRMETHOD), FALSE);
1285 }
1286 else {
1287 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPRMODE), 0);
1288 EnableWindow(GetDlgItem(hDlg, IDC_PPRCLASS), FALSE);
1289 EnableWindow(GetDlgItem(hDlg, IDC_PPRIMAGE), TRUE);
1290 EnableWindow(GetDlgItem(hDlg, IDC_PPRBIMAGE), TRUE);
1291 EnableWindow(GetDlgItem(hDlg, IDC_PPRMETHOD), FALSE);
1292 }
1293 apxFree(lpBuf);
1294 }
1295 }
1296 break;
1297 case WM_COMMAND:
1298 switch (LOWORD(wParam)) {
1299 case IDC_PPRBWPATH:
1300 lpBuf = apxBrowseForFolderW(hDlg, apxLoadResourceW(IDS_PPWPATH, 0));
1301 if (lpBuf) {
1302 SetDlgItemTextW(hDlg, IDC_PPRWPATH, lpBuf);
1303 apxFree(lpBuf);
1304 PropSheet_Changed(GetParent(hDlg), hDlg);
1305 SET_BIT_FLAG(_propertyChanged, 5);
1306 }
1307 break;
1308 case IDC_PPRBIMAGE:
1309 lpBuf = apxGetFileNameW(hDlg, apxLoadResourceW(IDS_PPIMAGE, 0),
1310 apxLoadResourceW(IDS_EXEFILES, 1), NULL,
1311 NULL, TRUE, NULL);
1312 if (lpBuf) {
1313 SetDlgItemTextW(hDlg, IDC_PPRIMAGE, lpBuf);
1314 apxFree(lpBuf);
1315 PropSheet_Changed(GetParent(hDlg), hDlg);
1316 SET_BIT_FLAG(_propertyChanged, 5);
1317 }
1318 break;
1319 case IDC_PPRCLASS:
1320 case IDC_PPRMETHOD:
1321 case IDC_PPRARGS:
1322 case IDC_PPRIMAGE:
1323 case IDC_PPRWPATH:
1324 if (HIWORD(wParam) == EN_CHANGE) {
1325 PropSheet_Changed(GetParent(hDlg), hDlg);
1326 SET_BIT_FLAG(_propertyChanged, 5);
1327 }
1328 break;
1329 case IDC_PPRMODE:
1330 if (HIWORD(wParam) == CBN_SELCHANGE) {
1331 int i;
1332 PropSheet_Changed(GetParent(hDlg), hDlg);
1333 SET_BIT_FLAG(_propertyChanged, 5);
1334 i = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_PPRMODE));
1335 if (i == 0) {
1336 EnableWindow(GetDlgItem(hDlg, IDC_PPRCLASS), FALSE);
1337 EnableWindow(GetDlgItem(hDlg, IDC_PPRIMAGE), TRUE);
1338 EnableWindow(GetDlgItem(hDlg, IDC_PPRBIMAGE), TRUE);
1339 EnableWindow(GetDlgItem(hDlg, IDC_PPRMETHOD), FALSE);
1340 }
1341 else if (i == 1) {
1342 EnableWindow(GetDlgItem(hDlg, IDC_PPRCLASS), TRUE);
1343 EnableWindow(GetDlgItem(hDlg, IDC_PPRIMAGE), FALSE);
1344 EnableWindow(GetDlgItem(hDlg, IDC_PPRBIMAGE), FALSE);
1345 EnableWindow(GetDlgItem(hDlg, IDC_PPRMETHOD), TRUE);
1346 } else {
1347 EnableWindow(GetDlgItem(hDlg, IDC_PPRCLASS), TRUE);
1348 EnableWindow(GetDlgItem(hDlg, IDC_PPRIMAGE), FALSE);
1349 EnableWindow(GetDlgItem(hDlg, IDC_PPRBIMAGE), FALSE);
1350 EnableWindow(GetDlgItem(hDlg, IDC_PPRMETHOD), FALSE);
1351 }
1352 }
1353 break;
1354
1355 }
1356 break;
1357 case WM_NOTIFY:
1358 lpShn = (LPPSHNOTIFY )lParam;
1359 switch (lpShn->hdr.code) {
1360 case PSN_APPLY: /* sent when OK or Apply button pressed */
1361 if (__generalStartSave(hDlg))
1362 PropSheet_UnChanged(GetParent(hDlg), hDlg);
1363 else {
1364 SET_BIT_FLAG(_propertyChanged, 5);
1365 SetWindowLong(hDlg, DWLP_MSGRESULT,
1366 PSNRET_INVALID_NOCHANGEPAGE);
1367 return TRUE;
1368 }
1369
1370 break;
1371 }
1372 break;
1373
1374 default:
1375 break;
1376 }
1377 return FALSE;
1378 }
1379
__stopProperty(HWND hDlg,UINT uMessage,WPARAM wParam,LPARAM lParam)1380 INT_PTR CALLBACK __stopProperty(HWND hDlg,
1381 UINT uMessage,
1382 WPARAM wParam,
1383 LPARAM lParam)
1384 {
1385 LPPSHNOTIFY lpShn;
1386 LPWSTR lpBuf, b;
1387 DWORD v;
1388
1389 switch (uMessage) {
1390 case WM_INITDIALOG:
1391 {
1392 startPage = 5;
1393 if (!bpropCentered)
1394 apxCenterWindow(GetParent(hDlg), NULL);
1395 bpropCentered = TRUE;
1396
1397 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSMODE), L"exe");
1398 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSMODE), L"jvm");
1399 ComboBox_AddStringW(GetDlgItem(hDlg, IDC_PPSMODE), _s_java);
1400
1401 if ((lpBuf = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
1402 _s_stop, L"Class")) != NULL) {
1403 SetDlgItemTextW(hDlg, IDC_PPSCLASS, lpBuf);
1404 apxFree(lpBuf);
1405 }
1406 if ((lpBuf = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
1407 _s_stop, L"Image")) != NULL) {
1408 SetDlgItemTextW(hDlg, IDC_PPSIMAGE, lpBuf);
1409 apxFree(lpBuf);
1410 }
1411 if ((lpBuf = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
1412 _s_stop, L"WorkingPath")) != NULL) {
1413 SetDlgItemTextW(hDlg, IDC_PPSWPATH, lpBuf);
1414 apxFree(lpBuf);
1415 }
1416 if ((lpBuf = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
1417 _s_stop, L"Method")) != NULL) {
1418 SetDlgItemTextW(hDlg, IDC_PPSMETHOD, lpBuf);
1419 apxFree(lpBuf);
1420 }
1421 if ((lpBuf = apxRegistryGetMzStrW(hRegserv, APXREG_PARAMSOFTWARE,
1422 _s_stop, L"Params", NULL, NULL)) != NULL) {
1423 b = apxMszToCRLFW(hPool, lpBuf);
1424 SetDlgItemTextW(hDlg, IDC_PPSARGS, b);
1425 apxFree(lpBuf);
1426 apxFree(b);
1427 }
1428 v = apxRegistryGetNumberW(hRegserv, APXREG_PARAMSOFTWARE,
1429 _s_stop, L"Timeout");
1430 {
1431 CHAR bn[32];
1432 wsprintfA(bn, "%d", v);
1433 SetDlgItemTextA(hDlg, IDC_PPSTIMEOUT, bn);
1434 }
1435 if ((lpBuf = apxRegistryGetStringW(hRegserv, APXREG_PARAMSOFTWARE,
1436 _s_stop, L"Mode")) != NULL) {
1437 if (!lstrcmpiW(lpBuf, L"jvm")) {
1438 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPSMODE), 1);
1439
1440 }
1441 else if (!lstrcmpiW(lpBuf, _s_java)) {
1442 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPSMODE), 2);
1443 EnableWindow(GetDlgItem(hDlg, IDC_PPSMETHOD), FALSE);
1444 }
1445 else {
1446 ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PPSMODE), 0);
1447 EnableWindow(GetDlgItem(hDlg, IDC_PPSCLASS), FALSE);
1448 EnableWindow(GetDlgItem(hDlg, IDC_PPSIMAGE), TRUE);
1449 EnableWindow(GetDlgItem(hDlg, IDC_PPSBIMAGE), TRUE);
1450 EnableWindow(GetDlgItem(hDlg, IDC_PPSMETHOD), FALSE);
1451 }
1452 apxFree(lpBuf);
1453 }
1454 }
1455 break;
1456 case WM_COMMAND:
1457 switch (LOWORD(wParam)) {
1458 case IDC_PPSBWPATH:
1459 lpBuf = apxBrowseForFolderW(hDlg, apxLoadResourceW(IDS_PPWPATH, 0));
1460 if (lpBuf) {
1461 SetDlgItemTextW(hDlg, IDC_PPSWPATH, lpBuf);
1462 apxFree(lpBuf);
1463 PropSheet_Changed(GetParent(hDlg), hDlg);
1464 SET_BIT_FLAG(_propertyChanged, 6);
1465 }
1466 break;
1467 case IDC_PPSBIMAGE:
1468 lpBuf = apxGetFileNameW(hDlg, apxLoadResourceW(IDS_PPIMAGE, 0),
1469 apxLoadResourceW(IDS_EXEFILES, 1), NULL,
1470 NULL, TRUE, NULL);
1471 if (lpBuf) {
1472 SetDlgItemTextW(hDlg, IDC_PPSIMAGE, lpBuf);
1473 apxFree(lpBuf);
1474 PropSheet_Changed(GetParent(hDlg), hDlg);
1475 SET_BIT_FLAG(_propertyChanged, 6);
1476 }
1477 break;
1478 case IDC_PPSCLASS:
1479 case IDC_PPSMETHOD:
1480 case IDC_PPSTIMEOUT:
1481 case IDC_PPSARGS:
1482 case IDC_PPSIMAGE:
1483 case IDC_PPSWPATH:
1484 if (HIWORD(wParam) == EN_CHANGE) {
1485 PropSheet_Changed(GetParent(hDlg), hDlg);
1486 SET_BIT_FLAG(_propertyChanged, 6);
1487 }
1488 break;
1489 case IDC_PPSMODE:
1490 if (HIWORD(wParam) == CBN_SELCHANGE) {
1491 int i;
1492 PropSheet_Changed(GetParent(hDlg), hDlg);
1493 SET_BIT_FLAG(_propertyChanged, 6);
1494 i = ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_PPSMODE));
1495 if (i == 0) {
1496 EnableWindow(GetDlgItem(hDlg, IDC_PPSCLASS), FALSE);
1497 EnableWindow(GetDlgItem(hDlg, IDC_PPSIMAGE), TRUE);
1498 EnableWindow(GetDlgItem(hDlg, IDC_PPSBIMAGE), TRUE);
1499 EnableWindow(GetDlgItem(hDlg, IDC_PPSMETHOD), FALSE);
1500 }
1501 else if (i == 1) {
1502 EnableWindow(GetDlgItem(hDlg, IDC_PPSCLASS), TRUE);
1503 EnableWindow(GetDlgItem(hDlg, IDC_PPSIMAGE), FALSE);
1504 EnableWindow(GetDlgItem(hDlg, IDC_PPSBIMAGE), FALSE);
1505 EnableWindow(GetDlgItem(hDlg, IDC_PPSMETHOD), TRUE);
1506 } else {
1507 EnableWindow(GetDlgItem(hDlg, IDC_PPSCLASS), TRUE);
1508 EnableWindow(GetDlgItem(hDlg, IDC_PPSIMAGE), FALSE);
1509 EnableWindow(GetDlgItem(hDlg, IDC_PPSBIMAGE), FALSE);
1510 EnableWindow(GetDlgItem(hDlg, IDC_PPSMETHOD), FALSE);
1511 }
1512
1513 }
1514 break;
1515
1516 }
1517 break;
1518 case WM_NOTIFY:
1519 lpShn = (LPPSHNOTIFY )lParam;
1520 switch (lpShn->hdr.code) {
1521 case PSN_APPLY: /* sent when OK or Apply button pressed */
1522 if (__generalStopSave(hDlg))
1523 PropSheet_UnChanged(GetParent(hDlg), hDlg);
1524 else {
1525 SET_BIT_FLAG(_propertyChanged, 6);
1526 SetWindowLong(hDlg, DWLP_MSGRESULT,
1527 PSNRET_INVALID_NOCHANGEPAGE);
1528 return TRUE;
1529 }
1530
1531 break;
1532 }
1533 break;
1534
1535 default:
1536 break;
1537 }
1538 return FALSE;
1539 }
1540
__initPpage(PROPSHEETPAGEW * lpPage,INT iDlg,INT iTitle,DLGPROC pfnDlgProc)1541 void __initPpage(PROPSHEETPAGEW *lpPage, INT iDlg, INT iTitle, DLGPROC pfnDlgProc)
1542 {
1543 lpPage->dwSize = sizeof(PROPSHEETPAGE);
1544 lpPage->dwFlags = PSP_USETITLE;
1545 lpPage->hInstance = _gui_store->hInstance;
1546 lpPage->pszTemplate = MAKEINTRESOURCEW(iDlg);
1547 lpPage->pszIcon = NULL;
1548 lpPage->pfnDlgProc = pfnDlgProc;
1549 lpPage->pszTitle = MAKEINTRESOURCEW(iTitle);
1550 lpPage->lParam = 0;
1551 }
1552
ShowServiceProperties(HWND hWnd)1553 void ShowServiceProperties(HWND hWnd)
1554 {
1555 PROPSHEETPAGEW psP[6];
1556 PROPSHEETHEADERW psH;
1557 WCHAR szT[SIZ_DESLEN] = {0};
1558
1559 if (_propertyOpened) {
1560 SetForegroundWindow(_gui_store->hMainWnd);
1561 return;
1562 }
1563 __initPpage(&psP[0], IDD_PROPPAGE_SGENERAL, IDS_PPGENERAL,
1564 __generalProperty);
1565 __initPpage(&psP[1], IDD_PROPPAGE_LOGON, IDS_PPLOGON,
1566 __logonProperty);
1567 __initPpage(&psP[2], IDD_PROPPAGE_LOGGING, IDS_PPLOGGING,
1568 __loggingProperty);
1569 __initPpage(&psP[3], IDD_PROPPAGE_JVM, IDS_PPJAVAVM,
1570 __jvmProperty);
1571 __initPpage(&psP[4], IDD_PROPPAGE_START, IDS_PPSTART,
1572 __startProperty);
1573 __initPpage(&psP[5], IDD_PROPPAGE_STOP, IDS_PPSTOP,
1574 __stopProperty);
1575
1576 if (_currentEntry && _currentEntry->lpConfig)
1577 lstrlcpyW(szT, SIZ_DESMAX, _currentEntry->lpConfig->lpDisplayName);
1578 else
1579 return;
1580 lstrlcatW(szT, SIZ_DESMAX, L" Properties");
1581
1582 psH.dwSize = sizeof(PROPSHEETHEADER);
1583 psH.dwFlags = PSH_PROPSHEETPAGE | PSH_USEICONID | PSH_USECALLBACK | PSH_NOCONTEXTHELP;
1584 psH.hwndParent = bEnableTry ? hWnd : NULL;
1585 psH.hInstance = _gui_store->hInstance;
1586 psH.pszIcon = MAKEINTRESOURCEW(IDI_MAINICON);
1587 psH.pszCaption = szT;
1588 psH.nPages = 6;
1589 psH.ppsp = (LPCPROPSHEETPAGEW) &psP;
1590 psH.pfnCallback = (PFNPROPSHEETCALLBACK)__propertyCallback;
1591 psH.nStartPage = startPage;
1592
1593 PropertySheetW(&psH);
1594 _propertyOpened = FALSE;
1595 _generalPropertyHwnd = NULL;
1596 if (!bEnableTry)
1597 PostQuitMessage(0);
1598 bpropCentered = FALSE;
1599
1600 }
1601
signalService(LPCWSTR szServiceName)1602 static void signalService(LPCWSTR szServiceName)
1603 {
1604 HANDLE event;
1605 WCHAR en[SIZ_DESLEN];
1606 int i;
1607
1608 lstrlcpyW(en, SIZ_DESLEN, L"Global\\");
1609 lstrlcatW(en, SIZ_DESLEN, szServiceName);
1610 lstrlcatW(en, SIZ_DESLEN, L"SIGNAL");
1611 for (i = 7; i < lstrlenW(en); i++) {
1612 if (en[i] == L' ')
1613 en[i] = L'_';
1614 else
1615 en[i] = towupper(en[i]);
1616 }
1617
1618
1619 event = OpenEventW(EVENT_MODIFY_STATE, FALSE, en);
1620 if (event) {
1621 SetEvent(event);
1622 CloseHandle(event);
1623 }
1624 else
1625 apxDisplayError(TRUE, NULL, 0, "Unable to open the Event Mutex");
1626
1627 }
1628
MainWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)1629 LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg,
1630 WPARAM wParam, LPARAM lParam)
1631 {
1632 switch (uMsg) {
1633 case WM_CREATE:
1634 if (bEnableTry) {
1635 if (_currentEntry && _currentEntry->lpConfig) {
1636 BOOL isRunning = _currentEntry->stServiceStatus.dwCurrentState == SERVICE_RUNNING;
1637 apxManageTryIconW(hWnd, NIM_ADD, NULL,
1638 _currentEntry->lpConfig->lpDisplayName,
1639 isRunning ? hIcoRun : hIcoStop);
1640 }
1641 else {
1642 apxManageTryIconW(hWnd, NIM_ADD, NULL,
1643 apxLoadResourceW(IDS_APPLICATION, 0),
1644 NULL);
1645 }
1646 }
1647 else
1648 ShowServiceProperties(hWnd);
1649
1650 break;
1651 case WM_COMMAND:
1652 switch (LOWORD(wParam)) {
1653 case IDM_TM_CONFIG:
1654 ShowServiceProperties(hWnd);
1655 break;
1656 case IDM_TM_ABOUT:
1657 apxAboutBox(hWnd);
1658 break;
1659 case IDM_TM_EXIT:
1660 SendMessage(hWnd, WM_CLOSE, 0, 0);
1661 break;
1662 case IDM_TM_START:
1663 if (!_propertyOpened)
1664 apxProgressBox(hWnd, apxLoadResourceW(IDS_HSSTART, 0),
1665 _currentEntry->lpConfig->lpDisplayName,
1666 __startServiceCallback, NULL);
1667 break;
1668 case IDM_TM_STOP:
1669 if (!_propertyOpened)
1670 apxProgressBox(hWnd, apxLoadResourceW(IDS_HSSTOP, 0),
1671 _currentEntry->lpConfig->lpDisplayName,
1672 __stopServiceCallback, NULL);
1673 break;
1674 case IDM_TM_PAUSE:
1675 if (!_propertyOpened)
1676 apxProgressBox(hWnd, apxLoadResourceW(IDS_HSPAUSE, 0),
1677 _currentEntry->lpConfig->lpDisplayName,
1678 __pauseServiceCallback, NULL);
1679 break;
1680 case IDM_TM_RESTART:
1681 if (!_propertyOpened)
1682 apxProgressBox(hWnd, apxLoadResourceW(IDS_HSRESTART, 0),
1683 _currentEntry->lpConfig->lpDisplayName,
1684 __restartServiceCallback, NULL);
1685 break;
1686 case IDM_TM_DUMP:
1687 signalService(_currentEntry->szServiceName);
1688 break;
1689 case IDMS_REFRESH:
1690 if (bEnableTry &&
1691 (_currentEntry = apxServiceEntry(hService, TRUE)) != NULL) {
1692 BOOL isRunning = _currentEntry->stServiceStatus.dwCurrentState == SERVICE_RUNNING;
1693 apxManageTryIconW(hWnd, NIM_MODIFY, NULL,
1694 _currentEntry->lpConfig->lpDisplayName,
1695 isRunning ? hIcoRun : hIcoStop);
1696 }
1697 break;
1698
1699 }
1700 break;
1701 case WM_TRAYMESSAGE:
1702 switch (lParam) {
1703 case WM_LBUTTONDBLCLK:
1704 ShowServiceProperties(hWnd);
1705 break;
1706 case WM_RBUTTONUP:
1707 _currentEntry = apxServiceEntry(hService, TRUE);
1708 createRbuttonTryMenu(hWnd);
1709 break;
1710 }
1711 break;
1712 case WM_QUIT:
1713 return DefWindowProc(hWnd, uMsg, wParam, lParam);
1714 break;
1715 case WM_DESTROY:
1716 if (bEnableTry)
1717 apxManageTryIconA(hWnd, NIM_DELETE, NULL, NULL, NULL);
1718 /* Setting this to false ensures that the process closes down
1719 * cleanly when the configuration window is open and the process
1720 * is closed via MQ,
1721 */
1722 bEnableTry = FALSE;
1723 PostQuitMessage(0);
1724 break;
1725 default:
1726 return DefWindowProc(hWnd, uMsg, wParam, lParam);
1727 break;
1728 }
1729
1730 return FALSE;
1731 }
1732
loadConfiguration()1733 static BOOL loadConfiguration()
1734 {
1735 return TRUE;
1736 }
1737
saveConfiguration()1738 static BOOL saveConfiguration()
1739 {
1740 return TRUE;
1741 }
1742
1743 static BOOL isManagerRunning = FALSE;
refreshThread(LPVOID lpParam)1744 static DWORD WINAPI refreshThread(LPVOID lpParam)
1745 {
1746 while (isManagerRunning) {
1747 /* Refresh property window */
1748 DWORD os = 0;
1749 if (_currentEntry)
1750 os = _currentEntry->stServiceStatus.dwCurrentState;
1751 _currentEntry = apxServiceEntry(hService, TRUE);
1752 if (_currentEntry && _currentEntry->stServiceStatus.dwCurrentState != os) {
1753 if (_gui_store->hMainWnd)
1754 PostMessage(_gui_store->hMainWnd, WM_COMMAND,
1755 MAKEWPARAM(IDMS_REFRESH, 0), 0);
1756 if (_generalPropertyHwnd)
1757 __generalPropertyRefresh(_generalPropertyHwnd);
1758 }
1759 Sleep(1000);
1760 }
1761 return 0;
1762 UNREFERENCED_PARAMETER(lpParam);
1763 }
1764
1765 /* Main program entry
1766 * Since we are independent from CRT
1767 * the arguments are not used
1768 */
1769 #ifdef _NO_CRTLIBRARY
xMain(void)1770 int xMain(void)
1771 #else
1772 int WINAPI WinMain(HINSTANCE hInstance,
1773 HINSTANCE hPrevInstance,
1774 LPSTR lpCmdLine,
1775 int nCmdShow)
1776 #endif
1777 {
1778 MSG msg;
1779 LPAPXCMDLINE lpCmdline;
1780 HANDLE mutex = NULL;
1781 BOOL quiet = FALSE;
1782
1783 apxHandleManagerInitialize();
1784 hPool = apxPoolCreate(NULL, 0);
1785
1786 /* Parse the command line */
1787 if ((lpCmdline = apxCmdlineParse(hPool, _options, _commands, _altcmds)) == NULL) {
1788 /* TODO: dispalay error message */
1789 apxDisplayError(TRUE, NULL, 0, "Error parsing command line");
1790 goto cleanup;
1791 }
1792
1793 if (!lpCmdline->dwCmdIndex) {
1794 /* Skip sytem error message */
1795 SetLastError(ERROR_SUCCESS);
1796 apxDisplayError(TRUE, NULL, 0,
1797 apxLoadResourceA(IDS_ERRORCMD, 0),
1798 lpCmdLine);
1799 goto cleanup;
1800 }
1801 else if (lpCmdline->dwCmdIndex == 4)
1802 quiet = TRUE;
1803 else if (lpCmdline->dwCmdIndex >= 2)
1804 bEnableTry = TRUE;
1805 hService = apxCreateService(hPool, SC_MANAGER_CONNECT, FALSE);
1806 if (IS_INVALID_HANDLE(hService)) {
1807 if (!quiet)
1808 apxDisplayError(TRUE, NULL, 0, "Unable to open the Service Manager");
1809 goto cleanup;
1810 }
1811 /* Open the main service handle */
1812 if (!apxServiceOpen(hService, lpCmdline->szApplication,
1813 SERVICE_ALL_ACCESS)) {
1814 LPWSTR w = lpCmdline->szApplication + lstrlenW(lpCmdline->szApplication) - 1;
1815 if (*w == L'w')
1816 *w = L'\0';
1817 if (!apxServiceOpen(hService, lpCmdline->szApplication,
1818 SERVICE_ALL_ACCESS)) {
1819 if (!apxServiceOpen(hService, lpCmdline->szApplication,
1820 GENERIC_READ | GENERIC_EXECUTE)) {
1821 if (!quiet)
1822 apxDisplayError(TRUE, NULL, 0, "Unable to open the service '%S'",
1823 lpCmdline->szApplication);
1824 goto cleanup;
1825 }
1826 }
1827 }
1828 /* Obtain service parameters and status */
1829 if (!(_currentEntry = apxServiceEntry(hService, TRUE))) {
1830 if (!quiet)
1831 apxDisplayError(TRUE, NULL, 0, "Unable to query the service '%S' status",
1832 lpCmdline->szApplication);
1833 goto cleanup;
1834 }
1835 _gui_store = apxGuiInitialize(MainWndProc, lpCmdline->szApplication);
1836 if (!_gui_store) {
1837 if (!quiet)
1838 apxDisplayError(TRUE, NULL, 0, "Unable to initialize GUI manager");
1839 goto cleanup;
1840 }
1841 hIcoRun = LoadImage(_gui_store->hInstance, MAKEINTRESOURCE(IDI_ICONRUN),
1842 IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
1843 hIcoStop = LoadImage(_gui_store->hInstance, MAKEINTRESOURCE(IDI_ICONSTOP),
1844 IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
1845
1846 /* Handle //MQ// option */
1847 if (lpCmdline->dwCmdIndex == 4) {
1848 HANDLE hOther = FindWindow(_gui_store->szWndClass, NULL);
1849 if (hOther)
1850 SendNotifyMessage(hOther, WM_CLOSE, 0, 0);
1851 goto cleanup;
1852 }
1853
1854 if (!_options[0].dwValue) {
1855 mutex = CreateMutex(NULL, FALSE, _gui_store->szWndMutex);
1856 if ((mutex == NULL) || (GetLastError() == ERROR_ALREADY_EXISTS)) {
1857 HANDLE hOther = FindWindow(_gui_store->szWndClass, NULL);
1858 if (hOther) {
1859 SetForegroundWindow(hOther);
1860 SendNotifyMessage(hOther, WM_COMMAND, MAKEWPARAM(IDM_TM_CONFIG, 0), 0);
1861 }
1862 else {
1863 /* Skip sytem error message */
1864 SetLastError(ERROR_SUCCESS);
1865 if (!quiet)
1866 apxDisplayError(TRUE, NULL, 0, apxLoadResourceA(IDS_ALREAY_RUNING, 0),
1867 lpCmdline->szApplication);
1868 }
1869 goto cleanup;
1870 }
1871 }
1872 hRegistry = apxCreateRegistryW(hPool, KEY_ALL_ACCESS, NULL,
1873 apxLoadResourceW(IDS_APPLICATION, 0),
1874 APXREG_USER);
1875 loadConfiguration();
1876 hRegserv = apxCreateRegistryW(hPool, KEY_READ | KEY_WRITE | KREG_WOW6432,
1877 PRG_REGROOT,
1878 lpCmdline->szApplication,
1879 APXREG_SOFTWARE | APXREG_SERVICE);
1880
1881 if (IS_INVALID_HANDLE(hRegserv)) {
1882 if (!quiet)
1883 apxDisplayError(TRUE, NULL, 0, apxLoadResourceA(IDS_ERRSREG, 0));
1884 return FALSE;
1885 }
1886 isManagerRunning = TRUE;
1887 CreateThread(NULL, 0, refreshThread, NULL, 0, NULL);
1888 /* Create main invisible window */
1889 _gui_store->hMainWnd = CreateWindow(_gui_store->szWndClass,
1890 apxLoadResourceW(IDS_APPLICATION, 0),
1891 0, 0, 0, 0, 0,
1892 NULL, NULL,
1893 _gui_store->hInstance,
1894 NULL);
1895
1896 if (!_gui_store->hMainWnd) {
1897 goto cleanup;
1898 }
1899 if (lpCmdline->dwCmdIndex == 3)
1900 PostMessage(_gui_store->hMainWnd, WM_COMMAND, IDM_TM_START, 0);
1901 while (GetMessage(&msg, NULL, 0, 0)) {
1902 if(!TranslateAccelerator(_gui_store->hMainWnd,
1903 _gui_store->hAccel, &msg)) {
1904 TranslateMessage(&msg);
1905 DispatchMessage(&msg);
1906 }
1907 }
1908 isManagerRunning = FALSE;
1909 saveConfiguration();
1910
1911 cleanup:
1912 if (hIcoStop)
1913 DestroyIcon(hIcoStop);
1914 if (hIcoRun)
1915 DestroyIcon(hIcoRun);
1916 if (mutex)
1917 CloseHandle(mutex);
1918 if (lpCmdline)
1919 apxCmdlineFree(lpCmdline);
1920 apxCloseHandle(hService);
1921 apxHandleManagerDestroy();
1922 ExitProcess(0);
1923 return 0;
1924 UNREFERENCED_PARAMETER(hInstance);
1925 UNREFERENCED_PARAMETER(hPrevInstance);
1926 UNREFERENCED_PARAMETER(nCmdShow);
1927 }
1928
1929 // TODO: Figure out a way to move apxSetInprocEnvironment from here and
1930 // prunsrv.c to utils.c
apxSetInprocEnvironment()1931 void apxSetInprocEnvironment()
1932 {
1933 // NO-OP.
1934 }
1935