/**********************************************************************/ /** 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; }