/*++ 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: Sean Woodward (t-seanwo) 26-October-1997 ADSI Update --*/ #define DEFAULT_KEY_ACCESS ( KEY_QUERY_VALUE | \ KEY_SET_VALUE | \ KEY_CREATE_SUB_KEY | \ KEY_ENUMERATE_SUB_KEYS ) #define DEFAULT_CLASS L"DefaultClass" #define DEFAULT_CLASS_SIZE sizeof(DEFAULT_CLASS) #define MAX_KEY_SIZE 64 + 1 #define SERVICES_KEY \ L"System\\CurrentControlSet\\Services\\" typedef struct _KEY_QUERY_INFO { WCHAR 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 GetValueSizeAndType( LPWSTR ValueName, LPDWORD ValueSize, LPDWORD ValueType ); public: REGISTRY_OBJ( HKEY Handle, DWORD Error ); REGISTRY_OBJ( HKEY ParentHandle, LPWSTR KeyName ); REGISTRY_OBJ( REGISTRY_OBJ *ParentObj, LPWSTR KeyName ); ~REGISTRY_OBJ( VOID ) { if( _RegHandle != NULL ) { RegCloseKey( _RegHandle ); } return; }; DWORD GetStatus( VOID ) { return( _Status ); }; DWORD Create( LPWSTR ChildName ); DWORD Create( LPWSTR ChildName, REGISTRY_OBJ **ChildObj ); DWORD Create( LPWSTR ChildName, REGISTRY_OBJ **ChildObj, DWORD *KeyDisposition ); DWORD GetValue( LPWSTR ValueName, DWORD *Data ); DWORD GetValue( LPWSTR ValueName, LPWSTR *Data, DWORD *NumStrings ); DWORD GetValue( LPWSTR ValueName, LPBYTE *Data, DWORD *DataLen ); DWORD GetValue( LPWSTR ValueName, LPBYTE Data, DWORD *DataLen ); DWORD SetValue( LPWSTR ValueName, LPDWORD Data ); DWORD SetValue( LPWSTR ValueName, LPWSTR Data, DWORD StringType ); DWORD SetValue( LPSTR ValueName, LPSTR Data, DWORD DataLen, DWORD StringType ); DWORD SetValue( LPWSTR ValueName, LPBYTE Data, DWORD DataLen ); DWORD GetKeyInfo( LPKEY_QUERY_INFO QueryInfo ) { DWORD Error; QueryInfo->ClassSize = DEFAULT_CLASS_SIZE; Error = RegQueryInfoKeyW( _RegHandle, (LPWSTR)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( LPWSTR ChildKeyName ); DWORD FindNextKey( LPWSTR Key, DWORD KeySize ); DWORD FindFirstKey( LPWSTR 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 ) ); }; };