1 /* Copyright 2001-2004 The Apache Software Foundation
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 /* ====================================================================
17 * ApacheMonitor.c Simple program to manage and monitor Apache services.
19 * Contributed by Mladen Turk <mturk mappingsoft.com>
22 * ====================================================================
25 #define _WIN32_WINNT 0x0400
40 #include "ApacheMonitor.h"
43 #define OS_VERSION_WIN9X 1
44 #define OS_VERSION_WINNT 2
45 #define OS_VERSION_WIN2K 3
46 /* Should be enough */
47 #define MAX_APACHE_SERVICES 128
48 #define MAX_APACHE_COMPUTERS 32
50 #define WM_TRAYMESSAGE (WM_APP+1)
51 #define WM_UPDATEMESSAGE (WM_USER+1)
52 #define WM_MANAGEMESSAGE (WM_USER+2)
53 #define WM_TIMER_REFRESH 10
54 #define WM_TIMER_RESCAN 11
55 #define SERVICE_APACHE_RESTART 128
58 #define MAX_LOADSTRING 100
59 #define REFRESH_TIME 2000 /* service refresh time (ms) */
60 #define RESCAN_TIME 20000 /* registry rescan time (ms) */
62 typedef struct _st_APACHE_SERVICE
72 typedef struct _st_MONITORED_COMPUTERS
78 /* Global variables */
79 HINSTANCE g_hInstance = NULL;
80 CHAR *g_szTitle; /* The title bar text */
81 CHAR *g_szWindowClass; /* Window Class Name */
84 UINT g_bUiTaskbarCreated;
86 BOOL g_bDlgServiceOn = FALSE;
87 BOOL g_bConsoleRun = FALSE;
88 ST_APACHE_SERVICE g_stServices[MAX_APACHE_SERVICES];
89 ST_MONITORED_COMP g_stComputers[MAX_APACHE_COMPUTERS];
91 HBITMAP g_hBmpStart, g_hBmpStop;
92 HBITMAP g_hBmpPicture, g_hBmpOld;
93 BOOL g_bRescanServices;
94 HWND g_hwndServiceDlg;
96 HWND g_hwndStdoutList;
97 HWND g_hwndConnectDlg;
98 HCURSOR g_hCursorHourglass;
99 HCURSOR g_hCursorArrow;
101 HANDLE g_hpipeOutRead;
102 HANDLE g_hpipeOutWrite;
103 HANDLE g_hpipeInRead;
104 HANDLE g_hpipeInWrite;
105 HANDLE g_hpipeStdError;
107 PROCESS_INFORMATION g_lpRedirectProc;
108 CRITICAL_SECTION g_stcSection;
111 /* locale language support */
112 static CHAR *g_lpMsg[IDS_MSG_LAST - IDS_MSG_FIRST + 1];
115 void am_ClearServicesSt()
118 for (i = 0; i < MAX_APACHE_SERVICES; i++)
120 if (g_stServices[i].szServiceName) {
121 free(g_stServices[i].szServiceName);
123 if (g_stServices[i].szDisplayName) {
124 free(g_stServices[i].szDisplayName);
126 if (g_stServices[i].szDescription) {
127 free(g_stServices[i].szDescription);
129 if (g_stServices[i].szImagePath) {
130 free(g_stServices[i].szImagePath);
132 if (g_stServices[i].szComputerName) {
133 free(g_stServices[i].szComputerName);
137 memset(g_stServices, 0, sizeof(ST_APACHE_SERVICE) * MAX_APACHE_SERVICES);
142 void am_ClearComputersSt()
145 for (i = 0; i < MAX_APACHE_COMPUTERS; i++) {
146 if (g_stComputers[i].szComputerName) {
147 free(g_stComputers[i].szComputerName);
148 RegCloseKey(g_stComputers[i].hRegistry);
151 memset(g_stComputers, 0, sizeof(ST_MONITORED_COMP) * MAX_APACHE_COMPUTERS);
156 BOOL am_IsComputerConnected(LPSTR szComputerName)
159 while (g_stComputers[i].szComputerName != NULL) {
160 if (strcmp(g_stComputers[i].szComputerName, szComputerName) == 0) {
169 void am_DisconnectComputer(LPSTR szComputerName)
172 while (g_stComputers[i].szComputerName != NULL) {
173 if (strcmp(g_stComputers[i].szComputerName, szComputerName) == 0) {
178 if (g_stComputers[i].szComputerName != NULL) {
179 free(g_stComputers[i].szComputerName);
180 RegCloseKey(g_stComputers[i].hRegistry);
181 for (j = i; j < MAX_APACHE_COMPUTERS - 1; j++) {
182 g_stComputers[i].szComputerName= g_stComputers[i+1].szComputerName;
183 g_stComputers[i].hRegistry = g_stComputers[i+1].hRegistry;
185 for (i = j; i < MAX_APACHE_COMPUTERS; i++) {
186 g_stComputers[i].szComputerName = NULL;
187 g_stComputers[i].hRegistry = NULL;
194 void ErrorMessage(LPCSTR szError, BOOL bFatal)
196 LPVOID lpMsgBuf = NULL;
198 MessageBox(NULL, szError, g_lpMsg[IDS_MSG_ERROR - IDS_MSG_FIRST],
199 MB_OK | (bFatal ? MB_ICONERROR : MB_ICONEXCLAMATION));
202 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
203 FORMAT_MESSAGE_FROM_SYSTEM |
204 FORMAT_MESSAGE_IGNORE_INSERTS,
205 NULL, GetLastError(), g_LangID,
206 (LPSTR) &lpMsgBuf, 0, NULL);
207 MessageBox(NULL, (LPCSTR)lpMsgBuf,
208 g_lpMsg[IDS_MSG_ERROR - IDS_MSG_FIRST],
209 MB_OK | (bFatal ? MB_ICONERROR : MB_ICONEXCLAMATION));
218 BOOL am_ConnectComputer(LPSTR szComputerName)
222 char szTmp[MAX_PATH];
224 while (g_stComputers[i].szComputerName != NULL) {
225 if (strcmp(g_stComputers[i].szComputerName, szComputerName) == 0) {
230 if (i > MAX_APACHE_COMPUTERS - 1) {
233 if (RegConnectRegistry(szComputerName, HKEY_LOCAL_MACHINE, &hKeyRemote)
235 sprintf(szTmp, g_lpMsg[IDS_MSG_ECONNECT - IDS_MSG_FIRST],
237 ErrorMessage(szTmp, FALSE);
241 g_stComputers[i].szComputerName = strdup(szComputerName);
242 g_stComputers[i].hRegistry = hKeyRemote;
248 LPSTR GetStringRes(int id)
250 static CHAR buffer[MAX_PATH];
253 LoadString(GetModuleHandle(NULL), id, buffer, MAX_PATH);
258 BOOL GetSystemOSVersion(LPDWORD dwVersion)
262 Try calling GetVersionEx using the OSVERSIONINFOEX structure.
263 If that fails, try using the OSVERSIONINFO structure.
265 memset(&osvi, 0, sizeof(OSVERSIONINFO));
266 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
268 if (!GetVersionEx(&osvi)) {
272 switch (osvi.dwPlatformId)
274 case VER_PLATFORM_WIN32_NT:
275 if (osvi.dwMajorVersion <= 4) {
276 *dwVersion = OS_VERSION_WINNT;
278 else if (osvi.dwMajorVersion == 5) {
279 *dwVersion = OS_VERSION_WIN2K;
286 case VER_PLATFORM_WIN32_WINDOWS:
287 *dwVersion = OS_VERSION_WIN9X;
290 case VER_PLATFORM_WIN32s:
299 static VOID ShowNotifyIcon(HWND hWnd, DWORD dwMessage)
304 memset(&nid, 0, sizeof(nid));
305 nid.cbSize = sizeof(NOTIFYICONDATA);
308 nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
309 nid.uCallbackMessage = WM_TRAYMESSAGE;
311 while (g_stServices[i].szServiceName != NULL)
313 if (g_stServices[i].dwPid != 0) {
318 if (dwMessage != NIM_DELETE)
321 nid.hIcon = g_icoRun;
324 nid.hIcon = g_icoStop;
330 if (n == i && n > 0) {
331 lstrcpy(nid.szTip, g_lpMsg[IDS_MSG_RUNNINGALL - IDS_MSG_FIRST]);
334 sprintf(nid.szTip, g_lpMsg[IDS_MSG_RUNNING - IDS_MSG_FIRST], n, i);
337 sprintf(nid.szTip, g_lpMsg[IDS_MSG_RUNNINGNONE - IDS_MSG_FIRST], i);
340 lstrcpy(nid.szTip, g_lpMsg[IDS_MSG_NOSERVICES - IDS_MSG_FIRST]);
342 Shell_NotifyIcon(dwMessage, &nid);
346 void appendMenuItem(HMENU hMenu, UINT uMenuId, LPSTR szName,
347 BOOL fDefault, BOOL fEnabled)
351 memset(&mii, 0, sizeof(MENUITEMINFO));
352 mii.cbSize = sizeof(MENUITEMINFO);
353 mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
356 mii.fType = MFT_STRING;
359 mii.fState = MFS_DEFAULT;
362 mii.fState |= MFS_DISABLED;
364 mii.dwTypeData = szName;
367 mii.fType = MFT_SEPARATOR;
369 InsertMenuItem(hMenu, uMenuId, FALSE, &mii);
373 void appendServiceMenu(HMENU hMenu, UINT uMenuId,
374 LPSTR szServiceName, BOOL fRunning)
379 smh = CreatePopupMenu();
381 appendMenuItem(smh, IDM_SM_START + uMenuId,
382 g_lpMsg[IDS_MSG_SSTART - IDS_MSG_FIRST], FALSE, !fRunning);
383 appendMenuItem(smh, IDM_SM_STOP + uMenuId,
384 g_lpMsg[IDS_MSG_SSTOP - IDS_MSG_FIRST], FALSE, fRunning);
385 appendMenuItem(smh, IDM_SM_RESTART + uMenuId,
386 g_lpMsg[IDS_MSG_SRESTART - IDS_MSG_FIRST], FALSE, fRunning);
388 memset(&mii, 0, sizeof(MENUITEMINFO));
389 mii.cbSize = sizeof(MENUITEMINFO);
390 mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU
392 mii.fType = MFT_STRING;
394 mii.hbmpChecked = g_hBmpStart;
395 mii.hbmpUnchecked = g_hBmpStop;
396 mii.dwTypeData = szServiceName;
398 mii.fState = fRunning ? MFS_CHECKED : MFS_UNCHECKED;
399 InsertMenuItem(hMenu, IDM_SM_SERVICE + uMenuId, FALSE, &mii);
403 void ShowTryPopupMenu(HWND hWnd)
405 /* create popup menu */
406 HMENU hMenu = CreatePopupMenu();
411 appendMenuItem(hMenu, IDM_RESTORE,
412 g_lpMsg[IDS_MSG_MNUSHOW - IDS_MSG_FIRST],
414 if (g_dwOSVersion >= OS_VERSION_WINNT) {
415 appendMenuItem(hMenu, IDC_SMANAGER,
416 g_lpMsg[IDS_MSG_MNUSERVICES - IDS_MSG_FIRST],
419 appendMenuItem(hMenu, 0, "", FALSE, TRUE);
420 appendMenuItem(hMenu, IDM_EXIT,
421 g_lpMsg[IDS_MSG_MNUEXIT - IDS_MSG_FIRST],
424 if (!SetForegroundWindow(hWnd)) {
425 SetForegroundWindow(NULL);
428 TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON,
429 pt.x, pt.y, 0, hWnd, NULL);
435 void ShowTryServicesMenu(HWND hWnd)
437 /* create services list popup menu and submenus */
438 HMENU hMenu = CreatePopupMenu();
444 while (g_stServices[i].szServiceName != NULL)
446 appendServiceMenu(hMenu, i, g_stServices[i].szDisplayName,
447 g_stServices[i].dwPid != 0);
452 if (!SetForegroundWindow(hWnd)) {
453 SetForegroundWindow(NULL);
456 TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON,
457 pt.x, pt.y, 0, hWnd, NULL);
464 BOOL CenterWindow(HWND hwndChild)
466 RECT rChild, rWorkArea;
471 /* Get the Height and Width of the child window */
472 GetWindowRect(hwndChild, &rChild);
473 wChild = rChild.right - rChild.left;
474 hChild = rChild.bottom - rChild.top;
476 /* Get the limits of the 'workarea' */
477 bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT),
480 rWorkArea.left = rWorkArea.top = 0;
481 rWorkArea.right = GetSystemMetrics(SM_CXSCREEN);
482 rWorkArea.bottom = GetSystemMetrics(SM_CYSCREEN);
485 /* Calculate new X and Y position*/
486 xNew = (rWorkArea.right - wChild) / 2;
487 yNew = (rWorkArea.bottom - hChild) / 2;
488 return SetWindowPos(hwndChild, HWND_TOP, xNew, yNew, 0, 0,
489 SWP_NOSIZE | SWP_SHOWWINDOW);
493 static void addListBoxItem(HWND hDlg, LPSTR lpStr, HBITMAP hBmp)
497 nItem = SendMessage(hDlg, LB_ADDSTRING, 0, (LPARAM)lpStr);
498 SendMessage(hDlg, LB_SETITEMDATA, nItem, (LPARAM)hBmp);
502 static void addListBoxString(HWND hListBox, LPSTR lpStr)
504 static int nItems = 0;
505 if (!g_bDlgServiceOn) {
509 if (nItems > MAX_LOADSTRING)
511 SendMessage(hListBox, LB_RESETCONTENT, 0, 0);
514 ListBox_SetCurSel(hListBox,
515 ListBox_AddString(hListBox, lpStr));
520 static DWORD WINAPI ConsoleOutputThread(LPVOID lpThreadParameter)
522 static BYTE lpBuffer[MAX_PATH+1];
527 while (ReadFile(g_hpipeOutRead, &ch, 1, &dwReaded, NULL) == TRUE)
531 if (ch == '\n' || nPtr >= MAX_PATH)
533 lpBuffer[nPtr] = '\0';
534 addListBoxString(g_hwndStdoutList, lpBuffer);
537 else if (ch == '\t' && nPtr < (MAX_PATH - 4))
540 for (i = 0; i < 4; ++i) {
541 lpBuffer[nPtr++] = ' ';
544 else if (ch != '\r') {
545 lpBuffer[nPtr++] = ch;
549 CloseHandle(g_hpipeInWrite);
550 CloseHandle(g_hpipeOutRead);
551 CloseHandle(g_hpipeStdError);
556 DWORD WINAPI ConsoleWaitingThread(LPVOID lpThreadParameter)
558 WaitForSingleObject(g_lpRedirectProc.hThread, INFINITE);
559 CloseHandle(g_lpRedirectProc.hThread);
561 g_bConsoleRun = FALSE;
562 SetCursor(g_hCursorArrow);
567 BOOL RunRedirectedConsole(LPSTR szCmdLine)
574 memset(&stInfo, 0, sizeof(stInfo));
575 stInfo.cb = sizeof(stInfo);
576 stInfo.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
577 stInfo.wShowWindow = SW_HIDE;
579 hProc = GetCurrentProcess();
581 if (!CreatePipe(&g_hpipeInRead, &g_hpipeInWrite, NULL, MAX_PATH)) {
582 ErrorMessage(NULL, TRUE);
584 if (!CreatePipe(&g_hpipeOutRead, &g_hpipeOutWrite, NULL, MAX_PATH*8)) {
585 ErrorMessage(NULL, TRUE);
587 DuplicateHandle(hProc, g_hpipeInRead, hProc, &g_hpipeInRead, 0, TRUE,
588 DUPLICATE_CLOSE_SOURCE|DUPLICATE_SAME_ACCESS);
589 DuplicateHandle(hProc, g_hpipeOutWrite, hProc, &g_hpipeOutWrite, 0, TRUE,
590 DUPLICATE_CLOSE_SOURCE|DUPLICATE_SAME_ACCESS);
591 DuplicateHandle(hProc, g_hpipeOutWrite, hProc, &g_hpipeStdError, 0, TRUE,
592 DUPLICATE_SAME_ACCESS);
593 if (!g_hpipeInRead && !g_hpipeOutWrite && !g_hpipeStdError) {
594 ErrorMessage(NULL, TRUE);
596 stInfo.hStdInput = g_hpipeInRead;
597 stInfo.hStdOutput = g_hpipeOutWrite;
598 stInfo.hStdError = g_hpipeStdError;
600 bResult = CreateProcess(NULL,
612 CloseHandle(g_hpipeInRead);
613 CloseHandle(g_hpipeOutWrite);
614 CloseHandle(g_hpipeStdError);
618 CloseHandle(g_hpipeInWrite);
619 CloseHandle(g_hpipeOutRead);
620 CloseHandle(g_hpipeStdError);
624 CloseHandle(CreateThread(NULL, 0, ConsoleOutputThread,
626 ResumeThread(g_lpRedirectProc.hThread);
627 CloseHandle(CreateThread(NULL, 0, ConsoleWaitingThread,
634 BOOL RunAndForgetConsole(LPSTR szCmdLine, BOOL bRedirectConsole)
637 PROCESS_INFORMATION prInfo;
640 if (bRedirectConsole) {
641 return RunRedirectedConsole(szCmdLine);
644 memset(&stInfo, 0, sizeof(stInfo));
645 stInfo.cb = sizeof(stInfo);
646 stInfo.dwFlags = STARTF_USESHOWWINDOW;
647 stInfo.wShowWindow = SW_HIDE;
649 bResult = CreateProcess(NULL,
663 if (g_dwOSVersion == OS_VERSION_WIN9X) {
664 /* give some time to rescan the status */
667 CloseHandle(prInfo.hThread);
668 CloseHandle(prInfo.hProcess);
673 BOOL ApacheManageService(LPCSTR szServiceName, LPCSTR szImagePath,
674 LPSTR szComputerName, DWORD dwCommand)
676 CHAR szBuf[MAX_PATH];
677 CHAR szMsg[MAX_PATH];
680 BOOL serviceFlag = TRUE;
681 SC_HANDLE schService;
682 SC_HANDLE schSCManager;
683 SERVICE_STATUS schSStatus;
686 if (g_dwOSVersion == OS_VERSION_WIN9X)
688 sPos = strstr(szImagePath, "-k start");
691 lstrcpyn(szBuf, szImagePath, sPos - szImagePath);
694 case SERVICE_CONTROL_STOP:
695 lstrcat(szBuf, " -k shutdown -n ");
698 case SERVICE_CONTROL_CONTINUE:
699 sprintf(szMsg, g_lpMsg[IDS_MSG_SRVSTART - IDS_MSG_FIRST],
701 addListBoxString(g_hwndStdoutList, szMsg);
702 lstrcat(szBuf, " -k start -n ");
706 case SERVICE_APACHE_RESTART:
707 lstrcat(szBuf, " -k restart -n ");
713 lstrcat(szBuf, szServiceName);
718 g_bConsoleRun = TRUE;
719 SetCursor(g_hCursorHourglass);
720 if (!RunAndForgetConsole(szBuf, serviceFlag))
722 ErrorMessage(NULL, FALSE);
723 g_bConsoleRun = FALSE;
724 SetCursor(g_hCursorArrow);
727 else if (!serviceFlag)
729 sprintf(szMsg, g_lpMsg[IDS_MSG_SRVSTARTED - IDS_MSG_FIRST],
731 addListBoxString(g_hwndStdoutList, szMsg);
732 g_bConsoleRun = FALSE;
733 SetCursor(g_hCursorArrow);
739 schSCManager = OpenSCManager(szComputerName, NULL,
745 schService = OpenService(schSCManager, szServiceName,
746 SERVICE_QUERY_STATUS | SERVICE_START |
747 SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL);
748 if (schService != NULL)
751 g_bConsoleRun = TRUE;
752 SetCursor(g_hCursorHourglass);
755 case SERVICE_CONTROL_STOP:
756 sprintf(szMsg, g_lpMsg[IDS_MSG_SRVSTOP - IDS_MSG_FIRST],
758 addListBoxString(g_hwndStdoutList, szMsg);
759 if (ControlService(schService, SERVICE_CONTROL_STOP,
762 while (QueryServiceStatus(schService, &schSStatus))
764 if (schSStatus.dwCurrentState == SERVICE_STOP_PENDING)
773 if (QueryServiceStatus(schService, &schSStatus))
775 if (schSStatus.dwCurrentState == SERVICE_STOPPED)
779 g_lpMsg[IDS_MSG_SRVSTOPPED - IDS_MSG_FIRST],
781 addListBoxString(g_hwndStdoutList, szMsg);
786 case SERVICE_CONTROL_CONTINUE:
787 sprintf(szMsg, g_lpMsg[IDS_MSG_SRVSTART - IDS_MSG_FIRST],
789 addListBoxString(g_hwndStdoutList, szMsg);
791 if (StartService(schService, 0, NULL))
794 while (QueryServiceStatus(schService, &schSStatus))
796 if (schSStatus.dwCurrentState == SERVICE_START_PENDING)
805 if (QueryServiceStatus(schService, &schSStatus))
807 if (schSStatus.dwCurrentState == SERVICE_RUNNING)
811 g_lpMsg[IDS_MSG_SRVSTARTED - IDS_MSG_FIRST],
813 addListBoxString(g_hwndStdoutList, szMsg);
818 case SERVICE_APACHE_RESTART:
819 sprintf(szMsg, g_lpMsg[IDS_MSG_SRVRESTART - IDS_MSG_FIRST],
821 addListBoxString(g_hwndStdoutList, szMsg);
822 if (ControlService(schService, SERVICE_APACHE_RESTART,
826 while (schSStatus.dwCurrentState == SERVICE_START_PENDING)
829 if (!QueryServiceStatus(schService, &schSStatus))
831 CloseServiceHandle(schService);
832 CloseServiceHandle(schSCManager);
833 g_bConsoleRun = FALSE;
834 SetCursor(g_hCursorArrow);
842 if (schSStatus.dwCurrentState == SERVICE_RUNNING)
846 g_lpMsg[IDS_MSG_SRVRESTARTED - IDS_MSG_FIRST],
848 addListBoxString(g_hwndStdoutList, szMsg);
852 CloseServiceHandle(schService);
853 CloseServiceHandle(schSCManager);
855 ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST],
858 g_bConsoleRun = FALSE;
859 SetCursor(g_hCursorArrow);
863 g_bRescanServices = TRUE;
865 CloseServiceHandle(schSCManager);
873 BOOL IsServiceRunning(LPCSTR szServiceName, LPCSTR szComputerName,
878 SC_HANDLE schService;
879 SC_HANDLE schSCManager;
880 SERVICE_STATUS schSStatus;
882 if (g_dwOSVersion == OS_VERSION_WIN9X)
884 hWnd = FindWindow("ApacheWin95ServiceMonitor", szServiceName);
885 if (hWnd && GetWindowThreadProcessId(hWnd, &dwPid))
897 schSCManager = OpenSCManager(szComputerName, NULL,
903 schService = OpenService(schSCManager, szServiceName,
904 SERVICE_QUERY_STATUS);
905 if (schService != NULL)
907 if (QueryServiceStatus(schService, &schSStatus))
909 dwPid = schSStatus.dwCurrentState;
914 CloseServiceHandle(schService);
915 CloseServiceHandle(schSCManager);
916 return dwPid == SERVICE_RUNNING ? TRUE : FALSE;
919 g_bRescanServices = TRUE;
921 CloseServiceHandle(schSCManager);
930 BOOL FindRunningServices(void)
935 while (g_stServices[i].szServiceName != NULL)
937 if (!IsServiceRunning(g_stServices[i].szServiceName,
938 g_stServices[i].szComputerName, &dwPid)) {
941 if (g_stServices[i].dwPid != dwPid) {
944 g_stServices[i].dwPid = dwPid;
951 BOOL GetApacheServicesStatus()
953 CHAR szKey[MAX_PATH];
954 CHAR achKey[MAX_PATH];
955 CHAR szImagePath[MAX_PATH];
956 CHAR szBuf[MAX_PATH];
957 CHAR szTmp[MAX_PATH];
958 HKEY hKey, hSubKey, hKeyRemote;
959 DWORD retCode, rv, dwKeyType;
960 DWORD dwBufLen = MAX_PATH;
964 g_bRescanServices = FALSE;
966 am_ClearServicesSt();
967 while (g_stComputers[computers].szComputerName != NULL) {
968 hKeyRemote = g_stComputers[computers].hRegistry;
969 retCode = RegOpenKeyEx(hKeyRemote,
970 "System\\CurrentControlSet\\Services\\",
972 if (retCode != ERROR_SUCCESS)
974 ErrorMessage(NULL, FALSE);
977 for (i = 0, retCode = ERROR_SUCCESS; retCode == ERROR_SUCCESS; i++)
979 retCode = RegEnumKey(hKey, i, achKey, MAX_PATH);
980 if (retCode == ERROR_SUCCESS)
982 lstrcpy(szKey, "System\\CurrentControlSet\\Services\\");
983 lstrcat(szKey, achKey);
985 if (RegOpenKeyEx(hKeyRemote, szKey, 0,
986 KEY_QUERY_VALUE, &hSubKey) == ERROR_SUCCESS)
989 rv = RegQueryValueEx(hSubKey, "ImagePath", NULL,
990 &dwKeyType, szImagePath, &dwBufLen);
992 if (rv == ERROR_SUCCESS
993 && (dwKeyType == REG_SZ
994 || dwKeyType == REG_EXPAND_SZ)
997 lstrcpy(szBuf, szImagePath);
999 /* the service name could be Apache*.exe */
1000 if ((strstr(szBuf, "\\apache") != NULL)
1001 && strstr(szBuf, ".exe")
1002 && (strstr(szBuf, "--ntservice") != NULL
1003 || strstr(szBuf, "-k ") != NULL))
1005 g_stServices[stPos].szServiceName = strdup(achKey);
1006 g_stServices[stPos].szImagePath =
1007 strdup(szImagePath);
1008 g_stServices[stPos].szComputerName =
1009 strdup(g_stComputers[computers].szComputerName);
1010 dwBufLen = MAX_PATH;
1011 if (RegQueryValueEx(hSubKey, "Description", NULL,
1012 &dwKeyType, szBuf, &dwBufLen)
1014 g_stServices[stPos].szDescription =
1017 dwBufLen = MAX_PATH;
1018 if (RegQueryValueEx(hSubKey, "DisplayName", NULL,
1019 &dwKeyType, szBuf, &dwBufLen)
1022 if (strcmp(g_stComputers[computers]
1023 .szComputerName, g_szLocalHost) != 0)
1025 strcpy(szTmp, g_stComputers[computers]
1026 .szComputerName + 2);
1028 strcat(szTmp, szBuf);
1031 strcpy(szTmp, szBuf);
1033 g_stServices[stPos].szDisplayName
1038 if (stPos >= MAX_APACHE_SERVICES) {
1039 retCode = !ERROR_SUCCESS;
1043 RegCloseKey(hSubKey);
1050 FindRunningServices();
1055 LRESULT CALLBACK ConnectDlgProc(HWND hDlg, UINT message,
1056 WPARAM wParam, LPARAM lParam)
1058 CHAR szCmp[MAX_COMPUTERNAME_LENGTH+4];
1062 ShowWindow(hDlg, SW_HIDE);
1063 g_hwndConnectDlg = hDlg;
1065 ShowWindow(hDlg, SW_SHOW);
1066 SetFocus(GetDlgItem(hDlg, IDC_COMPUTER));
1070 switch (LOWORD(wParam))
1073 memset(szCmp, 0, MAX_COMPUTERNAME_LENGTH+4);
1074 strcpy(szCmp, "\\\\");
1075 SendMessage(GetDlgItem(hDlg, IDC_COMPUTER), WM_GETTEXT,
1076 (WPARAM) MAX_COMPUTERNAME_LENGTH,
1080 if (strlen(szCmp) < 3) {
1081 EndDialog(hDlg, TRUE);
1084 am_ConnectComputer(szCmp);
1085 SendMessage(g_hwndMain, WM_TIMER, WM_TIMER_RESCAN, 0);
1088 EndDialog(hDlg, TRUE);
1096 memset(&bi, 0, sizeof(BROWSEINFO));
1097 SHGetSpecialFolderLocation(hDlg, CSIDL_NETWORK, &il);
1099 bi.lpszTitle = "ApacheMonitor :\nSelect Network Computer!";
1100 bi.pszDisplayName = szCmp;
1101 bi.hwndOwner = hDlg;
1102 bi.ulFlags = BIF_BROWSEFORCOMPUTER;
1108 if (SHBrowseForFolder(&bi) != NULL) {
1109 SendMessage(GetDlgItem(hDlg, IDC_COMPUTER),
1111 (WPARAM) NULL, (LPARAM) szCmp);
1113 if (SHGetMalloc(&pMalloc)) {
1114 pMalloc->lpVtbl->Free(pMalloc, il);
1115 pMalloc->lpVtbl->Release(pMalloc);
1124 EndDialog(hDlg, TRUE);
1135 LRESULT CALLBACK ServiceDlgProc(HWND hDlg, UINT message,
1136 WPARAM wParam, LPARAM lParam)
1138 CHAR szBuf[MAX_PATH];
1140 static HWND hStatusBar;
1146 LPMEASUREITEMSTRUCT lpmis;
1147 LPDRAWITEMSTRUCT lpdis;
1149 memset(szBuf, 0, MAX_PATH);
1153 ShowWindow(hDlg, SW_HIDE);
1154 g_hwndServiceDlg = hDlg;
1155 SetWindowText(hDlg, g_szTitle);
1156 Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE);
1157 Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE);
1158 Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE);
1159 Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), FALSE);
1160 SetWindowText(GetDlgItem(hDlg, IDC_SSTART),
1161 g_lpMsg[IDS_MSG_SSTART - IDS_MSG_FIRST]);
1162 SetWindowText(GetDlgItem(hDlg, IDC_SSTOP),
1163 g_lpMsg[IDS_MSG_SSTOP - IDS_MSG_FIRST]);
1164 SetWindowText(GetDlgItem(hDlg, IDC_SRESTART),
1165 g_lpMsg[IDS_MSG_SRESTART - IDS_MSG_FIRST]);
1166 SetWindowText(GetDlgItem(hDlg, IDC_SMANAGER),
1167 g_lpMsg[IDS_MSG_SERVICES - IDS_MSG_FIRST]);
1168 SetWindowText(GetDlgItem(hDlg, IDC_SCONNECT),
1169 g_lpMsg[IDS_MSG_CONNECT - IDS_MSG_FIRST]);
1170 SetWindowText(GetDlgItem(hDlg, IDC_SEXIT),
1171 g_lpMsg[IDS_MSG_MNUEXIT - IDS_MSG_FIRST]);
1172 if (g_dwOSVersion < OS_VERSION_WINNT)
1174 ShowWindow(GetDlgItem(hDlg, IDC_SMANAGER), SW_HIDE);
1175 ShowWindow(GetDlgItem(hDlg, IDC_SCONNECT), SW_HIDE);
1176 ShowWindow(GetDlgItem(hDlg, IDC_SDISCONN), SW_HIDE);
1178 hListBox = GetDlgItem(hDlg, IDL_SERVICES);
1179 g_hwndStdoutList = GetDlgItem(hDlg, IDL_STDOUT);
1180 hStatusBar = CreateStatusWindow(0x0800 /* SBT_TOOLTIPS */
1181 | WS_CHILD | WS_VISIBLE,
1182 "", hDlg, IDC_STATBAR);
1183 if (GetApacheServicesStatus())
1186 while (g_stServices[i].szServiceName != NULL)
1188 addListBoxItem(hListBox, g_stServices[i].szDisplayName,
1189 g_stServices[i].dwPid == 0 ? g_hBmpStop
1195 ShowWindow(hDlg, SW_SHOW);
1197 SendMessage(hListBox, LB_SETCURSEL, 0, 0);
1201 case WM_MANAGEMESSAGE:
1202 ApacheManageService(g_stServices[LOWORD(wParam)].szServiceName,
1203 g_stServices[LOWORD(wParam)].szImagePath,
1204 g_stServices[LOWORD(wParam)].szComputerName,
1210 case WM_UPDATEMESSAGE:
1211 hListBox = GetDlgItem(hDlg, IDL_SERVICES);
1212 SendMessage(hListBox, LB_RESETCONTENT, 0, 0);
1213 SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)"");
1214 Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE);
1215 Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE);
1216 Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE);
1217 Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), FALSE);
1219 while (g_stServices[i].szServiceName != NULL)
1221 addListBoxItem(hListBox, g_stServices[i].szDisplayName,
1222 g_stServices[i].dwPid == 0 ? g_hBmpStop : g_hBmpStart);
1225 SendMessage(hListBox, LB_SETCURSEL, 0, 0);
1226 /* Dirty hack to bring the window to the foreground */
1227 SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0,
1228 SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
1229 SetWindowPos(hDlg, HWND_NOTOPMOST, 0, 0, 0, 0,
1230 SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
1235 case WM_MEASUREITEM:
1236 lpmis = (LPMEASUREITEMSTRUCT) lParam;
1237 lpmis->itemHeight = YBITMAP;
1241 if (g_bConsoleRun) {
1242 SetCursor(g_hCursorHourglass);
1245 SetCursor(g_hCursorArrow);
1250 lpdis = (LPDRAWITEMSTRUCT) lParam;
1251 if (lpdis->itemID == -1) {
1254 switch (lpdis->itemAction)
1257 case ODA_DRAWENTIRE:
1258 g_hBmpPicture = (HBITMAP)SendMessage(lpdis->hwndItem,
1260 lpdis->itemID, (LPARAM) 0);
1262 hdcMem = CreateCompatibleDC(lpdis->hDC);
1263 g_hBmpOld = SelectObject(hdcMem, g_hBmpPicture);
1265 BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
1266 lpdis->rcItem.right - lpdis->rcItem.left,
1267 lpdis->rcItem.bottom - lpdis->rcItem.top,
1268 hdcMem, 0, 0, SRCCOPY);
1269 SendMessage(lpdis->hwndItem, LB_GETTEXT,
1270 lpdis->itemID, (LPARAM) szBuf);
1272 GetTextMetrics(lpdis->hDC, &tm);
1273 y = (lpdis->rcItem.bottom + lpdis->rcItem.top - tm.tmHeight) / 2;
1275 SelectObject(hdcMem, g_hBmpOld);
1278 rcBitmap.left = lpdis->rcItem.left + XBITMAP + 2;
1279 rcBitmap.top = lpdis->rcItem.top;
1280 rcBitmap.right = lpdis->rcItem.right;
1281 rcBitmap.bottom = lpdis->rcItem.top + YBITMAP;
1283 if (lpdis->itemState & ODS_SELECTED)
1285 if (g_hBmpPicture == g_hBmpStop)
1287 Button_Enable(GetDlgItem(hDlg, IDC_SSTART), TRUE);
1288 Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE);
1289 Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE);
1291 else if (g_hBmpPicture == g_hBmpStart)
1293 Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE);
1294 Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), TRUE);
1295 Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), TRUE);
1298 Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE);
1299 Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE);
1300 Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE);
1302 if (strcmp(g_stServices[lpdis->itemID].szComputerName,
1303 g_szLocalHost) == 0) {
1304 Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), FALSE);
1307 Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), TRUE);
1310 if (g_stServices[lpdis->itemID].szDescription) {
1311 SendMessage(hStatusBar, SB_SETTEXT, 0,
1312 (LPARAM)g_stServices[lpdis->itemID].szDescription);
1315 SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)"");
1317 SetTextColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
1318 SetBkColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT));
1319 FillRect(lpdis->hDC, &rcBitmap, (HBRUSH)(COLOR_HIGHLIGHTTEXT));
1323 SetTextColor(lpdis->hDC, GetSysColor(COLOR_MENUTEXT));
1324 SetBkColor(lpdis->hDC, GetSysColor(COLOR_WINDOW));
1325 FillRect(lpdis->hDC, &rcBitmap, (HBRUSH)(COLOR_WINDOW+1));
1327 TextOut(lpdis->hDC, XBITMAP + 6, y, szBuf, strlen(szBuf));
1335 switch (LOWORD(wParam))
1338 switch (HIWORD(wParam))
1341 /* if started then stop, if stopped then start */
1342 hListBox = GetDlgItem(hDlg, IDL_SERVICES);
1343 nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
1344 if (nItem != LB_ERR)
1346 g_hBmpPicture = (HBITMAP)SendMessage(hListBox,
1349 if (g_hBmpPicture == g_hBmpStop) {
1350 SendMessage(hDlg, WM_MANAGEMESSAGE, nItem,
1351 SERVICE_CONTROL_CONTINUE);
1354 SendMessage(hDlg, WM_MANAGEMESSAGE, nItem,
1355 SERVICE_CONTROL_STOP);
1364 EndDialog(hDlg, TRUE);
1368 Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE);
1369 hListBox = GetDlgItem(hDlg, IDL_SERVICES);
1370 nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
1371 if (nItem != LB_ERR) {
1372 SendMessage(hDlg, WM_MANAGEMESSAGE, nItem,
1373 SERVICE_CONTROL_CONTINUE);
1375 Button_Enable(GetDlgItem(hDlg, IDC_SSTART), TRUE);
1379 Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE);
1380 hListBox = GetDlgItem(hDlg, IDL_SERVICES);
1381 nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
1382 if (nItem != LB_ERR) {
1383 SendMessage(hDlg, WM_MANAGEMESSAGE, nItem,
1384 SERVICE_CONTROL_STOP);
1386 Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), TRUE);
1390 Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE);
1391 hListBox = GetDlgItem(hDlg, IDL_SERVICES);
1392 nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
1393 if (nItem != LB_ERR) {
1394 SendMessage(hDlg, WM_MANAGEMESSAGE, nItem,
1395 SERVICE_APACHE_RESTART);
1397 Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), TRUE);
1401 if (g_dwOSVersion >= OS_VERSION_WIN2K) {
1402 ShellExecute(hDlg, "open", "services.msc", "/s",
1406 WinExec("Control.exe SrvMgr.cpl Services", SW_NORMAL);
1411 EndDialog(hDlg, TRUE);
1412 SendMessage(g_hwndMain, WM_COMMAND, (WPARAM)IDM_EXIT, 0);
1416 DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DLGCONNECT),
1417 hDlg, (DLGPROC)ConnectDlgProc);
1421 hListBox = GetDlgItem(hDlg, IDL_SERVICES);
1422 nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
1423 if (nItem != LB_ERR) {
1424 am_DisconnectComputer(g_stServices[nItem].szComputerName);
1425 SendMessage(g_hwndMain, WM_TIMER, WM_TIMER_RESCAN, 0);
1432 switch (LOWORD(wParam))
1434 case SIZE_MINIMIZED:
1435 EndDialog(hDlg, TRUE);
1443 EndDialog(hDlg, TRUE);
1453 LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
1454 WPARAM wParam, LPARAM lParam)
1456 if (message == g_bUiTaskbarCreated)
1458 /* restore the tray icon on shell restart */
1459 ShowNotifyIcon(hWnd, NIM_ADD);
1460 return DefWindowProc(hWnd, message, wParam, lParam);
1465 GetApacheServicesStatus();
1466 ShowNotifyIcon(hWnd, NIM_ADD);
1467 SetTimer(hWnd, WM_TIMER_REFRESH, REFRESH_TIME, NULL);
1468 SetTimer(hWnd, WM_TIMER_RESCAN, RESCAN_TIME, NULL);
1474 case WM_TIMER_RESCAN:
1476 int nPrev = 0, nNew = 0;
1477 EnterCriticalSection(&g_stcSection);
1478 if (FindRunningServices() || g_bRescanServices)
1480 ShowNotifyIcon(hWnd, NIM_MODIFY);
1481 if (g_hwndServiceDlg)
1482 PostMessage(g_hwndServiceDlg, WM_UPDATEMESSAGE, 0, 0);
1484 /* check if services list changed */
1485 while (g_stServices[nPrev].szServiceName != NULL)
1487 GetApacheServicesStatus();
1488 while (g_stServices[nNew].szServiceName != NULL)
1492 ShowNotifyIcon(hWnd, NIM_MODIFY);
1493 if (g_hwndServiceDlg) {
1494 PostMessage(g_hwndServiceDlg, WM_UPDATEMESSAGE, 0, 0);
1497 LeaveCriticalSection(&g_stcSection);
1501 case WM_TIMER_REFRESH:
1503 int nPrev = 0, nNew = 0;
1504 EnterCriticalSection(&g_stcSection);
1505 if (g_bRescanServices)
1507 GetApacheServicesStatus();
1508 ShowNotifyIcon(hWnd, NIM_MODIFY);
1509 if (g_hwndServiceDlg) {
1510 PostMessage(g_hwndServiceDlg, WM_UPDATEMESSAGE, 0, 0);
1513 else if (FindRunningServices())
1515 ShowNotifyIcon(hWnd, NIM_MODIFY);
1516 if (g_hwndServiceDlg) {
1517 PostMessage(g_hwndServiceDlg, WM_UPDATEMESSAGE, 0, 0);
1520 LeaveCriticalSection(&g_stcSection);
1527 ShowNotifyIcon(hWnd, NIM_DELETE);
1530 case WM_TRAYMESSAGE:
1533 case WM_LBUTTONDBLCLK:
1534 if (!g_bDlgServiceOn)
1536 g_bDlgServiceOn = TRUE;
1537 DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DLGSERVICES),
1538 hWnd, (DLGPROC)ServiceDlgProc);
1539 g_bDlgServiceOn = FALSE;
1540 g_hwndServiceDlg = NULL;
1542 else if (IsWindow(g_hwndServiceDlg))
1544 /* Dirty hack to bring the window to the foreground */
1545 SetWindowPos(g_hwndServiceDlg, HWND_TOPMOST, 0, 0, 0, 0,
1546 SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
1547 SetWindowPos(g_hwndServiceDlg, HWND_NOTOPMOST, 0, 0, 0, 0,
1548 SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
1549 SetFocus(g_hwndServiceDlg);
1554 ShowTryServicesMenu(hWnd);
1558 ShowTryPopupMenu(hWnd);
1564 if ((LOWORD(wParam) & IDM_SM_START) == IDM_SM_START)
1566 ApacheManageService(g_stServices[LOWORD(wParam)
1567 - IDM_SM_START].szServiceName,
1568 g_stServices[LOWORD(wParam)
1569 - IDM_SM_START].szImagePath,
1570 g_stServices[LOWORD(wParam)
1571 - IDM_SM_START].szComputerName,
1572 SERVICE_CONTROL_CONTINUE);
1575 else if ((LOWORD(wParam) & IDM_SM_STOP) == IDM_SM_STOP)
1577 ApacheManageService(g_stServices[LOWORD(wParam)
1578 - IDM_SM_STOP].szServiceName,
1579 g_stServices[LOWORD(wParam)
1580 - IDM_SM_STOP].szImagePath,
1581 g_stServices[LOWORD(wParam)
1582 - IDM_SM_STOP].szComputerName,
1583 SERVICE_CONTROL_STOP);
1586 else if ((LOWORD(wParam) & IDM_SM_RESTART) == IDM_SM_RESTART)
1588 ApacheManageService(g_stServices[LOWORD(wParam)
1589 - IDM_SM_RESTART].szServiceName,
1590 g_stServices[LOWORD(wParam)
1591 - IDM_SM_RESTART].szImagePath,
1592 g_stServices[LOWORD(wParam)
1593 - IDM_SM_RESTART].szComputerName,
1594 SERVICE_APACHE_RESTART);
1597 switch (LOWORD(wParam))
1600 if (!g_bDlgServiceOn)
1602 g_bDlgServiceOn = TRUE;
1603 DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DLGSERVICES),
1604 hWnd, (DLGPROC)ServiceDlgProc);
1605 g_bDlgServiceOn = FALSE;
1606 g_hwndServiceDlg = NULL;
1608 else if (IsWindow(g_hwndServiceDlg)) {
1609 SetFocus(g_hwndServiceDlg);
1614 if (g_dwOSVersion >= OS_VERSION_WIN2K) {
1615 ShellExecute(NULL, "open", "services.msc", "/s",
1619 WinExec("Control.exe SrvMgr.cpl Services", SW_NORMAL);
1624 ShowNotifyIcon(hWnd, NIM_DELETE);
1630 return DefWindowProc(hWnd, message, wParam, lParam);
1637 /* Create main invisible window */
1638 HWND CreateMainWindow(HINSTANCE hInstance)
1643 if (!GetSystemOSVersion(&g_dwOSVersion))
1645 ErrorMessage(NULL, TRUE);
1649 wcex.cbSize = sizeof(WNDCLASSEX);
1651 wcex.style = CS_HREDRAW | CS_VREDRAW;
1652 wcex.lpfnWndProc = (WNDPROC)WndProc;
1653 wcex.cbClsExtra = 0;
1654 wcex.cbWndExtra = 0;
1655 wcex.hInstance = hInstance;
1656 wcex.hIcon = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_APSRVMON),
1657 IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
1658 wcex.hCursor = g_hCursorArrow;
1659 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
1660 wcex.lpszMenuName = 0;
1661 wcex.lpszClassName = g_szWindowClass;
1662 wcex.hIconSm = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_APSRVMON),
1663 IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
1665 if (RegisterClassEx(&wcex)) {
1666 hWnd = CreateWindow(g_szWindowClass, g_szTitle,
1668 NULL, NULL, hInstance, NULL);
1675 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
1676 LPSTR lpCmdLine, int nCmdShow)
1678 CHAR szTmp[MAX_LOADSTRING];
1679 CHAR szCmp[MAX_COMPUTERNAME_LENGTH+4];
1681 /* single instance mutex */
1686 g_LangID = GetUserDefaultLangID();
1687 if ((g_LangID & 0xFF) != LANG_ENGLISH) {
1688 g_LangID = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
1690 for (i = IDS_MSG_FIRST; i <= IDS_MSG_LAST; ++i) {
1691 LoadString(hInstance, i, szTmp, MAX_LOADSTRING);
1692 g_lpMsg[i - IDS_MSG_FIRST] = strdup(szTmp);
1694 LoadString(hInstance, IDS_APMONITORTITLE, szTmp, MAX_LOADSTRING);
1695 d = MAX_COMPUTERNAME_LENGTH+1;
1696 strcpy(szCmp, "\\\\");
1697 GetComputerName(szCmp + 2, &d);
1699 g_szLocalHost = strdup(szCmp);
1701 memset(g_stComputers, 0, sizeof(ST_MONITORED_COMP) * MAX_APACHE_COMPUTERS);
1702 g_stComputers[0].szComputerName = strdup(szCmp);
1703 g_stComputers[0].hRegistry = HKEY_LOCAL_MACHINE;
1704 g_szTitle = strdup(szTmp);
1705 LoadString(hInstance, IDS_APMONITORCLASS, szTmp, MAX_LOADSTRING);
1706 g_szWindowClass = strdup(szTmp);
1708 g_icoStop = LoadImage(hInstance, MAKEINTRESOURCE(IDI_ICOSTOP),
1709 IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
1710 g_icoRun = LoadImage(hInstance, MAKEINTRESOURCE(IDI_ICORUN),
1711 IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
1712 g_hCursorHourglass = LoadImage(NULL, MAKEINTRESOURCE(OCR_WAIT),
1713 IMAGE_CURSOR, LR_DEFAULTSIZE,
1714 LR_DEFAULTSIZE, LR_SHARED);
1715 g_hCursorArrow = LoadImage(NULL, MAKEINTRESOURCE(OCR_NORMAL),
1716 IMAGE_CURSOR, LR_DEFAULTSIZE,
1717 LR_DEFAULTSIZE, LR_SHARED);
1718 g_hBmpStart = LoadImage(hInstance, MAKEINTRESOURCE(IDB_BMPRUN),
1719 IMAGE_BITMAP, XBITMAP, YBITMAP,
1721 g_hBmpStop = LoadImage(hInstance, MAKEINTRESOURCE(IDB_BMPSTOP),
1722 IMAGE_BITMAP, XBITMAP, YBITMAP,
1725 hMutex = CreateMutex(NULL, FALSE, "APSRVMON_MUTEX");
1726 if ((hMutex == NULL) || (GetLastError() == ERROR_ALREADY_EXISTS))
1728 ErrorMessage(g_lpMsg[IDS_MSG_APPRUNNING - IDS_MSG_FIRST], FALSE);
1730 CloseHandle(hMutex);
1735 memset(g_stServices, 0, sizeof(ST_APACHE_SERVICE) * MAX_APACHE_SERVICES);
1737 InitCommonControls();
1738 g_hInstance = hInstance;
1739 g_hwndMain = CreateMainWindow(hInstance);
1740 g_bUiTaskbarCreated = RegisterWindowMessage("TaskbarCreated");
1741 InitializeCriticalSection(&g_stcSection);
1742 g_hwndServiceDlg = NULL;
1743 if (g_hwndMain != NULL)
1745 while (GetMessage(&msg, NULL, 0, 0) == TRUE)
1747 TranslateMessage(&msg);
1748 DispatchMessage(&msg);
1750 am_ClearServicesSt();
1752 am_ClearComputersSt();
1753 DeleteCriticalSection(&g_stcSection);
1754 CloseHandle(hMutex);
1755 DestroyIcon(g_icoStop);
1756 DestroyIcon(g_icoRun);
1757 DestroyCursor(g_hCursorHourglass);
1758 DestroyCursor(g_hCursorArrow);
1759 DeleteObject(g_hBmpStart);
1760 DeleteObject(g_hBmpStop);