獲取Windows系統版本

語言:C/C++
編程軟件:VS2015
字符集:UNICODE編碼

【1】說明

1、由於GetVersionEx函數在Windows 8.1版本之後,返回的結果全部是6.2,這函數被微軟動了手腳的,但是實際上可以利用額外添加一個manifest文件指示兼容新版本.

(參看文章:http://blog.csdn.net/k1988/article/details/47614529)

2、GetVersionEx函數還有一個問題,就是當使用兼容模式打開程序時,它返回的是兼容模式下的系統版本號.

由於以上這兩個問題,建議用Version Helper系列的函數或使用直接內核的函數獲取系統版本信息.

(文章:https://msdn.microsoft.com/en-us/library/windows/desktop/dn424972(v=vs.85).aspx)

這裏直接使用ntdll.dll裏的內核函數,獲取系統版本信息.


【2】實現:  

//獲取系統版本號
#define SYSTEM_VERSION_UNKNOW _T("未知的操作系統")
BOOL GetSystemVersion(LPWSTR version, DWORD lenth)
{
	BOOL Wow64;
	SYSTEM_INFO info;
	//判斷是否是在64位系統模擬層上運行
	if (!IsWow64Process(GetCurrentProcess(), &Wow64))
		return FALSE;
	//獲取CPU信息
	if (Wow64)
		GetNativeSystemInfo(&info);
	else
		GetSystemInfo(&info);
	//定義變量
	typedef LONG(__stdcall *fnRtlGetVersion)(PRTL_OSVERSIONINFOW lpVersionInformation);
	fnRtlGetVersion pRtlGetVersion;
	HMODULE hNtdll;
	LONG ntStatus;
	RTL_OSVERSIONINFOEXW os;
	//獲取函數
	hNtdll = GetModuleHandle(_T("ntdll.dll"));
	if (hNtdll == NULL)
		return FALSE;
	pRtlGetVersion = (fnRtlGetVersion)GetProcAddress(hNtdll, "RtlGetVersion");
	if (pRtlGetVersion == NULL)
		return FALSE;
	//獲取系統相關信息
	os.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW);
	ntStatus = pRtlGetVersion((PRTL_OSVERSIONINFOW)&os);
	if (ntStatus != 0)
		return FALSE;
	//判斷是什麼系統
	switch (os.dwMajorVersion){
	case 4:
	{
		switch (os.dwMinorVersion) { //Minor
		case 0:
		        {
			        if (os.dwPlatformId == VER_PLATFORM_WIN32_NT)
						wcscpy_s(version, lenth, _T("Microsoft Windows NT 4.0"));
					else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
						wcscpy_s(version, lenth, _T("Microsoft Windows 95"));
					break;
			    }
		case 10:
		       {
			        wcscpy_s(version, lenth, _T("Microsoft Windows 98"));
			        break;
	           	}
		case 90:
		        {
			        wcscpy_s(version, lenth, _T("Microsoft Windows Me"));
			        break;
		         }
		default:
		        {
			        wcscpy_s(version, lenth, SYSTEM_VERSION_UNKNOW);
			        break;
	  	         }
		}
		break;
	}
	case 5:
	{
		switch (os.dwMinorVersion) {
		case 0:
		    { 
			    wcscpy_s(version, lenth, _T("Microsoft Windows 2000"));
			    break;
		    }
		case 1:
		   { 
			   wcscpy_s(version, lenth, _T("Microsoft Windows XP"));
			   break;
		   }
		case 2:
		{
			if (os.wProductType == VER_NT_WORKSTATION &&
				info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)
				wcscpy_s(version, lenth, _T("Microsoft Windows XP Professional x64 Edition"));
			else if (os.wSuiteMask == VER_SUITE_WH_SERVER)
				wcscpy_s(version, lenth, _T("Microsoft Windows Home Server"));
			else if (GetSystemMetrics(SM_SERVERR2) == 0)
				wcscpy_s(version, lenth, _T("Microsoft Windows Server 2003"));
			else if (GetSystemMetrics(SM_SERVERR2) != 0)
				wcscpy_s(version, lenth, _T("Microsoft Windows Server 2003 R2"));
			break;
		}
		default:
		{
			wcscpy_s(version, lenth, SYSTEM_VERSION_UNKNOW);
			break;
		}
	  }
		break;
	}
	case 6:
	{
		switch (os.dwMinorVersion) {
		case 0:
		{
			if (os.wProductType == VER_NT_WORKSTATION)
				wcscpy_s(version, lenth, _T("Microsoft Windows Vista"));
			else
				wcscpy_s(version, lenth, _T("Microsoft Windows Server 2008"));
			break;
		}
		case 1:
		{
			if (os.wProductType == VER_NT_WORKSTATION)
				wcscpy_s(version, lenth, _T("Microsoft Windows 7"));
			else
				wcscpy_s(version, lenth, _T("Microsoft Windows Server 2008 R2"));
			break;
		}
		case 2:
		{
			if (os.wProductType == VER_NT_WORKSTATION)
				wcscpy_s(version, lenth, _T("Microsoft Windows 8"));
			else
				wcscpy_s(version, lenth, _T("Microsoft Windows Server 2012"));
			break;
		}
		case 3:
		    {
			   if (os.wProductType == VER_NT_WORKSTATION)
				  wcscpy_s(version, lenth, _T("Microsoft Windows 8.1"));
			   else
			   	  wcscpy_s(version, lenth, _T("Microsoft Windows Server 2012 R2"));
			   break;
		    }
		}
		break;
	}
	case 10:
	{
		if (os.dwMinorVersion == 0)
		{
			if (os.wProductType == VER_NT_WORKSTATION)
				wcscpy_s(version, lenth, _T("Microsoft Windows 10"));
			else
				wcscpy_s(version, lenth, _T("Microsoft Windows Server 2016"));
		}
		else
		{
			wcscpy_s(version, lenth, SYSTEM_VERSION_UNKNOW);
		}
		break;
	}
	default:
	{
		wcscpy_s(version, lenth, SYSTEM_VERSION_UNKNOW);
		break;
	}
  }
	if ((wcscmp(version, SYSTEM_VERSION_UNKNOW) != 0))
	{		
		if(os.dwBuildNumber != 0)
		   wsprintf(version, _T("%s.%u"), version, os.dwBuildNumber);
	
		if (info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 || info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64)
			wcscat_s(version, lenth, _T(" 64位<基於x64的處理器>"));
		else
			wcscat_s(version, lenth, _T(" 32位<基於x86的處理器>"));
	}
	return TRUE;
}

【3】效果:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章