/* * Descent 3 * Copyright (C) 2024 Parallax Software * * 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 . --- HISTORICAL COMMENTS FOLLOW --- * $Logfile: /DescentIII/Main/D3Launch/OS_Config.cpp $ * $Revision: 1.1.1.1 $ * $Date: 2003-08-26 03:56:51 $ * $Author: kevinb $ * * * * $Log: not supported by cvs2svn $ * * 9 3/12/99 3:29p Nate * Moved application registry names to LaunchNames.h * * 8 2/15/99 1:22p Kevin * Changes for GameGauge * * 7 2/05/99 3:51p Nate * Added conditional compilation directives for OEM support * * 6 9/23/98 11:21a Nate * Added "demo" conditional compilation * * 5 9/22/98 3:34p Nate * Changed registry key names to the "new ones" * * 4 9/21/98 11:58a Nate * The section name is now NULL, so all launcher registry values will be * written into the main Descent III key * * 3 8/10/98 10:44a Nate * Added Language selection support * * 2 8/05/98 4:52p Nate * Added registry reading and writing. * * 1 8/05/98 3:31p Nate * Initial Version * * $NoKeywords: $ */ #include "stdafx.h" #include "PsTypes.h" #include "D3Launch.h" #include "LaunchNames.h" // System Registry Functions char *szCompanyName = REG_COMPANY_NAME; char *szAppName = REG_APP_NAME; char *szSectionName = NULL; // Don't use a section name for the launcher // Removes a value from to the INI file. Passing // name=NULL will delete the section. void os_config_remove(char *section, char *name) { HKEY hKey = NULL; DWORD dwDisposition; char keyname[1024]; LONG lResult; if (section) { sprintf(keyname, "Software\\%s\\%s\\%s", szCompanyName, szAppName, section); } else { sprintf(keyname, "Software\\%s\\%s", szCompanyName, szAppName); } // remove the value if (!name) { if (!section) { ////mprintf( "Can't delete root key\n" ); goto Cleanup; } lResult = RegDeleteKey(HKEY_LOCAL_MACHINE, keyname); if (lResult != ERROR_SUCCESS) { ////mprintf( "Error removing registry key '%s'\n", name ); goto Cleanup; } } else { lResult = RegCreateKeyEx(HKEY_LOCAL_MACHINE, // Where to add it keyname, // name of key NULL, // DWORD reserved "", // Object class REG_OPTION_NON_VOLATILE, // Save to disk KEY_ALL_ACCESS, // Allows all changes NULL, // Default security attributes &hKey, // Location to store key &dwDisposition); // Location to store status of key if (lResult != ERROR_SUCCESS) { // mprintf( "Error opening registry key '%s'\n", keyname ); goto Cleanup; } lResult = RegDeleteValue(hKey, name); if (lResult != ERROR_SUCCESS) { // mprintf( "Error removing registry value '%s'\n", name ); goto Cleanup; } } Cleanup: if (hKey) RegCloseKey(hKey); } // Writes a string to the INI file. If value is NULL, // removes the string. Writing a NULL value to a NULL name will delete // the section. void os_config_write_string(char *section, char *name, char *value) { HKEY hKey = NULL; DWORD dwDisposition; char keyname[1024]; LONG lResult; if (section) { sprintf(keyname, "Software\\%s\\%s\\%s", szCompanyName, szAppName, section); } else { sprintf(keyname, "Software\\%s\\%s", szCompanyName, szAppName); } lResult = RegCreateKeyEx(HKEY_LOCAL_MACHINE, // Where to add it keyname, // name of key NULL, // DWORD reserved "", // Object class REG_OPTION_NON_VOLATILE, // Save to disk KEY_ALL_ACCESS, // Allows all changes NULL, // Default security attributes &hKey, // Location to store key &dwDisposition); // Location to store status of key if (lResult != ERROR_SUCCESS) { // mprintf( "Error opening registry key '%s'\n", keyname ); goto Cleanup; } if (!name) { // mprintf( "No variable name passed\n" ); goto Cleanup; } lResult = RegSetValueEx(hKey, // Handle to key name, // The values name NULL, // DWORD reserved REG_SZ, // null terminated string (CONST BYTE *)value, // value to set strlen(value)); // How many bytes to set if (lResult != ERROR_SUCCESS) { // mprintf( "Error writing registry key '%s'\n", name ); goto Cleanup; } Cleanup: if (hKey) RegCloseKey(hKey); } // same as previous function except we don't use the application name to build up the keyname void os_config_write_string2(char *section, char *name, char *value) { HKEY hKey = NULL; DWORD dwDisposition; char keyname[1024]; LONG lResult; if (section) { sprintf(keyname, "Software\\%s\\%s", szCompanyName, section); } else { sprintf(keyname, "Software\\%s", szCompanyName); } lResult = RegCreateKeyEx(HKEY_LOCAL_MACHINE, // Where to add it keyname, // name of key NULL, // DWORD reserved "", // Object class REG_OPTION_NON_VOLATILE, // Save to disk KEY_ALL_ACCESS, // Allows all changes NULL, // Default security attributes &hKey, // Location to store key &dwDisposition); // Location to store status of key if (lResult != ERROR_SUCCESS) { // mprintf( "Error opening registry key '%s'\n", keyname ); goto Cleanup; } if (!name) { // mprintf( "No variable name passed\n" ); goto Cleanup; } lResult = RegSetValueEx(hKey, // Handle to key name, // The values name NULL, // DWORD reserved REG_SZ, // null terminated string (CONST BYTE *)value, // value to set strlen(value)); // How many bytes to set if (lResult != ERROR_SUCCESS) { // mprintf( "Error writing registry key '%s'\n", name ); goto Cleanup; } Cleanup: if (hKey) RegCloseKey(hKey); } // Writes an uint32_t to the INI file. void os_config_write_uint(char *section, char *name, uint32_t value) { HKEY hKey = NULL; DWORD dwDisposition; char keyname[1024]; LONG lResult; if (section) { sprintf(keyname, "Software\\%s\\%s\\%s", szCompanyName, szAppName, section); } else { sprintf(keyname, "Software\\%s\\%s", szCompanyName, szAppName); } lResult = RegCreateKeyEx(HKEY_LOCAL_MACHINE, // Where to add it keyname, // name of key NULL, // DWORD reserved "", // Object class REG_OPTION_NON_VOLATILE, // Save to disk KEY_ALL_ACCESS, // Allows all changes NULL, // Default security attributes &hKey, // Location to store key &dwDisposition); // Location to store status of key if (lResult != ERROR_SUCCESS) { // mprintf( "Error opening registry key '%s'\n", keyname ); goto Cleanup; } if (!name) { // mprintf( "No variable name passed\n" ); goto Cleanup; } lResult = RegSetValueEx(hKey, // Handle to key name, // The values name NULL, // DWORD reserved REG_DWORD, // null terminated string (CONST BYTE *)&value, // value to set 4); // How many bytes to set if (lResult != ERROR_SUCCESS) { // mprintf( "Error writing registry key '%s'\n", name ); goto Cleanup; } Cleanup: if (hKey) RegCloseKey(hKey); } // Reads a string from the INI file. If default is passed, // and the string isn't found, returns ptr to default otherwise // returns NULL; Copy the return value somewhere before // calling os_read_string again, because it might reuse the // same buffer. static char tmp_string_data[1024]; char *os_config_read_string(char *section, char *name, char *default_value) { HKEY hKey = NULL; DWORD dwType, dwLen; char keyname[1024]; LONG lResult; if (section) { sprintf(keyname, "Software\\%s\\%s\\%s", szCompanyName, szAppName, section); } else { sprintf(keyname, "Software\\%s\\%s", szCompanyName, szAppName); } lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, // Where it is keyname, // name of key NULL, // DWORD reserved KEY_QUERY_VALUE, // Allows all changes &hKey); // Location to store key if (lResult != ERROR_SUCCESS) { // mprintf( "Error opening registry key '%s'\n", keyname ); goto Cleanup; } if (!name) { // mprintf( "No variable name passed\n" ); goto Cleanup; } dwLen = 1024; lResult = RegQueryValueEx(hKey, // Handle to key name, // The values name NULL, // DWORD reserved &dwType, // What kind it is (uint8_t *)&tmp_string_data, // value to set &dwLen); // How many bytes to set if (lResult != ERROR_SUCCESS) { // mprintf( "Error reading registry key '%s'\n", name ); goto Cleanup; } default_value = tmp_string_data; Cleanup: if (hKey) RegCloseKey(hKey); return default_value; } static char tmp_string_data_ex[1024]; char *os_config_read_string_ex(char *keyname, char *name, char *default_value) { HKEY hKey = NULL; DWORD dwType, dwLen; LONG lResult; lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, // Where it is keyname, // name of key NULL, // DWORD reserved KEY_QUERY_VALUE, // Allows all changes &hKey); // Location to store key if (lResult != ERROR_SUCCESS) { // mprintf( "Error opening registry key '%s'\n", keyname ); goto Cleanup; } if (!name) { // mprintf( "No variable name passed\n" ); goto Cleanup; } dwLen = 1024; lResult = RegQueryValueEx(hKey, // Handle to key name, // The values name NULL, // DWORD reserved &dwType, // What kind it is (uint8_t *)&tmp_string_data_ex, // value to set &dwLen); // How many bytes to set if (lResult != ERROR_SUCCESS) { // mprintf( "Error reading registry key '%s'\n", name ); goto Cleanup; } default_value = tmp_string_data_ex; Cleanup: if (hKey) RegCloseKey(hKey); return default_value; } char *os_config_read_string2(char *section, char *name, char *default_value) { HKEY hKey = NULL; DWORD dwType, dwLen; char keyname[1024]; LONG lResult; if (section) { sprintf(keyname, "Software\\%s\\%s", szCompanyName, section); } else { sprintf(keyname, "Software\\%s", szCompanyName); } lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, // Where it is keyname, // name of key NULL, // DWORD reserved KEY_QUERY_VALUE, // Allows all changes &hKey); // Location to store key if (lResult != ERROR_SUCCESS) { // mprintf( "Error opening registry key '%s'\n", keyname ); goto Cleanup; } if (!name) { // mprintf( "No variable name passed\n" ); goto Cleanup; } dwLen = 1024; lResult = RegQueryValueEx(hKey, // Handle to key name, // The values name NULL, // DWORD reserved &dwType, // What kind it is (uint8_t *)&tmp_string_data, // value to set &dwLen); // How many bytes to set if (lResult != ERROR_SUCCESS) { // mprintf( "Error reading registry key '%s'\n", name ); goto Cleanup; } default_value = tmp_string_data; Cleanup: if (hKey) RegCloseKey(hKey); return default_value; } // Reads a string from the INI file. Default_value must // be passed, and if 'name' isn't found, then returns default_value uint32_t os_config_read_uint(char *section, char *name, uint32_t default_value) { HKEY hKey = NULL; DWORD dwType, dwLen; char keyname[1024]; LONG lResult; uint32_t tmp_val; if (section) { sprintf(keyname, "Software\\%s\\%s\\%s", szCompanyName, szAppName, section); } else { sprintf(keyname, "Software\\%s\\%s", szCompanyName, szAppName); } lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, // Where it is keyname, // name of key NULL, // DWORD reserved KEY_QUERY_VALUE, // Allows all changes &hKey); // Location to store key if (lResult != ERROR_SUCCESS) { // mprintf( "Error opening registry key '%s'\n", keyname ); goto Cleanup; } if (!name) { // mprintf( "No variable name passed\n" ); goto Cleanup; } dwLen = 4; lResult = RegQueryValueEx(hKey, // Handle to key name, // The values name NULL, // DWORD reserved &dwType, // What kind it is (uint8_t *)&tmp_val, // value to set &dwLen); // How many bytes to set if (lResult != ERROR_SUCCESS) { // mprintf( "Error reading registry key '%s'\n", name ); goto Cleanup; } default_value = tmp_val; Cleanup: if (hKey) RegCloseKey(hKey); return default_value; }