Blame support/win32/ApacheMonitor.c

Packit 90a5c9
/* Licensed to the Apache Software Foundation (ASF) under one or more
Packit 90a5c9
 * contributor license agreements.  See the NOTICE file distributed with
Packit 90a5c9
 * this work for additional information regarding copyright ownership.
Packit 90a5c9
 * The ASF licenses this file to You under the Apache License, Version 2.0
Packit 90a5c9
 * (the "License"); you may not use this file except in compliance with
Packit 90a5c9
 * the License.  You may obtain a copy of the License at
Packit 90a5c9
 *
Packit 90a5c9
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 90a5c9
 *
Packit 90a5c9
 * Unless required by applicable law or agreed to in writing, software
Packit 90a5c9
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 90a5c9
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 90a5c9
 * See the License for the specific language governing permissions and
Packit 90a5c9
 * limitations under the License.
Packit 90a5c9
 */
Packit 90a5c9
Packit 90a5c9
/* ====================================================================
Packit 90a5c9
 * ApacheMonitor.c Simple program to manage and monitor Apache services.
Packit 90a5c9
 *
Packit 90a5c9
 * Contributed by Mladen Turk <mturk mappingsoft.com>
Packit 90a5c9
 *
Packit 90a5c9
 * 05 Aug 2001
Packit 90a5c9
 * ====================================================================
Packit 90a5c9
 */
