2025-11-28 00:35:46 +09:00

279 lines
6.9 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved
#include "Private.h"
#include "RegKey.h"
//---------------------------------------------------------------------
//
// ctor
//
//---------------------------------------------------------------------
CRegKey::CRegKey()
{
_keyHandle = nullptr;
}
//---------------------------------------------------------------------
//
// dtor
//
//---------------------------------------------------------------------
CRegKey::~CRegKey()
{
Close();
}
//---------------------------------------------------------------------
//
// operator
//
//---------------------------------------------------------------------
HKEY CRegKey::GetHKEY()
{
return _keyHandle;
}
//---------------------------------------------------------------------
//
// Create
//
//---------------------------------------------------------------------
LONG CRegKey::Create(_In_ HKEY hKeyPresent, _In_ LPCWSTR pwszKeyName, _In_reads_opt_(255) LPWSTR pwszClass, DWORD dwOptions, REGSAM samDesired, _Inout_ LPSECURITY_ATTRIBUTES lpSecAttr, _Out_opt_ LPDWORD lpdwDisposition)
{
DWORD disposition = 0;
HKEY keyHandle = nullptr;
LONG res = RegCreateKeyEx(hKeyPresent, pwszKeyName, 0,
pwszClass, dwOptions, samDesired, lpSecAttr, &keyHandle, &disposition);
if (lpdwDisposition != nullptr)
{
*lpdwDisposition = disposition;
}
if (res == ERROR_SUCCESS)
{
Close();
_keyHandle = keyHandle;
}
return res;
}
//---------------------------------------------------------------------
//
// Open
//
//---------------------------------------------------------------------
LONG CRegKey::Open(_In_ HKEY hKeyParent, _In_ LPCWSTR pwszKeyName, REGSAM samDesired)
{
HKEY keyHandle = nullptr;
LONG res = RegOpenKeyEx(hKeyParent, pwszKeyName, 0, samDesired, &keyHandle);
if (res == ERROR_SUCCESS)
{
Close();
_keyHandle = keyHandle;
}
return res;
}
//---------------------------------------------------------------------
//
// Close
//
//---------------------------------------------------------------------
LONG CRegKey::Close()
{
LONG res = ERROR_SUCCESS;
if (_keyHandle)
{
res = RegCloseKey(_keyHandle);
_keyHandle = nullptr;
}
return res;
}
//---------------------------------------------------------------------
//
// DeleteSubKey
// RecurseDeleteKey
//
//---------------------------------------------------------------------
LONG CRegKey::DeleteSubKey(_In_ LPCWSTR pwszSubKey)
{
return RegDeleteKey(_keyHandle, pwszSubKey);
}
LONG CRegKey::RecurseDeleteKey(_In_ LPCWSTR pwszSubKey)
{
CRegKey key;
LONG res = key.Open(_keyHandle, pwszSubKey, KEY_READ | KEY_WRITE);
if (res != ERROR_SUCCESS)
{
return res;
}
FILETIME time;
WCHAR subKeyName[256] = {'\0'};
DWORD subKeyNameSize = ARRAYSIZE(subKeyName);
while (RegEnumKeyEx(key.GetHKEY(), 0, subKeyName, &subKeyNameSize, NULL, NULL, NULL, &time) == ERROR_SUCCESS)
{
subKeyName[ARRAYSIZE(subKeyName)-1] = L'\0';
res = key.RecurseDeleteKey(subKeyName);
if (res != ERROR_SUCCESS)
{
return res;
}
subKeyNameSize = ARRAYSIZE(subKeyName);
}
key.Close();
return DeleteSubKey(pwszSubKey);
}
//---------------------------------------------------------------------
//
// DeleteValue
//
//---------------------------------------------------------------------
LONG CRegKey::DeleteValue(_In_ LPCWSTR pwszValue)
{
return RegDeleteValue(_keyHandle, pwszValue);
}
//---------------------------------------------------------------------
//
// QueryStingValue
// SetStringValue
//
//---------------------------------------------------------------------
LONG CRegKey::QueryStringValue(_In_opt_ LPCWSTR pwszValueName, _Out_writes_opt_(*pnChars) LPWSTR pwszValue, _Inout_ ULONG *pnChars)
{
LONG res = 0;
DWORD dataType = REG_NONE;
ULONG pwszValueSize = 0;
if (pnChars == nullptr)
{
return E_INVALIDARG;
}
pwszValueSize = (*pnChars)*sizeof(WCHAR);
*pnChars = 0;
res = RegQueryValueEx(_keyHandle, pwszValueName, NULL, &dataType, (LPBYTE)pwszValue, &pwszValueSize);
if (res != ERROR_SUCCESS)
{
return res;
}
if ((dataType != REG_SZ) && (dataType != REG_EXPAND_SZ))
{
return ERROR_INVALID_DATA;
}
*pnChars = pwszValueSize / sizeof(WCHAR);
return ERROR_SUCCESS;
}
LONG CRegKey::SetStringValue(_In_opt_ LPCWSTR pwszValueName, _In_ LPCWSTR pwszValue, DWORD dwType)
{
size_t lenOfValue = 0;
if (pwszValue == nullptr)
{
return ERROR_INVALID_PARAMETER;
}
if (StringCchLength(pwszValue, STRSAFE_MAX_CCH, &lenOfValue) != S_OK)
{
return ERROR_INVALID_PARAMETER;
}
DWORD len = static_cast<DWORD>(lenOfValue);
return RegSetValueEx(_keyHandle, pwszValueName, NULL, dwType, (LPBYTE)pwszValue, (++len)*sizeof(WCHAR));
}
//---------------------------------------------------------------------
//
// QueryDWORDValue
// SetDWORDValue
//
//---------------------------------------------------------------------
LONG CRegKey::QueryDWORDValue(_In_opt_ LPCWSTR pwszValueName, _Out_ DWORD &dwValue)
{
LONG res = 0;
DWORD dataType = REG_NONE;
ULONG pwszValueSize = 0;
pwszValueSize = sizeof(DWORD);
res = RegQueryValueEx(_keyHandle, pwszValueName, NULL, &dataType, (LPBYTE)(&dwValue), &pwszValueSize);
if (res != ERROR_SUCCESS)
{
return res;
}
if (dataType != REG_DWORD)
{
return ERROR_INVALID_DATA;
}
return ERROR_SUCCESS;
}
LONG CRegKey::SetDWORDValue(_In_opt_ LPCWSTR pwszValueName, DWORD dwValue)
{
return RegSetValueEx(_keyHandle, pwszValueName, NULL, REG_DWORD, (LPBYTE)(&dwValue), sizeof(DWORD));
}
//---------------------------------------------------------------------
//
// QueryBinaryValue
// SetBinaryValue
//
//---------------------------------------------------------------------
LONG CRegKey::QueryBinaryValue(_In_opt_ LPCWSTR pwszValueName, _Out_writes_opt_(cbData) BYTE* lpData, DWORD cbData)
{
LONG res = 0;
DWORD dataType = REG_NONE;
ULONG pwszValueSize = 0;
pwszValueSize = cbData;
res = RegQueryValueEx(_keyHandle, pwszValueName, NULL, &dataType, lpData, &pwszValueSize);
if (res != ERROR_SUCCESS)
{
return res;
}
if (dataType != REG_BINARY)
{
return ERROR_INVALID_DATA;
}
if (pwszValueSize != cbData)
{
return ERROR_INVALID_DATA;
}
return ERROR_SUCCESS;
}
LONG CRegKey::SetBinaryValue(_In_opt_ LPCWSTR pwszValueName, _In_reads_(cbData) BYTE* lpData, DWORD cbData)
{
return RegSetValueEx(_keyHandle, pwszValueName, NULL, REG_BINARY, lpData, cbData);
}