mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-10 04:31:34 -10:00
507 lines
13 KiB
C++
507 lines
13 KiB
C++
/*
|
|
* Copyright (C) Volition, Inc. 1999. All rights reserved.
|
|
*
|
|
* All source code herein is the property of Volition, Inc. You may not sell
|
|
* or otherwise commercially exploit the source or things you created based on the
|
|
* source.
|
|
*
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#include <string.h>
|
|
#include "globalincs/pstypes.h"
|
|
#include "osapi/osregistry.h"
|
|
|
|
|
|
|
|
// NEVER ADD ANY OTHER INCLUDES HERE - YOU'LL LIKELY BREAK THE LAUNCHER!!!!!!!!!!!!!
|
|
|
|
// ------------------------------------------------------------------------------------------------------------
|
|
// REGISTRY DEFINES/VARS
|
|
//
|
|
|
|
static char szCompanyName[128];
|
|
static char szAppName[128];
|
|
static char szAppVersion[128];
|
|
|
|
char *Osreg_company_name = "Volition";
|
|
char *Osreg_class_name = "Freespace2Class";
|
|
/*
|
|
#if defined(FS2_DEMO)
|
|
char *Osreg_app_name = "FreeSpace2Demo";
|
|
char *Osreg_title = "Freespace 2 Demo";
|
|
#elif defined(OEM_BUILD)
|
|
char *Osreg_app_name = "FreeSpace2OEM";
|
|
char *Osreg_title = "Freespace 2 OEM";
|
|
#else
|
|
*/
|
|
|
|
// RT Lets make all versions use the same registry location
|
|
// If we dont the launcher either needs to handle somehow telling what release type a
|
|
// FS2 exe is or it wont work. Its far similar to just use one default location.
|
|
// The Launcher will set up everything needed
|
|
char *Osreg_app_name = "FreeSpace2";
|
|
char *Osreg_title = "Freespace 2";
|
|
//#endif
|
|
|
|
int Os_reg_inited = 0;
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------------------
|
|
// REGISTRY FUNCTIONS
|
|
//
|
|
|
|
// os registry functions -------------------------------------------------------------
|
|
|
|
// initialize the registry. setup default keys to use
|
|
void os_init_registry_stuff(char *company, char *app, char *version)
|
|
{
|
|
if(company){
|
|
strcpy( szCompanyName, company );
|
|
} else {
|
|
strcpy( szCompanyName, Osreg_company_name);
|
|
}
|
|
|
|
if(app){
|
|
strcpy( szAppName, app );
|
|
} else {
|
|
strcpy( szAppName, Osreg_app_name);
|
|
}
|
|
|
|
if(version){
|
|
strcpy( szAppVersion, version);
|
|
} else {
|
|
strcpy( szAppVersion, "1.0");
|
|
}
|
|
|
|
Os_reg_inited = 1;
|
|
}
|
|
|
|
// 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(!Os_reg_inited){
|
|
return;
|
|
}
|
|
|
|
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 ) {
|
|
goto Cleanup;
|
|
}
|
|
lResult = RegDeleteKey( HKEY_LOCAL_MACHINE, keyname );
|
|
if ( lResult != ERROR_SUCCESS ) {
|
|
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 ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
lResult = RegDeleteValue( hKey, name );
|
|
if ( lResult != ERROR_SUCCESS ) {
|
|
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(!Os_reg_inited){
|
|
return;
|
|
}
|
|
|
|
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 ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
if ( !name ) {
|
|
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) + 1 ); // How many bytes to set
|
|
|
|
if ( lResult != ERROR_SUCCESS ) {
|
|
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(!Os_reg_inited){
|
|
return;
|
|
}
|
|
|
|
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 ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
if ( !name ) {
|
|
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) + 1 ); // How many bytes to set
|
|
|
|
if ( lResult != ERROR_SUCCESS ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
|
|
Cleanup:
|
|
if ( hKey )
|
|
RegCloseKey(hKey);
|
|
}
|
|
|
|
// Writes an unsigned int to the INI file.
|
|
void os_config_write_uint( char *section, char *name, uint value )
|
|
{
|
|
HKEY hKey = NULL;
|
|
DWORD dwDisposition;
|
|
char keyname[1024];
|
|
LONG lResult;
|
|
|
|
if(!Os_reg_inited){
|
|
return;
|
|
}
|
|
|
|
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 ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
if ( !name ) {
|
|
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 ) {
|
|
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(!Os_reg_inited){
|
|
return NULL;
|
|
}
|
|
|
|
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 ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
if ( !name ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
dwLen = 1024;
|
|
lResult = RegQueryValueEx( hKey, // Handle to key
|
|
name, // The values name
|
|
NULL, // DWORD reserved
|
|
&dwType, // What kind it is
|
|
(ubyte *)&tmp_string_data, // value to set
|
|
&dwLen ); // How many bytes to set
|
|
|
|
if ( lResult != ERROR_SUCCESS ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
default_value = tmp_string_data;
|
|
|
|
Cleanup:
|
|
if ( hKey )
|
|
RegCloseKey(hKey);
|
|
|
|
return default_value;
|
|
}
|
|
|
|
// same as previous function except we don't use the application name to build up the keyname
|
|
char * os_config_read_string2( char *section, char *name, char *default_value )
|
|
{
|
|
HKEY hKey = NULL;
|
|
DWORD dwType, dwLen;
|
|
char keyname[1024];
|
|
LONG lResult;
|
|
|
|
if(!Os_reg_inited){
|
|
return NULL;
|
|
}
|
|
|
|
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 ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
if ( !name ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
dwLen = 1024;
|
|
lResult = RegQueryValueEx( hKey, // Handle to key
|
|
name, // The values name
|
|
NULL, // DWORD reserved
|
|
&dwType, // What kind it is
|
|
(ubyte *)&tmp_string_data, // value to set
|
|
&dwLen ); // How many bytes to set
|
|
|
|
if ( lResult != ERROR_SUCCESS ) {
|
|
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
|
|
uint os_config_read_uint( char *section, char *name, uint default_value )
|
|
{
|
|
HKEY hKey = NULL;
|
|
DWORD dwType, dwLen;
|
|
char keyname[1024];
|
|
LONG lResult;
|
|
uint tmp_val;
|
|
|
|
if(!Os_reg_inited){
|
|
return NULL;
|
|
}
|
|
|
|
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 ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
if ( !name ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
dwLen = 4;
|
|
lResult = RegQueryValueEx( hKey, // Handle to key
|
|
name, // The values name
|
|
NULL, // DWORD reserved
|
|
&dwType, // What kind it is
|
|
(ubyte *)&tmp_val, // value to set
|
|
&dwLen ); // How many bytes to set
|
|
|
|
if ( lResult != ERROR_SUCCESS ) {
|
|
goto Cleanup;
|
|
}
|
|
|
|
default_value = tmp_val;
|
|
|
|
Cleanup:
|
|
if ( hKey )
|
|
RegCloseKey(hKey);
|
|
|
|
return default_value;
|
|
}
|
|
|
|
// uses Ex versions of Windows registry functions
|
|
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
|
|
(ubyte *)&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;
|
|
}
|