255 lines
9.7 KiB
C++
255 lines
9.7 KiB
C++
//
|
|
// MODULE: LOCALREGCONNECT.CPP
|
|
//
|
|
// PURPOSE: read - write to the registry; simulate this in some cases where Online TS uses
|
|
// registry, but Local TS doesn't
|
|
//
|
|
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 support@saltmine.com
|
|
//
|
|
// AUTHOR: Oleg Kalosha, Joe Mabel
|
|
//
|
|
// ORIGINAL DATE: 8-24-98 in Online TS
|
|
//
|
|
// NOTES:
|
|
// 1. This file is for Local TS only
|
|
// 2. If we are moving toward a COM object at some point, we will probably have to establish an
|
|
// abstract class in lieu of CAPGTSRegConnector and have Online & Local TS's each derive their
|
|
// own version. Meanwhile (1/99), we share a common interface (defined in APGTSRegConnect.h)
|
|
// but implement it differently.
|
|
// 3. >>> WORK IN PROGRESS !!!! JM 1/19/98
|
|
//
|
|
// Version Date By Comments
|
|
//--------------------------------------------------------------------
|
|
// V3.0 08-04-98 OK
|
|
// V3.0 09-10-98 JM backslashing; access log file info
|
|
// V3.1 01-19-98 JM branch out version exclusively for Local TS
|
|
|
|
#pragma warning(disable:4786)
|
|
|
|
#include "stdafx.h"
|
|
#include "apgtsregconnect.h"
|
|
#include "event.h"
|
|
#include "apgtsevt.h"
|
|
#include "apgtscls.h"
|
|
#include "apgts.h"
|
|
#include "apiwraps.h"
|
|
#include "CHMFileReader.h"
|
|
|
|
#define REG_LOCAL_TS_LOC _T("SOFTWARE\\Microsoft")
|
|
LPCTSTR CAPGTSRegConnector::RegSoftwareLoc() {return REG_LOCAL_TS_LOC;}
|
|
#define REG_LOCAL_TS_PROGRAM _T("TShoot")
|
|
LPCTSTR CAPGTSRegConnector::RegThisProgram() {return REG_LOCAL_TS_PROGRAM;}
|
|
// subordinate key, child to the above and parent to keys for individual troubleshooter topics.
|
|
#define REG_LOCAL_TS_LIST _T("TroubleshooterList")
|
|
// where the topic-specific resource path is located ("\TroubleshooterList\Topic_name\Path"):
|
|
#define TOPICRESOURCE_STR _T("Path")
|
|
// where the topic-specific resource path is located ("\TroubleshooterList\Topic_name\Path"):
|
|
#define TOPICFILE_EXTENSION_STR _T("FExtension")
|
|
|
|
// registry value defaults
|
|
// Most relevant values differ from Online TS
|
|
|
|
// (Looks like old Local TS uses the same default resource path as Online TS, so we'll
|
|
// preserve that here >>> till we work out what's right - JM 1/19/99)
|
|
#define DEF_FULLRESOURCE _T("c:\\inetsrv\\scripts\\apgts\\resource")
|
|
|
|
#define DEF_VROOTPATH _T("/scripts/apgts/apgts.dll") // (irrelevant in Local TS)
|
|
#define DEF_MAX_THREADS 1 // only 1 pool thread in Local TS
|
|
#define DEF_THREADS_PER_PROCESSOR 1 // only 1 pool thread in Local TS
|
|
#define DEF_MAX_WORK_QUEUE_ITEMS 1 // only 1 work queue item at a time in Local TS
|
|
#define DEF_COOKIE_LIFE_IN_MINS 90 // (irrelevant in Local TS)
|
|
#define DEF_RELOAD_DELAY 50 // (irrelevant in Local TS)
|
|
#define DEF_DETAILED_EVENT_LOGGING 0
|
|
#define DEF_TOPICFILE_EXTENSION _T(".dsc")
|
|
#define DEF_SNIFF_AUTOMATIC 1
|
|
#define DEF_SNIFF_MANUAL 1
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
// CAPGTSRegConnector::CRegistryInfo
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
void CAPGTSRegConnector::CRegistryInfo::SetToDefault()
|
|
{
|
|
// Attempt to extract a default resource path based upon the DLL name.
|
|
// It was a deliberate decision to utilize the existing global module handle.
|
|
strResourcePath= _T("");
|
|
if (INVALID_HANDLE_VALUE != ghModule)
|
|
{
|
|
// Build the default resource path from the module name.
|
|
DWORD len;
|
|
TCHAR szModulePath[MAXBUF];
|
|
CString strModulePath;
|
|
|
|
len = ::GetModuleFileName( reinterpret_cast<HMODULE>(ghModule), szModulePath, MAXBUF - 1 );
|
|
if (len!=0)
|
|
{
|
|
szModulePath[len] = _T('\0');
|
|
strModulePath = szModulePath;
|
|
strResourcePath = CAbstractFileReader::GetJustPath(strModulePath);
|
|
if (!strResourcePath.IsEmpty())
|
|
strResourcePath += _T("\\resource\\");
|
|
}
|
|
}
|
|
if (strResourcePath.IsEmpty())
|
|
strResourcePath = DEF_FULLRESOURCE;
|
|
|
|
strVrootPath = DEF_VROOTPATH;
|
|
dwMaxThreads = DEF_MAX_THREADS;
|
|
dwThreadsPP = DEF_THREADS_PER_PROCESSOR;
|
|
dwMaxWQItems = DEF_MAX_WORK_QUEUE_ITEMS;
|
|
dwCookieLife = DEF_COOKIE_LIFE_IN_MINS;
|
|
dwReloadDelay = DEF_RELOAD_DELAY;
|
|
dwDetailedEventLogging = DEF_DETAILED_EVENT_LOGGING;
|
|
dwSniffAutomatic = DEF_SNIFF_AUTOMATIC;
|
|
dwSniffManual = DEF_SNIFF_MANUAL;
|
|
strLogFilePath = DEF_FULLRESOURCE;
|
|
strTopicFileExtension = DEF_TOPICFILE_EXTENSION;
|
|
m_bIsRead = false;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
// CAPGTSRegConnector
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
CAPGTSRegConnector::CAPGTSRegConnector(const CString& strTopicName)
|
|
: m_strTopicName(strTopicName)
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
// OUTPUT maskChanged or-ed ERegConnector-based mask of elements that have been
|
|
// changed since last read
|
|
// OUTPUT maskCreated In Online TS, this is
|
|
// or-ed ERegConnector-based mask of elements that were created
|
|
// in registry (because they previously didn't exist in registry)
|
|
// In Local TS, it always returns 0, because we don't do this.
|
|
void CAPGTSRegConnector::ReadUpdateRegistry(int & maskChanged, int & maskCreated)
|
|
{
|
|
CRegUtil reg;
|
|
bool was_created = false;
|
|
CString str_tmp;
|
|
DWORD dw_tmp = 0;
|
|
|
|
maskChanged = 0;
|
|
maskCreated = 0;
|
|
try
|
|
{
|
|
// [BC - 20010302] - Registry access needs to be restricted to run local TShoot
|
|
// for certain user accts, such as WinXP built in guest acct. To minimize change
|
|
// access only restricted for local TShoot, not online.
|
|
REGSAM samRegistryAccess= KEY_QUERY_VALUE | KEY_NOTIFY;
|
|
if(RUNNING_ONLINE_TS())
|
|
samRegistryAccess= KEY_QUERY_VALUE | KEY_WRITE;
|
|
if (reg.Create(HKEY_LOCAL_MACHINE, RegSoftwareLoc(), &was_created, samRegistryAccess))
|
|
{
|
|
if(RUNNING_ONLINE_TS())
|
|
samRegistryAccess= KEY_READ | KEY_WRITE;
|
|
if (reg.Create(RegThisProgram(), &was_created, samRegistryAccess))
|
|
{
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Working in ...\TShoot root key
|
|
reg.GetNumericValue(SNIFF_AUTOMATIC_STR, m_RegistryInfo.dwSniffAutomatic);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Working in ...\TShoot root key
|
|
reg.GetNumericValue(SNIFF_MANUAL_STR, m_RegistryInfo.dwSniffManual);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// VROOTPATH_STR code suppressed in Local TS
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// MAX_THREADS_STR code suppressed in Local TS
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// THREADS_PER_PROCESSOR_STR code suppressed in Local TS
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// MAX_WORK_QUEUE_ITEMS_STR code suppressed in Local TS
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COOKIE_LIFE_IN_MINS_STR code suppressed in Local TS
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// RELOAD_DELAY_STR code suppressed in Local TS
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DETAILED_EVENT_LOGGING_STR code suppressed in Local TS
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Now opening subkeys
|
|
bool bFullResourceStrExists = reg.GetStringValue(FULLRESOURCE_STR, str_tmp);
|
|
bool bTopicResourceExists = false;
|
|
|
|
// check in troubleshooter list if topic-related resource path exists
|
|
// (it can be CHM file).
|
|
if (reg.Create(REG_LOCAL_TS_LIST, &was_created, KEY_READ))
|
|
{
|
|
if (reg.Create(m_strTopicName, &was_created, KEY_READ))
|
|
{
|
|
if (reg.GetStringValue(TOPICRESOURCE_STR, str_tmp))
|
|
{
|
|
if (CCHMFileReader::IsPathToCHMfile(str_tmp))
|
|
str_tmp = CCHMFileReader::FormCHMPath(str_tmp);
|
|
else
|
|
BackslashIt(str_tmp, true);
|
|
|
|
if (AssignString(m_RegistryInfo.strResourcePath, str_tmp,
|
|
EV_GTS_SERVER_REG_CHG_DIR) )
|
|
{
|
|
maskChanged |= eResourcePath;
|
|
}
|
|
bTopicResourceExists = true;
|
|
}
|
|
|
|
reg.GetStringValue(TOPICFILE_EXTENSION_STR, m_RegistryInfo.strTopicFileExtension);
|
|
}
|
|
}
|
|
|
|
if (bFullResourceStrExists && !bTopicResourceExists)
|
|
{
|
|
BackslashIt(str_tmp, true);
|
|
if (AssignString(m_RegistryInfo.strResourcePath, str_tmp,
|
|
EV_GTS_SERVER_REG_CHG_DIR) )
|
|
{
|
|
maskChanged |= eResourcePath;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
throw CAPGTSRegConnectorException(__FILE__, __LINE__, reg, eProblemWithKey);
|
|
}
|
|
else
|
|
throw CAPGTSRegConnectorException(__FILE__, __LINE__, reg, eProblemWithKey);
|
|
|
|
reg.Close();
|
|
/* /////////////////////////////////////////////////////////////////////////
|
|
///// >>> We are not using logging so far in the Local TS. Oleg. 02.01.99 //
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// >>> The following may be irrelevant: I don't think we should ultimately be keeping
|
|
// such a log for Local TS. In any event, I've gotten rid of a bunch of certainly
|
|
// irrelevant code to read this from registry & make an entry in the event log. JM 1/19/99
|
|
// Set the log file path arbitrarily to the current setting of the resource path
|
|
m_RegistryInfo.strLogFilePath = m_RegistryInfo.strResourcePath;
|
|
|
|
// Set m_RegistryInfo.strLogFilePath to the setting from the registry.
|
|
// Note: The code here should remain identical with the code in the catch block
|
|
// below (excluding the call to throw of course).
|
|
BackslashIt( m_RegistryInfo.strLogFilePath, true);
|
|
*/
|
|
}
|
|
catch (CAPGTSRegConnectorException&)
|
|
{
|
|
// Set m_RegistryInfo.strLogFilePath = m_RegistryInfo.strResourcePath in the
|
|
// case where we could not get the log file path from the registry.
|
|
BackslashIt( m_RegistryInfo.strLogFilePath, true );
|
|
|
|
// Rethrow the exception upward to be logged.
|
|
throw;
|
|
}
|
|
}
|
|
|
|
// RETURN desired number of pool threads. In Local TS, this is always 1!
|
|
DWORD CAPGTSRegConnector::GetDesiredThreadCount()
|
|
{
|
|
return 1;
|
|
}
|
|
|