mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
758 lines
25 KiB
758 lines
25 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) 1992, Microsoft Corporation.
|
|
//
|
|
// File: dsysreg.hxx
|
|
//
|
|
// Contents: Definitions of classes for manipulating registry entries.
|
|
//
|
|
// Classes: CRegKey - class for registry key objects
|
|
// CRegValue - base class for registry value objects
|
|
// CRegSZ - derived class for registry string values
|
|
// CRegDWORD - derived class for registry dword values
|
|
// CRegBINARY - derived class for registry binary values
|
|
// CRegMSZ - derived class for registry multi-string values
|
|
//
|
|
// History: 09/30/92 Rickhi Created
|
|
// 09/22/93 AlokS Took out exception throwing code
|
|
// and added proper return code for
|
|
// each method.
|
|
//
|
|
// 07/26/94 AlokS Made it lightweight for normal set/get
|
|
// operations. Threw out all exception code
|
|
//
|
|
// Notes: CRegKey can use another CRegKey as a parent, so you can
|
|
// build a tree of keys. To kick things off, you can give one
|
|
// of the default registry keys like HKEY_CURRENT_USER. When
|
|
// you do this, the GetParent method returns NULL. Currently
|
|
// however, no ptrs are kept to child and sibling keys.
|
|
//
|
|
// CRegValue is a base class for dealing with registry values.
|
|
// The other classes (except CRegKey) are for dealing with a
|
|
// specific type of registry value in the native data format.
|
|
// For example, CRegDWORD lets you call methods just providing
|
|
// a dword. The methods take care of figuring out the size and
|
|
// casting the dword to a ptr to bytes, etc for use in the Win32
|
|
// registry APIs.
|
|
//
|
|
// For any registry type not defined here, you can always resort
|
|
// to using the CRegValue base class directly, though you then
|
|
// must call GetValue or SetValue methods explicitly.
|
|
//
|
|
// Sample Usage:
|
|
//
|
|
// The following reads the username in the ValueID UserName
|
|
// within the key HKEY_CURRENT_USER\LogonInfo. It then changes
|
|
// it to Rickhi. It also sets the password valueid in the
|
|
// the same key to foobar.
|
|
//
|
|
// #include <dsysreg.hxx>
|
|
//
|
|
// // open the registry key
|
|
// CRegKey rkLogInfo(HKEY_CURRENT_USER, L"LogonInfo");
|
|
//
|
|
// // read the user name
|
|
// LPWSTR pwszUserName;
|
|
// CRegSZ rszUserName(&rkLogInfo, L"UserName", pwszUserName);
|
|
// rszUserName.SetString(L"Rickhi");
|
|
//
|
|
// // set the password
|
|
// CRegSZ rszPassWord(&rkLogInfo, L"PassWord", L"foobar");
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifndef __DSYSREG_HXX__
|
|
#define __DSYSREG_HXX__
|
|
|
|
#include "wcbuffer.hxx"
|
|
|
|
// to simplify error creation
|
|
#define Creg_ERROR(x) (x)
|
|
|
|
// forward declarations for use in the following structures
|
|
class CRegValue;
|
|
class CRegKey;
|
|
|
|
// structure for enumerating subkeys of a key
|
|
typedef struct _SRegKeySet
|
|
{
|
|
ULONG cKeys;
|
|
CRegKey *aprkKey[1];
|
|
} SRegKeySet;
|
|
|
|
// structure for enumerating values within a key
|
|
typedef struct _SRegValueSet
|
|
{
|
|
ULONG cValues;
|
|
CRegValue *aprvValue[1];
|
|
} SRegValueSet;
|
|
|
|
// structure for dealing with multi-string values
|
|
typedef struct _SMultiStringSet
|
|
{
|
|
ULONG cStrings;
|
|
LPWSTR apwszString[1];
|
|
} SMultiStringSet;
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CRegKey
|
|
//
|
|
// Purpose: class for abstracting Registry Keys
|
|
//
|
|
// Interface: CRegKey - constructor for a registry key object
|
|
// ~CRegKey - destructor for a registry key object
|
|
// GetParentHandle - returns parent key's handle
|
|
// GetHandle - returns this key's handle
|
|
// GetName - returns key path
|
|
// Delete - deletes the key from the registry
|
|
// EnumValues - enumerate values stored in the key
|
|
// EnumKeys - enumerates subkeys of the key
|
|
// NotifyChange - sets up change notification for the key
|
|
// QueryErrorStatus - Should be used to determine if constructor
|
|
// completed successfully or not
|
|
// History: 09/30/92 Rickhi Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CRegKey
|
|
{
|
|
public:
|
|
// constructor using HKEY for parent
|
|
// Mode: Create key if not present
|
|
CRegKey( HKEY hkParent,
|
|
const LPWSTR pwszPath,
|
|
|
|
// remaining parameters are optional
|
|
REGSAM samDesiredAccess = KEY_ALL_ACCESS,
|
|
const LPWSTR pwszClass = NULL,
|
|
DWORD dwOptions = REG_OPTION_NON_VOLATILE,
|
|
DWORD *pdwDisposition = NULL,
|
|
const LPSECURITY_ATTRIBUTES pSecurityAttributes = NULL
|
|
);
|
|
// constructor using CRegKey as parent
|
|
// Mode: Create key if not present
|
|
CRegKey(const CRegKey& crkParent,
|
|
const LPWSTR pwszPath,
|
|
// remaining parameters are optional
|
|
REGSAM samDesiredAccess = KEY_ALL_ACCESS,
|
|
const LPWSTR pwszClass = NULL,
|
|
DWORD dwOptions = REG_OPTION_NON_VOLATILE,
|
|
DWORD *pdwDisposition = NULL,
|
|
const LPSECURITY_ATTRIBUTES pSecurityAttributes = NULL
|
|
);
|
|
|
|
// Constructor using HKEY for parent
|
|
// Mode: Simply Open the key, if exists
|
|
CRegKey (
|
|
HKEY hkParent,
|
|
DWORD *pdwErr,
|
|
const LPWSTR pwszPath,
|
|
REGSAM samDesiredAccess = KEY_ALL_ACCESS
|
|
);
|
|
|
|
// Constructor using CRegKey as parent
|
|
// Mode: Simply open the key, if exists
|
|
CRegKey (const CRegKey& crkParent,
|
|
DWORD *pdwErr,
|
|
const LPWSTR pwszPath,
|
|
REGSAM samDesiredAccess = KEY_ALL_ACCESS
|
|
);
|
|
// Destructor - Closes registry key
|
|
~CRegKey(void);
|
|
|
|
HKEY GetHandle(void) const;
|
|
const LPWSTR GetName(void) const;
|
|
DWORD Delete(void);
|
|
DWORD DeleteChildren(void);
|
|
DWORD EnumValues(SRegValueSet **pprvs);
|
|
DWORD EnumKeys(SRegKeySet **pprks);
|
|
|
|
// This method can be called to determine if
|
|
// Object is in sane state or not
|
|
DWORD QueryErrorStatus () const { return _dwErr ; }
|
|
|
|
// Static routine which frees memory allocated during EnumValues/Keys
|
|
static void MemFree ( void * pv )
|
|
{
|
|
|
|
delete [] (BYTE*)pv;
|
|
}
|
|
|
|
private:
|
|
DWORD CreateKey( HKEY hkParent,
|
|
const LPWSTR pwszPath,
|
|
REGSAM samDesiredAccess,
|
|
const LPWSTR pwszClass,
|
|
DWORD dwOptions,
|
|
DWORD *pdwDisposition,
|
|
const LPSECURITY_ATTRIBUTES pSecurityAttributes
|
|
);
|
|
|
|
DWORD OpenKey ( HKEY hkParent,
|
|
const LPWSTR pwszPath,
|
|
REGSAM samDesiredAccess
|
|
);
|
|
|
|
HKEY _hkParent; // Handle to parent
|
|
HKEY _hkThis; // handle for this key
|
|
CWCHARBuffer _cwszName; // Buffer containing the registry path
|
|
// path from parent key to this key
|
|
DWORD _dwErr; // Internal error status
|
|
};
|
|
|
|
inline HKEY CRegKey::GetHandle(void) const
|
|
{
|
|
return _hkThis;
|
|
}
|
|
|
|
inline const LPWSTR CRegKey::GetName(void) const
|
|
{
|
|
return (const LPWSTR) (LPWSTR)_cwszName;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CRegValue
|
|
//
|
|
// Purpose: base class for abstracting Registry Values
|
|
//
|
|
// Interface: CRegValue - constructor for value
|
|
// ~CRegValue - destructor for value
|
|
// GetKeyHandle - returns handle for parent key
|
|
// GetValueID - returns the ValueID name
|
|
// GetTypeCode - returns the TypeCode of the data
|
|
// GetValue - returns the data associated with the value
|
|
// SetValue - sets the data associated with the value
|
|
// Delete - deletes the value from the registry
|
|
// QueryErrorStatus - Should be used to determine if constructor
|
|
// completed successfully or not
|
|
//
|
|
// History: 09/30/92 Rickhi Created
|
|
//
|
|
// Notes: This is a base class from which more specific classes are
|
|
// derived for each of the different registry value types.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CRegValue
|
|
{
|
|
public:
|
|
CRegValue(const CRegKey& crkParentKey,
|
|
const LPWSTR pwszValueID);
|
|
~CRegValue(void){;};
|
|
|
|
HKEY GetParentHandle(void) const;
|
|
const LPWSTR GetValueID(void) const;
|
|
|
|
VOID Delete(void);
|
|
|
|
// Caller supplies buffer
|
|
DWORD GetValue(LPBYTE pbData, ULONG *pcbData, DWORD *pdwTypeCode);
|
|
|
|
DWORD SetValue(const LPBYTE pbData, ULONG cbData, DWORD dwTypeCode);
|
|
|
|
virtual DWORD QueryErrorStatus (void) const { return _dwErr ; }
|
|
|
|
private:
|
|
CWCHARBuffer _cwszValueID;
|
|
HKEY _hkParent;
|
|
DWORD _dwErr ;
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CRegValue::CRegValue
|
|
//
|
|
// Purpose: constructor for base registry value
|
|
//
|
|
// Arguments: [prkParent] - ptr to parent CRegKey for the key
|
|
// [pwszValueID] - the valueID name for the value
|
|
//
|
|
// Signals: nothing
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
// History: 09/30/92 Rickhi Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
inline CRegValue::CRegValue(const CRegKey& crkParent,
|
|
const LPWSTR pwszValueID)
|
|
: _hkParent (crkParent.GetHandle()),
|
|
_dwErr(crkParent.QueryErrorStatus())
|
|
{
|
|
_cwszValueID.Set(pwszValueID);
|
|
}
|
|
|
|
inline HKEY CRegValue::GetParentHandle(void) const
|
|
{
|
|
return _hkParent;
|
|
}
|
|
|
|
inline const LPWSTR CRegValue::GetValueID(void) const
|
|
{
|
|
return (const LPWSTR) (LPWSTR) _cwszValueID;
|
|
}
|
|
|
|
inline VOID CRegValue::Delete(void)
|
|
{
|
|
_dwErr = RegDeleteValue( _hkParent, _cwszValueID );
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CRegSZ
|
|
//
|
|
// Purpose: Derived class for abstracting Registry string Values
|
|
//
|
|
// Interface: CRegSZ - constructor for registry value using string
|
|
// ~CRegSZ - destructor for registry string object
|
|
// GetString - returns the string
|
|
// SetString - sets a new string value
|
|
// QueryErrorStatus - Should be used to determine if constructor
|
|
// completed successfully or not
|
|
//
|
|
// History: 09/30/92 Rickhi Created
|
|
//
|
|
// Notes: Derived from CRegValue.
|
|
//
|
|
// There are three constructors. The first is used if you want
|
|
// to create a new value or overwrite the existing value data.
|
|
// The second is used if you want to open an existing value
|
|
// and read it's data. The third is used if you just want to
|
|
// make an object without doing any read/write of the data yet.
|
|
// In all three cases, you can always use any of the Get/Set
|
|
// operations on the object at a later time.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
class CRegSZ : public CRegValue
|
|
{
|
|
public:
|
|
// create/write value constructor
|
|
CRegSZ(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID,
|
|
const LPWSTR pwszData
|
|
);
|
|
|
|
// io-less constructor - used by enumerator
|
|
CRegSZ(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID
|
|
);
|
|
|
|
~CRegSZ(void){;};
|
|
|
|
DWORD SetString(const LPWSTR pwszData);
|
|
|
|
// Caller supplies buffer (supply the buffer size in bytes)
|
|
DWORD GetString( LPWSTR pwszData, ULONG *pcbData);
|
|
|
|
DWORD GetTypeCode(void);
|
|
|
|
DWORD QueryErrorStatus(void) const { return _dwErr ; }
|
|
|
|
private:
|
|
DWORD _dwErr;
|
|
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CRegSZ::CRegSZ
|
|
//
|
|
// Purpose: Constructor for registry string value
|
|
//
|
|
// History: 09/30/92 Rickhi Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
inline CRegSZ::CRegSZ(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID,
|
|
const LPWSTR pwszData)
|
|
: CRegValue(crkParent, pwszValueID)
|
|
{
|
|
if (ERROR_SUCCESS == (_dwErr = CRegValue::QueryErrorStatus()))
|
|
_dwErr = SetString(pwszData);
|
|
}
|
|
|
|
inline CRegSZ::CRegSZ(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID)
|
|
: CRegValue(crkParent, pwszValueID)
|
|
{
|
|
// automatic actions in header are sufficient
|
|
_dwErr = CRegValue::QueryErrorStatus();
|
|
}
|
|
|
|
inline DWORD CRegSZ::SetString(const LPWSTR pwszData)
|
|
{
|
|
return SetValue((LPBYTE)pwszData, (wcslen(pwszData)+1)*sizeof(WCHAR), REG_SZ);
|
|
}
|
|
|
|
inline DWORD CRegSZ::GetString(LPWSTR pwszData, ULONG* pcbData)
|
|
{
|
|
DWORD dwTypeCode;
|
|
|
|
return GetValue((LPBYTE)pwszData, pcbData, &dwTypeCode);
|
|
}
|
|
|
|
inline DWORD CRegSZ::GetTypeCode(void)
|
|
{
|
|
return REG_SZ;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CRegMSZ
|
|
//
|
|
// Purpose: Derived class for abstracting Registry multi-string Values
|
|
//
|
|
// Interface: CRegMSZ - constructor for registry value using string
|
|
// ~CRegMSZ - destructor for registry string object
|
|
// GetString - returns the string
|
|
// SetString - sets a new string value
|
|
// QueryErrorStatus - Should be used to determine if constructor
|
|
// completed successfully or not
|
|
//
|
|
// History: 09/30/92 Rickhi Created
|
|
//
|
|
// Notes: Derived from CRegValue.
|
|
//
|
|
// There are three constructors. The first is used if you want
|
|
// to create a new value or overwrite the existing value data.
|
|
// The second is used if you want to open an existing value
|
|
// and read it's data. The third is used if you just want to
|
|
// make an object without doing any read/write of the data yet.
|
|
// In all three cases, you can always use any of the Get/Set
|
|
// operations on the object at a later time.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
class CRegMSZ : public CRegValue
|
|
{
|
|
public:
|
|
// create/write value constructor
|
|
CRegMSZ(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID,
|
|
const LPWSTR pwszData
|
|
);
|
|
|
|
// io-less constructor - used by enumerator
|
|
CRegMSZ(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID
|
|
);
|
|
|
|
~CRegMSZ(void){;};
|
|
|
|
DWORD SetString(const LPWSTR pwszData);
|
|
|
|
// Caller supplies buffer (supply the buffer size in bytes)
|
|
DWORD GetString( LPWSTR pwszData, ULONG *pcbData);
|
|
|
|
DWORD GetTypeCode(void);
|
|
|
|
DWORD QueryErrorStatus(void) const { return _dwErr ; }
|
|
|
|
private:
|
|
DWORD _dwErr;
|
|
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CRegMSZ::CRegMSZ
|
|
//
|
|
// Purpose: Constructor for registry string value
|
|
//
|
|
// History: 09/30/92 Rickhi Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
inline CRegMSZ::CRegMSZ(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID,
|
|
const LPWSTR pwszData)
|
|
: CRegValue(crkParent, pwszValueID)
|
|
{
|
|
if (ERROR_SUCCESS == (_dwErr = CRegValue::QueryErrorStatus()))
|
|
_dwErr = SetString(pwszData);
|
|
}
|
|
|
|
inline CRegMSZ::CRegMSZ(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID)
|
|
: CRegValue(crkParent, pwszValueID)
|
|
{
|
|
// automatic actions in header are sufficient
|
|
_dwErr = CRegValue::QueryErrorStatus();
|
|
}
|
|
|
|
inline DWORD CRegMSZ::SetString(const LPWSTR pwszData)
|
|
{
|
|
DWORD cwLen, cbData;
|
|
LPWSTR pwszNextString;
|
|
|
|
for (pwszNextString = pwszData, cbData = 0;
|
|
*pwszNextString != UNICODE_NULL;
|
|
pwszNextString += cwLen) {
|
|
cwLen = wcslen(pwszNextString) + 1;
|
|
cbData += (cwLen * sizeof(WCHAR));
|
|
}
|
|
cbData += sizeof(UNICODE_NULL);
|
|
|
|
return SetValue((LPBYTE)pwszData, cbData, REG_MULTI_SZ);
|
|
}
|
|
|
|
inline DWORD CRegMSZ::GetString(LPWSTR pwszData, ULONG* pcbData)
|
|
{
|
|
DWORD dwTypeCode;
|
|
|
|
return GetValue((LPBYTE)pwszData, pcbData, &dwTypeCode);
|
|
}
|
|
|
|
inline DWORD CRegMSZ::GetTypeCode(void)
|
|
{
|
|
return REG_MULTI_SZ;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CRegDWORD
|
|
//
|
|
// Purpose: Derived class for abstracting Registry dword Values
|
|
//
|
|
// Interface: CRegDWORD - constructor for registry value using dword
|
|
// ~CRegDWORD - destructor for registry dword object
|
|
// GetDword - returns the dword
|
|
// SetDword - sets a new dword value
|
|
// QueryErrorStatus - Should be used to determine if constructor
|
|
// completed successfully or not
|
|
//
|
|
// History: 09/30/92 Rickhi Created
|
|
//
|
|
// Notes: Derived from CRegValue.
|
|
//
|
|
// There are three constructors. The first is used if you want
|
|
// to create a new value or overwrite the existing value data.
|
|
// The second is used if you want to open an existing value
|
|
// and read it's data. The third is used if you just want to
|
|
// make an object without doing any read/write of the data yet.
|
|
// In all three cases, you can always use any of the Get/Set
|
|
// operations on the object at a later time.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CRegDWORD : public CRegValue
|
|
{
|
|
public:
|
|
// create/write value constructor
|
|
CRegDWORD(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID,
|
|
DWORD dwData);
|
|
|
|
// open/read value constructor
|
|
CRegDWORD(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID,
|
|
DWORD *pdwData);
|
|
|
|
// io-less constructor - used by enumerator
|
|
CRegDWORD( const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID);
|
|
|
|
~CRegDWORD(void){;};
|
|
|
|
|
|
DWORD SetDword(DWORD dwData);
|
|
DWORD GetDword(DWORD *pdwData);
|
|
DWORD GetTypeCode(void) ;
|
|
DWORD QueryErrorStatus(void) const { return _dwErr ; }
|
|
|
|
private:
|
|
DWORD _dwErr;
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CRegDWORD::CRegDWORD
|
|
//
|
|
// Purpose: Constructor for registry dword value
|
|
//
|
|
// History: 09/30/92 Rickhi Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
inline CRegDWORD::CRegDWORD(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID,
|
|
DWORD dwData)
|
|
: CRegValue(crkParent, pwszValueID)
|
|
{
|
|
|
|
if (ERROR_SUCCESS == (_dwErr = CRegValue::QueryErrorStatus()))
|
|
_dwErr = SetDword(dwData);
|
|
}
|
|
|
|
|
|
inline CRegDWORD::CRegDWORD(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID,
|
|
DWORD *pdwData)
|
|
: CRegValue(crkParent, pwszValueID)
|
|
{
|
|
|
|
if (ERROR_SUCCESS == (_dwErr = CRegValue::QueryErrorStatus()))
|
|
_dwErr = GetDword(pdwData);
|
|
}
|
|
|
|
inline CRegDWORD::CRegDWORD(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID)
|
|
: CRegValue(crkParent, pwszValueID)
|
|
{
|
|
// automatic actions in header are sufficient
|
|
_dwErr = CRegValue::QueryErrorStatus();
|
|
}
|
|
|
|
inline DWORD CRegDWORD::GetDword(DWORD *pdwData)
|
|
{
|
|
DWORD dwTypeCode;
|
|
DWORD dwErr;
|
|
ULONG cbData= sizeof(DWORD);
|
|
dwErr = GetValue((LPBYTE)pdwData, &cbData, &dwTypeCode);
|
|
return (dwErr);
|
|
}
|
|
|
|
|
|
inline DWORD CRegDWORD::SetDword(DWORD dwData)
|
|
{
|
|
return SetValue((LPBYTE)&dwData, sizeof(DWORD), REG_DWORD);
|
|
}
|
|
|
|
inline DWORD CRegDWORD::GetTypeCode(void)
|
|
{
|
|
return REG_DWORD;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CRegBINARY
|
|
//
|
|
// Purpose: Derived class for abstracting Registry binary Values
|
|
//
|
|
// Interface: CRegBINARY - constructor for registry value using binary data
|
|
// ~CRegBINARY - destructor for registry binary data object
|
|
// GetBinary - returns the binary data
|
|
// SetBinary - sets a new binary data value
|
|
// QueryErrorStatus - Should be used to determine if constructor
|
|
// completed successfully or not
|
|
//
|
|
// History: 09/30/92 Rickhi Created
|
|
//
|
|
// Notes: Derived from CRegValue.
|
|
//
|
|
// There are three constructors. The first is used if you want
|
|
// to create a new value or overwrite the existing value data.
|
|
// The second is used if you want to open an existing value
|
|
// and read it's data. The third is used if you just want to
|
|
// make an object without doing any read/write of the data yet.
|
|
// In all three cases, you can always use any of the Get/Set
|
|
// operations on the object at a later time.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CRegBINARY : public CRegValue
|
|
{
|
|
public:
|
|
// create/write value constructor
|
|
CRegBINARY(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID,
|
|
const LPBYTE pbData,
|
|
ULONG cbData);
|
|
|
|
// io-less constructor - used by enumerator
|
|
CRegBINARY(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID);
|
|
|
|
~CRegBINARY(void){;};
|
|
|
|
DWORD SetBinary(const LPBYTE pbData, ULONG cbData);
|
|
|
|
// Caller supplies buffer (supply the buffer size in bytes)
|
|
DWORD GetBinary(LPBYTE pbData, ULONG *pcbData);
|
|
|
|
DWORD GetTypeCode(void);
|
|
DWORD QueryErrorStatus(void) { return _dwErr ; }
|
|
|
|
private:
|
|
DWORD _dwErr;
|
|
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CRegBINARY::CRegBINARY
|
|
//
|
|
// Purpose: Constructor for registry binary value
|
|
//
|
|
// History: 09/30/92 Rickhi Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
inline CRegBINARY::CRegBINARY(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID,
|
|
const LPBYTE pbData,
|
|
ULONG cbData)
|
|
: CRegValue(crkParent, pwszValueID)
|
|
{
|
|
|
|
if (ERROR_SUCCESS == (_dwErr = CRegValue::QueryErrorStatus()))
|
|
_dwErr = SetBinary(pbData, cbData);
|
|
}
|
|
|
|
inline CRegBINARY::CRegBINARY(const CRegKey &crkParent,
|
|
const LPWSTR pwszValueID)
|
|
: CRegValue(crkParent, pwszValueID)
|
|
{
|
|
// automatic actions in header are sufficient
|
|
_dwErr = CRegValue::QueryErrorStatus();
|
|
}
|
|
|
|
|
|
inline DWORD CRegBINARY::SetBinary(const LPBYTE pbData, ULONG cbData)
|
|
{
|
|
return SetValue(pbData, cbData, REG_BINARY);
|
|
}
|
|
|
|
inline DWORD CRegBINARY::GetBinary(LPBYTE pbData, ULONG* pcbData)
|
|
{
|
|
DWORD dwTypeCode;
|
|
return GetValue(pbData, pcbData, &dwTypeCode);
|
|
}
|
|
inline DWORD CRegBINARY::GetTypeCode(void)
|
|
{
|
|
return REG_BINARY;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: DelRegKeyTree
|
|
//
|
|
// Purpose: This function can be used to deleting a key and all it's
|
|
// children.
|
|
//
|
|
// History: 09/30/93 AlokS Created
|
|
//
|
|
// Notes: We assume that caller has proper access priviledge
|
|
// and the key is non-volatile.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
DWORD DelRegKeyTree ( HKEY hParent, LPWSTR lpwszKeyPath);
|
|
|
|
#endif // __DSYSREG_HXX__
|