Packit 90a5c9
Packit 90a5c9
#define _WIN32_WINNT 0x0500
Packit 90a5c9
#ifndef STRICT
Packit 90a5c9
#define STRICT
Packit 90a5c9
#endif
Packit 90a5c9
#ifndef OEMRESOURCE
Packit 90a5c9
#define OEMRESOURCE
Packit 90a5c9
#endif
Packit 90a5c9
Packit 90a5c9
#if defined(_MSC_VER) && _MSC_VER >= 1400
Packit 90a5c9
#define _CRT_SECURE_NO_DEPRECATE
Packit 90a5c9
#endif
Packit 90a5c9
Packit 90a5c9
#include <windows.h>
Packit 90a5c9
#include <windowsx.h>
Packit 90a5c9
#include <commctrl.h>
Packit 90a5c9
#include <objbase.h>
Packit 90a5c9
#include <shlobj.h>
Packit 90a5c9
#include <stdlib.h>
Packit 90a5c9
#include <stdio.h>
Packit 90a5c9
#include <WtsApi32.h>
Packit 90a5c9
#include <tchar.h>
Packit 90a5c9
#include "ApacheMonitor.h"
Packit 90a5c9
Packit 90a5c9
#ifndef AM_STRINGIFY
Packit 90a5c9
/** Properly quote a value as a string in the C preprocessor */
Packit 90a5c9
#define AM_STRINGIFY(n) AM_STRINGIFY_HELPER(n)
Packit 90a5c9
/** Helper macro for AM_STRINGIFY */
Packit 90a5c9
#define AM_STRINGIFY_HELPER(n) #n
Packit 90a5c9
#endif
Packit 90a5c9
Packit 90a5c9
#define OS_VERSION_WINNT    2
Packit 90a5c9
#define OS_VERSION_WIN2K    3
Packit 90a5c9
Packit 90a5c9
/* Should be enough */
Packit 90a5c9
#define MAX_APACHE_SERVICES 128
Packit 90a5c9
#define MAX_APACHE_COMPUTERS 32
Packit 90a5c9
Packit 90a5c9
#define WM_TRAYMESSAGE         (WM_APP+1)
Packit 90a5c9
#define WM_UPDATEMESSAGE       (WM_USER+1)
Packit 90a5c9
#define WM_MANAGEMESSAGE       (WM_USER+2)
Packit 90a5c9
#define WM_TIMER_REFRESH       10
Packit 90a5c9
#define WM_TIMER_RESCAN        11
Packit 90a5c9
#define SERVICE_APACHE_RESTART 128
Packit 90a5c9
#define XBITMAP                16
Packit 90a5c9
#define YBITMAP                16
Packit 90a5c9
#define MAX_LOADSTRING         100
Packit 90a5c9
#define REFRESH_TIME           2000           /* service refresh time (ms) */
Packit 90a5c9
#define RESCAN_TIME            20000          /* registry rescan time (ms) */
Packit 90a5c9
Packit 90a5c9
typedef struct _st_APACHE_SERVICE
Packit 90a5c9
{
Packit 90a5c9
    LPTSTR   szServiceName;
Packit 90a5c9
    LPTSTR   szDisplayName;
Packit 90a5c9
    LPTSTR   szDescription;
Packit 90a5c9
    LPTSTR   szImagePath;
Packit 90a5c9
    LPTSTR   szComputerName;
Packit 90a5c9
    DWORD    dwPid;
Packit 90a5c9
} ST_APACHE_SERVICE;
Packit 90a5c9
Packit 90a5c9
typedef struct _st_MONITORED_COMPUTERS
Packit 90a5c9
{
Packit 90a5c9
    LPTSTR  szComputerName;
Packit 90a5c9
    HKEY    hRegistry;
Packit 90a5c9
} ST_MONITORED_COMP;
Packit 90a5c9
Packit 90a5c9
/* Global variables */
Packit 90a5c9
HINSTANCE         g_hInstance = NULL;
Packit 90a5c9
TCHAR            *g_szTitle;          /* The title bar text */
Packit 90a5c9
TCHAR            *g_szWindowClass;    /* Window Class Name  */
Packit 90a5c9
HICON             g_icoStop;
Packit 90a5c9
HICON             g_icoRun;
Packit 90a5c9
UINT              g_bUiTaskbarCreated;
Packit 90a5c9
DWORD             g_dwOSVersion;
Packit 90a5c9
BOOL              g_bDlgServiceOn = FALSE;
Packit 90a5c9
BOOL              g_bConsoleRun = FALSE;
Packit 90a5c9
ST_APACHE_SERVICE g_stServices[MAX_APACHE_SERVICES];
Packit 90a5c9
ST_MONITORED_COMP g_stComputers[MAX_APACHE_COMPUTERS];
Packit 90a5c9
Packit 90a5c9
HBITMAP           g_hBmpStart, g_hBmpStop;
Packit 90a5c9
HBITMAP           g_hBmpPicture, g_hBmpOld;
Packit 90a5c9
BOOL              g_bRescanServices;
Packit 90a5c9
HWND              g_hwndServiceDlg;
Packit 90a5c9
HWND              g_hwndMain;
Packit 90a5c9
HWND              g_hwndStdoutList;
Packit 90a5c9
HWND              g_hwndConnectDlg;
Packit 90a5c9
HCURSOR           g_hCursorHourglass;
Packit 90a5c9
HCURSOR           g_hCursorArrow;
Packit 90a5c9
Packit 90a5c9
LANGID            g_LangID;
Packit 90a5c9
CRITICAL_SECTION  g_stcSection;
Packit 90a5c9
LPTSTR            g_szLocalHost;
Packit 90a5c9
Packit 90a5c9
/* locale language support */
Packit 90a5c9
static TCHAR *g_lpMsg[IDS_MSG_LAST - IDS_MSG_FIRST + 1];
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
void am_ClearServicesSt()
Packit 90a5c9
{
Packit 90a5c9
    int i;
Packit 90a5c9
    for (i = 0; i < MAX_APACHE_SERVICES; i++)
Packit 90a5c9
    {
Packit 90a5c9
        if (g_stServices[i].szServiceName) {
Packit 90a5c9
            free(g_stServices[i].szServiceName);
Packit 90a5c9
        }
Packit 90a5c9
        if (g_stServices[i].szDisplayName) {
Packit 90a5c9
            free(g_stServices[i].szDisplayName);
Packit 90a5c9
        }
Packit 90a5c9
        if (g_stServices[i].szDescription) {
Packit 90a5c9
            free(g_stServices[i].szDescription);
Packit 90a5c9
        }
Packit 90a5c9
        if (g_stServices[i].szImagePath) {
Packit 90a5c9
            free(g_stServices[i].szImagePath);
Packit 90a5c9
        }
Packit 90a5c9
        if (g_stServices[i].szComputerName) {
Packit 90a5c9
            free(g_stServices[i].szComputerName);
Packit 90a5c9
        }
Packit 90a5c9
Packit 90a5c9
    }
Packit 90a5c9
    memset(g_stServices, 0, sizeof(ST_APACHE_SERVICE) * MAX_APACHE_SERVICES);
Packit 90a5c9
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
void am_ClearComputersSt()
Packit 90a5c9
{
Packit 90a5c9
    int i;
Packit 90a5c9
    for (i = 0; i < MAX_APACHE_COMPUTERS; i++) {
Packit 90a5c9
        if (g_stComputers[i].szComputerName) {
Packit 90a5c9
            free(g_stComputers[i].szComputerName);
Packit 90a5c9
            RegCloseKey(g_stComputers[i].hRegistry);
Packit 90a5c9
        }
Packit 90a5c9
    }
Packit 90a5c9
    memset(g_stComputers, 0, sizeof(ST_MONITORED_COMP) * MAX_APACHE_COMPUTERS);
Packit 90a5c9
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
BOOL am_IsComputerConnected(LPTSTR szComputerName)
Packit 90a5c9
{
Packit 90a5c9
    int i = 0;
Packit 90a5c9
    while (g_stComputers[i].szComputerName != NULL) {
Packit 90a5c9
        if (_tcscmp(g_stComputers[i].szComputerName, szComputerName) == 0) {
Packit 90a5c9
            return TRUE;
Packit 90a5c9
        }
Packit 90a5c9
        ++i;
Packit 90a5c9
    }
Packit 90a5c9
    return FALSE;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
void am_DisconnectComputer(LPTSTR szComputerName)
Packit 90a5c9
{
Packit 90a5c9
    int i = 0, j;
Packit 90a5c9
    while (g_stComputers[i].szComputerName != NULL) {
Packit 90a5c9
        if (_tcscmp(g_stComputers[i].szComputerName, szComputerName) == 0) {
Packit 90a5c9
            break;
Packit 90a5c9
        }
Packit 90a5c9
        ++i;
Packit 90a5c9
    }
Packit 90a5c9
    if (g_stComputers[i].szComputerName != NULL) {
Packit 90a5c9
        free(g_stComputers[i].szComputerName);
Packit 90a5c9
        RegCloseKey(g_stComputers[i].hRegistry);
Packit 90a5c9
        for (j = i; j < MAX_APACHE_COMPUTERS - 1; j++) {
Packit 90a5c9
            g_stComputers[j].szComputerName= g_stComputers[j+1].szComputerName;
Packit 90a5c9
            g_stComputers[j].hRegistry = g_stComputers[j+1].hRegistry;
Packit 90a5c9
        }
Packit 90a5c9
        g_stComputers[j].szComputerName = NULL;
Packit 90a5c9
        g_stComputers[j].hRegistry = NULL;
Packit 90a5c9
    }
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
void ErrorMessage(LPCTSTR szError, BOOL bFatal)
Packit 90a5c9
{
Packit 90a5c9
    LPVOID lpMsgBuf = NULL;
Packit 90a5c9
    if (szError) {
Packit 90a5c9
        MessageBox(NULL, szError, g_lpMsg[IDS_MSG_ERROR - IDS_MSG_FIRST],
Packit 90a5c9
                   MB_OK | (bFatal ? MB_ICONERROR : MB_ICONEXCLAMATION));
Packit 90a5c9
    }
Packit 90a5c9
    else {
Packit 90a5c9
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
Packit 90a5c9
                      FORMAT_MESSAGE_FROM_SYSTEM |
Packit 90a5c9
                      FORMAT_MESSAGE_IGNORE_INSERTS,
Packit 90a5c9
                      NULL, GetLastError(), g_LangID,
Packit 90a5c9
                      (LPTSTR) &lpMsgBuf, 0, NULL);
Packit 90a5c9
        MessageBox(NULL, (LPCTSTR)lpMsgBuf,
Packit 90a5c9
                   g_lpMsg[IDS_MSG_ERROR - IDS_MSG_FIRST],
Packit 90a5c9
                   MB_OK | (bFatal ? MB_ICONERROR : MB_ICONEXCLAMATION));
Packit 90a5c9
        LocalFree(lpMsgBuf);
Packit 90a5c9
    }
Packit 90a5c9
    if (bFatal) {
Packit 90a5c9
        PostQuitMessage(0);
Packit 90a5c9
    }
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
int am_RespawnAsUserAdmin(HWND hwnd, DWORD op, LPCTSTR szService,
Packit 90a5c9
                          LPCTSTR szComputerName)
Packit 90a5c9
{
Packit 90a5c9
    TCHAR args[MAX_PATH + MAX_COMPUTERNAME_LENGTH + 12];
Packit 90a5c9
Packit 90a5c9
    if (g_dwOSVersion < OS_VERSION_WIN2K) {
Packit 90a5c9
        ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST], FALSE);
Packit 90a5c9
        return 0;
Packit 90a5c9
    }
Packit 90a5c9
Packit 90a5c9
    _sntprintf(args, sizeof(args) / sizeof(TCHAR),
Packit 90a5c9
               _T("%d \"%s\" \"%s\""), op, szService,
Packit 90a5c9
               szComputerName ? szComputerName : _T(""));
Packit 90a5c9
    if (!ShellExecute(hwnd, _T("runas"), __targv[0], args, NULL, SW_NORMAL)) {
Packit 90a5c9
        ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST],
Packit 90a5c9
                     FALSE);
Packit 90a5c9
        return 0;
Packit 90a5c9
    }
Packit 90a5c9
Packit 90a5c9
    return 1;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
BOOL am_ConnectComputer(LPTSTR szComputerName)
Packit 90a5c9
{
Packit 90a5c9
    int i = 0;
Packit 90a5c9
    HKEY hKeyRemote;
Packit 90a5c9
    TCHAR szTmp[MAX_PATH];
Packit 90a5c9
Packit 90a5c9
    while (g_stComputers[i].szComputerName != NULL) {
Packit 90a5c9
        if (_tcscmp(g_stComputers[i].szComputerName, szComputerName) == 0) {
Packit 90a5c9
            return FALSE;
Packit 90a5c9
        }
Packit 90a5c9
        ++i;
Packit 90a5c9
    }
Packit 90a5c9
    if (i > MAX_APACHE_COMPUTERS - 1) {
Packit 90a5c9
        return FALSE;
Packit 90a5c9
    }
Packit 90a5c9
    if (RegConnectRegistry(szComputerName, HKEY_LOCAL_MACHINE, &hKeyRemote)
Packit 90a5c9
            != ERROR_SUCCESS) {
Packit 90a5c9
        _sntprintf(szTmp, sizeof(szTmp) / sizeof(TCHAR),
Packit 90a5c9
                   g_lpMsg[IDS_MSG_ECONNECT - IDS_MSG_FIRST],
Packit 90a5c9
                   szComputerName);
Packit 90a5c9
        ErrorMessage(szTmp, FALSE);
Packit 90a5c9
        return FALSE;
Packit 90a5c9
    }
Packit 90a5c9
    else {
Packit 90a5c9
        g_stComputers[i].szComputerName = _tcsdup(szComputerName);
Packit 90a5c9
        g_stComputers[i].hRegistry = hKeyRemote;
Packit 90a5c9
        return TRUE;
Packit 90a5c9
    }
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
LPTSTR GetStringRes(int id)
Packit 90a5c9
{
Packit 90a5c9
    static TCHAR buffer[MAX_PATH];
Packit 90a5c9
Packit 90a5c9
    buffer[0] = 0;
Packit 90a5c9
    LoadString(GetModuleHandle(NULL), id, buffer, MAX_PATH);
Packit 90a5c9
    return buffer;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
BOOL GetSystemOSVersion(LPDWORD dwVersion)
Packit 90a5c9
{
Packit 90a5c9
    OSVERSIONINFO osvi;
Packit 90a5c9
    /*
Packit 90a5c9
    Try calling GetVersionEx using the OSVERSIONINFOEX structure.
Packit 90a5c9
    If that fails, try using the OSVERSIONINFO structure.
Packit 90a5c9
    */
Packit 90a5c9
    memset(&osvi, 0, sizeof(OSVERSIONINFO));
Packit 90a5c9
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
Packit 90a5c9
Packit 90a5c9
    if (!GetVersionEx(&osvi)) {
Packit 90a5c9
        return FALSE;
Packit 90a5c9
    }
Packit 90a5c9
Packit 90a5c9
    switch (osvi.dwPlatformId)
Packit 90a5c9
    {
Packit 90a5c9
    case VER_PLATFORM_WIN32_NT:
Packit 90a5c9
        if (osvi.dwMajorVersion >= 5)
Packit 90a5c9
            *dwVersion = OS_VERSION_WIN2K;
Packit 90a5c9
        else
Packit 90a5c9
            *dwVersion = OS_VERSION_WINNT;
Packit 90a5c9
        break;
Packit 90a5c9
Packit 90a5c9
    case VER_PLATFORM_WIN32_WINDOWS:
Packit 90a5c9
    case VER_PLATFORM_WIN32s:
Packit 90a5c9
    default:
Packit 90a5c9
        *dwVersion = 0;
Packit 90a5c9
        return FALSE;
Packit 90a5c9
    }
Packit 90a5c9
    return TRUE;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
static VOID ShowNotifyIcon(HWND hWnd, DWORD dwMessage)
Packit 90a5c9
{
Packit 90a5c9
    NOTIFYICONDATA nid;
Packit 90a5c9
    int i = 0, n = 0;
Packit 90a5c9
Packit 90a5c9
    memset(&nid, 0, sizeof(nid));
Packit 90a5c9
    nid.cbSize = sizeof(NOTIFYICONDATA);
Packit 90a5c9
    nid.hWnd = hWnd;
Packit 90a5c9
    nid.uID = 0xFF;
Packit 90a5c9
    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
Packit 90a5c9
    nid.uCallbackMessage = WM_TRAYMESSAGE;
Packit 90a5c9
Packit 90a5c9
    while (g_stServices[i].szServiceName != NULL)
Packit 90a5c9
    {
Packit 90a5c9
        if (g_stServices[i].dwPid != 0) {
Packit 90a5c9
            ++n;
Packit 90a5c9
        }
Packit 90a5c9
        ++i;
Packit 90a5c9
    }
Packit 90a5c9
    if (dwMessage != NIM_DELETE)
Packit 90a5c9
    {
Packit 90a5c9
        if (n) {
Packit 90a5c9
            nid.hIcon = g_icoRun;
Packit 90a5c9
        }
Packit 90a5c9
        else {
Packit 90a5c9
            nid.hIcon = g_icoStop;
Packit 90a5c9
        }
Packit 90a5c9
    }
Packit 90a5c9
    else {
Packit 90a5c9
        nid.hIcon = NULL;
Packit 90a5c9
    }
Packit 90a5c9
    if (n == i && n > 0) {
Packit 90a5c9
        _tcscpy(nid.szTip, g_lpMsg[IDS_MSG_RUNNINGALL - IDS_MSG_FIRST]);
Packit 90a5c9
    }
Packit 90a5c9
    else if (n) {
Packit 90a5c9
        _sntprintf(nid.szTip, sizeof(nid.szTip) / sizeof(TCHAR),
Packit 90a5c9
                  g_lpMsg[IDS_MSG_RUNNING - IDS_MSG_FIRST], n, i);
Packit 90a5c9
    }
Packit 90a5c9
    else if (i) {
Packit 90a5c9
        _sntprintf(nid.szTip, sizeof(nid.szTip) / sizeof(TCHAR),
Packit 90a5c9
                  g_lpMsg[IDS_MSG_RUNNINGNONE - IDS_MSG_FIRST], i);
Packit 90a5c9
    }
Packit 90a5c9
    else {
Packit 90a5c9
        _tcscpy(nid.szTip, g_lpMsg[IDS_MSG_NOSERVICES - IDS_MSG_FIRST]);
Packit 90a5c9
    }
Packit 90a5c9
    Shell_NotifyIcon(dwMessage, &nid;;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
void appendMenuItem(HMENU hMenu, UINT uMenuId, LPTSTR szName,
Packit 90a5c9
                    BOOL fDefault, BOOL fEnabled)
Packit 90a5c9
{
Packit 90a5c9
    MENUITEMINFO mii;
Packit 90a5c9
Packit 90a5c9
    memset(&mii, 0, sizeof(MENUITEMINFO));
Packit 90a5c9
    mii.cbSize = sizeof(MENUITEMINFO);
Packit 90a5c9
    mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
Packit 90a5c9
    if (_tcslen(szName))
Packit 90a5c9
    {
Packit 90a5c9
        mii.fType = MFT_STRING;
Packit 90a5c9
        mii.wID = uMenuId;
Packit 90a5c9
        if (fDefault) {
Packit 90a5c9
            mii.fState = MFS_DEFAULT;
Packit 90a5c9
        }
Packit 90a5c9
        if (!fEnabled) {
Packit 90a5c9
            mii.fState |= MFS_DISABLED;
Packit 90a5c9
        }
Packit 90a5c9
        mii.dwTypeData = szName;
Packit 90a5c9
    }
Packit 90a5c9
    else {
Packit 90a5c9
        mii.fType = MFT_SEPARATOR;
Packit 90a5c9
    }
Packit 90a5c9
    InsertMenuItem(hMenu, uMenuId, FALSE, &mii;;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
void appendServiceMenu(HMENU hMenu, UINT uMenuId,
Packit 90a5c9
                       LPTSTR szServiceName, BOOL fRunning)
Packit 90a5c9
{
Packit 90a5c9
    MENUITEMINFO mii;
Packit 90a5c9
    HMENU smh;
Packit 90a5c9
Packit 90a5c9
    smh = CreatePopupMenu();
Packit 90a5c9
Packit 90a5c9
    appendMenuItem(smh, IDM_SM_START + uMenuId,
Packit 90a5c9
                   g_lpMsg[IDS_MSG_SSTART - IDS_MSG_FIRST], FALSE, !fRunning);
Packit 90a5c9
    appendMenuItem(smh, IDM_SM_STOP + uMenuId,
Packit 90a5c9
                   g_lpMsg[IDS_MSG_SSTOP - IDS_MSG_FIRST], FALSE, fRunning);
Packit 90a5c9
    appendMenuItem(smh, IDM_SM_RESTART + uMenuId,
Packit 90a5c9
                   g_lpMsg[IDS_MSG_SRESTART - IDS_MSG_FIRST], FALSE, fRunning);
Packit 90a5c9
Packit 90a5c9
    memset(&mii, 0, sizeof(MENUITEMINFO));
Packit 90a5c9
    mii.cbSize = sizeof(MENUITEMINFO);
Packit 90a5c9
    mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU
Packit 90a5c9
              | MIIM_CHECKMARKS;
Packit 90a5c9
    mii.fType = MFT_STRING;
Packit 90a5c9
    mii.wID = uMenuId;
Packit 90a5c9
    mii.hbmpChecked = g_hBmpStart;
Packit 90a5c9
    mii.hbmpUnchecked = g_hBmpStop;
Packit 90a5c9
    mii.dwTypeData = szServiceName;
Packit 90a5c9
    mii.hSubMenu = smh;
Packit 90a5c9
    mii.fState = fRunning ? MFS_CHECKED : MFS_UNCHECKED;
Packit 90a5c9
    InsertMenuItem(hMenu, IDM_SM_SERVICE + uMenuId, FALSE, &mii;;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
void ShowTryPopupMenu(HWND hWnd)
Packit 90a5c9
{
Packit 90a5c9
    /* create popup menu */
Packit 90a5c9
    HMENU hMenu = CreatePopupMenu();
Packit 90a5c9
    POINT pt;
Packit 90a5c9
Packit 90a5c9
    if (hMenu)
Packit 90a5c9
    {
Packit 90a5c9
        appendMenuItem(hMenu, IDM_RESTORE,
Packit 90a5c9
                       g_lpMsg[IDS_MSG_MNUSHOW - IDS_MSG_FIRST],
Packit 90a5c9
                       TRUE, TRUE);
Packit 90a5c9
        appendMenuItem(hMenu, IDC_SMANAGER,
Packit 90a5c9
                       g_lpMsg[IDS_MSG_MNUSERVICES - IDS_MSG_FIRST],
Packit 90a5c9
                       FALSE, TRUE);
Packit 90a5c9
        appendMenuItem(hMenu, 0, _T(""), FALSE, TRUE);
Packit 90a5c9
        appendMenuItem(hMenu, IDM_EXIT,
Packit 90a5c9
                       g_lpMsg[IDS_MSG_MNUEXIT - IDS_MSG_FIRST],
Packit 90a5c9
                       FALSE, TRUE);
Packit 90a5c9
Packit 90a5c9
        if (!SetForegroundWindow(hWnd)) {
Packit 90a5c9
            SetForegroundWindow(NULL);
Packit 90a5c9
        }
Packit 90a5c9
        GetCursorPos(&pt;;
Packit 90a5c9
        TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON,
Packit 90a5c9
                       pt.x, pt.y, 0, hWnd, NULL);
Packit 90a5c9
        DestroyMenu(hMenu);
Packit 90a5c9
    }
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
void ShowTryServicesMenu(HWND hWnd)
Packit 90a5c9
{
Packit 90a5c9
    /* create services list popup menu and submenus */
Packit 90a5c9
    HMENU hMenu = CreatePopupMenu();
Packit 90a5c9
    POINT pt;
Packit 90a5c9
    int i = 0;
Packit 90a5c9
Packit 90a5c9
    if (hMenu)
Packit 90a5c9
    {
Packit 90a5c9
        while (g_stServices[i].szServiceName != NULL)
Packit 90a5c9
        {
Packit 90a5c9
            appendServiceMenu(hMenu, i, g_stServices[i].szDisplayName,
Packit 90a5c9
                              g_stServices[i].dwPid != 0);
Packit 90a5c9
            ++i;
Packit 90a5c9
        }
Packit 90a5c9
        if (i)
Packit 90a5c9
        {
Packit 90a5c9
            if (!SetForegroundWindow(hWnd)) {
Packit 90a5c9
                SetForegroundWindow(NULL);
Packit 90a5c9
            }
Packit 90a5c9
            GetCursorPos(&pt;;
Packit 90a5c9
            TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON,
Packit 90a5c9
                           pt.x, pt.y, 0, hWnd, NULL);
Packit 90a5c9
            DestroyMenu(hMenu);
Packit 90a5c9
        }
Packit 90a5c9
    }
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
BOOL CenterWindow(HWND hwndChild)
Packit 90a5c9
{
Packit 90a5c9
   RECT rChild, rWorkArea;
Packit 90a5c9
   int wChild, hChild;
Packit 90a5c9
   int xNew, yNew;
Packit 90a5c9
   BOOL bResult;
Packit 90a5c9
Packit 90a5c9
   /* Get the Height and Width of the child window */
Packit 90a5c9
   GetWindowRect(hwndChild, &rChild);
Packit 90a5c9
   wChild = rChild.right - rChild.left;
Packit 90a5c9
   hChild = rChild.bottom - rChild.top;
Packit 90a5c9
Packit 90a5c9
   /* Get the limits of the 'workarea' */
Packit 90a5c9
   bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT),
Packit 90a5c9
                                  &rWorkArea, 0);
Packit 90a5c9
   if (!bResult) {
Packit 90a5c9
      rWorkArea.left = rWorkArea.top = 0;
Packit 90a5c9
      rWorkArea.right = GetSystemMetrics(SM_CXSCREEN);
Packit 90a5c9
      rWorkArea.bottom = GetSystemMetrics(SM_CYSCREEN);
Packit 90a5c9
   }
Packit 90a5c9
Packit 90a5c9
   /* Calculate new X and Y position*/
Packit 90a5c9
   xNew = (rWorkArea.right - wChild) / 2;
Packit 90a5c9
   yNew = (rWorkArea.bottom - hChild) / 2;
Packit 90a5c9
   return SetWindowPos(hwndChild, HWND_TOP, xNew, yNew, 0, 0,
Packit 90a5c9
                       SWP_NOSIZE | SWP_SHOWWINDOW);
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
static void addListBoxItem(HWND hDlg, LPTSTR lpStr, HBITMAP hBmp)
Packit 90a5c9
{
Packit 90a5c9
    LRESULT nItem;
Packit 90a5c9
Packit 90a5c9
    nItem = SendMessage(hDlg, LB_ADDSTRING, 0, (LPARAM)lpStr);
Packit 90a5c9
    SendMessage(hDlg, LB_SETITEMDATA, nItem, (LPARAM)hBmp);
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
static void addListBoxString(HWND hListBox, LPTSTR lpStr)
Packit 90a5c9
{
Packit 90a5c9
    static int nItems = 0;
Packit 90a5c9
    if (!g_bDlgServiceOn) {
Packit 90a5c9
        return;
Packit 90a5c9
    }
Packit 90a5c9
    ++nItems;
Packit 90a5c9
    if (nItems > MAX_LOADSTRING)
Packit 90a5c9
    {
Packit 90a5c9
        SendMessage(hListBox, LB_RESETCONTENT, 0, 0);
Packit 90a5c9
        nItems = 1;
Packit 90a5c9
    }
Packit 90a5c9
    ListBox_SetCurSel(hListBox,
Packit 90a5c9
                      ListBox_AddString(hListBox, lpStr));
Packit 90a5c9
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
BOOL ApacheManageService(LPCTSTR szServiceName, LPCTSTR szImagePath,
Packit 90a5c9
                         LPTSTR szComputerName, DWORD dwCommand)
Packit 90a5c9
{
Packit 90a5c9
    TCHAR szMsg[MAX_PATH];
Packit 90a5c9
    BOOL retValue;
Packit 90a5c9
    SC_HANDLE schService;
Packit 90a5c9
    SC_HANDLE schSCManager;
Packit 90a5c9
    SERVICE_STATUS schSStatus;
Packit 90a5c9
    int ticks;
Packit 90a5c9
Packit 90a5c9
    schSCManager = OpenSCManager(szComputerName, NULL,
Packit 90a5c9
                                 SC_MANAGER_CONNECT);
Packit 90a5c9
    if (!schSCManager) {
Packit 90a5c9
        ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST],
Packit 90a5c9
                     FALSE);
Packit 90a5c9
        return FALSE;
Packit 90a5c9
    }
Packit 90a5c9
Packit 90a5c9
    schService = OpenService(schSCManager, szServiceName,
Packit 90a5c9
                             SERVICE_QUERY_STATUS | SERVICE_START |
Packit 90a5c9
                             SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL);
Packit 90a5c9
    if (schService == NULL)
Packit 90a5c9
    {
Packit 90a5c9
        /* Avoid recursion of ImagePath NULL (from this Respawn) */
Packit 90a5c9
        if (szImagePath) {
Packit 90a5c9
            am_RespawnAsUserAdmin(g_hwndMain, dwCommand,
Packit 90a5c9
                                  szServiceName, szComputerName);
Packit 90a5c9
        }
Packit 90a5c9
        else {
Packit 90a5c9
            ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST],
Packit 90a5c9
                         FALSE);
Packit 90a5c9
        }
Packit 90a5c9
        CloseServiceHandle(schSCManager);
Packit 90a5c9
        return FALSE;
Packit 90a5c9
    }
Packit 90a5c9
    else
Packit 90a5c9
    {
Packit 90a5c9
        retValue = FALSE;
Packit 90a5c9
        g_bConsoleRun = TRUE;
Packit 90a5c9
        SetCursor(g_hCursorHourglass);
Packit 90a5c9
        switch (dwCommand)
Packit 90a5c9
        {
Packit 90a5c9
          case SERVICE_CONTROL_STOP:
Packit 90a5c9
            _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR),
Packit 90a5c9
                       g_lpMsg[IDS_MSG_SRVSTOP - IDS_MSG_FIRST],
Packit 90a5c9
                       szServiceName);
Packit 90a5c9
            addListBoxString(g_hwndStdoutList, szMsg);
Packit 90a5c9
            if (ControlService(schService, SERVICE_CONTROL_STOP,
Packit 90a5c9
                               &schSStatus)) {
Packit 90a5c9
                Sleep(1000);
Packit 90a5c9
                while (QueryServiceStatus(schService, &schSStatus))
Packit 90a5c9
                {
Packit 90a5c9
                    if (schSStatus.dwCurrentState == SERVICE_STOP_PENDING)
Packit 90a5c9
                    {
Packit 90a5c9
                        Sleep(1000);
Packit 90a5c9
                    }
Packit 90a5c9
                    else {
Packit 90a5c9
                        break;
Packit 90a5c9
                    }
Packit 90a5c9
                }
Packit 90a5c9
            }
Packit 90a5c9
            if (QueryServiceStatus(schService, &schSStatus))
Packit 90a5c9
            {
Packit 90a5c9
                if (schSStatus.dwCurrentState == SERVICE_STOPPED)
Packit 90a5c9
                {
Packit 90a5c9
                    retValue = TRUE;
Packit 90a5c9
                    _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR),
Packit 90a5c9
                               g_lpMsg[IDS_MSG_SRVSTOPPED - IDS_MSG_FIRST],
Packit 90a5c9
                               szServiceName);
Packit 90a5c9
                    addListBoxString(g_hwndStdoutList, szMsg);
Packit 90a5c9
                }
Packit 90a5c9
            }
Packit 90a5c9
            break;
Packit 90a5c9
Packit 90a5c9
          case SERVICE_CONTROL_CONTINUE:
Packit 90a5c9
            _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR),
Packit 90a5c9
                       g_lpMsg[IDS_MSG_SRVSTART - IDS_MSG_FIRST],
Packit 90a5c9
                       szServiceName);
Packit 90a5c9
            addListBoxString(g_hwndStdoutList, szMsg);
Packit 90a5c9
Packit 90a5c9
            if (StartService(schService, 0, NULL))
Packit 90a5c9
            {
Packit 90a5c9
                Sleep(1000);
Packit 90a5c9
                while (QueryServiceStatus(schService, &schSStatus))
Packit 90a5c9
                {
Packit 90a5c9
                    if (schSStatus.dwCurrentState == SERVICE_START_PENDING)
Packit 90a5c9
                    {
Packit 90a5c9
                        Sleep(1000);
Packit 90a5c9
                    }
Packit 90a5c9
                    else {
Packit 90a5c9
                        break;
Packit 90a5c9
                    }
Packit 90a5c9
                }
Packit 90a5c9
            }
Packit 90a5c9
            if (QueryServiceStatus(schService, &schSStatus))
Packit 90a5c9
            {
Packit 90a5c9
                if (schSStatus.dwCurrentState == SERVICE_RUNNING)
Packit 90a5c9
                {
Packit 90a5c9
                    retValue = TRUE;
Packit 90a5c9
                    _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR),
Packit 90a5c9
                               g_lpMsg[IDS_MSG_SRVSTARTED - IDS_MSG_FIRST],
Packit 90a5c9
                               szServiceName);
Packit 90a5c9
                    addListBoxString(g_hwndStdoutList, szMsg);
Packit 90a5c9
                }
Packit 90a5c9
            }
Packit 90a5c9
            break;
Packit 90a5c9
Packit 90a5c9
          case SERVICE_APACHE_RESTART:
Packit 90a5c9
            _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR),
Packit 90a5c9
                       g_lpMsg[IDS_MSG_SRVRESTART - IDS_MSG_FIRST],
Packit 90a5c9
                       szServiceName);
Packit 90a5c9
            addListBoxString(g_hwndStdoutList, szMsg);
Packit 90a5c9
            if (ControlService(schService, SERVICE_APACHE_RESTART,
Packit 90a5c9
                               &schSStatus))
Packit 90a5c9
            {
Packit 90a5c9
                ticks = 60;
Packit 90a5c9
                while (schSStatus.dwCurrentState == SERVICE_START_PENDING)
Packit 90a5c9
                {
Packit 90a5c9
                    Sleep(1000);
Packit 90a5c9
                    if (!QueryServiceStatus(schService, &schSStatus))
Packit 90a5c9
                    {
Packit 90a5c9
                        CloseServiceHandle(schService);
Packit 90a5c9
                        CloseServiceHandle(schSCManager);
Packit 90a5c9
                        g_bConsoleRun = FALSE;
Packit 90a5c9
                        SetCursor(g_hCursorArrow);
Packit 90a5c9
                        return FALSE;
Packit 90a5c9
                    }
Packit 90a5c9
                    if (!--ticks) {
Packit 90a5c9
                        break;
Packit 90a5c9
                    }
Packit 90a5c9
                }
Packit 90a5c9
            }
Packit 90a5c9
            if (schSStatus.dwCurrentState == SERVICE_RUNNING)
Packit 90a5c9
            {
Packit 90a5c9
                retValue = TRUE;
Packit 90a5c9
                _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR),
Packit 90a5c9
                           g_lpMsg[IDS_MSG_SRVRESTARTED - IDS_MSG_FIRST],
Packit 90a5c9
                           szServiceName);
Packit 90a5c9
                addListBoxString(g_hwndStdoutList, szMsg);
Packit 90a5c9
            }
