461 lines
15 KiB
C++
461 lines
15 KiB
C++
|
|
// Copyright (c) 1996-1999 Microsoft Corporation
|
|
|
|
|
|
#ifndef _CONFIG_HXX_
|
|
#define _CONFIG_HXX_ 1
|
|
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// CMultiTsz
|
|
//
|
|
// This class represents a multi-string (i.e. a REG_MULTISZ). A subscript
|
|
// operator overload is provided for access to the component strings. A
|
|
// multi-string is a series of strings, each null terminated, where the last
|
|
// string has an additional null terminator.
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
#define CMULTITSZ_SIZE MAX_PATH
|
|
|
|
class CMultiTsz
|
|
{
|
|
public:
|
|
|
|
CMultiTsz()
|
|
{
|
|
memset( _tsz, 0, sizeof(_tsz) );
|
|
_cStrings = 0;
|
|
}
|
|
|
|
public:
|
|
|
|
static ULONG MaxSize()
|
|
{
|
|
return( CMULTITSZ_SIZE );
|
|
}
|
|
|
|
const TCHAR* operator[]( int iRequest ) const
|
|
{
|
|
int iSearch = 0;
|
|
const TCHAR *ptszSearch = TEXT('\0') == _tsz[0] ? NULL : _tsz;
|
|
|
|
// Scan through the strings until we get the index we want
|
|
// or it goes off the end of the array.
|
|
|
|
while( ptszSearch && iSearch < iRequest )
|
|
{
|
|
ptszSearch += _tcslen(ptszSearch) + 1;
|
|
|
|
if( TEXT('\0') == *ptszSearch )
|
|
ptszSearch = NULL;
|
|
else
|
|
iSearch++;
|
|
}
|
|
|
|
return( ptszSearch );
|
|
}
|
|
|
|
CMultiTsz & operator=( const TCHAR* ptsz )
|
|
{
|
|
memset( _tsz, 0, sizeof(_tsz) );
|
|
_tcsncpy( _tsz, ptsz, ELEMENTS(_tsz)-1 );
|
|
return(*this);
|
|
}
|
|
|
|
LPBYTE GetBuffer()
|
|
{
|
|
_cStrings = 0;
|
|
return( reinterpret_cast<LPBYTE>(&_tsz[0]) );
|
|
}
|
|
|
|
// Randomly select one of the strings to return.
|
|
operator const TCHAR*()
|
|
{
|
|
CalcNumStringsIf();
|
|
|
|
if( 1 >= _cStrings )
|
|
return( _tsz );
|
|
else
|
|
{
|
|
DWORD dwRandom = static_cast<DWORD>(static_cast<LONGLONG>( CFILETIME() ));
|
|
int iRandom = dwRandom % _cStrings;
|
|
return( (*this)[ iRandom ] );
|
|
}
|
|
}
|
|
|
|
ULONG NumStrings()
|
|
{
|
|
CalcNumStringsIf();
|
|
return( _cStrings );
|
|
}
|
|
|
|
|
|
private:
|
|
|
|
void CalcNumStringsIf()
|
|
{
|
|
if( 0 == _cStrings )
|
|
CalcNumStrings();
|
|
}
|
|
|
|
void CalcNumStrings()
|
|
{
|
|
const TCHAR *ptszSearch = _tsz;
|
|
|
|
_cStrings = 0;
|
|
while( TEXT('\0') != ptszSearch[0] )
|
|
{
|
|
_cStrings++;
|
|
ptszSearch += _tcslen(ptszSearch) + 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
TCHAR _tsz[ CMULTITSZ_SIZE ];
|
|
ULONG _cStrings;
|
|
};
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------//
|
|
//
|
|
// CTrkConfiguration
|
|
//
|
|
// Common configuration code for both services, in the form of the
|
|
// CTrkConfiguration base class (inherited by CTrkWksConfiguration and
|
|
// CTrkSvrConfiguration).
|
|
//
|
|
//-------------------------------------------------------------------//
|
|
|
|
// CTrkConfiguration, CTrkWksConfiguration, and CTrkSvrConfiguration
|
|
// hold the configurable parameters for the two services.
|
|
|
|
// The base registry key under which the derived classes put a sub-key
|
|
extern const TCHAR s_tszKeyNameLinkTrack[];
|
|
|
|
// The CTrkConfiguration base class provides a generic enough
|
|
// Read method that it can be used by both of the derived classes.
|
|
|
|
#define TRK_TEST_FLAGS_NAME TEXT("TestFlags")
|
|
|
|
#define TRK_TEST_FLAG_CALL_SERVER 0x00000001
|
|
#define TRK_TEST_FLAG_WAIT_ON_EXIT 0x00000002
|
|
#define TRK_TEST_FLAG_SET_VOLUME_ID 0x00000004
|
|
#define TRK_TEST_FLAG_MOVE_BATCH_SYNC 0x00000008
|
|
#define TRK_TEST_FLAG_TUNNEL_SYNC 0x00000010
|
|
#define TRK_TEST_FLAG_ALLOC_TEST_VOLUME 0x00000020
|
|
|
|
#define TRK_TEST_FLAGS_DEFAULT 0
|
|
|
|
// DC name to use instead of calling DsGetDcName. Setting this
|
|
// causes RPC security (Kerberos) *not* to be used.
|
|
#define CUSTOM_DC_NAME_NAME TEXT("CustomDcName")
|
|
#define CUSTOM_DC_NAME_DEFAULT TEXT("")
|
|
|
|
// Similar to CustomDcName, except secure RPC is still used.
|
|
// If CustomDcName is set, it takes precedence.
|
|
#define CUSTOM_SECURE_DC_NAME_NAME TEXT("CustomSecureDcName")
|
|
#define CUSTOM_SECURE_DC_NAME_DEFAULT TEXT("")
|
|
|
|
// Filename for status log
|
|
#define OPERATION_LOG_NAME_NAME TEXT("OperationLogName")
|
|
#define OPERATION_LOG_NAME_DEFAULT TEXT("")
|
|
|
|
#define TRK_DEBUG_FLAGS_NAME TEXT("TrkDebugFlags")
|
|
#define TRK_DEBUG_FLAGS_DEFAULT TRKDBG_ERROR // (0xFFFFFFFF & ~TRKDBG_WORKMAN) == 0xff7fffff
|
|
|
|
#define DEBUG_STORE_FLAGS_NAME TEXT("DebugStoreFlags")
|
|
#define DEBUG_STORE_FLAGS_DEFAULT TRK_DBG_FLAGS_WRITE_TO_DBG
|
|
|
|
class CTrkConfiguration
|
|
{
|
|
|
|
public:
|
|
|
|
CTrkConfiguration()
|
|
{
|
|
_fInitialized = FALSE;
|
|
_hkey = NULL;
|
|
_dwTestFlags = 0;
|
|
_dwDebugFlags = 0;
|
|
}
|
|
~CTrkConfiguration()
|
|
{
|
|
UnInitialize();
|
|
}
|
|
|
|
DWORD GetTestFlags() const { return _dwTestFlags; }
|
|
|
|
void Initialize();
|
|
void UnInitialize();
|
|
|
|
static BOOL UseOperationLog()
|
|
{
|
|
return( 0 != _mtszOperationLog.NumStrings() );
|
|
}
|
|
|
|
static const TCHAR* GetOperationLog()
|
|
{
|
|
return( _mtszOperationLog[0] );
|
|
}
|
|
|
|
|
|
protected:
|
|
|
|
void Read( const TCHAR *ptszName, DWORD *pdwValue, DWORD dwDefault ) const;
|
|
void Read( const TCHAR *ptszName, ULONG *pcbValue, TCHAR *ptszValue, TCHAR *ptszDefault ) const;
|
|
void Read( const TCHAR *ptszName, CMultiTsz *pmtszValue, TCHAR *ptszDefault ) const;
|
|
|
|
BOOL Write( const TCHAR *ptszName, DWORD dwValue ) const;
|
|
BOOL Write( const TCHAR *ptszName, const TCHAR *ptszValue ) const;
|
|
|
|
public:
|
|
|
|
BOOL _fInitialized;
|
|
HKEY _hkey;
|
|
DWORD _dwTestFlags;
|
|
DWORD _dwDebugFlags;
|
|
DWORD _dwDebugStoreFlags;
|
|
static CMultiTsz _mtszOperationLog;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#define TRKMINUTE 60
|
|
#define TRKHOUR (TRKMINUTE*60)
|
|
#define TRKDAY (TRKHOUR*24)
|
|
#define TRKWEEK (TRKDAY*7)
|
|
|
|
struct STrkConfigRecord
|
|
{
|
|
const TCHAR *ptszName;
|
|
DWORD dwDefault;
|
|
DWORD dwValue;
|
|
DWORD dwFlags;
|
|
#if DBG
|
|
DWORD Index;
|
|
#endif
|
|
};
|
|
|
|
// Flags
|
|
#define TRKCONFIG_STATIC 0 // Dynamic parameters can be changed
|
|
#define TRKCONFIG_DYNAMIC 1 // at run-time.
|
|
|
|
#if DBG
|
|
#define TRKCONFIGRECORD(v, w,x,y,z) { v, w, x, y, z }
|
|
#else
|
|
#define TRKCONFIGRECORD(v, w,x,y,z) { v, w, x, y }
|
|
#endif
|
|
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CTrkSvrConfiguration
|
|
//
|
|
// Purpose: Holds configuration parameters (registry-settable) for
|
|
// the Tracking (Server) Service.
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
#define HISTORY_PERIOD_NAME TEXT("HistoryPeriod")
|
|
#define HISTORY_PERIOD_DEFAULT 10 // Seconds
|
|
|
|
#define GC_PERIOD_NAME TEXT("GCPeriod")
|
|
#define GC_PERIOD_DEFAULT (30*TRKDAY)
|
|
|
|
#define GC_DIVISOR_NAME TEXT("GCDivisor")
|
|
#define GC_DIVISOR_DEFAULT 30
|
|
|
|
#define GC_MIN_CYCLES_NAME TEXT("GCMinCycles")
|
|
#define GC_MIN_CYCLES_DEFAULT 90
|
|
|
|
#define GC_HESITATION_NAME TEXT("GCHesitation")
|
|
#define GC_HESITATION_DEFAULT (30*TRKMINUTE)
|
|
|
|
#define GC_RETRY_NAME TEXT("GCRetry")
|
|
#define GC_RETRY_DEFAULT (30*TRKHOUR)
|
|
|
|
#define DC_UPDATE_COUNTER_PERIOD_NAME TEXT("DcUpdateCounterPeriod")
|
|
#define DC_UPDATE_COUNTER_PERIOD_DEFAULT (4*TRKHOUR)
|
|
|
|
#define MOVE_LIMIT_PER_VOLUME_LOWER_NAME TEXT("MoveLimitPerVolume")
|
|
#define MOVE_LIMIT_PER_VOLUME_LOWER_DEFAULT 200 // entries per volume
|
|
|
|
#define MOVE_LIMIT_PER_VOLUME_UPPER_NAME TEXT("MoveLimitPerVolumeUpper")
|
|
#define MOVE_LIMIT_PER_VOLUME_UPPER_DEFAULT 100 // entries per volume
|
|
|
|
#define MOVE_LIMIT_TRANSITION_NAME TEXT("MoveLimitPerVolumeTransition")
|
|
#define MOVE_LIMIT_TRANSITION_DEFAULT 5000
|
|
|
|
#define CACHE_MIN_TIME_TO_LIVE_NAME TEXT("CacheMinTimeToLive")
|
|
#define CACHE_MIN_TIME_TO_LIVE_DEFAULT (4*TRKHOUR)
|
|
|
|
#define CACHE_MAX_TIME_TO_LIVE_NAME TEXT("CacheMaxTimeToLive")
|
|
#define CACHE_MAX_TIME_TO_LIVE_DEFAULT TRKDAY
|
|
|
|
#define DESIGNATED_DC_CACHE_TTL_NAME TEXT("DesignatedDcCacheTTL")
|
|
#define DESIGNATED_DC_CACHE_TTL_DEFAULT (5*TRKMINUTE)
|
|
|
|
#define DESIGNATED_DC_CLEANUP_NAME TEXT("DesignatedDcCleanup")
|
|
#define DESIGNATED_DC_CLEANUP_DEFAULT (3*TRKDAY)
|
|
|
|
#define VOLUME_TABLE_LIMIT_NAME TEXT("VolumeLimit")
|
|
#define VOLUME_TABLE_LIMIT_DEFAULT 26 // entries per machine
|
|
|
|
#define SVR_MAX_RPC_CALLS_NAME TEXT("SvrMaxRpcCallsName")
|
|
#define SVR_MAX_RPC_CALLS_DEFAULT 20
|
|
|
|
#define MAX_DS_WRITES_PER_HOUR_NAME TEXT("MaxDsWritesPerHour")
|
|
#define MAX_DS_WRITES_PER_HOUR_DEFAULT 1000
|
|
|
|
#define MAX_DS_WRITES_PERIOD_NAME TEXT("MaxDsWritesPeriod")
|
|
#define MAX_DS_WRITES_PERIOD_DEFAULT TRKHOUR
|
|
|
|
#define REPETITIVE_TASK_DELAY_NAME TEXT("RepetitiveTaskDelay")
|
|
#define REPETITIVE_TASK_DELAY_DEFAULT 100 // Milliseconds
|
|
|
|
#define REFRESH_STORAGE_TTL_NAME TEXT("RefreshStorageTTL")
|
|
#define REFRESH_STORAGE_TTL_DEFAULT (5*TRKMINUTE)
|
|
|
|
class CTrkSvrConfiguration : public CTrkConfiguration
|
|
{
|
|
|
|
public:
|
|
|
|
inline CTrkSvrConfiguration();
|
|
inline ~CTrkSvrConfiguration();
|
|
|
|
public:
|
|
|
|
inline void Initialize();
|
|
inline void UnInitialize();
|
|
|
|
public:
|
|
|
|
DWORD GetHistoryPeriod() const { return _dwHistoryPeriod; }
|
|
DWORD GetGCPeriod() const { return _dwGCPeriod; }
|
|
DWORD GetGCMinCycles() const { return _dwGCMinCycles; }
|
|
DWORD GetGCDivisor() const { return _dwGCDivisor; }
|
|
DWORD GetGCHesitation() const { return _dwGCHesitation; }
|
|
DWORD GetGCRetry() const { return _dwGCRetry; }
|
|
DWORD GetVolumeQueryPeriods() const { return _dwVolumeQueryPeriods; }
|
|
DWORD GetVolumeQueryPeriod() const { return _dwVolumeQueryPeriod; }
|
|
DWORD GetDcUpdateCounterPeriod() const{ return _dwDcUpdateCounterPeriod; }
|
|
DWORD GetCacheMinTimeToLive() const { return _dwCacheMinTimeToLive; }
|
|
DWORD GetCacheMaxTimeToLive() const { return _dwCacheMaxTimeToLive; }
|
|
|
|
DWORD GetMoveLimitPerVolumeLower() const { return _dwMoveLimitPerVolumeLower; }
|
|
DWORD GetMoveLimitPerVolumeUpper() const { return _dwMoveLimitPerVolumeUpper; }
|
|
DWORD GetMoveLimitTransition() const { return _dwMoveLimitTransition; }
|
|
DWORD GetMoveLimitTimeToLive() const { return _dwMoveLimitTimeToLive; }
|
|
|
|
DWORD GetVolumeLimit() const { return _dwVolumeLimit; }
|
|
DWORD GetSvrMaxRpcCalls() const { return _dwSvrMaxRpcCalls; }
|
|
DWORD GetMaxDSWritesPerHour() const { return _dwMaxDSWritesPerHour; }
|
|
DWORD GetMaxDSWritesPeriod() const { return _dwMaxDSWritesPeriod; }
|
|
DWORD GetRepetitiveTaskDelay() const { return _dwRepetitiveTaskDelay; }
|
|
DWORD GetDesignatedDcCacheTTL() const { return _dwDesignatedDcCacheTTL; }
|
|
DWORD GetDesignatedDcCleanup() const { return _dwDesignatedDcCleanup; }
|
|
DWORD GetRefreshStorageTTL() const { return _dwRefreshStorageTTL; }
|
|
|
|
BOOL _fInitialized;
|
|
|
|
DWORD _dwHistoryPeriod; // Seconds
|
|
DWORD _dwGCPeriod; // Seconds
|
|
DWORD _dwGCDivisor;
|
|
DWORD _dwGCMinCycles; // Seconds
|
|
DWORD _dwGCHesitation;
|
|
DWORD _dwGCRetry;
|
|
DWORD _dwVolumeQueryPeriod; // Seconds
|
|
DWORD _dwVolumeQueryPeriods; // # of VolumeQueryPeriods
|
|
DWORD _dwDcUpdateCounterPeriod; // seconds
|
|
DWORD _dwCacheMinTimeToLive;
|
|
DWORD _dwCacheMaxTimeToLive;
|
|
DWORD _dwMoveLimitPerVolumeLower;
|
|
DWORD _dwMoveLimitPerVolumeUpper;
|
|
DWORD _dwMoveLimitTransition;
|
|
DWORD _dwMoveLimitTimeToLive; // seconds
|
|
DWORD _dwVolumeLimit; // # of entries
|
|
DWORD _dwSvrMaxRpcCalls;
|
|
DWORD _dwMaxDSWritesPerHour;
|
|
DWORD _dwMaxDSWritesPeriod;
|
|
DWORD _dwRepetitiveTaskDelay; // Milliseconds
|
|
DWORD _dwDesignatedDcCacheTTL;
|
|
DWORD _dwDesignatedDcCleanup;
|
|
DWORD _dwRefreshStorageTTL;
|
|
};
|
|
|
|
inline
|
|
CTrkSvrConfiguration::CTrkSvrConfiguration()
|
|
{
|
|
memset( this, 0, sizeof(*this) );
|
|
}
|
|
|
|
inline
|
|
CTrkSvrConfiguration::~CTrkSvrConfiguration()
|
|
{
|
|
UnInitialize();
|
|
}
|
|
|
|
|
|
inline VOID
|
|
CTrkSvrConfiguration::Initialize()
|
|
{
|
|
_fInitialized = TRUE;
|
|
|
|
CTrkConfiguration::Initialize( );
|
|
|
|
Read( HISTORY_PERIOD_NAME, &_dwHistoryPeriod, HISTORY_PERIOD_DEFAULT );
|
|
Read( GC_PERIOD_NAME, &_dwGCPeriod, GC_PERIOD_DEFAULT );
|
|
Read( GC_MIN_CYCLES_NAME, &_dwGCMinCycles, GC_MIN_CYCLES_DEFAULT );
|
|
Read( GC_DIVISOR_NAME, &_dwGCDivisor, GC_DIVISOR_DEFAULT );
|
|
Read( GC_HESITATION_NAME, &_dwGCHesitation, GC_HESITATION_DEFAULT );
|
|
Read( GC_RETRY_NAME, &_dwGCRetry, GC_RETRY_DEFAULT );
|
|
Read( DC_UPDATE_COUNTER_PERIOD_NAME, &_dwDcUpdateCounterPeriod, DC_UPDATE_COUNTER_PERIOD_DEFAULT);
|
|
Read( CACHE_MIN_TIME_TO_LIVE_NAME, &_dwCacheMinTimeToLive, CACHE_MIN_TIME_TO_LIVE_DEFAULT);
|
|
Read( CACHE_MAX_TIME_TO_LIVE_NAME, &_dwCacheMaxTimeToLive, CACHE_MAX_TIME_TO_LIVE_DEFAULT);
|
|
Read( MOVE_LIMIT_PER_VOLUME_LOWER_NAME, &_dwMoveLimitPerVolumeLower, MOVE_LIMIT_PER_VOLUME_LOWER_DEFAULT);
|
|
Read( MOVE_LIMIT_PER_VOLUME_UPPER_NAME, &_dwMoveLimitPerVolumeUpper, MOVE_LIMIT_PER_VOLUME_UPPER_DEFAULT);
|
|
Read( MOVE_LIMIT_TRANSITION_NAME, &_dwMoveLimitTransition, MOVE_LIMIT_TRANSITION_DEFAULT);
|
|
Read( VOLUME_TABLE_LIMIT_NAME, &_dwVolumeLimit, VOLUME_TABLE_LIMIT_DEFAULT);
|
|
Read( SVR_MAX_RPC_CALLS_NAME, &_dwSvrMaxRpcCalls, SVR_MAX_RPC_CALLS_DEFAULT );
|
|
Read( MAX_DS_WRITES_PER_HOUR_NAME, &_dwMaxDSWritesPerHour, MAX_DS_WRITES_PER_HOUR_DEFAULT );
|
|
Read( MAX_DS_WRITES_PERIOD_NAME, &_dwMaxDSWritesPeriod, MAX_DS_WRITES_PERIOD_DEFAULT );
|
|
Read( REPETITIVE_TASK_DELAY_NAME, &_dwRepetitiveTaskDelay, REPETITIVE_TASK_DELAY_DEFAULT );
|
|
Read( DESIGNATED_DC_CACHE_TTL_NAME, &_dwDesignatedDcCacheTTL, DESIGNATED_DC_CACHE_TTL_DEFAULT );
|
|
Read( DESIGNATED_DC_CLEANUP_NAME, &_dwDesignatedDcCleanup, DESIGNATED_DC_CLEANUP_DEFAULT );
|
|
Read( REFRESH_STORAGE_TTL_NAME, &_dwRefreshStorageTTL, REFRESH_STORAGE_TTL_DEFAULT );
|
|
|
|
// We've got our configuration cached, so we can uninit the base class
|
|
CTrkConfiguration::UnInitialize();
|
|
}
|
|
|
|
|
|
inline VOID
|
|
CTrkSvrConfiguration::UnInitialize()
|
|
{
|
|
if( _fInitialized )
|
|
{
|
|
CTrkConfiguration::UnInitialize();
|
|
_fInitialized = FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
#endif // #ifndef _CONFIG_HXX_
|