426 lines
7.9 KiB
C
426 lines
7.9 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1994-1998 Microsoft Corporation
|
||
|
|
||
|
Module Name :
|
||
|
|
||
|
registry.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Registry classes definitions
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Ronald Meijer (ronaldm)
|
||
|
|
||
|
Project:
|
||
|
|
||
|
Internet Services Manager
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _REGISTRY_H
|
||
|
#define _REGISTRY_H
|
||
|
|
||
|
//
|
||
|
// Forward declarations
|
||
|
//
|
||
|
class CRMCRegKey;
|
||
|
class CRMCRegValueIter;
|
||
|
class CRMCRegKeyIter;
|
||
|
|
||
|
//
|
||
|
// Maximum size of a Registry class name
|
||
|
//
|
||
|
#define CREGKEY_MAX_CLASS_NAME MAX_PATH
|
||
|
|
||
|
//
|
||
|
// Parameter helper
|
||
|
//
|
||
|
#define EXPANSION_ON (TRUE)
|
||
|
#define EXPANSION_OFF (FALSE)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
class COMDLL CRMCRegKey : public CObject
|
||
|
/*++
|
||
|
|
||
|
Class Description:
|
||
|
|
||
|
Registry key class.
|
||
|
|
||
|
Public Interface:
|
||
|
|
||
|
CRMCRegKey : Registry key object constructor
|
||
|
~CRMCRegKey : Registry key object destructor
|
||
|
|
||
|
operator HKEY : cast to HKEY handle
|
||
|
GetHandle : Get HKEY handle
|
||
|
Ok : TRUE if the key was initialized OK, FALSE otherwise.
|
||
|
IsLocal : TRUE if the key was opened on the local machine
|
||
|
|
||
|
QueryKeyInfo : Fill a key information structure
|
||
|
QueryValue : Overloaded value query members
|
||
|
SetValue : Overloaded set value members
|
||
|
|
||
|
AssertValid : Assert the object is in a valid state (debug only)
|
||
|
Dump : Dump to the debug context (debug only)
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
public:
|
||
|
//
|
||
|
// Key information return structure
|
||
|
//
|
||
|
typedef struct
|
||
|
{
|
||
|
TCHAR chBuff[CREGKEY_MAX_CLASS_NAME];
|
||
|
DWORD dwClassNameSize,
|
||
|
dwNumSubKeys,
|
||
|
dwMaxSubKey,
|
||
|
dwMaxClass,
|
||
|
dwMaxValues,
|
||
|
dwMaxValueName,
|
||
|
dwMaxValueData,
|
||
|
dwSecDesc;
|
||
|
FILETIME ftKey;
|
||
|
} CREGKEY_KEY_INFO;
|
||
|
|
||
|
//
|
||
|
// Constructor/Destructor
|
||
|
//
|
||
|
public:
|
||
|
//
|
||
|
// Standard constructor for an existing key
|
||
|
//
|
||
|
CRMCRegKey(
|
||
|
IN HKEY hKeyBase,
|
||
|
IN LPCTSTR lpszSubKey = NULL,
|
||
|
IN REGSAM regSam = KEY_ALL_ACCESS,
|
||
|
IN LPCTSTR lpszServerName = NULL
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Constructor creating a new key.
|
||
|
//
|
||
|
CRMCRegKey(
|
||
|
OUT BOOL * pfNewKeyCreated,
|
||
|
IN HKEY hKeyBase,
|
||
|
IN LPCTSTR lpszSubKey = NULL,
|
||
|
IN DWORD dwOptions = REG_OPTION_NON_VOLATILE,
|
||
|
IN REGSAM regSam = KEY_ALL_ACCESS,
|
||
|
IN LPSECURITY_ATTRIBUTES pSecAttr = NULL,
|
||
|
IN LPCTSTR lpszServerName = NULL
|
||
|
);
|
||
|
|
||
|
~CRMCRegKey();
|
||
|
|
||
|
//
|
||
|
// Interface
|
||
|
//
|
||
|
public:
|
||
|
//
|
||
|
// Allow a CRMCRegKey to be used anywhere an HKEY is required.
|
||
|
//
|
||
|
operator HKEY() const;
|
||
|
HKEY GetHandle() const;
|
||
|
BOOL Ok() const;
|
||
|
BOOL IsLocal() const;
|
||
|
|
||
|
//
|
||
|
// Fill a key information structure
|
||
|
//
|
||
|
DWORD QueryKeyInfo(
|
||
|
OUT CREGKEY_KEY_INFO * pRegKeyInfo
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Overloaded value query members; each returns ERROR_INVALID_PARAMETER
|
||
|
// if data exists but not in correct form to deliver into result object.
|
||
|
//
|
||
|
public:
|
||
|
//
|
||
|
// Autoexpand will automatically expand REG_EXPAND_SZ items on the
|
||
|
// local computer.
|
||
|
//
|
||
|
DWORD QueryValue(
|
||
|
IN LPCTSTR lpszValueName,
|
||
|
OUT CString & strResult,
|
||
|
IN BOOL fAutoExpand = EXPANSION_OFF,
|
||
|
OUT BOOL * pfExpanded = NULL
|
||
|
);
|
||
|
|
||
|
DWORD QueryValue(
|
||
|
IN LPCTSTR lpszValueName,
|
||
|
OUT CStringListEx & strList
|
||
|
);
|
||
|
|
||
|
DWORD QueryValue(
|
||
|
IN LPCTSTR lpszValueName,
|
||
|
OUT DWORD & dwResult
|
||
|
);
|
||
|
|
||
|
DWORD QueryValue(
|
||
|
IN LPCTSTR lpszValueName,
|
||
|
OUT CByteArray & abResult
|
||
|
);
|
||
|
|
||
|
DWORD QueryValue(
|
||
|
IN LPCTSTR lpszValueName,
|
||
|
OUT void * pvResult,
|
||
|
OUT DWORD cbSize
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Overloaded value setting members.
|
||
|
//
|
||
|
public:
|
||
|
//
|
||
|
// AutoDeflate will attempt to use %SystemRoot% in the path
|
||
|
// and write it as REG_EXPAND_SZ. if *pfDeflate = TRUE
|
||
|
// upon entry, REG_EXPAND_SZ will be set as well, but
|
||
|
// not automatic environment substitution will be performed.
|
||
|
//
|
||
|
// Otherwise, this will set as REG_SZ.
|
||
|
//
|
||
|
DWORD SetValue(
|
||
|
IN LPCTSTR lpszValueName,
|
||
|
IN CString & strResult,
|
||
|
IN BOOL fAutoDeflate = EXPANSION_OFF,
|
||
|
OUT BOOL * pfDeflate = NULL
|
||
|
);
|
||
|
|
||
|
DWORD SetValue(
|
||
|
IN LPCTSTR lpszValueName,
|
||
|
IN CStringListEx & strList
|
||
|
);
|
||
|
|
||
|
DWORD SetValue(
|
||
|
IN LPCTSTR lpszValueName,
|
||
|
IN DWORD & dwResult
|
||
|
);
|
||
|
|
||
|
DWORD SetValue(
|
||
|
IN LPCTSTR lpszValueName,
|
||
|
IN CByteArray & abResult
|
||
|
);
|
||
|
|
||
|
DWORD SetValue(
|
||
|
IN LPCTSTR lpszValueName,
|
||
|
IN void * pvResult,
|
||
|
IN DWORD cbSize
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Delete Key/Value
|
||
|
//
|
||
|
public:
|
||
|
DWORD DeleteValue(LPCTSTR lpszValueName);
|
||
|
DWORD DeleteKey(LPCTSTR lpszSubKey);
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
|
||
|
virtual void AssertValid() const;
|
||
|
virtual void Dump(
|
||
|
IN OUT CDumpContext& dc
|
||
|
) const;
|
||
|
|
||
|
#endif // _DEBUG
|
||
|
|
||
|
protected:
|
||
|
//
|
||
|
// Convert a CStringListEx to the REG_MULTI_SZ format
|
||
|
//
|
||
|
static DWORD FlattenValue(
|
||
|
IN CStringListEx & strList,
|
||
|
OUT DWORD * pcbSize,
|
||
|
OUT BYTE ** ppbData
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Convert a CByteArray to a REG_BINARY block
|
||
|
//
|
||
|
static DWORD FlattenValue(
|
||
|
IN CByteArray & abData,
|
||
|
OUT DWORD * pcbSize,
|
||
|
OUT BYTE ** ppbData
|
||
|
);
|
||
|
|
||
|
protected:
|
||
|
//
|
||
|
// Prepare to read a value by finding the value's size.
|
||
|
//
|
||
|
DWORD PrepareValue(
|
||
|
LPCTSTR lpszValueName,
|
||
|
DWORD * pdwType,
|
||
|
DWORD * pcbSize,
|
||
|
BYTE ** ppbData
|
||
|
);
|
||
|
|
||
|
private:
|
||
|
BOOL m_fLocal;
|
||
|
HKEY m_hKey;
|
||
|
DWORD m_dwDisposition;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
class COMDLL CRMCRegValueIter : public CObject
|
||
|
/*++
|
||
|
|
||
|
Class Description:
|
||
|
|
||
|
Registry value iteration class
|
||
|
|
||
|
Public Interface:
|
||
|
|
||
|
CRMCRegValueIter : Iteration class constructor
|
||
|
~CRMCRegValueIter : Iteration class destructor
|
||
|
|
||
|
Next : Get the name of the next key
|
||
|
Reset : Reset the iterator
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
//
|
||
|
// Constructor/Destructor
|
||
|
//
|
||
|
public:
|
||
|
CRMCRegValueIter(
|
||
|
IN CRMCRegKey & regKey
|
||
|
);
|
||
|
|
||
|
~CRMCRegValueIter();
|
||
|
|
||
|
//
|
||
|
// Interface
|
||
|
//
|
||
|
public:
|
||
|
//
|
||
|
// Get the name (and optional last write time) of the next key.
|
||
|
//
|
||
|
DWORD Next(
|
||
|
OUT CString * pstrName,
|
||
|
OUT DWORD * pdwType
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Reset the iterator
|
||
|
//
|
||
|
void Reset();
|
||
|
|
||
|
protected:
|
||
|
CRMCRegKey & m_rkIter;
|
||
|
DWORD m_dwIndex;
|
||
|
TCHAR * m_pBuffer;
|
||
|
DWORD m_cbBuffer;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
class COMDLL CRMCRegKeyIter : public CObject
|
||
|
/*++
|
||
|
|
||
|
Class Description:
|
||
|
|
||
|
Iterate the sub-key names of a key
|
||
|
|
||
|
Public Interface:
|
||
|
|
||
|
CRMCRegKeyIter : Iteration class constructor
|
||
|
~CRMCRegKeyIter : Iteration class destructor
|
||
|
|
||
|
Next : Get the name of the next key
|
||
|
Reset : Reset the iterator
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
public:
|
||
|
CRMCRegKeyIter(
|
||
|
IN CRMCRegKey & regKey
|
||
|
);
|
||
|
|
||
|
~CRMCRegKeyIter();
|
||
|
|
||
|
//
|
||
|
// Interface
|
||
|
//
|
||
|
public:
|
||
|
//
|
||
|
// Get the name (and optional last write time) of the next key.
|
||
|
//
|
||
|
DWORD Next(
|
||
|
OUT CString * pstrName,
|
||
|
OUT CTime * pTime = NULL
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// Reset the iterator
|
||
|
//
|
||
|
void Reset();
|
||
|
|
||
|
private:
|
||
|
CRMCRegKey & m_rkIter;
|
||
|
DWORD m_dwIndex;
|
||
|
TCHAR * m_pBuffer;
|
||
|
DWORD m_cbBuffer;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Inline Expansion
|
||
|
//
|
||
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
||
|
|
||
|
inline CRMCRegKey::operator HKEY() const
|
||
|
{
|
||
|
return m_hKey;
|
||
|
}
|
||
|
|
||
|
inline HKEY CRMCRegKey::GetHandle() const
|
||
|
{
|
||
|
return m_hKey;
|
||
|
}
|
||
|
|
||
|
inline BOOL CRMCRegKey::Ok() const
|
||
|
{
|
||
|
return m_hKey != NULL;
|
||
|
}
|
||
|
|
||
|
inline BOOL CRMCRegKey::IsLocal() const
|
||
|
{
|
||
|
return m_fLocal;
|
||
|
}
|
||
|
|
||
|
inline DWORD CRMCRegKey::DeleteValue(
|
||
|
IN LPCTSTR lpszValueName
|
||
|
)
|
||
|
{
|
||
|
return ::RegDeleteValue(*this, lpszValueName);
|
||
|
}
|
||
|
|
||
|
inline DWORD CRMCRegKey::DeleteKey(
|
||
|
IN LPCTSTR lpszSubKey
|
||
|
)
|
||
|
{
|
||
|
return ::RegDeleteKey(*this, lpszSubKey);
|
||
|
}
|
||
|
|
||
|
inline void CRMCRegValueIter::Reset()
|
||
|
{
|
||
|
m_dwIndex = 0L;
|
||
|
}
|
||
|
|
||
|
inline void CRMCRegKeyIter::Reset()
|
||
|
{
|
||
|
m_dwIndex = 0L;
|
||
|
}
|
||
|
|
||
|
#endif // _REGISTRY_H
|