351 lines
14 KiB
C++

/*
** Command & Conquer Generals Zero Hour(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/***********************************************************************************************
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
***********************************************************************************************
* *
* Project Name : Command & Conquer *
* *
* $Archive:: /Renegade Setup/Autorun/WinFix.CPP $*
* *
* $Author:: Maria_l $*
* *
* $Modtime:: 11/15/01 10:44a $*
* *
* $Revision:: 6 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* Make_Identifier -- Creates a temporary string identifer. *
* WindowsVersionInfo::WindowsVersionInfo -- Windows Version Info constructor. *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#define STRICT
#include <windows.h>
#include <windowsx.h>
#pragma hdrstop
//#include <commctrl.h>
//#include <winuser.h>
#include <assert.h>
#include <stdio.h>
#include "winfix.h"
#include "wnd_file.h"
/***************************************************************************
** Windows Version Info global object.
*/
WindowsVersionInfo WinVersion;
/***********************************************************************************************
* WindowsVersionInfo::WindowsVersionInfo -- Windows Version Info constructor. *
* *
* This routine will examine the system to determine the OS, version, and patch level of *
* the current OS. *
* *
* INPUT: none *
* *
* OUTPUT: none *
* *
* WARNINGS: Don't try and use this class until after WinMain, because it won't be *
* initialized until all the global objects have been constructed. *
* *
* HISTORY: *
* 04/09/98 jdl : Created. *
*=============================================================================================*/
WindowsVersionInfo::WindowsVersionInfo(void) :
WindowsVersion(0),
MajorVersionNumber(0),
MinorVersionNumber(0),
RunningOSR2(0),
BuildNumber(0),
IsWin9x(false),
IsWin95(false),
IsWin98(false),
IsWin2000(false),
IsWinNT(false),
IsWinXP(false)
{
OSVERSIONINFO version_info;
VersionName[0] = '\0';
AdditionalInfo[0] = '\0';
//--------------------------------------------------------------------------
// Start recording messages.
//--------------------------------------------------------------------------
Delete_Msg_File();
Msg( __LINE__, __FILE__, "----------------------------------------------", NULL );
Msg( __LINE__, __FILE__, "------------------ Setup -----------------", NULL );
Msg( __LINE__, __FILE__, "----------------------------------------------", NULL );
//--------------------------------------------------------------------------
// Get the version info from the OS.
//
// typedef struct _OSVERSIONINFO{
// DWORD dwOSVersionInfoSize;
// DWORD dwMajorVersion;
// DWORD dwMinorVersion;
// DWORD dwBuildNumber;
// DWORD dwPlatformId;
// TCHAR szCSDVersion[ 128 ];
// } OSVERSIONINFO;
//
// typedef struct _OSVERSIONINFOEX {
// DWORD dwOSVersionInfoSize;
// DWORD dwMajorVersion;
// DWORD dwMinorVersion;
// DWORD dwBuildNumber;
// DWORD dwPlatformId;
// TCHAR szCSDVersion[ 128 ];
// WORD wServicePackMajor;
// WORD wServicePackMinor;
// WORD wSuiteMask;
// BYTE wProductType;
// BYTE wReserved;
// } OSVERSIONINFOEX, *POSVERSIONINFOEX, *LPOSVERSIONINFOEX;
//--------------------------------------------------------------------------
ZeroMemory( &version_info, sizeof( version_info ));
version_info.dwOSVersionInfoSize = sizeof( version_info );
int result = GetVersionEx( &version_info );
assert( result != 0 );
//--------------------------------------------------------------------------
// Save the major/minor version numbers
//--------------------------------------------------------------------------
MajorVersionNumber = (int)version_info.dwMajorVersion;
MinorVersionNumber = (int)version_info.dwMinorVersion;
WindowsVersion = ( MajorVersionNumber * 100 ) + MinorVersionNumber;
//--------------------------------------------------------------------------
// Save the build number
//--------------------------------------------------------------------------
BuildNumber = (int)version_info.dwBuildNumber;
//--------------------------------------------------------------------------
// Check for Win9x
//--------------------------------------------------------------------------
if ( version_info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) {
IsWin9x = true;
if ( MajorVersionNumber == 4 && MinorVersionNumber == 0 ) {
IsWin95 = true;
}
if (( MajorVersionNumber > 4 ) || (( MajorVersionNumber == 4 ) && ( MinorVersionNumber > 0 ))) {
IsWin98 = true;
}
if ( LOWORD( version_info.dwPlatformId ) > 1000 ) {
RunningOSR2 = TRUE;
}
}
//--------------------------------------------------------------------------
// Check for WinNT
//--------------------------------------------------------------------------
if ( version_info.dwPlatformId == VER_PLATFORM_WIN32_NT ) {
IsWinNT = true;
if (( MajorVersionNumber >= 5 ) && ( MinorVersionNumber >= 1 )) {
IsWinXP = true;
// if ( version_info.wSuiteMask == VER_SUITE_PERSONAL ) {
// }
} else if (( MajorVersionNumber == 5 ) && ( MinorVersionNumber == 0 )) {
IsWin2000 = true;
}
// if( bOsVersionInfoEx )
// {
// if ( osvi.wProductType == VER_NT_WORKSTATION )
// printf ( "Professional " );
//
// if ( osvi.wProductType == VER_NT_SERVER )
// printf ( "Server " );
// } else {
#if( _DEBUG )
HKEY hKey;
char szProductType[80];
DWORD dwBufLen;
RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\ProductOptions", 0, KEY_QUERY_VALUE, &hKey );
RegQueryValueEx( hKey, "ProductType", NULL, NULL, (LPBYTE) szProductType, &dwBufLen);
RegCloseKey( hKey );
if ( lstrcmpi( "WINNT", szProductType) == 0 )
Msg( __LINE__, __FILE__, "WinNT Workstation." );
if ( lstrcmpi( "SERVERNT", szProductType) == 0 )
Msg( __LINE__, __FILE__, "WinNT Server." );
#endif
// }
}
#ifdef DEV_VERSION
//--------------------------------------------------------------------------
// For developmental versions, just use the major & minor version #'s
//--------------------------------------------------------------------------
sprintf( VersionName, "%x.%x", MajorVersionNumber, MinorVersionNumber );
#else
//--------------------------------------------------------------------------
// For final versions, trim 0's off the minor version
//--------------------------------------------------------------------------
unsigned short adjusted_minor;
int i;
adjusted_minor = MinorVersionNumber;
for (i = 0; i < 4; i++) {
if ((adjusted_minor & 0x000f) != 0) {
break;
}
adjusted_minor >>= 4;
}
sprintf( VersionName, "%x.%x", MajorVersionNumber, adjusted_minor );
#endif
//--------------------------------------------------------------------------
// Save off the additional version information string
// (used to indicated additional info or patch level, i.e. for NT 4.0 SP3
// it would contain the string 'Service Pack 3')
//--------------------------------------------------------------------------
strncpy( AdditionalInfo, version_info.szCSDVersion, sizeof(AdditionalInfo) - 1 );
AdditionalInfo[sizeof(AdditionalInfo) - 1] = '\x0';
//--------------------------------------------------------------------------
// Send all info found to the debug output file.
//--------------------------------------------------------------------------
#if ( _DEBUG )
Msg( __LINE__, __FILE__, "MajorVersionNumber = %d", MajorVersionNumber );
Msg( __LINE__, __FILE__, "MinorVersionNumber = %d", MinorVersionNumber );
Msg( __LINE__, __FILE__, "WindowsVersion = %d", WindowsVersion );
Msg( __LINE__, __FILE__, "BuildNumber = %d", BuildNumber );
Msg( __LINE__, __FILE__, "IsWin9x = %d", IsWin9x );
Msg( __LINE__, __FILE__, "IsWin95 = %d", IsWin95 );
Msg( __LINE__, __FILE__, "IsWin98 = %d", IsWin98 );
Msg( __LINE__, __FILE__, "IsWin2000 = %d", IsWin2000 );
Msg( __LINE__, __FILE__, "RunningOSR2 = %d", RunningOSR2 );
Msg( __LINE__, __FILE__, "IsWinNT = %d", IsWinNT );
Msg( __LINE__, __FILE__, "AdditionalInfo = %s", AdditionalInfo );
Msg( __LINE__, __FILE__, "VersionName = %s", VersionName );
#endif
}
/***********************************************************************************************
* WindowsVersionInfo::Version_String -- Get the version number in human readable form *
* *
* INPUT: Nothing *
* *
* OUTPUT: Ptr to string containing version info *
* *
* WARNINGS: None *
* *
* HISTORY: *
* 3/30/99 10:29PM ST : Created *
*=============================================================================================*/
char *WindowsVersionInfo::Version_String(void)
{
static char _ver95[] = {"Windows 95 "};
static char _ver98[] = {"Windows 98 "};
static char _verNT4[] = {"Windows NT 4 "};
static char _verNT5[] = {"Windows 2000 "};
static char _verXP[] = {"Windows XP "};
static char _unknown[] = {"Unknown "};
static char version[256];
if (Is_Win95()) {
strcpy (version, _ver95);
}
if (Is_Win98()) {
strcpy (version, _ver98);
}
if (Is_WinNT()) {
strcpy (version, _verNT4);
}
if (Is_WinNT5() || Is_Win_2000()) {
strcpy (version, _verNT5);
}
if (Is_Win_XP()) {
strcpy (version, _verXP);
}
strcat (version, AdditionalInfo);
return (version);
}
/***************************************************************************
* WindowsVersionClass::Version_Name -- returns version # as char string *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* ptr to name *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 10/30/1995 BRR : Created. *
*=========================================================================*/
char * WindowsVersionInfo::Version_Name(void)
{
return ( VersionName );
}
/****************************************************************************
* WindowsVersionClass::Meets_Minimum_Version_Requirements *
* *
* INPUT: *
* none. *
* *
* OUTPUT: *
* ptr to name *
* *
* WARNINGS: *
* none. *
* *
* HISTORY: *
* 10/30/1995 BRR : Created. *
*==========================================================================*/
bool WindowsVersionInfo::Meets_Minimum_Version_Requirements ( void )
{
// return(( !IsWin95 && ( Version() >= 400 ))? true : false );
return(( Version() >= 400 )? true : false );
}