reactos/base/applications/utilman/umandlg/registry.c

202 lines
6.3 KiB
C
Raw Normal View History

/*
* PROJECT: ReactOS Utility Manager Resources DLL (UManDlg.dll)
* LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
* PURPOSE: Registry functions for Utility Manager settings management
* COPYRIGHT: Copyright 2020 George Bișoc (george.bisoc@reactos.org)
*/
/* INCLUDES *******************************************************************/
#include "umandlg.h"
/* GLOBALS ********************************************************************/
REGISTRY_DATA RegData;
REGISTRY_SETTINGS Settings;
/* DEFINES ********************************************************************/
#define ACCESS_UTILMAN_KEY L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Accessibility\\Utility Manager"
#define UTILMAN_KEY L"SOFTWARE\\Microsoft\\Utility Manager"
#define OSK_KEY L"On-Screen Keyboard"
#define MAGNIFIER_KEY L"Magnifier"
/* FUNCTIONS ******************************************************************/
/**
* @InitAppRegKey
*
* Initialize a key. The function may not necessarily create it but open the key
* if it already exists. The disposition pointed lpdwDisposition determines that.
* This is a function helper.
*
* @param[in] hPredefinedKey
* The predefined key (e.g. HKEY_CLASSES_ROOT).
*
* @param[in] lpszSubKey
* The path to the sub key to be created.
*
* @param[out] phKey
* A pointer that receives a handle to the key given by the function.
*
* @param[out] lpdwDisposition
* A pointer that receives the disposition given by the function.
*
* @return
* Returns TRUE if the function successfully created a key (or opened it),
* FALSE otherwise for failure.
*
*/
BOOL InitAppRegKey(IN HKEY hPredefinedKey,
IN LPCWSTR lpszSubKey,
OUT PHKEY phKey,
OUT LPDWORD lpdwDisposition)
{
LONG lResult;
lResult = RegCreateKeyExW(hPredefinedKey,
lpszSubKey,
0,
NULL,
0,
KEY_WRITE,
NULL,
phKey,
lpdwDisposition);
if (lResult != ERROR_SUCCESS)
{
DPRINT("InitAppRegKey(): Failed to create the following key (or open the key) of path \"%S\". The error code is \"%li\".\n", lpszSubKey, lResult);
return FALSE;
}
return TRUE;
}
/**
* @QueryAppSettings
*
* Query the setting from the application's key. This is a function helper.
*
* @param[in] hKey
* A handle to a key.
*
* @param[in] lpszSubKey
* The path to a sub-key.
*
* @param[in] lpszRegValue
* The registry value where we need to get the data from.
*
* @param[out] ReturnedData
* An arbitrary pointer that receives the returned data. Being arbitrary,
* the data can be of any type.
*
* @param[inout] lpdwSizeData
* A pointer to the returned data pointed by ReturnedData parameter that
* retrieves the size of the aforementioned data, in bytes.
*
* @return
* Returns TRUE if the function successfully loaded the value we wanted,
* FALSE otherwise for failure.
*
*/
BOOL QueryAppSettings(IN HKEY hKey,
IN LPCWSTR lpszSubKey,
IN LPCWSTR lpszRegValue,
OUT PVOID ReturnedData,
IN OUT LPDWORD lpdwSizeData)
{
LONG lResult;
HKEY hKeyQueryValue;
lResult = RegOpenKeyExW(hKey,
lpszSubKey,
0,
KEY_READ,
&hKeyQueryValue);
if (lResult != ERROR_SUCCESS)
{
DPRINT("QueryAppSettings(): Failed to open the key of path \"%S\". The error code is \"%li\".\n", lpszSubKey, lResult);
return FALSE;
}
lResult = RegQueryValueExW(hKeyQueryValue,
lpszRegValue,
NULL,
NULL,
(LPBYTE)&ReturnedData,
lpdwSizeData);
if (lResult != ERROR_SUCCESS)
{
DPRINT("QueryAppSettings(): Failed to query the data from value \"%S\". The error code is \"%li\".\n", lpszRegValue, lResult);
RegCloseKey(hKeyQueryValue);
return FALSE;
}
RegCloseKey(hKeyQueryValue);
return TRUE;
}
/**
* @SaveAppSettings
*
* Save an application's setting data to the Registry. This is a function helper.
*
* @param[in] hKey
* A handle to a key.
*
* @param[in] lpszRegValue
* The path to the sub key where the value needs to be created.
*
* @param[out] dwRegType
* The type of registry value to be created (e.g. a REG_DWORD).
*
* @param[in] Data
* A pointer to an arbitrary data for the value to be set. Being arbitrary,
* the data can be of any type (in conformity with the registry type pointed by
* dwRegType) otherwise the function might lead to a undefined behaviour.
*
* @param[in] cbSize
* The size of the buffer data pointed by Data parameter, in bytes.
*
* @return
* Returns TRUE if the function successfully saved the application's setting,
* FALSE otherwise for failure.
*
*/
BOOL SaveAppSettings(IN HKEY hKey,
IN LPCWSTR lpszRegValue,
IN DWORD dwRegType,
IN PVOID Data,
IN DWORD cbSize)
{
LONG lResult;
HKEY hKeySetValue;
lResult = RegOpenKeyExW(hKey,
NULL,
0,
KEY_SET_VALUE,
&hKeySetValue);
if (lResult != ERROR_SUCCESS)
{
DPRINT("SaveAppSettings(): Failed to open the key, the error code is \"%li\"!\n", lResult);
return FALSE;
}
lResult = RegSetValueExW(hKeySetValue,
lpszRegValue,
0,
dwRegType,
(LPBYTE)&Data,
cbSize);
if (lResult != ERROR_SUCCESS)
{
DPRINT("SaveAppSettings(): Failed to set the \"%S\" value with data, the error code is \"%li\"!\n", lpszRegValue, lResult);
RegCloseKey(hKeySetValue);
return FALSE;
}
RegCloseKey(hKeySetValue);
return TRUE;
}