Packit 90a5c9
            break;
Packit 90a5c9
        }
Packit 90a5c9
        CloseServiceHandle(schService);
Packit 90a5c9
        CloseServiceHandle(schSCManager);
Packit 90a5c9
        if (!retValue) {
Packit 90a5c9
            ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST],
Packit 90a5c9
                         FALSE);
Packit 90a5c9
        }
Packit 90a5c9
        g_bConsoleRun = FALSE;
Packit 90a5c9
        SetCursor(g_hCursorArrow);
Packit 90a5c9
        return retValue;
Packit 90a5c9
    }
Packit 90a5c9
    return FALSE;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
BOOL IsServiceRunning(LPCTSTR szServiceName, LPCTSTR szComputerName,
Packit 90a5c9
                      LPDWORD lpdwPid)
Packit 90a5c9
{
Packit 90a5c9
    DWORD dwPid;
Packit 90a5c9
    SC_HANDLE schService;
Packit 90a5c9
    SC_HANDLE schSCManager;
Packit 90a5c9
    SERVICE_STATUS schSStatus;
Packit 90a5c9
Packit 90a5c9
    dwPid = 0;
Packit 90a5c9
    schSCManager = OpenSCManager(szComputerName, NULL,
Packit 90a5c9
                                SC_MANAGER_CONNECT);
Packit 90a5c9
    if (!schSCManager) {
Packit 90a5c9
        return FALSE;
Packit 90a5c9
    }
Packit 90a5c9
Packit 90a5c9
    schService = OpenService(schSCManager, szServiceName,
Packit 90a5c9
                             SERVICE_QUERY_STATUS);
Packit 90a5c9
    if (schService != NULL)
Packit 90a5c9
    {
Packit 90a5c9
        if (QueryServiceStatus(schService, &schSStatus))
Packit 90a5c9
        {
Packit 90a5c9
            dwPid = schSStatus.dwCurrentState;
Packit 90a5c9
            if (lpdwPid) {
Packit 90a5c9
                *lpdwPid = 1;
Packit 90a5c9
            }
Packit 90a5c9
        }
Packit 90a5c9
        CloseServiceHandle(schService);
Packit 90a5c9
        CloseServiceHandle(schSCManager);
Packit 90a5c9
        return dwPid == SERVICE_RUNNING ? TRUE : FALSE;
Packit 90a5c9
    }
Packit 90a5c9
    else {
Packit 90a5c9
        g_bRescanServices = TRUE;
Packit 90a5c9
    }
Packit 90a5c9
    CloseServiceHandle(schSCManager);
Packit 90a5c9
    return FALSE;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
BOOL FindRunningServices(void)
Packit 90a5c9
{
Packit 90a5c9
    int i = 0;
Packit 90a5c9
    DWORD dwPid;
Packit 90a5c9
    BOOL rv = FALSE;
Packit 90a5c9
    while (g_stServices[i].szServiceName != NULL)
Packit 90a5c9
    {
Packit 90a5c9
        if (!IsServiceRunning(g_stServices[i].szServiceName,
Packit 90a5c9
                              g_stServices[i].szComputerName, &dwPid)) {
Packit 90a5c9
            dwPid = 0;
Packit 90a5c9
        }
Packit 90a5c9
        if (g_stServices[i].dwPid != dwPid) {
Packit 90a5c9
            rv = TRUE;
Packit 90a5c9
        }
Packit 90a5c9
        g_stServices[i].dwPid = dwPid;
Packit 90a5c9
        ++i;
Packit 90a5c9
    }
Packit 90a5c9
    return rv;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
BOOL GetApacheServicesStatus()
Packit 90a5c9
{
Packit 90a5c9
    TCHAR szKey[MAX_PATH];
Packit 90a5c9
    TCHAR achKey[MAX_PATH];
Packit 90a5c9
    TCHAR szImagePath[MAX_PATH];
Packit 90a5c9
    TCHAR szBuf[MAX_PATH];
Packit 90a5c9
    TCHAR szTmp[MAX_PATH];
Packit 90a5c9
    HKEY hKey, hSubKey, hKeyRemote;
Packit 90a5c9
    DWORD retCode, rv, dwKeyType;
Packit 90a5c9
    DWORD dwBufLen = MAX_PATH;
Packit 90a5c9
    int i, stPos = 0;
Packit 90a5c9
    int computers = 0;
Packit 90a5c9
Packit 90a5c9
    g_bRescanServices = FALSE;
Packit 90a5c9
Packit 90a5c9
    am_ClearServicesSt();
Packit 90a5c9
    while (g_stComputers[computers].szComputerName != NULL) {
Packit 90a5c9
        hKeyRemote = g_stComputers[computers].hRegistry;
Packit 90a5c9
        retCode = RegOpenKeyEx(hKeyRemote,
Packit 90a5c9
                               _T("System\\CurrentControlSet\\Services\\"),
Packit 90a5c9
                               0, KEY_READ, &hKey);
Packit 90a5c9
        if (retCode != ERROR_SUCCESS)
Packit 90a5c9
        {
Packit 90a5c9
            ErrorMessage(NULL, FALSE);
Packit 90a5c9
            return FALSE;
Packit 90a5c9
        }
Packit 90a5c9
        for (i = 0, retCode = ERROR_SUCCESS; retCode == ERROR_SUCCESS; i++)
Packit 90a5c9
        {
Packit 90a5c9
            retCode = RegEnumKey(hKey, i, achKey, MAX_PATH);
Packit 90a5c9
            if (retCode == ERROR_SUCCESS)
Packit 90a5c9
            {
Packit 90a5c9
                _tcscpy(szKey, _T("System\\CurrentControlSet\\Services\\"));
Packit 90a5c9
                _tcscat(szKey, achKey);
Packit 90a5c9
Packit 90a5c9
                if (RegOpenKeyEx(hKeyRemote, szKey, 0,
Packit 90a5c9
                                 KEY_QUERY_VALUE, &hSubKey) == ERROR_SUCCESS)
Packit 90a5c9
                {
Packit 90a5c9
                    dwBufLen = MAX_PATH;
Packit 90a5c9
                    rv = RegQueryValueEx(hSubKey, _T("ImagePath"), NULL,
Packit 90a5c9
                                         &dwKeyType, (LPBYTE)szImagePath, &dwBufLen);
Packit 90a5c9
Packit 90a5c9
                    if (rv == ERROR_SUCCESS
Packit 90a5c9
                            && (dwKeyType == REG_SZ
Packit 90a5c9
                             || dwKeyType == REG_EXPAND_SZ)
Packit 90a5c9
                            && dwBufLen)
Packit 90a5c9
                    {
Packit 90a5c9
                        _tcscpy(szBuf, szImagePath);
Packit 90a5c9
                        CharLower(szBuf);
Packit 90a5c9
                        /* the service name could be httpd*.exe or Apache*.exe */
Packit 90a5c9
                        if (((_tcsstr(szBuf, _T("\\apache")) != NULL)
Packit 90a5c9
                             || (_tcsstr(szBuf, _T("\\httpd")) != NULL))
Packit 90a5c9
                                && _tcsstr(szBuf, _T(".exe"))
Packit 90a5c9
                                && (_tcsstr(szBuf, _T("--ntservice")) != NULL
Packit 90a5c9
                                       || _tcsstr(szBuf, _T("-k ")) != NULL))
Packit 90a5c9
                        {
Packit 90a5c9
                            g_stServices[stPos].szServiceName = _tcsdup(achKey);
Packit 90a5c9
                            g_stServices[stPos].szImagePath = _tcsdup(szImagePath);
Packit 90a5c9
                            g_stServices[stPos].szComputerName =
Packit 90a5c9
                                _tcsdup(g_stComputers[computers].szComputerName);
Packit 90a5c9
                            dwBufLen = MAX_PATH;
Packit 90a5c9
                            if (RegQueryValueEx(hSubKey, _T("Description"), NULL,
Packit 90a5c9
                                                &dwKeyType, (LPBYTE)szBuf, &dwBufLen)
Packit 90a5c9
                                    == ERROR_SUCCESS) {
Packit 90a5c9
                                g_stServices[stPos].szDescription = _tcsdup(szBuf);
Packit 90a5c9
                            }
Packit 90a5c9
                            dwBufLen = MAX_PATH;
Packit 90a5c9
                            if (RegQueryValueEx(hSubKey, _T("DisplayName"), NULL,
Packit 90a5c9
                                                &dwKeyType, (LPBYTE)szBuf, &dwBufLen)
Packit 90a5c9
                                    == ERROR_SUCCESS)
Packit 90a5c9
                            {
Packit 90a5c9
                                if (_tcscmp(g_stComputers[computers]
Packit 90a5c9
                                        .szComputerName, g_szLocalHost) != 0)
Packit 90a5c9
                                {
Packit 90a5c9
                                    _tcscpy(szTmp, g_stComputers[computers]
Packit 90a5c9
                                                      .szComputerName + 2);
Packit 90a5c9
                                    _tcscat(szTmp, _T("@"));
Packit 90a5c9
                                    _tcscat(szTmp, szBuf);
Packit 90a5c9
                                }
Packit 90a5c9
                                else {
Packit 90a5c9
                                    _tcscpy(szTmp, szBuf);
Packit 90a5c9
                                }
Packit 90a5c9
                                g_stServices[stPos].szDisplayName = _tcsdup(szTmp);
Packit 90a5c9
Packit 90a5c9
                            }
Packit 90a5c9
                            ++stPos;
Packit 90a5c9
                            if (stPos >= MAX_APACHE_SERVICES) {
Packit 90a5c9
                                retCode = !ERROR_SUCCESS;
Packit 90a5c9
                            }
Packit 90a5c9
                        }
Packit 90a5c9
                    }
Packit 90a5c9
                    RegCloseKey(hSubKey);
Packit 90a5c9
                }
Packit 90a5c9
            }
Packit 90a5c9
        }
Packit 90a5c9
        ++computers;
Packit 90a5c9
        RegCloseKey(hKey);
Packit 90a5c9
    }
Packit 90a5c9
    FindRunningServices();
Packit 90a5c9
    return TRUE;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
LRESULT CALLBACK ConnectDlgProc(HWND hDlg, UINT message,
Packit 90a5c9
                                WPARAM wParam, LPARAM lParam)
Packit 90a5c9
{
Packit 90a5c9
    TCHAR szCmp[MAX_COMPUTERNAME_LENGTH+4];
Packit 90a5c9
    switch (message)
Packit 90a5c9
    {
Packit 90a5c9
    case WM_INITDIALOG:
Packit 90a5c9
        ShowWindow(hDlg, SW_HIDE);
Packit 90a5c9
        g_hwndConnectDlg = hDlg;
Packit 90a5c9
        CenterWindow(hDlg);
Packit 90a5c9
        ShowWindow(hDlg, SW_SHOW);
Packit 90a5c9
        SetFocus(GetDlgItem(hDlg, IDC_COMPUTER));
Packit 90a5c9
        return TRUE;
Packit 90a5c9
Packit 90a5c9
    case WM_COMMAND:
Packit 90a5c9
        switch (LOWORD(wParam))
Packit 90a5c9
        {
Packit 90a5c9
        case IDOK:
Packit 90a5c9
            memset(szCmp, 0, sizeof(szCmp));
Packit 90a5c9
            _tcscpy(szCmp, _T("\\\\"));
Packit 90a5c9
            SendMessage(GetDlgItem(hDlg, IDC_COMPUTER), WM_GETTEXT,
Packit 90a5c9
                        (WPARAM) MAX_COMPUTERNAME_LENGTH,
Packit 90a5c9
                        (LPARAM) szCmp+2);
Packit 90a5c9
Packit 90a5c9
            _tcsupr(szCmp);
Packit 90a5c9
            if (_tcslen(szCmp) < 3) {
Packit 90a5c9
                EndDialog(hDlg, TRUE);
Packit 90a5c9
                return TRUE;
Packit 90a5c9
            }
Packit 90a5c9
            am_ConnectComputer(szCmp);
Packit 90a5c9
            SendMessage(g_hwndMain, WM_TIMER, WM_TIMER_RESCAN, 0);
Packit 90a5c9
Packit 90a5c9
        case IDCANCEL:
Packit 90a5c9
            EndDialog(hDlg, TRUE);
Packit 90a5c9
            return TRUE;
Packit 90a5c9
Packit 90a5c9
        case IDC_LBROWSE:
Packit 90a5c9
        {
Packit 90a5c9
            BROWSEINFO bi;
Packit 90a5c9
            ITEMIDLIST *il;
Packit 90a5c9
            LPMALLOC pMalloc;
Packit 90a5c9
            memset(&bi, 0, sizeof(BROWSEINFO));
Packit 90a5c9
            SHGetSpecialFolderLocation(hDlg, CSIDL_NETWORK, &il;;
Packit 90a5c9
Packit 90a5c9
            bi.lpszTitle      = _T("ApacheMonitor :\nSelect Network Computer!");
Packit 90a5c9
            bi.pszDisplayName = szCmp;
Packit 90a5c9
            bi.hwndOwner =      hDlg;
Packit 90a5c9
            bi.ulFlags =        BIF_BROWSEFORCOMPUTER;
Packit 90a5c9
            bi.lpfn =           NULL;
Packit 90a5c9
            bi.lParam =         0;
Packit 90a5c9
            bi.iImage =         0;
Packit 90a5c9
            bi.pidlRoot =       il;
Packit 90a5c9
Packit 90a5c9
            if (SHBrowseForFolder(&bi) != NULL) {
Packit 90a5c9
                SendMessage(GetDlgItem(hDlg, IDC_COMPUTER),
Packit 90a5c9
                            WM_SETTEXT,
Packit 90a5c9
                            (WPARAM) NULL, (LPARAM) szCmp);
Packit 90a5c9
            }
Packit 90a5c9
            if (SUCCEEDED(SHGetMalloc(&pMalloc))) {
Packit 90a5c9
                pMalloc->lpVtbl->Free(pMalloc, il);
Packit 90a5c9
                pMalloc->lpVtbl->Release(pMalloc);
Packit 90a5c9
            }
Packit 90a5c9
            return TRUE;
Packit 90a5c9
        }
Packit 90a5c9
        }
Packit 90a5c9
        break;
Packit 90a5c9
Packit 90a5c9
    case WM_QUIT:
Packit 90a5c9
    case WM_CLOSE:
Packit 90a5c9
        EndDialog(hDlg, TRUE);
Packit 90a5c9
        return TRUE;
Packit 90a5c9
Packit 90a5c9
    default:
Packit 90a5c9
        return FALSE;
Packit 90a5c9
    }
Packit 90a5c9
    return FALSE;
Packit 90a5c9
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
LRESULT CALLBACK ServiceDlgProc(HWND hDlg, UINT message,
Packit 90a5c9
                                WPARAM wParam, LPARAM lParam)
Packit 90a5c9
{
Packit 90a5c9
    TCHAR szBuf[MAX_PATH];
Packit 90a5c9
    HWND hListBox;
Packit 90a5c9
    static HWND hStatusBar;
Packit 90a5c9
    TEXTMETRIC tm;
Packit 90a5c9
    int i, y;
Packit 90a5c9
    HDC hdcMem;
Packit 90a5c9
    RECT rcBitmap;
Packit 90a5c9
    LRESULT nItem;
Packit 90a5c9
    LPMEASUREITEMSTRUCT lpmis;
Packit 90a5c9
    LPDRAWITEMSTRUCT lpdis;
Packit 90a5c9
Packit 90a5c9
    memset(szBuf, 0, sizeof(szBuf));
Packit 90a5c9
    switch (message)
Packit 90a5c9
    {
Packit 90a5c9
    case WM_INITDIALOG:
Packit 90a5c9
        ShowWindow(hDlg, SW_HIDE);
Packit 90a5c9
        g_hwndServiceDlg = hDlg;
Packit 90a5c9
        SetWindowText(hDlg, g_szTitle);
Packit 90a5c9
        Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE);
Packit 90a5c9
        Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE);
Packit 90a5c9
        Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE);
Packit 90a5c9
        Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), FALSE);
Packit 90a5c9
        SetWindowText(GetDlgItem(hDlg, IDC_SSTART),
Packit 90a5c9
                      g_lpMsg[IDS_MSG_SSTART - IDS_MSG_FIRST]);
Packit 90a5c9
        SetWindowText(GetDlgItem(hDlg, IDC_SSTOP),
Packit 90a5c9
                      g_lpMsg[IDS_MSG_SSTOP - IDS_MSG_FIRST]);
Packit 90a5c9
        SetWindowText(GetDlgItem(hDlg, IDC_SRESTART),
Packit 90a5c9
                      g_lpMsg[IDS_MSG_SRESTART - IDS_MSG_FIRST]);
Packit 90a5c9
        SetWindowText(GetDlgItem(hDlg, IDC_SMANAGER),
Packit 90a5c9
                      g_lpMsg[IDS_MSG_SERVICES - IDS_MSG_FIRST]);
Packit 90a5c9
        SetWindowText(GetDlgItem(hDlg, IDC_SCONNECT),
Packit 90a5c9
                      g_lpMsg[IDS_MSG_CONNECT - IDS_MSG_FIRST]);
Packit 90a5c9
        SetWindowText(GetDlgItem(hDlg, IDCANCEL),
Packit 90a5c9
                      g_lpMsg[IDS_MSG_OK - IDS_MSG_FIRST]);
Packit 90a5c9
        hListBox = GetDlgItem(hDlg, IDL_SERVICES);
Packit 90a5c9
        g_hwndStdoutList = GetDlgItem(hDlg, IDL_STDOUT);
Packit 90a5c9
        hStatusBar = CreateStatusWindow(0x0800 /* SBT_TOOLTIPS */
Packit 90a5c9
                                      | WS_CHILD | WS_VISIBLE,
Packit 90a5c9
                                        _T(""), hDlg, IDC_STATBAR);
Packit 90a5c9
        if (GetApacheServicesStatus())
Packit 90a5c9
        {
Packit 90a5c9
            i = 0;
Packit 90a5c9
            while (g_stServices[i].szServiceName != NULL)
Packit 90a5c9
            {
Packit 90a5c9
                addListBoxItem(hListBox, g_stServices[i].szDisplayName,
Packit 90a5c9
                               g_stServices[i].dwPid == 0 ? g_hBmpStop
Packit 90a5c9
                                                          : g_hBmpStart);
Packit 90a5c9
                ++i;
Packit 90a5c9
            }
Packit 90a5c9
        }
Packit 90a5c9
        CenterWindow(hDlg);
Packit 90a5c9
        ShowWindow(hDlg, SW_SHOW);
Packit 90a5c9
        SetFocus(hListBox);
Packit 90a5c9
        SendMessage(hListBox, LB_SETCURSEL, 0, 0);
Packit 90a5c9
        return TRUE;
Packit 90a5c9
        break;
Packit 90a5c9
Packit 90a5c9
    case WM_MANAGEMESSAGE:
Packit 90a5c9
        ApacheManageService(g_stServices[LOWORD(wParam)].szServiceName,
Packit 90a5c9
                    g_stServices[LOWORD(wParam)].szImagePath,
Packit 90a5c9
                    g_stServices[LOWORD(wParam)].szComputerName,
Packit 90a5c9
                    LOWORD(lParam));
Packit 90a5c9
Packit 90a5c9
        return TRUE;
Packit 90a5c9
        break;
Packit 90a5c9
Packit 90a5c9
    case WM_UPDATEMESSAGE:
Packit 90a5c9
        hListBox = GetDlgItem(hDlg, IDL_SERVICES);
Packit 90a5c9
        SendMessage(hListBox, LB_RESETCONTENT, 0, 0);
Packit 90a5c9
        SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)_T(""));
