📄 apachemonitor.c
字号:
hWnd = FindWindow("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(){ CHAR szKey[MAX_PATH]; CHAR achKey[MAX_PATH]; CHAR szImagePath[MAX_PATH]; CHAR szBuf[MAX_PATH]; CHAR 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, "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) { lstrcpy(szKey, "System\\CurrentControlSet\\Services\\"); lstrcat(szKey, achKey); if (RegOpenKeyEx(hKeyRemote, szKey, 0, KEY_QUERY_VALUE, &hSubKey) == ERROR_SUCCESS) { dwBufLen = MAX_PATH; rv = RegQueryValueEx(hSubKey, "ImagePath", NULL, &dwKeyType, szImagePath, &dwBufLen); if (rv == ERROR_SUCCESS && (dwKeyType == REG_SZ || dwKeyType == REG_EXPAND_SZ) && dwBufLen) { lstrcpy(szBuf, szImagePath); CharLower(szBuf); /* the service name could be Apache*.exe */ /* the service name could be httpd*.exe or Apache*.exe */ if (((strstr(szBuf, "\\apache") != NULL) || (strstr(szBuf, "\\httpd") != NULL)) && strstr(szBuf, ".exe") && (strstr(szBuf, "--ntservice") != NULL || strstr(szBuf, "-k ") != NULL)) { g_stServices[stPos].szServiceName = strdup(achKey); g_stServices[stPos].szImagePath = strdup(szImagePath); g_stServices[stPos].szComputerName = strdup(g_stComputers[computers].szComputerName); dwBufLen = MAX_PATH; if (RegQueryValueEx(hSubKey, "Description", NULL, &dwKeyType, szBuf, &dwBufLen) == ERROR_SUCCESS) { g_stServices[stPos].szDescription = strdup(szBuf); } dwBufLen = MAX_PATH; if (RegQueryValueEx(hSubKey, "DisplayName", NULL, &dwKeyType, szBuf, &dwBufLen) == ERROR_SUCCESS) { if (strcmp(g_stComputers[computers] .szComputerName, g_szLocalHost) != 0) { strcpy(szTmp, g_stComputers[computers] .szComputerName + 2); strcat(szTmp, "@"); strcat(szTmp, szBuf); } else { strcpy(szTmp, szBuf); } g_stServices[stPos].szDisplayName = strdup(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){ CHAR 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, MAX_COMPUTERNAME_LENGTH+4); strcpy(szCmp, "\\\\"); SendMessage(GetDlgItem(hDlg, IDC_COMPUTER), WM_GETTEXT, (WPARAM) MAX_COMPUTERNAME_LENGTH, (LPARAM) szCmp+2); strupr(szCmp); if (strlen(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); bi.lpszTitle = "ApacheMonitor :\nSelect Network Computer!"; bi.pszDisplayName = szCmp; bi.hwndOwner = hDlg; bi.ulFlags = BIF_BROWSEFORCOMPUTER; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; bi.pidlRoot = il; if (SHBrowseForFolder(&bi) != NULL) { SendMessage(GetDlgItem(hDlg, IDC_COMPUTER), WM_SETTEXT, (WPARAM) NULL, (LPARAM) szCmp); } if (SHGetMalloc(&pMalloc)) { pMalloc->lpVtbl->Free(pMalloc, il); pMalloc->lpVtbl->Release(pMalloc); } return TRUE; } } break; case WM_QUIT: case WM_CLOSE: EndDialog(hDlg, TRUE); return TRUE; default: return FALSE; } return FALSE;}LRESULT CALLBACK ServiceDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){ CHAR szBuf[MAX_PATH]; HWND hListBox; static HWND hStatusBar; TEXTMETRIC tm; int i, y; HDC hdcMem; RECT rcBitmap; UINT nItem; LPMEASUREITEMSTRUCT lpmis; LPDRAWITEMSTRUCT lpdis; memset(szBuf, 0, MAX_PATH); switch (message) { case WM_INITDIALOG: ShowWindow(hDlg, SW_HIDE); g_hwndServiceDlg = hDlg; SetWindowText(hDlg, g_szTitle); Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE); Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE); Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE); Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), FALSE); SetWindowText(GetDlgItem(hDlg, IDC_SSTART), g_lpMsg[IDS_MSG_SSTART - IDS_MSG_FIRST]); SetWindowText(GetDlgItem(hDlg, IDC_SSTOP), g_lpMsg[IDS_MSG_SSTOP - IDS_MSG_FIRST]); SetWindowText(GetDlgItem(hDlg, IDC_SRESTART), g_lpMsg[IDS_MSG_SRESTART - IDS_MSG_FIRST]); SetWindowText(GetDlgItem(hDlg, IDC_SMANAGER), g_lpMsg[IDS_MSG_SERVICES - IDS_MSG_FIRST]); SetWindowText(GetDlgItem(hDlg, IDC_SCONNECT), g_lpMsg[IDS_MSG_CONNECT - IDS_MSG_FIRST]); SetWindowText(GetDlgItem(hDlg, IDC_SEXIT), g_lpMsg[IDS_MSG_MNUEXIT - IDS_MSG_FIRST]); if (g_dwOSVersion < OS_VERSION_WINNT) { ShowWindow(GetDlgItem(hDlg, IDC_SMANAGER), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_SCONNECT), SW_HIDE); ShowWindow(GetDlgItem(hDlg, IDC_SDISCONN), SW_HIDE); } hListBox = GetDlgItem(hDlg, IDL_SERVICES); g_hwndStdoutList = GetDlgItem(hDlg, IDL_STDOUT); hStatusBar = CreateStatusWindow(0x0800 /* SBT_TOOLTIPS */ | WS_CHILD | WS_VISIBLE, "", hDlg, IDC_STATBAR); if (GetApacheServicesStatus()) { i = 0; while (g_stServices[i].szServiceName != NULL) { addListBoxItem(hListBox, g_stServices[i].szDisplayName, g_stServices[i].dwPid == 0 ? g_hBmpStop : g_hBmpStart); ++i; } } CenterWindow(hDlg); ShowWindow(hDlg, SW_SHOW); SetFocus(hListBox); SendMessage(hListBox, LB_SETCURSEL, 0, 0); return TRUE; break; case WM_MANAGEMESSAGE: ApacheManageService(g_stServices[LOWORD(wParam)].szServiceName, g_stServices[LOWORD(wParam)].szImagePath, g_stServices[LOWORD(wParam)].szComputerName, LOWORD(lParam)); return TRUE; break; case WM_UPDATEMESSAGE: hListBox = GetDlgItem(hDlg, IDL_SERVICES); SendMessage(hListBox, LB_RESETCONTENT, 0, 0); SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)""); Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE); Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE); Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE); Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), FALSE); i = 0; while (g_stServices[i].szServiceName != NULL) { addListBoxItem(hListBox, g_stServices[i].szDisplayName, g_stServices[i].dwPid == 0 ? g_hBmpStop : g_hBmpStart); ++i; } SendMessage(hListBox, LB_SETCURSEL, 0, 0); /* Dirty hack to bring the window to the foreground */ SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); SetWindowPos(hDlg, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); SetFocus(hListBox); return TRUE; break; case WM_MEASUREITEM: lpmis = (LPMEASUREITEMSTRUCT) lParam; lpmis->itemHeight = YBITMAP; return TRUE; case WM_SETCURSOR: if (g_bConsoleRun) { SetCursor(g_hCursorHourglass); } else { SetCursor(g_hCursorArrow); } return TRUE; case WM_DRAWITEM: lpdis = (LPDRAWITEMSTRUCT) lParam; if (lpdis->itemID == -1) { break; } switch (lpdis->itemAction) { case ODA_SELECT: case ODA_DRAWENTIRE: g_hBmpPicture = (HBITMAP)SendMessage(lpdis->hwndItem, LB_GETITEMDATA, lpdis->itemID, (LPARAM) 0); hdcMem = CreateCompatibleDC(lpdis->hDC); g_hBmpOld = SelectObject(hdcMem, g_hBmpPicture); BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right - lpdis->rcItem.left, lpdis->rcItem.bottom - lpdis->rcItem.top, hdcMem, 0, 0, SRCCOPY); SendMessage(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, (LPARAM) szBuf); GetTextMetrics(lpdis->hDC, &tm); y = (lpdis->rcItem.bottom + lpdis->rcItem.top - tm.tmHeight) / 2; SelectObject(hdcMem, g_hBmpOld); DeleteDC(hdcMem); rcBitmap.left = lpdis->rcItem.left + XBITMAP + 2; rcBitmap.top = lpdis->rcItem.top; rcBitmap.right = lpdis->rcItem.right; rcBitmap.bottom = lpdis->rcItem.top + YBITMAP; if (lpdis->itemState & ODS_SELECTED) { if (g_hBmpPicture == g_hBmpStop) { Button_Enable(GetDlgItem(hDlg, IDC_SSTART), TRUE); Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE); Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE); } else if (g_hBmpPicture == g_hBmpStart) { Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE); Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), TRUE); Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), TRUE); } else { Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE); Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE); Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE); } if (strcmp(g_stServices[lpdis->itemID].szComputerName, g_szLocalHost) == 0) { Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), FALSE); } else { Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), TRUE); } if (g_stServices[lpdis->itemID].szDescription) { SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)g_stServices[lpdis->itemID].szDescription); } else { SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)""); } SetTextColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); SetBkColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT)); FillRect(lpdis->hDC, &rcBitmap, (HBRUSH)(COLOR_HIGHLIGHTTEXT)); } else { SetTextColor(lpdis->hDC, GetSysColor(COLOR_MENUTEXT));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -