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