Packit 90a5c9
        Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE);
Packit 90a5c9
        Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE);
Packit 90a5c9
        Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE);
Packit 90a5c9
        Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), FALSE);
Packit 90a5c9
        i = 0;
Packit 90a5c9
        while (g_stServices[i].szServiceName != NULL)
Packit 90a5c9
        {
Packit 90a5c9
            addListBoxItem(hListBox, g_stServices[i].szDisplayName,
Packit 90a5c9
                g_stServices[i].dwPid == 0 ? g_hBmpStop : g_hBmpStart);
Packit 90a5c9
            ++i;
Packit 90a5c9
        }
Packit 90a5c9
        SendMessage(hListBox, LB_SETCURSEL, 0, 0);
Packit 90a5c9
        /* Dirty hack to bring the window to the foreground */
Packit 90a5c9
        SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0,
Packit 90a5c9
                                SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
Packit 90a5c9
        SetWindowPos(hDlg, HWND_NOTOPMOST, 0, 0, 0, 0,
Packit 90a5c9
                                SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
Packit 90a5c9
        SetFocus(hListBox);
Packit 90a5c9
        return TRUE;
Packit 90a5c9
        break;
Packit 90a5c9
Packit 90a5c9
    case WM_MEASUREITEM:
Packit 90a5c9
        lpmis = (LPMEASUREITEMSTRUCT) lParam;
Packit 90a5c9
        lpmis->itemHeight = YBITMAP;
Packit 90a5c9
        return TRUE;
Packit 90a5c9
Packit 90a5c9
    case WM_SETCURSOR:
Packit 90a5c9
        if (g_bConsoleRun) {
Packit 90a5c9
            SetCursor(g_hCursorHourglass);
Packit 90a5c9
        }
Packit 90a5c9
        else {
Packit 90a5c9
            SetCursor(g_hCursorArrow);
Packit 90a5c9
        }
Packit 90a5c9
        return TRUE;
Packit 90a5c9
Packit 90a5c9
    case WM_DRAWITEM:
Packit 90a5c9
        lpdis = (LPDRAWITEMSTRUCT) lParam;
Packit 90a5c9
        if (lpdis->itemID == -1) {
Packit 90a5c9
            break;
Packit 90a5c9
        }
Packit 90a5c9
        switch (lpdis->itemAction)
Packit 90a5c9
        {
Packit 90a5c9
        case ODA_FOCUS:
Packit 90a5c9
        case ODA_SELECT:
Packit 90a5c9
        case ODA_DRAWENTIRE:
Packit 90a5c9
            g_hBmpPicture = (HBITMAP)SendMessage(lpdis->hwndItem,
Packit 90a5c9
                                                 LB_GETITEMDATA,
Packit 90a5c9
                                                 lpdis->itemID, (LPARAM) 0);
Packit 90a5c9
Packit 90a5c9
            hdcMem = CreateCompatibleDC(lpdis->hDC);
Packit 90a5c9
            g_hBmpOld = SelectObject(hdcMem, g_hBmpPicture);
Packit 90a5c9
Packit 90a5c9
            BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top,
Packit 90a5c9
                   lpdis->rcItem.right - lpdis->rcItem.left,
Packit 90a5c9
                   lpdis->rcItem.bottom - lpdis->rcItem.top,
Packit 90a5c9
                   hdcMem, 0, 0, SRCCOPY);
Packit 90a5c9
            SendMessage(lpdis->hwndItem, LB_GETTEXT,
Packit 90a5c9
                        lpdis->itemID, (LPARAM) szBuf);
Packit 90a5c9
Packit 90a5c9
            GetTextMetrics(lpdis->hDC, &tm;;
Packit 90a5c9
            y = (lpdis->rcItem.bottom + lpdis->rcItem.top - tm.tmHeight) / 2;
Packit 90a5c9
Packit 90a5c9
            SelectObject(hdcMem, g_hBmpOld);
Packit 90a5c9
            DeleteDC(hdcMem);
Packit 90a5c9
Packit 90a5c9
            rcBitmap.left = lpdis->rcItem.left + XBITMAP + 2;
Packit 90a5c9
            rcBitmap.top = lpdis->rcItem.top;
Packit 90a5c9
            rcBitmap.right = lpdis->rcItem.right;
Packit 90a5c9
            rcBitmap.bottom = lpdis->rcItem.top + YBITMAP;
Packit 90a5c9
Packit 90a5c9
            if (lpdis->itemState & ODS_SELECTED)
Packit 90a5c9
            {
Packit 90a5c9
                if (g_hBmpPicture == g_hBmpStop)
Packit 90a5c9
                {
Packit 90a5c9
                    Button_Enable(GetDlgItem(hDlg, IDC_SSTART), TRUE);
Packit 90a5c9
                    Button_SetStyle(GetDlgItem(hDlg, IDC_SSTART), BS_DEFPUSHBUTTON, TRUE);
Packit 90a5c9
                    Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE);
Packit 90a5c9
                    Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE);
Packit 90a5c9
                }
Packit 90a5c9
                else if (g_hBmpPicture == g_hBmpStart)
Packit 90a5c9
                {
Packit 90a5c9
                    Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE);
Packit 90a5c9
                    Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), TRUE);
