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