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

97 lines
3.5 KiB
C++

//
// MODULE: RegistryMonitor.h
//
// PURPOSE: Monitor changes to the registry.
//
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 support@saltmine.com
//
// AUTHOR: Joe Mabel
//
// ORIGINAL DATE: 9-16-98
//
// NOTES:
//
// Version Date By Comments
//--------------------------------------------------------------------
// V3.0 09-16-98 JM
//
#if !defined(AFX_REGISTRYMONITOR_H__A3CFA77B_4D78_11D2_95F7_00C04FC22ADD__INCLUDED_)
#define AFX_REGISTRYMONITOR_H__A3CFA77B_4D78_11D2_95F7_00C04FC22ADD__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include "DirMonitor.h"
#include "apgtsregconnect.h"
class CThreadPool; // forward reference
class CHTMLLog; // forward reference
class CRegistryMonitor : public CAPGTSRegConnector
{
public:
enum ThreadStatus{eBeforeInit, eInit, eFail, eDefaulting, eWait, eRun, eExiting};
static CString ThreadStatusText(ThreadStatus ts);
private:
CDirectoryMonitor & m_DirectoryMonitor; // Need access to this because CRegistryMonitor
// will determine what directory needs to be monitored
// and what the criteria are for files "settling down"
HANDLE m_hThread;
HANDLE m_hevMonitorRequested; // event to wake up RegistryMonitorTask
// this allows it to be wakened other than
// by the registry change event. Currently used
// only for shutdown.
HANDLE m_hevInitialized; // event to be set when either:
// (1) CRegistryMonitor values have been initialized or
// from registry
// (2) We can't get registry access, so CRegistryMonitor
// default values will have to do
bool m_bMustStartDirMonitor; // initially true, false once we've given
// DirMonitor info as to what directory to
// monitor
bool m_bMustStartThreadPool; // initially true, false once we've set some size for the
// working-thread pool
HANDLE m_hevThreadIsShut; // event just to indicate exit of RegistryMonitorTask thread
bool m_bShuttingDown; // lets registry monitor thread know we're shutting down
DWORD m_dwErr; // status from starting the thread
ThreadStatus m_ThreadStatus;
time_t m_time; // time last changed ThreadStatus. Initialized
// to zero ==> unknown
CThreadPool * m_pThreadPool; // pointer to pool of working threads
CString m_strTopicName; // This string is ignored in the Online Troubleshooter.
// Done under the guise of binary compatibility.
CHTMLLog *m_pLog; // pointer to the logging object so that we can
// change the log file directory.
public:
CRegistryMonitor( CDirectoryMonitor & DirectoryMonitor, CThreadPool * pThreadPool,
const CString& strTopicName,
CHTMLLog *pLog ); // strTopicName is ignored in the Online Troubleshooter.
// Done under the guise of binary compatibility.
virtual ~CRegistryMonitor();
DWORD GetStatus(ThreadStatus &ts, DWORD & seconds);
// NOTE that this also provides many inherited CRegistryMonitor methods
private:
CRegistryMonitor(); // do not instantiate
void SetThreadStatus(ThreadStatus ts);
// just for use by own destructor
void ShutDown();
// functions for use by the DirectoryMonitorTask thread.
void Monitor();
void AckShutDown();
void LoadChangedRegistryValues();
// main function of the RegistryMonitorTask thread.
static UINT WINAPI RegistryMonitorTask(LPVOID lpParams);
};
#endif // !defined(AFX_REGISTRYMONITOR_H__A3CFA77B_4D78_11D2_95F7_00C04FC22ADD__INCLUDED_)