749 lines
24 KiB
C++
749 lines
24 KiB
C++
|
/**********************************************************************/
|
||
|
/** Microsoft Windows/NT **/
|
||
|
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
|
||
|
/**********************************************************************/
|
||
|
|
||
|
/*
|
||
|
config.cpp
|
||
|
Registry Values for WINS
|
||
|
|
||
|
FILE HISTORY:
|
||
|
|
||
|
*/
|
||
|
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "config.h"
|
||
|
#include "tregkey.h"
|
||
|
|
||
|
// these are things not defined in winscnst.h.
|
||
|
|
||
|
// Registry Entries under HKEY_LOCAL_MACHINE\system\currentcontrolset\services\wins
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrRoot = _T("SYSTEM\\CurrentControlSet\\Services\\wins\\Parameters");
|
||
|
|
||
|
// consistency checking
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrCCRoot = _T("SYSTEM\\CurrentControlSet\\Services\\wins\\Parameters\\ConsistencyCheck");
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrCC = _T("ConsistencyCheck");
|
||
|
|
||
|
// default values for replication partners
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrDefaultsRoot = _T("SYSTEM\\CurrentControlSet\\Services\\wins\\Parameters\\Defaults");
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrPullDefaultsRoot = _T("SYSTEM\\CurrentControlSet\\Services\\wins\\Parameters\\Defaults\\Pull");
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrPushDefaultsRoot = _T("SYSTEM\\CurrentControlSet\\Services\\wins\\Parameters\\Defaults\\Push");
|
||
|
|
||
|
// entries under HKEY_LOCAL_MACHINE\system\currentcontrolset\services\wins\partnets\pull
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrPullRoot = _T("SYSTEM\\CurrentControlSet\\Services\\wins\\Partners\\Pull");
|
||
|
|
||
|
// entries under HKEY_LOCAL_MACHINE\system\currentcontrolset\services\wins\partnets\push
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrPushRoot = _T("SYSTEM\\CurrentControlSet\\Services\\wins\\Partners\\Push");
|
||
|
|
||
|
// per-replication partner parameters
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrNetBIOSName = _T("NetBIOSName");
|
||
|
|
||
|
// entry for global setting for persistence
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrPersistence = _T("PersistentRplOn");
|
||
|
|
||
|
// for determining system version
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrCurrentVersion = _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrWinVersion = _T("CurrentVersion");
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrSPVersion = _T("CSDVersion");
|
||
|
const CConfiguration::REGKEYNAME CConfiguration::lpstrBuildNumber = _T("CurrentBuildNumber");
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
CConfiguration::CConfiguration(CString strNetBIOSName)
|
||
|
Constructor
|
||
|
---------------------------------------------------------------------------*/
|
||
|
CConfiguration::CConfiguration(CString strNetBIOSName)
|
||
|
: m_strNetBIOSName(strNetBIOSName)
|
||
|
{
|
||
|
m_dwMajorVersion = 0;
|
||
|
m_dwMinorVersion = 0;
|
||
|
m_dwBuildNumber = 0;
|
||
|
m_dwServicePack = 0;
|
||
|
|
||
|
m_dwPushPersistence = 0;
|
||
|
m_dwPullPersistence = 0;
|
||
|
|
||
|
m_fIsAdmin = FALSE;
|
||
|
|
||
|
m_strDbName = _T("wins.mdb"); // default db name
|
||
|
}
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
CConfiguration::~CConfiguration()
|
||
|
Destructor
|
||
|
---------------------------------------------------------------------------*/
|
||
|
CConfiguration::~CConfiguration()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
CConfiguration:: operator =(const CConfiguration& configuration)
|
||
|
Overloaded assignment operator
|
||
|
---------------------------------------------------------------------------*/
|
||
|
CConfiguration&
|
||
|
CConfiguration:: operator =(const CConfiguration& configuration)
|
||
|
{
|
||
|
m_strNetBIOSName = configuration.m_strNetBIOSName;
|
||
|
m_strBackupPath = configuration.m_strBackupPath;
|
||
|
|
||
|
m_dwRefreshInterval = configuration.m_dwRefreshInterval;
|
||
|
m_dwTombstoneInterval = configuration.m_dwTombstoneInterval;
|
||
|
m_dwTombstoneTimeout = configuration.m_dwTombstoneTimeout;
|
||
|
m_dwVerifyInterval = configuration.m_dwVerifyInterval;
|
||
|
m_dwVersCountStart_LowWord = configuration.m_dwVersCountStart_LowWord;
|
||
|
m_dwVersCountStart_HighWord= configuration.m_dwVersCountStart_HighWord;
|
||
|
m_dwNumberOfWorkerThreads = configuration.m_dwNumberOfWorkerThreads;
|
||
|
|
||
|
m_fPullInitialReplication = configuration.m_fPullInitialReplication;
|
||
|
m_dwPullRetryCount = configuration.m_dwPullRetryCount;
|
||
|
m_dwPullTimeInterval = configuration.m_dwPullTimeInterval;
|
||
|
m_dwPullSpTime = configuration.m_dwPullSpTime;
|
||
|
|
||
|
m_fPushInitialReplication = configuration.m_fPushInitialReplication;
|
||
|
m_fPushReplOnAddrChange = configuration.m_fPushReplOnAddrChange;
|
||
|
m_dwPushUpdateCount = configuration.m_dwPushUpdateCount;
|
||
|
|
||
|
m_fRplOnlyWithPartners = configuration.m_fRplOnlyWithPartners;
|
||
|
m_fLogDetailedEvents = configuration.m_fLogDetailedEvents;
|
||
|
m_fBackupOnTermination = configuration.m_fBackupOnTermination;
|
||
|
m_fLoggingOn = configuration.m_fLoggingOn;
|
||
|
m_fMigrateOn = configuration.m_fMigrateOn;
|
||
|
|
||
|
m_fUseSelfFndPnrs = configuration.m_fUseSelfFndPnrs;
|
||
|
m_dwMulticastInt = configuration.m_dwMulticastInt;
|
||
|
m_dwMcastTtl = configuration.m_dwMcastTtl;
|
||
|
|
||
|
m_dwPullPersistence = configuration.m_dwPullPersistence;
|
||
|
m_dwPushPersistence = configuration.m_dwPushPersistence;
|
||
|
|
||
|
m_fBurstHandling = configuration.m_fBurstHandling;
|
||
|
m_dwBurstQueSize = configuration.m_dwBurstQueSize;
|
||
|
|
||
|
m_fPeriodicConsistencyCheck = configuration.m_fPeriodicConsistencyCheck;
|
||
|
m_fCCUseRplPnrs = configuration.m_fCCUseRplPnrs;
|
||
|
m_dwMaxRecsAtATime = configuration.m_dwMaxRecsAtATime;
|
||
|
m_dwCCTimeInterval = configuration.m_dwCCTimeInterval;
|
||
|
m_itmCCStartTime = configuration.m_itmCCStartTime;
|
||
|
|
||
|
m_dwMajorVersion = configuration.m_dwMajorVersion;
|
||
|
m_dwMinorVersion = configuration.m_dwMinorVersion;
|
||
|
m_dwBuildNumber = configuration.m_dwBuildNumber;
|
||
|
m_dwServicePack = configuration.m_dwServicePack;
|
||
|
|
||
|
m_fIsAdmin = configuration.m_fIsAdmin;
|
||
|
|
||
|
m_strDbPath = configuration.m_strDbPath;
|
||
|
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
CConfiguration::Touch()
|
||
|
{
|
||
|
HRESULT hr = hrOK;
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
CConfiguration::Load()
|
||
|
Reads the values from the registry
|
||
|
---------------------------------------------------------------------------*/
|
||
|
HRESULT
|
||
|
CConfiguration::Load(handle_t hBinding)
|
||
|
{
|
||
|
HRESULT hr = hrOK;
|
||
|
|
||
|
DWORD err = ERROR_SUCCESS;
|
||
|
CString strDefaultPullSpTime;
|
||
|
|
||
|
err = GetSystemVersion();
|
||
|
if (err)
|
||
|
return err;
|
||
|
|
||
|
RegKey rk;
|
||
|
err = rk.Open(HKEY_LOCAL_MACHINE, (LPCTSTR) lpstrRoot, KEY_READ, m_strNetBIOSName);
|
||
|
if (err)
|
||
|
{
|
||
|
// may not exist, try creating the key
|
||
|
err = rk.Create(HKEY_LOCAL_MACHINE,(LPCTSTR) lpstrRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, m_strNetBIOSName);
|
||
|
}
|
||
|
|
||
|
RegKey rkPull;
|
||
|
err = rkPull.Open(HKEY_LOCAL_MACHINE, (LPCTSTR) lpstrPullRoot, KEY_READ, m_strNetBIOSName);
|
||
|
if (err)
|
||
|
{
|
||
|
// may not exist, try creating the key
|
||
|
err = rkPull.Create(HKEY_LOCAL_MACHINE, (LPCTSTR)lpstrPullRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, m_strNetBIOSName);
|
||
|
}
|
||
|
|
||
|
RegKey rkPush;
|
||
|
err = rkPush.Open(HKEY_LOCAL_MACHINE, (LPCTSTR) lpstrPushRoot, KEY_READ, m_strNetBIOSName);
|
||
|
if (err)
|
||
|
{
|
||
|
// may not exist, try creating the key
|
||
|
err = rkPush.Create(HKEY_LOCAL_MACHINE, (LPCTSTR)lpstrPushRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, m_strNetBIOSName);
|
||
|
}
|
||
|
|
||
|
RegKey rkPullDefaults;
|
||
|
err = rkPullDefaults.Open(HKEY_LOCAL_MACHINE, (LPCTSTR) lpstrPullDefaultsRoot, KEY_READ, m_strNetBIOSName);
|
||
|
if (err)
|
||
|
{
|
||
|
// may not exist, try creating the key
|
||
|
err = rkPullDefaults.Create(HKEY_LOCAL_MACHINE, (LPCTSTR)lpstrPullDefaultsRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, m_strNetBIOSName);
|
||
|
}
|
||
|
|
||
|
RegKey rkPushDefaults;
|
||
|
err = rkPushDefaults.Open(HKEY_LOCAL_MACHINE, (LPCTSTR) lpstrPushDefaultsRoot, KEY_READ, m_strNetBIOSName);
|
||
|
if (err)
|
||
|
{
|
||
|
// may not exist, try creating the key
|
||
|
err = rkPushDefaults.Create(HKEY_LOCAL_MACHINE, (LPCTSTR)lpstrPushDefaultsRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, m_strNetBIOSName);
|
||
|
}
|
||
|
|
||
|
// if you could not locate the key, no point continuing
|
||
|
//if (err)
|
||
|
// return err;
|
||
|
|
||
|
// now query for the various values
|
||
|
err = ERROR_FILE_NOT_FOUND;
|
||
|
if (
|
||
|
((HKEY) rk == NULL) ||
|
||
|
(err = rk.QueryValue(WINSCNF_REFRESH_INTVL_NM, m_dwRefreshInterval)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_DO_BACKUP_ON_TERM_NM, (DWORD &) m_fBackupOnTermination)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_TOMBSTONE_INTVL_NM, m_dwTombstoneInterval)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_TOMBSTONE_TMOUT_NM, m_dwTombstoneTimeout)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_VERIFY_INTVL_NM, m_dwVerifyInterval)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_INIT_VERSNO_VAL_LW_NM, m_dwVersCountStart_LowWord)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_INIT_VERSNO_VAL_HW_NM, m_dwVersCountStart_HighWord)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_RPL_ONLY_W_CNF_PNRS_NM, (DWORD &) m_fRplOnlyWithPartners)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_LOG_DETAILED_EVTS_NM, (DWORD &) m_fLogDetailedEvents)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_LOG_FLAG_NM, (DWORD &) m_fLoggingOn)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_MIGRATION_ON_NM, (DWORD &) m_fMigrateOn))
|
||
|
)
|
||
|
{
|
||
|
if (err == ERROR_FILE_NOT_FOUND)
|
||
|
{
|
||
|
// This error is ok, because it just means
|
||
|
// that the registry entries did not exist
|
||
|
// for them yet. Set some acceptible default
|
||
|
// values.
|
||
|
m_fBackupOnTermination = FALSE;
|
||
|
m_dwVersCountStart_LowWord = 0;
|
||
|
m_dwVersCountStart_HighWord = 0;
|
||
|
m_fRplOnlyWithPartners = TRUE;
|
||
|
m_fLogDetailedEvents = FALSE;
|
||
|
m_fLoggingOn = TRUE;
|
||
|
m_fMigrateOn = FALSE;
|
||
|
|
||
|
m_dwNumberOfWorkerThreads = 1;
|
||
|
|
||
|
err = ERROR_SUCCESS;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// push stuff
|
||
|
if (
|
||
|
((HKEY) rkPush == NULL) ||
|
||
|
(err = rkPush.QueryValue(WINSCNF_INIT_TIME_RPL_NM, (DWORD &) m_fPushInitialReplication)) ||
|
||
|
(err = rkPush.QueryValue(WINSCNF_ADDCHG_TRIGGER_NM, (DWORD &) m_fPushReplOnAddrChange))
|
||
|
)
|
||
|
{
|
||
|
m_fPushInitialReplication = FALSE;
|
||
|
m_fPushReplOnAddrChange = FALSE;
|
||
|
|
||
|
err = ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
// pull stuff
|
||
|
if (
|
||
|
((HKEY) rkPull == NULL) ||
|
||
|
(err = rkPull.QueryValue(WINSCNF_INIT_TIME_RPL_NM, (DWORD &) m_fPullInitialReplication)) ||
|
||
|
(err = rkPull.QueryValue(WINSCNF_RETRY_COUNT_NM, m_dwPullRetryCount))
|
||
|
)
|
||
|
{
|
||
|
m_fPullInitialReplication = TRUE;
|
||
|
m_dwPullRetryCount = WINSCNF_MAX_COMM_RETRIES;
|
||
|
|
||
|
err = ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
// get the backup path.
|
||
|
if (err = rk.QueryValue(WINSCNF_BACKUP_DIR_PATH_NM, m_strBackupPath))
|
||
|
{
|
||
|
m_strBackupPath = "";
|
||
|
|
||
|
err = ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
// get the defaults for push update count and pull time interval.
|
||
|
if (
|
||
|
((HKEY) rkPushDefaults == NULL) ||
|
||
|
((HKEY) rkPullDefaults == NULL) ||
|
||
|
(err = rkPushDefaults.QueryValue(WINSCNF_UPDATE_COUNT_NM, m_dwPushUpdateCount)) ||
|
||
|
(err = rkPullDefaults.QueryValue(WINSCNF_RPL_INTERVAL_NM, m_dwPullTimeInterval))
|
||
|
)
|
||
|
{
|
||
|
// set defaults
|
||
|
m_dwPushUpdateCount = 0;
|
||
|
m_dwPullTimeInterval = 1800;
|
||
|
|
||
|
err = ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
// get the default pull sptime
|
||
|
err = rkPullDefaults.QueryValue(WINSCNF_SP_TIME_NM, strDefaultPullSpTime);
|
||
|
if (err == ERROR_FILE_NOT_FOUND)
|
||
|
{
|
||
|
m_dwPullSpTime = 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// a string was loaded so
|
||
|
// conver the string into a DWORD which is what we use
|
||
|
CIntlTime timeDefault(strDefaultPullSpTime);
|
||
|
|
||
|
m_dwPullSpTime = (DWORD) timeDefault;
|
||
|
}
|
||
|
|
||
|
// query for the multicast stuff
|
||
|
err = ERROR_FILE_NOT_FOUND;
|
||
|
if(
|
||
|
((HKEY) rk == NULL) ||
|
||
|
(err = rk.QueryValue(WINSCNF_USE_SELF_FND_PNRS_NM, (DWORD &) m_fUseSelfFndPnrs)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_MCAST_INTVL_NM, (DWORD &) m_dwMulticastInt)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_MCAST_TTL_NM, (DWORD &) m_dwMcastTtl))
|
||
|
)
|
||
|
{
|
||
|
// set the default values
|
||
|
if (err == ERROR_FILE_NOT_FOUND)
|
||
|
{
|
||
|
m_fUseSelfFndPnrs = FALSE;
|
||
|
m_dwMulticastInt = WINSCNF_DEF_MCAST_INTVL;
|
||
|
m_dwMcastTtl = WINSCNF_DEF_MCAST_TTL;
|
||
|
|
||
|
err = ERROR_SUCCESS;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// query for the global persistence stuff
|
||
|
err = ERROR_FILE_NOT_FOUND;
|
||
|
|
||
|
if(
|
||
|
((HKEY) rkPush == NULL) ||
|
||
|
((HKEY) rkPull == NULL) ||
|
||
|
(err = rkPush.QueryValue(lpstrPersistence, (DWORD &) m_dwPushPersistence)) ||
|
||
|
(err = rkPull.QueryValue(lpstrPersistence, (DWORD &) m_dwPullPersistence))
|
||
|
)
|
||
|
{
|
||
|
// set the default values
|
||
|
if (err == ERROR_FILE_NOT_FOUND)
|
||
|
{
|
||
|
m_dwPushPersistence = 1;
|
||
|
m_dwPullPersistence = 1;
|
||
|
|
||
|
err = ERROR_SUCCESS;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// query for the burst handling stuff
|
||
|
err = ERROR_FILE_NOT_FOUND;
|
||
|
if(
|
||
|
((HKEY) rk == NULL) ||
|
||
|
(err = rk.QueryValue(WINSCNF_BURST_HANDLING_NM, (DWORD &) m_fBurstHandling)) ||
|
||
|
(err = rk.QueryValue(WINSCNF_BURST_QUE_SIZE_NM, (DWORD &) m_dwBurstQueSize))
|
||
|
)
|
||
|
{
|
||
|
// set the default values
|
||
|
if (err == ERROR_FILE_NOT_FOUND)
|
||
|
{
|
||
|
// SP4 and greater burst handling is turned on by default
|
||
|
// RamC changed m_dwServicePack == 4 check to
|
||
|
// m_dwServicePack >= 4
|
||
|
if ( (m_dwMajorVersion == 4 && m_dwServicePack >= 4) ||
|
||
|
(m_dwMajorVersion >= 5) )
|
||
|
{
|
||
|
m_fBurstHandling = TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_fBurstHandling = FALSE;
|
||
|
}
|
||
|
|
||
|
m_dwBurstQueSize = WINS_QUEUE_HWM;
|
||
|
|
||
|
err = ERROR_SUCCESS;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// read in the db name
|
||
|
CString strDb;
|
||
|
|
||
|
if (err = rk.QueryValue(WINSCNF_DB_FILE_NM, strDb))
|
||
|
{
|
||
|
m_strDbPath = _T("%windir%\\system32\\wins");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// take off the trailing filename
|
||
|
int nLastBack = strDb.ReverseFind('\\');
|
||
|
if (nLastBack != -1)
|
||
|
{
|
||
|
m_strDbPath = strDb.Left(nLastBack);
|
||
|
m_strDbName = strDb.Right(strDb.GetLength() - nLastBack - 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// consistency checking
|
||
|
RegKey rkCC;
|
||
|
err = rkCC.Open(HKEY_LOCAL_MACHINE, lpstrCCRoot, KEY_READ, m_strNetBIOSName);
|
||
|
if (err == ERROR_FILE_NOT_FOUND)
|
||
|
{
|
||
|
// not there, use defaults
|
||
|
m_fPeriodicConsistencyCheck = FALSE;
|
||
|
m_fCCUseRplPnrs = FALSE;
|
||
|
m_dwMaxRecsAtATime = WINSCNF_CC_DEF_RECS_AAT;
|
||
|
m_dwCCTimeInterval = WINSCNF_CC_DEF_INTERVAL;
|
||
|
|
||
|
CIntlTime timeDefault(_T("02:00:00"));
|
||
|
m_itmCCStartTime = timeDefault;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_fPeriodicConsistencyCheck = TRUE;
|
||
|
|
||
|
CString strSpTime;
|
||
|
|
||
|
// read in the values
|
||
|
if (err = rkCC.QueryValue(WINSCNF_CC_MAX_RECS_AAT_NM, m_dwMaxRecsAtATime))
|
||
|
{
|
||
|
m_dwMaxRecsAtATime = WINSCNF_CC_DEF_RECS_AAT;
|
||
|
}
|
||
|
|
||
|
if (err = rkCC.QueryValue(WINSCNF_CC_USE_RPL_PNRS_NM, (DWORD &) m_fCCUseRplPnrs))
|
||
|
{
|
||
|
m_fCCUseRplPnrs = FALSE;
|
||
|
}
|
||
|
|
||
|
if (err = rkCC.QueryValue(WINSCNF_SP_TIME_NM, strSpTime))
|
||
|
{
|
||
|
strSpTime = _T("02:00:00");
|
||
|
}
|
||
|
|
||
|
CIntlTime time(strSpTime);
|
||
|
m_itmCCStartTime = time;
|
||
|
|
||
|
if (err = rkCC.QueryValue(WINSCNF_CC_INTVL_NM, m_dwCCTimeInterval))
|
||
|
{
|
||
|
m_dwCCTimeInterval = WINSCNF_CC_DEF_INTERVAL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
GetAdminStatus();
|
||
|
|
||
|
// Now read the "live" values and override the values read from the registry
|
||
|
if (hBinding)
|
||
|
{
|
||
|
WINSINTF_RESULTS_T Results;
|
||
|
|
||
|
Results.WinsStat.NoOfPnrs = 0;
|
||
|
Results.WinsStat.pRplPnrs = NULL;
|
||
|
Results.NoOfWorkerThds = 1;
|
||
|
|
||
|
#ifdef WINS_CLIENT_APIS
|
||
|
err = ::WinsStatus(hBinding, WINSINTF_E_CONFIG, &Results);
|
||
|
#else
|
||
|
err = ::WinsStatus(WINSINTF_E_CONFIG, &Results);
|
||
|
#endif WINS_CLIENT_APIS
|
||
|
|
||
|
m_dwRefreshInterval = Results.RefreshInterval;
|
||
|
m_dwTombstoneInterval = Results.TombstoneInterval;
|
||
|
m_dwTombstoneTimeout = Results.TombstoneTimeout;
|
||
|
m_dwVerifyInterval = Results.VerifyInterval;
|
||
|
m_dwNumberOfWorkerThreads = Results.NoOfWorkerThds;
|
||
|
|
||
|
if (err != ERROR_SUCCESS)
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
CConfiguration::Store()
|
||
|
Stores back the values to the registry
|
||
|
---------------------------------------------------------------------------*/
|
||
|
HRESULT
|
||
|
CConfiguration::Store()
|
||
|
{
|
||
|
HRESULT hr = hrOK;
|
||
|
|
||
|
DWORD err;
|
||
|
|
||
|
RegKey rk;
|
||
|
RegKey rkPull;
|
||
|
RegKey rkPush;
|
||
|
RegKey rkUser;
|
||
|
RegKey rkPullDefaults;
|
||
|
RegKey rkPushDefaults;
|
||
|
RegKey rkCC;
|
||
|
|
||
|
err = rk.Create(HKEY_LOCAL_MACHINE,(LPCTSTR) lpstrRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, m_strNetBIOSName);
|
||
|
err = rkPull.Create(HKEY_LOCAL_MACHINE, (LPCTSTR)lpstrPullRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, m_strNetBIOSName);
|
||
|
err= rkPush.Create(HKEY_LOCAL_MACHINE, (LPCTSTR)lpstrPushRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, m_strNetBIOSName);
|
||
|
err = rkPullDefaults.Create(HKEY_LOCAL_MACHINE, (LPCTSTR)lpstrPullDefaultsRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, m_strNetBIOSName);
|
||
|
err = rkPushDefaults.Create(HKEY_LOCAL_MACHINE, (LPCTSTR)lpstrPushDefaultsRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,NULL, m_strNetBIOSName);
|
||
|
|
||
|
if (err)
|
||
|
return err;
|
||
|
|
||
|
if(
|
||
|
(err = rk.SetValue(WINSCNF_REFRESH_INTVL_NM, m_dwRefreshInterval)) ||
|
||
|
(err = rk.SetValue(WINSCNF_DO_BACKUP_ON_TERM_NM, (DWORD &) m_fBackupOnTermination)) ||
|
||
|
(err = rk.SetValue(WINSCNF_TOMBSTONE_INTVL_NM, m_dwTombstoneInterval)) ||
|
||
|
(err = rk.SetValue(WINSCNF_TOMBSTONE_TMOUT_NM, m_dwTombstoneTimeout)) ||
|
||
|
(err = rk.SetValue(WINSCNF_VERIFY_INTVL_NM, m_dwVerifyInterval)) ||
|
||
|
(err = rk.SetValue(WINSCNF_INIT_VERSNO_VAL_LW_NM, m_dwVersCountStart_LowWord)) ||
|
||
|
(err = rk.SetValue(WINSCNF_INIT_VERSNO_VAL_HW_NM, m_dwVersCountStart_HighWord)) ||
|
||
|
(err = rk.SetValue(WINSCNF_RPL_ONLY_W_CNF_PNRS_NM, (DWORD &) m_fRplOnlyWithPartners)) ||
|
||
|
(err = rk.SetValue(WINSCNF_LOG_DETAILED_EVTS_NM, (DWORD &) m_fLogDetailedEvents)) ||
|
||
|
(err = rk.SetValue(WINSCNF_LOG_FLAG_NM, (DWORD &) m_fLoggingOn)) ||
|
||
|
(err = rk.SetValue(WINSCNF_MIGRATION_ON_NM, (DWORD &) m_fMigrateOn)) ||
|
||
|
|
||
|
(err = rkPush.SetValue(WINSCNF_INIT_TIME_RPL_NM, (DWORD &) m_fPushInitialReplication)) ||
|
||
|
(err = rkPush.SetValue(WINSCNF_ADDCHG_TRIGGER_NM, (DWORD &) m_fPushReplOnAddrChange)) ||
|
||
|
(err = rkPush.SetValue(lpstrPersistence, m_dwPushPersistence)) ||
|
||
|
|
||
|
(err = rkPull.SetValue(WINSCNF_INIT_TIME_RPL_NM, (DWORD &) m_fPullInitialReplication)) ||
|
||
|
(err = rkPull.SetValue(WINSCNF_RETRY_COUNT_NM, m_dwPullRetryCount)) ||
|
||
|
(err = rkPull.SetValue(lpstrPersistence, m_dwPullPersistence)) ||
|
||
|
|
||
|
(err = rkPushDefaults.SetValue(WINSCNF_UPDATE_COUNT_NM, m_dwPushUpdateCount)) ||
|
||
|
(err = rkPullDefaults.SetValue(WINSCNF_RPL_INTERVAL_NM, m_dwPullTimeInterval)) ||
|
||
|
|
||
|
(err = rk.SetValue(WINSCNF_USE_SELF_FND_PNRS_NM, (DWORD &) m_fUseSelfFndPnrs)) ||
|
||
|
(err = rk.SetValue(WINSCNF_MCAST_INTVL_NM, m_dwMulticastInt)) ||
|
||
|
(err = rk.SetValue(WINSCNF_MCAST_TTL_NM, m_dwMcastTtl)) ||
|
||
|
|
||
|
(err = rk.SetValue(WINSCNF_BURST_HANDLING_NM, (DWORD &) m_fBurstHandling)) ||
|
||
|
(err = rk.SetValue(WINSCNF_BURST_QUE_SIZE_NM, m_dwBurstQueSize))
|
||
|
)
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
if (m_dwPullSpTime)
|
||
|
{
|
||
|
CIntlTime timeDefaultPullSpTime(m_dwPullSpTime);
|
||
|
|
||
|
err = rkPullDefaults.SetValue(WINSCNF_SP_TIME_NM, timeDefaultPullSpTime.IntlFormat(CIntlTime::TFRQ_MILITARY_TIME));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
rkPullDefaults.DeleteValue(WINSCNF_SP_TIME_NM);
|
||
|
}
|
||
|
|
||
|
// Consistency checking
|
||
|
if (m_fPeriodicConsistencyCheck)
|
||
|
{
|
||
|
err = rkCC.Open(HKEY_LOCAL_MACHINE, lpstrCCRoot, KEY_ALL_ACCESS, m_strNetBIOSName);
|
||
|
if (err == ERROR_FILE_NOT_FOUND)
|
||
|
{
|
||
|
// isn't there, need to create
|
||
|
err = rkCC.Create(HKEY_LOCAL_MACHINE, lpstrCCRoot, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, m_strNetBIOSName);
|
||
|
if (err)
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
// now update values
|
||
|
if (
|
||
|
(err = rkCC.SetValue(WINSCNF_CC_MAX_RECS_AAT_NM, m_dwMaxRecsAtATime)) ||
|
||
|
(err = rkCC.SetValue(WINSCNF_CC_USE_RPL_PNRS_NM, (DWORD &) m_fCCUseRplPnrs)) ||
|
||
|
(err = rkCC.SetValue(WINSCNF_SP_TIME_NM, m_itmCCStartTime.IntlFormat(CIntlTime::TFRQ_MILITARY_TIME))) ||
|
||
|
(err = rkCC.SetValue(WINSCNF_CC_INTVL_NM, m_dwCCTimeInterval))
|
||
|
)
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
err = rkCC.Open(HKEY_LOCAL_MACHINE, lpstrCCRoot, KEY_ALL_ACCESS, m_strNetBIOSName);
|
||
|
if (err == ERROR_FILE_NOT_FOUND)
|
||
|
{
|
||
|
// we're done. to turn this off, the key needs to be deleted
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// remove the key
|
||
|
rkCC.Close();
|
||
|
err = rk.RecurseDeleteKey(lpstrCC);
|
||
|
if (err)
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Database path
|
||
|
//
|
||
|
CString strDbFull;
|
||
|
|
||
|
strDbFull = m_strDbPath + _T("\\") + m_strDbName;
|
||
|
|
||
|
if ( (err = rk.SetValue(WINSCNF_DB_FILE_NM, strDbFull, TRUE)) ||
|
||
|
(err = rk.SetValue(WINSCNF_LOG_FILE_PATH_NM, m_strDbPath, TRUE)) )
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// NT 3.51 this key was REG_SZ, NT4 and above it is REG_EXPAND_SZ
|
||
|
//
|
||
|
BOOL fRegExpand = (m_dwMajorVersion < 4) ? FALSE : TRUE;
|
||
|
|
||
|
err = rk.SetValue(WINSCNF_BACKUP_DIR_PATH_NM, m_strBackupPath, fRegExpand);
|
||
|
if (err)
|
||
|
return err;
|
||
|
|
||
|
return ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
CConfiguration::GetSystemVersion()
|
||
|
Reads the windows system version information
|
||
|
---------------------------------------------------------------------------*/
|
||
|
DWORD
|
||
|
CConfiguration::GetSystemVersion()
|
||
|
{
|
||
|
CString strBuf, strValue;
|
||
|
RegKey rk;
|
||
|
int nPos, nLength;
|
||
|
DWORD err = ERROR_SUCCESS;
|
||
|
|
||
|
err = rk.Open(HKEY_LOCAL_MACHINE, (LPCTSTR) lpstrCurrentVersion, KEY_READ, m_strNetBIOSName);
|
||
|
if (err)
|
||
|
return err;
|
||
|
|
||
|
// read the windows version and convert into our internal variables
|
||
|
err = rk.QueryValue(lpstrWinVersion, strBuf.GetBuffer(256), 256, FALSE);
|
||
|
strBuf.ReleaseBuffer();
|
||
|
if (err)
|
||
|
return err;
|
||
|
|
||
|
nPos = strBuf.Find('.');
|
||
|
nLength = strBuf.GetLength();
|
||
|
|
||
|
strValue = strBuf.Left(nPos);
|
||
|
m_dwMajorVersion = _ttoi(strValue);
|
||
|
|
||
|
strValue = strBuf.Right(nLength - nPos - 1);
|
||
|
m_dwMinorVersion = _ttoi(strValue);
|
||
|
|
||
|
// now get the current build #
|
||
|
err = rk.QueryValue(lpstrBuildNumber, strBuf.GetBuffer(256), 256, FALSE);
|
||
|
strBuf.ReleaseBuffer();
|
||
|
if (err)
|
||
|
return err;
|
||
|
|
||
|
m_dwBuildNumber = _ttoi(strBuf);
|
||
|
|
||
|
// and finally the SP #
|
||
|
err = rk.QueryValue(lpstrSPVersion, strBuf.GetBuffer(256), 256, FALSE);
|
||
|
strBuf.ReleaseBuffer();
|
||
|
|
||
|
if (err == ERROR_FILE_NOT_FOUND)
|
||
|
{
|
||
|
// this may not be there if a SP hasn't been installed.
|
||
|
return ERROR_SUCCESS;
|
||
|
}
|
||
|
else
|
||
|
if (err)
|
||
|
{
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
CString strServicePack = _T("Service Pack ");
|
||
|
|
||
|
nLength = strBuf.GetLength();
|
||
|
strValue = strBuf.Right(nLength - strServicePack.GetLength());
|
||
|
|
||
|
m_dwServicePack = _ttoi(strValue);
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
CConfiguration::GetAdminStatus()
|
||
|
{
|
||
|
DWORD err = 0, dwDummy = 0;
|
||
|
RegKey rk;
|
||
|
|
||
|
err = rk.Open(HKEY_LOCAL_MACHINE, (LPCTSTR) lpstrRoot, KEY_ALL_ACCESS, m_strNetBIOSName);
|
||
|
if (!err)
|
||
|
{
|
||
|
m_fIsAdmin = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
CConfiguration::IsNt5()
|
||
|
{
|
||
|
if (m_dwMajorVersion >= 5)
|
||
|
return TRUE;
|
||
|
else
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// NT4 didn't support passing back the ownerId when we querried for bunches
|
||
|
// of records. Querrying for a specific record will return the correct
|
||
|
// owner id in all cases. This was fixed in NT5 and back proped into NT4
|
||
|
// SP6.
|
||
|
//
|
||
|
BOOL
|
||
|
CConfiguration::FSupportsOwnerId()
|
||
|
{
|
||
|
// if ( IsNt5() ||
|
||
|
// ( (m_dwMajorVersion == 4) &&
|
||
|
// (m_dwServicePack >= 6) ) )
|
||
|
if ( m_dwMajorVersion >= 5)
|
||
|
{
|
||
|
return TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
CConfiguration::IsAdmin()
|
||
|
{
|
||
|
return m_fIsAdmin;
|
||
|
}
|