/* Copyright (C) 2013-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk3wreg.ctr */ /** @file dk3wreg.c The dk3wreg module. */ #line 201 "dk3wreg.ctr" #include "dk3all.h" #include "dk3wreg.h" #line 208 "dk3wreg.ctr" #if DK3_ON_WINDOWS && ((2 == DK3_CHAR_SIZE) || (1 == DK3_CHAR_SIZE)) static dkChar const * const dk3wreg_default_texts[] = { /* 0 */ dkT("dk3wreg.str"), /* 1 */ dkT("Failed to open registry key!"), /* 2 */ dkT("Failed to open registry key:\n\""), /* 3 */ dkT("\"!"), /* 4 */ dkT("Failed to open or create registry key!"), /* 5 */ dkT("Failed to open or create registry key:\n\""), /* 6 */ dkT("\"!"), /* 7 */ dkT("Failed to close registry key!"), /* 8 */ dkT("Failed to close registry key:\n\""), /* 9 */ dkT("\"!"), /* 10 */ dkT("Failed to write registry entry!"), /* 11 */ dkT("Failed to write registry entry:\n\""), /* 12 */ dkT("\"!"), /* 13 */ dkT("Failed to retrieve registry entry!"), /* 14 */ dkT("Failed to retrieve registry entry:\n\""), /* 15 */ dkT("\"!"), /* 16 */ dkT("Registry entry is not a string!"), /* 17 */ dkT("Registry entry is not a string:\n\""), /* 18 */ dkT("\"!"), /* 19 */ dkT("Registry entry is not a DWORD!"), /* 20 */ dkT("Registry entry is not a DWORD:\n\""), /* 21 */ dkT("\"!"), /* 22 */ dkT("Registry entry is an incomplete DWORD!"), /* 23 */ dkT("Registry entry is an incomplete DWORD:\n\""), /* 24 */ dkT("\"!"), /* 25 */ dkT("Failed to delete registry key tree!"), /* 26 */ dkT("Failed to delete registry key tree:\n\""), /* 27 */ dkT("\"!"), /* 28 */ dkT("Failed to delete registry entry!"), /* 29 */ dkT("Failed to delete registry entry:\n\""), /* 30 */ dkT("\"!"), /* 31 */ dkT("String to long for result buffer!"), /* 32 */ dkT("Environment variable expansion failed!"), /* 33 */ dkT("Can not delete registry keys when compiled for legacy versions!"), NULL #line 297 "dk3wreg.ctr" }; static void dk3wreg_report_error( dk3_app_t *app, dkChar const *n, size_t m1, size_t m2, size_t o ) { dkChar const * const *lmsg; /* Localized messages. */ #line 309 "dk3wreg.ctr" if(app) { lmsg = dk3app_messages( app, dk3wreg_default_texts[0], (dkChar const **)dk3wreg_default_texts ); if(lmsg) { if(n) { dk3app_log_3(app, DK3_LL_ERROR, lmsg, m1, m2, n); } else { dk3app_log_1(app, DK3_LL_ERROR, lmsg, o); } } } #line 321 "dk3wreg.ctr" } int dk3wreg_key_open_perms( HKEY b, dkChar const *n, REGSAM p, HKEY *r, dk3_app_t *app ) { int back = 0; long res; #line 332 "dk3wreg.ctr" if((n) && (r)) { #if 2 == DK3_CHAR_SIZE res = RegOpenKeyExW( b, /* Base key. */ n, /* Subkey name. */ (DWORD)0UL, /* Reserviced. */ p, /* Required access. */ r /* Result pointer. */ ); #else res = RegOpenKeyExA( b, /* Base key. */ n, /* Subkey name. */ (DWORD)0UL, /* Reserviced. */ p, /* Required access. */ r /* Result pointer. */ ); #endif if(ERROR_SUCCESS == res) { back = 1; } else { /* ERROR: Failed to open key! */ dk3wreg_report_error(app, n, 2, 3, 1); } } #line 357 "dk3wreg.ctr" return back; } int dk3wreg_key_open_read(HKEY b, dkChar const *n, HKEY *r, dk3_app_t *app) { int back = 0; #line 367 "dk3wreg.ctr" back = dk3wreg_key_open_perms(b, n, KEY_QUERY_VALUE, r, app); #line 369 "dk3wreg.ctr" return back; } int dk3wreg_key_open_modify(HKEY b, dkChar const *n, HKEY *r, dk3_app_t *app) { int back = 0; #line 379 "dk3wreg.ctr" back = dk3wreg_key_open_perms(b, n, KEY_ALL_ACCESS, r, app); #line 381 "dk3wreg.ctr" return back; } int dk3wreg_key_create_perms(HKEY b,dkChar const *n,REGSAM p,HKEY *r,dk3_app_t *app) { int back = 0; long res; DWORD disp = (DWORD)0UL; #line 393 "dk3wreg.ctr" if((n) && (r)) { #if 2 == DK3_CHAR_SIZE res = RegCreateKeyExW( b, /* Base key. */ n, /* Key name. */ (DWORD)0UL, /* Reserved. */ NULL, /* Key class. */ REG_OPTION_NON_VOLATILE, /* Options. */ p, /* SAM desired. */ NULL, /* Security descriptor. */ r, /* Result pointer. */ &disp /* Disposition. */ ); #else res = RegCreateKeyExA( b, /* Base key. */ n, /* Key name. */ (DWORD)0UL, /* Reserved. */ NULL, /* Key class. */ REG_OPTION_NON_VOLATILE, /* Options. */ p, /* SAM desired. */ NULL, /* Security descriptor. */ r, /* Result pointer. */ &disp /* Disposition. */ ); #endif if(ERROR_SUCCESS == res) { back = 1; } else { /* ERROR: Failed to open/create registry key! */ dk3wreg_report_error(app, n, 5, 6, 4); } } #line 426 "dk3wreg.ctr" return back; } int dk3wreg_key_create_read(HKEY b, dkChar const *n, HKEY *r, dk3_app_t *app) { int back = 0; #line 436 "dk3wreg.ctr" back = dk3wreg_key_create_perms(b, n, KEY_QUERY_VALUE, r, app); #line 438 "dk3wreg.ctr" return back; } int dk3wreg_key_create_modify(HKEY b, dkChar const *n, HKEY *r, dk3_app_t *app) { int back = 0; #line 448 "dk3wreg.ctr" back = dk3wreg_key_create_perms(b, n, KEY_ALL_ACCESS, r, app); #line 450 "dk3wreg.ctr" return back; } int dk3wreg_key_close(HKEY k, dkChar const *n, dk3_app_t *app) { int back = 0; long res; #line 461 "dk3wreg.ctr" res = RegCloseKey(k); if(ERROR_SUCCESS == res) { back = 1; } else { /* ERROR: Failed to close registry key!. */ dk3wreg_report_error(app, n, 8, 9, 7); } #line 468 "dk3wreg.ctr" return back; } int dk3wreg_key_delete(HKEY b, dkChar const *n, dk3_app_t *app) { int back = 0; #if (_WIN32) && defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0601) long res; #line 480 "dk3wreg.ctr" if(n) { #if 2 == DK3_CHAR_SIZE res = RegDeleteTreeW(b, n); #else res = RegDeleteTreeA(b, n); #endif if(ERROR_SUCCESS == res) { back = 1; } else { dk3wreg_report_error(app, n, 26, 27, 25); } } #line 492 "dk3wreg.ctr" #else dk3wreg_report_error(app, n, 26, 27, 25); dk3wreg_report_error(app, NULL, 0, 0, 33); #endif return back; } int dk3wreg_set_sz(HKEY k, dkChar const *n, dkChar const *v, dk3_app_t *app) { int back = 0; DWORD dwt = REG_SZ; DWORD dw0 = (DWORD)0UL; DWORD sz; long res; #line 510 "dk3wreg.ctr" if(v) { sz = (DWORD)(1 + dk3str_len(v)); sz *= DK3_CHAR_SIZE; #if 2 == DK3_CHAR_SIZE res = RegSetValueExW( k, /* Key. */ n, /* Entry name. */ dw0, /* Reserved. */ dwt, /* Type. */ (const BYTE *)v, /* Data. */ sz /* Number of bytes. */ ); #else res = RegSetValueExA( k, /* Key. */ n, /* Entry name. */ dw0, /* Reserved. */ dwt, /* Type. */ (const BYTE *)v, /* Data. */ sz /* Number of bytes. */ ); #endif if(ERROR_SUCCESS == res) { back = 1; } else { /* ERROR: Failed to save registry entry. */ dk3wreg_report_error(app, n, 11, 12, 10); } } #line 539 "dk3wreg.ctr" return back; } int dk3wreg_set_expand_sz(HKEY k, dkChar const *n, dkChar const *v, dk3_app_t *app) { int back = 0; DWORD dwt = REG_EXPAND_SZ; DWORD dw0 = (DWORD)0UL; DWORD sz; long res; #line 553 "dk3wreg.ctr" if(v) { sz = (DWORD)(1 + dk3str_len(v)); sz *= DK3_CHAR_SIZE; #if 2 == DK3_CHAR_SIZE res = RegSetValueExW( k, /* Key. */ n, /* Entry name. */ dw0, /* Reserved. */ dwt, /* Type. */ (const BYTE *)v, /* Data. */ sz /* Number of bytes. */ ); #else res = RegSetValueExA( k, /* Key. */ n, /* Entry name. */ dw0, /* Reserved. */ dwt, /* Type. */ (const BYTE *)v, /* Data. */ sz /* Number of bytes. */ ); #endif if(ERROR_SUCCESS == res) { back = 1; } else { /* ERROR: Failed to save registry entry. */ dk3wreg_report_error(app, n, 11, 12, 10); } } #line 582 "dk3wreg.ctr" return back; } int dk3wreg_set_dword(HKEY k, dkChar const *n, DWORD v, dk3_app_t *app) { int back = 0; DWORD dwt = REG_DWORD; DWORD dw0 = (DWORD)0UL; DWORD sz; long res; #line 596 "dk3wreg.ctr" if((n) && (v)) { sz = (DWORD)sizeof(DWORD); #if 2 == DK3_CHAR_SIZE res = RegSetValueExW( k, /* Key. */ n, /* Entry name. */ dw0, /* Reserved. */ dwt, /* Type. */ (const BYTE *)(&v), /* Data. */ sz /* Number of bytes. */ ); #else res = RegSetValueExA( k, /* Key. */ n, /* Entry name. */ dw0, /* Reserved. */ dwt, /* Type. */ (const BYTE *)(&v), /* Data. */ sz /* Number of bytes. */ ); #endif if(ERROR_SUCCESS == res) { back = 1; } else { /* ERROR: Failed to save registry entry. */ dk3wreg_report_error(app, n, 11, 12, 10); } } #line 624 "dk3wreg.ctr" return back; } int dk3wreg_get_expand_sz( HKEY k, dkChar const *n, dkChar *b, size_t s, DWORD *e, dk3_app_t *app ) { int back = 0; DWORD dwt = REG_SZ; DWORD dws; long res; #line 639 "dk3wreg.ctr" if((b) && (s)) { dws = (DWORD)(s * DK3_CHAR_SIZE); #if 2 == DK3_CHAR_SIZE res = RegQueryValueExW( k, /* Key. */ n, /* Entry name. */ NULL, /* Reserved. */ &dwt, /* Type. */ (BYTE *)b, /* Result buffer. */ &dws /* Size (number of bytes). */ ); #else res = RegQueryValueExA( k, /* Key. */ n, /* Entry name. */ NULL, /* Reserved. */ &dwt, /* Type. */ (BYTE *)b, /* Result buffer. */ &dws /* Size (number of bytes). */ ); #endif if(ERROR_SUCCESS == res) { switch(dwt) { case REG_SZ: case REG_EXPAND_SZ: { if(e) { *e = dwt; } back = 1; if(0UL < dws) { #if 1 < DK3_CHAR_SIZE dws = dws / DK3_CHAR_SIZE; #endif if(0UL < dws) { if(dws < (DWORD)s) { b[dws] = dkT('\0'); } else { b[s - 1] = dkT('\0'); } } else { *b = dkT('\0'); } } else { *b = dkT('\0'); } } break; default: { *b = dkT('\0'); /* ERROR: Not a string value! */ dk3wreg_report_error(app, n, 17, 18, 16); } break; } } else { *b = dkT('\0'); /* ERROR: Failed to retrieve value! */ dk3wreg_report_error(app, n, 14, 15, 13); } } #line 695 "dk3wreg.ctr" #line 696 "dk3wreg.ctr" #line 697 "dk3wreg.ctr" #line 698 "dk3wreg.ctr" return back; } int dk3wreg_get_sz(HKEY k, dkChar const *n, dkChar *b, size_t s, dk3_app_t *app) { int back = 0; #line 708 "dk3wreg.ctr" back = dk3wreg_get_expand_sz(k, n, b, s, NULL, app); #line 710 "dk3wreg.ctr" return back; } int dk3wreg_get_expanded_sz( HKEY k, dkChar const * n, dkChar *dp, size_t ds, dkChar *tp, size_t ts, dk3_app_t *app ) { DWORD fe; /* Flag: Expand. */ DWORD res; /* Result from expand function. */ int back = 0; #line 725 "dk3wreg.ctr" if((n) && (dp) && (ds) && (tp) && (ts)) { dp[0] = dkT('\0'); fe = REG_SZ; if(dk3wreg_get_expand_sz(k, n, tp, ts, &fe, app)) { if(REG_EXPAND_SZ == fe) { #if DK3_CHAR_SIZE > 1 res = ExpandEnvironmentStringsW(tp, dp, (DWORD)ds); #else res = ExpandEnvironmentStringsA(tp, dp, (DWORD)ds); #endif if(0 < res) { if((size_t)res < ds) { back = 1; } else { /* ERROR: String too long for final buffer! */ dk3wreg_report_error(app, NULL, 0, 0, 31); } } else { /* ERROR: Expansion failed! */ dk3wreg_report_error(app, NULL, 0, 0, 32); } } else { if(dk3str_len(tp) < ds) { dk3str_cpy(dp, tp); back = 1; } else { /* ERROR: String too long for final buffer! */ dk3wreg_report_error(app, NULL, 0, 0, 31); } } } } #line 758 "dk3wreg.ctr" #line 759 "dk3wreg.ctr" #line 760 "dk3wreg.ctr" #line 761 "dk3wreg.ctr" return back; } int dk3wreg_get_dword(HKEY k, dkChar const *n, DWORD *b, dk3_app_t *app) { int back = 0; DWORD dwt = REG_DWORD; DWORD dws; DWORD dwres; long res; #line 775 "dk3wreg.ctr" if((n) && (b)) { dws = (DWORD)sizeof(DWORD); dwres = (DWORD)0UL; #if 2 == DK3_CHAR_SIZE res = RegQueryValueExW( k, n, NULL, &dwt, (BYTE *)(&dwres), &dws ); #else res = RegQueryValueExA( k, n, NULL, &dwt, (BYTE *)(&dwres), &dws ); #endif if(ERROR_SUCCESS == res) { switch(dwt) { case REG_DWORD: { if((DWORD)sizeof(DWORD) == dws) { *b = dwres; back = 1; } else { /* ERROR: Incomplete value! */ dk3wreg_report_error(app, n, 23, 24, 22); } } break; default: { /* ERROR: Not a DWORD entry! */ dk3wreg_report_error(app, n, 20, 21, 19); } break; } } else { /* ERROR: Failed to retrieve value! */ dk3wreg_report_error(app, n, 14, 15, 13); } } #line 808 "dk3wreg.ctr" return back; } int dk3wreg_entry_delete(HKEY k, dkChar const *n, dk3_app_t *app) { int back = 0; long res; #line 819 "dk3wreg.ctr" if(n) { #if 2 == DK3_CHAR_SIZE res = RegDeleteValueW(k, n); #else res = RegDeleteValueA(k, n); #endif if(ERROR_SUCCESS == res) { back = 1; } else { dk3wreg_report_error(app, n, 29, 30, 28); } } #line 831 "dk3wreg.ctr" return back; } #else #endif