/*++ Copyright (c) Microsoft Corporation Module Name: fusionregenumkeys.h Abstract: ported from vsee\lib\reg\ckey.h Author: Jay Krell (JayKrell) August 2001 Revision History: --*/ #if !defined(FUSION_INC_REGKEY2_H_INCLUDED_) // { #define FUSION_INC_REGKEY2_H_INCLUDED_ #pragma once #include "windows.h" #include "fusionbuffer.h" #include "lhport.h" namespace F { /*----------------------------------------------------------------------------- Name: CRegKey2 @class This class is a "smart" wrapper for an HKEY. @hung key or hkey @owner -----------------------------------------------------------------------------*/ class CRegKey2 { public: // @cmember constructor __declspec(nothrow) CRegKey2() /*throw()*/; // @cmember constructor __declspec(nothrow) CRegKey2(HKEY) /*throw()*/; // @cmember destructor __declspec(nothrow) ~CRegKey2() /*throw()*/; // @cmember open void ThrOpen(HKEY hKeyParent, PCWSTR pszKeyName, REGSAM samDesired = KEY_READ) throw(CErr); // @cmember open can fail reasonably with // at least ERROR_FILE_NOT_FOUND (2), // can still throw for invalid parameters, etc. __declspec(nothrow) HRESULT HrOpen(HKEY hKeyParent, PCWSTR pszKeyName, REGSAM samDesired = KEY_READ) /*throw()*/; // @cmember return disposition DWORD Create(HKEY hKeyParent, PCWSTR pszKeyName, REGSAM samDesired = KEY_ALL_ACCESS) throw(CErr); // @cmember Delete a value from registry void ThrDeleteValue ( const F::CBaseStringBuffer& strValueName ); // @cmember operator = VOID operator=(HKEY) throw(CErr); // @cmember operator HKEY operator HKEY() throw(CErr); // bitwise const, but not necessarily logically const // @cmember same as operator= void ThrAttach(HKEY) throw(CErr); __declspec(nothrow) HKEY Detach() /*throw()*/; // @cmember set value void ThrSetValue(PCWSTR pszValueName, const F::CBaseStringBuffer& strValue) throw(CErr); // @cmember set value void ThrSetValue(PCWSTR pszValueName, const DWORD& dwValue) throw(CErr); // @cmember query value void ThrQueryValue(PCWSTR pszValueName, DWORD* pdwType, BYTE* pbData, DWORD* pcbData) const throw(CErr); // @cmember query value void ThrQueryValue(PCWSTR szValueName, F::CBaseStringBuffer* pstrValue) const throw(CErr); // @cmember FUTURE //void ThrQueryValue(PCWSTR szValueName, DWORD* pdwValue) const throw(CErr); // @cmember query can fail reasonably with at least ERROR_FILE_NOT_FOUND (==2), // can still throw for invalid parameters, etc. HRESULT HrQueryValue(PCWSTR szValueName, F::CBaseStringBuffer* pstrValue) const throw(CErr); // @cmember query can fail reasonably with at least ERROR_FILE_NOT_FOUND (==2), // can still throw for invalid parameters, etc. HRESULT HrQueryValue(PCWSTR szValueName, DWORD* pdwValue) const throw(CErr); // @cmember a subset of RegQueryInfoKey // consumed by CEnumValues static void ThrQueryValuesInfo(HKEY hKey, DWORD* pcValues, DWORD* pcchMaxValueNameLength, DWORD* pcbMaxValueLength) throw(CErr); // @cmember a subset of RegQueryInfoKey // consumed by CEnumKeys static void ThrQuerySubKeysInfo(HKEY hKey, DWORD* pcSubKeys, DWORD* pcchMaxSubKeyNameLength) throw(CErr); // @cmember // intended client is CEnumKeys, so lack of F::CStringBuffer support is ok static void ThrEnumKey(HKEY hKey, DWORD dwIndex, PWSTR pszSubKeyName, DWORD* pcchSubKeyNameLength) throw(CErr); static LONG RegEnumKey(HKEY hKey, DWORD dwIndex, PWSTR pszSubKeyName, DWORD* pcchSubKeyNameLength) throw(CErr); // @cmember // intended client is CEnumValues, so lack of F::CStringBuffer support is ok static void ThrEnumValue(HKEY hKey, DWORD dwIndex, PWSTR pszValueName, DWORD* pcchValueNameLength, DWORD* pdwType, BYTE* pbData, DWORD* pcbData) throw(CErr); // @cmember query values into void ThrQueryValuesInfo(DWORD* pcValues, DWORD* pcchMaxValueNameLength, DWORD* cbMaxValueLength) const throw(CErr); // @cmember Recursively delete keys void ThrRecurseDeleteKey(LPCWSTR lpszKey) throw(CErr); // @cmember Delete a sub key void DeleteSubKey(LPCWSTR lpszSubKey) throw(CErr); // @cmember FUTURE no clients //void ThrQuerySubKeysInfo(DWORD* pcSubKeys, DWORD* pcchMaxSubKeyNameLength) const throw(CErr); // @cmember FUTURE no clients //void ThrEnumValue(DWORD dwIndex, PWSTR pszValueName, DWORD* pcchValueNameLength, DWORD* pdwType, BYTE* pbData, DWORD* pcbData) const throw(CErr); // @cmember FUTURE no clients //void ThrEnumKey(DWORD dwIndex, PWSTR pszSubKeyName, DWORD* pcchSubKeyNameLength) const throw(CErr); /* FUTURE stuff from ATL 6.0 LONG Close(); HKEY Detach(); void Attach(HKEY hKey); LONG DeleteValue(LPCTSTR lpszValue); */ // because there is no documented invalid value for HKEY, we do // not offer a way to get at the HKEY directly to store over it; // we must maintain the m_fValid member datum. // HKEY* PhPointerToUnderlying(); protected: // @cmember a regular HKEY that we wrap HKEY m_hKey; // @cmember // so that VReadString doesn't call RegQueryInfoKey every time // invalidated by VSetValue, but we still handle // ERROR_MORE_DATA in VReadString since this isn't robust mutable DWORD m_cbMaxValueLength; // bools at end for alignment reasons // @cmember since there is no documented invalid value for HKEY, this // seperate bool indicates if we have a valid value. bool m_fValid; // @cmember is m_cbMaxValueLength up to date as far as we know. mutable bool m_fMaxValueLengthValid; // @cmember access value is valid bool m_fKnownSam; // @cmember keep the access that we opened with. REGSAM m_samDesired; // @cmember Needs a definition operator HKEY() const throw(CErr); // bitwise const, but not necessarily logically const // @cmember fix up nulls etc __declspec(nothrow) static VOID FixBadRegistryStringValue ( HKEY Key, PCWSTR ValueName, DWORD cbActualBufferSize, LONG lRes, DWORD dwType, BYTE* pbData, DWORD* pcbData ) /*throw()*/; // @cmember query info static VOID ThrQueryInfo ( HKEY hKey, WCHAR* pClass, DWORD* pcbClass, DWORD* pReserved, DWORD* pcSubKeys, DWORD* pcchMaxSubKeyLength, DWORD* pcchMaxClassLength, DWORD* pcValues, DWORD* pcchMaxValueNameLength, DWORD* pcbMaxValueDataLength, DWORD* pcbSecurityDescriptorLength, FILETIME* pftLastWriteTime ) throw(CErr); static void GetKeyNameForDiagnosticPurposes(HKEY, F::CUnicodeBaseStringBuffer &); private: CRegKey2(const CRegKey2&); // deliberately not impelemented void operator=(const CRegKey2&); // deliberately not impelemented }; } // namespace #endif // }