#include "reg.h" #include "sfstr.h" #include "dbg.h" #define ARRAYSIZE(a) (sizeof((a))/sizeof((a)[0])) /////////////////////////////////////////////////////////////////////////////// // HRESULT _RegOpenKey(HKEY hkey, LPCWSTR pszKey, HKEY* phkey) { HRESULT hres; if (ERROR_SUCCESS == RegOpenKeyEx(hkey, pszKey, 0, MAXIMUM_ALLOWED, phkey)) { hres = S_OK; } else { hres = S_FALSE; *phkey = NULL; } return hres; } HRESULT _RegCreateKey(HKEY hkey, LPCWSTR pszKey, HKEY* phkey, DWORD* pdwDisp) { HRESULT hres; if (ERROR_SUCCESS == RegCreateKeyEx(hkey, pszKey, 0, 0, REG_OPTION_NON_VOLATILE, MAXIMUM_ALLOWED, NULL, phkey, pdwDisp)) { hres = S_OK; } else { hres = S_FALSE; *phkey = NULL; } return hres; } HRESULT _RegCloseKey(HKEY hkey) { RegCloseKey(hkey); return S_OK; } HRESULT _RegQueryType(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValueName, DWORD* pdwType) { HRESULT hres = S_FALSE; HKEY hkeyLocal = hkey; *pdwType = 0; if (pszSubKey) { hres = _RegOpenKey(hkey, pszSubKey, &hkeyLocal); } else { hres = S_OK; } if (SUCCEEDED(hres) && (S_FALSE != hres)) { if (ERROR_SUCCESS == RegQueryValueEx(hkeyLocal, pszValueName, 0, pdwType, NULL, NULL)) { hres = S_OK; } else { hres = S_FALSE; } if (pszSubKey) { _RegCloseKey(hkeyLocal); } } return hres; } HRESULT _RegQueryDWORD(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValueName, DWORD* pdwValue) { return _RegQueryGeneric(hkey, pszSubKey, pszValueName, (PBYTE)pdwValue, sizeof(*pdwValue)); } HRESULT _RegQueryGeneric(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValueName, PBYTE pbValue, DWORD cbValue) { HRESULT hres = S_FALSE; HKEY hkeyLocal = hkey; if (pszSubKey) { hres = _RegOpenKey(hkey, pszSubKey, &hkeyLocal); } else { hres = S_OK; } if (SUCCEEDED(hres) && (S_FALSE != hres)) { if (ERROR_SUCCESS == RegQueryValueEx(hkeyLocal, pszValueName, 0, NULL, pbValue, &cbValue)) { hres = S_OK; } else { hres = S_FALSE; } if (pszSubKey) { _RegCloseKey(hkeyLocal); } } return hres; } HRESULT _RegQueryGenericWithType(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValueName, DWORD* pdwType, PBYTE pbValue, DWORD cbValue) { HRESULT hres = S_FALSE; HKEY hkeyLocal = hkey; if (pszSubKey) { hres = _RegOpenKey(hkey, pszSubKey, &hkeyLocal); } else { hres = S_OK; } if (SUCCEEDED(hres) && (S_FALSE != hres)) { if (ERROR_SUCCESS == RegQueryValueEx(hkeyLocal, pszValueName, 0, pdwType, pbValue, &cbValue)) { hres = S_OK; } else { hres = S_FALSE; } if (pszSubKey) { _RegCloseKey(hkeyLocal); } } return hres; } HRESULT _RegDeleteValue(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValueName) { HRESULT hr = S_FALSE; HKEY hkeyLocal = hkey; if (pszSubKey) { hr = _RegOpenKey(hkey, pszSubKey, &hkeyLocal); } else { hr = S_OK; } if (SUCCEEDED(hr) && (S_FALSE != hr)) { if (ERROR_SUCCESS == RegDeleteValue(hkeyLocal, pszValueName)) { hr = S_OK; } else { hr = S_FALSE; } if (pszSubKey) { _RegCloseKey(hkeyLocal); } } return hr; } HRESULT _RegQueryValueSize(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValueName, DWORD* pcbValue) { HRESULT hres = S_FALSE; HKEY hkeyLocal = hkey; if (pszSubKey) { hres = _RegOpenKey(hkey, pszSubKey, &hkeyLocal); } else { hres = S_OK; } if (SUCCEEDED(hres) && (S_FALSE != hres)) { if (ERROR_SUCCESS == RegQueryValueEx(hkeyLocal, pszValueName, 0, NULL, NULL, pcbValue)) { hres = S_OK; } else { hres = S_FALSE; } if (pszSubKey) { _RegCloseKey(hkeyLocal); } } return hres; } HRESULT _RegSetGeneric(HKEY hkey, LPCWSTR pszValueName, DWORD dwType, PBYTE pbValue, DWORD cbValue) { HRESULT hres = S_FALSE; if (ERROR_SUCCESS == RegSetValueEx(hkey, pszValueName, 0, dwType, pbValue, cbValue)) { hres = S_OK; } return hres; } HRESULT _RegSetString(HKEY hkey, LPCWSTR pszValueName, LPCWSTR pszValue) { DWORD cb = (lstrlen(pszValue) + 1) * sizeof(WCHAR); return _RegSetGeneric(hkey, pszValueName, REG_SZ, (PBYTE)pszValue, cb); } HRESULT _RegSetDWORD(HKEY hkey, LPCWSTR pszValueName, DWORD dwValue) { return _RegSetGeneric(hkey, pszValueName, REG_DWORD, (PBYTE)&dwValue, sizeof(dwValue)); } HRESULT _RegSetBinary(HKEY hkey, LPCWSTR pszValueName, PVOID pvValue, DWORD cbValue) { return _RegSetGeneric(hkey, pszValueName, REG_BINARY, (LPBYTE)pvValue, cbValue); } HRESULT _RegQueryString(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValueName, LPWSTR pszValue, DWORD cchValue) { DWORD cb = cchValue * sizeof(WCHAR); return _RegQueryGeneric(hkey, pszSubKey, pszValueName, (PBYTE)pszValue, cb); } HRESULT _RegEnumStringValue(HKEY hkey, DWORD dwIndex, LPWSTR pszValue, DWORD cchValue) { HRESULT hres = S_FALSE; LONG lRes; if (ERROR_SUCCESS == (lRes = RegEnumValue(hkey, dwIndex, pszValue, &cchValue, 0, 0, 0, 0))) { hres = S_OK; } else { if ((ERROR_SUCCESS != lRes) && (ERROR_NO_MORE_ITEMS != lRes)) { hres = E_FAIL; } } return hres; } HRESULT _RegEnumStringKey(HKEY hkey, DWORD dwIndex, LPWSTR pszKey, DWORD cchKey) { HRESULT hres = S_FALSE; LONG lRes; if (ERROR_SUCCESS == (lRes = RegEnumKeyEx(hkey, dwIndex, pszKey, &cchKey, NULL, NULL, NULL, NULL))) { hres = S_OK; } else { if (ERROR_NO_MORE_ITEMS != lRes) { hres = E_FAIL; } } return hres; } HRESULT _RegSetKeyAndString(HKEY hkey, LPCWSTR pszKey, LPCWSTR pszSubkey, LPCWSTR pszValueName, LPCWSTR pszValue) { ASSERT(pszKey && *pszKey); WCHAR szKeyBuf[MAX_KEY]; LPWSTR pszNext; DWORD cchLeft; HRESULT hres = SafeStrCpyNEx(szKeyBuf, pszKey, ARRAYSIZE(szKeyBuf), &pszNext, &cchLeft); if (SUCCEEDED(hres)) { HKEY hkeyNew; if (pszSubkey) { hres = SafeStrCpyNEx(pszNext, TEXT("\\"), cchLeft, &pszNext, &cchLeft); if (SUCCEEDED(hres)) { hres = SafeStrCpyNEx(pszNext, pszSubkey, cchLeft, &pszNext, &cchLeft); } } if (SUCCEEDED(hres)) { // Create and open key and subkey. hres= _RegCreateKey(hkey, szKeyBuf, &hkeyNew, NULL); if (SUCCEEDED(hres) && (S_FALSE != hres)) { if (pszValue) { hres = _RegSetString(hkeyNew, pszValueName, pszValue); } RegCloseKey(hkeyNew); } } } return hres; } HRESULT _RegSubkeyExists(HKEY hkey, LPCWSTR pszPath, LPCWSTR pszSubkey) { WCHAR szKeyBuf[MAX_PATH]; LPWSTR pszNext; DWORD cchLeft; // Copy keyname into buffer. HRESULT hres = SafeStrCpyNEx(szKeyBuf, pszPath, ARRAYSIZE(szKeyBuf), &pszNext, &cchLeft); if (SUCCEEDED(hres)) { HKEY hkey2; if (pszSubkey) { hres = SafeStrCpyNEx(pszNext, TEXT("\\"), cchLeft, &pszNext, &cchLeft); if (SUCCEEDED(hres)) { hres = SafeStrCpyNEx(pszNext, pszSubkey, cchLeft, &pszNext, &cchLeft); } } if (SUCCEEDED(hres)) { // Determine if key exists by trying to open it. hres = _RegOpenKey(hkey, szKeyBuf, &hkey2); if (SUCCEEDED(hres) && (S_FALSE != hres)) { _RegCloseKey(hkey2); } } } return hres; }