获取Windows版本

//搜索“msdn os version”及“获取Windows版本”可得到大量的资料

/*****************************************************************************

Operating System           dwMajorVersiondw   MinorVersion   PlatformID                Other

Windows 8.1                6                  3              VER_PLATFORM_WIN32_NT     OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION

Windows Server 2012 R2     6                  3              VER_PLATFORM_WIN32_NT     OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION


Windows 8                  6                  2              VER_PLATFORM_WIN32_NT     OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION

Windows Server 2012        6                  2              VER_PLATFORM_WIN32_NT     OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION

Windows 7                  6                  1              VER_PLATFORM_WIN32_NT     OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION

Windows Server 2008 R2     6                  1              VER_PLATFORM_WIN32_NT     OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION

Windows Server 2008        6                  0              VER_PLATFORM_WIN32_NT     OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION

Windows Vista              6                  0              VER_PLATFORM_WIN32_NT     OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION

Windows Server 2003 R2     5                  2              VER_PLATFORM_WIN32_NT      GetSystemMetrics(SM_SERVERR2) != 0

Windows Server 2003        5                  2              VER_PLATFORM_WIN32_NT      GetSystemMetrics(SM_SERVERR2) == 0

Windows XP 64-Bit Edition  5                  2              VER_PLATFORM_WIN32_NT      Not applicable

Windows XP                 5                  1              VER_PLATFORM_WIN32_NT      Not applicable

Windows 2000               5                  0              VER_PLATFORM_WIN32_NT      Not applicable

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

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 

#include 

#include 

#include 

#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

}

else if( osvi.dwMinorVersion ==0)

{

if( osvi.wProductType == VER_NT_WORKSTATION )

StringCchCat(pszOS, BUFSIZE, TEXT("Windows Vista "));

else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 "));

}

else if( osvi.dwMinorVersion ==1)

{

if( osvi.wProductType == VER_NT_WORKSTATION )

StringCchCat(pszOS, BUFSIZE, TEXT("Windows 7 "));

else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 R2 "));

}

else if( 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;

}

}


else if(/*osvi.dwMajorVersion == 5 &&*/ osvi.dwMinorVersion ==2)

{

if(GetSystemMetrics(SM_SERVERR2))

StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2003 R2, "));

else if( osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER )

StringCchCat(pszOS, BUFSIZE, TEXT("Windows Storage Server 2003"));

else if( osvi.wSuiteMask & VER_SUITE_WH_SERVER )

StringCchCat(pszOS, BUFSIZE, TEXT("Windows Home Server"));

else if( 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"));

else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )

StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition for Itanium-based Systems"));

}


else if( 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"));

}

}

}


else if(/*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"));

}


else if(/*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"));

else if( 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"));

else if(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)

{

case0:

StringCchCatA(pszOldOS, BUFSIZE,"Microsoft Windows 95 ");

if(osvi.szCSDVersion[1]=='C'|| osvi.szCSDVersion[1]=='B')

StringCchCatA(pszOldOS, BUFSIZE,"OSR2 ");

break;

case3://??

StringCchCatA(pszOldOS, BUFSIZE,"Microsoft Windows 95 OSR2 ");

case10:

StringCchCatA(pszOldOS, BUFSIZE,"Microsoft Windows 98 ");

if( osvi.szCSDVersion[1]=='A'|| osvi.szCSDVersion[1]=='B')

StringCchCatA(pszOldOS, BUFSIZE,"SE ");

break;

case90:

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 ");

else if( osvi.wSuiteMask & VER_SUITE_PERSONAL )

StringCchCatA(pszOldOS, BUFSIZE,"Home Edition ");

else StringCchCatA(pszOldOS, BUFSIZE,"Professional ");

}

// Test for the server type.

else if( 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("\n%s\n\n"), szOS );

}else{

char szOldOS[BUFSIZE]={0};

if(GetOldOSVer(szOldOS)){

printf("\n%s\n\n", szOldOS);

}

}

system("PAUSE");

}

你可能感兴趣的:(获取Windows版本)