////////////////////////////////////////////////////////////////////////////////////
//
//	< COSVersion >
//
//		Retrieve the Windows OS version.
//
//	* AUTHOR
//		Nam, in hyouk (GreenB)
//
//	* ACKNOWLEDGEMENT
//		Hans Dietrich(hdietrich@gmail.com)
//		I found it by reference to his "CXWinVer" class.
//		Please see his article at www.codeproject.com
//
//	* HISTORY
//		2009-04-11	Initial release.
//
//	* LICENCE
//     This software is released into the public domain. You are free to use
//     it in any way you like, except that you may not sell this source code.
//
//     This software is provided "as is" with no expressed or implied warranty.
//     I accept no liability for any damage or loss of business that this
//     software may cause.
//
//
//	copyright(c) 2009. GreenB. All right reserved.
//	http://greenmaru.com
//
//
////////////////////////////////////////////////////////////////////////////////////
#ifndef _GREENB_OSVERSION_
#define _GREENB_OSVERSION_
#pragma once

#include <windows.h>

////////////////////////////////////////////////////////////////////////////////////
//
//	COSVersion
//
////////////////////////////////////////////////////////////////////////////////////
class COSVersion
{
	////////////////////////////////////////////////////////////////////////////////
	//	MEMBER VARS
	////////////////////////////////////////////////////////////////////////////////
private:
	OSVERSIONINFOEX m_osver;

	////////////////////////////////////////////////////////////////////////////////
	//	CONSTRUCTION
	////////////////////////////////////////////////////////////////////////////////
public:
	COSVersion( void )
	{
		memset( &m_osver, NULL, sizeof( OSVERSIONINFOEX ) );
		m_osver.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );

		if ( GetVersionEx( reinterpret_cast<LPOSVERSIONINFO>(&m_osver) ) )
		{
			//
			// Is NT4 SP6 or later?
			//
			if ( ( m_osver.dwPlatformId == VER_PLATFORM_WIN32_NT ) &&  (m_osver.dwMajorVersion >= 5 ) )
			{
				memset( &m_osver, NULL, sizeof( OSVERSIONINFOEX ) );
				m_osver.dwOSVersionInfoSize = sizeof( OSVERSIONINFOEX );
				GetVersionEx( reinterpret_cast<LPOSVERSIONINFO>(&m_osver) );
			}
		}
	}

	~COSVersion( void )
	{
	}

	////////////////////////////////////////////////////////////////////////////////
	//	PROPERTY
	////////////////////////////////////////////////////////////////////////////////
public:
	DWORD MajorVersion( void ) const
	{
		return m_osver.dwMajorVersion;
	}

	DWORD MinorVersion( void ) const
	{
		return m_osver.dwMinorVersion;
	}

	DWORD BuildNumber( void ) const
	{
		return ( m_osver.dwBuildNumber & 0xFFFF );
	}

	DWORD ServicePack( void ) const
	{
		int nServicePack = 0;
		for ( int i = 0 ; ( m_osver.szCSDVersion[i] != _T('\0') ) && ( i < (sizeof(m_osver.szCSDVersion) / sizeof(TCHAR) ) ) ; i++ )
		{
			if ( _istdigit( m_osver.szCSDVersion[i] ) )
			{
				nServicePack = _ttoi( &m_osver.szCSDVersion[i] );
				break;
			}
		}
		return nServicePack;
	}

	//
	// Windows 9x
	//
	BOOL IsWin9x( void ) const
	{
		if ( m_osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS && m_osver.dwMajorVersion == 4 )
			return TRUE;
		return FALSE;
	}

	//
	// Windows NT
	//
	BOOL IsWinNT4( void ) const
	{
		if ( m_osver.dwPlatformId == VER_PLATFORM_WIN32_NT && m_osver.dwMajorVersion == 4 && m_osver.dwMinorVersion == 0 )
			return TRUE;
		return FALSE;
	}
	BOOL IsWinNT4SP6( void ) const
	{
		if ( IsWinNT4() && ServicePack() == 6 )
			return TRUE;
		return FALSE;
	}

	//
	// Windows XP / 2000 / 2003
	//
	BOOL IsWinXp( void ) const
	{
		if ( m_osver.dwPlatformId == VER_PLATFORM_WIN32_NT && m_osver.dwMajorVersion == 5 && m_osver.dwMinorVersion == 1 )
			return TRUE;
		return FALSE;
	}
	BOOL IsWinXpSP2( void ) const
	{
		if ( IsWinXp() && ServicePack() == 2 )
			return TRUE;
		return FALSE;
	}
	BOOL IsWinXpHome( void ) const
	{
		if ( IsWinXp() && m_osver.wSuiteMask & VER_SUITE_PERSONAL )
			return TRUE;
		return FALSE;
	}
	BOOL IsWinXpPro( void ) const
	{
		if ( IsWinXp() && m_osver.wProductType == VER_NT_WORKSTATION && !IsWinXpHome() )
			return TRUE;
		return FALSE;
	}
	BOOL IsWinXpOrLater( void ) const
	{
		if ( m_osver.dwPlatformId == VER_PLATFORM_WIN32_NT && m_osver.dwMajorVersion >= 5 )
			return TRUE;
		return FALSE;
	}

	BOOL IsWin2000( void ) const
	{
		if ( m_osver.dwPlatformId == VER_PLATFORM_WIN32_NT && m_osver.dwMajorVersion == 5 && m_osver.dwMinorVersion == 0 )
			return TRUE;
		return FALSE;
	}

	BOOL IsWin2003( void ) const
	{
		if ( m_osver.dwPlatformId == VER_PLATFORM_WIN32_NT && m_osver.dwMajorVersion == 5 && m_osver.dwMinorVersion == 2 )
			return TRUE;
		return FALSE;
	}

	//
	// Windows Vista / 2008
	//
	BOOL IsVista( void ) const
	{
		if ( m_osver.dwPlatformId == VER_PLATFORM_WIN32_NT && m_osver.dwMajorVersion == 6 && m_osver.dwMinorVersion == 0 && m_osver.wProductType == VER_NT_WORKSTATION )
			return TRUE;
		return FALSE;
	}
	BOOL IsVistaOrLater( void ) const
	{
		if ( m_osver.dwPlatformId == VER_PLATFORM_WIN32_NT && m_osver.dwMajorVersion >= 6 )
			return TRUE;
		return FALSE;
	}

	BOOL IsWin2008( void ) const
	{
		if ( m_osver.dwPlatformId == VER_PLATFORM_WIN32_NT && m_osver.dwMajorVersion == 6 && m_osver.dwMinorVersion == 0 && m_osver.wProductType != VER_NT_WORKSTATION )
			return TRUE;
		return FALSE;
	}

	//
	//	Retrieve the server or workstation
	//
	BOOL IsServerOS( void ) const
	{
		if ( m_osver.wProductType > VER_NT_WORKSTATION )
			return TRUE;
		return FALSE;
	}

	BOOL IsDomainController( void )
	{
		return ( m_osver.wProductType && VER_NT_DOMAIN_CONTROLLER );
	}
};

#endif	// _GREENB_OSVERSION_
