// Copyright (c) 1996-1999 Microsoft Corporation //+============================================================================ // // config.cxx // // Common configuration code for both services, in the form of the // CTrkConfiguration base class (inherited by CTrkWksConfiguration and // CTrkSvrConfiguration). // //+============================================================================ #include #pragma hdrstop #include "trklib.hxx" CMultiTsz CTrkConfiguration::_mtszOperationLog; //+---------------------------------------------------------------------------- // // CTrkConfiguration::Initialize // // Open the main key (identified by the global s_tszKeyNameLinkTrack, // which is defined appropriately in trkwks.dll and trksvr.dll). Then // read global values that are applicable to both services: debug flags, // operation log filename, and test flags. // //+---------------------------------------------------------------------------- void CTrkConfiguration::Initialize() { ULONG lResult; TCHAR tszConfigurationKey[ MAX_PATH ]; _fInitialized = TRUE; _hkey = NULL; // Open the base key _tcscpy( tszConfigurationKey, s_tszKeyNameLinkTrack ); _tcscat( tszConfigurationKey, TEXT("\\") ); _tcscat( tszConfigurationKey, TEXT("Configuration") ); lResult = RegOpenKey( HKEY_LOCAL_MACHINE, tszConfigurationKey, &_hkey ); if( ERROR_SUCCESS != lResult && ERROR_PATH_NOT_FOUND != lResult && ERROR_FILE_NOT_FOUND != lResult ) { // We'll just make do without any custom configuration, rather than // making this a fatal error. TrkLog(( TRKDBG_ERROR, TEXT("Couldn't open Configuration key (%lu)"), lResult )); return; } // Read values that are common to trkwks & trksvr. Read( TRK_DEBUG_FLAGS_NAME, &_dwDebugFlags, TRK_DEBUG_FLAGS_DEFAULT ); // Copy these flags into the global debug flags (debug.cxx) IFDBG( g_grfDebugFlags = _dwDebugFlags; ) Read( DEBUG_STORE_FLAGS_NAME, &_dwDebugStoreFlags, DEBUG_STORE_FLAGS_DEFAULT ); Read( TRK_TEST_FLAGS_NAME, &_dwTestFlags, TRK_TEST_FLAGS_DEFAULT ); Read( OPERATION_LOG_NAME_NAME, &_mtszOperationLog, OPERATION_LOG_NAME_DEFAULT ); } //+---------------------------------------------------------------------------- // // CTrkConfiguration::UnInitialize // // Close the main reg key. // //+---------------------------------------------------------------------------- VOID CTrkConfiguration::UnInitialize() { if( _fInitialized ) { if( NULL != _hkey ) { RegCloseKey( _hkey ); _hkey = NULL; } _fInitialized = FALSE; } } //+---------------------------------------------------------------------------- // // CTrkConfiguration::Read( REG_DWORD ) // // Read a DWORD configuration parameter. Return the defaulut value // if not found. // //+---------------------------------------------------------------------------- VOID CTrkConfiguration::Read( const TCHAR *ptszName, DWORD *pdwValue, DWORD dwDefault ) const { *pdwValue = dwDefault; if( NULL != _hkey ) { LONG lResult; DWORD dwType; DWORD dwValue; DWORD cbValue = sizeof(dwValue); lResult = RegQueryValueEx( const_cast( _hkey ), ptszName, NULL, &dwType, (LPBYTE) &dwValue, &cbValue); if( ERROR_SUCCESS == lResult ) { if( REG_DWORD == dwType ) { *pdwValue = dwValue; TrkLog(( TRKDBG_MISC, TEXT("RegConfig: %s = 0x%x (%lu)"), ptszName, dwValue, dwValue )); } else TrkLog(( TRKDBG_ERROR, TEXT("Registry value is wrong type") )); } else if( ERROR_FILE_NOT_FOUND != lResult ) { TrkLog(( TRKDBG_ERROR, TEXT("Couldn't read %s from registry (%lu)"), ptszName, lResult )); } } return; } //+---------------------------------------------------------------------------- // // CTrkConfiguration::Read( REG_SZ ) // // Read a string configuration parameter. Return the default value // if not found. // //+---------------------------------------------------------------------------- VOID CTrkConfiguration::Read( const TCHAR *ptszName, ULONG *pcbValue, TCHAR *ptszValue, TCHAR *ptszDefault ) const { ULONG cbIn = *pcbValue; LONG lResult = ERROR_PATH_NOT_FOUND; DWORD dwType; if( NULL != _hkey ) { lResult = RegQueryValueEx( const_cast( _hkey ), ptszName, NULL, &dwType, (LPBYTE) ptszValue, pcbValue ); } if( ERROR_SUCCESS != lResult || REG_SZ != dwType ) { *pcbValue = 0; memset( ptszValue, 0, cbIn ); _tcscpy( ptszValue, ptszDefault ); } else { TrkLog(( TRKDBG_MISC, TEXT("RegConfig: %s = %s"), ptszName, ptszValue )); } return; } //+---------------------------------------------------------------------------- // // CTrkConfiguration::Read( REG_MULTI_SZ ) // // Read a string array configuration parameter. Return the default // value if not found. // //+---------------------------------------------------------------------------- VOID CTrkConfiguration::Read( const TCHAR *ptszName, CMultiTsz *pmtszValue, TCHAR *ptszDefault ) const { ULONG cbValue = pmtszValue->MaxSize(); LONG lResult = ERROR_PATH_NOT_FOUND; DWORD dwType; // Read the value if( NULL != _hkey ) { lResult = RegQueryValueEx( const_cast( _hkey ), ptszName, NULL, &dwType, pmtszValue->GetBuffer(), &cbValue ); } // Check the type if( ERROR_SUCCESS != lResult || (REG_SZ != dwType && REG_MULTI_SZ != dwType) ) { // It didn't exist, or was the wrong type. Return the default. *pmtszValue = ptszDefault; #if DBG if( ERROR_FILE_NOT_FOUND != lResult && ERROR_PATH_NOT_FOUND != lResult ) TrkLog(( TRKDBG_ERROR, TEXT("Couldn't read %s from registry (%lu)"), ptszName, lResult )); #endif } else { // We found the value. Dump the first three values to dbgout. #if DBG TCHAR tszValues[ sizeof(*pmtszValue) ]; _tcscpy( tszValues, TEXT("") ); for( int i = 0; i < 3; i++ ) { if( i >= (int) pmtszValue->NumStrings() ) break; _tcscat( tszValues, (*pmtszValue)[i] ); _tcscat( tszValues, TEXT(" ") ); } if( 3 < (int) pmtszValue->NumStrings() ) _tcscat( tszValues, TEXT("...") ); TrkLog(( TRKDBG_MISC, TEXT("RegConfig: %s = %s"), ptszName, tszValues )); #endif // #if DBG } return; } //+---------------------------------------------------------------------------- // // CTrkConfiguration::Write( REG_DWORD ) // // Write a DWORD configuration parameter. // //+---------------------------------------------------------------------------- BOOL CTrkConfiguration::Write( const TCHAR *ptszName, DWORD dwValue ) const { if( NULL != _hkey ) { LONG lResult; DWORD cbValue = sizeof(dwValue); lResult = RegSetValueEx( const_cast( _hkey ), ptszName, NULL, REG_DWORD, (LPBYTE) &dwValue, cbValue); if( ERROR_SUCCESS != lResult ) { TrkLog(( TRKDBG_ERROR, TEXT("Couldn't write %s to registry (%lu)"), ptszName, lResult )); return( FALSE ); } } return( TRUE ); } //+---------------------------------------------------------------------------- // // CTrkConfiguration::Write( REG_SZ ) // // Write a string configuration parameter. // //+---------------------------------------------------------------------------- BOOL CTrkConfiguration::Write( const TCHAR *ptszName, const TCHAR *ptszValue ) const { LONG lResult = ERROR_PATH_NOT_FOUND; if( NULL != _hkey ) { lResult = RegSetValueEx( const_cast( _hkey ), ptszName, NULL, REG_SZ, (LPBYTE) ptszValue, _tcslen(ptszValue) + 1 ); } if( ERROR_SUCCESS != lResult ) { TrkLog(( TRKDBG_ERROR, TEXT("Couldn't write %s to registry (%lu)"), ptszName, lResult )); return( FALSE ); } return( TRUE ); }