#include "zbxsysinc.h"
#include <comdef.h>
#include <Wbemidl.h>
extern "C"
{
# include "../sysinfo.h"
# include "zbxstr.h"
# include "zbxlog.h"
# include "zbxalgo.h"
# include "zbxjson.h"
}
#pragma comment(lib, "wbemuuid.lib")
typedef struct
{
BSTR name;
VARIANT *value;
}
zbx_wmi_prop_t;
ZBX_VECTOR_DECL(wmi_prop, zbx_wmi_prop_t)
ZBX_VECTOR_IMPL(wmi_prop, zbx_wmi_prop_t)
ZBX_PTR_VECTOR_DECL(wmi_instance, zbx_vector_wmi_prop_t *)
ZBX_PTR_VECTOR_IMPL(wmi_instance, zbx_vector_wmi_prop_t *)
extern "C" static void wmi_prop_clear(zbx_wmi_prop_t *prop)
{
SysFreeString(prop->name);
VariantClear(prop->value);
zbx_free(prop->value);
}
extern "C" static void wmi_instance_clear(zbx_vector_wmi_prop_t *wmi_inst_value)
{
for (int i = 0; i < wmi_inst_value->values_num; i++)
wmi_prop_clear(&wmi_inst_value->values[i]);
zbx_vector_wmi_prop_destroy(wmi_inst_value);
zbx_free(wmi_inst_value);
}
typedef int (*zbx_parse_wmi_t)(IEnumWbemClassObject *pEnumerator, double timeout,
zbx_vector_wmi_instance_t *wmi_values, char **error);
extern "C" int put_variant_json(const char *prop_json, const char *prop_err, VARIANT *vtProp, struct zbx_json *jdoc,
char **error);
static ZBX_THREAD_LOCAL int com_initialized = 0;
extern "C" int zbx_co_initialize()
{
if (0 == com_initialized)
{
HRESULT hres;
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
zabbix_log(LOG_LEVEL_DEBUG, "cannot initialized COM library");
return FAIL;
}
hres = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
if (FAILED(hres) && RPC_E_TOO_LATE != hres)
{
zabbix_log(LOG_LEVEL_DEBUG, "cannot set default security levels for COM library");
CoUninitialize();
return FAIL;