/*****************************************************************************
Operating System Version PlatformID
Windows 8 6.2 VER_PLATFORM_WIN32_NT (=2)
Windows 7 6.1 VER_PLATFORM_WIN32_NT
Windows Server 2008 R2 6.1 VER_PLATFORM_WIN32_NT
Windows Server 2008 6.0 VER_PLATFORM_WIN32_NT
Windows Vista 6.0 VER_PLATFORM_WIN32_NT
Windows Server 2003 R2 5.2 VER_PLATFORM_WIN32_NT
Windows Server 2003 5.2 VER_PLATFORM_WIN32_NT
Windows XP 64-Bit Edition 5.2 VER_PLATFORM_WIN32_NT
Windows XP 5.1 VER_PLATFORM_WIN32_NT
Windows 2000 5.0 VER_PLATFORM_WIN32_NT
Windows NT 4.0 4.0 VER_PLATFORM_WIN32_NT
Windows NT 3.51 3.51 ? VER_PLATFORM_WIN32_NT
Windows Millennium Edition 4.90 VER_PLATFORM_WIN32_WINDOWS (=1)
Windows 98 4.10 VER_PLATFORM_WIN32_WINDOWS
Windows 95 4.0 VER_PLATFORM_WIN32_WINDOWS
Windows 3.1 3.1 ? VER_PLATFORM_WIN32s (=0)
*****************************************************************************/
#include "stdafx.h"
#include<windows.h>
//#include<tchar.h>
//#include <stdio.h>
#include<strsafe.h>
#pragma comment(lib,"User32.lib")
#pragma comment(lib,"Advapi32.lib")//VS2005 Express needed
#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 PRODUCT_PROFESSIONAL 0x00000030
#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 *PGNSI)(LPSYSTEM_INFO);
typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);
BOOL GetOSDisplayString( LPTSTR pszOS)
{
OSVERSIONINFOEX osvi;
SYSTEM_INFO si;
PGNSI pGNSI;
PGPI 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 FALSE;
// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
pGNSI =(PGNSI)GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll")),
"GetNativeSystemInfo");
if(NULL != pGNSI)
pGNSI(&si);
else
GetSystemInfo(&si);
if( VER_PLATFORM_WIN32_NT==osvi.dwPlatformId &&
osvi.dwMajorVersion >4)
{
StringCchCopy(pszOS, BUFSIZE, TEXT("Microsoft "));
// Test for the specific product.
if( osvi.dwMajorVersion >=6)
{
if( osvi.dwMajorVersion >6|| osvi.dwMinorVersion >2)
{
StringCchCat(pszOS, BUFSIZE, TEXT("Windows 8 Later "));// for new OS
}
elseif( osvi.dwMinorVersion ==0)
{
if( osvi.wProductType == VER_NT_WORKSTATION )
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Vista "));
else
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 "));
}
elseif( osvi.dwMinorVersion ==1)
{
if( osvi.wProductType == VER_NT_WORKSTATION )
StringCchCat(pszOS, BUFSIZE, TEXT("Windows 7 "));
else
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 R2 "));
}
elseif( osvi.dwMinorVersion ==2)
{
StringCchCat(pszOS, BUFSIZE, TEXT("Windows 8 "));
}
pGPI =(PGPI)GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll")),
"GetProductInfo");
pGPI( osvi.dwMajorVersion, osvi.dwMinorVersion,0,0,&dwType);
switch( dwType )
{
case PRODUCT_ULTIMATE:
StringCchCat(pszOS, BUFSIZE, TEXT("Ultimate Edition"));
break;
case PRODUCT_PROFESSIONAL:
StringCchCat(pszOS, BUFSIZE, TEXT("Professional"));
break;
case PRODUCT_HOME_PREMIUM:
StringCchCat(pszOS, BUFSIZE, TEXT("Home Premium Edition"));
break;
case PRODUCT_HOME_BASIC:
StringCchCat(pszOS, BUFSIZE, TEXT("Home Basic Edition"));
break;
case PRODUCT_ENTERPRISE:
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition"));
break;
case PRODUCT_BUSINESS:
StringCchCat(pszOS, BUFSIZE, TEXT("Business Edition"));
break;
case PRODUCT_STARTER:
StringCchCat(pszOS, BUFSIZE, TEXT("Starter Edition"));
break;
case PRODUCT_CLUSTER_SERVER:
StringCchCat(pszOS, BUFSIZE, TEXT("Cluster Server Edition"));
break;
case PRODUCT_DATACENTER_SERVER:
StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition"));
break;
case PRODUCT_DATACENTER_SERVER_CORE:
StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition (core installation)"));
break;
case PRODUCT_ENTERPRISE_SERVER:
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition"));
break;
case PRODUCT_ENTERPRISE_SERVER_CORE:
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition (core installation)"));
break;
case PRODUCT_ENTERPRISE_SERVER_IA64:
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition for Itanium-based Systems"));
break;
case PRODUCT_SMALLBUSINESS_SERVER:
StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server"));
break;
case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server Premium Edition"));
break;
case PRODUCT_STANDARD_SERVER:
StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition"));
break;
case PRODUCT_STANDARD_SERVER_CORE:
StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition (core installation)"));
break;
case PRODUCT_WEB_SERVER:
StringCchCat(pszOS, BUFSIZE, TEXT("Web Server Edition"));
break;
}
}
elseif(/*osvi.dwMajorVersion == 5 &&*/ osvi.dwMinorVersion ==2)
{
if(GetSystemMetrics(SM_SERVERR2))
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2003 R2, "));
elseif( osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER )
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Storage Server 2003"));
elseif( osvi.wSuiteMask & VER_SUITE_WH_SERVER )
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Home Server"));
elseif( osvi.wProductType == VER_NT_WORKSTATION &&
si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
{
StringCchCat(pszOS, BUFSIZE, TEXT("Windows XP Professional x64 Edition"));
}
else
StringCchCat(pszOS, BUFSIZE, 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 )
StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition for Itanium-based Systems"));
elseif( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition for Itanium-based Systems"));
}
elseif( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter x64 Edition"));
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise x64 Edition"));
else
StringCchCat(pszOS, BUFSIZE, TEXT("Standard x64 Edition"));
}
else
{
if( osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER )
StringCchCat(pszOS, BUFSIZE, TEXT("Compute Cluster Edition"));
else if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition"));
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition"));
else if( osvi.wSuiteMask & VER_SUITE_BLADE )
StringCchCat(pszOS, BUFSIZE, TEXT("Web Edition"));
else
StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition"));
}
}
}
elseif(/*osvi.dwMajorVersion == 5 &&*/ osvi.dwMinorVersion ==1)
{
StringCchCat(pszOS, BUFSIZE, TEXT("Windows XP "));
if( osvi.wSuiteMask & VER_SUITE_PERSONAL )
StringCchCat(pszOS, BUFSIZE, TEXT("Home Edition"));
else
StringCchCat(pszOS, BUFSIZE, TEXT("Professional"));
}
elseif(/*osvi.dwMajorVersion == 5 &&*/ osvi.dwMinorVersion ==0)
{
StringCchCat(pszOS, BUFSIZE, TEXT("Windows 2000 "));
if( osvi.wProductType == VER_NT_WORKSTATION )
{
StringCchCat(pszOS, BUFSIZE, TEXT("Professional"));
}
else
{
if( osvi.wSuiteMask & VER_SUITE_DATACENTER )
StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Server"));
elseif( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCat(pszOS, BUFSIZE, TEXT("Advanced Server"));
else
StringCchCat(pszOS, BUFSIZE, TEXT("Server"));
}
}
// Include service pack (if any) and build number.
if( _tcslen(osvi.szCSDVersion)>0)
{
StringCchCat(pszOS, BUFSIZE, TEXT(" "));
StringCchCat(pszOS, BUFSIZE, osvi.szCSDVersion);
}
TCHAR buf[80];
StringCchPrintf( buf,80, TEXT(" (build %d)"), osvi.dwBuildNumber);
StringCchCat(pszOS, BUFSIZE, buf);
if( osvi.dwMajorVersion >=6)
{
if( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
StringCchCat(pszOS, BUFSIZE, TEXT(", 64-bit"));
elseif(si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
StringCchCat(pszOS, BUFSIZE, TEXT(", 32-bit"));
}
return TRUE;
}
else
{
return FALSE;
}
}
BOOL GetOldOSVer(LPSTR pszOldOS)
{
OSVERSIONINFOEXA osvi;
BOOL bOsVersionInfoEx;
ZeroMemory(&osvi,sizeof(OSVERSIONINFOEXA));
// Try calling GetVersionEx using the OSVERSIONINFOEX structure.
// If that fails, try using the OSVERSIONINFO structure.
osvi.dwOSVersionInfoSize =sizeof(OSVERSIONINFOEXA);
bOsVersionInfoEx =GetVersionExA((OSVERSIONINFOA *)&osvi);
if(!bOsVersionInfoEx )
{
osvi.dwOSVersionInfoSize =sizeof(OSVERSIONINFOA);
if(!GetVersionExA((OSVERSIONINFOA *)&osvi))
{
StringCchCatA(pszOldOS, BUFSIZE,"Unknow Windows?");
return FALSE;
}
}
switch(osvi.dwPlatformId)
{
// Test for the Windows NT product family.
case VER_PLATFORM_WIN32_NT:
if(osvi.dwMajorVersion <=4){
StringCchCatA(pszOldOS, BUFSIZE,"Microsoft Windows NT ");
}else{
return FALSE;
}
break;
// Test for the Windows Me/98/95.
case VER_PLATFORM_WIN32_WINDOWS:
if(osvi.dwMajorVersion ==4)
{
switch(osvi.dwMinorVersion)
{
case 0:
StringCchCatA(pszOldOS, BUFSIZE,"Microsoft Windows 95 ");
if(osvi.szCSDVersion[1]=='C'|| osvi.szCSDVersion[1]=='B')
StringCchCatA(pszOldOS, BUFSIZE,"OSR2 ");
break;
case 3://??
StringCchCatA(pszOldOS, BUFSIZE,"Microsoft Windows 95 OSR2 ");
case 10:
StringCchCatA(pszOldOS, BUFSIZE,"Microsoft Windows 98 ");
if( osvi.szCSDVersion[1]=='A'|| osvi.szCSDVersion[1]=='B')
StringCchCatA(pszOldOS, BUFSIZE,"SE ");
break;
case 90:
StringCchCatA(pszOldOS, BUFSIZE,"Microsoft Windows Millennium Edition ");
break;
}
}
break;
case VER_PLATFORM_WIN32s:
StringCchCatA(pszOldOS, BUFSIZE,"Microsoft Win32s ");
break;
default:
return FALSE;
}
if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
// Test for specific product on Windows NT 4.0 SP6 and later.
if( bOsVersionInfoEx )
{
// Test for the workstation type.
if( osvi.wProductType == VER_NT_WORKSTATION)
{
if( osvi.dwMajorVersion ==4)
StringCchCatA(pszOldOS, BUFSIZE,"Workstation 4.0 ");
elseif( osvi.wSuiteMask & VER_SUITE_PERSONAL )
StringCchCatA(pszOldOS, BUFSIZE,"Home Edition ");
else
StringCchCatA(pszOldOS, BUFSIZE,"Professional ");
}
// Test for the server type.
elseif( osvi.wProductType == VER_NT_SERVER ||
osvi.wProductType == VER_NT_DOMAIN_CONTROLLER )
{
// Windows NT 4.0
if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCatA(pszOldOS, BUFSIZE,"Server 4.0, Enterprise Edition ");
else
StringCchCatA(pszOldOS, BUFSIZE,"Server 4.0 ");
}
}
// Test for specific product on Windows NT 4.0 SP5 and earlier
else
{
HKEY hKey;
TCHAR szProductType[BUFSIZE];
DWORD dwBufLen=BUFSIZE*sizeof(TCHAR);
LONG lRet =RegOpenKeyEx( HKEY_LOCAL_MACHINE,
TEXT("SYSTEM\CurrentControlSet\Control\ProductOptions"),0, KEY_QUERY_VALUE,&hKey );
if( lRet != ERROR_SUCCESS )
return FALSE;
lRet =RegQueryValueEx( hKey, TEXT("ProductType"),
NULL, NULL,(LPBYTE) szProductType,&dwBufLen);
RegCloseKey( hKey );
if((lRet != ERROR_SUCCESS)||(dwBufLen > BUFSIZE*sizeof(TCHAR)))
return FALSE;
if( lstrcmpi( TEXT("WINNT"), szProductType)==0)
StringCchCatA(pszOldOS, BUFSIZE,"Workstation ");
if( lstrcmpi( TEXT("LANMANNT"), szProductType)==0)
StringCchCatA(pszOldOS, BUFSIZE,"Server ");
if( lstrcmpi( TEXT("SERVERNT"), szProductType)==0)
StringCchCatA(pszOldOS, BUFSIZE,"Advanced Server ");
char szVer[20];
StringCchPrintfA(szVer,sizeof(szVer),"%d.%d ", osvi.dwMajorVersion, osvi.dwMinorVersion );
StringCchCatA(pszOldOS, BUFSIZE, szVer);
}
// Display service pack (if any) and build number.
char sp6[]="Service Pack 6";
char szBuf[40];
if( osvi.dwMajorVersion ==4&&
lstrcmpiA( osvi.szCSDVersion, sp6 )==0)
{
HKEY hKey;
LONG lRet;
// Test for SP6 versus SP6a.
lRet =RegOpenKeyEx( HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix\Q246009"),0, KEY_QUERY_VALUE,&hKey );
if( lRet == ERROR_SUCCESS )
{
StringCchPrintfA(szBuf,sizeof(szBuf),"Service Pack 6a (Build %d)", osvi.dwBuildNumber &0xFFFF);
StringCchCatA(pszOldOS, BUFSIZE, szBuf);
}
else// Windows NT 4.0 prior to SP6a
{
StringCchPrintfA(szBuf,sizeof(szBuf),"%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber &0xFFFF);
StringCchCatA(pszOldOS, BUFSIZE, szBuf);
}
RegCloseKey( hKey );
}
else// not Windows NT 4.0
{
StringCchPrintfA(szBuf,sizeof(szBuf),"%s (Build %d)", osvi.szCSDVersion, osvi.dwBuildNumber &0xFFFF);
StringCchCatA(pszOldOS, BUFSIZE, szBuf);
}
}
return TRUE;
}
int __cdecl _tmain()
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR szOS[BUFSIZE];
if(GetOSDisplayString( szOS )){
_tprintf( TEXT("
%s
"), szOS );
}else{
char szOldOS[BUFSIZE]={0};
if(GetOldOSVer(szOldOS)){
printf("
%s
", szOldOS);
}
}
}