339 lines
9 KiB
C++
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 );
|
||
|
|
||
|
}
|
||
|
|
||
|
|