1558 lines
38 KiB
C++
1558 lines
38 KiB
C++
/*---------------------------------------------------------------------------*/
|
|
// 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 <comdef.h>
|
|
#include <comutil.h>
|
|
#include <wbemcli.h>
|
|
#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 |