//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1998. // // File: RegAcc.hxx // // Contents: 'Simple' registry access // // History: 21-Dec-93 KyleP Created // //-------------------------------------------------------------------------- #pragma once //+------------------------------------------------------------------------- // // Function: Range // // Synopsis: Enforces bounds on a value // // History: 12-Oct-96 dlee created // //-------------------------------------------------------------------------- template T Range( T tDefault, T tMin, T tMax ) { return __min( __max( tDefault, tMin ), tMax ); } //Range //+------------------------------------------------------------------------- // // Class: CRegCallBack // // Purpose: CallBack class during enumeration // // History: 29-Aug-94 SitaramR Created // // //-------------------------------------------------------------------------- class CRegCallBack { public: virtual NTSTATUS CallBack( WCHAR *pValueName, ULONG uValueType, VOID *pValueData, ULONG uValueLength) = 0; virtual ~CRegCallBack() {} }; //+------------------------------------------------------------------------- // // Class: CRegAccess // // Purpose: 'Simple' registry access // // History: 21-Dec-93 KyleP Created // 12-Aug-98 KLam Added DoesKeyExist // 19-Aug-98 KLam Removed INHERIT_UNWIND & DECLARE_UNWIND // // Notes: This class provides read-only access to the registry. It // will work in both kernel and user mode. // //-------------------------------------------------------------------------- class CRegAccess { public: CRegAccess( ULONG ulRelative, WCHAR const * pwcsRegPath ); ~CRegAccess() { // CRegAccess is a global object, so this destructor can be called // potentially before any calls to operator new. Rather than // waste cycles in every delete, waste them here by checking for 0. if ( 0 != _wcsPath ) delete [] _wcsPath; } void Get( WCHAR const * pwcsValue, WCHAR * wcsVal, unsigned cc ); ULONG Get( WCHAR const * pwcsValue ); ULONG Read( WCHAR const * wcsKey, ULONG ulDefaultValue); ULONG Read( WCHAR const * wcsKey, ULONG ulDefault, ULONG ulMin, ULONG ulMax ) { return Range( Read( wcsKey, ulDefault ), ulMin, ulMax ); } WCHAR * Read( WCHAR const * wcsKey, WCHAR const * pwcsDefaultValue); void EnumerateValues( WCHAR *wszValue, CRegCallBack& regCallback ); // BOOL DoesKeyExist( WCHAR const * wcsKey ); private: static NTSTATUS CallBack( WCHAR *pValueName, ULONG uValueType, void *pValueData, ULONG uValueLength, void *pContext, void *pEntryContext ); static NTSTATUS CallBackDWORD( WCHAR *pValueName, ULONG uValueType, void *pValueData, ULONG uValueLength, void *pContext, void *pEntryContext ); void SetName( WCHAR const * pwc ) { _regtab[0].Name = (WCHAR *)pwc; } DWORD ReadDWORD( WCHAR const * wcsKey, ULONG *pDefaultValue ); void SetEntryContext( void * p) { if ( p == 0 ) { _regtab[0].EntryContext = 0; _regtab[0].Flags = RTL_QUERY_REGISTRY_REQUIRED; } else { _regtab[0].EntryContext = p; _regtab[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; } } ULONG _ulRelative; WCHAR _wcsPathBuf[100]; WCHAR * _wcsPath; RTL_QUERY_REGISTRY_TABLE _regtab[2]; // used for strings & enumeration };