|
|
/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
reg.hxx
Abstract:
contains class definition for registry access.
Author:
Madan Appiah (madana) 19-Dec-1994
Environment:
User Mode - Win32
Revision History:
--*/
#ifndef CACHE_REG
#define CACHE_REG
#define DEFAULT_KEY_ACCESS ( KEY_QUERY_VALUE | \
KEY_SET_VALUE | \ KEY_CREATE_SUB_KEY | \ KEY_ENUMERATE_SUB_KEYS )
#define BASIC_ACCESS ( KEY_QUERY_VALUE | \
KEY_ENUMERATE_SUB_KEYS )
#define DEFAULT_CLASS TEXT("DefaultClass")
#define DEFAULT_CLASS_SIZE sizeof(DEFAULT_CLASS)
#define MAX_KEY_SIZE 64 + 1
#define SERVICES_KEY \
TEXT("System\\CurrentControlSet\\Services\\")
#define FAIL_IF_KEY_NOT_EXISTS 0
#define CREATE_KEY_IF_NOT_EXISTS 1
typedef struct _KEY_QUERY_INFO { TCHAR Class[DEFAULT_CLASS_SIZE]; DWORD ClassSize; DWORD NumSubKeys; DWORD MaxSubKeyLen; DWORD MaxClassLen; DWORD NumValues; DWORD MaxValueNameLen; DWORD MaxValueLen; DWORD SecurityDescriptorLen; FILETIME LastWriteTime; } KEY_QUERY_INFO, *LPKEY_QUERY_INFO;
/*++
Class Description:
Defines a REGISTRY class that manipulates the registry keys.
Public Member functions:
Create : is a overloaded function that creates a subkey.
GetValue : is a overloaded function that retrieves REG_DWORD, REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ AND REG_BINARY data values.
SetValue : is a overloaded function that sets REG_DWORD, REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ AND REG_BINARY data values.
GetNumSubKeys : returns number of subkeys under this key object. DeleteKey : deletes a subkey node.
FindFirstKey : returns the first subkey of this key. FindNextKey : returns the next subkey of this key. --*/
class REGISTRY_OBJ {
private:
HKEY _RegHandle; DWORD _Status; DWORD _Index; DWORD _ValIndex; DWORD _dwAccess;
public:
REGISTRY_OBJ( HKEY Handle = NULL, DWORD Error = ERROR_SUCCESS ); REGISTRY_OBJ( HKEY ParentHandle, LPTSTR KeyName, DWORD dwFlags = FAIL_IF_KEY_NOT_EXISTS ) { _dwAccess = DEFAULT_KEY_ACCESS; _RegHandle = NULL; WorkWith(ParentHandle, KeyName, dwFlags); }
REGISTRY_OBJ( REGISTRY_OBJ *ParentObj, LPTSTR KeyName, DWORD dwFlags = FAIL_IF_KEY_NOT_EXISTS) { _dwAccess = DEFAULT_KEY_ACCESS; _RegHandle = NULL; WorkWith(ParentObj, KeyName, dwFlags); }
~REGISTRY_OBJ( VOID ) { if( _RegHandle != NULL ) { REGCLOSEKEY( _RegHandle ); } return; };
DWORD WorkWith( HKEY ParentHandle, LPTSTR KeyName, DWORD dwFlags = FAIL_IF_KEY_NOT_EXISTS, DWORD dwAccess = DEFAULT_KEY_ACCESS); DWORD WorkWith( REGISTRY_OBJ *ParentObj, LPTSTR KeyName, DWORD dwFlags = FAIL_IF_KEY_NOT_EXISTS );
DWORD GetStatus( VOID ) { return( _Status ); };
DWORD GetAccessFlags( VOID ) { return( _dwAccess ); };
DWORD Create( LPTSTR ChildName, HKEY *pChildHandle = NULL ); DWORD Create( LPTSTR ChildName, REGISTRY_OBJ **ChildObj ); DWORD Create( LPTSTR ChildName, REGISTRY_OBJ **ChildObj, DWORD *KeyDisposition );
DWORD GetValue( LPTSTR ValueName, DWORD *Data ); DWORD GetValue( LPTSTR ValueName, LPTSTR *Data, DWORD *NumStrings ); DWORD GetValue( LPTSTR ValueName, LPBYTE *Data, DWORD *DataLen ); DWORD GetValue( LPTSTR ValueName, LPBYTE Data, DWORD *DataLen );
DWORD SetValue( LPTSTR ValueName, LPDWORD Data ); DWORD SetValue( LPTSTR ValueName, LPTSTR Data, DWORD StringType ); DWORD SetValue( LPSTR ValueName, LPSTR Data, DWORD DataLen, DWORD StringType ); DWORD SetValue( LPTSTR ValueName, LPBYTE Data, DWORD DataLen );
DWORD GetKeyInfo( LPKEY_QUERY_INFO QueryInfo ) {
DWORD Error; QueryInfo->ClassSize = DEFAULT_CLASS_SIZE;
Error = RegQueryInfoKey( _RegHandle, QueryInfo->Class, &QueryInfo->ClassSize, NULL, &QueryInfo->NumSubKeys, &QueryInfo->MaxSubKeyLen, &QueryInfo->MaxClassLen, &QueryInfo->NumValues, &QueryInfo->MaxValueNameLen, &QueryInfo->MaxValueLen, &QueryInfo->SecurityDescriptorLen, &QueryInfo->LastWriteTime );
return( Error ); }
DWORD GetNumSubKeys(DWORD *NumSubKeys ) {
DWORD Error; KEY_QUERY_INFO QueryInfo;
Error = GetKeyInfo( &QueryInfo );
if( Error == ERROR_SUCCESS ) { *NumSubKeys = QueryInfo.NumSubKeys; }
return( Error ); }
DWORD DeleteKey( LPTSTR ChildKeyName ); DWORD DeleteValue( LPTSTR ValueName );
DWORD FindNextKey( LPTSTR Key, DWORD KeySize ); DWORD FindFirstKey( LPTSTR Key, DWORD KeySize ) { _Index = 0; return( FindNextKey(Key, KeySize) ); };
DWORD FindNextValue( LPSTR ValueName, DWORD ValueSize, LPBYTE Data, DWORD *DataLen ); DWORD FindFirstValue( LPSTR ValueName, DWORD ValueSize, LPBYTE Data, DWORD *DataLen ) { _ValIndex = 0; return( FindNextValue(ValueName, ValueSize, Data, DataLen ) ); }; DWORD GetValueSizeAndType( LPTSTR ValueName, LPDWORD ValueSize, LPDWORD ValueType ) { *ValueSize = 0; // we are passing null buffer to get the size
return RegQueryValueEx( _RegHandle, ValueName, 0, ValueType, NULL, ValueSize); }
};
#endif
|