1 /*
2 * PROJECT: ReactOS Utility Manager Resources DLL (UManDlg.dll)
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Registry functions for Utility Manager settings management
5 * COPYRIGHT: Copyright 2020 George Bișoc (george.bisoc@reactos.org)
6 */
7
8 /* INCLUDES *******************************************************************/
9
10 #include "umandlg.h"
11
12 /* GLOBALS ********************************************************************/
13
14 REGISTRY_DATA RegData;
15 REGISTRY_SETTINGS Settings;
16
17 /* DEFINES ********************************************************************/
18
19 #define ACCESS_UTILMAN_KEY L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Accessibility\\Utility Manager"
20 #define UTILMAN_KEY L"SOFTWARE\\Microsoft\\Utility Manager"
21 #define OSK_KEY L"On-Screen Keyboard"
22 #define MAGNIFIER_KEY L"Magnifier"
23
24 /* FUNCTIONS ******************************************************************/
25
26 /**
27 * @InitAppRegKey
28 *
29 * Initialize a key. The function may not necessarily create it but open the key
30 * if it already exists. The disposition pointed lpdwDisposition determines that.
31 * This is a function helper.
32 *
33 * @param[in] hPredefinedKey
34 * The predefined key (e.g. HKEY_CLASSES_ROOT).
35 *
36 * @param[in] lpszSubKey
37 * The path to the sub key to be created.
38 *
39 * @param[out] phKey
40 * A pointer that receives a handle to the key given by the function.
41 *
42 * @param[out] lpdwDisposition
43 * A pointer that receives the disposition given by the function.
44 *
45 * @return
46 * Returns TRUE if the function successfully created a key (or opened it),
47 * FALSE otherwise for failure.
48 *
49 */
InitAppRegKey(IN HKEY hPredefinedKey,IN LPCWSTR lpszSubKey,OUT PHKEY phKey,OUT LPDWORD lpdwDisposition)50 BOOL InitAppRegKey(IN HKEY hPredefinedKey,
51 IN LPCWSTR lpszSubKey,
52 OUT PHKEY phKey,
53 OUT LPDWORD lpdwDisposition)
54 {
55 LONG lResult;
56
57 lResult = RegCreateKeyExW(hPredefinedKey,
58 lpszSubKey,
59 0,
60 NULL,
61 0,
62 KEY_WRITE,
63 NULL,
64 phKey,
65 lpdwDisposition);
66 if (lResult != ERROR_SUCCESS)
67 {
68 DPRINT("InitAppRegKey(): Failed to create the following key (or open the key) of path \"%S\". The error code is \"%li\".\n", lpszSubKey, lResult);
69 return FALSE;
70 }
71
72 return TRUE;
73 }
74
75 /**
76 * @QueryAppSettings
77 *
78 * Query the setting from the application's key. This is a function helper.
79 *
80 * @param[in] hKey
81 * A handle to a key.
82 *
83 * @param[in] lpszSubKey
84 * The path to a sub-key.
85 *
86 * @param[in] lpszRegValue
87 * The registry value where we need to get the data from.
88 *
89 * @param[out] ReturnedData
90 * An arbitrary pointer that receives the returned data. Being arbitrary,
91 * the data can be of any type.
92 *
93 * @param[inout] lpdwSizeData
94 * A pointer to the returned data pointed by ReturnedData parameter that
95 * retrieves the size of the aforementioned data, in bytes.
96 *
97 * @return
98 * Returns TRUE if the function successfully loaded the value we wanted,
99 * FALSE otherwise for failure.
100 *
101 */
QueryAppSettings(IN HKEY hKey,IN LPCWSTR lpszSubKey,IN LPCWSTR lpszRegValue,OUT PVOID ReturnedData,IN OUT LPDWORD lpdwSizeData)102 BOOL QueryAppSettings(IN HKEY hKey,
103 IN LPCWSTR lpszSubKey,
104 IN LPCWSTR lpszRegValue,
105 OUT PVOID ReturnedData,
106 IN OUT LPDWORD lpdwSizeData)
107 {
108 LONG lResult;
109 HKEY hKeyQueryValue;
110
111 lResult = RegOpenKeyExW(hKey,
112 lpszSubKey,
113 0,
114 KEY_READ,
115 &hKeyQueryValue);
116 if (lResult != ERROR_SUCCESS)
117 {
118 DPRINT("QueryAppSettings(): Failed to open the key of path \"%S\". The error code is \"%li\".\n", lpszSubKey, lResult);
119 return FALSE;
120 }
121
122 lResult = RegQueryValueExW(hKeyQueryValue,
123 lpszRegValue,
124 NULL,
125 NULL,
126 (LPBYTE)&ReturnedData,
127 lpdwSizeData);
128 if (lResult != ERROR_SUCCESS)
129 {
130 DPRINT("QueryAppSettings(): Failed to query the data from value \"%S\". The error code is \"%li\".\n", lpszRegValue, lResult);
131 RegCloseKey(hKeyQueryValue);
132 return FALSE;
133 }
134
135 RegCloseKey(hKeyQueryValue);
136 return TRUE;
137 }
138
139 /**
140 * @SaveAppSettings
141 *
142 * Save an application's setting data to the Registry. This is a function helper.
143 *
144 * @param[in] hKey
145 * A handle to a key.
146 *
147 * @param[in] lpszRegValue
148 * The path to the sub key where the value needs to be created.
149 *
150 * @param[out] dwRegType
151 * The type of registry value to be created (e.g. a REG_DWORD).
152 *
153 * @param[in] Data
154 * A pointer to an arbitrary data for the value to be set. Being arbitrary,
155 * the data can be of any type (in conformity with the registry type pointed by
156 * dwRegType) otherwise the function might lead to a undefined behaviour.
157 *
158 * @param[in] cbSize
159 * The size of the buffer data pointed by Data parameter, in bytes.
160 *
161 * @return
162 * Returns TRUE if the function successfully saved the application's setting,
163 * FALSE otherwise for failure.
164 *
165 */
SaveAppSettings(IN HKEY hKey,IN LPCWSTR lpszRegValue,IN DWORD dwRegType,IN PVOID Data,IN DWORD cbSize)166 BOOL SaveAppSettings(IN HKEY hKey,
167 IN LPCWSTR lpszRegValue,
168 IN DWORD dwRegType,
169 IN PVOID Data,
170 IN DWORD cbSize)
171 {
172 LONG lResult;
173 HKEY hKeySetValue;
174
175 lResult = RegOpenKeyExW(hKey,
176 NULL,
177 0,
178 KEY_SET_VALUE,
179 &hKeySetValue);
180 if (lResult != ERROR_SUCCESS)
181 {
182 DPRINT("SaveAppSettings(): Failed to open the key, the error code is \"%li\"!\n", lResult);
183 return FALSE;
184 }
185
186 lResult = RegSetValueExW(hKeySetValue,
187 lpszRegValue,
188 0,
189 dwRegType,
190 (LPBYTE)&Data,
191 cbSize);
192 if (lResult != ERROR_SUCCESS)
193 {
194 DPRINT("SaveAppSettings(): Failed to set the \"%S\" value with data, the error code is \"%li\"!\n", lpszRegValue, lResult);
195 RegCloseKey(hKeySetValue);
196 return FALSE;
197 }
198
199 RegCloseKey(hKeySetValue);
200 return TRUE;
201 }
202