/* Copyright (C) 2015-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: dk4wregw.ctr */ /** @file dk4wregw.c The dk4wregw module. */ #line 208 "dk4wregw.ctr" #include "dk4conf.h" #include "dk4wregt.h" #include "dk4wregw.h" #include "dk4strw.h" #ifndef DK4MEM_H_INCLUDED #include "dk4mem.h" #endif #include "dk4maasz.h" #if DK4_ON_WINDOWS #ifndef WINDOWS_H_INCLUDED #include #define WINDOWS_H_INCLUDED 1 #endif #ifndef WINBASE_H_INCLUDED #include #define WINBASE_H_INCLUDED 1 #endif #ifndef WINREG_H_INCLUDED #include #define WINREG_H_INCLUDED 1 #endif #endif #include "dk4unused.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 247 "dk4wregw.ctr" void * dk4wreg_open_key_wc( #if DK4_ON_WINDOWS int pk, const wchar_t *keyname, int wr, #else int DK4_ARG_UNUSED(pk), const wchar_t * DK4_ARG_UNUSED(keyname), int DK4_ARG_UNUSED(wr), #endif dk4_er_t *erp ) { #if DK4_ON_WINDOWS dk4_wreg_key_t *back = NULL; HKEY park = HKEY_LOCAL_MACHINE; LONG res; DWORD disp; #if DK4_USE_ASSERT assert(NULL != keyname); #endif if (NULL != keyname) { switch (pk) { case DK4_WREGKEY_HKLM: case DK4_WREGKEY_HKCU: case DK4_WREGKEY_HKCL: case DK4_WREGKEY_KHUS: case DK4_WREGKEY_HKCC: { switch (pk) { case DK4_WREGKEY_HKLM: { park = HKEY_LOCAL_MACHINE; } break; case DK4_WREGKEY_HKCU: { park = HKEY_CURRENT_USER; } break; case DK4_WREGKEY_HKCL: { park = HKEY_CLASSES_ROOT; } break; case DK4_WREGKEY_KHUS: { park = HKEY_USERS; } break; case DK4_WREGKEY_HKCC: { park = HKEY_CURRENT_CONFIG; } break; } back = dk4mem_new(dk4_wreg_key_t,1,erp); if (NULL != back) { res = RegCreateKeyExW( park, keyname, (DWORD)0, NULL, REG_OPTION_NON_VOLATILE, ((0 != wr) ? (KEY_ALL_ACCESS) : (KEY_READ)), NULL, &(back->hk), &disp ); if (ERROR_SUCCESS != res) { dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND); dk4mem_free(back); back = NULL; } } } break; default: { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return ((void *)back); #else DK4_UNUSED_ARG(pk) DK4_UNUSED_ARG(keyname) DK4_UNUSED_ARG(wr) dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); return NULL; #endif } int dk4wreg_set_string_wc( #if DK4_ON_WINDOWS void *kptr, const wchar_t *name, const wchar_t *val, int expand, #else void * DK4_ARG_UNUSED(kptr), const wchar_t * DK4_ARG_UNUSED(name), const wchar_t * DK4_ARG_UNUSED(val), int DK4_ARG_UNUSED(expand), #endif dk4_er_t *erp ) { #if DK4_ON_WINDOWS dk4_er_t er; dk4_wreg_key_t *hptr; int back = 0; size_t lgt; DWORD dwt = REG_SZ; DWORD dw0 = (DWORD)0UL; DWORD sz; LONG res; #if DK4_USE_ASSERT assert(NULL != kptr); assert(NULL != name); assert(NULL != val); #endif if ((NULL != kptr) && (NULL != val)) { if (0 != expand) { dwt = REG_EXPAND_SZ; } dk4error_init(&er); lgt = dk4ma_size_t_add( 1, dk4strw_len(val), &er ); lgt = dk4ma_size_t_mul( 2, lgt, &er ); if (DK4_E_NONE == er.ec) { if ((dk4_um_t)0x7FFFFFFFUL >= (dk4_um_t)lgt) { sz = (DWORD)lgt; hptr = (dk4_wreg_key_t *)kptr; res = RegSetValueExW( hptr->hk, name, dw0, dwt, (const BYTE *)val, sz ); if (ERROR_SUCCESS == res) { back = 1; } else { dk4error_set_ldetails(erp, DK4_E_SYSTEM, res); } } else { dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); } } else { dk4error_set_simple_error_code(erp, DK4_E_MATH_OVERFLOW); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; #else DK4_UNUSED_ARG(kptr) DK4_UNUSED_ARG(name) DK4_UNUSED_ARG(val) DK4_UNUSED_ARG(expand) dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); return 0; #endif } int dk4wreg_get_string_wc( #if DK4_ON_WINDOWS void *kptr, const wchar_t *name, wchar_t *bptr, size_t sz, int *expand, #else void * DK4_ARG_UNUSED(kptr), const wchar_t * DK4_ARG_UNUSED(name), wchar_t * DK4_ARG_UNUSED(bptr), size_t DK4_ARG_UNUSED(sz), int * DK4_ARG_UNUSED(expand), #endif dk4_er_t *erp ) { #if DK4_ON_WINDOWS dk4_er_t er; dk4_wreg_key_t *hptr; int back = 0; DWORD dwt = REG_SZ; DWORD dws; #if 0 DWORD dwsbck; #endif LONG res; size_t rsz; #if DK4_USE_ASSERT assert(NULL != kptr); assert(NULL != name); assert(NULL != bptr); assert(0 < sz); #endif if ((NULL != bptr) && (0 < sz)) { *bptr = '\0'; } if ((NULL != kptr) && (NULL != name) && (NULL != bptr) && (0 < sz)) { dk4error_init(&er); rsz = dk4ma_size_t_mul(sz, 2, &er); if (DK4_E_NONE == er.ec) { if ((dk4_um_t)0x7FFFFFFFUL >= (dk4_um_t)rsz) { dws = (DWORD)rsz; } else { dws = (DWORD)0x7FFFFFFFUL; } #if 0 dwsbck = dws; #endif hptr = (dk4_wreg_key_t *)kptr; res = RegQueryValueExW( hptr->hk, name, NULL, &dwt, (LPBYTE)bptr, &dws ); if (ERROR_SUCCESS == res) { switch (dwt) { case REG_SZ: case REG_EXPAND_SZ: { if ((DWORD)1L < dws) { dws = dws / 2; if (dws < sz) { /* dws is positive */ bptr[dws] = L'\0'; } else { bptr[sz-1] = L'\0'; } back = 1; if (REG_EXPAND_SZ == dwt) { if (NULL != expand) { *expand = 1; } } } else { dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND); } } break; default: { /* ERROR: Not a string */ dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } break; } } else { dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND); } } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; #else DK4_UNUSED_ARG(kptr) DK4_UNUSED_ARG(name) DK4_UNUSED_ARG(bptr) DK4_UNUSED_ARG(sz) DK4_UNUSED_ARG(expand) dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); return 0; #endif } int dk4wreg_set_dword_wc( #if DK4_ON_WINDOWS void *kptr, const wchar_t *name, dk4_dword_t val, #else void * DK4_ARG_UNUSED(kptr), const wchar_t * DK4_ARG_UNUSED(name), dk4_dword_t DK4_ARG_UNUSED(val), #endif dk4_er_t *erp ) { #if DK4_ON_WINDOWS dk4_wreg_key_t *hptr; int back = 0; DWORD dwt = REG_DWORD; DWORD dws = sizeof(DWORD); DWORD dw0 = (DWORD)0L; LONG res; #if DK4_USE_ASSERT assert(NULL != kptr); assert(NULL != name); #endif if (NULL != kptr) { hptr = (dk4_wreg_key_t *)kptr; res = RegSetValueExW( hptr->hk, name, dw0, dwt, (const BYTE *)(&val), dws ); if (ERROR_SUCCESS == res) { back = 1; } else { dk4error_set_ldetails(erp, DK4_E_SYSTEM, res); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; #else DK4_UNUSED_ARG(kptr) DK4_UNUSED_ARG(name) DK4_UNUSED_ARG(val) dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); return 0; #endif } int dk4wreg_get_dword_wc( #if DK4_ON_WINDOWS void *kptr, const wchar_t *name, dk4_dword_t *vptr, #else void * DK4_ARG_UNUSED(kptr), const wchar_t * DK4_ARG_UNUSED(name), dk4_dword_t * DK4_ARG_UNUSED(vptr), #endif dk4_er_t *erp ) { #if DK4_ON_WINDOWS dk4_wreg_key_t *hptr; int back = 0; DWORD dwt = REG_DWORD; DWORD dws = (DWORD)sizeof(DWORD); LONG res; #if DK4_USE_ASSERT assert(NULL != kptr); assert(NULL != name); assert(NULL != vptr); #endif if ((NULL != kptr) && (NULL != vptr)) { hptr = (dk4_wreg_key_t *)kptr; res = RegQueryValueExW( hptr->hk, name, NULL, &dwt, (LPBYTE)vptr, &dws ); if (ERROR_SUCCESS == res) { if (REG_DWORD == dwt) { if ((DWORD)sizeof(DWORD) == dws) { back = 1; } else { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } } else { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } } else { dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; #else DK4_UNUSED_ARG(kptr) DK4_UNUSED_ARG(name) DK4_UNUSED_ARG(vptr) dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); return 0; #endif } int dk4wreg_get_expanded_string_wc( #if DK4_ON_WINDOWS void *kptr, const wchar_t *name, wchar_t *dptr, size_t dsz, wchar_t *b1, size_t b1sz, wchar_t *b2, size_t b2sz, #else void * DK4_ARG_UNUSED(kptr), const wchar_t * DK4_ARG_UNUSED(name), wchar_t * DK4_ARG_UNUSED(dptr), size_t DK4_ARG_UNUSED(dsz), wchar_t * DK4_ARG_UNUSED(b1), size_t DK4_ARG_UNUSED(b1sz), wchar_t * DK4_ARG_UNUSED(b2), size_t DK4_ARG_UNUSED(b2sz), #endif dk4_er_t *erp ) { #if DK4_ON_WINDOWS DWORD dws; DWORD nc; int expand = 0; int back = 0; #if DK4_USE_ASSERT assert(NULL != kptr); assert(NULL != name); assert(NULL != dptr); assert(0 < dsz); assert(NULL != b1); assert(0 < b1sz); assert(NULL != b2); assert(0 < b2sz); #endif if ((NULL != dptr) && (0 < dsz)) { *dptr = L'\0'; } if ((NULL != kptr) && (NULL != name) && (NULL != dptr) && (0 < dsz)) { if ((NULL != b1) && (NULL != b2) && (0 < b1sz) && (2 < b2sz)) { back = dk4wreg_get_string_wc(kptr, name, b1, b1sz, &expand, erp); if (0 != back) { if (0 != expand) { #line 677 "dk4wregw.ctr" if ((dk4_um_t)0x7FFFFFFFUL >= (dk4_um_t)b2sz) { dws = (DWORD)b2sz; #line 679 "dk4wregw.ctr" } else { dws = 0x7FFFFFFFUL; #line 681 "dk4wregw.ctr" } dws = dws - 2; nc = ExpandEnvironmentStringsW(b1, b2, dws); if ((0 < nc) && (nc <= dws)) { #line 685 "dk4wregw.ctr" back = dk4strw_cpy_s(dptr, dsz, b2, erp); #line 687 "dk4wregw.ctr" #line 688 "dk4wregw.ctr" #line 689 "dk4wregw.ctr" } else { #line 690 "dk4wregw.ctr" dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); } } else { #line 693 "dk4wregw.ctr" back = dk4strw_cpy_s(dptr, dsz, b1, erp); #line 695 "dk4wregw.ctr" #line 696 "dk4wregw.ctr" #line 697 "dk4wregw.ctr" } } else { #line 699 "dk4wregw.ctr" } } else { #line 701 "dk4wregw.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } } else { #line 704 "dk4wregw.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; #else DK4_UNUSED_ARG(kptr) DK4_UNUSED_ARG(name) DK4_UNUSED_ARG(dptr) DK4_UNUSED_ARG(dsz) DK4_UNUSED_ARG(b1) DK4_UNUSED_ARG(b1sz) DK4_UNUSED_ARG(b2) DK4_UNUSED_ARG(b2sz) dk4error_set_simple_error_code(erp, DK4_E_NOT_SUPPORTED); return 0; #endif }