Packit 90a5c9
                    Button_SetStyle(GetDlgItem(hDlg, IDC_SSTOP), BS_DEFPUSHBUTTON, TRUE);
Packit 90a5c9
                    Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), TRUE);
Packit 90a5c9
                }
Packit 90a5c9
                else {
Packit 90a5c9
                    Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE);
Packit 90a5c9
                    Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE);
Packit 90a5c9
                    Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE);
Packit 90a5c9
                }
Packit 90a5c9
                if (_tcscmp(g_stServices[lpdis->itemID].szComputerName,
Packit 90a5c9
                           g_szLocalHost) == 0) {
Packit 90a5c9
                    Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), FALSE);
Packit 90a5c9
                }
Packit 90a5c9
                else {
Packit 90a5c9
                    Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), TRUE);
Packit 90a5c9
                }
Packit 90a5c9
Packit 90a5c9
                if (g_stServices[lpdis->itemID].szDescription) {
Packit 90a5c9
                    SendMessage(hStatusBar, SB_SETTEXT, 0,
Packit 90a5c9
                            (LPARAM)g_stServices[lpdis->itemID].szDescription);
Packit 90a5c9
                }
Packit 90a5c9
                else {
Packit 90a5c9
                    SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)_T(""));
Packit 90a5c9
                }
Packit 90a5c9
                if (lpdis->itemState & ODS_FOCUS) {
Packit 90a5c9
                    SetTextColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
Packit 90a5c9
                    SetBkColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT));
