| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- /*
- ** 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/>.
- */
- // FILE: WOLinit.cpp //////////////////////////////////////////////////////
- // Westwood Online DLL/COM/ initialization/teardown
- // Author: Matthew D. Campbell, December 2001
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
- #endif
- #include <snmp.h>
- #include <winreg.h>
- #include <atlbase.h>
- extern CComModule _Module; // Required for COM - must be between atlbase.h and atlcom.h. Funky, no?
- #include <atlcom.h>
- #include <stdio.h>
- #include <stdarg.h>
- #include "wolSetup.h"
- #include "wolapi/wolapi.h"
- unsigned long g_wolapiRegistryVersion = 0;
- unsigned long g_wolapiRealVersion = 0;
- bool g_wolapiInstalled = false;
- char g_wolapiRegFilename[MAX_PATH];
- char g_wolapiRealFilename[MAX_PATH];
- char g_generalsFilename[MAX_PATH];
- char g_generalsSerial[1024];
- #define GENERALS_REG_KEY_TOP "HKEY_LOCAL_MACHINE" ///< Registry base
- #define GENERALS_REG_KEY_PATH "SOFTWARE\\Westwood\\Generals" ///< Generals registry key
- #define GENERALS_REG_KEY_BOTTOM GENERALS_REG_KEY_PATH "\\" ///< Generals registry key with trailing backslashes
- #define GENERALS_REG_KEY_VERSION "Version" ///< Version registry key
- #define GENERALS_REG_KEY_SKU "SKU" ///< SKU registry key
- #define GENERALS_REG_KEY_NAME "Name" ///< Product name registry key
- #define GENERALS_REG_KEY_INSTALLPATH "InstallPath" ///< Install path registry key
- #define GENERALS_REG_KEY_SERIAL "Serial" ///< Serial # registry key
- #define GENERALS_REG_KEY GENERALS_REG_KEY_TOP "\\" GENERALS_REG_KEY_BOTTOM ///< Full Generals registry path
- #define WOLAPI_REG_KEY_TOP "HKEY_LOCAL_MACHINE" ///< Registry base
- #define WOLAPI_REG_KEY_PATH "SOFTWARE\\Westwood\\WOLAPI" ///< WOLAPI registry key
- #define WOLAPI_REG_KEY_BOTTOM WOLAPI_REG_KEY_PATH "\\" ///< WOLAPI registry key with trailing backslashes
- #define WOLAPI_REG_KEY_VERSION "Version" ///< Version registry key
- #define WOLAPI_REG_KEY_INSTALLPATH "InstallPath" ///< Install path registry key
- #define WOLAPI_REG_KEY WOLAPI_REG_KEY_TOP "\\" WOLAPI_REG_KEY_BOTTOM ///< Full WOLAPI registry path
- #define DLL_REG_KEY_TOP "HKEY_CLASSES_ROOT" ///< Registry base
- #define DLL_REG_KEY_PATH "CLSID\\{18FD6763-F5EA-4fa5-B2A9-668554152FAE}\\InprocServer32" ///< WOLAPI registry key
- #define DLL_REG_KEY_BOTTOM DLL_REG_KEY_PATH "\\" ///< WOLAPI registry key with trailing backslashes
- #define DLL_REG_KEY_LOCATION "" ///< Version registry key
- void getPathsFromRegistry( void )
- {
- HKEY handle;
- unsigned long type;
- unsigned long size;
- int returnValue;
- size = sizeof(g_generalsFilename);
- strcpy(g_generalsFilename, "No install path in registry");
- if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, GENERALS_REG_KEY_PATH, 0, KEY_ALL_ACCESS, &handle ) == ERROR_SUCCESS) {
- returnValue = RegQueryValueEx(handle, GENERALS_REG_KEY_INSTALLPATH, NULL, &type, (unsigned char *) &g_generalsFilename, &size);
- if (returnValue != ERROR_SUCCESS)
- {
- strcpy(g_generalsFilename, "No install path in registry");
- }
- RegCloseKey( handle );
- }
- size = sizeof(g_generalsSerial);
- strcpy(g_generalsSerial, "0");
- if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, GENERALS_REG_KEY_PATH, 0, KEY_ALL_ACCESS, &handle ) == ERROR_SUCCESS) {
- returnValue = RegQueryValueEx(handle, GENERALS_REG_KEY_SERIAL, NULL, &type, (unsigned char *) &g_generalsSerial, &size);
- if (returnValue != ERROR_SUCCESS)
- {
- strcpy(g_generalsSerial, "0");
- }
- RegCloseKey( handle );
- }
- size = sizeof(g_wolapiRegFilename);
- strcpy(g_wolapiRegFilename, "No install path in registry");
- g_wolapiInstalled = true;
- if (RegOpenKeyEx( HKEY_LOCAL_MACHINE, WOLAPI_REG_KEY_PATH, 0, KEY_ALL_ACCESS, &handle ) == ERROR_SUCCESS) {
- returnValue = RegQueryValueEx(handle, WOLAPI_REG_KEY_INSTALLPATH, NULL, &type, (unsigned char *) &g_wolapiRegFilename, &size);
- if (returnValue != ERROR_SUCCESS)
- {
- strcpy(g_wolapiRegFilename, "No install path in registry");
- g_wolapiInstalled = false;
- }
- RegCloseKey( handle );
- }
- size = sizeof(g_wolapiRealFilename);
- strcpy(g_wolapiRealFilename, "No wolapi.dll installed");
- if (RegOpenKeyEx( HKEY_CLASSES_ROOT, DLL_REG_KEY_PATH, 0, KEY_ALL_ACCESS, &handle ) == ERROR_SUCCESS) {
- returnValue = RegQueryValueEx(handle, DLL_REG_KEY_LOCATION, NULL, &type, (unsigned char *) &g_wolapiRealFilename, &size);
- if (returnValue != ERROR_SUCCESS)
- {
- strcpy(g_wolapiRealFilename, "No wolapi.dll installed");
- g_wolapiInstalled = false;
- }
- RegCloseKey( handle );
- }
- }
- void setupGenerals( const char *genPath, const char *genSerial )
- {
- HKEY handle;
- unsigned long type;
- unsigned long returnValue;
- int size;
- if (RegCreateKeyEx( HKEY_LOCAL_MACHINE, GENERALS_REG_KEY_PATH, 0, "REG_NONE", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &handle, NULL ) == ERROR_SUCCESS) {
- type = REG_SZ;
- size = strlen(genPath)+1;
- returnValue = RegSetValueEx(handle, GENERALS_REG_KEY_INSTALLPATH, 0, type, (unsigned char *) genPath, size);
- size = strlen(genSerial)+1;
- returnValue = RegSetValueEx(handle, GENERALS_REG_KEY_SERIAL, 0, type, (unsigned char *) genSerial, size);
- size = strlen("Generals")+1;
- returnValue = RegSetValueEx(handle, GENERALS_REG_KEY_NAME, 0, type, (unsigned char *) "Generals", size);
- type = REG_DWORD;
- size = sizeof(DWORD);
- unsigned long value = 65536;
- returnValue = RegSetValueEx(handle, GENERALS_REG_KEY_VERSION, 0, type, (unsigned char *) &value, size);
- value = 12544;
- returnValue = RegSetValueEx(handle, GENERALS_REG_KEY_SKU, 0, type, (unsigned char *) &value, size);
- RegCloseKey( handle );
- }
- }
- /**
- * OLEInitializer class - Init and shutdown OLE & COM as a global
- * object. Scary, nasty stuff, COM. /me shivers.
- */
- class OLEInitializer
- {
- public:
- OLEInitializer() { OleInitialize(NULL); }
- ~OLEInitializer() { OleUninitialize(); }
- };
- OLEInitializer g_OLEInitializer;
- CComModule _Module;
- IChat *g_pChat = NULL;
- /**
- * checkInstalledWolapiVersion inits WOLAPI if possible and gets its version
- * number. It also saves off its install path from the registry.
- */
- void checkInstalledWolapiVersion( void )
- {
- // Initialize this instance
- _Module.Init(NULL, g_hInst);
- // Create the WOLAPI instance
- CoCreateInstance(CLSID_Chat, NULL, CLSCTX_INPROC_SERVER, \
- IID_IChat, (void**)&g_pChat);
- if (g_pChat)
- {
- // Grab versions
- g_pChat->GetVersion(&g_wolapiRealVersion);
- // Release everything
- g_pChat->Release();
- g_wolapiInstalled = true;
- }
- _Module.Term();
- // Grab path info from registry
- getPathsFromRegistry();
- return;
- }
|