windows-nt/Source/XPSP1/NT/enduser/troubleshoot/tshoot/localregconnect.cpp
2020-09-26 16:20:57 +08:00

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