windows-nt/Source/XPSP1/NT/shell/services/hdsrv/lib/reg.cpp
2020-09-26 16:20:57 +08:00

413 lines
8.2 KiB
C++

#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;
}