windows-nt/Source/XPSP1/NT/inetsrv/iis/ui/admin/comprop/registry.h
2020-09-26 16:20:57 +08:00

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