153 lines
4.6 KiB
C++
153 lines
4.6 KiB
C++
//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======//
|
|
//
|
|
// Purpose: Utilities for setting vproject settings
|
|
//
|
|
//===========================================================================//
|
|
|
|
#ifdef _WIN32
|
|
#if !defined( _X360 )
|
|
#include <windows.h>
|
|
#endif
|
|
#include <direct.h>
|
|
#include <io.h> // _chmod
|
|
#include <process.h>
|
|
#endif
|
|
#if defined( _X360 )
|
|
#include "xbox/xbox_win32stubs.h"
|
|
#endif
|
|
#include "vconfig.h"
|
|
|
|
// NOTE: This has to be the last file included!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
|
|
#ifdef _WIN32
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Returns the string value of a registry key
|
|
// Input : *pName - name of the subKey to read
|
|
// *pReturn - string buffer to receive read string
|
|
// size - size of specified buffer
|
|
//-----------------------------------------------------------------------------
|
|
bool GetVConfigRegistrySetting( const char *pName, char *pReturn, int size )
|
|
{
|
|
// Open the key
|
|
HKEY hregkey;
|
|
// Changed to HKEY_CURRENT_USER from HKEY_LOCAL_MACHINE
|
|
if ( RegOpenKeyEx( HKEY_CURRENT_USER, VPROJECT_REG_KEY, 0, KEY_QUERY_VALUE, &hregkey ) != ERROR_SUCCESS )
|
|
return false;
|
|
|
|
// Get the value
|
|
DWORD dwSize = size;
|
|
if ( RegQueryValueEx( hregkey, pName, NULL, NULL,(LPBYTE) pReturn, &dwSize ) != ERROR_SUCCESS )
|
|
return false;
|
|
|
|
// Close the key
|
|
RegCloseKey( hregkey );
|
|
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Sends a global system message to alert programs to a changed environment variable
|
|
//-----------------------------------------------------------------------------
|
|
void NotifyVConfigRegistrySettingChanged( void )
|
|
{
|
|
DWORD_PTR dwReturnValue = 0;
|
|
|
|
// Propagate changes so that environment variables takes immediate effect!
|
|
SendMessageTimeout( HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM) "Environment", SMTO_ABORTIFHUNG, 5000, &dwReturnValue );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Set the registry entry to a string value, under the given subKey
|
|
// Input : *pName - name of the subKey to set
|
|
// *pValue - string value
|
|
//-----------------------------------------------------------------------------
|
|
void SetVConfigRegistrySetting( const char *pName, const char *pValue, bool bNotify )
|
|
{
|
|
HKEY hregkey;
|
|
|
|
// Changed to HKEY_CURRENT_USER from HKEY_LOCAL_MACHINE
|
|
// Open the key
|
|
if ( RegCreateKeyEx(
|
|
HKEY_CURRENT_USER, // base key
|
|
VPROJECT_REG_KEY, // subkey
|
|
0, // reserved
|
|
0, // lpClass
|
|
0, // options
|
|
(REGSAM)KEY_ALL_ACCESS, // access desired
|
|
NULL, // security attributes
|
|
&hregkey, // result
|
|
NULL // tells if it created the key or not (which we don't care)
|
|
) != ERROR_SUCCESS )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Set the value to the string passed in
|
|
int nType = strchr( pValue, '%' ) ? REG_EXPAND_SZ : REG_SZ;
|
|
RegSetValueEx( hregkey, pName, 0, nType, (const unsigned char *)pValue, (int) strlen(pValue) );
|
|
|
|
// Notify other programs
|
|
if ( bNotify )
|
|
{
|
|
NotifyVConfigRegistrySettingChanged();
|
|
}
|
|
|
|
// Close the key
|
|
RegCloseKey( hregkey );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Removes the obsolete user keyvalue
|
|
// Input : *pName - name of the subKey to set
|
|
// *pValue - string value
|
|
//-----------------------------------------------------------------------------
|
|
bool RemoveObsoleteVConfigRegistrySetting( const char *pValueName, char *pOldValue, int size )
|
|
{
|
|
// Open the key
|
|
HKEY hregkey;
|
|
if ( RegOpenKeyEx( HKEY_CURRENT_USER, "Environment", 0, (REGSAM)KEY_ALL_ACCESS, &hregkey ) != ERROR_SUCCESS )
|
|
return false;
|
|
|
|
// Return the old state if they've requested it
|
|
if ( pOldValue != NULL )
|
|
{
|
|
DWORD dwSize = size;
|
|
|
|
// Get the value
|
|
if ( RegQueryValueEx( hregkey, pValueName, NULL, NULL,(LPBYTE) pOldValue, &dwSize ) != ERROR_SUCCESS )
|
|
return false;
|
|
}
|
|
|
|
// Remove the value
|
|
if ( RegDeleteValue( hregkey, pValueName ) != ERROR_SUCCESS )
|
|
return false;
|
|
|
|
// Close the key
|
|
RegCloseKey( hregkey );
|
|
|
|
// Notify other programs
|
|
NotifyVConfigRegistrySettingChanged();
|
|
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Take a user-defined environment variable and swap it out for the internally used one
|
|
//-----------------------------------------------------------------------------
|
|
|
|
bool ConvertObsoleteVConfigRegistrySetting( const char *pValueName )
|
|
{
|
|
char szValue[MAX_PATH];
|
|
if ( RemoveObsoleteVConfigRegistrySetting( pValueName, szValue, sizeof( szValue ) ) )
|
|
{
|
|
// Set it up the correct way
|
|
SetVConfigRegistrySetting( pValueName, szValue );
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
#endif
|