summaryrefslogtreecommitdiff
path: root/libs/GetWindowsVersion/GetWindowsVersion.c
diff options
context:
space:
mode:
Diffstat (limited to 'libs/GetWindowsVersion/GetWindowsVersion.c')
-rwxr-xr-xlibs/GetWindowsVersion/GetWindowsVersion.c220
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;
+}
+/*-----------------------------------------------------------------------------------*/
+