516 lines
16 KiB
C++
516 lines
16 KiB
C++
// --------------------------------------------------------------------------
|
|
// Module Name: RegistryResources.cpp
|
|
//
|
|
// Copyright (c) 1999-2000, Microsoft Corporation
|
|
//
|
|
// General class definitions that assist in resource management. These are
|
|
// typically stack based objects where constructors initialize to a known
|
|
// state. Member functions operate on that resource. Destructors release
|
|
// resources when the object goes out of scope.
|
|
//
|
|
// History: 1999-08-18 vtan created
|
|
// 1999-11-16 vtan separate file
|
|
// 2000-01-31 vtan moved from Neptune to Whistler
|
|
// --------------------------------------------------------------------------
|
|
|
|
#include "StandardHeader.h"
|
|
#include "RegistryResources.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "StringConvert.h"
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::CRegKey
|
|
//
|
|
// Arguments: <none>
|
|
//
|
|
// Returns: <none>
|
|
//
|
|
// Purpose: Initializes the CRegKey object.
|
|
//
|
|
// History: 1999-08-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
CRegKey::CRegKey (void) :
|
|
_hKey(NULL),
|
|
_dwIndex(0)
|
|
|
|
{
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::~CRegKey
|
|
//
|
|
// Arguments: <none>
|
|
//
|
|
// Returns: <none>
|
|
//
|
|
// Purpose: Releases resources used by the CRegKey object.
|
|
//
|
|
// History: 1999-08-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
CRegKey::~CRegKey (void)
|
|
|
|
{
|
|
TW32(Close());
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::Create
|
|
//
|
|
// Arguments: See the platform SDK under advapi32!RegCreateKeyEx.
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: See advapi32!RegCreateKeyEx.
|
|
//
|
|
// History: 1999-08-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::Create (HKEY hKey, LPCTSTR lpSubKey, DWORD dwOptions, REGSAM samDesired, LPDWORD lpdwDisposition)
|
|
|
|
{
|
|
TW32(Close());
|
|
return(RegCreateKeyEx(hKey, lpSubKey, 0, NULL, dwOptions, samDesired, NULL, &_hKey, lpdwDisposition));
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::Open
|
|
//
|
|
// Arguments: See the platform SDK under advapi32!RegOpenKeyEx.
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: See advapi32!RegOpenKeyEx.
|
|
//
|
|
// History: 1999-08-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::Open (HKEY hKey, LPCTSTR lpSubKey, REGSAM samDesired)
|
|
|
|
{
|
|
TW32(Close());
|
|
return(RegOpenKeyEx(hKey, lpSubKey, 0, samDesired, &_hKey));
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::OpenCurrentUser
|
|
//
|
|
// Arguments: lpSubKey = Subkey to open under the current user.
|
|
// samDesired = Desired access.
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: Opens HKEY_CURRENT_USER\<lpSubKey> for the impersonated user.
|
|
// If the thread isn't impersonating it opens the .default user.
|
|
//
|
|
// History: 2000-05-23 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::OpenCurrentUser (LPCTSTR lpSubKey, REGSAM samDesired)
|
|
|
|
{
|
|
LONG lErrorCode;
|
|
NTSTATUS status;
|
|
HKEY hKeyCurrentUser;
|
|
|
|
status = RtlOpenCurrentUser(samDesired, reinterpret_cast<void**>(&hKeyCurrentUser));
|
|
if (NT_SUCCESS(status))
|
|
{
|
|
lErrorCode = Open(hKeyCurrentUser, lpSubKey, samDesired);
|
|
TW32(RegCloseKey(hKeyCurrentUser));
|
|
}
|
|
else
|
|
{
|
|
lErrorCode = RtlNtStatusToDosError(status);
|
|
}
|
|
return(lErrorCode);
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::QueryValue
|
|
//
|
|
// Arguments: See the platform SDK under advapi32!RegQueryValueEx.
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: See advapi32!RegQueryValueEx.
|
|
//
|
|
// History: 1999-08-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::QueryValue (LPCTSTR lpValueName, LPDWORD lpType, LPVOID lpData, LPDWORD lpcbData) const
|
|
|
|
{
|
|
ASSERTMSG(_hKey != NULL, "No open HKEY in CRegKey::QueryValue");
|
|
return(RegQueryValueEx(_hKey, lpValueName, NULL, lpType, reinterpret_cast<LPBYTE>(lpData), lpcbData));
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::SetValue
|
|
//
|
|
// Arguments: See the platform SDK under advapi32!RegSetValueEx.
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: See advapi32!RegSetValueEx.
|
|
//
|
|
// History: 1999-08-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::SetValue (LPCTSTR lpValueName, DWORD dwType, CONST VOID *lpData, DWORD cbData) const
|
|
|
|
{
|
|
ASSERTMSG(_hKey != NULL, "No open HKEY in CRegKey::SetValue");
|
|
return(RegSetValueEx(_hKey, lpValueName, 0, dwType, reinterpret_cast<const unsigned char*>(lpData), cbData));
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::DeleteValue
|
|
//
|
|
// Arguments: See the platform SDK under advapi32!RegDeleteValue.
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: See advapi32!RegDeleteValue.
|
|
//
|
|
// History: 1999-10-31 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::DeleteValue (LPCTSTR lpValueName) const
|
|
|
|
{
|
|
ASSERTMSG(_hKey != NULL, "No open HKEY in CRegKey::DeleteValue");
|
|
return(RegDeleteValue(_hKey, lpValueName));
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::QueryInfoKey
|
|
//
|
|
// Arguments: See the platform SDK under advapi32!RegQueryInfoKey.
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: See advapi32!RegQueryInfoKey.
|
|
//
|
|
// History: 1999-08-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::QueryInfoKey (LPTSTR lpClass, LPDWORD lpcbClass, LPDWORD lpcSubKeys, LPDWORD lpcbMaxSubKeyLen, LPDWORD lpcbMaxClassLen, LPDWORD lpcValues, LPDWORD lpcbMaxValueNameLen, LPDWORD lpcbMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime) const
|
|
|
|
{
|
|
ASSERTMSG(_hKey != NULL, "No open HKEY in CRegKey::QueryInfoKey");
|
|
return(RegQueryInfoKey(_hKey, lpClass, lpcbClass, NULL, lpcSubKeys, lpcbMaxSubKeyLen, lpcbMaxClassLen, lpcValues, lpcbMaxValueNameLen, lpcbMaxValueLen, lpcbSecurityDescriptor, lpftLastWriteTime));
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::Reset
|
|
//
|
|
// Arguments: <none>
|
|
//
|
|
// Returns: <none>
|
|
//
|
|
// Purpose: Reset the enumeration index member variable used in
|
|
// advapi32!RegEnumValue.
|
|
//
|
|
// History: 1999-08-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
void CRegKey::Reset (void)
|
|
|
|
{
|
|
_dwIndex = 0;
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::Next
|
|
//
|
|
// Arguments: See the platform SDK under advapi32!RegEnumValue.
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: See advapi32!RegEnumValue.
|
|
//
|
|
// History: 1999-08-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::Next (LPTSTR lpValueName, LPDWORD lpcbValueName, LPDWORD lpType, LPVOID lpData, LPDWORD lpcbData)
|
|
|
|
{
|
|
return(RegEnumValue(_hKey, _dwIndex++, lpValueName, lpcbValueName, NULL, lpType, reinterpret_cast<LPBYTE>(lpData), lpcbData));
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::GetString
|
|
//
|
|
// Arguments: pszValueName = Name of value in key to get data of.
|
|
// pszValueData = String buffer to be filled with data.
|
|
// pdwValueDataSize = Size (in characters) of buffer.
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: Queries the registry key for the specified value and returns
|
|
// the data to the caller. Asserts for REG_SZ.
|
|
//
|
|
// History: 1999-09-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::GetString (const TCHAR *pszValueName, TCHAR *pszValueData, int iStringCount) const
|
|
|
|
{
|
|
LONG errorCode;
|
|
DWORD dwType, dwValueDataSizeInBytes;
|
|
|
|
dwValueDataSizeInBytes = iStringCount * sizeof(TCHAR);
|
|
errorCode = QueryValue(pszValueName, &dwType, pszValueData, &dwValueDataSizeInBytes);
|
|
if (ERROR_SUCCESS == errorCode)
|
|
{
|
|
if (dwType != REG_SZ)
|
|
{
|
|
DISPLAYMSG("CRegKey::GetString retrieved data that is not REG_SZ");
|
|
errorCode = ERROR_INVALID_DATA;
|
|
}
|
|
}
|
|
return(errorCode);
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::GetPath
|
|
//
|
|
// Arguments: pszValueName = Name of value in key to get data of.
|
|
// pszValueData = String buffer to be filled with data.
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: Queries the registry key for the specified value and returns
|
|
// the data to the caller. Asserts for REG_SZ or REG_EXPAND_SZ.
|
|
// Also expands the path stored as well as assumes that MAX_PATH
|
|
// is the buffer size.
|
|
//
|
|
// History: 1999-09-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::GetPath (const TCHAR *pszValueName, TCHAR *pszValueData) const
|
|
|
|
{
|
|
LONG errorCode;
|
|
DWORD dwType, dwRawPathSize;
|
|
TCHAR szRawPath[MAX_PATH];
|
|
|
|
dwRawPathSize = sizeof(szRawPath);
|
|
errorCode = QueryValue(pszValueName, &dwType, szRawPath, &dwRawPathSize);
|
|
if (ERROR_SUCCESS == errorCode)
|
|
{
|
|
if (dwType == REG_SZ)
|
|
{
|
|
lstrcpyn(pszValueData, szRawPath, MAX_PATH);
|
|
}
|
|
else if (dwType == REG_EXPAND_SZ)
|
|
{
|
|
if (ExpandEnvironmentStrings(szRawPath, pszValueData, MAX_PATH) == 0)
|
|
{
|
|
lstrcpyn(pszValueData, szRawPath, MAX_PATH);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DISPLAYMSG("CRegKey::GetPath retrieved data that is not REG_SZ or REG_EXPAND_SZ");
|
|
errorCode = ERROR_INVALID_DATA;
|
|
}
|
|
}
|
|
return(errorCode);
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::GetDWORD
|
|
//
|
|
// Arguments: pszValueName = Name of value in key to get data of.
|
|
// pdwValueData = DWORD buffer to be filled with data.
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: Queries the registry key for the specified value and returns
|
|
// the data to the caller. Asserts for REG_DWORD.
|
|
//
|
|
// History: 1999-09-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::GetDWORD (const TCHAR *pszValueName, DWORD& dwValueData) const
|
|
|
|
{
|
|
LONG errorCode;
|
|
DWORD dwType, dwValueDataSize;
|
|
|
|
dwValueDataSize = sizeof(DWORD);
|
|
errorCode = QueryValue(pszValueName, &dwType, &dwValueData, &dwValueDataSize);
|
|
if (ERROR_SUCCESS == errorCode)
|
|
{
|
|
if (dwType != REG_DWORD)
|
|
{
|
|
DISPLAYMSG("CRegKey::GetString retrieved data that is not REG_DWORD");
|
|
errorCode = ERROR_INVALID_DATA;
|
|
}
|
|
}
|
|
return(errorCode);
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::GetInteger
|
|
//
|
|
// Arguments: pszValueName = Name of value in key to get data of.
|
|
// piValueData = Integer buffer to be filled with data.
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: Queries the registry key for the specified value and returns
|
|
// the data to the caller. If the data is REG_DWORD this is
|
|
// casted. If the data is REG_SZ this is converted. Everything
|
|
// is illegal (including REG_EXPAND_SZ).
|
|
//
|
|
// History: 1999-09-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::GetInteger (const TCHAR *pszValueName, int& iValueData) const
|
|
|
|
{
|
|
LONG errorCode;
|
|
DWORD dwType, dwValueDataSize;
|
|
|
|
errorCode = QueryValue(pszValueName, &dwType, NULL, NULL);
|
|
if (ERROR_SUCCESS == errorCode)
|
|
{
|
|
if (dwType == REG_DWORD)
|
|
{
|
|
dwValueDataSize = sizeof(int);
|
|
errorCode = QueryValue(pszValueName, NULL, &iValueData, &dwValueDataSize);
|
|
}
|
|
else if (dwType == REG_SZ)
|
|
{
|
|
TCHAR szTemp[32];
|
|
|
|
dwValueDataSize = ARRAYSIZE(szTemp);
|
|
errorCode = QueryValue(pszValueName, NULL, szTemp, &dwValueDataSize);
|
|
if (ERROR_SUCCESS == errorCode)
|
|
{
|
|
char aszTemp[32];
|
|
|
|
CStringConvert::TCharToAnsi(szTemp, aszTemp, ARRAYSIZE(aszTemp));
|
|
iValueData = atoi(aszTemp);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DISPLAYMSG("CRegKey::GetString retrieved data that is not REG_DWORD");
|
|
errorCode = ERROR_INVALID_DATA;
|
|
}
|
|
}
|
|
return(errorCode);
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::SetString
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose:
|
|
//
|
|
// History: 1999-10-26 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::SetString (const TCHAR *pszValueName, const TCHAR *pszValueData) const
|
|
|
|
{
|
|
return(SetValue(pszValueName, REG_SZ, pszValueData, (lstrlen(pszValueData) + sizeof('\0')) * sizeof(TCHAR)));
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::SetPath
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose:
|
|
//
|
|
// History: 1999-10-26 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::SetPath (const TCHAR *pszValueName, const TCHAR *pszValueData) const
|
|
|
|
{
|
|
return(SetValue(pszValueName, REG_EXPAND_SZ, pszValueData, (lstrlen(pszValueData) + sizeof('\0')) * sizeof(TCHAR)));
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::SetDWORD
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose:
|
|
//
|
|
// History: 1999-10-26 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::SetDWORD (const TCHAR *pszValueName, DWORD dwValueData) const
|
|
|
|
{
|
|
return(SetValue(pszValueName, REG_DWORD, &dwValueData, sizeof(dwValueData)));
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::SetInteger
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose:
|
|
//
|
|
// History: 1999-10-26 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::SetInteger (const TCHAR *pszValueName, int iValueData) const
|
|
|
|
{
|
|
TCHAR szString[kMaximumValueDataLength];
|
|
|
|
wsprintf(szString, TEXT("%d"), iValueData);
|
|
return(SetString(pszValueName, szString));
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CRegKey::Close
|
|
//
|
|
// Arguments: <none>
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: Closes HKEY resource (if open).
|
|
//
|
|
// History: 1999-08-18 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CRegKey::Close (void)
|
|
|
|
{
|
|
LONG errorCode;
|
|
|
|
if (_hKey != NULL)
|
|
{
|
|
errorCode = RegCloseKey(_hKey);
|
|
_hKey = NULL;
|
|
}
|
|
else
|
|
{
|
|
errorCode = ERROR_SUCCESS;
|
|
}
|
|
return(errorCode);
|
|
}
|
|
|