195 lines
5.6 KiB
C++
195 lines
5.6 KiB
C++
|
// GetWinVer.cpp Version 1.1
|
||
|
//
|
||
|
// Copyright (C) 2001-2003 Hans Dietrich
|
||
|
//
|
||
|
// 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.
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
//#include "tchar.h"
|
||
|
#include "GetWinVer.h"
|
||
|
|
||
|
// from winbase.h
|
||
|
#ifndef VER_PLATFORM_WIN32s
|
||
|
#define VER_PLATFORM_WIN32s 0
|
||
|
#endif
|
||
|
#ifndef VER_PLATFORM_WIN32_WINDOWS
|
||
|
#define VER_PLATFORM_WIN32_WINDOWS 1
|
||
|
#endif
|
||
|
#ifndef VER_PLATFORM_WIN32_NT
|
||
|
#define VER_PLATFORM_WIN32_NT 2
|
||
|
#endif
|
||
|
#ifndef VER_PLATFORM_WIN32_CE
|
||
|
#define VER_PLATFORM_WIN32_CE 3
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
This table has been assembled from Usenet postings, personal
|
||
|
observations, and reading other people's code. Please feel
|
||
|
free to add to it or correct it.
|
||
|
|
||
|
|
||
|
dwPlatFormID dwMajorVersion dwMinorVersion dwBuildNumber
|
||
|
95 1 4 0 950
|
||
|
95 SP1 1 4 0 >950 && <=1080
|
||
|
95 OSR2 1 4 <10 >1080
|
||
|
98 1 4 10 1998
|
||
|
98 SP1 1 4 10 >1998 && <2183
|
||
|
98 SE 1 4 10 >=2183
|
||
|
ME 1 4 90 3000
|
||
|
|
||
|
NT 3.51 2 3 51
|
||
|
NT 4 2 4 0 1381
|
||
|
2000 2 5 0 2195
|
||
|
XP 2 5 1 2600
|
||
|
2003 Server 2 5 2 3790
|
||
|
VISTA 2 6 0 6000
|
||
|
7 2 6 1 7600
|
||
|
8 2 6 2 9200
|
||
|
8.1 2 6 3 9600
|
||
|
10 2 10 0 10240
|
||
|
11 2 11 0 22000
|
||
|
|
||
|
CE 3
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// GetWinVer
|
||
|
BOOL GetWinVer(LPWSTR pszVersion, int *nVersion, LPWSTR pszMajorMinorBuild)
|
||
|
{
|
||
|
if (!pszVersion || !nVersion || !pszMajorMinorBuild)
|
||
|
return FALSE;
|
||
|
lstrcpy(pszVersion, WUNKNOWNSTR);
|
||
|
*nVersion = WUNKNOWN;
|
||
|
|
||
|
DWORD (WINAPI *RtlGetVersion)(LPOSVERSIONINFOEXW);
|
||
|
OSVERSIONINFOEXW osinfo;
|
||
|
*(FARPROC*)&RtlGetVersion = GetProcAddress(GetModuleHandleW(L"ntdll"), "RtlGetVersion");
|
||
|
if (!RtlGetVersion) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
osinfo.dwOSVersionInfoSize = sizeof(osinfo);
|
||
|
if (RtlGetVersion(&osinfo)) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
DWORD dwPlatformId = osinfo.dwPlatformId;
|
||
|
DWORD dwMajorVersion = osinfo.dwMajorVersion;
|
||
|
DWORD dwMinorVersion = osinfo.dwMinorVersion;
|
||
|
DWORD dwBuildNumber = osinfo.dwBuildNumber & 0xFFFF; // Win 95 needs this
|
||
|
|
||
|
wsprintfW(pszMajorMinorBuild, L"%u.%u.%u", dwMajorVersion, dwMinorVersion, dwBuildNumber);
|
||
|
|
||
|
if ((dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (dwMajorVersion == 4))
|
||
|
{
|
||
|
if ((dwMinorVersion < 10) && (dwBuildNumber == 950))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W95STR);
|
||
|
*nVersion = W95;
|
||
|
}
|
||
|
else if ((dwMinorVersion < 10) &&
|
||
|
((dwBuildNumber > 950) && (dwBuildNumber <= 1080)))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W95SP1STR);
|
||
|
*nVersion = W95SP1;
|
||
|
}
|
||
|
else if ((dwMinorVersion < 10) && (dwBuildNumber > 1080))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W95OSR2STR);
|
||
|
*nVersion = W95OSR2;
|
||
|
}
|
||
|
else if ((dwMinorVersion == 10) && (dwBuildNumber == 1998))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W98STR);
|
||
|
*nVersion = W98;
|
||
|
}
|
||
|
else if ((dwMinorVersion == 10) &&
|
||
|
((dwBuildNumber > 1998) && (dwBuildNumber < 2183)))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W98SP1STR);
|
||
|
*nVersion = W98SP1;
|
||
|
}
|
||
|
else if ((dwMinorVersion == 10) && (dwBuildNumber >= 2183))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W98SESTR);
|
||
|
*nVersion = W98SE;
|
||
|
}
|
||
|
else if (dwMinorVersion == 90)
|
||
|
{
|
||
|
lstrcpy(pszVersion, WMESTR);
|
||
|
*nVersion = WME;
|
||
|
}
|
||
|
}
|
||
|
else if (dwPlatformId == VER_PLATFORM_WIN32_NT)
|
||
|
{
|
||
|
if ((dwMajorVersion == 3) && (dwMinorVersion == 51))
|
||
|
{
|
||
|
lstrcpy(pszVersion, WNT351STR);
|
||
|
*nVersion = WNT351;
|
||
|
}
|
||
|
else if ((dwMajorVersion == 4) && (dwMinorVersion == 0))
|
||
|
{
|
||
|
lstrcpy(pszVersion, WNT4STR);
|
||
|
*nVersion = WNT4;
|
||
|
}
|
||
|
else if ((dwMajorVersion == 5) && (dwMinorVersion == 0))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W2KSTR);
|
||
|
*nVersion = W2K;
|
||
|
}
|
||
|
else if ((dwMajorVersion == 5) && (dwMinorVersion == 1))
|
||
|
{
|
||
|
lstrcpy(pszVersion, WXPSTR);
|
||
|
*nVersion = WXP;
|
||
|
}
|
||
|
else if ((dwMajorVersion == 5) && (dwMinorVersion == 2))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W2003SERVERSTR);
|
||
|
*nVersion = W2003SERVER;
|
||
|
}
|
||
|
else if ((dwMajorVersion == 6) && (dwMinorVersion == 0))
|
||
|
{
|
||
|
lstrcpy(pszVersion, WVSTR);
|
||
|
*nVersion = WV;
|
||
|
}
|
||
|
else if ((dwMajorVersion == 6) && (dwMinorVersion == 1))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W7STR);
|
||
|
*nVersion = W7;
|
||
|
}
|
||
|
else if ((dwMajorVersion == 6) && (dwMinorVersion == 2))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W8STR);
|
||
|
*nVersion = W8;
|
||
|
}
|
||
|
else if ((dwMajorVersion == 6) && (dwMinorVersion == 3))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W81STR);
|
||
|
*nVersion = W81;
|
||
|
}
|
||
|
else if ((dwMajorVersion == 10) && (dwMinorVersion == 0) && (dwBuildNumber < 22000))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W10STR);
|
||
|
*nVersion = W10;
|
||
|
}
|
||
|
else if ((dwMajorVersion == 10) && (dwMinorVersion == 0) && (dwBuildNumber >= 22000))
|
||
|
{
|
||
|
lstrcpy(pszVersion, W11STR);
|
||
|
*nVersion = W11;
|
||
|
}
|
||
|
}
|
||
|
else if (dwPlatformId == VER_PLATFORM_WIN32_CE)
|
||
|
{
|
||
|
lstrcpy(pszVersion, WCESTR);
|
||
|
*nVersion = WCE;
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|