#include "zbxwin32.h"
#include "zbxstr.h"
#include "zbxnum.h"
#include "zbxthreads.h"
#include "zbxlog.h"
static ZBX_THREAD_LOCAL zbx_perf_counter_id_t *PerfCounterList = NULL;
static struct builtin_object_ref
{
unsigned long pdhIndex;
wchar_t eng_name[PDH_MAX_COUNTER_NAME];
DWORD minSupported_dwMajorVersion;
DWORD minSupported_dwMinorVersion;
}
builtin_object_map[] =
{
{ 0, L"System", 0, 0 },
{ 0, L"Processor", 0, 0 },
{ 0, L"Processor Information", 6, 1 },
{ 0, L"Terminal Services", 0, 0 }
};
typedef enum
{
POI_SYSTEM = 0,
POI_PROCESSOR,
POI_PROCESSOR_INFORMATION,
POI_TERMINAL_SERVICES,
POI_MAX_INDEX = POI_TERMINAL_SERVICES
}
zbx_builtin_object_ref_t;
static struct builtin_counter_ref
{
unsigned long pdhIndex;
zbx_builtin_object_ref_t object;
wchar_t eng_name[PDH_MAX_COUNTER_NAME];
DWORD minSupported_dwMajorVersion;
DWORD minSupported_dwMinorVersion;
}
builtin_counter_map[] =
{
{ 0, POI_SYSTEM, L"Processor Queue Length", 0, 0},
{ 0, POI_SYSTEM, L"System Up Time", 0, 0},
{ 0, POI_PROCESSOR, L"% Processor Time", 0, 0},
{ 0, POI_PROCESSOR_INFORMATION, L"% Processor Time", 6, 1},
{ 0, POI_TERMINAL_SERVICES, L"Total Sessions", 0, 0}
};
PDH_STATUS zbx_PdhMakeCounterPath(const char *function, PDH_COUNTER_PATH_ELEMENTS *cpe, char *counterpath)
{
DWORD dwSize = PDH_MAX_COUNTER_PATH;
wchar_t *wcounterPath = NULL;
PDH_STATUS pdh_status;
wcounterPath = zbx_malloc(wcounterPath, sizeof(wchar_t) * PDH_MAX_COUNTER_PATH);
if (ERROR_SUCCESS != (pdh_status = PdhMakeCounterPath(cpe, wcounterPath, &dwSize, 0)))
{
char *object, *counter;
object = zbx_unicode_to_utf8(cpe->szObjectName);
counter = zbx_unicode_to_utf8(cpe->szCounterName);
zabbix_log(LOG_LEVEL_ERR, "%s(): cannot make counterpath for \"\\%s\\%s\": %s",
function, object, counter, zbx_strerror_from_module(pdh_status, L"PDH.DLL"));
zbx_free(counter);
zbx_free(object);
}