//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======// // // Purpose: Utilities for setting vproject settings // //===========================================================================// #ifdef _WIN32 #if !defined( _X360 ) #include #endif #include #include // _chmod #include #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