/*---------------------------------------------------------------------------*/ // Author : hiyohiyo // Mail : hiyohiyo@crystalmark.info // Web : https://crystalmark.info/ // License : MIT License /*---------------------------------------------------------------------------*/ #include "stdafx.h" #include "OsInfoFx.h" #include "UtilityFx.h" typedef BOOL (WINAPI* FuncGetProductInfo)(DWORD, DWORD, DWORD, DWORD, PDWORD); typedef BOOL (WINAPI* FuncGetNativeSystemInfo)(LPSYSTEM_INFO); typedef BOOL (WINAPI* FuncIsWow64Process)(HANDLE hProcess,PBOOL Wow64Process); typedef LONG (WINAPI* FuncRtlGetVersion)(POSVERSIONINFOEXW osvi); #if _MSC_VER > 1310 BOOL IsWindowsVersionOrGreaterFx(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor) { OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 }; DWORDLONG const dwlConditionMask = VerSetConditionMask( VerSetConditionMask( VerSetConditionMask( 0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL); osvi.dwMajorVersion = wMajorVersion; osvi.dwMinorVersion = wMinorVersion; osvi.wServicePackMajor = wServicePackMajor; return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE; } BOOL IsWindowsBuildOrGreater(DWORD build) { OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 }; osvi.dwBuildNumber = build; return (VerifyVersionInfoW(&osvi, VER_BUILDNUMBER, VerSetConditionMask(0, VER_BUILDNUMBER, VER_GREATER_EQUAL)) == TRUE); } #endif BOOL GetVersionFx(POSVERSIONINFOEXW osvi) { static FuncRtlGetVersion pRtlGetVersion = NULL; if (pRtlGetVersion == NULL) { HMODULE hModule = GetModuleHandle(_T("ntdll.dll")); if (hModule) { pRtlGetVersion = (FuncRtlGetVersion)GetProcAddress(hModule, "RtlGetVersion"); } } if (pRtlGetVersion) { if (pRtlGetVersion(osvi) >= 0) // NT_SUCCESS(pRtlGetVersion(osvi) { return TRUE; } } return FALSE; } #if _MSC_VER > 1310 BOOL IsX64() { static BOOL b = -1; if (b == -1) { b = FALSE; HMODULE hModule = GetModuleHandle(_T("kernel32.dll")); if (hModule) { FuncGetNativeSystemInfo pGetNativeSystemInfo = (FuncGetNativeSystemInfo)GetProcAddress(hModule, "GetNativeSystemInfo"); if (pGetNativeSystemInfo != NULL) { SYSTEM_INFO si = { 0 }; pGetNativeSystemInfo(&si); if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { b = TRUE; } } } } return b; } BOOL IsIa64() { static BOOL b = -1; if (b == -1) { b = FALSE; HMODULE hModule = GetModuleHandle(_T("kernel32.dll")); if (hModule) { FuncGetNativeSystemInfo pGetNativeSystemInfo = (FuncGetNativeSystemInfo)GetProcAddress(hModule, "GetNativeSystemInfo"); if (pGetNativeSystemInfo != NULL) { SYSTEM_INFO si = { 0 }; pGetNativeSystemInfo(&si); if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64) { b = TRUE; } } } } return b; } BOOL IsArm32() { static BOOL b = -1; if (b == -1) { b = FALSE; HMODULE hModule = GetModuleHandle(_T("kernel32.dll")); if (hModule) { FuncGetNativeSystemInfo pGetNativeSystemInfo = (FuncGetNativeSystemInfo)GetProcAddress(hModule, "GetNativeSystemInfo"); if (pGetNativeSystemInfo != NULL) { SYSTEM_INFO si = { 0 }; pGetNativeSystemInfo(&si); if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM) { b = TRUE; } } } } return b; } BOOL IsArm64() { static BOOL b = -1; if (b == -1) { b = FALSE; HMODULE hModule = GetModuleHandle(_T("kernel32.dll")); if (hModule) { FuncGetNativeSystemInfo pGetNativeSystemInfo = (FuncGetNativeSystemInfo)GetProcAddress(hModule, "GetNativeSystemInfo"); if (pGetNativeSystemInfo != NULL) { SYSTEM_INFO si = { 0 }; pGetNativeSystemInfo(&si); if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM64) { b = TRUE; } } } } return b; } BOOL IsWow64() { static BOOL b = -1; if (b == -1) { b = FALSE; HMODULE hModule = GetModuleHandle(_T("kernel32.dll")); if (hModule) { FuncIsWow64Process pIsWow64Process = (FuncIsWow64Process)GetProcAddress(hModule, "IsWow64Process"); if (pIsWow64Process != NULL) { pIsWow64Process(GetCurrentProcess(), &b); } } } return b; } BOOL IsIe556() { switch (GetIeVersion()) { case 550: case 600: return TRUE; break; default: return FALSE; break; } } BOOL IsDotNet2() { static BOOL b = -1; if (b == -1) { b = FALSE; DWORD type = REG_DWORD; ULONG size = sizeof(DWORD); HKEY hKey = NULL; DWORD buf = 0; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727"), 0, KEY_READ, &hKey) == ERROR_SUCCESS || RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Wow6432Node\\Microsoft\\NET Framework Setup\\NDP\\v2.0.50727"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { if (RegQueryValueEx(hKey, _T("Install"), NULL, &type, (LPBYTE)&buf, &size) == ERROR_SUCCESS) { if (buf == 1) { b = TRUE; } } RegCloseKey(hKey); } } return (BOOL)b; } BOOL IsDotNet4() { static BOOL b = -1; if (b == -1) { b = FALSE; DWORD type = REG_DWORD; ULONG size = sizeof(DWORD); HKEY hKey = NULL; DWORD buf = 0; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Client"), 0, KEY_READ, &hKey) == ERROR_SUCCESS || RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full"), 0, KEY_READ, &hKey) == ERROR_SUCCESS || RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\WOW6432Node\\Microsoft\\NET Framework Setup\\NDP\\v4\\Client"), 0, KEY_READ, &hKey) == ERROR_SUCCESS || RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\WOW6432Node\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full"), 0, KEY_READ, &hKey) == ERROR_SUCCESS ) { if (RegQueryValueEx(hKey, _T("Install"), NULL, &type, (LPBYTE)&buf, &size) == ERROR_SUCCESS) { if (buf == 1) { b = TRUE; } } RegCloseKey(hKey); } } return b; } BOOL IsDotNet48() { static BOOL b = -1; if (b == -1) { b = FALSE; DWORD type = REG_DWORD; ULONG size = sizeof(DWORD); HKEY hKey = NULL; DWORD buf = 0; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Client"), 0, KEY_READ, &hKey) == ERROR_SUCCESS || RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { if (RegQueryValueEx(hKey, _T("Install"), NULL, &type, (LPBYTE)&buf, &size) == ERROR_SUCCESS) { if (buf == 1) { if (RegQueryValueEx(hKey, _T("Release"), NULL, &type, (LPBYTE)&buf, &size) == ERROR_SUCCESS) { if (buf >= 528040) { b = TRUE; } } } } RegCloseKey(hKey); } } return b; } BOOL IsNT5() { static BOOL b = -1; if (b == -1) { b = !IsWindowsVersionOrGreaterFx(6, 0) && IsWindowsVersionOrGreaterFx(5, 0) ? TRUE : FALSE; } return b; } BOOL IsNT6orLater() { static BOOL b = -1; if (b == -1) { b = IsWindowsVersionOrGreaterFx(6, 0) ? TRUE : FALSE; } return b; } BOOL IsWin2k() { static BOOL b = -1; if (b == -1) { b = IsWindowsVersionOrGreaterFx(5, 0) && !IsWindowsVersionOrGreaterFx(5, 1) ? TRUE : FALSE; } return b; } BOOL IsWinXpOrLater() { static BOOL b = -1; if (b == -1) { b = IsWindowsVersionOrGreaterFx(5, 1) ? TRUE : FALSE; } return b; } BOOL IsWinXpLuna() { static BOOL xp = -1; BOOL b = FALSE; if (xp == -1) { xp = IsWindowsVersionOrGreaterFx(5, 1) && !IsWindowsVersionOrGreaterFx(6, 0) ? TRUE : FALSE; } if (xp == FALSE) { return FALSE; } // Luna Check DWORD type = REG_DWORD; ULONG size = 256; HKEY hKey = NULL; BYTE buf[256] = {0}; CString cstr; if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\ThemeManager\\"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { if (RegQueryValueEx(hKey, _T("ThemeActive"), NULL, &type, buf, &size) == ERROR_SUCCESS) { cstr = (TCHAR*)buf; if (cstr.Find(_T("1")) == 0) { b = TRUE; } } RegCloseKey(hKey); } return b; } BOOL IsWin8orLater() { static BOOL b = -1; if (b == -1) { b = IsWindowsVersionOrGreaterFx(6, 2) ? TRUE : FALSE; } return b; } BOOL IsWin81orLater() { static BOOL b = -1; if (b == -1) { b = IsWindowsVersionOrGreaterFx(6, 3) ? TRUE : FALSE; } return b; } BOOL IsDarkModeSupport() { static BOOL b = -1; if (b == -1) { b = IsWindowsBuildOrGreater(17763) ? TRUE : FALSE; } return b; } BOOL HasSidebar() { static BOOL b = -1; if (b == -1) { b = FALSE; OSVERSIONINFOEXW osvi; GetVersionFx(&osvi); if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion < 2 && osvi.wProductType == VER_NT_WORKSTATION) { b = TRUE; } } return b; } DWORD GetIeVersion() { static INT ieVersion = -1; if (ieVersion != -1) { return ieVersion; } DWORD type = REG_SZ; ULONG size = 256; HKEY hKey = NULL; BYTE buf[256] = {0}; CString cstr; switch (GetFileVersion(_T("Shdocvw.dll"))) { case 470: ieVersion = 300; break; case 471: ieVersion = 400; break; case 472: ieVersion = 401; break; case 500: ieVersion = 500; break; case 550: ieVersion = 550; break; case 600: default: ieVersion = 600; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Internet Explorer"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { if (RegQueryValueEx(hKey, _T("Version"), NULL, &type, buf, &size) == ERROR_SUCCESS) { cstr = (TCHAR*)buf; ieVersion = _tstoi(cstr) * 100; if (ieVersion == 900 && RegQueryValueEx(hKey, _T("svcVersion"), NULL, &type, buf, &size) == ERROR_SUCCESS) { cstr = (TCHAR*)buf; if (_tstoi(cstr) * 100 > 900) { ieVersion = _tstoi(cstr) * 100; } } } RegCloseKey(hKey); } break; } return ieVersion; } #endif BOOL IsNT3() { static BOOL b = -1; if (b == -1) { b = FALSE; OSVERSIONINFO osvi = { 0 }; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO*)&osvi); if ((osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) && (osvi.dwMajorVersion == 3)) { b = TRUE; } } return b; } BOOL IsNT4() { static BOOL b = -1; if (b == -1) { b = FALSE; OSVERSIONINFO osvi = { 0 }; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO*)&osvi); if ((osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) && (osvi.dwMajorVersion == 4)) { b = TRUE; } } return b; } BOOL IsWin9x() { static BOOL b = -1; if (b == -1) { b = FALSE; OSVERSIONINFO osvi = { 0 }; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO*)&osvi); if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { b = TRUE; } } return b; } BOOL IsWin95() { static BOOL b = -1; if (b == -1) { b = FALSE; OSVERSIONINFO osvi = { 0 }; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO*)&osvi); if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) { b = TRUE; } } return b; } BOOL IsWin95First() { static BOOL b = -1; if (b == -1) { b = FALSE; OSVERSIONINFO osvi = { 0 }; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO*)&osvi); if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0 && osvi.dwBuildNumber <= 950) { b = TRUE; } } return b; } BOOL IsPC98() { static BOOL b = -1; DWORD type = REG_SZ; ULONG size = 256; HKEY hKey = NULL; BYTE buf[256] = {0}; CString cstr; if (b == -1) { b = FALSE; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("HARDWARE\\DESCRIPTION\\System"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { if (RegQueryValueEx(hKey, _T("Identifier"), NULL, &type, buf, &size) == ERROR_SUCCESS) { cstr = (TCHAR*)buf; if (cstr.Find(_T("NEC PC-98")) == 0) { b = TRUE; } } RegCloseKey(hKey); } if ((GetKeyboardType(1) & 0xFF00) == 0x0D00) { b = TRUE; } #ifndef UNICODE /// PC-98 機種判定 det98 Programmed by K.Takata /// http://k-takata.o.oo7.jp/mysoft/det98.html #define MK_FP(seg, off) ((void *) (((seg) << 4) + (off))) #define MACHINE_ID_SEG 0xf8e8 #define MACHINE_ID_SEG_HIGHRESO 0xffe8 #define PC98_ID_OFF 0x0000 #define PC98_ID 0x2198 /* 9821 */ if(IsWin9x()) { unsigned short* pc98_id = NULL; pc98_id = (unsigned short*)MK_FP(MACHINE_ID_SEG, PC98_ID_OFF); if(*pc98_id == PC98_ID) { b = TRUE; } if((GetSystemMetrics(SM_CXSCREEN) == 1120) && (GetSystemMetrics(SM_CYSCREEN) == 750)) // High Resolution { pc98_id = (unsigned short*)MK_FP(MACHINE_ID_SEG_HIGHRESO, PC98_ID_OFF); if (*pc98_id == PC98_ID) { b = TRUE; } } } #endif } return b; } BOOL IsNT51orlater() { static BOOL b = -1; if (b == -1) { b = FALSE; OSVERSIONINFO osvi = { 0 }; osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO*)&osvi); if ((osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) && ((osvi.dwMajorVersion == 5 && osvi.dwMinorVersion >= 1) || (osvi.dwMajorVersion > 5))) { b = TRUE; } } return b; } BOOL IsRunningOnWine() { HMODULE hModule = LoadLibraryA("ntdll.dll"); if (hModule) { void* pWineGetVersion = (void*)GetProcAddress(hModule, "wine_get_version"); FreeLibrary(hModule); return pWineGetVersion != NULL; } return FALSE; } void GetOsName(CString& osFullName, CString& name, CString& version, CString& architecture) { CString osName, osType, osCsd, osVersion, osBuild, osArchitecture, osDisplayVersion; CString osNameWmi; CString cstr; #if _MSC_VER <= 1310 // For Win9x OSVERSIONINFO osv = { 0 }; osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx((OSVERSIONINFO*)&osv); if (osv.dwPlatformId == VER_PLATFORM_WIN32s) { osFullName = _T("Windows 3.x + Win32s"); name = osFullName; return; } else if (osv.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { switch (osv.dwMinorVersion) { case 0: // Windows 95 if (LOWORD(osv.dwBuildNumber) >= 1214) { osName = _T("Windows 95 OSR2.5"); } else if (LOWORD(osv.dwBuildNumber) >= 1212) { osName = _T("Windows 95 OSR2.1"); } else if (LOWORD(osv.dwBuildNumber) >= 1111) { osName = _T("Windows 95 OSR2"); } else { osName = _T("Windows 95"); } break; case 10: // Windows 98 if (LOWORD(osv.dwBuildNumber) >= 2222) { osName = _T("Windows 98 Second Edition"); } else if (LOWORD(osv.dwBuildNumber) >= 2000) { osName = _T("Windows 98 SP1"); } else { osName = _T("Windows 98"); } break; case 90: osName = _T("Windows Me"); break; default: osName = _T("Windows 9x"); break; } osVersion.Format(_T("%d.%d"), osv.dwMajorVersion, osv.dwMinorVersion); osBuild.Format(_T("%d"), LOWORD(osv.dwBuildNumber)); osFullName.Format(_T("%s [%s Build %s]"), (LPCTSTR)osName, (LPCTSTR)osVersion, (LPCTSTR)osBuild); name = osName; version.Format(_T("%s Build %s"), (LPCTSTR)osVersion, (LPCTSTR)osBuild); architecture = _T("x86"); return; } #endif #if _MSC_VER > 1310 #ifdef UNICODE OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 }; GetVersionFx((OSVERSIONINFOEXW*)&osvi); #else OSVERSIONINFOEX osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 }; GetVersionEx((OSVERSIONINFO*)&osvi); #endif #else OSVERSIONINFOEXW osviw = { sizeof(osviw), 0, 0, 0, 0, {0}, 0, 0 }; OSVERSIONINFOEX osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 }; GetVersionEx((OSVERSIONINFO*)&osvi); if (osvi.dwMajorVersion == 0) // Windows NT 3.51, NT 4.0 SP4 or earlier { osvi.dwMajorVersion = osv.dwMajorVersion; osvi.dwMinorVersion = osv.dwMinorVersion; osvi.dwBuildNumber = osv.dwBuildNumber; osvi.dwPlatformId = osv.dwPlatformId; wsprintf(osvi.szCSDVersion, osv.szCSDVersion); } if (osvi.dwMajorVersion >= 6 && GetVersionFx((OSVERSIONINFOEXW*)&osviw)) { osvi.dwMajorVersion = osviw.dwMajorVersion; osvi.dwMinorVersion = osviw.dwMinorVersion; osvi.dwBuildNumber = osviw.dwBuildNumber; osvi.wServicePackMajor = osviw.wServicePackMajor; osvi.wServicePackMinor = osviw.wServicePackMinor; osvi.wSuiteMask = osviw.wSuiteMask; osvi.wProductType = osviw.wProductType; } #endif GetOsNameWmi(osNameWmi); // Windows 11/Server 2025 CString osNameWmiBackup = osNameWmi; CString osNameWmiMajorVersion = osNameWmi; osNameWmiMajorVersion.Replace(_T("(R)"), _T("")); osNameWmiMajorVersion.Replace(_T("Microsoft "), _T("")); osNameWmiMajorVersion.Replace(_T("Windows "), _T("")); osNameWmiMajorVersion.Replace(_T("Server "), _T("")); int majorVersion = _ttoi(osNameWmiMajorVersion); if ((3 <= majorVersion && majorVersion <= 11) || (2000 <= majorVersion && majorVersion <= 2025)) { osNameWmi = _T(""); } if (osNameWmi.IsEmpty()) { switch (osvi.dwPlatformId) { case VER_PLATFORM_WIN32_NT: if (osvi.dwMajorVersion == 3) { osName.Format(_T("Windows NT 3.%d"), osvi.dwMinorVersion); } else if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) { osName = _T("Windows NT 4.0"); } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) { osName = _T("Windows 2000"); } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) { osName = _T("Windows XP"); } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) { if (GetSystemMetrics(SM_SERVERR2)) { osName = _T("Windows Server 2003 R2"); } else if (osvi.wSuiteMask == 0x00002000 /*VER_SUITE_STORAGE_SERVER*/) { osName = _T("Windows Storage Server 2003"); } else if (osvi.wProductType == VER_NT_WORKSTATION) { osName = _T("Windows XP"); } else { osName = _T("Windows Server 2003"); } } else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) { if (osvi.wProductType != VER_NT_WORKSTATION) { osName = _T("Windows Server 2008"); } else { osName = _T("Windows Vista"); } } else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1) { if (osvi.wProductType != VER_NT_WORKSTATION) { osName = _T("Windows Server 2008 R2"); } else { osName = _T("Windows 7"); } } else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 2) { if (osvi.wProductType != VER_NT_WORKSTATION) { osName = _T("Windows Server 2012"); } else { osName = _T("Windows 8"); } } else if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 3) { if (osvi.wProductType != VER_NT_WORKSTATION) { osName = _T("Windows Server 2012 R2"); } else { osName = _T("Windows 8.1"); } } else if ((osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 4) || (osvi.dwMajorVersion >= 10 && osvi.dwMinorVersion >= 0)) { if (osvi.wProductType != VER_NT_WORKSTATION) { if (osvi.dwBuildNumber >= 26040) { osName = _T("Windows Server 2025"); } else if (osvi.dwBuildNumber >= 20344) { osName = _T("Windows Server 2022"); } else if (osvi.dwBuildNumber >= 17763) { osName = _T("Windows Server 2019"); } else { osName = _T("Windows Server 2016"); } } else { if (osvi.dwBuildNumber >= 21996) { osName = _T("Windows 11"); } else { osName = _T("Windows 10"); } } } else { osName.Format(_T("Windows NT %d.%d"), osvi.dwMajorVersion, osvi.dwMinorVersion); } if (osvi.dwMajorVersion >= 6) { HMODULE hModule = GetModuleHandle(_T("kernel32.dll")); FuncGetProductInfo pGetProductInfo = NULL; if (hModule) { pGetProductInfo = (FuncGetProductInfo)GetProcAddress(hModule, "GetProductInfo"); } if (pGetProductInfo) { DWORD productType = 0; pGetProductInfo(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &productType); switch (productType) { case PRODUCT_UNLICENSED: osType = _T("Unlicensed"); break; case PRODUCT_CORE_ARM: case PRODUCT_CORE_COUNTRYSPECIFIC: case PRODUCT_CORE_SINGLELANGUAGE: case PRODUCT_CORE: osType = L"Home"; break; case PRODUCT_CORE_N: osType = L"Home N"; break; case PRODUCT_EDUCATION: osType = L"Education"; break; case PRODUCT_EDUCATION_N: osType = L"Education N"; break; case PRODUCT_BUSINESS: osType = _T("Business"); break; case PRODUCT_BUSINESS_N: osType = _T("Business N"); break; case PRODUCT_CLUSTER_SERVER: osType = _T("Cluster Server"); break; case PRODUCT_DATACENTER_SERVER: osType = _T("Datacenter"); break; case PRODUCT_DATACENTER_SERVER_CORE: osType = _T("Datacenter"); break; case PRODUCT_ENTERPRISE: osType = _T("Enterprise"); break; case PRODUCT_ENTERPRISE_N: osType = _T("Enterprise N"); break; case PRODUCT_ENTERPRISE_G: osType = _T("Enterprise G"); break; case PRODUCT_ENTERPRISE_SERVER: osType = _T("Enterprise"); break; case PRODUCT_ENTERPRISE_SERVER_CORE: osType = _T("Enterprise"); break; case PRODUCT_ENTERPRISE_SERVER_IA64: osType = _T("Datacenter Enterprise for Itanium-based Systems"); break; case PRODUCT_HOME_BASIC: osType = _T("Home Basic"); break; case PRODUCT_HOME_BASIC_N: osType = _T("Home Basic N"); break; case PRODUCT_HOME_PREMIUM: osType = _T("Home Premium"); break; case PRODUCT_HOME_PREMIUM_N: osType = _T("Home Premium N"); break; case PRODUCT_HOME_SERVER: osType = _T("Home Server"); break; case PRODUCT_SERVER_FOR_SMALLBUSINESS: osType = _T("Server for Small Business"); break; case PRODUCT_SMALLBUSINESS_SERVER: osType = _T("Small Business Server"); break; case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: osType = _T("Small Business Server Premium"); break; case PRODUCT_STANDARD_SERVER: osType = _T("Server Standard"); break; case PRODUCT_STANDARD_SERVER_CORE: osType = _T("Server Standard"); break; case PRODUCT_STARTER: osType = _T("Starter"); break; case PRODUCT_STARTER_N: osType = _T("Starter N"); break; case PRODUCT_STARTER_E: osType = _T("Starter E"); break; case PRODUCT_STORAGE_ENTERPRISE_SERVER: osType = _T("Storage Server Enterprise"); break; case PRODUCT_STORAGE_EXPRESS_SERVER: osType = _T("Storage Server Express"); break; case PRODUCT_STORAGE_STANDARD_SERVER: osType = _T("Storage Server Standard"); break; case PRODUCT_STORAGE_WORKGROUP_SERVER: osType = _T("Storage Server Workgroup"); break; case PRODUCT_ULTIMATE: osType = _T("Ultimate"); break; case PRODUCT_ULTIMATE_N: osType = _T("Ultimate N"); break; case PRODUCT_WEB_SERVER: osType = _T("Web Server"); break; case PRODUCT_PROFESSIONAL: if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 2) { osType = _T("Professional"); } else { osType = _T("Pro"); } break; case PRODUCT_PROFESSIONAL_N: if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 2) { osType = _T("Professional N"); } else { osType = _T("Pro N"); } break; case PRODUCT_PRO_WORKSTATION: case PRODUCT_PROFESSIONAL_WORKSTATION: osType = _T("Pro for Workstation"); break; case PRODUCT_PRO_WORKSTATION_N: case PRODUCT_PROFESSIONAL_WORKSTATION_N: osType = _T("Pro for Workstation N"); break; case PRODUCT_PRO_FOR_EDUCATION: osType = _T("Pro for Education"); break; case PRODUCT_PRO_FOR_EDUCATION_N: osType = _T("Pro for Education N"); break; case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL: case PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC: case PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC: osType = _T("Essentials Server"); break; } } } else if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) { if (osvi.wProductType == VER_NT_WORKSTATION) { osType = _T("Workstation"); } else if (osvi.wProductType == VER_NT_SERVER || osvi.wProductType == VER_NT_DOMAIN_CONTROLLER) { if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) { osType = _T("Server Enterprise Edition"); } else { osType = _T("Server"); } } } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) { if (osvi.wProductType == VER_NT_WORKSTATION) { osType = _T("Professional"); } else if (osvi.wProductType == VER_NT_SERVER || osvi.wProductType == VER_NT_DOMAIN_CONTROLLER) { if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) { osType = _T("Advanced Server"); } else if (osvi.wSuiteMask & VER_SUITE_DATACENTER) { osType = _T("Datacenter Server"); } else { osType = _T("Server"); } } } else if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion >= 1) { if (osvi.wSuiteMask & VER_SUITE_PERSONAL) { osType = _T("Home Edition"); } else if (osvi.wSuiteMask & VER_SUITE_DATACENTER) { osType = _T("Datacenter Edition"); } else if (osvi.wSuiteMask & VER_SUITE_ENTERPRISE) { osType = _T("Enterprise Edition"); } else if (osvi.wSuiteMask & VER_SUITE_BLADE) { osType = _T("Web Edition"); } else if (osvi.wProductType == VER_NT_WORKSTATION) { osType = _T("Professional"); } // Meida Center & Tablet if (GetSystemMetrics(SM_MEDIACENTER)) { TCHAR path[MAX_PATH] = {0}; TCHAR str[256] = {0}; UINT length = GetWindowsDirectory(path, MAX_PATH); #if _MSC_VER <= 1310 _tcscat(path, _T("\\ehome\\ehshell.exe")); #else _tcscat_s(path, MAX_PATH, _T("\\ehome\\ehshell.exe")); #endif if (length != 0 && GetFileVersion(path, str)) { cstr = str; if (cstr.Find(_T("5.1")) == 0) { osType = _T("Media Center "); cstr.Replace(_T("5.1."), _T("")); double num = _tstof(cstr); if (num <= 2600.1200) { osType += _T("2002"); } else if (num <= 2600.2500) { osType += _T("2004"); } else { osType += _T("2005"); } } } } else if (GetSystemMetrics(SM_TABLETPC)) { osType = _T("Tablet PC"); } } } } osCsd = osvi.szCSDVersion; osCsd.Replace(_T("Service Pack "), _T("SP")); if (osvi.dwMajorVersion >= 10) { DWORD value = 0; DWORD type = REG_SZ; TCHAR str[256]; ULONG size = 256 * sizeof(TCHAR); HKEY hKey = NULL; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { if (RegQueryValueEx(hKey, _T("DisplayVersion"), NULL, &type, (LPBYTE)str, &size) == ERROR_SUCCESS) { osDisplayVersion = str; } if (osDisplayVersion.IsEmpty() && RegQueryValueEx(hKey, _T("ReleaseId"), NULL, &type, (LPBYTE)str, &size) == ERROR_SUCCESS) { osDisplayVersion = str; } } } osVersion.Format(_T("%d.%d"), osvi.dwMajorVersion, osvi.dwMinorVersion); osBuild.Format(_T("%d"), osvi.dwBuildNumber); #if _MSC_VER > 1310 if(IsX64()) { osArchitecture = _T("x64"); } else if (IsArm32()) { osArchitecture = _T("ARM32"); } else if (IsArm64()) { osArchitecture = _T("ARM64"); } else if(IsIa64()) { osArchitecture = _T("IA64"); } else { osArchitecture = _T("x86"); } #else osArchitecture = _T("x86"); #endif // for Unknown Edition if (osType.IsEmpty()) { osNameWmi = osNameWmiBackup; } if (!osNameWmi.IsEmpty()) { if (!osDisplayVersion.IsEmpty()) { osFullName.Format(_T("%s %s [%s Build %s] (%s)"), (LPCTSTR)osNameWmi, (LPCTSTR)osDisplayVersion, (LPCTSTR)osVersion, (LPCTSTR)osBuild, (LPCTSTR)osArchitecture); name.Format(_T("%s %s"), (LPCTSTR)osNameWmi, (LPCTSTR)osDisplayVersion); version.Format(_T("%s Build %s"), (LPCTSTR)osVersion, (LPCTSTR)osBuild); architecture = osArchitecture; } else if (!osCsd.IsEmpty()) { osFullName.Format(_T("%s %s [%s Build %s] (%s)"), (LPCTSTR)osNameWmi, (LPCTSTR)osCsd, (LPCTSTR)osVersion, (LPCTSTR)osBuild, (LPCTSTR)osArchitecture); name.Format(_T("%s %s"), (LPCTSTR)osNameWmi, (LPCTSTR)osCsd); version.Format(_T("%s Build %s"), (LPCTSTR)osVersion, (LPCTSTR)osBuild); architecture = osArchitecture; } else { osFullName.Format(_T("%s [%s Build %s] (%s)"), (LPCTSTR)osNameWmi, (LPCTSTR)osVersion, (LPCTSTR)osBuild, (LPCTSTR)osArchitecture); name.Format(_T("%s"), (LPCTSTR)osNameWmi); version.Format(_T("%s Build %s"), (LPCTSTR)osVersion, (LPCTSTR)osBuild); architecture = osArchitecture; } } else { if (!osDisplayVersion.IsEmpty()) { osFullName.Format(_T("%s %s %s [%s Build %s] (%s)"), (LPCTSTR)osName, (LPCTSTR)osType, (LPCTSTR)osDisplayVersion, (LPCTSTR)osVersion, (LPCTSTR)osBuild, (LPCTSTR)osArchitecture); name.Format(_T("%s %s %s"), (LPCTSTR)osName, (LPCTSTR)osType, (LPCTSTR)osDisplayVersion); version.Format(_T("%s Build %s"), (LPCTSTR)osVersion, (LPCTSTR)osBuild); architecture = osArchitecture; } else if (!osCsd.IsEmpty()) { osFullName.Format(_T("%s %s %s [%s Build %s] (%s)"), (LPCTSTR)osName, (LPCTSTR)osType, (LPCTSTR)osCsd, (LPCTSTR)osVersion, (LPCTSTR)osBuild, (LPCTSTR)osArchitecture); name.Format(_T("%s %s %s"), (LPCTSTR)osName, (LPCTSTR)osType, (LPCTSTR)osCsd); version.Format(_T("%s Build %s"), (LPCTSTR)osVersion, (LPCTSTR)osBuild); architecture = osArchitecture; } else if (!osType.IsEmpty()) { osFullName.Format(_T("%s %s [%s Build %s] (%s)"), (LPCTSTR)osName, (LPCTSTR)osType, (LPCTSTR)osVersion, (LPCTSTR)osBuild, (LPCTSTR)osArchitecture); name.Format(_T("%s %s"), (LPCTSTR)osName, (LPCTSTR)osType); version.Format(_T("%s Build %s"), (LPCTSTR)osVersion, (LPCTSTR)osBuild); architecture = osArchitecture; } else { osFullName.Format(_T("%s [%s Build %s] (%s)"), (LPCTSTR)osName, (LPCTSTR)osVersion, (LPCTSTR)osBuild, (LPCTSTR)osArchitecture); name.Format(_T("%s"), (LPCTSTR)osName); version.Format(_T("%s Build %s"), (LPCTSTR)osVersion, (LPCTSTR)osBuild); architecture = osArchitecture; } } osFullName.Replace(_T(" "), _T(" ")); } //------------------------------------------------ // Get OS Information by WMI //------------------------------------------------ //warning : enum3, enum class #if _MSC_VER > 1310 #pragma warning(disable : 26812) #endif #include #include #include #pragma comment(lib, "oleaut32.lib") #pragma comment(lib, "wbemuuid.lib") #define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } #ifndef safeCloseHandle #define safeCloseHandle(h) { if( h != NULL ) { ::CloseHandle(h); h = NULL; } } #endif #ifndef safeVirtualFree #define safeVirtualFree(h,b,c) { if( h != NULL ) { ::VirtualFree(h, b, c); h = NULL; } } #endif void GetOsNameWmi(CString& osName) { CString query = _T("Select * from Win32_OperatingSystem"); IWbemLocator* pIWbemLocator = NULL; IWbemServices* pIWbemServices = NULL; IEnumWbemClassObject* pEnumCOMDevs = NULL; IWbemClassObject* pCOMDev = NULL; ULONG uReturned = 0; BOOL flag = FALSE; try { if (SUCCEEDED(CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pIWbemLocator))) { long securityFlag = 0; #if _MSC_VER > 1310 if (IsWindowsVersionOrGreaterFx(6, 0)) { securityFlag = WBEM_FLAG_CONNECT_USE_MAX_WAIT; } #endif if (SUCCEEDED(pIWbemLocator->ConnectServer(_bstr_t(_T("root\\cimv2")), NULL, NULL, 0L, securityFlag, NULL, NULL, &pIWbemServices))) { #if _MSC_VER > 1310 if (SUCCEEDED(CoSetProxyBlanket(pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE))) #endif { if (SUCCEEDED(pIWbemServices->ExecQuery(_bstr_t(_T("WQL")), _bstr_t(query), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumCOMDevs))) { while (pEnumCOMDevs && SUCCEEDED(pEnumCOMDevs->Next(10000, 1, &pCOMDev, &uReturned)) && uReturned == 1) { CString name; VARIANT pVal; VariantInit(&pVal); if (pCOMDev->Get(L"Caption", 0L, &pVal, NULL, NULL) == WBEM_S_NO_ERROR && pVal.vt > VT_NULL) { name = pVal.bstrVal; VariantClear(&pVal); #ifdef UNICODE name.Replace(_T("™"), _T("")); name.Replace(_T("®"), _T("")); #endif name.Replace(_T("(R)"), _T("")); name.Replace(_T("Microsoft "), _T("")); name.Trim(); } VariantInit(&pVal); osName = name; } } } } } } catch (...) { } SAFE_RELEASE(pCOMDev); SAFE_RELEASE(pEnumCOMDevs); SAFE_RELEASE(pIWbemServices); SAFE_RELEASE(pIWbemLocator); } #if _MSC_VER <= 1310 #ifdef UNICODE /// https://web.archive.org/web/20050906124319/http://support.microsoft.com/kb/q118626/ BOOL IsCurrentUserLocalAdministrator(void) { BOOL fReturn = FALSE; DWORD dwStatus; DWORD dwAccessMask; DWORD dwAccessDesired; DWORD dwACLSize; DWORD dwStructureSize = sizeof(PRIVILEGE_SET); PACL pACL = NULL; PSID psidAdmin = NULL; HANDLE hToken = NULL; HANDLE hImpersonationToken = NULL; PRIVILEGE_SET ps; GENERIC_MAPPING GenericMapping; PSECURITY_DESCRIPTOR psdAdmin = NULL; SID_IDENTIFIER_AUTHORITY SystemSidAuthority = SECURITY_NT_AUTHORITY; const DWORD ACCESS_READ = 1; const DWORD ACCESS_WRITE = 2; __try { if (!OpenThreadToken(GetCurrentThread(), TOKEN_DUPLICATE | TOKEN_QUERY, TRUE, &hToken)) { if (GetLastError() != ERROR_NO_TOKEN) __leave; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY, &hToken)) __leave; } if (!DuplicateToken(hToken, SecurityImpersonation, &hImpersonationToken)) __leave; if (!AllocateAndInitializeSid(&SystemSidAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &psidAdmin)) __leave; psdAdmin = LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); if (psdAdmin == NULL) __leave; if (!InitializeSecurityDescriptor(psdAdmin, SECURITY_DESCRIPTOR_REVISION)) __leave; dwACLSize = sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(psidAdmin) - sizeof(DWORD); pACL = (PACL)LocalAlloc(LPTR, dwACLSize); if (pACL == NULL) __leave; if (!InitializeAcl(pACL, dwACLSize, ACL_REVISION2)) __leave; dwAccessMask = ACCESS_READ | ACCESS_WRITE; if (!AddAccessAllowedAce(pACL, ACL_REVISION2, dwAccessMask, psidAdmin)) __leave; if (!SetSecurityDescriptorDacl(psdAdmin, TRUE, pACL, FALSE)) __leave; SetSecurityDescriptorGroup(psdAdmin, psidAdmin, FALSE); SetSecurityDescriptorOwner(psdAdmin, psidAdmin, FALSE); if (!IsValidSecurityDescriptor(psdAdmin)) __leave; dwAccessDesired = ACCESS_READ; GenericMapping.GenericRead = ACCESS_READ; GenericMapping.GenericWrite = ACCESS_WRITE; GenericMapping.GenericExecute = 0; GenericMapping.GenericAll = ACCESS_READ | ACCESS_WRITE; if (!AccessCheck(psdAdmin, hImpersonationToken, dwAccessDesired, &GenericMapping, &ps, &dwStructureSize, &dwStatus, &fReturn)) { fReturn = FALSE; __leave; } } __finally { if (pACL) LocalFree(pACL); if (psdAdmin) LocalFree(psdAdmin); if (psidAdmin) FreeSid(psidAdmin); if (hImpersonationToken) CloseHandle(hImpersonationToken); if (hToken) CloseHandle(hToken); } return fReturn; } /// https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-checktokenmembership BOOL IsUserAdmin(VOID) { BOOL b = FALSE; SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; PSID AdministratorsGroup; b = AllocateAndInitializeSid( &NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup); if (b) { typedef BOOL(WINAPI* FuncCheckTokenMembership)(HANDLE, PSID, PBOOL); FuncCheckTokenMembership pCheckTokenMembership = NULL; HMODULE hModule = GetModuleHandle(_T("Advapi32.dll")); if (hModule) { pCheckTokenMembership = (FuncCheckTokenMembership)GetProcAddress(hModule, "CheckTokenMembership"); } if (pCheckTokenMembership != NULL) { if (!pCheckTokenMembership(NULL, AdministratorsGroup, &b)) { b = FALSE; } } else if (IsCurrentUserLocalAdministrator()) // for NT4 { b = TRUE; } else { b = FALSE; } FreeSid(AdministratorsGroup); } return(b); } #endif #endif