#include "shellprv.h" #pragma hdrstop #include "regsuprt.h" #ifdef DEBUG UINT CRegSupport::_cRefHKEY = 0; UINT CRegSupport::_cRefExternalHKEY = 0; #endif void CRegSupport::RSInitRoot(HKEY hkey, LPCTSTR pszSubKey1, LPCTSTR pszSubKey2, DWORD dwRootOptions, DWORD dwDefaultOptions) { _dwRootOptions = dwRootOptions; _dwDefaultOptions = dwDefaultOptions; _hkeyInit = hkey; _InitSetRoot(pszSubKey1, pszSubKey2); #ifdef DEBUG ASSERT(!_fInited); _fInited = TRUE; #endif } BOOL CRegSupport::RSSubKeyExist(LPCTSTR pszSubKey) { BOOL fRet = FALSE; HKEY hkeySubKey = NULL; _EnterCSKeyRoot(); if (pszSubKey && *pszSubKey) hkeySubKey = _GetSubKey(pszSubKey, FALSE); else hkeySubKey = _GetRootKey(FALSE); if (hkeySubKey) { fRet = TRUE; _CloseRegSubKey(hkeySubKey); } _LeaveCSKeyRoot(); return fRet; } BOOL CRegSupport::RSValueExist(LPCTSTR pszSubKey, LPCTSTR pszValueName) { BOOL fRet = FALSE; HKEY hkeySubKey = NULL; _EnterCSKeyRoot(); if (pszSubKey && *pszSubKey) hkeySubKey = _GetSubKey(pszSubKey, FALSE); else hkeySubKey = _GetRootKey(FALSE); if (hkeySubKey) { fRet = (RegQueryValueEx(hkeySubKey, pszValueName, 0, NULL, NULL, NULL) == ERROR_SUCCESS); _CloseRegSubKey(hkeySubKey); } _LeaveCSKeyRoot(); return fRet; } BOOL CRegSupport::RSDeleteValue(LPCTSTR pszSubKey, LPCTSTR pszValueName) { BOOL fRet = FALSE; HKEY hkeySubKey = NULL; _EnterCSKeyRoot(); if (pszSubKey && *pszSubKey) hkeySubKey = _GetSubKey(pszSubKey, FALSE); else hkeySubKey = _GetRootKey(FALSE); if (hkeySubKey) { if (ERROR_SUCCESS == RegDeleteValue(hkeySubKey, pszValueName)) { fRet = TRUE; } _CloseRegSubKey(hkeySubKey); } _LeaveCSKeyRoot(); return fRet; } BOOL CRegSupport::RSDeleteKey() { BOOL bRet = FALSE; TCHAR szRoot[MAX_ROOT]; if (_hkeyInit) { if (SHDeleteKey(_hkeyInit, _GetRoot(szRoot, ARRAYSIZE(szRoot))) == ERROR_SUCCESS) { bRet = TRUE; } } return bRet; } BOOL CRegSupport::RSDeleteSubKey(LPCTSTR pszSubKey) { BOOL fRet = FALSE; _EnterCSKeyRoot(); HKEY hkey = _GetRootKey(FALSE); if (hkey) { if (ERROR_SUCCESS == SHDeleteKey(hkey, pszSubKey)) { fRet = TRUE; } _CloseRegSubKey(hkey); } _LeaveCSKeyRoot(); return fRet; } BOOL CRegSupport::RSSetBinaryValue(LPCTSTR pszSubKey, LPCTSTR pszValueName, PBYTE pb, DWORD cb, DWORD dwOptions) { return _SetGeneric(pszSubKey, pszValueName, pb, cb, REG_BINARY, dwOptions); } BOOL CRegSupport::RSSetTextValue(LPCTSTR pszSubKey, LPCTSTR pszValueName, LPCTSTR pszValue, DWORD dwOptions) { return _SetGeneric(pszSubKey, pszValueName, (PBYTE)pszValue, (lstrlen(pszValue) + 1) * sizeof(TCHAR), REG_SZ, dwOptions); } BOOL CRegSupport::RSSetDWORDValue(LPCTSTR pszSubKey, LPCTSTR pszValueName, DWORD dwValue, DWORD dwOptions) { return _SetGeneric(pszSubKey, pszValueName, (PBYTE)&dwValue, sizeof(DWORD), REG_DWORD, dwOptions); } BOOL CRegSupport::RSGetBinaryValue(LPCTSTR pszSubKey, LPCTSTR pszValueName, PBYTE pb, DWORD* pcb) { return _GetGeneric(pszSubKey, pszValueName, pb, pcb); } BOOL CRegSupport::RSGetTextValue(LPCTSTR pszSubKey, LPCTSTR pszValueName, LPTSTR pszValue, DWORD* pcchValue) { DWORD cbData = *pcchValue * sizeof(TCHAR); return _GetGeneric(pszSubKey, pszValueName, (PBYTE)pszValue, &cbData); } BOOL CRegSupport::RSGetDWORDValue(LPCTSTR pszSubKey, LPCTSTR pszValueName, DWORD* pdwValue) { DWORD cbData = sizeof(DWORD); return _GetGeneric(pszSubKey, pszValueName, (PBYTE)pdwValue, &cbData); } BOOL CRegSupport::_SetGeneric(LPCTSTR pszSubKey, LPCTSTR pszValueName, PBYTE pb, DWORD cb, DWORD dwType, DWORD dwOptions) { BOOL fRet = FALSE; HKEY hkeySubKey = NULL; _EnterCSKeyRoot(); if (pszSubKey && *pszSubKey) hkeySubKey = _GetSubKey(pszSubKey, TRUE, dwOptions); else hkeySubKey = _GetRootKey(TRUE, dwOptions); if (hkeySubKey) { if (ERROR_SUCCESS == RegSetValueEx(hkeySubKey, pszValueName, 0, dwType, pb, cb)) { fRet = TRUE; } _CloseRegSubKey(hkeySubKey); } _LeaveCSKeyRoot(); return fRet; } BOOL CRegSupport::_GetGeneric(LPCTSTR pszSubKey, LPCTSTR pszValueName, PBYTE pb, DWORD* pcb) { BOOL fRet = FALSE; HKEY hkeySubKey = NULL; _EnterCSKeyRoot(); if (pszSubKey && *pszSubKey) hkeySubKey = _GetSubKey(pszSubKey, FALSE); else hkeySubKey = _GetRootKey(FALSE); if (hkeySubKey) { if (ERROR_SUCCESS == SHQueryValueEx(hkeySubKey, pszValueName, 0, NULL, pb, pcb)) { fRet = TRUE; } _CloseRegSubKey(hkeySubKey); } _LeaveCSKeyRoot(); return fRet; } HKEY CRegSupport::RSDuplicateRootKey() { RIP(_fInited); #ifdef DEBUG // we need to decrement here since it will be icnremented inside this fct // and the key will not be close by this object --_cRefHKEY; ++_cRefExternalHKEY; #endif TCHAR szRoot[MAX_ROOT]; return _RegCreateKeyExHelper(_hkeyInit, _GetRoot(szRoot, ARRAYSIZE(szRoot)), _dwRootOptions); } HKEY CRegSupport::RSDuplicateSubKey(LPCTSTR pszSubKey, BOOL fCreate, BOOL fVolatile) { return _GetSubKey(pszSubKey, fCreate, fVolatile ? REG_OPTION_VOLATILE : REG_OPTION_NON_VOLATILE); } HKEY CRegSupport::_GetRootKey(BOOL fCreate, DWORD dwOptions) { RIP(_fInited); HKEY hkey; TCHAR szRoot[MAX_ROOT]; if (REG_OPTION_INVALID == dwOptions) dwOptions = _dwRootOptions; if (fCreate) hkey = _RegCreateKeyExHelper(_hkeyInit, _GetRoot(szRoot, ARRAYSIZE(szRoot)), dwOptions); else hkey = _RegOpenKeyExHelper(_hkeyInit, _GetRoot(szRoot, ARRAYSIZE(szRoot))); return hkey; } void CRegSupport::_CloseRegSubKey(HKEY hkeySubKey) { RegCloseKey(hkeySubKey); #ifdef DEBUG --_cRefHKEY; #endif } // Always need to be called from within the _csRootKey critical section (when critical section // stuff is enabled) HKEY CRegSupport::_GetSubKey(LPCTSTR pszSubKey, BOOL fCreate, DWORD dwOptions) { HKEY hkey = NULL; HKEY hRootKey = _GetRootKey(fCreate, dwOptions); if (REG_OPTION_INVALID == dwOptions) dwOptions = _dwDefaultOptions; if (hRootKey) { if (fCreate) hkey = _RegCreateKeyExHelper(hRootKey, pszSubKey, dwOptions); else hkey = _RegOpenKeyExHelper(hRootKey, pszSubKey); _CloseRegSubKey(hRootKey); } return hkey; } //static HKEY CRegSupport::_RegCreateKeyExHelper(HKEY hkey, LPCTSTR pszSubKey, DWORD dwOptions) { HKEY hkeyTmp; DWORD dwDisp; ASSERT(REG_OPTION_INVALID != dwOptions); if (ERROR_SUCCESS != RegCreateKeyEx(hkey, pszSubKey, 0, NULL, dwOptions, MAXIMUM_ALLOWED, NULL, &hkeyTmp, &dwDisp)) { hkeyTmp = NULL; } #ifdef DEBUG else { ++_cRefHKEY; } #endif return hkeyTmp; } //static HKEY CRegSupport::_RegOpenKeyExHelper(HKEY hkey, LPCTSTR pszSubKey) { HKEY hkeyTmp; if (ERROR_SUCCESS != RegOpenKeyEx(hkey, pszSubKey, 0, MAXIMUM_ALLOWED, &hkeyTmp)) { hkeyTmp = NULL; } #ifdef DEBUG else { ++_cRefHKEY; } #endif return hkeyTmp; } BOOL CRegSupport::_InitSetRoot(LPCTSTR pszSubKey1, LPCTSTR pszSubKey2) { _pszSubKey1 = pszSubKey1; _pszSubKey2 = pszSubKey2; return TRUE; } LPCTSTR CRegSupport::_GetRoot(LPTSTR pszRoot, DWORD cchRoot) { ASSERT(cchRoot > 0); LPTSTR pszNext; size_t cchLeft; HRESULT hr; hr = StringCchCopyEx(pszRoot, cchRoot, _pszSubKey1, &pszNext, &cchLeft, 0); if (SUCCEEDED(hr)) { if (_pszSubKey2) { hr = StringCchCopyEx(pszNext, cchLeft, TEXT("\\"), &pszNext, &cchLeft, 0); if (SUCCEEDED(hr)) { hr = StringCchCopy(pszNext, cchLeft, _pszSubKey2); } } } if (FAILED(hr)) { *pszRoot = 0; } return pszRoot; } void CRegSupport::_EnterCSKeyRoot() { if (_fcsKeyRoot) { EnterCriticalSection(&_csKeyRoot); } } void CRegSupport::_LeaveCSKeyRoot() { if (_fcsKeyRoot) { LeaveCriticalSection(&_csKeyRoot); } } CRegSupport::CRegSupport() : _hkeyInit(NULL) {} CRegSupport::~CRegSupport() { if (_fcsKeyRoot) { DeleteCriticalSection(&_csKeyRoot); } }