int PROC_INFO(AGENT_REQUEST *request, AGENT_RESULT *result) { DWORD *procList, dwSize; HANDLE hProcess; char *proc_name, *attr, *type, baseName[MAX_PATH]; const char *attrList[] = {"vmsize", "wkset", "pf", "ktime", "utime", "gdiobj", "userobj", "io_read_b", "io_read_op", "io_write_b", "io_write_op", "io_other_b", "io_other_op", NULL}, *typeList[] = {"min", "max", "avg", "sum", NULL}; double value; int i, proc_cnt, counter, attr_id, type_id, ret = SYSINFO_RET_OK; if (3 < request->nparam) return SYSINFO_RET_FAIL; proc_name = get_rparam(request, 0); attr = get_rparam(request, 1); type = get_rparam(request, 2); if (NULL == proc_name || '\0' == *proc_name) return SYSINFO_RET_FAIL; /* Get attribute code from string */ if (NULL == attr || '\0' == *attr) { for (attr_id = 0; NULL != attrList[attr_id] && 0 != strcmp(attrList[attr_id], "vmsize"); attr_id++) ; } else { for (attr_id = 0; NULL != attrList[attr_id] && 0 != strcmp(attrList[attr_id], attr); attr_id++) ; } if (NULL == attrList[attr_id]) /* Unsupported attribute */ return SYSINFO_RET_FAIL; /* Get type code from string */ if (NULL == type || '\0' == *type) { for (type_id = 0; NULL != typeList[type_id] && 0 != strcmp(typeList[type_id], "avg"); type_id++) ; } else { for (type_id = 0; NULL != typeList[type_id] && 0 != strcmp(typeList[type_id], type); type_id++) ; } if (NULL == typeList[type_id]) return SYSINFO_RET_FAIL; /* Unsupported type */ procList = (DWORD *)malloc(MAX_PROCESSES * sizeof(DWORD)); EnumProcesses(procList, sizeof(DWORD) * MAX_PROCESSES, &dwSize); proc_cnt = dwSize / sizeof(DWORD); counter = 0; value = 0; for (i = 0; i < proc_cnt; i++) { if (NULL != (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE, procList[i]))) { if (SUCCEED == zbx_get_processname(hProcess, baseName)) if (0 == stricmp(baseName, proc_name)) if (SYSINFO_RET_OK != (ret = GetProcessAttribute(hProcess, attr_id, type_id, counter++, &value))) break; CloseHandle(hProcess); } } free(procList); if (SYSINFO_RET_OK == ret) SET_DBL_RESULT(result, value); return ret; }
int PROC_INFO(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { DWORD *procList, dwSize; HANDLE hProcess; char proc_name[MAX_PATH], attr[MAX_PATH], type[MAX_PATH], baseName[MAX_PATH]; const char *attrList[] = {"vmsize", "wkset", "pf", "ktime", "utime", "gdiobj", "userobj", "io_read_b", "io_read_op", "io_write_b", "io_write_op", "io_other_b", "io_other_op", NULL}, *typeList[] = {"min", "max", "avg", "sum", NULL}; double value; int i, proc_cnt, counter, attr_id, type_id, ret = SYSINFO_RET_OK; if (num_param(param) > 3) return SYSINFO_RET_FAIL; if (0 != get_param(param, 1, proc_name, sizeof(proc_name))) *proc_name = '\0'; if ('\0' == *proc_name) return SYSINFO_RET_FAIL; if (0 != get_param(param, 2, attr, sizeof(attr))) *attr = '\0'; if ('\0' == *attr) /* default parameter */ zbx_snprintf(attr, sizeof(attr), "%s", attrList[0]); if (0 != get_param(param, 3, type, sizeof(type))) *type = '\0'; if ('\0' == *type) /* default parameter */ zbx_snprintf(type, sizeof(type), "%s", typeList[2]); /* Get attribute code from string */ for (attr_id = 0; NULL != attrList[attr_id] && 0 != strcmp(attrList[attr_id], attr); attr_id++) ; if (NULL == attrList[attr_id]) /* Unsupported attribute */ return SYSINFO_RET_FAIL; /* Get type code from string */ for (type_id = 0; NULL != typeList[type_id] && 0 != strcmp(typeList[type_id], type); type_id++) ; if (NULL == typeList[type_id]) return SYSINFO_RET_FAIL; /* Unsupported type */ procList = (DWORD *)malloc(MAX_PROCESSES * sizeof(DWORD)); EnumProcesses(procList, sizeof(DWORD) * MAX_PROCESSES, &dwSize); proc_cnt = dwSize / sizeof(DWORD); counter = 0; value = 0; for (i = 0; i < proc_cnt; i++) { if (NULL != (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE, procList[i]))) { if (SUCCEED == zbx_get_processname(hProcess, baseName)) if (0 == stricmp(baseName, proc_name)) if (SYSINFO_RET_OK != (ret = GetProcessAttribute(hProcess, attr_id, type_id, counter++, &value))) break; CloseHandle(hProcess); } } free(procList); if (SYSINFO_RET_OK == ret) SET_DBL_RESULT(result, value); return ret; }
int PROC_INFO(AGENT_REQUEST *request, AGENT_RESULT *result) { HANDLE hProcessSnap, hProcess; PROCESSENTRY32 pe32; char *proc_name, *attr, *type, baseName[MAX_PATH]; const char *attrList[] = {"vmsize", "wkset", "pf", "ktime", "utime", "gdiobj", "userobj", "io_read_b", "io_read_op", "io_write_b", "io_write_op", "io_other_b", "io_other_op", NULL}, *typeList[] = {"min", "max", "avg", "sum", NULL}; double value; DWORD access; const OSVERSIONINFOEX *vi; int counter, attr_id, type_id, ret = SYSINFO_RET_OK; if (3 < request->nparam) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Too many parameters.")); return SYSINFO_RET_FAIL; } proc_name = get_rparam(request, 0); attr = get_rparam(request, 1); type = get_rparam(request, 2); if (NULL == proc_name || '\0' == *proc_name) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid first parameter.")); return SYSINFO_RET_FAIL; } /* Get attribute code from string */ if (NULL == attr || '\0' == *attr) { for (attr_id = 0; NULL != attrList[attr_id] && 0 != strcmp(attrList[attr_id], "vmsize"); attr_id++) ; } else { for (attr_id = 0; NULL != attrList[attr_id] && 0 != strcmp(attrList[attr_id], attr); attr_id++) ; } if (NULL == attrList[attr_id]) /* Unsupported attribute */ { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid second parameter.")); return SYSINFO_RET_FAIL; } /* Get type code from string */ if (NULL == type || '\0' == *type) { for (type_id = 0; NULL != typeList[type_id] && 0 != strcmp(typeList[type_id], "avg"); type_id++) ; } else { for (type_id = 0; NULL != typeList[type_id] && 0 != strcmp(typeList[type_id], type); type_id++) ; } if (NULL == typeList[type_id]) /* Unsupported type */ { SET_MSG_RESULT(result, zbx_strdup(NULL, "Invalid third parameter.")); return SYSINFO_RET_FAIL; } if (INVALID_HANDLE_VALUE == (hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0))) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot obtain system information.")); return SYSINFO_RET_FAIL; } if (NULL == (vi = zbx_win_getversion())) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot retrieve system version.")); return SYSINFO_RET_FAIL; } if (6 > vi->dwMajorVersion) { /* PROCESS_QUERY_LIMITED_INFORMATION is not supported on Windows Server 2003 and XP */ access = PROCESS_QUERY_INFORMATION; } else access = PROCESS_QUERY_LIMITED_INFORMATION; 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; } counter = 0; value = 0; do { zbx_unicode_to_utf8_static(pe32.szExeFile, baseName, MAX_NAME); if (0 == stricmp(baseName, proc_name)) { if (NULL != (hProcess = OpenProcess(access, FALSE, pe32.th32ProcessID))) { ret = GetProcessAttribute(hProcess, attr_id, type_id, counter++, &value); CloseHandle(hProcess); if (SYSINFO_RET_OK != ret) { SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot obtain process information.")); break; } } } } while (TRUE == Process32Next(hProcessSnap, &pe32)); CloseHandle(hProcessSnap); if (SYSINFO_RET_OK == ret) SET_DBL_RESULT(result, value); else SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot obtain process information.")); return ret; }