windows-nt/Source/XPSP1/NT/inetsrv/query/h/regevent.hxx

138 lines
3 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+-------------------------------------------------------------------------
//
// 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;
};