RegistryManager.cpp 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934
  1. /*
  2. ** Command & Conquer Renegade(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /***********************************************************************************************
  19. *** Confidential - Westwood Studios ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : Installer *
  23. * *
  24. * $Archive:: /Commando/Code/Installer/RegistryManager.cpp $*
  25. * *
  26. * $Author:: Ian_l $*
  27. * *
  28. * $Modtime:: 1/25/02 5:09p $*
  29. * *
  30. * $Revision:: 11 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. // Includes.
  36. #include "Installer.h"
  37. #include "ErrorHandler.h"
  38. #include "RegistryManager.h"
  39. #include "Resource.h"
  40. #include "Translator.h"
  41. #include "Utilities.h"
  42. #include "Win.h"
  43. #include <mmsystem.h>
  44. #include <winreg.h>
  45. // Defines.
  46. #define SHELL_FOLDERS_KEY "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"
  47. #define PROGRAMS_PATH_KEY "Programs"
  48. #define DESKTOP_PATH_KEY "Desktop"
  49. #define SOFTWARE_KEY "Software"
  50. #define WESTWOOD_KEY "Westwood"
  51. #define NAME_KEY "Name"
  52. #define DESKTOP_SHORTCUT_PATHNAME_KEY "Desktop" // Pathname of shortcut file to launch game.
  53. #define FOLDER_PATH_KEY "FolderPath"
  54. #define INSTALL_PATHNAME_KEY "InstallPath" // NOTE: This is a misnomer. Actually refers to product pathname.
  55. #define LANGUAGE_KEY "Language"
  56. #define SERIAL_KEY "Serial"
  57. #define SKU_KEY "SKU"
  58. #define VERSION_KEY "Version"
  59. #define WOLSETTINGS_KEY "WOLSettings"
  60. #define URL_KEY "URL"
  61. #define WOLAPI_KEY "WOLAPI"
  62. #define WOLREGISTER_KEY "Register"
  63. #define WOLBROWSER_KEY "WOLBrowser"
  64. #define USAGE_KEY "Usage"
  65. #define MICROSOFT_KEY "Microsoft"
  66. #define WINDOWS_KEY "Windows"
  67. #define CURRENT_VERSION_KEY "CurrentVersion"
  68. #define APP_PATHS_KEY "App Paths"
  69. #define PATH_KEY "Path"
  70. #define UNINSTALL_KEY "Uninstall"
  71. #define DISPLAY_NAME_KEY "DisplayName"
  72. #define UNINSTALLER_FILENAME_KEY "UninstallString"
  73. #define EXTENSIONS_KEY "Extensions"
  74. #define DOCUMENT_KEY "doc"
  75. #define WESTWOOD_CHAT_KEY "Wchat"
  76. #define NICKNAME_INDEX_KEY "Nick%u"
  77. #define NICKNAME_KEY "Nick"
  78. #define PASSWORD_KEY "Pass"
  79. #define PREFERRED_LOGIN_KEY "AutoLogin"
  80. #define OPTIONS_KEY "Options"
  81. // Internet Game Room flags.
  82. #define IGR_NO_AUTO_LOGIN 0x01
  83. #define IGR_NEVER_STORE_NICKS 0x02
  84. #define IGR_NEVER_RUN_REG_APP 0x04
  85. #define IGR_ALL (IGR_NO_AUTO_LOGIN | IGR_NEVER_STORE_NICKS | IGR_NEVER_RUN_REG_APP)
  86. #define IGR_NONE 0x00
  87. // Singleton.
  88. RegistryManagerClass _RegistryManager;
  89. /***********************************************************************************************
  90. * RegistryManagerClass::RegistryManagerClass -- *
  91. * *
  92. * INPUT: *
  93. * *
  94. * OUTPUT: *
  95. * *
  96. * WARNINGS: *
  97. * *
  98. * HISTORY: *
  99. * 08/22/01 IML : Created. *
  100. *=============================================================================================*/
  101. RegistryManagerClass::RegistryManagerClass()
  102. {
  103. WOLKeys [WOLAPI_COMPONENT] = WOLAPI_KEY;
  104. WOLKeys [WOLREGISTER_COMPONENT] = WOLREGISTER_KEY;
  105. WOLKeys [WOLBROWSER_COMPONENT] = WOLBROWSER_KEY;
  106. }
  107. /***********************************************************************************************
  108. * RegistryManagerClass::Get_Folder_Path -- *
  109. * *
  110. * INPUT: *
  111. * *
  112. * OUTPUT: *
  113. * *
  114. * WARNINGS: *
  115. * *
  116. * HISTORY: *
  117. * 08/22/01 IML : Created. *
  118. *=============================================================================================*/
  119. bool RegistryManagerClass::Get_Folder_Path (WideStringClass &path)
  120. {
  121. return (Get_String (HKEY_CURRENT_USER, &path, SHELL_FOLDERS_KEY, PROGRAMS_PATH_KEY, NULL));
  122. }
  123. /***********************************************************************************************
  124. * RegistryManagerClass::Get_Desktop_Path -- *
  125. * *
  126. * INPUT: *
  127. * *
  128. * OUTPUT: *
  129. * *
  130. * WARNINGS: *
  131. * *
  132. * HISTORY: *
  133. * 08/22/01 IML : Created. *
  134. *=============================================================================================*/
  135. bool RegistryManagerClass::Get_Desktop_Path (WideStringClass &path)
  136. {
  137. return (Get_String (HKEY_CURRENT_USER, &path, SHELL_FOLDERS_KEY, DESKTOP_PATH_KEY, NULL));
  138. }
  139. /***********************************************************************************************
  140. * RegistryManagerClass::Get_Target_Game_Pathname -- *
  141. * *
  142. * INPUT: *
  143. * *
  144. * OUTPUT: *
  145. * *
  146. * WARNINGS: *
  147. * *
  148. * HISTORY: *
  149. * 08/22/01 IML : Created. *
  150. *=============================================================================================*/
  151. bool RegistryManagerClass::Get_Target_Game_Pathname (WideStringClass &pathname)
  152. {
  153. return (Get_String (HKEY_LOCAL_MACHINE, &pathname, SOFTWARE_KEY, WESTWOOD_KEY, RxStringClass (IDS_GAME_PRODUCT_KEY), INSTALL_PATHNAME_KEY, NULL));
  154. }
  155. /***********************************************************************************************
  156. * RegistryManagerClass::Get_Target_Game_Path -- *
  157. * *
  158. * INPUT: *
  159. * *
  160. * OUTPUT: *
  161. * *
  162. * WARNINGS: *
  163. * *
  164. * HISTORY: *
  165. * 08/22/01 IML : Created. *
  166. *=============================================================================================*/
  167. bool RegistryManagerClass::Get_Target_Game_Path (WideStringClass &path)
  168. {
  169. bool success = false;
  170. WideStringClass pathname;
  171. if (Get_Target_Game_Pathname (pathname)) {
  172. // Remove filename.
  173. path = pathname;
  174. Remove_Trailing_Name (path);
  175. success = true;
  176. }
  177. return (success);
  178. }
  179. /***********************************************************************************************
  180. * RegistryManagerClass::Get_Target_Game_Folder -- *
  181. * *
  182. * INPUT: *
  183. * *
  184. * OUTPUT: *
  185. * *
  186. * WARNINGS: *
  187. * *
  188. * HISTORY: *
  189. * 08/22/01 IML : Created. *
  190. *=============================================================================================*/
  191. bool RegistryManagerClass::Get_Target_Game_Folder (WideStringClass &folder)
  192. {
  193. bool success = false;
  194. WideStringClass path, folderpath;
  195. WCHAR *suffixroot;
  196. if (Get_String (HKEY_LOCAL_MACHINE, &path, SOFTWARE_KEY, WESTWOOD_KEY, RxStringClass (IDS_GAME_PRODUCT_KEY), FOLDER_PATH_KEY, NULL)) {
  197. Get_Folder_Path (folderpath);
  198. suffixroot = Extract_Suffix_Root (path, folderpath);
  199. if (suffixroot != NULL) {
  200. folder = path;
  201. success = true;
  202. }
  203. }
  204. return (success);
  205. }
  206. /***********************************************************************************************
  207. * RegistryManagerClass::Get_Target_WOL_Pathname -- *
  208. * *
  209. * INPUT: *
  210. * *
  211. * OUTPUT: *
  212. * *
  213. * WARNINGS: *
  214. * *
  215. * HISTORY: *
  216. * 08/22/01 IML : Created. *
  217. *=============================================================================================*/
  218. bool RegistryManagerClass::Get_Target_WOL_Pathname (WOLComponentEnum wolcomponent, WideStringClass &pathname)
  219. {
  220. return (Get_String (HKEY_LOCAL_MACHINE, &pathname, SOFTWARE_KEY, WESTWOOD_KEY, WOLKeys [wolcomponent], INSTALL_PATHNAME_KEY, NULL));
  221. }
  222. /***********************************************************************************************
  223. * RegistryManagerClass::Get_Target_WOL_Path -- *
  224. * *
  225. * INPUT: *
  226. * *
  227. * OUTPUT: *
  228. * *
  229. * WARNINGS: *
  230. * *
  231. * HISTORY: *
  232. * 08/22/01 IML : Created. *
  233. *=============================================================================================*/
  234. bool RegistryManagerClass::Get_Target_WOL_Path (WOLComponentEnum wolcomponent, WideStringClass &path)
  235. {
  236. bool success = false;
  237. WideStringClass pathname;
  238. if (Get_Target_WOL_Pathname (wolcomponent, pathname)) {
  239. // Remove filename.
  240. path = pathname;
  241. Remove_Trailing_Name (path);
  242. success = true;
  243. }
  244. return (success);
  245. }
  246. /***********************************************************************************************
  247. * RegistryManagerClass::Get_Target_WOL_Folder -- *
  248. * *
  249. * INPUT: *
  250. * *
  251. * OUTPUT: *
  252. * *
  253. * WARNINGS: *
  254. * *
  255. * HISTORY: *
  256. * 08/22/01 IML : Created. *
  257. *=============================================================================================*/
  258. bool RegistryManagerClass::Get_Target_WOL_Folder (WOLComponentEnum wolcomponent, WideStringClass &folder)
  259. {
  260. bool success = false;
  261. WideStringClass path, folderpath;
  262. WCHAR *suffixroot;
  263. if (Get_String (HKEY_LOCAL_MACHINE, &path, SOFTWARE_KEY, WESTWOOD_KEY, WOLKeys [wolcomponent], FOLDER_PATH_KEY, NULL)) {
  264. Get_Folder_Path (folderpath);
  265. suffixroot = Extract_Suffix_Root (path, folderpath);
  266. if (suffixroot != NULL) {
  267. folder = path;
  268. success = true;
  269. }
  270. }
  271. return (success);
  272. }
  273. /***********************************************************************************************
  274. * RegistryManagerClass::Get_WOL_Version -- *
  275. * *
  276. * INPUT: *
  277. * *
  278. * OUTPUT: *
  279. * *
  280. * WARNINGS: *
  281. * *
  282. * HISTORY: *
  283. * 08/22/01 IML : Created. *
  284. *=============================================================================================*/
  285. bool RegistryManagerClass::Get_Target_WOL_Version (WOLComponentEnum wolcomponent, DWORD &version)
  286. {
  287. return (Get_Value (HKEY_LOCAL_MACHINE, &version, SOFTWARE_KEY, WESTWOOD_KEY, WOLKeys [wolcomponent], VERSION_KEY, NULL));
  288. }
  289. /***********************************************************************************************
  290. * RegistryManagerClass::Use_IGR_Settings -- *
  291. * *
  292. * INPUT: *
  293. * *
  294. * OUTPUT: *
  295. * *
  296. * WARNINGS: *
  297. * *
  298. * HISTORY: *
  299. * 08/22/01 IML : Created. *
  300. *=============================================================================================*/
  301. bool RegistryManagerClass::Use_IGR_Settings (bool &useigrsettings)
  302. {
  303. bool success;
  304. DWORD igrsettings;
  305. success = Get_Value (HKEY_LOCAL_MACHINE, &igrsettings, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, OPTIONS_KEY, NULL);
  306. if (success) {
  307. useigrsettings = (igrsettings == IGR_ALL);
  308. }
  309. return (success);
  310. }
  311. /***********************************************************************************************
  312. * RegistryManagerClass::Register_Game -- *
  313. * *
  314. * INPUT: *
  315. * *
  316. * OUTPUT: *
  317. * *
  318. * WARNINGS: *
  319. * *
  320. * HISTORY: *
  321. * 08/22/01 IML : Created. *
  322. *=============================================================================================*/
  323. void RegistryManagerClass::Register_Game (const WideStringClass &name,
  324. const WideStringClass &installpathname,
  325. const WideStringClass &folderpath,
  326. const WideStringClass &desktopshortcutpathname,
  327. DWORD languageid,
  328. const StringClass &serialnumber,
  329. DWORD sku,
  330. DWORD version)
  331. {
  332. DWORD maskedsku;
  333. RxStringClass gameproductkey (IDS_GAME_PRODUCT_KEY);
  334. WideStringClass wideserialnumber (serialnumber);
  335. WideStringClass s, url;
  336. // The input SKU also contains the languageid in the LSB, so mask this off.
  337. maskedsku = sku & 0xffffff00;
  338. Set_String (HKEY_LOCAL_MACHINE, name, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, NAME_KEY, NULL);
  339. Set_String (HKEY_LOCAL_MACHINE, installpathname, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, INSTALL_PATHNAME_KEY, NULL);
  340. Set_String (HKEY_LOCAL_MACHINE, folderpath, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, FOLDER_PATH_KEY, NULL);
  341. Set_String (HKEY_LOCAL_MACHINE, desktopshortcutpathname, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, DESKTOP_SHORTCUT_PATHNAME_KEY, NULL);
  342. Set_Value (HKEY_LOCAL_MACHINE, languageid, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, LANGUAGE_KEY, NULL);
  343. Set_String (HKEY_LOCAL_MACHINE, wideserialnumber, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, SERIAL_KEY, NULL);
  344. Set_Value (HKEY_LOCAL_MACHINE, sku, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, SKU_KEY, NULL);
  345. Set_Value (HKEY_LOCAL_MACHINE, version, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, VERSION_KEY, NULL);
  346. s = L"http://renchat2.westwood.com/cgi-bin/cgiclient?ren_clan_manager&request=expand_template&Template=index.html&SKU=%d&LANGCODE=%d&embedded=1";
  347. url.Format (s, maskedsku, languageid);
  348. Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "BattleClans", NULL);
  349. s = L"http://renchat2.westwood.com/cgi-bin/cgiclient?ren_clan_manager&request=expand_template&Template=index.html&SKU=%d&LANGCODE=%d";
  350. url.Format (s, maskedsku, languageid);
  351. Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "BattleClansX", NULL);
  352. s = L"http://renchat2.westwood.com/renegade_embedded/index.html";
  353. url.Format (s);
  354. Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "Ladder", NULL);
  355. s = L"http://renchat2.westwood.com/renegade/index.html";
  356. url.Format (s);
  357. Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "LadderX", NULL);
  358. s = L"http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_netstatus&LANGCODE=%d&SKU=%d&embedded=1";
  359. url.Format (s, languageid, maskedsku);
  360. Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "NetStatus", NULL);
  361. s = L"http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_netstatus&LANGCODE=%d&SKU=%d";
  362. url.Format (s, languageid, maskedsku);
  363. Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "NetStatusX", NULL);
  364. s = L"http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_news&LANGCODE=%d&SKU=%d&embedded=1";
  365. url.Format (s, languageid, maskedsku);
  366. Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "News", NULL);
  367. s = L"http://battleclans.westwood.com/cgi-bin/cgiclient?rosetta&request=do_news&LANGCODE=%d&SKU=%d";
  368. url.Format (s, languageid, maskedsku);
  369. Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "NewsX", NULL);
  370. s = L"http://renchat2.westwood.com/cgi-bin/cgiclient?live_ren_register&request=expand_template&Template=newreg_menu.html&LANGCODE=%d&embedded=1&SKU=%d";
  371. url.Format (s, languageid, maskedsku);
  372. Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "Signup", NULL);
  373. s = L"http://renchat2.westwood.com/cgi-bin/cgiclient?live_ren_register&request=expand_template&Template=newreg_menu.html&LANGCODE=%d&SKU=%d";
  374. url.Format (s, languageid, maskedsku);
  375. Set_String (HKEY_LOCAL_MACHINE, url, SOFTWARE_KEY, WESTWOOD_KEY, gameproductkey, WOLSETTINGS_KEY, URL_KEY, "SignupX", NULL);
  376. // Register the executable with the OS.
  377. s = installpathname;
  378. Remove_Trailing_Name (s);
  379. Set_String (HKEY_LOCAL_MACHINE, s, SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, APP_PATHS_KEY, RxStringClass (IDS_GAME_EXECUTABLE_FILENAME), PATH_KEY, NULL);
  380. Set_String (HKEY_LOCAL_MACHINE, installpathname, SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, APP_PATHS_KEY, RxStringClass (IDS_GAME_EXECUTABLE_FILENAME), "", NULL);
  381. // Register the uninstall program with the OS.
  382. Set_String (HKEY_LOCAL_MACHINE, TxWideStringClass (IDS_VERBOSE_GAME_PRODUCT_NAME), SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, UNINSTALL_KEY, RxStringClass (IDS_GAME_PRODUCT_KEY), DISPLAY_NAME_KEY, NULL);
  383. s += L"\\";
  384. s += RxWideStringClass (IDS_GAME_UNINSTALL_FILENAME);
  385. Set_String (HKEY_LOCAL_MACHINE, s, SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, UNINSTALL_KEY, RxStringClass (IDS_GAME_PRODUCT_KEY), UNINSTALLER_FILENAME_KEY, NULL);
  386. }
  387. /***********************************************************************************************
  388. * RegistryManagerClass::Register_WOLAPI -- *
  389. * *
  390. * INPUT: *
  391. * *
  392. * OUTPUT: *
  393. * *
  394. * WARNINGS: *
  395. * *
  396. * HISTORY: *
  397. * 08/22/01 IML : Created. *
  398. *=============================================================================================*/
  399. void RegistryManagerClass::Register_WOLAPI (const WideStringClass &folderpath,
  400. const WideStringClass &installpathname,
  401. const WideStringClass &name,
  402. DWORD sku,
  403. DWORD version,
  404. bool useigrsettings)
  405. {
  406. const DWORD igrsettings [] = {IGR_NONE, IGR_ALL};
  407. WideStringClass s;
  408. Set_String (HKEY_LOCAL_MACHINE, folderpath, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, FOLDER_PATH_KEY, NULL);
  409. Set_String (HKEY_LOCAL_MACHINE, installpathname, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, INSTALL_PATHNAME_KEY, NULL);
  410. Set_String (HKEY_LOCAL_MACHINE, name, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, NAME_KEY, NULL);
  411. Set_Value (HKEY_LOCAL_MACHINE, sku, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, SKU_KEY, NULL);
  412. Set_Value (HKEY_LOCAL_MACHINE, version, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, VERSION_KEY, NULL);
  413. // Register the uninstall program with the OS.
  414. Set_String (HKEY_LOCAL_MACHINE, TxWideStringClass (IDS_VERBOSE_WOL_PRODUCT_NAME), SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, UNINSTALL_KEY, WOLAPI_KEY, DISPLAY_NAME_KEY, NULL);
  415. s = installpathname;
  416. Remove_Trailing_Name (s);
  417. s += L"\\";
  418. s += RxWideStringClass (IDS_WOL_UNINSTALL_FILENAME);
  419. Set_String (HKEY_LOCAL_MACHINE, s, SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, UNINSTALL_KEY, WOLAPI_KEY, UNINSTALLER_FILENAME_KEY, NULL);
  420. // Write the game room settings.
  421. Set_Value (HKEY_LOCAL_MACHINE, igrsettings [useigrsettings], SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, OPTIONS_KEY, NULL);
  422. }
  423. /***********************************************************************************************
  424. * RegistryManagerClass::Register_WOLRegister -- *
  425. * *
  426. * INPUT: *
  427. * *
  428. * OUTPUT: *
  429. * *
  430. * WARNINGS: *
  431. * *
  432. * HISTORY: *
  433. * 08/22/01 IML : Created. *
  434. *=============================================================================================*/
  435. void RegistryManagerClass::Register_WOLRegister (const WideStringClass &folderpath,
  436. const WideStringClass &installpathname,
  437. const WideStringClass &name,
  438. DWORD sku,
  439. DWORD version)
  440. {
  441. Set_String (HKEY_LOCAL_MACHINE, folderpath, SOFTWARE_KEY, WESTWOOD_KEY, WOLREGISTER_KEY, FOLDER_PATH_KEY, NULL);
  442. Set_String (HKEY_LOCAL_MACHINE, installpathname, SOFTWARE_KEY, WESTWOOD_KEY, WOLREGISTER_KEY, INSTALL_PATHNAME_KEY, NULL);
  443. Set_String (HKEY_LOCAL_MACHINE, name, SOFTWARE_KEY, WESTWOOD_KEY, WOLREGISTER_KEY, NAME_KEY, NULL);
  444. Set_Value (HKEY_LOCAL_MACHINE, sku, SOFTWARE_KEY, WESTWOOD_KEY, WOLREGISTER_KEY, SKU_KEY, NULL);
  445. Set_Value (HKEY_LOCAL_MACHINE, version, SOFTWARE_KEY, WESTWOOD_KEY, WOLREGISTER_KEY, VERSION_KEY, NULL);
  446. }
  447. /***********************************************************************************************
  448. * RegistryManagerClass::Register_WOLBrowser -- *
  449. * *
  450. * INPUT: *
  451. * *
  452. * OUTPUT: *
  453. * *
  454. * WARNINGS: *
  455. * *
  456. * HISTORY: *
  457. * 08/22/01 IML : Created. *
  458. *=============================================================================================*/
  459. void RegistryManagerClass::Register_WOLBrowser (const WideStringClass &installpathname,
  460. const WideStringClass &name,
  461. DWORD version)
  462. {
  463. Set_String (HKEY_LOCAL_MACHINE, installpathname, SOFTWARE_KEY, WESTWOOD_KEY, WOLBROWSER_KEY, INSTALL_PATHNAME_KEY, NULL);
  464. Set_String (HKEY_LOCAL_MACHINE, name, SOFTWARE_KEY, WESTWOOD_KEY, WOLBROWSER_KEY, NAME_KEY, NULL);
  465. Set_Value (HKEY_LOCAL_MACHINE, version, SOFTWARE_KEY, WESTWOOD_KEY, WOLBROWSER_KEY, VERSION_KEY, NULL);
  466. }
  467. /***********************************************************************************************
  468. * RegistryManagerClass::Update_WOLAPI -- *
  469. * *
  470. * INPUT: *
  471. * *
  472. * OUTPUT: *
  473. * *
  474. * WARNINGS: *
  475. * *
  476. * HISTORY: *
  477. * 08/22/01 IML : Created. *
  478. *=============================================================================================*/
  479. void RegistryManagerClass::Update_WOLAPI()
  480. {
  481. DWORD keyindex, usagecount;
  482. StringClass keyname;
  483. keyindex = 0;
  484. usagecount = 0;
  485. while (Get_Key (HKEY_LOCAL_MACHINE, keyindex, &keyname, SOFTWARE_KEY, WESTWOOD_KEY, NULL)) {
  486. DWORD sku;
  487. WideStringClass serialnumber;
  488. // If a SKU and a serial number exist...
  489. if (Get_Value (HKEY_LOCAL_MACHINE, &sku, SOFTWARE_KEY, WESTWOOD_KEY, keyname, SKU_KEY, NULL)) {
  490. if (Get_String (HKEY_LOCAL_MACHINE, &serialnumber, SOFTWARE_KEY, WESTWOOD_KEY, keyname, SERIAL_KEY, NULL)) {
  491. WideStringClass widekeyname;
  492. char skuname [MAX_NUMBER_STRING_LENGTH];
  493. // Create a key for the key name under the WOLAPI key.
  494. ltoa (sku, skuname, 10);
  495. widekeyname = keyname;
  496. Set_String (HKEY_LOCAL_MACHINE, widekeyname, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, skuname, NAME_KEY, NULL);
  497. usagecount++;
  498. }
  499. }
  500. keyindex++;
  501. }
  502. // Update the WOLAPI usage count.
  503. Set_Value (HKEY_LOCAL_MACHINE, usagecount, SOFTWARE_KEY, WESTWOOD_KEY, WOLAPI_KEY, USAGE_KEY, NULL);
  504. }
  505. /***********************************************************************************************
  506. * RegistryManagerClass::Get_WOL_Account -- *
  507. * *
  508. * INPUT: *
  509. * *
  510. * OUTPUT: *
  511. * *
  512. * WARNINGS: *
  513. * *
  514. * HISTORY: *
  515. * 08/22/01 IML : Created. *
  516. *=============================================================================================*/
  517. bool RegistryManagerClass::Get_WOL_Account (unsigned index, WideStringClass &name, WideStringClass &password)
  518. {
  519. unsigned nonemptyindex, i;
  520. // Find the n'th key with a non-empty name string.
  521. // NOTE: Conversion from zero-based to one-based index.
  522. nonemptyindex = 0;
  523. i = 1;
  524. while (true) {
  525. StringClass key;
  526. key.Format (NICKNAME_INDEX_KEY, i);
  527. if (Get_String (HKEY_CLASSES_ROOT, &name, WESTWOOD_CHAT_KEY, key, NICKNAME_KEY, "", NULL)) {
  528. if (name != L"") {
  529. if (index == nonemptyindex) {
  530. return (Get_String (HKEY_CLASSES_ROOT, &password, WESTWOOD_CHAT_KEY, key, PASSWORD_KEY, "", NULL));
  531. }
  532. nonemptyindex++;
  533. }
  534. } else {
  535. break;
  536. }
  537. i++;
  538. }
  539. // Key not found.
  540. return (false);
  541. }
  542. /***********************************************************************************************
  543. * RegistryManagerClass::Set_Preferred_WOL_Account -- *
  544. * *
  545. * INPUT: *
  546. * *
  547. * OUTPUT: *
  548. * *
  549. * WARNINGS: *
  550. * *
  551. * HISTORY: *
  552. * 08/22/01 IML : Created. *
  553. *=============================================================================================*/
  554. void RegistryManagerClass::Set_Preferred_WOL_Account (const WideStringClass &accountname)
  555. {
  556. Set_String (HKEY_LOCAL_MACHINE, accountname, SOFTWARE_KEY, WESTWOOD_KEY, RxStringClass (IDS_GAME_PRODUCT_KEY), WOLSETTINGS_KEY, PREFERRED_LOGIN_KEY, NULL);
  557. }
  558. /***********************************************************************************************
  559. * RegistryManagerClass::Get_Document_Application_Pathname -- *
  560. * *
  561. * INPUT: *
  562. * *
  563. * OUTPUT: *
  564. * *
  565. * WARNINGS: *
  566. * *
  567. * HISTORY: *
  568. * 08/22/01 IML : Created. *
  569. *=============================================================================================*/
  570. bool RegistryManagerClass::Get_Document_Application_Pathname (WideStringClass &pathname)
  571. {
  572. return (Get_String (HKEY_CURRENT_USER, &pathname, SOFTWARE_KEY, MICROSOFT_KEY, WINDOWS_KEY, CURRENT_VERSION_KEY, EXTENSIONS_KEY, DOCUMENT_KEY, NULL));
  573. }
  574. /***********************************************************************************************
  575. * RegistryManagerClass::Get_String -- *
  576. * *
  577. * INPUT: *
  578. * *
  579. * OUTPUT: *
  580. * *
  581. * WARNINGS: *
  582. * *
  583. * HISTORY: *
  584. * 08/22/01 IML : Created. *
  585. *=============================================================================================*/
  586. bool RegistryManagerClass::Get_String (HKEY rootkey, WideStringClass *string, ...)
  587. {
  588. bool success = false;
  589. va_list marker;
  590. char *keyname, *nextkeyname;
  591. StringClass keystring;
  592. HKEY key;
  593. va_start (marker, string);
  594. keyname = va_arg (marker, char*);
  595. if (keyname != NULL) {
  596. // Concatenate all but the last key name.
  597. nextkeyname = va_arg (marker, char*);
  598. while (nextkeyname != NULL) {
  599. if (keystring.Get_Length() > 0) keystring += "\\";
  600. keystring += keyname;
  601. keyname = nextkeyname;
  602. nextkeyname = va_arg (marker, char*);
  603. }
  604. if (RegOpenKeyEx (rootkey, keystring, 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS) {
  605. DWORD type;
  606. DWORD size;
  607. if (RegQueryValueEx (key, keyname, NULL, &type, NULL, &size) == ERROR_SUCCESS) {
  608. if (type == REG_SZ) {
  609. StringClass multibytestring;
  610. if (RegQueryValueEx (key, keyname, NULL, &type, (BYTE*) multibytestring.Get_Buffer (size), &size) == ERROR_SUCCESS) {
  611. *string = multibytestring;
  612. success = true;
  613. }
  614. }
  615. }
  616. RegCloseKey (key);
  617. }
  618. }
  619. va_end (marker);
  620. return (success);
  621. }
  622. /***********************************************************************************************
  623. * RegistryManagerClass::Get_Value -- *
  624. * *
  625. * INPUT: *
  626. * *
  627. * OUTPUT: *
  628. * *
  629. * WARNINGS: *
  630. * *
  631. * HISTORY: *
  632. * 08/22/01 IML : Created. *
  633. *=============================================================================================*/
  634. bool RegistryManagerClass::Get_Value (HKEY rootkey, DWORD *value, ...)
  635. {
  636. bool success = false;
  637. va_list marker;
  638. char *keyname, *nextkeyname;
  639. StringClass keystring;
  640. HKEY key;
  641. va_start (marker, value);
  642. keyname = va_arg (marker, char*);
  643. if (keyname != NULL) {
  644. // Concatenate all but the last key name.
  645. nextkeyname = va_arg (marker, char*);
  646. while (nextkeyname != NULL) {
  647. if (keystring.Get_Length() > 0) {
  648. keystring += "\\";
  649. }
  650. keystring += keyname;
  651. keyname = nextkeyname;
  652. nextkeyname = va_arg (marker, char*);
  653. }
  654. if (RegOpenKeyEx (rootkey, keystring, 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS) {
  655. DWORD type;
  656. DWORD size;
  657. if (RegQueryValueEx (key, keyname, NULL, &type, NULL, &size) == ERROR_SUCCESS) {
  658. if (type == REG_DWORD) {
  659. if (RegQueryValueEx (key, keyname, NULL, &type, (BYTE*) value, &size) == ERROR_SUCCESS) {
  660. success = true;
  661. }
  662. }
  663. }
  664. RegCloseKey (key);
  665. }
  666. }
  667. va_end (marker);
  668. return (success);
  669. }
  670. /***********************************************************************************************
  671. * RegistryManagerClass::Set_String -- *
  672. * *
  673. * INPUT: *
  674. * *
  675. * OUTPUT: *
  676. * *
  677. * WARNINGS: *
  678. * *
  679. * HISTORY: *
  680. * 08/22/01 IML : Created. *
  681. *=============================================================================================*/
  682. bool _cdecl RegistryManagerClass::Set_String (HKEY rootkey, const WCHAR *string, ...)
  683. {
  684. HKEY key;
  685. DWORD disposition;
  686. bool success = false;
  687. va_list marker;
  688. char *keyname, *nextkeyname;
  689. va_start (marker, string);
  690. // Create subkeys (if necessary).
  691. key = rootkey;
  692. keyname = va_arg (marker, char*);
  693. if (keyname != NULL) {
  694. nextkeyname = va_arg (marker, char*);
  695. while (true) {
  696. if (nextkeyname == NULL) {
  697. StringClass multibytestring (string);
  698. if (RegSetValueEx (key, keyname, 0, REG_SZ, (BYTE*) multibytestring.Peek_Buffer(), multibytestring.Get_Length() + 1) == ERROR_SUCCESS) {
  699. success = true;
  700. }
  701. break;
  702. }
  703. if (RegCreateKeyEx (key, keyname, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &disposition) != ERROR_SUCCESS) {
  704. break;
  705. }
  706. keyname = nextkeyname;
  707. nextkeyname = va_arg (marker, char*);
  708. }
  709. }
  710. va_end (marker);
  711. return (success);
  712. }
  713. /***********************************************************************************************
  714. * RegistryManagerClass::Set_Value -- *
  715. * *
  716. * INPUT: *
  717. * *
  718. * OUTPUT: *
  719. * *
  720. * WARNINGS: *
  721. * *
  722. * HISTORY: *
  723. * 08/22/01 IML : Created. *
  724. *=============================================================================================*/
  725. bool _cdecl RegistryManagerClass::Set_Value (HKEY rootkey, DWORD value, ...)
  726. {
  727. HKEY key;
  728. DWORD disposition;
  729. bool success = false;
  730. va_list marker;
  731. char *keyname, *nextkeyname;
  732. va_start (marker, value);
  733. // Create subkeys (if necessary).
  734. key = rootkey;
  735. keyname = va_arg (marker, char*);
  736. if (keyname != NULL) {
  737. nextkeyname = va_arg (marker, char*);
  738. while (true) {
  739. if (nextkeyname == NULL) {
  740. if (RegSetValueEx (key, keyname, 0, REG_DWORD, (BYTE*) &value, sizeof (value)) == ERROR_SUCCESS) {
  741. success = true;
  742. }
  743. break;
  744. }
  745. if (RegCreateKeyEx (key, keyname, 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &disposition) != ERROR_SUCCESS) {
  746. break;
  747. }
  748. keyname = nextkeyname;
  749. nextkeyname = va_arg (marker, char*);
  750. }
  751. }
  752. va_end (marker);
  753. return (success);
  754. }
  755. /***********************************************************************************************
  756. * RegistryManagerClass::Get_Key -- *
  757. * *
  758. * INPUT: *
  759. * *
  760. * OUTPUT: *
  761. * *
  762. * WARNINGS: *
  763. * *
  764. * HISTORY: *
  765. * 08/22/01 IML : Created. *
  766. *=============================================================================================*/
  767. bool _cdecl RegistryManagerClass::Get_Key (HKEY rootkey, DWORD keyindex, StringClass *keyname, ...)
  768. {
  769. bool success = false;
  770. va_list marker;
  771. char *ckeyname;
  772. StringClass keystring;
  773. HKEY key;
  774. va_start (marker, keyname);
  775. while ((ckeyname = va_arg (marker, char*)) != NULL) {
  776. if (keystring.Get_Length() > 0) {
  777. keystring += "\\";
  778. }
  779. keystring += ckeyname;
  780. }
  781. if (RegOpenKeyEx (rootkey, keystring, 0, KEY_ALL_ACCESS, &key) == ERROR_SUCCESS) {
  782. FILETIME lastwritetime;
  783. DWORD size;
  784. if (RegEnumKeyEx (key, keyindex, keyname->Get_Buffer (256), &size, 0, NULL, NULL, &lastwritetime) == ERROR_SUCCESS) {
  785. success = true;
  786. }
  787. RegCloseKey (key);
  788. }
  789. va_end (marker);
  790. return (success);
  791. }