Windows OS 버전 가져오는 소스.

GetVersionEx의 경우 호환성관리자를 통해 OS버전을 낮출경우

=> 예: Windows 7에서 Windows XP호환으로 프로그램 기동

낮아진 OS 버전정보가 나오게 된다. 따라서

kernel32.dll에서 제공한 "VerifyVersionInfo 관련 API를 사용한다.

이는 Win9x에서 지원되지 않으므로 Win9x계열에서는 GetVersion을 사용한다.

Windows 10 이상에서는 VerifyVersionInfo이나 GetVersionEx를 사용시 버전정보가 이상하게 동작한다. 따라서 Windows 10에서는 레지스트리에서 읽어온다.

typedef BOOL (WINAPI *VERIFYVERSIONINFOA)(LPOSVERSIONINFOEXA, DWORD, DWORDLONG);
typedef BOOL (WINAPI *VERIFYVERSIONINFOW)(LPOSVERSIONINFOEXW, DWORD, DWORDLONG);
typedef ULONGLONG (NTAPI *VERSETCONDITIONMASK)(ULONGLONG, DWORD, BYTE);


#ifdef UNICODE
VERIFYVERSIONINFOW g_pfnVerifyVersionInfoW = \
(VERIFYVERSIONINFOW)GetProcAddress(GetModuleHandle(_T("kernel32.dll")), "VerifyVersionInfoW");
#define VerifyVersionInfoT  g_pfnVerifyVersionInfoW
#else
VERIFYVERSIONINFOA g_pfnVerifyVersionInfoA = \
(VERIFYVERSIONINFOA)GetProcAddress(GetModuleHandle(_T("kernel32.dll")), "VerifyVersionInfoA");
#define VerifyVersionInfoT  g_pfnVerifyVersionInfoA
#endif

VERSETCONDITIONMASK g_pfnVerSetConditionMask = \
(VERSETCONDITIONMASK)GetProcAddress(GetModuleHandle(_T("kernel32.dll")), "VerSetConditionMask");

#define VERSETCONDITION(_m_,_t_,_c_)  \
	((_m_)=g_pfnVerSetConditionMask((_m_),(_t_),(_c_)))
   

int IsWindowVersion(int MajorVer, int MinorVer, int platformID)
{

	BOOL bRet = 0;

	if (!VerifyVersionInfoT)
	{
		//Windows NT, 9X계열
		return -1;

		// 		OSVERSIONINFO osvi;
		// 		osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
		// 		GetVersionEx (&osvi);
		// 		bRet = (osvi.dwMajorVersion == (DWORD)MajorVer);
	}
	else
	{
		OSVERSIONINFOEX osver = {0};
		osver.dwOSVersionInfoSize = sizeof(osver);

		DWORDLONG dwlConditionMask = 0;    
		DWORD masks = 0;

		if(MajorVer != -1)
		{
			osver.dwMajorVersion = MajorVer;
			VERSETCONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);
			masks |= VER_MAJORVERSION;
		}

		if(MinorVer != -1)
		{
			osver.dwMinorVersion = MinorVer;
			VERSETCONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);
			masks |= VER_MINORVERSION;
		}

		if(platformID != -1)
		{
			osver.dwPlatformId = platformID;
			VERSETCONDITION(dwlConditionMask, VER_PLATFORMID, VER_EQUAL);
			masks |= VER_PLATFORMID;		
		}

		bRet = VerifyVersionInfoT(&osver, masks, dwlConditionMask);
	}
	return (bRet==TRUE)?1:0;

}

int DisplaySystemVersion()
{
	int IsNT = IsWindowVersion(-1,-1,VER_PLATFORM_WIN32_NT);
	if(IsNT == 1)
	{
		if(IsWindowVersion(5) == 1)		//Windows 2000, XP, 2003
			return 5;

		if(IsWindowVersion(6) == 1)		//Windows Vista, 7, 8
			return 6;

		if(IsWindowVersion(10) == 1)	//Windows 10
			return 10;

	}
	else //API지원 안함 2000 이하 Win9x ~ WINNT
	{
		OSVERSIONINFOEX osvi;
		BOOL bOsVersionInfoEx;

		ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
		osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

		if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
		{
			osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
			if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
				return 0;
		}

		switch (osvi.dwPlatformId)
		{
		case VER_PLATFORM_WIN32_NT:
			{

				if ( osvi.dwMajorVersion <= 4 )	//NT
					return 4;

				if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 )	//2000
					return 5;

				if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )	//XP
					return 5;

				if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )	//2003
					return 5;

				// 			if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )	//vista
				// 				return 6;
				// 			
				// 			if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1 )	//win 7
				// 				return 6;

				if ( osvi.dwMajorVersion == 6 ) //vista or win7 or win 8
					return 6;

				if ( osvi.dwMajorVersion == 10 ) //windows 10
					return 10;

			}
			break;
		case VER_PLATFORM_WIN32_WINDOWS:	//9x
			{
				return 3;
			}
			break;
		}
		return 0;
	}
	return 0;
}
   
    
int GetWindowsMajorVersionNumber()
{
	LONG lResult;
	HKEY hKey;
	DWORD dwType;
	DWORD dwBytes;
	int buffer = 0;

	// open Regstry Key
	lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
		_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), 
		0, KEY_QUERY_VALUE, &hKey);
	if(lResult != ERROR_SUCCESS)
	{
		return -1;
	} 

	// Read Regstry Key
	lResult=RegQueryValueEx(hKey, _T("CurrentMajorVersionNumber"), 0, &dwType, (LPBYTE)&buffer, &dwBytes); 
	if(lResult == ERROR_SUCCESS)
	{
		return buffer;
	}

	RegCloseKey(hKey);
	return -1;
}

BOOL IsWin10Later()
{
	if(DisplaySystemVersion() >= 6 )
	{
		if(GetWindowsMajorVersionNumber() >= 10)
			return TRUE;
	}

	return FALSE;
}


'C++' 카테고리의 다른 글

간단히 개발한 openssl을 이용한 파일 암복호화 프로그램  (0) 2016.04.21
함수 실행시간 재기  (0) 2016.02.04
Boost설치방법  (0) 2016.01.27
Posted by 빵원군
,