123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- // 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;
- }
|