#include <shlwapi.h>
#include <tchar.h>
#include <stdio.h>
#define BUFSIZE 256
#define PRODUCT_ULTIMATE 0x00000001
#define PRODUCT_HOME_BASIC 0x00000002
#define PRODUCT_HOME_PREMIUM 0x00000003
#define PRODUCT_ENTERPRISE 0x00000004
#define PRODUCT_HOME_BASIC_N 0x00000005
#define PRODUCT_BUSINESS 0x00000006
#define PRODUCT_STANDARD_SERVER 0x00000007
#define PRODUCT_DATACENTER_SERVER 0x00000008
#define PRODUCT_SMALLBUSINESS_SERVER 0x00000009
#define PRODUCT_ENTERPRISE_SERVER 0x0000000A
#define PRODUCT_STARTER 0x0000000B
#define PRODUCT_DATACENTER_SERVER_CORE 0x0000000C
#define PRODUCT_STANDARD_SERVER_CORE 0x0000000D
#define PRODUCT_ENTERPRISE_SERVER_CORE 0x0000000E
#define PRODUCT_ENTERPRISE_SERVER_IA64 0x0000000F
#define PRODUCT_BUSINESS_N 0x00000010
#define PRODUCT_WEB_SERVER 0x00000011
#define PRODUCT_CLUSTER_SERVER 0x00000012
#define PRODUCT_HOME_SERVER 0x00000013
#define PRODUCT_STORAGE_EXPRESS_SERVER 0x00000014
#define PRODUCT_STORAGE_STANDARD_SERVER 0x00000015
#define PRODUCT_STORAGE_WORKGROUP_SERVER 0x00000016
#define PRODUCT_STORAGE_ENTERPRISE_SERVER 0x00000017
#define PRODUCT_SERVER_FOR_SMALLBUSINESS 0x00000018
#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM 0x00000019
#define PRODUCT_HOME_PREMIUM_N 0x0000001A
#define PRODUCT_ENTERPRISE_N 0x0000001B
#define PRODUCT_ULTIMATE_N 0x0000001C
#define PRODUCT_WEB_SERVER_CORE 0x0000001D
#define PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT 0x0000001E
#define PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY 0x0000001F
#define PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING 0x00000020
#define PRODUCT_SMALLBUSINESS_SERVER_PRIME 0x00000021
#define PRODUCT_HOME_PREMIUM_SERVER 0x00000022
#define PRODUCT_SERVER_FOR_SMALLBUSINESS_V 0x00000023
#define PRODUCT_STANDARD_SERVER_V 0x00000024
#define PRODUCT_DATACENTER_SERVER_V 0x00000025
#define PRODUCT_ENTERPRISE_SERVER_V 0x00000026
#define PRODUCT_DATACENTER_SERVER_CORE_V 0x00000027
#define PRODUCT_STANDARD_SERVER_CORE_V 0x00000028
#define PRODUCT_ENTERPRISE_SERVER_CORE_V 0x00000029
#define PRODUCT_HYPERV 0x0000002A
#define SM_TABLETPC 86
#define SM_MEDIACENTER 87
#define SM_STARTER 88
#define SM_SERVERR2 89
#define VER_SERVER_NT 0x80000000
#define VER_WORKSTATION_NT 0x40000000
#define VER_SUITE_SMALLBUSINESS 0x00000001
#define VER_SUITE_ENTERPRISE 0x00000002
#define VER_SUITE_BACKOFFICE 0x00000004
#define VER_SUITE_COMMUNICATIONS 0x00000008
#define VER_SUITE_TERMINAL 0x00000010
#define VER_SUITE_SMALLBUSINESS_RESTRICTED 0x00000020
#define VER_SUITE_EMBEDDEDNT 0x00000040
#define VER_SUITE_DATACENTER 0x00000080
#define VER_SUITE_SINGLEUSERTS 0x00000100
#define VER_SUITE_PERSONAL 0x00000200
#define VER_SUITE_BLADE 0x00000400
#define VER_SUITE_EMBEDDED_RESTRICTED 0x00000800
#define VER_SUITE_SECURITY_APPLIANCE 0x00001000
#define VER_SUITE_STORAGE_SERVER 0x00002000
#define VER_SUITE_COMPUTE_SERVER 0x00004000
#define VER_SUITE_WH_SERVER 0x00008000
typedef VOID (WINAPI *GETNATIVESYSTEMINFO)(LPSYSTEM_INFO);
typedef BOOL (WINAPI *GETPRODUCTINFO)(DWORD , DWORD, DWORD, DWORD, PDWORD);
BOOL CrnGetWindowsVersion(LPTSTR pszOS)
{
OSVERSIONINFOEX osvi;
SYSTEM_INFO si;
GETNATIVESYSTEMINFO pGNSI;
GETPRODUCTINFO pGPI;
BOOL bOsVersionInfoEx;
DWORD dwType;
ZeroMemory(&si, sizeof(SYSTEM_INFO));
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *)&osvi);
if (!bOsVersionInfoEx)
return 1;
// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
pGNSI = (GETNATIVESYSTEMINFO)GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
if (NULL != pGNSI)
pGNSI(&si);
else
GetSystemInfo(&si);
if (VER_PLATFORM_WIN32_NT == osvi.dwPlatformId && osvi.dwMajorVersion > 4)
{
strncpy(pszOS, TEXT("Microsoft "), BUFSIZE);
// Test for the specific product.
if (osvi.dwMajorVersion == 6)
{
if (osvi.dwMinorVersion == 0)
{
if (osvi.wProductType == VER_NT_WORKSTATION)
strcat(pszOS, TEXT("Windows Vista "));
else
strcat(pszOS, TEXT("Windows Server 2008 "));
}
else if (osvi.dwMinorVersion == 1)
strcat(pszOS, TEXT("Windows 7 "));
pGPI = (GETPRODUCTINFO)GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll")), "GetProductInfo");
if (pGPI)
{
pGPI(6, 0, 0, 0, &dwType);
}
switch (dwType)
{
case PRODUCT_ULTIMATE:
strcat(pszOS, TEXT("Ultimate Edition"));
break;
case PRODUCT_HOME_PREMIUM:
strcat(pszOS, TEXT("Home Premium Edition"));
break;
case PRODUCT_HOME_BASIC:
strcat(pszOS, TEXT("Home Basic Edition"));
break;
case PRODUCT_ENTERPRISE:
strcat(pszOS, TEXT("Enterprise Edition"));
break;
case PRODUCT_BUSINESS:
strcat(pszOS, TEXT("Business Edition"));
break;
case PRODUCT_STARTER:
strcat(pszOS, TEXT("Starter Edition"));
break;
case PRODUCT_CLUSTER_SERVER:
strcat(pszOS, TEXT("Cluster Server Edition"));
break;
case PRODUCT_DATACENTER_SERVER:
strcat(pszOS, TEXT("Datacenter Edition"));
break;
case PRODUCT_DATACENTER_SERVER_CORE:
strcat(pszOS, TEXT("Datacenter Edition (core installation)"));
break;
case PRODUCT_ENTERPRISE_SERVER:
strcat(pszOS, TEXT("Enterprise Edition"));
break;
case PRODUCT_ENTERPRISE_SERVER_CORE:
strcat(pszOS, TEXT("Enterprise Edition (core installation)"));
break;
case PRODUCT_ENTERPRISE_SERVER_IA64:
strcat(pszOS, TEXT("Enterprise Edition for Itanium-based Systems"));
break;
case PRODUCT_SMALLBUSINESS_SERVER:
strcat(pszOS, TEXT("Small Business Server"));
break;
case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
strcat(pszOS, TEXT("Small Business Server Premium Edition"));
break;
case PRODUCT_STANDARD_SERVER:
strcat(pszOS, TEXT("Standard Edition"));
break;
case PRODUCT_STANDARD_SERVER_CORE:
strcat(pszOS, TEXT("Standard Edition (core installation)"));
break;
case PRODUCT_WEB_SERVER:
strcat(pszOS, TEXT("Web Server Edition"));
break;
default:
strcat(pszOS, TEXT("Unknown"));
break;
}
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
strcat(pszOS, TEXT(", 64-bit"));
else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
strcat(pszOS, TEXT(", 32-bit"));
}
if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
{
if (GetSystemMetrics(SM_SERVERR2))
strcat(pszOS, TEXT("Windows Server 2003 R2, "));
else if (osvi.wSuiteMask == VER_SUITE_STORAGE_SERVER)
strcat(pszOS, TEXT("Windows Storage Server 2003"));
else if (osvi.wProductType == VER_NT_WORKSTATION
&& si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
strcat(pszOS, TEXT("Windows XP Professional x64 Edition"));
else
strcat(pszOS, TEXT("Windows Server 2003, "));
// Test for the server type.
if (osvi.wProductType != VER_NT_WORKSTATION)
{
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
{
if ((osvi.wSuiteMask & VER_SUITE_DATACENTER) == VER_SUITE_DATACENTER)
strcat(pszOS, TEXT("Datacenter Edition for Itanium-based Systems"));
else if ((osvi.wSuiteMask & VER_SUITE_ENTERPRISE) == VER_SUITE_ENTERPRISE)
strcat(pszOS, TEXT("Enterprise Edition for Itanium-based Systems"));
}
else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
{
if ((osvi.wSuiteMask & VER_SUITE_DATACENTER) == VER_SUITE_DATACENTER)
strcat(pszOS, TEXT("Datacenter x64 Edition"));
else if ((osvi.wSuiteMask & VER_SUITE_ENTERPRISE) == VER_SUITE_ENTERPRISE)
strcat(pszOS, TEXT("Enterprise x64 Edition"));
else
strcat(pszOS, TEXT("Standard x64 Edition"));
}
else
{
if ((osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER) == VER_SUITE_COMPUTE_SERVER)
strcat(pszOS, TEXT("Compute Cluster Edition"));
else if ((osvi.wSuiteMask & VER_SUITE_DATACENTER) == VER_SUITE_DATACENTER)
strcat(pszOS, TEXT("Datacenter Edition"));
else if ((osvi.wSuiteMask & VER_SUITE_ENTERPRISE) == VER_SUITE_ENTERPRISE)
strcat(pszOS, TEXT("Enterprise Edition"));
else if ((osvi.wSuiteMask & VER_SUITE_BLADE) == VER_SUITE_BLADE)
strcat(pszOS, TEXT("Web Edition"));
else
strcat(pszOS, TEXT("Standard Edition"));
}
}
}
if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)
{
strcat(pszOS, TEXT("Windows XP "));
if ((osvi.wSuiteMask & VER_SUITE_PERSONAL) == VER_SUITE_PERSONAL)
strcat(pszOS, TEXT("Home Edition"));
else
strcat(pszOS, TEXT("Professional"));
}
if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
{
strcat(pszOS, TEXT("Windows 2000 "));
if (osvi.wProductType == VER_NT_WORKSTATION)
{
strcat(pszOS, TEXT("Professional"));
}
else
{
if ((osvi.wSuiteMask & VER_SUITE_DATACENTER) == VER_SUITE_DATACENTER)
strcat(pszOS, TEXT("Datacenter Server"));
else if ((osvi.wSuiteMask & VER_SUITE_ENTERPRISE) == VER_SUITE_ENTERPRISE)
strcat(pszOS, TEXT("Advanced Server"));
else
strcat(pszOS, TEXT("Server"));
}
}
// Include service pack (if any) and build number.
UINT uLen = strlen(osvi.szCSDVersion);
if (uLen > 0)
{
strcat(pszOS, TEXT(" "));
strcat(pszOS, osvi.szCSDVersion);
}
TCHAR szBuf[80];
sprintf(szBuf, TEXT(" (build %d)"), osvi.dwBuildNumber);
strcat(pszOS, szBuf);
return TRUE;
}
else
{
MessageBox(0,
TEXT("Does not support this version of Windows."),
TEXT(__FUNC__),
MB_ICONWARNING | MB_OK | MB_TASKMODAL | MB_SETFOREGROUND);
return FALSE;
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TCHAR sz[256];
if (CrnGetWindowsVersion(sz))
ShowMessage(sz);
}
阅读(912) | 评论(0) | 转发(0) |