windows-nt/Source/XPSP1/NT/com/svcdlls/trksvcs/common/config.cxx
2020-09-26 16:20:57 +08:00

339 lines
9 KiB
C++

// 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 <pch.cxx>
#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>( _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>( _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>( _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>( _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>( _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 );
}