Reputation: 283
How I can check in C++ if Windows version installed on computer is Windows Vista and higher (Windows 7)?
Upvotes: 28
Views: 37224
Reputation: 39
I know this is an old thread, but if somebody reads this today, there is an undocumented (but reliable) way to get the version number in Windows without calling GetVersionEx. It’s based on a data structure called KUSER_SHARED_DATA that is mapped to every process to the same virtual address (0x7FFE0000). The Windows version numbers are part of this shared structure in the same offsets. Here is an alternative way to showing the Windows version numbers:
auto userData = (BYTE*)0x7FFE0000;
printf("Version: %d.%d.%d\n",
*(ULONG*)(userData + 0x26c), // major version offset
*(ULONG*)(userData + 0x270), // minor version offset
*(ULONG*)(userData + 0x260)); // build number offset
Upvotes: 1
Reputation: 41057
All the answers in this thread point you to using GetVersion
or GetVersionEx
for this test, which is incorrect. It seems to work, but it is risky. The primary source of appcompat problems for Windows OS upgrades comes from poorly written tests based on GetVersion
results with bad assumptions or buggy comparisons.
The correct way to do this test is to use VerifyVersionInfo
, not GetVersion
or GetVersionEx
.
If you are using the VS 2013 compiler toolset and the Windows 8.1 SDK, you can use the VersionHelpers.h
and just call IsWindowsVistaOrGreater
.
If you are using the VS 2013
v120_xp
platform toolset to target Windows XP, you are actually using the Windows 7.1A SDK, so you need to useVeriyVersionInfo
directly.
Otherwise, use:
bool IsWindowsVistaOrGreater()
{
OSVERSIONINFOEXW osvi = {};
osvi.dwOSVersionInfoSize = sizeof(osvi);
DWORDLONG const dwlConditionMask = VerSetConditionMask(
VerSetConditionMask(
VerSetConditionMask(
0, VER_MAJORVERSION, VER_GREATER_EQUAL),
VER_MINORVERSION, VER_GREATER_EQUAL),
VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL);
osvi.dwMajorVersion = HIBYTE(_WIN32_WINNT_VISTA);
osvi.dwMinorVersion = LOBYTE(_WIN32_WINNT_VISTA);
osvi.wServicePackMajor = 0;
return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
}
This code will work on Windows 2000 or later and give you a robust result. If you really needed this test to run on Windows 98 or Windows ME -and- you are using a compiler toolset old enough to actually run on that platform, you'd do the same test but with explicit rather than implicit linking. What's in a version number?
Furthermore, using GetVersion
or GetVersionEx
will by default get the wrong version on Windows 8.1 and Windows 10. See Manifest Madness.
Note that with Windows 10
VerifyVersionInfo
is also subject to the same manifest-based behavior (i.e. without the GUID element for Windows 10, VVI acts as if the OS version number is 6.2 rather than 10.0. That said, most real-world tests likeIsWindowsVistaOrGreater
,IsWindows7OrGreater
,IsWindows7SP1OrGreater
,IsWindows8OrGreater
are all going to work just fine even without the manifest. It's only if you are usingIsWindows8Point1OrGreater
orIsWindows10OrGreater
that the manifest-based behavior even matters.
See also this stack overflow thread.
Upvotes: 30
Reputation: 137108
This Microsoft support page gives you details for older versions.
To determine the operating system that is running on a given system, the following data is needed:
95 98 ME NT 4 2000 XP PlatformID 1 1 1 2 2 2 Major version 4 4 4 4 5 5 Minor version 0 10 90 0 0 1
You could implement the code and run it on a Vista and Windows-7 machine to check the values returned.
To get the operating system version information make the following call:
System::OperatingSystem *osInfo = System::Environment::OSVersion;
Upvotes: 4
Reputation: 1034
In Visual Studio 2013 or higher, you can also use the new Version Helper functions.
There are methods for many different Windows versions. Example:
#include <VersionHelpers.h>
if (!IsWindowsVistaOrGreater())
{
MessageBox(NULL, "You need at least Windows Vista", "Version Not Supported", MB_OK);
}
More information here
Upvotes: 13
Reputation: 305
You could use the GetVersion() or GetVersionEx() function in the kernel32.dll. This two functions are only available on Windows 2000 or later.
To read more about this look at http://msdn.microsoft.com/en-us/library/ms724451%28VS.85%29.aspx.
Upvotes: 1
Reputation: 57764
Similar to other tests for checking the version of Windows NT:
OSVERSIONINFO vi;
memset (&vi, 0, sizeof vi);
vi .dwOSVersionInfoSize = sizeof vi;
GetVersionEx (&vi);
if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT && vi.dwMajorVersion >= 6)
Upvotes: 18
Reputation: 421968
Use GetVersionEx API function defined in kernel32.dll
:
bool IsWindowsVistaOrHigher() {
OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osvi);
return osvi.dwMajorVersion >= 6;
}
Upvotes: 20