|
|
/******************************************************************************
* * $RCSfile: DrvReg.h $ * $Source: u:/si/VXP/Wdm/Classes/DrvReg.h $ * $Author: Max $ * $Date: 1998/09/15 23:39:30 $ * $Revision: 1.3 $ * * Written by: Max Paklin * Purpose: Declaration of of registry class * ******************************************************************************* * * Copyright � 1996-98, AuraVision Corporation. All rights reserved. * * AuraVision Corporation makes no warranty of any kind, express or implied, * with regard to this software. In no event shall AuraVision Corporation * be liable for incidental or consequential damages in connection with or * arising from the furnishing, performance, or use of this software. * *******************************************************************************/
#ifndef __DRVREG_H__
#define __DRVREG_H__
#define MAX_KEYLENGTH 512
#define MAX_GUIDLENGTH 48
class CKsRegKey { PWCHAR m_pwszKey; // If we are dealing with absolute registry path then
// this is where the string is stored
PVOID m_hHandle; // We probably already have handle to base key opened
// and we are going to use it as a base for all the
// data we will access. Store it here
PDEVICE_OBJECT m_pDeviceObject; // Or we may put the data under device key
// (recommended) and use it as a base. Here is device
// object handle
// Was object initialized correctly, i.e. is it "not empty"?
BOOL IsKey() { return (BOOL)(m_hHandle != NULL || m_pDeviceObject != NULL || (m_pwszKey && wcslen( m_pwszKey ) > 0)); } // Helper function to be called from constructors
void Create( LPCWSTR pwszKey, LPCWSTR pwszSubKey, PVOID hHandle = NULL, PDEVICE_OBJECT pDeviceObject = NULL ); PWSTR GetInputData( PULONG puRelativeTo, PHANDLE phHandleToDelete, ACCESS_MASK amDesiredAccess, BOOL bCreateHandle = FALSE );
public: // Constructors
CKsRegKey( LPCWSTR pwszKey, LPCWSTR pwszSubKey = NULL ); CKsRegKey( CKsRegKey& keyFrom, LPCWSTR pwszSubKey = NULL ); CKsRegKey( LPCWSTR pwszKey, GUID guidSubKey ); CKsRegKey( CKsRegKey& keyFrom, GUID guidSubKey ); CKsRegKey( LPCWSTR pwszSubKey, PDEVICE_OBJECT pDeviceObj, PVOID hHandle ); ~CKsRegKey() { if( m_pwszKey ) ExFreePool( m_pwszKey ); }
// If we are dealing with absolute key, this is useful method to get that key string
LPWSTR GetKey() { return m_pwszKey; }
// Put the data into registry
BOOL SetValue( LPCWSTR pwszValue, LPCWSTR pwszSetTo ); BOOL SetValue( LPCWSTR pwszValue, int nSetTo ); BOOL SetValue( LPCWSTR pwszValue, GUID guidValue ); // Get the data from registry
BOOL GetValue( LPCWSTR pwszGetFrom, LPWSTR pwszValue, USHORT ushSize, LPCWSTR pwszDefault = L"" ); BOOL GetValue( LPCWSTR pwszGetFrom, PDWORD pdwValue, ULONG ulSize ); BOOL GetValue( LPCWSTR pwszGetFrom, long& nValue, long lDefault = 0 ); BOOL GetValue( LPCWSTR pwszGetFrom, int& nValue, int nDefault = 0 ); BOOL GetValue( LPCWSTR pwszValue, GUID& guidValue ); // Check if the data entry is present under current key
BOOL IsValue( LPCWSTR pwszValue );
// Helper functions to convert wide characters and GUIDs
void GuidToWChar( const GUID guid, LPWSTR pwszString ); NTSTATUS WCharToGuid( LPCWSTR pszString, GUID guid );
// These are for "object oriented people" :-)
const CKsRegKey& operator << ( GUID guidValue ) { SetValue( NULL, guidValue ); return *this; } const CKsRegKey& operator << ( LPCWSTR pwszValue ) { SetValue( NULL, pwszValue ); return *this; } const CKsRegKey& operator << ( long lValue ) { SetValue( NULL, lValue ); return *this; } const CKsRegKey& operator << ( int nValue ) { SetValue( NULL, (long)nValue ); return *this; } friend CKsRegKey& operator >> ( CKsRegKey& keyReg, LPWSTR pwszValue ); };
// Constructors.
// Call Create to initialize object
inline CKsRegKey::CKsRegKey( LPCWSTR pwszKey, LPCWSTR pwszSubKey ) { Create( pwszKey, pwszSubKey ); } inline CKsRegKey::CKsRegKey( CKsRegKey& keyFrom, LPCWSTR pwszSubKey ) { Create( keyFrom.m_pwszKey, pwszSubKey ); } inline CKsRegKey::CKsRegKey( LPCWSTR pwszKey, GUID guidSubKey ) { WCHAR wszKeyName[MAX_GUIDLENGTH]; GuidToWChar( guidSubKey, wszKeyName ); Create( pwszKey, wszKeyName ); } inline CKsRegKey::CKsRegKey( CKsRegKey& keyFrom, GUID guidSubKey ) { WCHAR wszKeyName[MAX_GUIDLENGTH]; GuidToWChar( guidSubKey, wszKeyName ); Create( keyFrom.m_pwszKey, wszKeyName ); } inline CKsRegKey::CKsRegKey( LPCWSTR pwszSubKey, PDEVICE_OBJECT pDeviceObject, PVOID hHandle ) { Create( NULL, pwszSubKey, hHandle, pDeviceObject ); }
// C++ madness. Create method for every possible type of arguments to avoid compiler errors.
// All the functions, of course, will just delegate the call to one of them to do the real
// job.
// These numerous set and get functions exist here for exactly that reason.
inline BOOL CKsRegKey::SetValue( LPCWSTR pwszValue, GUID guidValue ) { WCHAR wszKeyName[MAX_GUIDLENGTH]; GuidToWChar( guidValue, wszKeyName ); return SetValue( pwszValue, wszKeyName ); } inline BOOL CKsRegKey::GetValue( LPCWSTR pwszGetFrom, int& nValue, int nDefault ) { long lValue; if( GetValue( pwszGetFrom, lValue, nDefault ) ) { nValue = (int)lValue; return TRUE; } return FALSE; } inline BOOL CKsRegKey::GetValue( LPCWSTR pwszGetFrom, GUID& guidValue ) { WCHAR wszKeyName[MAX_GUIDLENGTH]; BOOL bReturnCode = GetValue( pwszGetFrom, wszKeyName, SIZEOF_ARRAY( wszKeyName ) ); WCharToGuid( wszKeyName, guidValue ); return bReturnCode; }
// Check for presence of value is pretty simple. Just try to read from it. If the value
// exists, the read operation will be successful
inline BOOL CKsRegKey::IsValue( LPCWSTR pwszValue ) { WCHAR wTempString[MAX_GUIDLENGTH]; return GetValue( pwszValue, wTempString, SIZEOF_ARRAY( wTempString ) ); }
// Again C++ joy. This time for >> and << operators
inline CKsRegKey& operator >> ( CKsRegKey& keyReg, LPWSTR pwszValue ) { // This is a little trick. Caller is supposed to take care of buffer, i.e. it should be
// big enough to hold the string from registry. There is no way to specify the size
// of buffer for operator, so we assume that the string is not longer than 512 characters
// and that user's buffer is capable of storing all the data that system will put there
USHORT ushSize = 512; keyReg.GetValue( NULL, pwszValue, ushSize ); return keyReg; } inline CKsRegKey& operator >> ( CKsRegKey& keyReg, long& lValue ) { USHORT ushSize = sizeof( lValue ); keyReg.GetValue( NULL, (LPWSTR)&lValue, ushSize ); return keyReg; } inline CKsRegKey& operator >> ( CKsRegKey& keyReg, int& nValue ) { keyReg.GetValue( NULL, nValue ); return keyReg; }
// This is the last set of similar functions to do the same job of deleting subkey. They
// exist just for convinience
extern void DeleteSubKey( LPWSTR pwszKey, LPCWSTR pwszSubKey ); inline void DeleteSubKey( CKsRegKey& keyReg, LPCWSTR pwszSubKey ) { DeleteSubKey( keyReg.GetKey(), pwszSubKey ); } inline void DeleteSubKey( LPWSTR pwszKey, GUID guidSubKey ) { WCHAR wszKeyName[MAX_GUIDLENGTH]; ((CKsRegKey*)NULL)->GuidToWChar( guidSubKey, wszKeyName ); DeleteSubKey( pwszKey, wszKeyName ); } inline void DeleteSubKey( CKsRegKey& keyReg, GUID guidSubKey ) { WCHAR wszKeyName[MAX_GUIDLENGTH]; ((CKsRegKey*)NULL)->GuidToWChar( guidSubKey, wszKeyName ); DeleteSubKey( keyReg.GetKey(), wszKeyName ); }
#endif // #ifndef __DRVREG_H__
|