get_wmi_check_timeout(wmi_namespace, "select CSDVersion from Win32_OperatingSystem", &os_csdversion, start_time,
#pragma comment(lib, "user32.lib")
static wchar_t *read_registry_value(HKEY hKey, LPCTSTR name)
if (ERROR_SUCCESS == RegQueryValueEx(hKey, name, NULL, NULL, NULL, &szData))
value = zbx_malloc(NULL, szData);
if (ERROR_SUCCESS != RegQueryValueEx(hKey, name, NULL, NULL, (LPBYTE)value, &szData))
const OSVERSIONINFOEX *zbx_win_getversion(void)
#define ZBX_REGKEY_VERSION "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"
#define ZBX_REGVALUE_CURRENTVERSION "CurrentVersion"
#define ZBX_REGVALUE_CURRENTBUILDNUMBER "CurrentBuildNumber"
#define ZBX_REGVALUE_CSDVERSION "CSDVersion"
#define ZBX_REGKEY_PRODUCT "System\\CurrentControlSet\\Control\\ProductOptions"
#define ZBX_REGVALUE_PRODUCTTYPE "ProductType"
static OSVERSIONINFOEX vi = {sizeof(OSVERSIONINFOEX)};
OSVERSIONINFOEX *pvi = NULL;
HKEY h_key_registry = NULL;
wchar_t *key_value = NULL, *ptr;
if (0 != vi.dwMajorVersion)
if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT(ZBX_REGKEY_VERSION), 0, KEY_READ, &h_key_registry))
zabbix_log(LOG_LEVEL_DEBUG, "failed to open registry key '%s'", ZBX_REGKEY_VERSION);
if (NULL == (key_value = read_registry_value(h_key_registry, TEXT(ZBX_REGVALUE_CURRENTVERSION))))
zabbix_log(LOG_LEVEL_DEBUG, "failed to read registry value '%s'", ZBX_REGVALUE_CURRENTVERSION);
if (NULL != (ptr = wcschr(key_value, TEXT('.'))))
vi.dwMinorVersion = _wtoi(ptr);
vi.dwMajorVersion = _wtoi(key_value);
if (6 > vi.dwMajorVersion || 2 > vi.dwMinorVersion)