351 lines
14 KiB
C++
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 );
|
||
|
}
|
||
|
|
||
|
|
||
|
|