Packit 90a5c9
                    FillRect(lpdis->hDC, &rcBitmap, (HBRUSH)(COLOR_HIGHLIGHT+1));
Packit 90a5c9
                }
Packit 90a5c9
                else {
Packit 90a5c9
                    SetTextColor(lpdis->hDC, GetSysColor(COLOR_INACTIVECAPTIONTEXT));
Packit 90a5c9
                    SetBkColor(lpdis->hDC, GetSysColor(COLOR_INACTIVECAPTION));
Packit 90a5c9
                    FillRect(lpdis->hDC, &rcBitmap, (HBRUSH)(COLOR_INACTIVECAPTION+1));
Packit 90a5c9
                }
Packit 90a5c9
            }
Packit 90a5c9
            else
Packit 90a5c9
            {
Packit 90a5c9
               SetTextColor(lpdis->hDC, GetSysColor(COLOR_MENUTEXT));
Packit 90a5c9
               SetBkColor(lpdis->hDC, GetSysColor(COLOR_WINDOW));
Packit 90a5c9
               FillRect(lpdis->hDC, &rcBitmap, (HBRUSH)(COLOR_WINDOW+1));
Packit 90a5c9
            }
Packit 90a5c9
            TextOut(lpdis->hDC, XBITMAP + 6, y, szBuf, (int)_tcslen(szBuf));
Packit 90a5c9
            break;
Packit 90a5c9
        }
Packit 90a5c9
        return TRUE;
Packit 90a5c9
    case WM_COMMAND:
Packit 90a5c9
        switch (LOWORD(wParam))
Packit 90a5c9
        {
Packit 90a5c9
        case IDL_SERVICES:
Packit 90a5c9
            switch (HIWORD(wParam))
Packit 90a5c9
            {
Packit 90a5c9
            case LBN_DBLCLK:
Packit 90a5c9
                /* if started then stop, if stopped then start */
Packit 90a5c9
                hListBox = GetDlgItem(hDlg, IDL_SERVICES);
Packit 90a5c9
                nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
Packit 90a5c9
                if (nItem != LB_ERR)
Packit 90a5c9
                {
Packit 90a5c9
                    g_hBmpPicture = (HBITMAP)SendMessage(hListBox,
Packit 90a5c9
                                                         LB_GETITEMDATA,
Packit 90a5c9
                                                         nItem, (LPARAM) 0);
Packit 90a5c9
                    if (g_hBmpPicture == g_hBmpStop) {
Packit 90a5c9
                        SendMessage(hDlg, WM_MANAGEMESSAGE, nItem,
Packit 90a5c9
                                    SERVICE_CONTROL_CONTINUE);
Packit 90a5c9
                    }
Packit 90a5c9
                    else {
Packit 90a5c9
                        SendMessage(hDlg, WM_MANAGEMESSAGE, nItem,
Packit 90a5c9
                                    SERVICE_CONTROL_STOP);
Packit 90a5c9
                    }
Packit 90a5c9
Packit 90a5c9
                }
Packit 90a5c9
                return TRUE;
Packit 90a5c9
            }
Packit 90a5c9
            break;
Packit 90a5c9
Packit 90a5c9
        case IDCANCEL:
Packit 90a5c9
            EndDialog(hDlg, TRUE);
Packit 90a5c9
            return TRUE;
Packit 90a5c9
Packit 90a5c9
        case IDC_SSTART:
Packit 90a5c9
            Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE);
Packit 90a5c9
            hListBox = GetDlgItem(hDlg, IDL_SERVICES);
Packit 90a5c9
            nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
Packit 90a5c9
            if (nItem != LB_ERR) {
Packit 90a5c9
                SendMessage(hDlg, WM_MANAGEMESSAGE, nItem,
Packit 90a5c9
                            SERVICE_CONTROL_CONTINUE);
Packit 90a5c9
            }
Packit 90a5c9
            Button_Enable(GetDlgItem(hDlg, IDC_SSTART), TRUE);
Packit 90a5c9
            return TRUE;
Packit 90a5c9
Packit 90a5c9
        case IDC_SSTOP:
Packit 90a5c9
            Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE);
Packit 90a5c9
            hListBox = GetDlgItem(hDlg, IDL_SERVICES);
Packit 90a5c9
            nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
Packit 90a5c9
            if (nItem != LB_ERR) {
Packit 90a5c9
                SendMessage(hDlg, WM_MANAGEMESSAGE, nItem,
Packit 90a5c9
                            SERVICE_CONTROL_STOP);
Packit 90a5c9
            }
Packit 90a5c9
            Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), TRUE);
Packit 90a5c9
            return TRUE;
Packit 90a5c9
Packit 90a5c9
        case IDC_SRESTART:
Packit 90a5c9
            Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE);
Packit 90a5c9
            hListBox = GetDlgItem(hDlg, IDL_SERVICES);
Packit 90a5c9
            nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
Packit 90a5c9
            if (nItem != LB_ERR) {
Packit 90a5c9
                SendMessage(hDlg, WM_MANAGEMESSAGE, nItem,
Packit 90a5c9
                            SERVICE_APACHE_RESTART);
Packit 90a5c9
            }
Packit 90a5c9
            Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), TRUE);
Packit 90a5c9
            return TRUE;
Packit 90a5c9
Packit 90a5c9
        case IDC_SMANAGER:
Packit 90a5c9
            if (g_dwOSVersion >= OS_VERSION_WIN2K) {
Packit 90a5c9
                ShellExecute(hDlg, _T("open"), _T("services.msc"), _T("/s"),
Packit 90a5c9
                             NULL, SW_NORMAL);
Packit 90a5c9
            }
Packit 90a5c9
            else {
Packit 90a5c9
                WinExec("Control.exe SrvMgr.cpl Services", SW_NORMAL);
Packit 90a5c9
            }
Packit 90a5c9
            return TRUE;
Packit 90a5c9
Packit 90a5c9
        case IDC_SCONNECT:
Packit 90a5c9
            DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DLGCONNECT),
Packit 90a5c9
                      hDlg, (DLGPROC)ConnectDlgProc);
Packit 90a5c9
            return TRUE;
Packit 90a5c9
Packit 90a5c9
        case IDC_SDISCONN:
Packit 90a5c9
            hListBox = GetDlgItem(hDlg, IDL_SERVICES);
Packit 90a5c9
            nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
Packit 90a5c9
            if (nItem != LB_ERR) {
Packit 90a5c9
                am_DisconnectComputer(g_stServices[nItem].szComputerName);
Packit 90a5c9
                SendMessage(g_hwndMain, WM_TIMER, WM_TIMER_RESCAN, 0);
Packit 90a5c9
            }
Packit 90a5c9
            return TRUE;
Packit 90a5c9
        }
Packit 90a5c9
        break;
Packit 90a5c9
Packit 90a5c9
    case WM_SIZE:
Packit 90a5c9
        switch (LOWORD(wParam))
Packit 90a5c9
        {
Packit 90a5c9
        case SIZE_MINIMIZED:
Packit 90a5c9
            EndDialog(hDlg, TRUE);
Packit 90a5c9
            return TRUE;
Packit 90a5c9
            break;
Packit 90a5c9
        }
Packit 90a5c9
        break;
Packit 90a5c9
Packit 90a5c9
    case WM_QUIT:
Packit 90a5c9
    case WM_CLOSE:
Packit 90a5c9
        EndDialog(hDlg, TRUE);
Packit 90a5c9
        return TRUE;
Packit 90a5c9
Packit 90a5c9
    default:
Packit 90a5c9
        return FALSE;
Packit 90a5c9
    }
Packit 90a5c9
    return FALSE;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
Packit 90a5c9
                          WPARAM wParam, LPARAM lParam)
