⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apachemonitor.c

📁 Apache HTTP Server 是一个功能强大的灵活的与HTTP/1.1相兼容的web服务器.这里给出的是Apache HTTP服务器的源码。
💻 C
📖 第 1 页 / 共 4 页
字号:
    if (hMenu)    {        while (g_stServices[i].szServiceName != NULL)        {            appendServiceMenu(hMenu, i, g_stServices[i].szDisplayName,                              g_stServices[i].dwPid != 0);            ++i;        }        if (i)        {            if (!SetForegroundWindow(hWnd)) {                SetForegroundWindow(NULL);            }            GetCursorPos(&pt);            TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON,                            pt.x, pt.y, 0, hWnd, NULL);            DestroyMenu(hMenu);        }    }}BOOL CenterWindow(HWND hwndChild){   RECT rChild, rWorkArea;   int wChild, hChild;   int xNew, yNew;   BOOL bResult;   /* Get the Height and Width of the child window */   GetWindowRect(hwndChild, &rChild);   wChild = rChild.right - rChild.left;   hChild = rChild.bottom - rChild.top;   /* Get the limits of the 'workarea' */   bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT),                                  &rWorkArea, 0);   if (!bResult) {      rWorkArea.left = rWorkArea.top = 0;      rWorkArea.right = GetSystemMetrics(SM_CXSCREEN);      rWorkArea.bottom = GetSystemMetrics(SM_CYSCREEN);   }   /* Calculate new X and Y position*/   xNew = (rWorkArea.right - wChild) / 2;   yNew = (rWorkArea.bottom - hChild) / 2;   return SetWindowPos(hwndChild, HWND_TOP, xNew, yNew, 0, 0,                        SWP_NOSIZE | SWP_SHOWWINDOW);}static void addListBoxItem(HWND hDlg, LPSTR lpStr, HBITMAP hBmp) {     int nItem;      nItem = SendMessage(hDlg, LB_ADDSTRING, 0, (LPARAM)lpStr);     SendMessage(hDlg, LB_SETITEMDATA, nItem, (LPARAM)hBmp); } static void addListBoxString(HWND hListBox, LPSTR lpStr){    static int nItems = 0;    if (!g_bDlgServiceOn) {        return;    }    ++nItems;    if (nItems > MAX_LOADSTRING)     {        SendMessage(hListBox, LB_RESETCONTENT, 0, 0);         nItems = 1;    }    ListBox_SetCurSel(hListBox,                      ListBox_AddString(hListBox, lpStr));}static DWORD WINAPI ConsoleOutputThread(LPVOID lpThreadParameter){    static BYTE lpBuffer[MAX_PATH+1];    int nPtr = 0;    BYTE ch;    DWORD dwReaded;    while (ReadFile(g_hpipeOutRead, &ch, 1, &dwReaded, NULL) == TRUE)     {        if (dwReaded > 0)         {            if (ch == '\n' || nPtr >= MAX_PATH)             {                lpBuffer[nPtr] = '\0';                addListBoxString(g_hwndStdoutList, lpBuffer);                nPtr = 0;            }             else if (ch == '\t' && nPtr < (MAX_PATH - 4))             {                int i;                for (i = 0; i < 4; ++i) {                    lpBuffer[nPtr++] = ' ';                }            }            else if (ch != '\r') {                lpBuffer[nPtr++] = ch;            }        }    }    CloseHandle(g_hpipeInWrite);    CloseHandle(g_hpipeOutRead);    CloseHandle(g_hpipeStdError);    return 0;}DWORD WINAPI ConsoleWaitingThread(LPVOID lpThreadParameter){    WaitForSingleObject(g_lpRedirectProc.hThread, INFINITE);    CloseHandle(g_lpRedirectProc.hThread);    MessageBeep(100);    g_bConsoleRun = FALSE;    SetCursor(g_hCursorArrow);    return 0;}BOOL RunRedirectedConsole(LPSTR szCmdLine){    DWORD dwThreadId;    HANDLE hProc;    STARTUPINFO stInfo;    BOOL bResult;    memset(&stInfo, 0, sizeof(stInfo));    stInfo.cb = sizeof(stInfo);    stInfo.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;    stInfo.wShowWindow = SW_HIDE;    hProc = GetCurrentProcess();    if (!CreatePipe(&g_hpipeInRead, &g_hpipeInWrite, NULL, MAX_PATH)) {        ErrorMessage(NULL, TRUE);    }    if (!CreatePipe(&g_hpipeOutRead, &g_hpipeOutWrite, NULL, MAX_PATH*8)) {        ErrorMessage(NULL, TRUE);    }    DuplicateHandle(hProc, g_hpipeInRead, hProc, &g_hpipeInRead, 0, TRUE,                     DUPLICATE_CLOSE_SOURCE|DUPLICATE_SAME_ACCESS);    DuplicateHandle(hProc, g_hpipeOutWrite, hProc, &g_hpipeOutWrite, 0, TRUE,                     DUPLICATE_CLOSE_SOURCE|DUPLICATE_SAME_ACCESS);    DuplicateHandle(hProc, g_hpipeOutWrite, hProc, &g_hpipeStdError, 0, TRUE,                     DUPLICATE_SAME_ACCESS);    if (!g_hpipeInRead && !g_hpipeOutWrite && !g_hpipeStdError) {        ErrorMessage(NULL, TRUE);    }    stInfo.hStdInput  = g_hpipeInRead;    stInfo.hStdOutput = g_hpipeOutWrite;    stInfo.hStdError  = g_hpipeStdError;    bResult = CreateProcess(NULL,        szCmdLine,        NULL,        NULL,        TRUE,        CREATE_SUSPENDED,        NULL,        NULL,        &stInfo,        &g_lpRedirectProc);    CloseHandle(g_hpipeInRead);    CloseHandle(g_hpipeOutWrite);    CloseHandle(g_hpipeStdError);    if (!bResult)    {        CloseHandle(g_hpipeInWrite);        CloseHandle(g_hpipeOutRead);        CloseHandle(g_hpipeStdError);        return FALSE;    }    CloseHandle(CreateThread(NULL, 0, ConsoleOutputThread,                              0, 0, &dwThreadId));    ResumeThread(g_lpRedirectProc.hThread);    CloseHandle(CreateThread(NULL, 0, ConsoleWaitingThread,                             0, 0, &dwThreadId));    return TRUE;}BOOL RunAndForgetConsole(LPSTR szCmdLine, BOOL bRedirectConsole){    STARTUPINFO stInfo;    PROCESS_INFORMATION prInfo;    BOOL bResult;    if (bRedirectConsole) {        return RunRedirectedConsole(szCmdLine);    }    memset(&stInfo, 0, sizeof(stInfo));    stInfo.cb = sizeof(stInfo);    stInfo.dwFlags = STARTF_USESHOWWINDOW;    stInfo.wShowWindow = SW_HIDE;    bResult = CreateProcess(NULL,                            szCmdLine,                            NULL,                            NULL,                            TRUE,                            CREATE_NEW_CONSOLE,                            NULL,                            NULL,                            &stInfo,                            &prInfo);    if (!bResult) {        return FALSE;    }    if (g_dwOSVersion == OS_VERSION_WIN9X) {        /* give some time to rescan the status */        Sleep(2000);    }    CloseHandle(prInfo.hThread);    CloseHandle(prInfo.hProcess);    return TRUE;}BOOL ApacheManageService(LPCSTR szServiceName, LPCSTR szImagePath,                          LPSTR szComputerName, DWORD dwCommand){    CHAR szBuf[MAX_PATH];    CHAR szMsg[MAX_PATH];    LPSTR sPos;    BOOL retValue;    BOOL serviceFlag = TRUE;    SC_HANDLE schService;    SC_HANDLE schSCManager;    SERVICE_STATUS schSStatus;    int ticks;    if (g_dwOSVersion == OS_VERSION_WIN9X)    {        sPos = strstr(szImagePath, "-k start");        if (sPos)        {            lstrcpyn(szBuf, szImagePath, sPos - szImagePath);            switch (dwCommand)            {            case SERVICE_CONTROL_STOP:                lstrcat(szBuf, " -k shutdown -n ");                break;            case SERVICE_CONTROL_CONTINUE:                sprintf(szMsg, g_lpMsg[IDS_MSG_SRVSTART - IDS_MSG_FIRST],                         szServiceName);                addListBoxString(g_hwndStdoutList, szMsg);                lstrcat(szBuf, " -k start -n ");                serviceFlag = FALSE;                break;            case SERVICE_APACHE_RESTART:                lstrcat(szBuf, " -k restart -n ");                break;            default:                return FALSE;            }            lstrcat(szBuf, szServiceName);        }        else {            return FALSE;        }        g_bConsoleRun = TRUE;        SetCursor(g_hCursorHourglass);        if (!RunAndForgetConsole(szBuf, serviceFlag))        {            ErrorMessage(NULL, FALSE);            g_bConsoleRun = FALSE;            SetCursor(g_hCursorArrow);            return FALSE;        }        else if (!serviceFlag)        {            sprintf(szMsg, g_lpMsg[IDS_MSG_SRVSTARTED - IDS_MSG_FIRST],                     szServiceName);            addListBoxString(g_hwndStdoutList, szMsg);            g_bConsoleRun = FALSE;            SetCursor(g_hCursorArrow);            return TRUE;        }    }    else    {        schSCManager = OpenSCManager(szComputerName, NULL,                                     SC_MANAGER_CONNECT);        if (!schSCManager) {            return FALSE;        }        schService = OpenService(schSCManager, szServiceName,                                  SERVICE_QUERY_STATUS | SERVICE_START |                                  SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL);        if (schService != NULL)        {            retValue = FALSE;            g_bConsoleRun = TRUE;            SetCursor(g_hCursorHourglass);            switch (dwCommand)            {            case SERVICE_CONTROL_STOP:                sprintf(szMsg, g_lpMsg[IDS_MSG_SRVSTOP - IDS_MSG_FIRST],                         szServiceName);                addListBoxString(g_hwndStdoutList, szMsg);                if (ControlService(schService, SERVICE_CONTROL_STOP,                                    &schSStatus)) {                    Sleep(1000);                    while (QueryServiceStatus(schService, &schSStatus))                     {                        if (schSStatus.dwCurrentState == SERVICE_STOP_PENDING)                        {                            Sleep(1000);                        }                        else {                            break;                        }                    }                }                if (QueryServiceStatus(schService, &schSStatus))                {                    if (schSStatus.dwCurrentState == SERVICE_STOPPED)                    {                        retValue = TRUE;                        sprintf(szMsg,                                 g_lpMsg[IDS_MSG_SRVSTOPPED - IDS_MSG_FIRST],                                 szServiceName);                        addListBoxString(g_hwndStdoutList, szMsg);                    }                }                break;            case SERVICE_CONTROL_CONTINUE:                sprintf(szMsg, g_lpMsg[IDS_MSG_SRVSTART - IDS_MSG_FIRST],                        szServiceName);                addListBoxString(g_hwndStdoutList, szMsg);                if (StartService(schService, 0, NULL))                 {                    Sleep(1000);                    while (QueryServiceStatus(schService, &schSStatus))                     {                        if (schSStatus.dwCurrentState == SERVICE_START_PENDING)                        {                            Sleep(1000);                        }                        else {                            break;                        }                    }                }                if (QueryServiceStatus(schService, &schSStatus))                {                    if (schSStatus.dwCurrentState == SERVICE_RUNNING)                    {                        retValue = TRUE;                        sprintf(szMsg,                                 g_lpMsg[IDS_MSG_SRVSTARTED - IDS_MSG_FIRST],                                szServiceName);                        addListBoxString(g_hwndStdoutList, szMsg);                    }                }                break;            case SERVICE_APACHE_RESTART:                sprintf(szMsg, g_lpMsg[IDS_MSG_SRVRESTART - IDS_MSG_FIRST],                        szServiceName);                addListBoxString(g_hwndStdoutList, szMsg);                if (ControlService(schService, SERVICE_APACHE_RESTART,                                   &schSStatus))                 {                    ticks = 60;                    while (schSStatus.dwCurrentState == SERVICE_START_PENDING)                    {                        Sleep(1000);                        if (!QueryServiceStatus(schService, &schSStatus))                        {                            CloseServiceHandle(schService);                            CloseServiceHandle(schSCManager);                            g_bConsoleRun = FALSE;                            SetCursor(g_hCursorArrow);                            return FALSE;                        }                        if (!--ticks) {                            break;                        }                    }                }                if (schSStatus.dwCurrentState == SERVICE_RUNNING)                {                    retValue = TRUE;                    sprintf(szMsg,                             g_lpMsg[IDS_MSG_SRVRESTARTED - IDS_MSG_FIRST],                            szServiceName);                    addListBoxString(g_hwndStdoutList, szMsg);                }                break;            }            CloseServiceHandle(schService);            CloseServiceHandle(schSCManager);            if (!retValue) {                ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST],                              FALSE);            }            g_bConsoleRun = FALSE;            SetCursor(g_hCursorArrow);            return retValue;        }        else {            g_bRescanServices = TRUE;        }        CloseServiceHandle(schSCManager);        return FALSE;    }    return FALSE;}BOOL IsServiceRunning(LPCSTR szServiceName, LPCSTR szComputerName,                       LPDWORD lpdwPid){    DWORD dwPid;    HWND hWnd;    SC_HANDLE schService;    SC_HANDLE schSCManager;    SERVICE_STATUS schSStatus;    if (g_dwOSVersion == OS_VERSION_WIN9X)    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -