diff --git a/lib/connect.c b/lib/connect.c index 0816af2d4..16ad524df 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -916,19 +916,38 @@ void Curl_sndbufset(curl_socket_t sockfd) int val = CURL_MAX_WRITE_SIZE + 32; int curval = 0; int curlen = sizeof(curval); + DWORD majorVersion = 6; - OSVERSIONINFO osver; static int detectOsState = DETECT_OS_NONE; if(detectOsState == DETECT_OS_NONE) { +#if !defined(VerifyVersionInfo) + OSVERSIONINFO osver; + memset(&osver, 0, sizeof(osver)); osver.dwOSVersionInfoSize = sizeof(osver); + detectOsState = DETECT_OS_PREVISTA; if(GetVersionEx(&osver)) { - if(osver.dwMajorVersion >= 6) + if(osver.dwMajorVersion >= majorVersion) detectOsState = DETECT_OS_VISTA_OR_LATER; } +#else + ULONGLONG majorVersionMask; + OSVERSIONINFOEX osver; + + memset(&osver, 0, sizeof(osver)); + osver.dwOSVersionInfoSize = sizeof(osver); + osver.dwMajorVersion = majorVersion; + majorVersionMask = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL); + + if(VerifyVersionInfo(&osver, VER_MAJORVERSION, majorVersionMask)) + detectOsState = DETECT_OS_VISTA_OR_LATER; + else + detectOsState = DETECT_OS_PREVISTA; +#endif } + if(detectOsState == DETECT_OS_VISTA_OR_LATER) return; @@ -940,7 +959,6 @@ void Curl_sndbufset(curl_socket_t sockfd) } #endif - /* * singleipconnect() * diff --git a/lib/curl_sspi.c b/lib/curl_sspi.c index e747d86b1..5a48e4943 100644 --- a/lib/curl_sspi.c +++ b/lib/curl_sspi.c @@ -68,25 +68,51 @@ PSecurityFunctionTable s_pSecFn = NULL; */ CURLcode Curl_sspi_global_init(void) { - OSVERSIONINFO osver; + bool securityDll = FALSE; INITSECURITYINTERFACE_FN pInitSecurityInterface; /* If security interface is not yet initialized try to do this */ if(!s_hSecDll) { - - /* Find out Windows version */ - memset(&osver, 0, sizeof(osver)); - osver.dwOSVersionInfoSize = sizeof(osver); - if(!GetVersionEx(&osver)) - return CURLE_FAILED_INIT; - /* Security Service Provider Interface (SSPI) functions are located in * security.dll on WinNT 4.0 and in secur32.dll on Win9x. Win2K and XP * have both these DLLs (security.dll forwards calls to secur32.dll) */ + DWORD majorVersion = 4; + DWORD platformId = VER_PLATFORM_WIN32_NT; + +#if !defined(VerifyVersionInfo) + OSVERSIONINFO osver; + + memset(&osver, 0, sizeof(osver)); + osver.dwOSVersionInfoSize = sizeof(osver); + + /* Find out Windows version */ + if(!GetVersionEx(&osver)) + return CURLE_FAILED_INIT; + + /* Verify the major version number == 4 and platform id == WIN_NT */ + if(osver.dwMajorVersion == majorVersion && + osver.dwPlatformId == platformId) + securityDll = TRUE; +#else + ULONGLONG majorVersionMask; + ULONGLONG platformIdMask; + OSVERSIONINFOEX osver; + + memset(&osver, 0, sizeof(osver)); + osver.dwOSVersionInfoSize = sizeof(osver); + osver.dwMajorVersion = majorVersion; + osver.dwPlatformId = platformId; + majorVersionMask = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL); + platformIdMask = VerSetConditionMask(0, VER_PLATFORMID, VER_EQUAL); + + /* Verify the major version number == 4 and platform id == WIN_NT */ + if(VerifyVersionInfo(&osver, VER_MAJORVERSION, majorVersionMask) && + VerifyVersionInfo(&osver, VER_PLATFORMID, platformIdMask)) + securityDll = TRUE; +#endif /* Load SSPI dll into the address space of the calling process */ - if(osver.dwPlatformId == VER_PLATFORM_WIN32_NT - && osver.dwMajorVersion == 4) + if(securityDll) s_hSecDll = LoadLibrary(TEXT("security.dll")); else s_hSecDll = LoadLibrary(TEXT("secur32.dll"));