#include <Poco/Timestamp.h>
#include <windows.h>
#include <tchar.h>
-#include <mbstring.h>
#include "TFile.h"
#include "UnicodeString.h"
#include "DirItem.h"
#include "unicoder.h"
#include "paths.h"
+#include "Win_VersionHelper.h"
using Poco::DirectoryIterator;
using Poco::Timestamp;
WIN32_FIND_DATA ff;
HANDLE h;
- OSVERSIONINFO vi;
- vi.dwOSVersionInfoSize = sizeof(vi);
- GetVersionEx(&vi);
-
- if (vi.dwMajorVersion * 10 + vi.dwMinorVersion >= 61)
+ if (IsWin7_OrGreater()) // (also 'Windows Server 2008 R2' and greater) for FIND_FIRST_EX_LARGE_FETCH
h = FindFirstFileEx(TFile(sPattern).wpath().c_str(), FindExInfoBasic, &ff, FindExSearchNameMatch, NULL, FIND_FIRST_EX_LARGE_FETCH);
else
h = FindFirstFile(TFile(sPattern).wpath().c_str(), &ff);
<ClInclude Include="Common\VersionInfo.h" />\r
<ClInclude Include="VSSHelper.h" />\r
<ClInclude Include="VssPromptDlg.h" />\r
+ <ClInclude Include="Win_VersionHelper.h" />\r
<ClInclude Include="WMGotoDlg.h" />\r
<ClInclude Include="diffutils\lib\cmpbuf.h" />\r
<ClInclude Include="diffutils\config.h" />\r
<ClInclude Include="..\Externals\gtest\include\gtest\gtest.h">\r
<Filter>MergeTest</Filter>\r
</ClInclude>\r
+ <ClInclude Include="Win_VersionHelper.h">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
</ItemGroup>\r
<ItemGroup>\r
<None Include="res\binarydiff.ico">\r
--- /dev/null
+/**
+ * @file Win_VersionHelper.h
+ *
+ * @brief Defines quick-and-dirty runtime Windows version checking.
+
+ * All we need in WinMerge is `IsWin7_OrGreater()`
+ * But other possibilities (and slightly different implementation) can be seen in ...
+ * 'C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\um\VersionHelpers.h'
+ *
+ */
+
+#pragma once
+
+#include <windows.h>
+
+inline bool
+IsWinVer_OrGreater(WORD wVersion, WORD wServicePack = 0)
+{
+ DWORDLONG dwlConditionMask = 0;
+ VER_SET_CONDITION( dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL );
+ VER_SET_CONDITION( dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL );
+ VER_SET_CONDITION( dwlConditionMask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL );
+
+ OSVERSIONINFOEXW osvi;
+ ::ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
+ osvi.dwMajorVersion = HIBYTE(wVersion);
+ osvi.dwMinorVersion = LOBYTE(wVersion);
+ osvi.wServicePackMajor = wServicePack;
+
+ return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE;
+}
+
+
+inline bool
+IsWin7_OrGreater()
+{
+ return IsWinVer_OrGreater( _WIN32_WINNT_WIN7 );
+}