00001 #include "GetWindowsVersion.h"
00002
00003 typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
00004 #define SM_SERVERR2 89
00005
00006 IMPORT_EXPORT_GETWINDOWSVERSION_DLL int GetWindowsVersion(void)
00007 {
00008 OSVERSIONINFOEX osvi;
00009 BOOL bOsVersionInfoEx;
00010
00011 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
00012 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
00013
00014 if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
00015 {
00016 osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
00017 if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) return OS_ERROR;
00018 }
00019
00020 switch (osvi.dwPlatformId)
00021 {
00022 case VER_PLATFORM_WIN32_NT:
00023 if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 )
00024 {
00025 if( osvi.wProductType == VER_NT_WORKSTATION ) return OS_WIN32_WINDOWS_VISTA;
00026 else return OS_WIN32_WINDOWS_LONGHORN;
00027 }
00028
00029 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
00030 {
00031 SYSTEM_INFO si;
00032 PGNSI pGNSI;
00033 pGNSI = (PGNSI) GetProcAddress(GetModuleHandle("kernel32.dll"),"GetNativeSystemInfo");
00034 if(NULL != pGNSI) pGNSI(&si);
00035
00036 if( GetSystemMetrics(SM_SERVERR2) ) return OS_WIN32_WINDOWS_SERVER_2003_R2;
00037 else
00038 if( osvi.wProductType == VER_NT_WORKSTATION && si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) return OS_WIN32_WINDOWS_XP_64;
00039 else return OS_WIN32_WINDOWS_SERVER_2003;
00040 }
00041
00042 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) return OS_WIN32_WINDOWS_XP;
00043 if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) return OS_WIN32_WINDOWS_2000;
00044 if ( osvi.dwMajorVersion == 4 ) return OS_WIN32_WINDOWS_NT_4_0;
00045 if ( osvi.dwMajorVersion == 3 && osvi.dwMinorVersion == 51 ) return OS_WIN32_WINDOWS_NT_3_51;
00046 break;
00047
00048 case VER_PLATFORM_WIN32_WINDOWS:
00049 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) return OS_WIN32_WINDOWS_95;
00050 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) return OS_WIN32_WINDOWS_98;
00051 if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) return OS_WIN32_WINDOWS_Me;
00052 break;
00053 }
00054 return OS_ERROR;
00055 }
00056