MSDN上有一个表
Operating system |
Version number |
dwMajorVersion
|
dwMinorVersion
|
Other |
Windows 7 |
6.1 |
6 |
1 |
OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION |
Windows Server 2008 R2 |
6.1 |
6 |
1 |
OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION |
Windows Server 2008 |
6.0 |
6 |
0 |
OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION |
Windows Vista |
6.0 |
6 |
0 |
OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION |
Windows Server 2003 R2 |
5.2 |
5 |
2 |
GetSystemMetrics(SM_SERVERR2) != 0 |
Windows Home Server |
5.2 |
5 |
2 |
OSVERSIONINFOEX.wSuiteMask == VER_SUITE_WH_SERVER |
Windows Server 2003 |
5.2 |
5 |
2 |
GetSystemMetrics(SM_SERVERR2) == 0 |
Windows XP Professional x64 Edition |
5.2 |
5 |
2 |
(OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION) &&
(SYSTEM_INFO.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) |
Windows XP |
5.1 |
5 |
1 |
Not applicable |
Windows 2000 |
5.0 |
5 |
0 |
Not applicable
|
贴出代码,在vc2005上通过,在xp,2003上得到证实
// OS.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include
<stdio.h>
#include <strsafe.h>
#include <stdlib.h>
#pragma comment(lib, "User32.lib")
#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 *PGNSI)(LPSYSTEM_INFO);
typedef BOOL (WINAPI
*PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);
BOOL GetOSDisplayString( LPTSTR pszOS);
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR szOS[BUFSIZE];
if( GetOSDisplayString( szOS ) )
_tprintf( TEXT("/n%s/n"), szOS
);
system("pause");
return 0;
}
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);
if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
return 1;
// 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.dwMinorVersion ==
0 )
{
if( osvi.wProductType == VER_NT_WORKSTATION )
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Vista "));
else
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 " ));
}
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 "
));
}
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_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;
}
}
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" ));
}
}
}
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" ));
}
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
{
printf( "This sample does not support this version of
Windows./n");
return
FALSE;
}
}