📄 apachemonitor.c
字号:
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 + -