Packit 90a5c9
{
Packit 90a5c9
    if (message == g_bUiTaskbarCreated)
Packit 90a5c9
    {
Packit 90a5c9
        /* restore the tray icon on shell restart */
Packit 90a5c9
        ShowNotifyIcon(hWnd, NIM_ADD);
Packit 90a5c9
        return DefWindowProc(hWnd, message, wParam, lParam);
Packit 90a5c9
    }
Packit 90a5c9
    switch (message)
Packit 90a5c9
    {
Packit 90a5c9
    case WM_CREATE:
Packit 90a5c9
        GetApacheServicesStatus();
Packit 90a5c9
        ShowNotifyIcon(hWnd, NIM_ADD);
Packit 90a5c9
        SetTimer(hWnd, WM_TIMER_REFRESH, REFRESH_TIME, NULL);
Packit 90a5c9
        SetTimer(hWnd, WM_TIMER_RESCAN,  RESCAN_TIME, NULL);
Packit 90a5c9
        break;
Packit 90a5c9
Packit 90a5c9
    case WM_TIMER:
Packit 90a5c9
        switch (wParam)
Packit 90a5c9
        {
Packit 90a5c9
        case WM_TIMER_RESCAN:
Packit 90a5c9
        {
Packit 90a5c9
            int nPrev = 0, nNew = 0;
Packit 90a5c9
            EnterCriticalSection(&g_stcSection);
Packit 90a5c9
            if (FindRunningServices() || g_bRescanServices)
Packit 90a5c9
            {
Packit 90a5c9
                ShowNotifyIcon(hWnd, NIM_MODIFY);
Packit 90a5c9
                if (g_hwndServiceDlg)
Packit 90a5c9
                    PostMessage(g_hwndServiceDlg, WM_UPDATEMESSAGE, 0, 0);
Packit 90a5c9
            }
Packit 90a5c9
            /* check if services list changed */
Packit 90a5c9
            while (g_stServices[nPrev].szServiceName != NULL)
Packit 90a5c9
                ++nPrev;
Packit 90a5c9
            GetApacheServicesStatus();
Packit 90a5c9
            while (g_stServices[nNew].szServiceName != NULL)
Packit 90a5c9
                ++nNew;
Packit 90a5c9
            if (nPrev != nNew)
Packit 90a5c9
            {
Packit 90a5c9
                ShowNotifyIcon(hWnd, NIM_MODIFY);
Packit 90a5c9
                if (g_hwndServiceDlg) {
Packit 90a5c9
                    PostMessage(g_hwndServiceDlg, WM_UPDATEMESSAGE, 0, 0);
Packit 90a5c9
                }
Packit 90a5c9
            }
Packit 90a5c9
            LeaveCriticalSection(&g_stcSection);
Packit 90a5c9
            break;
Packit 90a5c9
        }
Packit 90a5c9
Packit 90a5c9
        case WM_TIMER_REFRESH:
Packit 90a5c9
        {
Packit 90a5c9
            EnterCriticalSection(&g_stcSection);
Packit 90a5c9
            if (g_bRescanServices)
Packit 90a5c9
            {
Packit 90a5c9
                GetApacheServicesStatus();
Packit 90a5c9
                ShowNotifyIcon(hWnd, NIM_MODIFY);
Packit 90a5c9
                if (g_hwndServiceDlg) {
Packit 90a5c9
                    PostMessage(g_hwndServiceDlg, WM_UPDATEMESSAGE, 0, 0);
Packit 90a5c9
                }
Packit 90a5c9
            }
Packit 90a5c9
            else if (FindRunningServices())
Packit 90a5c9
            {
Packit 90a5c9
                ShowNotifyIcon(hWnd, NIM_MODIFY);
Packit 90a5c9
                if (g_hwndServiceDlg) {
Packit 90a5c9
                    PostMessage(g_hwndServiceDlg, WM_UPDATEMESSAGE, 0, 0);
Packit 90a5c9
                }
Packit 90a5c9
            }
Packit 90a5c9
            LeaveCriticalSection(&g_stcSection);
Packit 90a5c9
            break;
Packit 90a5c9
        }
Packit 90a5c9
        }
Packit 90a5c9
        break;
Packit 90a5c9
Packit 90a5c9
    case WM_QUIT:
Packit 90a5c9
        ShowNotifyIcon(hWnd, NIM_DELETE);
Packit 90a5c9
        break;
Packit 90a5c9
Packit 90a5c9
    case WM_TRAYMESSAGE:
Packit 90a5c9
        switch (lParam)
Packit 90a5c9
        {
Packit 90a5c9
        case WM_LBUTTONDBLCLK:
Packit 90a5c9
            if (!g_bDlgServiceOn)
Packit 90a5c9
            {
Packit 90a5c9
                g_bDlgServiceOn = TRUE;
Packit 90a5c9
                DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DLGSERVICES),
Packit 90a5c9
                          hWnd, (DLGPROC)ServiceDlgProc);
Packit 90a5c9
                g_bDlgServiceOn = FALSE;
Packit 90a5c9
                g_hwndServiceDlg = NULL;
Packit 90a5c9
            }
Packit 90a5c9
            else if (IsWindow(g_hwndServiceDlg))
Packit 90a5c9
            {
Packit 90a5c9
                /* Dirty hack to bring the window to the foreground */
Packit 90a5c9
                SetWindowPos(g_hwndServiceDlg, HWND_TOPMOST, 0, 0, 0, 0,
Packit 90a5c9
                             SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
Packit 90a5c9
                SetWindowPos(g_hwndServiceDlg, HWND_NOTOPMOST, 0, 0, 0, 0,
Packit 90a5c9
                             SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
Packit 90a5c9
                SetFocus(g_hwndServiceDlg);
Packit 90a5c9
            }
Packit 90a5c9
            break;
Packit 90a5c9
Packit 90a5c9
        case WM_LBUTTONUP:
Packit 90a5c9
            ShowTryServicesMenu(hWnd);
Packit 90a5c9
            break;
Packit 90a5c9
Packit 90a5c9
        case WM_RBUTTONUP:
Packit 90a5c9
            ShowTryPopupMenu(hWnd);
Packit 90a5c9
            break;
Packit 90a5c9
        }
Packit 90a5c9
        break;
Packit 90a5c9
Packit 90a5c9
    case WM_COMMAND:
Packit 90a5c9
        if ((LOWORD(wParam) & IDM_SM_START) == IDM_SM_START)
Packit 90a5c9
        {
Packit 90a5c9
            ApacheManageService(g_stServices[LOWORD(wParam)
Packit 90a5c9
                                           - IDM_SM_START].szServiceName,
Packit 90a5c9
                                g_stServices[LOWORD(wParam)
Packit 90a5c9
                                           - IDM_SM_START].szImagePath,
Packit 90a5c9
                                g_stServices[LOWORD(wParam)
Packit 90a5c9
                                           - IDM_SM_START].szComputerName,
Packit 90a5c9
                                SERVICE_CONTROL_CONTINUE);
Packit 90a5c9
            return TRUE;
Packit 90a5c9
        }
Packit 90a5c9
        else if ((LOWORD(wParam) & IDM_SM_STOP) == IDM_SM_STOP)
Packit 90a5c9
        {
Packit 90a5c9
            ApacheManageService(g_stServices[LOWORD(wParam)
Packit 90a5c9
                                           - IDM_SM_STOP].szServiceName,
Packit 90a5c9
                                g_stServices[LOWORD(wParam)
Packit 90a5c9
                                           - IDM_SM_STOP].szImagePath,
Packit 90a5c9
                                g_stServices[LOWORD(wParam)
Packit 90a5c9
                                           - IDM_SM_STOP].szComputerName,
Packit 90a5c9
                                SERVICE_CONTROL_STOP);
Packit 90a5c9
            return TRUE;
Packit 90a5c9
        }
Packit 90a5c9
        else if ((LOWORD(wParam) & IDM_SM_RESTART) == IDM_SM_RESTART)
Packit 90a5c9
        {
Packit 90a5c9
            ApacheManageService(g_stServices[LOWORD(wParam)
Packit 90a5c9
                                           - IDM_SM_RESTART].szServiceName,
Packit 90a5c9
                                g_stServices[LOWORD(wParam)
Packit 90a5c9
                                           - IDM_SM_RESTART].szImagePath,
Packit 90a5c9
                                g_stServices[LOWORD(wParam)
Packit 90a5c9
                                           - IDM_SM_RESTART].szComputerName,
Packit 90a5c9
                                SERVICE_APACHE_RESTART);
Packit 90a5c9
            return TRUE;
Packit 90a5c9
        }
Packit 90a5c9
        switch (LOWORD(wParam))
Packit 90a5c9
        {
Packit 90a5c9
        case IDM_RESTORE:
Packit 90a5c9
            if (!g_bDlgServiceOn)
Packit 90a5c9
            {
Packit 90a5c9
                g_bDlgServiceOn = TRUE;
Packit 90a5c9
                DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DLGSERVICES),
Packit 90a5c9
                          hWnd, (DLGPROC)ServiceDlgProc);
Packit 90a5c9
                g_bDlgServiceOn = FALSE;
Packit 90a5c9
                g_hwndServiceDlg = NULL;
Packit 90a5c9
            }
Packit 90a5c9
            else if (IsWindow(g_hwndServiceDlg)) {
Packit 90a5c9
                SetFocus(g_hwndServiceDlg);
Packit 90a5c9
            }
Packit 90a5c9
            break;
Packit 90a5c9
Packit 90a5c9
        case IDC_SMANAGER:
Packit 90a5c9
            if (g_dwOSVersion >= OS_VERSION_WIN2K) {
Packit 90a5c9
                ShellExecute(NULL, _T("open"), _T("services.msc"), _T("/s"),
Packit 90a5c9
                             NULL, SW_NORMAL);
Packit 90a5c9
            }
Packit 90a5c9
            else {
Packit 90a5c9
                WinExec("Control.exe SrvMgr.cpl Services", SW_NORMAL);
Packit 90a5c9
            }
Packit 90a5c9
            return TRUE;
Packit 90a5c9
Packit 90a5c9
        case IDM_EXIT:
Packit 90a5c9
            ShowNotifyIcon(hWnd, NIM_DELETE);
Packit 90a5c9
            PostQuitMessage(0);
Packit 90a5c9
            return TRUE;
Packit 90a5c9
        }
Packit 90a5c9
Packit 90a5c9
    default:
Packit 90a5c9
        return DefWindowProc(hWnd, message, wParam, lParam);
Packit 90a5c9
    }
Packit 90a5c9
Packit 90a5c9
    return FALSE;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
static int KillAWindow(HWND appwindow)
Packit 90a5c9
{
Packit 90a5c9
    HANDLE appproc;
Packit 90a5c9
    DWORD procid;
Packit 90a5c9
    BOOL postres;
Packit 90a5c9
Packit 90a5c9
    SetLastError(0);
Packit 90a5c9
    GetWindowThreadProcessId(appwindow, &procid);
Packit 90a5c9
    if (GetLastError())
Packit 90a5c9
        return(2);
Packit 90a5c9
Packit 90a5c9
    appproc = OpenProcess(SYNCHRONIZE, 0, procid);
Packit 90a5c9
    postres = PostMessage(appwindow, WM_COMMAND, IDM_EXIT, 0);
Packit 90a5c9
    if (appproc && postres) {
Packit 90a5c9
        if (WaitForSingleObject(appproc, 10 /* seconds */ * 1000)
Packit 90a5c9
                == WAIT_OBJECT_0) {
Packit 90a5c9
            CloseHandle(appproc);
Packit 90a5c9
            return (0);
Packit 90a5c9
        }
Packit 90a5c9
    }
Packit 90a5c9
    if (appproc)
Packit 90a5c9
        CloseHandle(appproc);
Packit 90a5c9
Packit 90a5c9
    if ((appproc = OpenProcess(PROCESS_TERMINATE, 0, procid)) != NULL) {
Packit 90a5c9
        if (TerminateProcess(appproc, 0)) {
Packit 90a5c9
            CloseHandle(appproc);
Packit 90a5c9
            return (0);
Packit 90a5c9
        }
Packit 90a5c9
        CloseHandle(appproc);
Packit 90a5c9
    }
Packit 90a5c9
Packit 90a5c9
    /* Perhaps we were short of permissions? */
Packit 90a5c9
    return (2);
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
static int KillAllMonitors(void)
Packit 90a5c9
{
Packit 90a5c9
    HWND appwindow;
Packit 90a5c9
    int exitcode = 0;
Packit 90a5c9
    PWTS_PROCESS_INFO tsProcs;
Packit 90a5c9
    DWORD tsProcCount, i;
Packit 90a5c9
    DWORD thisProcId;
Packit 90a5c9
Packit 90a5c9
    /* This is graceful, close our own Window, clearing the icon */
Packit 90a5c9
    if ((appwindow = FindWindow(g_szWindowClass, g_szTitle)) != NULL)
Packit 90a5c9
        exitcode = KillAWindow(appwindow);
Packit 90a5c9
Packit 90a5c9
    if (g_dwOSVersion < OS_VERSION_WIN2K)
Packit 90a5c9
        return exitcode;
Packit 90a5c9
Packit 90a5c9
    thisProcId = GetCurrentProcessId();
Packit 90a5c9
Packit 90a5c9
    if (!WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1,
Packit 90a5c9
                               &tsProcs, &tsProcCount))
Packit 90a5c9
        return exitcode;
Packit 90a5c9
Packit 90a5c9
    /* This is ungraceful; close other Windows, with a lingering icon.
Packit 90a5c9
     * Since on terminal server it's not possible to post the message
Packit 90a5c9
     * to exit across sessions, we have to suffer this side effect
Packit 90a5c9
     * of a taskbar 'icon' which will evaporate the next time that
Packit 90a5c9
     * the user hovers over it or when the taskbar area is updated.
Packit 90a5c9
     */
Packit 90a5c9
    for (i = 0; i < tsProcCount; ++i) {
Packit 90a5c9
        if (_tcscmp(tsProcs[i].pProcessName, _T(AM_STRINGIFY(BIN_NAME))) == 0
Packit 90a5c9
                && tsProcs[i].ProcessId != thisProcId)
Packit 90a5c9
            WTSTerminateProcess(WTS_CURRENT_SERVER_HANDLE,
Packit 90a5c9
                                tsProcs[i].ProcessId, 1);
Packit 90a5c9
    }
Packit 90a5c9
    WTSFreeMemory(tsProcs);
Packit 90a5c9
    return exitcode;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
/* Create main invisible window */
Packit 90a5c9
HWND CreateMainWindow(HINSTANCE hInstance)
Packit 90a5c9
{
Packit 90a5c9
    HWND hWnd = NULL;
Packit 90a5c9
    WNDCLASSEX wcex;
Packit 90a5c9
Packit 90a5c9
    wcex.cbSize = sizeof(WNDCLASSEX);
Packit 90a5c9
Packit 90a5c9
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
Packit 90a5c9
    wcex.lpfnWndProc    = (WNDPROC)WndProc;
Packit 90a5c9
    wcex.cbClsExtra     = 0;
Packit 90a5c9
    wcex.cbWndExtra     = 0;
Packit 90a5c9
    wcex.hInstance      = hInstance;
Packit 90a5c9
    wcex.hIcon   = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_APSRVMON),
Packit 90a5c9
                                    IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
Packit 90a5c9
    wcex.hCursor        = g_hCursorArrow;
Packit 90a5c9
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
Packit 90a5c9
    wcex.lpszMenuName   = 0;
Packit 90a5c9
    wcex.lpszClassName  = g_szWindowClass;
Packit 90a5c9
    wcex.hIconSm = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_APSRVMON),
