@@ -135,6 +135,12 @@ static void print_msg(const char *msg);
135135static void adjust_data_dir (void );
136136
137137#if defined(WIN32 )|| defined(__CYGWIN__ )
138+ #if (_MSC_VER >=1800 )
139+ #include <versionhelpers.h>
140+ #else
141+ static bool IsWindowsXPOrGreater (void );
142+ static bool IsWindows7OrGreater (void );
143+ #endif
138144static bool pgwin32_IsInstalled (SC_HANDLE );
139145static char * pgwin32_CommandLine (bool );
140146static void pgwin32_doRegister (void );
@@ -1227,6 +1233,29 @@ do_kill(pgpid_t pid)
12271233
12281234#if defined(WIN32 )|| defined(__CYGWIN__ )
12291235
1236+ #if (_MSC_VER < 1800 )
1237+ static bool
1238+ IsWindowsXPOrGreater (void )
1239+ {
1240+ OSVERSIONINFO osv ;
1241+ osv .dwOSVersionInfoSize = sizeof (osv );
1242+
1243+ /* Windows XP = Version 5.1 */
1244+ return (!GetVersionEx (& osv )|| /* could not get version */
1245+ osv .dwMajorVersion > 5 || (osv .dwMajorVersion == 5 && osv .dwMinorVersion >=1 ));
1246+ }
1247+
1248+ static bool IsWindows7OrGreater (void )
1249+ {
1250+ OSVERSIONINFO osv ;
1251+ osv .dwOSVersionInfoSize = sizeof (osv );
1252+
1253+ /* Windows 7 = Version 6.0 */
1254+ return (!GetVersionEx (& osv )|| /* could not get version */
1255+ osv .dwMajorVersion > 6 || (osv .dwMajorVersion == 6 && osv .dwMinorVersion >=0 ));
1256+ }
1257+ #endif
1258+
12301259static bool
12311260pgwin32_IsInstalled (SC_HANDLE hSCM )
12321261{
@@ -1656,12 +1685,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser
16561685 * IsProcessInJob() is not available on < WinXP, so there is no need
16571686 * to log the error every time in that case
16581687 */
1659- OSVERSIONINFO osv ;
1660-
1661- osv .dwOSVersionInfoSize = sizeof (osv );
1662- if (!GetVersionEx (& osv )|| /* could not get version */
1663- (osv .dwMajorVersion == 5 && osv .dwMinorVersion > 0 )|| /* 5.1=xp, 5.2=2003, etc */
1664- osv .dwMajorVersion > 5 )/* anything newer should have the API */
1688+ if (IsWindowsXPOrGreater ())
16651689
16661690/*
16671691 * Log error if we can't get version, or if we're on WinXP/2003 or
@@ -1693,7 +1717,6 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser
16931717JOBOBJECT_BASIC_LIMIT_INFORMATION basicLimit ;
16941718JOBOBJECT_BASIC_UI_RESTRICTIONS uiRestrictions ;
16951719JOBOBJECT_SECURITY_LIMIT_INFORMATION securityLimit ;
1696- OSVERSIONINFO osv ;
16971720
16981721ZeroMemory (& basicLimit ,sizeof (basicLimit ));
16991722ZeroMemory (& uiRestrictions ,sizeof (uiRestrictions ));
@@ -1709,10 +1732,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, bool as_ser
17091732
17101733if (as_service )
17111734{
1712- osv .dwOSVersionInfoSize = sizeof (osv );
1713- if (!GetVersionEx (& osv )||
1714- osv .dwMajorVersion < 6 ||
1715- (osv .dwMajorVersion == 6 && osv .dwMinorVersion == 0 ))
1735+ if (!IsWindows7OrGreater ())
17161736{
17171737/*
17181738 * On Windows 7 (and presumably later),