From: norbert.bizet Date: Tue, 12 Apr 2022 11:48:00 +0000 (-0400) Subject: windows: change windows os version detection X-Git-Tag: Beta-15.0.0~597 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=53d614abff1845a87aea6d6a0300cf776c90c3eb;p=thirdparty%2Fbacula.git windows: change windows os version detection --- diff --git a/bacula/src/win32/libwin32/main.cpp b/bacula/src/win32/libwin32/main.cpp index e1189076b..9aa2c58bd 100644 --- a/bacula/src/win32/libwin32/main.cpp +++ b/bacula/src/win32/libwin32/main.cpp @@ -379,666 +379,53 @@ void pause_msg(const char *file, const char *func, int line, const char *msg) MessageBox(NULL, buf, "Pause", MB_OK); } -#include -#include - -#ifndef PRODUCT_UNLICENSED -#define PRODUCT_UNLICENSED 0xABCDABCD -#define PRODUCT_BUSINESS 0x00000006 -#define PRODUCT_BUSINESS_N 0x00000010 -#define PRODUCT_CLUSTER_SERVER 0x00000012 -#define PRODUCT_DATACENTER_SERVER 0x00000008 -#define PRODUCT_DATACENTER_SERVER_CORE 0x0000000C -#define PRODUCT_DATACENTER_SERVER_CORE_V 0x00000027 -#define PRODUCT_DATACENTER_SERVER_V 0x00000025 -#define PRODUCT_ENTERPRISE 0x00000004 -#define PRODUCT_ENTERPRISE_E 0x00000046 -#define PRODUCT_ENTERPRISE_N 0x0000001B -#define PRODUCT_ENTERPRISE_SERVER 0x0000000A -#define PRODUCT_ENTERPRISE_SERVER_CORE 0x0000000E -#define PRODUCT_ENTERPRISE_SERVER_CORE_V 0x00000029 -#define PRODUCT_ENTERPRISE_SERVER_IA64 0x0000000F -#define PRODUCT_ENTERPRISE_SERVER_V 0x00000026 -#define PRODUCT_HOME_BASIC 0x00000002 -#define PRODUCT_HOME_BASIC_E 0x00000043 -#define PRODUCT_HOME_BASIC_N 0x00000005 -#define PRODUCT_HOME_PREMIUM 0x00000003 -#define PRODUCT_HOME_PREMIUM_E 0x00000044 -#define PRODUCT_HOME_PREMIUM_N 0x0000001A -#define PRODUCT_HYPERV 0x0000002A -#define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT 0x0000001E -#define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING 0x00000020 -#define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY 0x0000001F -#define PRODUCT_PROFESSIONAL 0x00000030 -#define PRODUCT_PROFESSIONAL_E 0x00000045 -#define PRODUCT_PROFESSIONAL_N 0x00000031 -#define PRODUCT_SERVER_FOR_SMALLBUSINESS 0x00000018 -#define PRODUCT_SERVER_FOR_SMALLBUSINESS_V 0x00000023 -#define PRODUCT_SERVER_FOUNDATION 0x00000021 -#define PRODUCT_SMALLBUSINESS_SERVER 0x00000009 -#define PRODUCT_SOLUTION_EMBEDDEDSERVER 0x00000038 -#define PRODUCT_STANDARD_SERVER 0x00000007 -#define PRODUCT_STANDARD_SERVER_CORE 0x0000000D -#define PRODUCT_STANDARD_SERVER_CORE_V 0x00000028 -#define PRODUCT_STANDARD_SERVER_V 0x00000024 -#define PRODUCT_STARTER 0x0000000B -#define PRODUCT_STARTER_E 0x00000042 -#define PRODUCT_STARTER_N 0x0000002F -#define PRODUCT_STORAGE_ENTERPRISE_SERVER 0x00000017 -#define PRODUCT_STORAGE_EXPRESS_SERVER 0x00000014 -#define PRODUCT_STORAGE_STANDARD_SERVER 0x00000015 -#define PRODUCT_STORAGE_WORKGROUP_SERVER 0x00000016 -#define PRODUCT_UNDEFINED 0x00000000 -#define PRODUCT_ULTIMATE 0x00000001 -#define PRODUCT_ULTIMATE_E 0x00000047 -#define PRODUCT_ULTIMATE_N 0x0000001C -#define PRODUCT_WEB_SERVER 0x00000011 -#define PRODUCT_WEB_SERVER_CORE 0x0000001D - -#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM 0x19 -#define SM_SERVERR2 89 -#define VER_SERVER_NT 0x80000000 - -#define PRODUCT_CLUSTER_SERVER_V 0x00000040 -#define PRODUCT_ENTERPRISE_EVALUATION 0x00000048 -#define PRODUCT_ENTERPRISE_N_EVALUATION 0x00000054 -#define PRODUCT_HOME_PREMIUM_SERVER 0x00000022 -#define PRODUCT_HOME_SERVER 0x00000013 -#define PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE 0x0000002E -#define PRODUCT_STORAGE_EXPRESS_SERVER_CORE 0x0000002B -#define PRODUCT_STORAGE_STANDARD_SERVER_CORE 0x0000002C -#define PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER 0x00000060 -#define PRODUCT_STORAGE_WORKGROUP_SERVER_CORE 0x0000002D -#define PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER 0x0000005F -#define PRODUCT_CORE 0x00000065 -#define PRODUCT_CORE_COUNTRYSPECIFIC 0x00000063 -#define PRODUCT_CORE_N 0x00000062 -#define PRODUCT_CORE_SINGLELANGUAGE 0x00000064 -#define PRODUCT_DATACENTER_EVALUATION_SERVER 0x00000050 -#define PRODUCT_DATACENTER_A_SERVER_CORE 0x00000091 -#define PRODUCT_STANDARD_A_SERVER_CORE 0x00000092 -#define PRODUCT_EDUCATION 0x00000079 -#define PRODUCT_EDUCATION_N 0x0000007A -#define PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL 0x0000003C -#define PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC 0x0000003E -#define PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT 0x0000003B -#define PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC 0x0000003D -#define PRODUCT_MOBILE_CORE 0x00000068 -#define PRODUCT_MOBILE_ENTERPRISE 0x00000085 -#define PRODUCT_MULTIPOINT_PREMIUM_SERVER 0x0000004D -#define PRODUCT_MULTIPOINT_STANDARD_SERVER 0x0000004C -#define PRODUCT_PRO_WORKSTATION 0x000000A1 -#define PRODUCT_PRO_WORKSTATION_N 0x000000A2 -#define PRODUCT_PROFESSIONAL_WMC 0x00000067 -#define PRODUCT_SB_SOLUTION_SERVER 0x00000032 -#define PRODUCT_SB_SOLUTION_SERVER_EM 0x00000036 -#define PRODUCT_SERVER_FOR_SB_SOLUTIONS 0x00000033 -#define PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM 0x00000037 -#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE 0x0000003F -#define PRODUCT_STANDARD_EVALUATION_SERVER 0x0000004F -#define PRODUCT_STANDARD_SERVER_SOLUTIONS 0x00000034 -#define PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE 0x00000035 -#endif - -/* Windows 10 */ -#ifndef PRODUCT_ENTERPRISE_S -#define PRODUCT_ENTERPRISE_S 0x0000007D -#define PRODUCT_ENTERPRISE_S_EVALUATION 0x00000081 -#define PRODUCT_ENTERPRISE_S_N 0x0000007E -#define PRODUCT_ENTERPRISE_S_N_EVALUATION 0x00000082 -#endif -#ifndef PRODUCT_IOTUAP -#define PRODUCT_IOTUAP 0x0000007B -#endif -#ifndef PRODUCT_IOTUAPCOMMERCIAL -#define PRODUCT_IOTUAPCOMMERCIAL 0x00000083 -#endif - -#define PRODUCT_DATACENTER_A_SERVER_CORE 0x00000091 -#define PRODUCT_PRO_WORKSTATION 0x000000A1 -#define PRODUCT_PRO_WORKSTATION_N 0x000000A2 -#define PRODUCT_STANDARD_A_SERVER_CORE 0x00000092 - - - - -#ifndef PRODUCT_PROFESSIONAL -#define PRODUCT_PROFESSIONAL 0x00000030 -#endif -#ifndef VER_SUITE_STORAGE_SERVER -#define VER_SUITE_STORAGE_SERVER 0x00002000 -#endif -#ifndef VER_SUITE_COMPUTE_SERVER -#define VER_SUITE_COMPUTE_SERVER 0x00004000 -#endif - -/* Unknown value */ -#ifndef VER_SUITE_WH_SERVER -#define VER_SUITE_WH_SERVER -1 -#endif - -typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); -typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD); - /* * Get Windows version display string */ bool GetWindowsVersionString(LPTSTR osbuf, int maxsiz) { - OSVERSIONINFOEX osvi; - SYSTEM_INFO si; - PGNSI pGNSI; - PGPI pGPI; - BOOL bOsVersionInfoEx; - DWORD dwType; + HRESULT hr; - memset(&si, 0, sizeof(SYSTEM_INFO)); - memset(&osvi, 0, sizeof(OSVERSIONINFOEX)); + HKEY currentVersionKey; - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - - if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) - return 1; + DWORD type; + DWORD size; - // Call GetNativeSystemInfo if supported or GetSystemInfo otherwise. + *osbuf = 0; + char *p = osbuf; - pGNSI = (PGNSI)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), - "GetNativeSystemInfo"); - if (pGNSI) { - pGNSI(&si); - } else { - GetSystemInfo(&si); + hr = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_ALL_ACCESS, ¤tVersionKey); + if (hr != ERROR_SUCCESS) { + return false; } - if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion > 4) { - bstrncpy(osbuf, TEXT("Microsoft "), maxsiz); - - // Test for the specific product. - - if (osvi.dwMajorVersion == 10) { - if (osvi.dwMinorVersion == 0) { - if (osvi.wProductType == VER_NT_WORKSTATION) - bstrncat(osbuf, TEXT("Windows 10 "), maxsiz); - else - bstrncat(osbuf, TEXT("Windows Server 2016 " ), maxsiz); - } - - pGPI = (PGPI)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), - "GetProductInfo"); - - if (pGPI) { - pGPI(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType); - } else { - dwType = PRODUCT_HOME_BASIC; - } - - switch (dwType) { - case PRODUCT_ULTIMATE: - bstrncat(osbuf, TEXT("Ultimate Edition" ), maxsiz); - break; - case PRODUCT_PROFESSIONAL: - bstrncat(osbuf, TEXT("Professional" ), maxsiz); - break; - case PRODUCT_HOME_PREMIUM: - bstrncat(osbuf, TEXT("Home Premium Edition" ), maxsiz); - break; - case PRODUCT_HOME_BASIC: - bstrncat(osbuf, TEXT("Home Basic Edition" ), maxsiz); - break; - case PRODUCT_ENTERPRISE: - bstrncat(osbuf, TEXT("Enterprise Edition" ), maxsiz); - break; - case PRODUCT_BUSINESS: - bstrncat(osbuf, TEXT("Business Edition" ), maxsiz); - break; - case PRODUCT_BUSINESS_N: - bstrncat(osbuf, TEXT("Business Edition N" ), maxsiz); - break; - case PRODUCT_CORE: - bstrncat(osbuf, TEXT("Home Edition" ), maxsiz); - break; - case PRODUCT_CORE_COUNTRYSPECIFIC: - bstrncat(osbuf, TEXT("Home China Edition" ), maxsiz); - break; - case PRODUCT_CORE_N: - bstrncat(osbuf, TEXT("Home N Edition" ), maxsiz); - break; - case PRODUCT_CORE_SINGLELANGUAGE: - bstrncat(osbuf, TEXT("Home Single Language Edition" ), maxsiz); - break; - case PRODUCT_DATACENTER_EVALUATION_SERVER: - bstrncat(osbuf, TEXT("Server Datacenter (evaluation installation)" ), maxsiz); - break; - case PRODUCT_DATACENTER_A_SERVER_CORE: - bstrncat(osbuf, TEXT("Server Datacenter, Semi-Annual Channel (core installation)" ), maxsiz); - break; - case PRODUCT_STANDARD_A_SERVER_CORE: - bstrncat(osbuf, TEXT("Server Standard, Semi-Annual Channel (core installation)" ), maxsiz); - break; - case PRODUCT_DATACENTER_SERVER_CORE_V: - bstrncat(osbuf, TEXT("Server Datacenter without Hyper-V (core installation)" ), maxsiz); - break; - case PRODUCT_DATACENTER_SERVER_V: - bstrncat(osbuf, TEXT("Server Datacenter without Hyper-V (full installation)" ), maxsiz); - break; - case PRODUCT_EDUCATION: - bstrncat(osbuf, TEXT("Education" ), maxsiz); - break; - case PRODUCT_EDUCATION_N: - bstrncat(osbuf, TEXT("Education N" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_E: - bstrncat(osbuf, TEXT("Enterprise E" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_EVALUATION: - bstrncat(osbuf, TEXT("Enterprise Evaluation" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_N: - bstrncat(osbuf, TEXT("Enterprise N" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_N_EVALUATION: - bstrncat(osbuf, TEXT("Enterprise N Evaluation" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_S: - bstrncat(osbuf, TEXT("Enterprise 2015 LTSB" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_S_EVALUATION: - bstrncat(osbuf, TEXT("Enterprise 2015 LTSB Evaluation" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_S_N: - bstrncat(osbuf, TEXT("Enterprise 2015 LTSB N" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_S_N_EVALUATION: - bstrncat(osbuf, TEXT("Enterprise 2015 LTSB N Evaluation" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_SERVER: - bstrncat(osbuf, TEXT("Enterprise (full installation)" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_SERVER_CORE_V: - bstrncat(osbuf, TEXT("Server Enterprise without Hyper-V (core installation)" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_SERVER_IA64: - bstrncat(osbuf, TEXT("Server Enterprise for Itanium-based Systems" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_SERVER_V: - bstrncat(osbuf, TEXT("Server Enterprise without Hyper-V (full installation)" ), maxsiz); - break; - case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL: - bstrncat(osbuf, TEXT("Essential Server Solution Additional" ), maxsiz); - break; - case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC: - bstrncat(osbuf, TEXT("Essential Server Solution Additional SVC" ), maxsiz); - break; - case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT: - bstrncat(osbuf, TEXT("Essential Server Solution Management" ), maxsiz); - break; - case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC: - bstrncat(osbuf, TEXT("Essential Server Solution Management SVC" ), maxsiz); - break; - case PRODUCT_HOME_BASIC_E: - bstrncat(osbuf, TEXT("Not supported" ), maxsiz); - break; - case PRODUCT_HOME_BASIC_N: - bstrncat(osbuf, TEXT("Home Basic N" ), maxsiz); - break; - case PRODUCT_HOME_PREMIUM_E: - bstrncat(osbuf, TEXT("Not supported" ), maxsiz); - break; - case PRODUCT_HOME_PREMIUM_N: - bstrncat(osbuf, TEXT("Home Premium N" ), maxsiz); - break; - case PRODUCT_HOME_PREMIUM_SERVER: - bstrncat(osbuf, TEXT("Home Server 2011" ), maxsiz); - break; - case PRODUCT_HOME_SERVER: - bstrncat(osbuf, TEXT("Storage Server 2008 R2 Essentials" ), maxsiz); - break; - case PRODUCT_HYPERV: - bstrncat(osbuf, TEXT("Hyper-V Server" ), maxsiz); - break; - case PRODUCT_IOTUAP: - bstrncat(osbuf, TEXT("IoT Core" ), maxsiz); - break; - case PRODUCT_IOTUAPCOMMERCIAL: - bstrncat(osbuf, TEXT("IoT Core Commercial" ), maxsiz); - break; - case PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT: - bstrncat(osbuf, TEXT("Essential Business Server Management Server" ), maxsiz); - break; - case PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING: - bstrncat(osbuf, TEXT("Essential Business Server Messaging Server" ), maxsiz); - break; - case PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY: - bstrncat(osbuf, TEXT("Essential Business Server Security Server" ), maxsiz); - break; - case PRODUCT_MOBILE_CORE: - bstrncat(osbuf, TEXT("Mobile" ), maxsiz); - break; - case PRODUCT_MOBILE_ENTERPRISE: - bstrncat(osbuf, TEXT("Mobile Enterprise" ), maxsiz); - break; - case PRODUCT_MULTIPOINT_PREMIUM_SERVER: - bstrncat(osbuf, TEXT("MultiPoint Server Premium (full installation)" ), maxsiz); - break; - case PRODUCT_MULTIPOINT_STANDARD_SERVER: - bstrncat(osbuf, TEXT("MultiPoint Server Standard (full installation)" ), maxsiz); - break; - case PRODUCT_PRO_WORKSTATION: - bstrncat(osbuf, TEXT("Pro for Workstations" ), maxsiz); - break; - case PRODUCT_PRO_WORKSTATION_N: - bstrncat(osbuf, TEXT("Pro for Workstations N" ), maxsiz); - break; - case PRODUCT_PROFESSIONAL_E: - bstrncat(osbuf, TEXT("Not supported" ), maxsiz); - break; - case PRODUCT_PROFESSIONAL_N: - bstrncat(osbuf, TEXT("Pro N" ), maxsiz); - break; - case PRODUCT_PROFESSIONAL_WMC: - bstrncat(osbuf, TEXT("Professional with Media Center" ), maxsiz); - break; - case PRODUCT_SB_SOLUTION_SERVER: - bstrncat(osbuf, TEXT("Small Business Server 2011 Essentials" ), maxsiz); - break; - case PRODUCT_SB_SOLUTION_SERVER_EM: - bstrncat(osbuf, TEXT("Server For SB Solutions EM" ), maxsiz); - break; - case PRODUCT_SERVER_FOR_SB_SOLUTIONS: - bstrncat(osbuf, TEXT("Server For SB Solutions" ), maxsiz); - break; - case PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM: - bstrncat(osbuf, TEXT("Server For SB Solutions EM" ), maxsiz); - break; - case PRODUCT_SERVER_FOR_SMALLBUSINESS: - bstrncat(osbuf, TEXT("for Windows Essential Server Solutions" ), maxsiz); - break; - case PRODUCT_SERVER_FOR_SMALLBUSINESS_V: - bstrncat(osbuf, TEXT("without Hyper-V for Windows Essential Server Solutions" ), maxsiz); - break; - case PRODUCT_SERVER_FOUNDATION: - bstrncat(osbuf, TEXT("Server Foundation" ), maxsiz); - break; - case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE: - bstrncat(osbuf, TEXT("Small Business Server Premium (core installation)" ), maxsiz); - break; - case PRODUCT_SOLUTION_EMBEDDEDSERVER: - bstrncat(osbuf, TEXT("Windows MultiPoint Server" ), maxsiz); - break; - case PRODUCT_STANDARD_EVALUATION_SERVER: - bstrncat(osbuf, TEXT("Server Standard (evaluation installation)" ), maxsiz); - break; - case PRODUCT_STANDARD_SERVER_CORE_V: - bstrncat(osbuf, TEXT("Server Standard without Hyper-V" ), maxsiz); - break; - case PRODUCT_STANDARD_SERVER_SOLUTIONS: - bstrncat(osbuf, TEXT("Server Solutions Premium" ), maxsiz); - break; - case PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE: - bstrncat(osbuf, TEXT("Server Solutions Premium (core installation)" ), maxsiz); - break; - case PRODUCT_STARTER_E: - bstrncat(osbuf, TEXT("Not supported" ), maxsiz); - break; - case PRODUCT_STARTER_N: - bstrncat(osbuf, TEXT("Starter N" ), maxsiz); - break; - case PRODUCT_STORAGE_ENTERPRISE_SERVER: - bstrncat(osbuf, TEXT("Storage Server Enterprise" ), maxsiz); - break; - case PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE: - bstrncat(osbuf, TEXT("Storage Server Enterprise (core installation)" ), maxsiz); - break; - case PRODUCT_STORAGE_EXPRESS_SERVER: - bstrncat(osbuf, TEXT("Storage Server Express" ), maxsiz); - break; - case PRODUCT_STORAGE_EXPRESS_SERVER_CORE: - bstrncat(osbuf, TEXT("Storage Server Express (core installation)" ), maxsiz); - break; - case PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER: - bstrncat(osbuf, TEXT("Storage Server Standard (evaluation installation)" ), maxsiz); - break; - case PRODUCT_STORAGE_STANDARD_SERVER: - bstrncat(osbuf, TEXT("Storage Server Standard" ), maxsiz); - break; - case PRODUCT_STORAGE_STANDARD_SERVER_CORE: - bstrncat(osbuf, TEXT("Storage Server Standard (core installation)" ), maxsiz); - break; - case PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER: - bstrncat(osbuf, TEXT("Storage Server Workgroup (evaluation installation)" ), maxsiz); - break; - case PRODUCT_STORAGE_WORKGROUP_SERVER: - bstrncat(osbuf, TEXT("Storage Server Workgroup" ), maxsiz); - break; - case PRODUCT_STORAGE_WORKGROUP_SERVER_CORE: - bstrncat(osbuf, TEXT("Storage Server Workgroup (core installation)" ), maxsiz); - break; - case PRODUCT_ULTIMATE_E: - bstrncat(osbuf, TEXT("Not supported" ), maxsiz); - break; - case PRODUCT_ULTIMATE_N: - bstrncat(osbuf, TEXT("Ultimate N" ), maxsiz); - break; - case PRODUCT_UNDEFINED: - bstrncat(osbuf, TEXT("Unknown product" ), maxsiz); - break; - case PRODUCT_WEB_SERVER_CORE: - bstrncat(osbuf, TEXT("Web Server (core installation)" ), maxsiz); - break; - case PRODUCT_STARTER: - bstrncat(osbuf, TEXT("Starter Edition" ), maxsiz); - break; - case PRODUCT_CLUSTER_SERVER_V: - bstrncat(osbuf, TEXT("Server Hyper Core V" ), maxsiz); - break; - case PRODUCT_CLUSTER_SERVER: - bstrncat(osbuf, TEXT("Cluster Server Edition" ), maxsiz); - break; - case PRODUCT_DATACENTER_SERVER: - bstrncat(osbuf, TEXT("Datacenter Edition" ), maxsiz); - break; - case PRODUCT_DATACENTER_SERVER_CORE: - bstrncat(osbuf, TEXT("Datacenter Edition (core installation)" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_SERVER_CORE: - bstrncat(osbuf, TEXT("Enterprise Edition (core installation)" ), maxsiz); - break; - case PRODUCT_SMALLBUSINESS_SERVER: - bstrncat(osbuf, TEXT("Small Business Server" ), maxsiz); - break; - case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: - bstrncat(osbuf, TEXT("Small Business Server Premium Edition" ), maxsiz); - break; - case PRODUCT_STANDARD_SERVER: - bstrncat(osbuf, TEXT("Standard Edition" ), maxsiz); - break; - case PRODUCT_STANDARD_SERVER_CORE: - bstrncat(osbuf, TEXT("Standard Edition (core installation)" ), maxsiz); - break; - case PRODUCT_WEB_SERVER: - bstrncat(osbuf, TEXT("Web Server Edition" ), maxsiz); - break; - } - } - if (osvi.dwMajorVersion == 6) { - if (osvi.dwMinorVersion == 0) { - if (osvi.wProductType == VER_NT_WORKSTATION) - bstrncat(osbuf, TEXT("Windows Vista "), maxsiz); - else - bstrncat(osbuf, TEXT("Windows Server 2008 " ), maxsiz); - } - - if (osvi.dwMinorVersion == 1) { - if (osvi.wProductType == VER_NT_WORKSTATION ) - bstrncat(osbuf, TEXT("Windows 7 "), maxsiz); - else - bstrncat(osbuf, TEXT("Windows Server 2008 R2 " ), maxsiz); - } - if (osvi.dwMinorVersion == 2) { - if (osvi.wProductType == VER_NT_WORKSTATION ) - bstrncat(osbuf, TEXT("Windows 8 "), maxsiz); - else - bstrncat(osbuf, TEXT("Windows Server 2012 " ), maxsiz); - } - if (osvi.dwMinorVersion == 3) { - if (osvi.wProductType == VER_NT_WORKSTATION ) - bstrncat(osbuf, TEXT("Windows 8.1 "), maxsiz); - else - bstrncat(osbuf, TEXT("Windows Server 2012 RC2 " ), maxsiz); - } - - pGPI = (PGPI)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), - "GetProductInfo"); - - if (pGPI) { - pGPI(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType); - } else { - dwType = PRODUCT_HOME_BASIC; - } - - switch (dwType) { - case PRODUCT_ULTIMATE: - bstrncat(osbuf, TEXT("Ultimate Edition" ), maxsiz); - break; - case PRODUCT_PROFESSIONAL: - bstrncat(osbuf, TEXT("Professional" ), maxsiz); - break; - case PRODUCT_HOME_PREMIUM: - bstrncat(osbuf, TEXT("Home Premium Edition" ), maxsiz); - break; - case PRODUCT_HOME_BASIC: - bstrncat(osbuf, TEXT("Home Basic Edition" ), maxsiz); - break; - case PRODUCT_ENTERPRISE: - bstrncat(osbuf, TEXT("Enterprise Edition" ), maxsiz); - break; - case PRODUCT_BUSINESS: - bstrncat(osbuf, TEXT("Business Edition" ), maxsiz); - break; - case PRODUCT_STARTER: - bstrncat(osbuf, TEXT("Starter Edition" ), maxsiz); - break; - case PRODUCT_CLUSTER_SERVER: - bstrncat(osbuf, TEXT("Cluster Server Edition" ), maxsiz); - break; - case PRODUCT_DATACENTER_SERVER: - bstrncat(osbuf, TEXT("Datacenter Edition" ), maxsiz); - break; - case PRODUCT_DATACENTER_SERVER_CORE: - bstrncat(osbuf, TEXT("Datacenter Edition (core installation)" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_SERVER: - bstrncat(osbuf, TEXT("Enterprise Edition" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_SERVER_CORE: - bstrncat(osbuf, TEXT("Enterprise Edition (core installation)" ), maxsiz); - break; - case PRODUCT_ENTERPRISE_SERVER_IA64: - bstrncat(osbuf, TEXT("Enterprise Edition for Itanium-based Systems" ), maxsiz); - break; - case PRODUCT_SMALLBUSINESS_SERVER: - bstrncat(osbuf, TEXT("Small Business Server" ), maxsiz); - break; - case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: - bstrncat(osbuf, TEXT("Small Business Server Premium Edition" ), maxsiz); - break; - case PRODUCT_STANDARD_SERVER: - bstrncat(osbuf, TEXT("Standard Edition" ), maxsiz); - break; - case PRODUCT_STANDARD_SERVER_CORE: - bstrncat(osbuf, TEXT("Standard Edition (core installation)" ), maxsiz); - break; - case PRODUCT_WEB_SERVER: - bstrncat(osbuf, TEXT("Web Server Edition" ), maxsiz); - break; - } + hr = RegQueryValueExA(currentVersionKey, "ProductName", NULL, &type, NULL, &size); + if (hr == ERROR_MORE_DATA || hr == ERROR_SUCCESS) { + hr = RegQueryValueExA(currentVersionKey, "ProductName", NULL, &type, (LPBYTE)p, &size); + if (hr != ERROR_SUCCESS) { + return false; } - - if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) { - if( GetSystemMetrics(SM_SERVERR2) ) - bstrncat(osbuf, TEXT( "Windows Server 2003 R2 "), maxsiz); - else if (osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER) - bstrncat(osbuf, TEXT( "Windows Storage Server 2003"), maxsiz); - else if (osvi.wSuiteMask & VER_SUITE_WH_SERVER ) - bstrncat(osbuf, TEXT( "Windows Home Server"), maxsiz); - else if (osvi.wProductType == VER_NT_WORKSTATION && - si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) - bstrncat(osbuf, TEXT( "Windows XP Professional x64 Edition"), maxsiz); - else - bstrncat(osbuf, TEXT("Windows Server 2003 "), maxsiz); - - // Test for the server type. - if (osvi.wProductType != VER_NT_WORKSTATION) { - if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64) { - if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) - bstrncat(osbuf, TEXT( "Datacenter Edition for Itanium-based Systems" ), maxsiz); - else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) - bstrncat(osbuf, TEXT( "Enterprise Edition for Itanium-based Systems" ), maxsiz); - } - - else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) { - if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) - bstrncat(osbuf, TEXT( "Datacenter x64 Edition" ), maxsiz); - else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) - bstrncat(osbuf, TEXT( "Enterprise x64 Edition" ), maxsiz); - else bstrncat(osbuf, TEXT( "Standard x64 Edition" ), maxsiz); - } else { - if ( osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER ) - bstrncat(osbuf, TEXT( "Compute Cluster Edition" ), maxsiz); - else if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) - bstrncat(osbuf, TEXT( "Datacenter Edition" ), maxsiz); - else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) - bstrncat(osbuf, TEXT( "Enterprise Edition" ), maxsiz); - else if ( osvi.wSuiteMask & VER_SUITE_BLADE ) - bstrncat(osbuf, TEXT( "Web Edition" ), maxsiz); - else bstrncat(osbuf, TEXT( "Standard Edition" ), maxsiz); - } - } - } - - if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) { - bstrncat(osbuf, TEXT("Windows XP "), maxsiz); - if( osvi.wSuiteMask & VER_SUITE_PERSONAL ) - bstrncat(osbuf, TEXT( "Home Edition" ), maxsiz); - else - bstrncat(osbuf, TEXT( "Professional" ), maxsiz); - } - - if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) { - bstrncat(osbuf, TEXT("Windows 2000 "), maxsiz); - if ( osvi.wProductType == VER_NT_WORKSTATION ) { - bstrncat(osbuf, TEXT( "Professional" ), maxsiz); - } else { - if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) - bstrncat(osbuf, TEXT( "Datacenter Server" ), maxsiz); - else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) - bstrncat(osbuf, TEXT( "Advanced Server" ), maxsiz); - else bstrncat(osbuf, TEXT( "Server" ), maxsiz); - } - } - - // Include service pack (if any) and build number. - - if (_tcslen(osvi.szCSDVersion) > 0) { - bstrncat(osbuf, TEXT(" ") , maxsiz); - bstrncat(osbuf, osvi.szCSDVersion, maxsiz); + p += size-1; + *p++ = ' '; + } + hr = RegQueryValueExA(currentVersionKey, "EditionID", NULL, &type, NULL, &size); + if (hr == ERROR_MORE_DATA || hr == ERROR_SUCCESS) { + hr = RegQueryValueExA(currentVersionKey, "EditionID", NULL, &type, (LPBYTE)p, &size); + if (hr != ERROR_SUCCESS) { + return false; } - - char buf[80]; - - snprintf(buf, 80, " (build %d)", (int)osvi.dwBuildNumber); - bstrncat(osbuf, buf, maxsiz); - - if (osvi.dwMajorVersion >= 6) { - if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) - bstrncat(osbuf, TEXT( ", 64-bit" ), maxsiz); - else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL ) - bstrncat(osbuf, TEXT(", 32-bit"), maxsiz); + p += size-1; + *p++ = ' '; + *p++ = '('; + } + hr = RegQueryValueExA(currentVersionKey, "CurrentBuild", NULL, &type, NULL, &size); + if (hr == ERROR_MORE_DATA || hr == ERROR_SUCCESS) { + hr = RegQueryValueExA(currentVersionKey, "CurrentBuild", NULL, &type, (LPBYTE)p, &size); + if (hr != ERROR_SUCCESS) { + return false; } - - return true; - } else { - bstrncpy(osbuf, "Unknown Windows version.", maxsiz); - return true; + p += size-1; + *p++ = ')'; } + return true; }