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