获取Windows版本
2016-07-13 22:39
507 查看
//搜索“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 <windows.h> #include <tchar.h> #include <strsafe.h> #include <stdlib.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 } 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"); }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解