On Friday 06 March 2026 05:28:23 Kirill Makurin wrote: > Pali Rohár <[email protected]> wrote: > > Hello, in past I was looking at GetVersion and GetVersionEx functions > > and I was inspecting how they works. So I think I should have all those > > information for which you are asking. > > > > Microsoft started removing most of documentation for GetVersion and > > GetVersionEx functions, but web archive has copy of it before removal: > > > > https://web.archive.org/web/20041209205313/http://msdn.microsoft.com/library/en-us/sysinfo/base/getversion.asp > > https://web.archive.org/web/20020905235730/http://msdn.microsoft.com/library/en-us/sysinfo/base/getversionex.asp > > > > On internet can be found various dumps of WinSDK documentation, > > like from WIN32.HLP file. For example these: > > > > https://winapi.freetechsecrets.com/win32/WIN32GetVersion.htm > > https://winapi.freetechsecrets.com/win32/WIN32GetVersionEx.htm > > > > https://library.thedatadungeon.com/msdn-2000-04/sysmgmt/hh/sysmgmt/sysinfo_41bi.htm > > https://library.thedatadungeon.com/msdn-2000-04/sysmgmt/hh/sysmgmt/sysinfo_49iw.htm > > > > Also there are some undocumented parts of GetVersion function, specially > > what is filled in reserved bits. I was running different tests in the > > past and here is hopefully the full documentation. I was also checking > > the wine sources in past and it confirms it. > > > > GetVersion returns DWORD with these bits: > > [31:30] - PlatformId XORed with 0b10 > > [29:16] - BuildNumber > > [15:08] - MinorVersion > > [07:00] - MajorVersion > > > > The highest bit [31] is also indicating (when set) if the OS is DOS based. > > It is really nice that it is possible to distinguish NT-based and DOS-based > systems using just DWORD value returned by GetVersion; this means there is no > need for GetVersionEx, at least for my use case. > > Since I only care about Windows NT and Windows 9x, and not Win32s, checking > the high bit to distinguish them will just do. > > > GetVersionEx is returning what is written in MS documentation, just > > compared with GetVersion, on Win32s is GetVersionEx returning the > > Win32s version (1.30), and GetVersion is returning OS version (3.11). > > So there is a difference on Win32s. > > > PlatformId is one of: > > VER_PLATFORM_WIN32s - Win32s > > VER_PLATFORM_WIN32_WINDOWS - Win9x > > VER_PLATFORM_WIN32_NT - WinNT > > (in both GetVersionEx and GetVersion, just be aware of XOR 0b10) > > IMO, it is really annoying that Microsoft decided to remove this information > from documentation; interestingly enough, all three constants are still > present in winnt.h, though no comments to give any context about their usage. > > > There is also VER_PLATFORM_WIN32_CE which indicates Windows CE > > implementation , but Windows CE does not support running PE > > IMAGE_SUBSYSTEM_WINDOWS_GUI and PE IMAGE_SUBSYSTEM_WINDOWS_CUI binaries > > and it also does not have GetVersion function at all. Only GetVersionEx. > > So mostly you can ignore CE. > > Yep. Just like details about Win32s, which I do not intent to touch at all. > > > Therefore if you want to check for all possible OS system variants, the > > GetVersion() function is universal, available on all implementations and > > contains mostly everything what you need. > > From all the information I have so far, it seems like there is no way to > distinguish Windows 95/98/Me from each other. Or maybe bits in high-order > word supply some of extra information? > > - Kirill Makurin
There is. There are only 3 version types: Win32s, Win9x and WinNT. If you want to distinguish Win9x from others (Win32s and WinNT) you just need to check for Win32s and WinNT. In most cases you just need to distinguish between NT and non-NT DOS versions. And for this purpose you can use bit [31] which is documented by MS. And if you want more granularity to distinguish between different DOS-based versions (Win9x and Win32s) you can use documented way via major version (bits [07:00]) where the Win9x has >= 4 value or undocumented version via bits [31:30] where the Win9x has value (VER_PLATFORM_WIN32_WINDOWS ^ 0x2). _______________________________________________ Mingw-w64-public mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
