/*****************************************************************************Operating System Version PlatformIDWindows 8 6.2 VER_PLATFORM_WIN32_NT (=2)Windows 7 6.1 VER_PLATFORM_WIN32_NTWindows Server 2008 R2 6.1 VER_PLATFORM_WIN32_NTWindows Server 2008 6.0 VER_PLATFORM_WIN32_NTWindows Vista 6.0 VER_PLATFORM_WIN32_NTWindows Server 2003 R2 5.2 VER_PLATFORM_WIN32_NTWindows Server 2003 5.2 VER_PLATFORM_WIN32_NTWindows XP 64-Bit Edition 5.2 VER_PLATFORM_WIN32_NTWindows XP 5.1 VER_PLATFORM_WIN32_NTWindows 2000 5.0 VER_PLATFORM_WIN32_NTWindows NT 4.0 4.0 VER_PLATFORM_WIN32_NTWindows NT 3.51 3.51 ? VER_PLATFORM_WIN32_NTWindows Millennium Edition 4.90 VER_PLATFORM_WIN32_WINDOWS (=1)Windows 98 4.10 VER_PLATFORM_WIN32_WINDOWSWindows 95 4.0 VER_PLATFORM_WIN32_WINDOWSWindows 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 0x00008000typedef 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);elseGetSystemInfo(&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 "));elseStringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 "));}elseif( osvi.dwMinorVersion ==1){if( osvi.wProductType == VER_NT_WORKSTATION )StringCchCat(pszOS, BUFSIZE, TEXT("Windows 7 "));elseStringCchCat(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"));}elseStringCchCat(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"));elseStringCchCat(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"));elseStringCchCat(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"));elseStringCchCat(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"));elseStringCchCat(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 ");elseStringCchCatA(pszOldOS, BUFSIZE,"Professional ");}// Test for the server type.elseif( osvi.wProductType == VER_NT_SERVER ||osvi.wProductType == VER_NT_DOMAIN_CONTROLLER ){// Windows NT 4.0if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )StringCchCatA(pszOldOS, BUFSIZE,"Server 4.0, Enterprise Edition ");elseStringCchCatA(pszOldOS, BUFSIZE,"Server 4.0 ");}}// Test for specific product on Windows NT 4.0 SP5 and earlierelse{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("\n%s\n"), szOS );}else{char szOldOS[BUFSIZE]={0};if(GetOldOSVer(szOldOS)){printf("\n%s\n", szOldOS);}}}
相关文章: