307 lines
9.6 KiB
C++
307 lines
9.6 KiB
C++
//---------------------------------------------------------------------------
|
|
// Copyright (C) 1998, Interscope Ltd. All rights reserved.
|
|
// Reproduction or distribution of this program, or any portion of it,
|
|
// is permitted only if this header is kept as it is.
|
|
// For more information, contact:
|
|
//
|
|
// Interscope Ltd., 5 Culturii St., 5th Floor, 4800 Baia Mare, RO
|
|
// Phone/Fax: +40-62-215023
|
|
// E-mail: office@interscope.ro
|
|
//
|
|
// $Author: Levente Farkas $
|
|
// $Date: 5/12/98 11:50p $
|
|
// $Modtime: 4/30/98 8:22a $
|
|
// $Revision: 23 $
|
|
// $Archive: /Interscope/Thebe/InstallMaster/OSVersion.cpp $
|
|
// $Workfile: OSVersion.cpp $
|
|
//---------------------------------------------------------------
|
|
|
|
// 4 more details about API calls in this module, see
|
|
// Knowledge Base Atricle Q113998 and
|
|
// Knowledge Base Atricle Q114470 on
|
|
// Microsoft Development Library (October 1995)
|
|
|
|
//Ads - This is very out of date!
|
|
// Rewrote the O/S detection in the constructor 15/3/2002
|
|
|
|
#include "stdafx.h"
|
|
|
|
#pragma comment(lib, "version.lib")
|
|
|
|
|
|
//--- Some types and consts -----------------------------------
|
|
|
|
#define WNNC_NET_MULTINET 0x8000
|
|
#define WNNC_SUBNET_WINWORKGROUP 0x0004
|
|
#define WNNC_NET_TYPE 0x0002
|
|
|
|
typedef WORD (WINAPI *NETCAPFUNC)(int);
|
|
|
|
//-------------------------------------------------------------
|
|
// Task : Constructs and OS version class and extracts all the
|
|
// version information necessary
|
|
//-------------------------------------------------------------
|
|
COSVersion::COSVersion():
|
|
m_nOSType(OS_UNKNOWN),
|
|
m_nWinType(WIN_UNKNOWN),
|
|
m_dwVersion(GetVersion())
|
|
{
|
|
#if defined(__WIN32__) || defined(_WIN32) // 32-bit platform
|
|
|
|
osvi.dwOSVersionInfoSize = sizeof(osvi);
|
|
GetVersionEx(&osvi);
|
|
|
|
//Determine which versions of the O/S we are running
|
|
if (osvi.dwPlatformId == VER_PLATFORM_WIN32s) //Win32s on windows 3.1
|
|
{
|
|
m_nWinType = WIN_32S;
|
|
|
|
// Determine if Win 3.X or WFW
|
|
if(IsWindows4Workgroups(METHOD_FILEVERSION))
|
|
m_nOSType = OS_WFW;
|
|
else if(IsWindows4Workgroups(METHOD_MULTINET))
|
|
m_nOSType = OS_WFW;
|
|
else
|
|
m_nOSType = OS_WIN3X;
|
|
}
|
|
else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) //Win 95, 98 or ME
|
|
{
|
|
m_nWinType = WIN_32C;
|
|
|
|
// Determine if Win95 or Win98 or WinMe
|
|
if(osvi.dwMinorVersion == 0)
|
|
m_nOSType = OS_WIN95;
|
|
else if (osvi.dwMinorVersion == 10)
|
|
m_nOSType = OS_WIN98;
|
|
else if (osvi.dwMinorVersion == 90)
|
|
m_nOSType = OS_WINME;
|
|
else
|
|
m_nOSType = OS_UNKNOWN;
|
|
}
|
|
else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) //Win NT 3.51, 4.0, 2000, XP or .Net Server
|
|
{
|
|
m_nWinType = WIN_32;
|
|
|
|
//Determine which version
|
|
if (osvi.dwMajorVersion == 3)
|
|
{
|
|
m_nOSType = OS_WINNT351;
|
|
}
|
|
else if (osvi.dwMajorVersion == 4)
|
|
{
|
|
m_nOSType = OS_WINNT40;
|
|
}
|
|
if (osvi.dwMajorVersion == 5)
|
|
{
|
|
if (osvi.dwMinorVersion == 0)
|
|
{
|
|
m_nOSType = OS_WIN2000;
|
|
}
|
|
else
|
|
{
|
|
m_nOSType = OS_WINXP | OS_WINNET;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_nOSType = OS_WINNT; //Future proof
|
|
}
|
|
}
|
|
/*
|
|
else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_CE) //Windows CE
|
|
{
|
|
m_nOSType = OS_WINCE;
|
|
}
|
|
*/
|
|
|
|
/* Original code
|
|
// Test 4 NT/NTS/NTAS by the highest bit of the version
|
|
if(m_dwVersion & 0x80000000)
|
|
{
|
|
// This is not NT
|
|
// Check major version number 2 distinguish between
|
|
// WIN32s (Win 3.X) and WIN32c (Win 95)
|
|
if(LOBYTE(LOWORD(m_dwVersion)) <= 3)
|
|
{
|
|
m_nWinType =WIN_32S;
|
|
|
|
// Determine if Win 3.X or WFW
|
|
if(IsWindows4Workgroups(METHOD_FILEVERSION))
|
|
m_nOSType =OS_WFW;
|
|
else if(IsWindows4Workgroups(METHOD_MULTINET))
|
|
m_nOSType =OS_WFW;
|
|
else
|
|
m_nOSType =OS_WIN3X;
|
|
}
|
|
else
|
|
{
|
|
m_nWinType =WIN_32C;
|
|
|
|
// Determine if Win95 or Win98 or WinMe
|
|
// Note: We consider Win98 from beta 2 up (4.10.1650)
|
|
ASSERT(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
|
|
if(osvi.dwMinorVersion == 0)
|
|
m_nOSType =OS_WIN95;
|
|
else if (osvi.dwMinorVersion == 10)
|
|
m_nOSType =OS_WIN98;
|
|
else if (osvi.dwMinorVersion == 90)
|
|
m_nOSType =OS_WINME;
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Must be NTWS, NTS or NTAS
|
|
// Check the registry 2 distinguish between them
|
|
HKEY hKey;
|
|
BYTE szValue[128];
|
|
DWORD dwSize =sizeof(szValue);
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"),
|
|
0,KEY_READ,&hKey);
|
|
RegQueryValueEx(hKey,_T("ProductType"),0,NULL,szValue,&dwSize);
|
|
RegCloseKey(hKey);
|
|
if(!STRICMP((TCHAR *)&szValue[0],_T("WinNT")))
|
|
// WinNT (Windows NT Workstation)
|
|
m_nOSType =OS_WINNTWS;
|
|
else if(!STRICMP((TCHAR *)&szValue[0],_T("ServerNT")))
|
|
// ServerNT (Windows NT Server)
|
|
m_nOSType =OS_WINNTS;
|
|
else
|
|
// LanmanNT (Windows NT Advanced Server)
|
|
m_nOSType =OS_WINNTAS;
|
|
|
|
m_nWinType =WIN_32;
|
|
}
|
|
*/
|
|
|
|
#else // 16-bit platform
|
|
|
|
// For 16-bit code, use GetWinFlags 2 find out if running on the
|
|
// Windows on Windows layer of NT/NTAS
|
|
if(GetWinFlags() & 0x4000)
|
|
m_nOSType =OS_WINNTWS;
|
|
else
|
|
{
|
|
// Check version number 2 distinguish between Win 3.X and Win 95
|
|
if((LOBYTE(LOWORD(dwVersion)) > 3) ||
|
|
(HIBYTE(LOWORD(dwVersion)) > 50))
|
|
// Windows 95
|
|
m_nOSType =OS_WIN95;
|
|
else
|
|
{
|
|
// Determine if Win 3.X or WFW
|
|
if(IsWindows4Workgroups(MEHOD_FILEVERSION))
|
|
m_nOSType =OS_WFW;
|
|
else if(IsWindows4Workgroups(METHOD_MULTINET))
|
|
m_nOSType =OS_WFW;
|
|
else
|
|
m_nOSType =OS_WIN3X;
|
|
}
|
|
}
|
|
m_nWinType =WIN_16;
|
|
|
|
#endif
|
|
}
|
|
|
|
//-------------------------------------------------------------
|
|
// Pre : Check method
|
|
// Task : Checks if running on Windows 4 Workgroups
|
|
//-------------------------------------------------------------
|
|
BOOL COSVersion::IsWindows4Workgroups(unsigned short usMethod) {
|
|
WORD wNetType;
|
|
DWORD dwVerSize, dwVerHandle;
|
|
HANDLE hMem;
|
|
VS_VERSION FAR *lpVerInfo;
|
|
BOOL bWfW =FALSE;
|
|
|
|
if(usMethod == METHOD_MULTINET)
|
|
{
|
|
// Use the method that checks 4 multinet driver
|
|
HINSTANCE hLib =LoadLibrary((LPTSTR)"USER.EXE");
|
|
if((WORD)hLib >= (WORD)HINSTANCE_ERROR)
|
|
{
|
|
// Check if library loaded OK
|
|
//NETCAPFUNC lpWNetGetCaps =(NETCAPFUNC)GetProcAddress(hLib,_T("WNetGetCaps"));
|
|
NETCAPFUNC lpWNetGetCaps =(NETCAPFUNC)GetProcAddress(hLib,"WNetGetCaps");
|
|
if(lpWNetGetCaps != NULL)
|
|
{
|
|
wNetType =(*lpWNetGetCaps)(WNNC_NET_TYPE);
|
|
if((wNetType & WNNC_NET_MULTINET) &&
|
|
(LOBYTE(wNetType) & WNNC_SUBNET_WINWORKGROUP))
|
|
// Yes, it is Windows 4 Workgroups
|
|
bWfW =TRUE;
|
|
}
|
|
|
|
if(hLib)
|
|
FreeLibrary(hLib);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Use the method that checks the fileversion of USER.EXE
|
|
// Allocate memory 4 the file info struct
|
|
dwVerSize =GetFileVersionInfoSize(_T("USER.EXE"),&dwVerHandle);
|
|
hMem =GlobalAlloc(GMEM_MOVEABLE,dwVerSize);
|
|
if(hMem != NULL)
|
|
{
|
|
lpVerInfo =(VS_VERSION FAR *)GlobalLock(hMem);
|
|
// Get the file version
|
|
// in Win32, the dwVerHandle is zero, ignored
|
|
if(GetFileVersionInfo(_T("USER.EXE"),dwVerHandle,dwVerSize,lpVerInfo))
|
|
if((HIWORD(lpVerInfo->vffInfo.dwProductVersionMS) == 3) &&
|
|
(LOWORD(lpVerInfo->vffInfo.dwProductVersionMS) == 11))
|
|
// Yes, it is Windows 4 Workgroups
|
|
bWfW =TRUE;
|
|
GlobalUnlock(hMem);
|
|
GlobalFree(hMem);
|
|
}
|
|
}
|
|
|
|
return bWfW;
|
|
}
|
|
|
|
//-------------------------------------------------------------
|
|
// Task : Get OS major version number
|
|
//-------------------------------------------------------------
|
|
DWORD COSVersion::GetMajorVersion() const
|
|
{
|
|
#if defined(__WIN32__) || defined(_WIN32)
|
|
return osvi.dwMajorVersion;
|
|
#else
|
|
return (DWORD)(LOBYTE(LOWORD(dwVersion)));
|
|
#endif
|
|
}
|
|
|
|
//-------------------------------------------------------------
|
|
// Task : Get OS minor version number
|
|
//-------------------------------------------------------------
|
|
DWORD COSVersion::GetMinorVersion() const
|
|
{
|
|
#if defined(__WIN32__) || defined(_WIN32)
|
|
return osvi.dwMinorVersion;
|
|
#else
|
|
return (DWORD)(HIBYTE(LOWORD(dwVersion)));
|
|
#endif
|
|
}
|
|
|
|
#if defined(__WIN32__) || defined(_WIN32)
|
|
//-------------------------------------------------------------
|
|
// Task : Get the build number of the OS
|
|
//-------------------------------------------------------------
|
|
DWORD COSVersion::GetBuildNumber() const
|
|
{
|
|
return (m_nOSType & OS_WINNT) ? osvi.dwBuildNumber : LOWORD(osvi.dwBuildNumber);
|
|
}
|
|
#endif
|
|
|
|
#if defined(__WIN32__) || defined(_WIN32)
|
|
//-------------------------------------------------------------
|
|
// Task : Get the special version data (string got from GetVersionEX)
|
|
//-------------------------------------------------------------
|
|
LPCTSTR COSVersion::GetSpecialVersion() const
|
|
{
|
|
return osvi.szCSDVersion;
|
|
}
|
|
#endif
|
|
|