20#ifndef WINPR_REGISTRY_H
21#define WINPR_REGISTRY_H
23#include <winpr/config.h>
24#include <winpr/windows.h>
26#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
28#if defined(_WIN32) && !defined(_UWP)
39#include <winpr/winpr.h>
40#include <winpr/wtypes.h>
44#include <winpr/error.h>
48#define OWNER_SECURITY_INFORMATION 0x00000001
49#define GROUP_SECURITY_INFORMATION 0x00000002
50#define DACL_SECURITY_INFORMATION 0x00000004
51#define SACL_SECURITY_INFORMATION 0x00000008
53#define REG_OPTION_RESERVED 0x00000000
54#define REG_OPTION_NON_VOLATILE 0x00000000
55#define REG_OPTION_VOLATILE 0x00000001
56#define REG_OPTION_CREATE_LINK 0x00000002
57#define REG_OPTION_BACKUP_RESTORE 0x00000004
58#define REG_OPTION_OPEN_LINK 0x00000008
60#define REG_CREATED_NEW_KEY 0x00000001
61#define REG_OPENED_EXISTING_KEY 0x00000002
63#define REG_NOTIFY_CHANGE_NAME 0x01
64#define REG_NOTIFY_CHANGE_ATTRIBUTES 0x02
65#define REG_NOTIFY_CHANGE_LAST_SET 0x04
66#define REG_NOTIFY_CHANGE_SECURITY 0x08
68#define KEY_QUERY_VALUE 0x00000001
69#define KEY_SET_VALUE 0x00000002
70#define KEY_CREATE_SUB_KEY 0x00000004
71#define KEY_ENUMERATE_SUB_KEYS 0x00000008
72#define KEY_NOTIFY 0x00000010
73#define KEY_CREATE_LINK 0x00000020
74#define KEY_WOW64_64KEY 0x00000100
75#define KEY_WOW64_32KEY 0x00000200
76#define KEY_WOW64_RES 0x00000300
78#define REG_WHOLE_HIVE_VOLATILE 0x00000001
79#define REG_REFRESH_HIVE 0x00000002
80#define REG_NO_LAZY_FLUSH 0x00000004
81#define REG_FORCE_RESTORE 0x00000008
84 ((STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY) & \
87#define KEY_WRITE ((STANDARD_RIGHTS_WRITE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY) & (~SYNCHRONIZE))
89#define KEY_EXECUTE ((KEY_READ) & (~SYNCHRONIZE))
91#define KEY_ALL_ACCESS \
92 ((STANDARD_RIGHTS_ALL | KEY_QUERY_VALUE | KEY_SET_VALUE | KEY_CREATE_SUB_KEY | \
93 KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY | KEY_CREATE_LINK) & \
103 REG_DWORD_LITTLE_ENDIAN = REG_DWORD,
104 REG_DWORD_BIG_ENDIAN = 5,
107 REG_RESOURCE_LIST = 8,
108 REG_FULL_RESOURCE_DESCRIPTOR = 9,
109 REG_RESOURCE_REQUIREMENTS_LIST = 10,
111 REG_QWORD_LITTLE_ENDIAN = REG_QWORD
115 typedef HANDLE* PHKEY;
119 typedef ACCESS_MASK REGSAM;
121#define HKEY_CLASSES_ROOT ((HKEY)(LONG_PTR)(LONG)0x80000000)
122#define HKEY_CURRENT_USER ((HKEY)(LONG_PTR)(LONG)0x80000001)
123#define HKEY_LOCAL_MACHINE ((HKEY)(LONG_PTR)(LONG)0x80000002)
124#define HKEY_USERS ((HKEY)(LONG_PTR)(LONG)0x80000003)
125#define HKEY_PERFORMANCE_DATA ((HKEY)(LONG_PTR)(LONG)0x80000004)
126#define HKEY_PERFORMANCE_TEXT ((HKEY)(LONG_PTR)(LONG)0x80000050)
127#define HKEY_PERFORMANCE_NLSTEXT ((HKEY)(LONG_PTR)(LONG)0x80000060)
128#define HKEY_CURRENT_CONFIG ((HKEY)(LONG_PTR)(LONG)0x80000005)
129#define HKEY_DYN_DATA ((HKEY)(LONG_PTR)(LONG)0x80000006)
130#define HKEY_CURRENT_USER_LOCAL_SETTINGS ((HKEY)(LONG_PTR)(LONG)0x80000007)
132#define RRF_RT_REG_NONE 0x00000001
133#define RRF_RT_REG_SZ 0x00000002
134#define RRF_RT_REG_EXPAND_SZ 0x00000004
135#define RRF_RT_REG_BINARY 0x00000008
136#define RRF_RT_REG_DWORD 0x00000010
137#define RRF_RT_REG_MULTI_SZ 0x00000020
138#define RRF_RT_REG_QWORD 0x00000040
140#define RRF_RT_DWORD (RRF_RT_REG_BINARY | RRF_RT_REG_DWORD)
141#define RRF_RT_QWORD (RRF_RT_REG_BINARY | RRF_RT_REG_QWORD)
142#define RRF_RT_ANY 0x0000FFFF
144#define RRF_NOEXPAND 0x10000000
145#define RRF_ZEROONFAILURE 0x20000000
150 LPVOID value_context;
156 typedef struct pvalueA
160 LPVOID pv_value_context;
164 typedef struct pvalueW
168 LPVOID pv_value_context;
174 typedef PPVALUEW PPVALUE;
177typedef PPVALUEA PPVALUE;
180 typedef struct value_entA
184 DWORD_PTR ve_valueptr;
188 typedef struct value_entW
192 DWORD_PTR ve_valueptr;
198 typedef PVALENTW PVALENT;
201typedef PVALENTA PVALENT;
204 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
205 WINPR_API LONG RegCloseKey(HKEY hKey));
207 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
208 WINPR_ATTR_NODISCARD WINPR_API LONG RegCopyTreeW(HKEY hKeySrc,
212 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
213 WINPR_ATTR_NODISCARD WINPR_API LONG RegCopyTreeA(HKEY hKeySrc,
218#define RegCopyTree RegCopyTreeW
220#define RegCopyTree RegCopyTreeA
223 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
224 WINPR_ATTR_NODISCARD WINPR_API LONG
225 RegCreateKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD Reserved,
226 LPWSTR lpClass, DWORD dwOptions, REGSAM samDesired,
227 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
228 PHKEY phkResult, LPDWORD lpdwDisposition));
230 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
231 WINPR_ATTR_NODISCARD WINPR_API LONG
232 RegCreateKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD Reserved,
233 LPSTR lpClass, DWORD dwOptions, REGSAM samDesired,
234 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
235 PHKEY phkResult, LPDWORD lpdwDisposition));
238#define RegCreateKeyEx RegCreateKeyExW
240#define RegCreateKeyEx RegCreateKeyExA
243 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
244 WINPR_ATTR_NODISCARD WINPR_API LONG RegDeleteKeyExW(
245 HKEY hKey, LPCWSTR lpSubKey, REGSAM samDesired, DWORD Reserved));
247 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
248 WINPR_ATTR_NODISCARD WINPR_API LONG RegDeleteKeyExA(
249 HKEY hKey, LPCSTR lpSubKey, REGSAM samDesired, DWORD Reserved));
252#define RegDeleteKeyEx RegDeleteKeyExW
254#define RegDeleteKeyEx RegDeleteKeyExA
257 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
258 WINPR_ATTR_NODISCARD WINPR_API LONG RegDeleteTreeW(HKEY hKey,
261 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
262 WINPR_ATTR_NODISCARD WINPR_API LONG RegDeleteTreeA(HKEY hKey,
266#define RegDeleteTree RegDeleteTreeW
268#define RegDeleteTree RegDeleteTreeA
271 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
272 WINPR_ATTR_NODISCARD WINPR_API LONG RegDeleteValueW(HKEY hKey,
273 LPCWSTR lpValueName));
275 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
276 WINPR_ATTR_NODISCARD WINPR_API LONG RegDeleteValueA(HKEY hKey,
277 LPCSTR lpValueName));
280#define RegDeleteValue RegDeleteValueW
282#define RegDeleteValue RegDeleteValueA
285 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
286 WINPR_ATTR_NODISCARD WINPR_API LONG RegDisablePredefinedCacheEx(
void));
288 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
289 WINPR_ATTR_NODISCARD WINPR_API LONG
290 RegEnumKeyExW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, LPDWORD lpcName,
291 LPDWORD lpReserved, LPWSTR lpClass, LPDWORD lpcClass,
292 PFILETIME lpftLastWriteTime));
294 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
295 WINPR_ATTR_NODISCARD WINPR_API LONG
296 RegEnumKeyExA(HKEY hKey, DWORD dwIndex, LPSTR lpName, LPDWORD lpcName,
297 LPDWORD lpReserved, LPSTR lpClass, LPDWORD lpcClass,
298 PFILETIME lpftLastWriteTime));
301#define RegEnumKeyEx RegEnumKeyExW
303#define RegEnumKeyEx RegEnumKeyExA
306 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
307 WINPR_ATTR_NODISCARD WINPR_API LONG RegEnumValueW(
308 HKEY hKey, DWORD dwIndex, LPWSTR lpValueName, LPDWORD lpcchValueName,
309 LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData));
311 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
312 WINPR_ATTR_NODISCARD WINPR_API LONG RegEnumValueA(
313 HKEY hKey, DWORD dwIndex, LPSTR lpValueName, LPDWORD lpcchValueName,
314 LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData));
317#define RegEnumValue RegEnumValueW
319#define RegEnumValue RegEnumValueA
322 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
323 WINPR_ATTR_NODISCARD WINPR_API LONG RegFlushKey(HKEY hKey));
325 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
326 WINPR_ATTR_NODISCARD WINPR_API LONG
327 RegGetKeySecurity(HKEY hKey, SECURITY_INFORMATION SecurityInformation,
328 PSECURITY_DESCRIPTOR pSecurityDescriptor,
329 LPDWORD lpcbSecurityDescriptor));
331 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
332 WINPR_ATTR_NODISCARD WINPR_API LONG RegGetValueW(
333 HKEY hkey, LPCWSTR lpSubKey, LPCWSTR lpValue, DWORD dwFlags,
334 LPDWORD pdwType, PVOID pvData, LPDWORD pcbData));
336 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
337 WINPR_ATTR_NODISCARD WINPR_API LONG
338 RegGetValueA(HKEY hkey, LPCSTR lpSubKey, LPCSTR lpValue, DWORD dwFlags,
339 LPDWORD pdwType, PVOID pvData, LPDWORD pcbData));
342#define RegGetValue RegGetValueW
344#define RegGetValue RegGetValueA
347 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
348 WINPR_ATTR_NODISCARD WINPR_API LONG
349 RegLoadAppKeyW(LPCWSTR lpFile, PHKEY phkResult, REGSAM samDesired,
350 DWORD dwOptions, DWORD Reserved));
352 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
353 WINPR_ATTR_NODISCARD WINPR_API LONG
354 RegLoadAppKeyA(LPCSTR lpFile, PHKEY phkResult, REGSAM samDesired,
355 DWORD dwOptions, DWORD Reserved));
358#define RegLoadAppKey RegLoadAppKeyW
360#define RegLoadAppKey RegLoadAppKeyA
363 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
364 WINPR_ATTR_NODISCARD WINPR_API LONG RegLoadKeyW(HKEY hKey,
368 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
369 WINPR_ATTR_NODISCARD WINPR_API LONG RegLoadKeyA(HKEY hKey, LPCSTR lpSubKey,
373#define RegLoadKey RegLoadKeyW
375#define RegLoadKey RegLoadKeyA
378 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
379 WINPR_ATTR_NODISCARD WINPR_API LONG RegLoadMUIStringW(
380 HKEY hKey, LPCWSTR pszValue, LPWSTR pszOutBuf, DWORD cbOutBuf,
381 LPDWORD pcbData, DWORD Flags, LPCWSTR pszDirectory));
383 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
384 WINPR_ATTR_NODISCARD WINPR_API LONG RegLoadMUIStringA(
385 HKEY hKey, LPCSTR pszValue, LPSTR pszOutBuf, DWORD cbOutBuf,
386 LPDWORD pcbData, DWORD Flags, LPCSTR pszDirectory));
389#define RegLoadMUIString RegLoadMUIStringW
391#define RegLoadMUIString RegLoadMUIStringA
394 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
395 WINPR_ATTR_NODISCARD WINPR_API LONG RegNotifyChangeKeyValue(
396 HKEY hKey, BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent,
397 BOOL fAsynchronous));
399 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
400 WINPR_ATTR_NODISCARD WINPR_API LONG RegOpenCurrentUser(REGSAM samDesired,
403 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
404 WINPR_ATTR_NODISCARD WINPR_API LONG
405 RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions,
406 REGSAM samDesired, PHKEY phkResult));
408 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
409 WINPR_ATTR_NODISCARD WINPR_API LONG
410 RegOpenKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions,
411 REGSAM samDesired, PHKEY phkResult));
414#define RegOpenKeyEx RegOpenKeyExW
416#define RegOpenKeyEx RegOpenKeyExA
419 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
420 WINPR_ATTR_NODISCARD WINPR_API LONG RegOpenUserClassesRoot(
421 HANDLE hToken, DWORD dwOptions, REGSAM samDesired, PHKEY phkResult));
423 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
424 WINPR_ATTR_NODISCARD WINPR_API LONG RegQueryInfoKeyW(
425 HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved,
426 LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen,
427 LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen,
428 LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime));
430 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
431 WINPR_ATTR_NODISCARD WINPR_API LONG RegQueryInfoKeyA(
432 HKEY hKey, LPSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved,
433 LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen,
434 LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen,
435 LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime));
438#define RegQueryInfoKey RegQueryInfoKeyW
440#define RegQueryInfoKey RegQueryInfoKeyA
443 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
444 WINPR_ATTR_NODISCARD WINPR_API LONG
445 RegQueryValueExW(HKEY hKey, LPCWSTR lpValueName, LPDWORD lpReserved,
446 LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData));
448 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
449 WINPR_ATTR_NODISCARD WINPR_API LONG
450 RegQueryValueExA(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved,
451 LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData));
454#define RegQueryValueEx RegQueryValueExW
456#define RegQueryValueEx RegQueryValueExA
459 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
460 WINPR_ATTR_NODISCARD WINPR_API LONG RegRestoreKeyW(HKEY hKey,
464 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
465 WINPR_ATTR_NODISCARD WINPR_API LONG RegRestoreKeyA(HKEY hKey,
470#define RegRestoreKey RegRestoreKeyW
472#define RegRestoreKey RegRestoreKeyA
475 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
476 WINPR_ATTR_NODISCARD WINPR_API LONG RegSaveKeyExW(
477 HKEY hKey, LPCWSTR lpFile, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
480 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
481 WINPR_ATTR_NODISCARD WINPR_API LONG RegSaveKeyExA(
482 HKEY hKey, LPCSTR lpFile, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
486#define RegSaveKeyEx RegSaveKeyExW
488#define RegSaveKeyEx RegSaveKeyExA
491 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
492 WINPR_ATTR_NODISCARD WINPR_API LONG
493 RegSetKeySecurity(HKEY hKey, SECURITY_INFORMATION SecurityInformation,
494 PSECURITY_DESCRIPTOR pSecurityDescriptor));
496 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
497 WINPR_ATTR_NODISCARD WINPR_API LONG
498 RegSetValueExW(HKEY hKey, LPCWSTR lpValueName, DWORD Reserved,
499 DWORD dwType,
const BYTE* lpData, DWORD cbData));
501 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
502 WINPR_ATTR_NODISCARD WINPR_API LONG
503 RegSetValueExA(HKEY hKey, LPCSTR lpValueName, DWORD Reserved,
504 DWORD dwType,
const BYTE* lpData, DWORD cbData));
507#define RegSetValueEx RegSetValueExW
509#define RegSetValueEx RegSetValueExA
512 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
513 WINPR_ATTR_NODISCARD WINPR_API LONG RegUnLoadKeyW(HKEY hKey,
516 WINPR_DEPRECATED_VAR(
"[since 3.33.0] use JSON based configuration instead",
517 WINPR_ATTR_NODISCARD WINPR_API LONG RegUnLoadKeyA(HKEY hKey,
521#define RegUnLoadKey RegUnLoadKeyW
523#define RegUnLoadKey RegUnLoadKeyA