//+---------------------------------------------------------------------------- // // File: cmplat.cpp // // Module: CMSETUP.LIB // // Synopsis: Implementation of CPlatform class // use it to query the system for all kinds of platform info // OSVersion, machine architecture, etc.... // // Copyright (c) 1998-1999 Microsoft Corporation // // Author: quintinb Created Header 08/19/99 // //+---------------------------------------------------------------------------- #include "cmplat.h" // // Constants // const TCHAR* const c_pszSrvOrWksPath = TEXT("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"); const TCHAR* const c_pszProductType = TEXT("ProductType"); const TCHAR* const c_pszSrvString = TEXT("ServerNT"); const TCHAR* const c_pszEntString = TEXT("LanManNT"); const TCHAR* const c_pszWksString = TEXT("WinNT"); //________________________________________________________________________________ // // Function: CPlatform constructor // // Synopsis: .initializes the class, all the functions are ready to be used // // Arguments: None // // Returns: NONE // // History: a-anasj Created 2/04/1998 // //________________________________________________________________________________ CPlatform::CPlatform() { ZeroMemory(&m_SysInfo, sizeof(m_SysInfo)); GetSystemInfo(&m_SysInfo); // Does not fail! m_OSVer.dwOSVersionInfoSize = sizeof(m_OSVer); if (!GetVersionEx(&m_OSVer)) { m_ClassState = bad; //Something went wrong } else { m_ClassState = good; } } //________________________________________________________________________________ // // Function: IsOS // // Synopsis: // // Arguments: DWORD OS, DWORD buildNum // // Returns: BOOL - TRUE means running on OS specified // // History: Created Header 1/30/98 // //________________________________________________________________________________ BOOL CPlatform::IsOS(DWORD OS, DWORD buildNum) { if (m_OSVer.dwPlatformId != OS) { return FALSE; } if ( (m_OSVer.dwBuildNumber & 0xffff) > buildNum) //Check for higher than developer release { return TRUE; } else { return FALSE; } } //________________________________________________________________________________ // // Function: IsOSExact // // Synopsis: // // Arguments: DWORD OS, DWORD buildNum // // Returns: BOOL - TRUE means running on OS specified // // History: Created Header 1/30/98 // //________________________________________________________________________________ BOOL CPlatform::IsOSExact(DWORD OS, DWORD buildNum) { if (m_OSVer.dwPlatformId != OS) { return FALSE; } if ((m_OSVer.dwBuildNumber & 0xffff) == buildNum) //Check for exact match { return TRUE; } else { return FALSE; } } //________________________________________________________________________________ // // Function: IsX86 // // Synopsis: Determines if the current platform IsX86. // // Arguments: None // // Returns: BOOL - TRUE if the current platform IsX86 // // History: a-anasj Created 2/04/1998 // //________________________________________________________________________________ BOOL CPlatform::IsX86() { if (bad == m_ClassState) { return FALSE; } return (m_SysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL); } //________________________________________________________________________________ // // Function: IsAlpha // // Synopsis: Determines if the current platform IsAlpha. // // Arguments: None // // Returns: BOOL - TRUE if the current platform IsAlpha // // History: a-anasj Created 2/04/1998 // //________________________________________________________________________________ BOOL CPlatform::IsAlpha() { if (bad == m_ClassState) { return FALSE; } return (m_SysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ALPHA); } //________________________________________________________________________________ // // Function: IsIA64 // // Synopsis: Determines if the current platform is an IA64 machine. // // Arguments: None // // Returns: BOOL - TRUE if the current platform is an itanium. // // History: quintinb Created 07/20/2000 // //________________________________________________________________________________ BOOL CPlatform::IsIA64() { if (bad == m_ClassState) { return FALSE; } return ((m_SysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64) || (m_SysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64)); } //________________________________________________________________________________ // // Function: IsWin95Gold // // Synopsis: Determines if the current platform IsWin95. // // Arguments: None // // Returns: BOOL - TRUE if the current platform IsWin95 // // History: quintinb Created 2/20/1998 // //________________________________________________________________________________ BOOL CPlatform::IsWin95Gold() { if (bad == m_ClassState) { return FALSE; } if (IsOSExact(VER_PLATFORM_WIN32_WINDOWS, 950)) { return TRUE; } else { return FALSE; } } //________________________________________________________________________________ // // Function: IsWin95 // // Synopsis: Determines if the current platform IsWin95Gold. // // Arguments: None // // Returns: BOOL - TRUE if the current platform IsWin95Gold // // History: a-anasj Created 2/04/1998 // //________________________________________________________________________________ BOOL CPlatform::IsWin95() { if (bad == m_ClassState) { return FALSE; } if ( (IsOS(VER_PLATFORM_WIN32_WINDOWS, 950)) && (!IsOS(VER_PLATFORM_WIN32_WINDOWS, 1352)) ) { return TRUE; } else { return FALSE; } } //________________________________________________________________________________ // // Function: IsWin98 // // Synopsis: Determines if the current platform IsWin98. // // Arguments: None // // Returns: BOOL - TRUE if the current platform IsWin98 // // History: a-anasj Created 2/04/1998 // //________________________________________________________________________________ BOOL CPlatform::IsWin98() { if (bad == m_ClassState) { return FALSE; } return IsOS(VER_PLATFORM_WIN32_WINDOWS, 1353); } //________________________________________________________________________________ // // Function: IsWin98Sr // // Synopsis: Determines if the current platform is a Service Release of Win98 (not // win98 gold). // // Arguments: None // // Returns: BOOL - TRUE if the current platform is a Sr of win98 // // History: quintinb created 1-8-99 // //________________________________________________________________________________ BOOL CPlatform::IsWin98Sr() { if (bad == m_ClassState) { return FALSE; } // // Win98 gold had 1998 for the build number // return IsOS(VER_PLATFORM_WIN32_WINDOWS, 1998); } //________________________________________________________________________________ // // Function: IsWin98Gold // // Synopsis: Determines if the current platform is Win98 Gold (build Num 1998) // // Arguments: None // // Returns: BOOL - TRUE if the current platform is Gold win98 // // History: quintinb created 1-8-99 // //________________________________________________________________________________ BOOL CPlatform::IsWin98Gold() { if (bad == m_ClassState) { return FALSE; } if ((IsOS(VER_PLATFORM_WIN32_WINDOWS, 1353)) && (!IsOS(VER_PLATFORM_WIN32_WINDOWS, 1998))) { return TRUE; } else { return FALSE; } } //________________________________________________________________________________ // // Function: IsWin9x // // Synopsis: Determines if the current platform IsWin9x. // // Arguments: None // // Returns: BOOL - TRUE if the current platform IsWin9x // // History: a-anasj Created 2/04/1998 // //________________________________________________________________________________ BOOL CPlatform::IsWin9x() { if (bad == m_ClassState) { return FALSE; } return IsOS(VER_PLATFORM_WIN32_WINDOWS, 950-1); } //________________________________________________________________________________ // // Function: IsNT31 // // Synopsis: Determines if the current platform IsNT31. // // Arguments: None // // Returns: BOOL - TRUE if the current platform IsNT31 // // History: a-anasj Created 2/04/1998 // //________________________________________________________________________________ BOOL CPlatform::IsNT31() { if (bad == m_ClassState) { return false; } if ( (IsOS(VER_PLATFORM_WIN32_NT , 0)) && (!IsOS(VER_PLATFORM_WIN32_NT , 1057)) ) { return TRUE; } else { return FALSE; } } //________________________________________________________________________________ // // Function: IsNT351 // // Synopsis: Determines if the current platform IsNT351. // // Arguments: None // // Returns: BOOL - TRUE if the current platform IsNT351 // // History: a-anasj Created 2/04/1998 // //________________________________________________________________________________ BOOL CPlatform::IsNT351() { if (bad == m_ClassState) { return false; } if ( (IsOS(VER_PLATFORM_WIN32_NT , 1056)) && (!IsOS(VER_PLATFORM_WIN32_NT , 1382)) ) { return TRUE; } else { return FALSE; } } //________________________________________________________________________________ // // Function: IsNT4 // // Synopsis: Determines if the current platform IsNT4. // // Arguments: None // // Returns: BOOL - TRUE if the current platform IsNT4 // // History: a-anasj Created 2/04/1998 // //________________________________________________________________________________ BOOL CPlatform::IsNT4() { if (bad == m_ClassState) { return FALSE; } if ( (IsOS(VER_PLATFORM_WIN32_NT , 1380)) && (!IsOS(VER_PLATFORM_WIN32_NT , 1500)) ) //1500 not sure { return TRUE; } else { return FALSE; } } //________________________________________________________________________________ // // Function: IsAtLeastNT5 // // Synopsis: Determines if the current platform at least NT5. // // Arguments: None // // Returns: BOOL - TRUE if the current platform is NT5 or newer // // History: a-anasj Created 2/04/1998 // //________________________________________________________________________________ BOOL CPlatform::IsAtLeastNT5() { if (bad == m_ClassState) { return FALSE; } return IsOS(VER_PLATFORM_WIN32_NT, 1500); } //________________________________________________________________________________ // // Function: IsAtLeastNT51 // // Synopsis: Determines if the current platform at least NT51. // // Arguments: None // // Returns: BOOL - TRUE if the current platform is NT5 or newer // // History: quintinb Created 02/09/2001 // //________________________________________________________________________________ BOOL CPlatform::IsAtLeastNT51() { if (bad == m_ClassState) { return FALSE; } return IsOS(VER_PLATFORM_WIN32_NT, 2200); } //________________________________________________________________________________ // // Function: IsNT5 // // Synopsis: Determines if the current platform is NT5. // // Arguments: None // // Returns: BOOL - TRUE if the current platform is NT5 // // History: a-anasj Created 2/04/1998 // //________________________________________________________________________________ BOOL CPlatform::IsNT5() { if (bad == m_ClassState) { return FALSE; } if ( (IsOS(VER_PLATFORM_WIN32_NT , 1500)) && (!IsOS(VER_PLATFORM_WIN32_NT , 2195))) { return TRUE; } else { return FALSE; } } //________________________________________________________________________________ // // Function: IsNT51 // // Synopsis: Determines if the current platform at least NT51. // // Arguments: None // // Returns: BOOL - TRUE if the current platform is NT51 // // History: quintinb Created 02/09/2001 // //________________________________________________________________________________ BOOL CPlatform::IsNT51() { if (bad == m_ClassState) { return FALSE; } if ((IsOS(VER_PLATFORM_WIN32_NT , 2195)) && (!IsOS(VER_PLATFORM_WIN32_NT , 2600))) // ISSUE quintinb 3/22/01: Update this if we need it. { return TRUE; } else { return FALSE; } } //________________________________________________________________________________ // // Function: IsNT // // Synopsis: Determines if the current platform IsNT. // // Arguments: None // // Returns: BOOL - TRUE if the current platform IsNT // // History: quintinb Created 9/22/1998 // //________________________________________________________________________________ BOOL CPlatform::IsNT() { if (bad == m_ClassState) { return FALSE; } return IsOS(VER_PLATFORM_WIN32_NT, 0); } //________________________________________________________________________________ // // Function: IsNTSrv // // Synopsis: Determines if the current platform IsNT. // // Arguments: None // // Returns: BOOL - TRUE if the current platform IsNT // // History: quintinb Created 9/22/1998 // //________________________________________________________________________________ BOOL CPlatform::IsNTSrv() { HKEY hKey; TCHAR szTemp[MAX_PATH+1]; BOOL bReturn = FALSE; if ((good == m_ClassState) && (IsOS(VER_PLATFORM_WIN32_NT, 0))) { if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE, c_pszSrvOrWksPath, &hKey)) { DWORD dwSize = MAX_PATH; DWORD dwType = REG_SZ; if (ERROR_SUCCESS == RegQueryValueEx(hKey, c_pszProductType, NULL, &dwType, (LPBYTE)szTemp, &dwSize)) { bReturn = ((0 == lstrcmpi(szTemp, c_pszSrvString)) || (0 == lstrcmpi(szTemp, c_pszEntString))); } RegCloseKey(hKey); } } return bReturn; } BOOL CPlatform::IsNTWks() { HKEY hKey; TCHAR szTemp[MAX_PATH+1]; BOOL bReturn = FALSE; if ((good == m_ClassState) && (IsOS(VER_PLATFORM_WIN32_NT, 0))) { if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE, c_pszSrvOrWksPath, &hKey)) { DWORD dwSize = MAX_PATH; DWORD dwType = REG_SZ; if (ERROR_SUCCESS == RegQueryValueEx(hKey, c_pszProductType, NULL, &dwType, (LPBYTE)szTemp, &dwSize)) { bReturn = (0 == lstrcmpi(szTemp, c_pszWksString)); } RegCloseKey(hKey); } } return bReturn; }