138 lines
3 KiB
C++
138 lines
3 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1997.
|
||
|
//
|
||
|
// File: regevent.hxx
|
||
|
//
|
||
|
// Contents: Classes for tracking registry changes
|
||
|
//
|
||
|
// Classes: CRegNotifyKey
|
||
|
// CRegChangeEvent
|
||
|
// CRegNotify
|
||
|
//
|
||
|
// History: 04-Jul-94 DwightKr Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CRegNotifyKey
|
||
|
//
|
||
|
// Purpose: An encapsulation of a registry key name
|
||
|
//
|
||
|
// History: 07-Jun-94 DwightKr Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
class CRegNotifyKey
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
CRegNotifyKey( const WCHAR * wcsRegKey );
|
||
|
|
||
|
protected:
|
||
|
|
||
|
//
|
||
|
// Name of key.
|
||
|
//
|
||
|
|
||
|
WCHAR _wcsKey[MAX_PATH];
|
||
|
UNICODE_STRING _KeyName;
|
||
|
OBJECT_ATTRIBUTES _ObjectAttr;
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CRegChangeEvent
|
||
|
//
|
||
|
// Purpose: Sets up basic functionality of waiting on a registry change event
|
||
|
//
|
||
|
// History: 07-Jun-94 DwightKr Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
class CRegChangeEvent : public CRegNotifyKey
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
CRegChangeEvent( const WCHAR * wcsRegKey, BOOL fDeferInit = FALSE );
|
||
|
~CRegChangeEvent();
|
||
|
|
||
|
const HANDLE GetEventHandle() const { return _regEvent.GetHandle(); }
|
||
|
const WCHAR * GetKeyName() const { return _wcsKey; }
|
||
|
|
||
|
void Reset();
|
||
|
void Register();
|
||
|
void Init();
|
||
|
|
||
|
private:
|
||
|
|
||
|
HANDLE _hKey;
|
||
|
IO_STATUS_BLOCK _IoStatus;
|
||
|
CEventSem _regEvent;
|
||
|
BOOL _fDeferInit;
|
||
|
BOOL _fNotifyEnabled;
|
||
|
};
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CRegNotify
|
||
|
//
|
||
|
// Purpose: APC based version of CRegChangeEvent
|
||
|
//
|
||
|
// History: 20-Feb-96 KyleP Created
|
||
|
// 16 Dec 97 AlanW Fixed race in Register/DisableNotification
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
class CRegNotify : public CRegNotifyKey
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
CRegNotify( const WCHAR * wcsRegKey );
|
||
|
|
||
|
void DisableNotification();
|
||
|
|
||
|
virtual void DoIt() = 0;
|
||
|
|
||
|
protected:
|
||
|
|
||
|
virtual ~CRegNotify();
|
||
|
|
||
|
private:
|
||
|
|
||
|
//
|
||
|
// Refcounting
|
||
|
//
|
||
|
|
||
|
void AddRef();
|
||
|
void Release();
|
||
|
|
||
|
void Register();
|
||
|
|
||
|
static void WINAPI APC( void * ApcContext,
|
||
|
IO_STATUS_BLOCK * IoStatusBlock,
|
||
|
ULONG Reserved );
|
||
|
|
||
|
//
|
||
|
// this is necessary so that if shutdown is called while processing an APC
|
||
|
// just before re-registering, DisableNotification to forbid Register from
|
||
|
// re-opening the key.
|
||
|
//
|
||
|
BOOL _fShutdown;
|
||
|
|
||
|
long _refCount;
|
||
|
HANDLE _hKey;
|
||
|
IO_STATUS_BLOCK _IoStatus;
|
||
|
|
||
|
CMutexSem _mtx;
|
||
|
};
|
||
|
|