diff options
Diffstat (limited to 'libs/GetWindowsVersion/GetWindowsVersion.c')
-rwxr-xr-x | libs/GetWindowsVersion/GetWindowsVersion.c | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/libs/GetWindowsVersion/GetWindowsVersion.c b/libs/GetWindowsVersion/GetWindowsVersion.c new file mode 100755 index 000000000..56fadc67a --- /dev/null +++ b/libs/GetWindowsVersion/GetWindowsVersion.c @@ -0,0 +1,220 @@ +/* + * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab + * Copyright (C) 2006 - INRIA - Allan CORNET + * Copyright (C) 2011 - DIGITEO - Allan CORNET + * + * This file must be used under the terms of the CeCILL. + * This source file is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at + * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt + * + */ + +#include "GetWindowsVersion.h" +/*-----------------------------------------------------------------------------------*/ +typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); +typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); +#define SM_SERVERR2 89 +/*-----------------------------------------------------------------------------------*/ +IMPORT_EXPORT_GETWINDOWSVERSION_DLL int GetWindowsVersion(void) +{ + OSVERSIONINFOEX osvi; + BOOL bOsVersionInfoEx; + + ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + + if ( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) + { + osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); + if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) + { + return OS_ERROR; + } + } + + switch (osvi.dwPlatformId) + { + case VER_PLATFORM_WIN32_NT: + + if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 2) + { + if ( osvi.wProductType == VER_NT_WORKSTATION ) + { +#ifdef _WIN64 + return OS_WIN32_WINDOWS_EIGHT_64; +#else + if (IsWow64()) + { + return OS_WIN32_WINDOWS_EIGHT_64; + } + else + { + return OS_WIN32_WINDOWS_EIGHT; + } +#endif + } + else + { +#ifdef _WIN64 + return OS_WIN32_WINDOWS_EIGHT_SERVER_64; +#else + if (IsWow64()) + { + return OS_WIN32_WINDOWS_EIGHT_SERVER_64; + } + else + { + return OS_WIN32_WINDOWS_EIGHT_SERVER; + } +#endif + } + } + + if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1 ) + { + if ( osvi.wProductType == VER_NT_WORKSTATION ) + { +#ifdef _WIN64 + return OS_WIN32_WINDOWS_SEVEN_64; +#else + if (IsWow64()) + { + return OS_WIN32_WINDOWS_SEVEN_64; + } + else + { + return OS_WIN32_WINDOWS_SEVEN; + } +#endif + } + else + { +#ifdef _WIN64 + return OS_WIN32_WINDOWS_SEVEN_SERVER_64; +#else + if (IsWow64()) + { + return OS_WIN32_WINDOWS_SEVEN_SERVER_64; + } + else + { + return OS_WIN32_WINDOWS_SEVEN_SERVER; + } +#endif + } + } + + if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 ) + { + if ( osvi.wProductType == VER_NT_WORKSTATION ) + { +#ifdef _WIN64 + return OS_WIN32_WINDOWS_VISTA_64; +#else + if (IsWow64()) + { + return OS_WIN32_WINDOWS_VISTA_64; + } + else + { + return OS_WIN32_WINDOWS_VISTA; + } +#endif + } + else + { +#ifdef _WIN64 + return OS_WIN32_WINDOWS_SERVER_2008_64; +#else + if (IsWow64()) + { + return OS_WIN32_WINDOWS_SERVER_2008_64; + } + else + { + return OS_WIN32_WINDOWS_SERVER_2008; + } +#endif + } + } + + if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) + { + SYSTEM_INFO si; + PGNSI pGNSI; + pGNSI = (PGNSI) GetProcAddress(GetModuleHandle("kernel32.dll"), "GetNativeSystemInfo"); + if (NULL != pGNSI) + { + pGNSI(&si); + } + + if ( GetSystemMetrics(SM_SERVERR2) ) + { + return OS_WIN32_WINDOWS_SERVER_2003_R2; + } + else if ( osvi.wProductType == VER_NT_WORKSTATION && si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) + { + return OS_WIN32_WINDOWS_XP_64; + } + else + { + return OS_WIN32_WINDOWS_SERVER_2003; + } + } + + if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) + { + return OS_WIN32_WINDOWS_XP; + } + if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) + { + return OS_WIN32_WINDOWS_2000; + } + if ( osvi.dwMajorVersion == 4 ) + { + return OS_WIN32_WINDOWS_NT_4_0; + } + if ( osvi.dwMajorVersion == 3 && osvi.dwMinorVersion == 51 ) + { + return OS_WIN32_WINDOWS_NT_3_51; + } + break; + + case VER_PLATFORM_WIN32_WINDOWS: + if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) + { + return OS_WIN32_WINDOWS_95; + } + if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) + { + return OS_WIN32_WINDOWS_98; + } + if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) + { + return OS_WIN32_WINDOWS_Me; + } + break; + } + return OS_ERROR; +} +/*-----------------------------------------------------------------------------------*/ +BOOL IsWow64(void) +{ + BOOL bIsWow64 = FALSE; + LPFN_ISWOW64PROCESS fnIsWow64Process; + + fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle("kernel32"), "IsWow64Process"); + + if (NULL != fnIsWow64Process) + { + if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64)) + { + + } + } + return bIsWow64; +} +/*-----------------------------------------------------------------------------------*/ + |