Packit 90a5c9
                                    IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
Packit 90a5c9
Packit 90a5c9
    if (RegisterClassEx(&wcex)) {
Packit 90a5c9
        hWnd = CreateWindow(g_szWindowClass, g_szTitle,
Packit 90a5c9
                            0, 0, 0, 0, 0,
Packit 90a5c9
                            NULL, NULL, hInstance, NULL);
Packit 90a5c9
    }
Packit 90a5c9
    return hWnd;
Packit 90a5c9
}
Packit 90a5c9
Packit 90a5c9
Packit 90a5c9
#ifndef UNICODE
Packit 90a5c9
/* Borrowed from CRT internal.h for _MBCS argc/argv parsing in this GUI app */
Packit 90a5c9
int  __cdecl _setargv(void);
Packit 90a5c9
#endif
Packit 90a5c9
Packit 90a5c9
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
Packit 90a5c9
                   LPSTR lpCmdLine, int nCmdShow)
Packit 90a5c9
{
Packit 90a5c9
    TCHAR szTmp[MAX_LOADSTRING];
Packit 90a5c9
    TCHAR szCmp[MAX_COMPUTERNAME_LENGTH+4];
Packit 90a5c9
    MSG msg;
Packit 90a5c9
    /* existing window */
Packit 90a5c9
    HWND appwindow;
Packit 90a5c9
    DWORD dwControl;
Packit 90a5c9
    int i;
Packit 90a5c9
    DWORD d;
Packit 90a5c9
Packit 90a5c9
    if (!GetSystemOSVersion(&g_dwOSVersion))
Packit 90a5c9
    {
Packit 90a5c9
        ErrorMessage(NULL, TRUE);
Packit 90a5c9
        return 1;
Packit 90a5c9
    }
Packit 90a5c9
Packit 90a5c9
    g_LangID = GetUserDefaultLangID();
Packit 90a5c9
    if ((g_LangID & 0xFF) != LANG_ENGLISH) {
Packit 90a5c9
        g_LangID = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
Packit 90a5c9
    }
Packit 90a5c9
    for (i = IDS_MSG_FIRST; i <= IDS_MSG_LAST; ++i) {
Packit 90a5c9
        LoadString(hInstance, i, szTmp, MAX_LOADSTRING);
Packit 90a5c9
        g_lpMsg[i - IDS_MSG_FIRST] = _tcsdup(szTmp);
Packit 90a5c9
    }
Packit 90a5c9
    LoadString(hInstance, IDS_APMONITORTITLE, szTmp, MAX_LOADSTRING);
Packit 90a5c9
    d = MAX_COMPUTERNAME_LENGTH+1;
Packit 90a5c9
    _tcscpy(szCmp, _T("\\\\"));
Packit 90a5c9
    GetComputerName(szCmp + 2, &d);
Packit 90a5c9
    _tcsupr(szCmp);
Packit 90a5c9
    g_szLocalHost = _tcsdup(szCmp);
Packit 90a5c9
Packit 90a5c9
    memset(g_stComputers, 0, sizeof(ST_MONITORED_COMP) * MAX_APACHE_COMPUTERS);
Packit 90a5c9
    g_stComputers[0].szComputerName = _tcsdup(szCmp);
Packit 90a5c9
    g_stComputers[0].hRegistry = HKEY_LOCAL_MACHINE;
Packit 90a5c9
    g_szTitle = _tcsdup(szTmp);
Packit 90a5c9
    LoadString(hInstance, IDS_APMONITORCLASS, szTmp, MAX_LOADSTRING);
Packit 90a5c9
    g_szWindowClass = _tcsdup(szTmp);
Packit 90a5c9
Packit 90a5c9
    appwindow = FindWindow(g_szWindowClass, g_szTitle);
Packit 90a5c9
Packit 90a5c9
#ifdef UNICODE
Packit 90a5c9
    __wargv = CommandLineToArgvW(GetCommandLineW(), &__argc);
Packit 90a5c9
#else
Packit 90a5c9
#if defined(_MSC_VER) && _MSC_VER < 1800 
Packit 90a5c9
    _setargv();
Packit 90a5c9
#endif
Packit 90a5c9
#endif
Packit 90a5c9
Packit 90a5c9
    if ((__argc == 2) && (_tcscmp(__targv[1], _T("--kill")) == 0))
Packit 90a5c9
    {
Packit 90a5c9
        /* Off to chase and close up every ApacheMonitor taskbar window */
Packit 90a5c9
        return KillAllMonitors();
Packit 90a5c9
    }
Packit 90a5c9
    else if ((__argc == 4) && (g_dwOSVersion >= OS_VERSION_WIN2K))
Packit 90a5c9
    {
Packit 90a5c9
        dwControl = _ttoi(__targv[1]);
Packit 90a5c9
        if ((dwControl != SERVICE_CONTROL_CONTINUE) &&
Packit 90a5c9
            (dwControl != SERVICE_APACHE_RESTART) &&
Packit 90a5c9
            (dwControl != SERVICE_CONTROL_STOP))
Packit 90a5c9
        {
Packit 90a5c9
            return 1;
Packit 90a5c9
        }
Packit 90a5c9
Packit 90a5c9
        /* Chase down and close up our session's previous window */
Packit 90a5c9
        if ((appwindow) != NULL)
Packit 90a5c9
            KillAWindow(appwindow);
Packit 90a5c9
    }
Packit 90a5c9
    else if (__argc != 1) {
Packit 90a5c9
        return 1;
Packit 90a5c9
    }
Packit 90a5c9
    else if (appwindow)
Packit 90a5c9
    {
Packit 90a5c9
        ErrorMessage(g_lpMsg[IDS_MSG_APPRUNNING - IDS_MSG_FIRST], FALSE);
Packit 90a5c9
        return 0;
Packit 90a5c9
    }
Packit 90a5c9
Packit 90a5c9
    g_icoStop          = LoadImage(hInstance, MAKEINTRESOURCE(IDI_ICOSTOP),
Packit 90a5c9
                                   IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
Packit 90a5c9
    g_icoRun           = LoadImage(hInstance, MAKEINTRESOURCE(IDI_ICORUN),
Packit 90a5c9
                                   IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
Packit 90a5c9
    g_hCursorHourglass = LoadImage(NULL, MAKEINTRESOURCE(OCR_WAIT),
Packit 90a5c9
                                   IMAGE_CURSOR, LR_DEFAULTSIZE,
Packit 90a5c9
                                   LR_DEFAULTSIZE, LR_SHARED);
Packit 90a5c9
    g_hCursorArrow     = LoadImage(NULL, MAKEINTRESOURCE(OCR_NORMAL),
Packit 90a5c9
                                   IMAGE_CURSOR, LR_DEFAULTSIZE,
Packit 90a5c9
                                   LR_DEFAULTSIZE, LR_SHARED);
Packit 90a5c9
    g_hBmpStart        = LoadImage(hInstance, MAKEINTRESOURCE(IDB_BMPRUN),
Packit 90a5c9
                                   IMAGE_BITMAP, XBITMAP, YBITMAP,
Packit 90a5c9
                                   LR_DEFAULTCOLOR);
Packit 90a5c9
    g_hBmpStop         = LoadImage(hInstance, MAKEINTRESOURCE(IDB_BMPSTOP),
Packit 90a5c9
                                   IMAGE_BITMAP, XBITMAP, YBITMAP,
Packit 90a5c9
                                   LR_DEFAULTCOLOR);
Packit 90a5c9
Packit 90a5c9
    memset(g_stServices, 0, sizeof(ST_APACHE_SERVICE) * MAX_APACHE_SERVICES);
Packit 90a5c9
    CoInitialize(NULL);
Packit 90a5c9
    InitCommonControls();
Packit 90a5c9
    g_hInstance = hInstance;
Packit 90a5c9
    g_hwndMain = CreateMainWindow(hInstance);
Packit 90a5c9
    g_bUiTaskbarCreated = RegisterWindowMessage(_T("TaskbarCreated"));
Packit 90a5c9
    InitializeCriticalSection(&g_stcSection);
Packit 90a5c9
    g_hwndServiceDlg = NULL;
Packit 90a5c9
    if (g_hwndMain != NULL)
Packit 90a5c9
    {
Packit 90a5c9
        /* To avoid recursion, pass ImagePath NULL (a noop on NT and later) */
Packit 90a5c9
        if ((__argc == 4) && (g_dwOSVersion >= OS_VERSION_WIN2K))
Packit 90a5c9
            ApacheManageService(__targv[2], NULL, __targv[3], dwControl);
Packit 90a5c9
Packit 90a5c9
        while (GetMessage(&msg, NULL, 0, 0) == TRUE)
Packit 90a5c9
        {
Packit 90a5c9
            TranslateMessage(&msg;;
Packit 90a5c9
            DispatchMessage(&msg;;
Packit 90a5c9
        }
Packit 90a5c9
        am_ClearServicesSt();
Packit 90a5c9
    }
Packit 90a5c9
    am_ClearComputersSt();
Packit 90a5c9
    DeleteCriticalSection(&g_stcSection);
Packit 90a5c9
    DestroyIcon(g_icoStop);
Packit 90a5c9
    DestroyIcon(g_icoRun);
Packit 90a5c9
    DestroyCursor(g_hCursorHourglass);
Packit 90a5c9
    DestroyCursor(g_hCursorArrow);
Packit 90a5c9
    DeleteObject(g_hBmpStart);
Packit 90a5c9
    DeleteObject(g_hBmpStop);
Packit 90a5c9
    CoUninitialize();
Packit 90a5c9
    return 0;
Packit 90a5c9
}
Packit 90a5c9