int PROC_NUM(AGENT_REQUEST *request, AGENT_RESULT *result) { HANDLE hProcess; DWORD procList[MAX_PROCESSES], dwSize; int i, proccount, max_proc_cnt, proc_ok = 0, user_ok = 0; char *procName, *userName, baseName[MAX_PATH], uname[MAX_NAME]; if (2 < request->nparam) return SYSINFO_RET_FAIL; procName = get_rparam(request, 0); userName = get_rparam(request, 1); if (0 == EnumProcesses(procList, sizeof(DWORD) * MAX_PROCESSES, &dwSize)) return SYSINFO_RET_FAIL; max_proc_cnt = dwSize / sizeof(DWORD); proccount = 0; for (i = 0; i < max_proc_cnt; i++) { proc_ok = 0; user_ok = 0; if (NULL != (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, procList[i]))) { if (NULL != procName && '\0' != *procName) { if (SUCCEED == zbx_get_processname(hProcess, baseName)) if (0 == stricmp(baseName, procName)) proc_ok = 1; } else proc_ok = 1; if (0 != proc_ok && NULL != userName && '\0' != *userName) { if (SUCCEED == zbx_get_process_username(hProcess, uname)) if (0 == stricmp(uname, userName)) user_ok = 1; } else user_ok = 1; if (0 != user_ok && 0 != proc_ok) proccount++; CloseHandle(hProcess); } } SET_UI64_RESULT(result, proccount); return SYSINFO_RET_OK; }
int PROC_NUM(AGENT_REQUEST *request, AGENT_RESULT *result) { HANDLE hProcessSnap, hProcess; PROCESSENTRY32 pe32; int proccount, proc_ok; char *procName, *userName, baseName[MAX_PATH], uname[MAX_NAME]; if (2 < request->nparam) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); return SYSINFO_RET_FAIL; } procName = get_rparam(request, 0); userName = get_rparam(request, 1); if (INVALID_HANDLE_VALUE == (hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0))) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot obtain system information.")); return SYSINFO_RET_FAIL; } pe32.dwSize = sizeof(PROCESSENTRY32); if (FALSE == Process32First(hProcessSnap, &pe32)) { CloseHandle(hProcessSnap); SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot obtain system information.")); return SYSINFO_RET_FAIL; } proccount = 0; do { proc_ok = 1; if (NULL != procName && '\0' != *procName) { zbx_unicode_to_utf8_static(pe32.szExeFile, baseName, MAX_NAME); if (0 != stricmp(baseName, procName)) proc_ok = 0; } if (0 != proc_ok && NULL != userName && '\0' != *userName) { hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pe32.th32ProcessID); if (NULL == hProcess || SUCCEED != zbx_get_process_username(hProcess, uname) || 0 != stricmp(uname, userName)) { proc_ok = 0; } if (NULL != hProcess) CloseHandle(hProcess); } if (0 != proc_ok) proccount++; } while (TRUE == Process32Next(hProcessSnap, &pe32)); CloseHandle(hProcessSnap); SET_UI64_RESULT(result, proccount); return SYSINFO_RET_OK; }