📄 apachemonitor.c
字号:
ErrorMessage(NULL, FALSE); g_bConsoleRun = FALSE; SetCursor(g_hCursorArrow); return FALSE; } else if (!serviceFlag) { _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), 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) { ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST], FALSE); return FALSE; } schService = OpenService(schSCManager, szServiceName, SERVICE_QUERY_STATUS | SERVICE_START | SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL); if (schService == NULL) { /* Avoid recursion of ImagePath NULL (from this Respawn) */ if (szImagePath) { am_RespawnAsUserAdmin(g_hwndMain, dwCommand, szServiceName, szComputerName); } else { ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST], FALSE); } CloseServiceHandle(schSCManager); return FALSE; } else { retValue = FALSE; g_bConsoleRun = TRUE; SetCursor(g_hCursorHourglass); switch (dwCommand) { case SERVICE_CONTROL_STOP: _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), 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; _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), g_lpMsg[IDS_MSG_SRVSTOPPED - IDS_MSG_FIRST], szServiceName); addListBoxString(g_hwndStdoutList, szMsg); } } break; case SERVICE_CONTROL_CONTINUE: _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), 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; _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), g_lpMsg[IDS_MSG_SRVSTARTED - IDS_MSG_FIRST], szServiceName); addListBoxString(g_hwndStdoutList, szMsg); } } break; case SERVICE_APACHE_RESTART: _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), 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; _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), 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; } return FALSE; } return FALSE;}BOOL IsServiceRunning(LPCTSTR szServiceName, LPCTSTR szComputerName, LPDWORD lpdwPid){ DWORD dwPid; HWND hWnd; SC_HANDLE schService; SC_HANDLE schSCManager; SERVICE_STATUS schSStatus; if (g_dwOSVersion == OS_VERSION_WIN9X) { hWnd = FindWindow(_T("ApacheWin95ServiceMonitor"), szServiceName); if (hWnd && GetWindowThreadProcessId(hWnd, &dwPid)) { *lpdwPid = 1; return TRUE; } else { return FALSE; } } else { dwPid = 0; schSCManager = OpenSCManager(szComputerName, NULL, SC_MANAGER_CONNECT); if (!schSCManager) { return FALSE; } schService = OpenService(schSCManager, szServiceName, SERVICE_QUERY_STATUS); if (schService != NULL) { if (QueryServiceStatus(schService, &schSStatus)) { dwPid = schSStatus.dwCurrentState; if (lpdwPid) { *lpdwPid = 1; } } CloseServiceHandle(schService); CloseServiceHandle(schSCManager); return dwPid == SERVICE_RUNNING ? TRUE : FALSE; } else { g_bRescanServices = TRUE; } CloseServiceHandle(schSCManager); return FALSE; } return FALSE;}BOOL FindRunningServices(void){ int i = 0; DWORD dwPid; BOOL rv = FALSE; while (g_stServices[i].szServiceName != NULL) { if (!IsServiceRunning(g_stServices[i].szServiceName, g_stServices[i].szComputerName, &dwPid)) { dwPid = 0; } if (g_stServices[i].dwPid != dwPid) { rv = TRUE; } g_stServices[i].dwPid = dwPid; ++i; } return rv;}BOOL GetApacheServicesStatus(){ TCHAR szKey[MAX_PATH]; TCHAR achKey[MAX_PATH]; TCHAR szImagePath[MAX_PATH]; TCHAR szBuf[MAX_PATH]; TCHAR szTmp[MAX_PATH]; HKEY hKey, hSubKey, hKeyRemote; DWORD retCode, rv, dwKeyType; DWORD dwBufLen = MAX_PATH; int i, stPos = 0; int computers = 0; g_bRescanServices = FALSE; am_ClearServicesSt(); while (g_stComputers[computers].szComputerName != NULL) { hKeyRemote = g_stComputers[computers].hRegistry; retCode = RegOpenKeyEx(hKeyRemote, _T("System\\CurrentControlSet\\Services\\"), 0, KEY_READ, &hKey); if (retCode != ERROR_SUCCESS) { ErrorMessage(NULL, FALSE); return FALSE; } for (i = 0, retCode = ERROR_SUCCESS; retCode == ERROR_SUCCESS; i++) { retCode = RegEnumKey(hKey, i, achKey, MAX_PATH); if (retCode == ERROR_SUCCESS) { _tcscpy(szKey, _T("System\\CurrentControlSet\\Services\\")); _tcscat(szKey, achKey); if (RegOpenKeyEx(hKeyRemote, szKey, 0, KEY_QUERY_VALUE, &hSubKey) == ERROR_SUCCESS) { dwBufLen = MAX_PATH; rv = RegQueryValueEx(hSubKey, _T("ImagePath"), NULL, &dwKeyType, (LPBYTE)szImagePath, &dwBufLen); if (rv == ERROR_SUCCESS && (dwKeyType == REG_SZ || dwKeyType == REG_EXPAND_SZ) && dwBufLen) { _tcscpy(szBuf, szImagePath); CharLower(szBuf); /* the service name could be httpd*.exe or Apache*.exe */ if (((_tcsstr(szBuf, _T("\\apache")) != NULL) || (_tcsstr(szBuf, _T("\\httpd")) != NULL)) && _tcsstr(szBuf, _T(".exe")) && (_tcsstr(szBuf, _T("--ntservice")) != NULL || _tcsstr(szBuf, _T("-k ")) != NULL)) { g_stServices[stPos].szServiceName = _tcsdup(achKey); g_stServices[stPos].szImagePath = _tcsdup(szImagePath); g_stServices[stPos].szComputerName = _tcsdup(g_stComputers[computers].szComputerName); dwBufLen = MAX_PATH; if (RegQueryValueEx(hSubKey, _T("Description"), NULL, &dwKeyType, (LPBYTE)szBuf, &dwBufLen) == ERROR_SUCCESS) { g_stServices[stPos].szDescription = _tcsdup(szBuf); } dwBufLen = MAX_PATH; if (RegQueryValueEx(hSubKey, _T("DisplayName"), NULL, &dwKeyType, (LPBYTE)szBuf, &dwBufLen) == ERROR_SUCCESS) { if (_tcscmp(g_stComputers[computers] .szComputerName, g_szLocalHost) != 0) { _tcscpy(szTmp, g_stComputers[computers] .szComputerName + 2); _tcscat(szTmp, _T("@")); _tcscat(szTmp, szBuf); } else { _tcscpy(szTmp, szBuf); } g_stServices[stPos].szDisplayName = _tcsdup(szTmp); } ++stPos; if (stPos >= MAX_APACHE_SERVICES) { retCode = !ERROR_SUCCESS; } } } RegCloseKey(hSubKey); } } } ++computers; RegCloseKey(hKey); } FindRunningServices(); return TRUE;}LRESULT CALLBACK ConnectDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){ TCHAR szCmp[MAX_COMPUTERNAME_LENGTH+4]; switch (message) { case WM_INITDIALOG: ShowWindow(hDlg, SW_HIDE); g_hwndConnectDlg = hDlg; CenterWindow(hDlg); ShowWindow(hDlg, SW_SHOW); SetFocus(GetDlgItem(hDlg, IDC_COMPUTER)); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: memset(szCmp, 0, sizeof(szCmp)); _tcscpy(szCmp, _T("\\\\")); SendMessage(GetDlgItem(hDlg, IDC_COMPUTER), WM_GETTEXT, (WPARAM) MAX_COMPUTERNAME_LENGTH, (LPARAM) szCmp+2); _tcsupr(szCmp); if (_tcslen(szCmp) < 3) { EndDialog(hDlg, TRUE); return TRUE; } am_ConnectComputer(szCmp); SendMessage(g_hwndMain, WM_TIMER, WM_TIMER_RESCAN, 0); case IDCANCEL: EndDialog(hDlg, TRUE); return TRUE; case IDC_LBROWSE: { BROWSEINFO bi; ITEMIDLIST *il; LPMALLOC pMalloc; memset(&bi, 0, sizeof(BROWSEINFO)); SHGetSpecialFolderLocation(hDlg, CSIDL_NETWORK, &il);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -