diff -dupr a/programs/winecfg/appdefaults.c b/programs/winecfg/appdefaults.c
--- a/programs/winecfg/appdefaults.c	2020-03-13 21:23:09.000000000 +0100
+++ b/programs/winecfg/appdefaults.c	2020-03-18 15:37:12.923168660 +0100
@@ -130,7 +130,7 @@ static void update_comboboxes(HWND dialo
     char *winver;
 
     /* retrieve the registry values */
-    winver = get_reg_key(config_key, keypath(""), "Version", "");
+    winver = get_app_reg_key(config_key, "", "Version", "");
     ver = get_registry_version();
 
     if (!winver || !winver[0])
@@ -383,7 +383,7 @@ static void on_remove_app_click(HWND dia
 
     assert( selection != 0 ); /* user cannot click this button when "default settings" is selected  */
 
-    set_reg_key(config_key, keypath(""), NULL, NULL); /* delete the section  */
+    set_app_reg_key(config_key, "", NULL, NULL); /* delete the section  */
     SendMessageW(listview, LVM_GETITEMW, 0, (LPARAM) &item);
     HeapFree (GetProcessHeap(), 0, (void*)item.lParam);
     SendMessageW(listview, LVM_DELETEITEM, selection, 0);
@@ -405,12 +405,12 @@ static void on_winver_change(HWND dialog
         if (!selection)
         {
             WINE_TRACE("default selected so removing current setting\n");
-            set_reg_key(config_key, keypath(""), "Version", NULL);
+            set_app_reg_key(config_key, "", "Version", NULL);
         }
         else
         {
             WINE_TRACE("setting Version key to value '%s'\n", win_versions[selection-1].szVersion);
-            set_reg_key(config_key, keypath(""), "Version", win_versions[selection-1].szVersion);
+            set_app_reg_key(config_key, "", "Version", win_versions[selection-1].szVersion);
         }
     }
     else /* global version only */
@@ -437,7 +437,7 @@ static void on_winver_change(HWND dialog
             set_reg_key(HKEY_LOCAL_MACHINE, szKeyProdNT, "ProductType", NULL);
             set_reg_key(HKEY_LOCAL_MACHINE, szKeyWindNT, "CSDVersion", NULL);
             set_reg_key(HKEY_LOCAL_MACHINE, szKeyEnvNT, "OS", NULL);
-            set_reg_key(config_key, keypath(""), "Version", NULL);
+            set_app_reg_key(config_key, "", "Version", NULL);
             break;
 
         case VER_PLATFORM_WIN32_NT:
@@ -459,7 +459,7 @@ static void on_winver_change(HWND dialog
             set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "VersionNumber", NULL);
             set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "SubVersionNumber", NULL);
             set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "ProductName", NULL);
-            set_reg_key(config_key, keypath(""), "Version", NULL);
+            set_app_reg_key(config_key, "", "Version", NULL);
             break;
 
         case VER_PLATFORM_WIN32s:
@@ -474,7 +474,7 @@ static void on_winver_change(HWND dialog
             set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "VersionNumber", NULL);
             set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "SubVersionNumber", NULL);
             set_reg_key(HKEY_LOCAL_MACHINE, szKey9x, "ProductName", NULL);
-            set_reg_key(config_key, keypath(""), "Version", win_versions[selection].szVersion);
+            set_app_reg_key(config_key, "", "Version", win_versions[selection].szVersion);
             break;
         }
     }
diff -dupr a/programs/winecfg/libraries.c b/programs/winecfg/libraries.c
--- a/programs/winecfg/libraries.c	2020-03-13 21:23:09.000000000 +0100
+++ b/programs/winecfg/libraries.c	2020-03-18 15:31:41.261914071 +0100
@@ -346,7 +346,7 @@ static void load_library_list( HWND dial
 
 static void load_library_settings(HWND dialog)
 {
-    char **overrides = enumerate_values(config_key, keypath("DllOverrides"));
+    char **overrides = enumerate_values(config_key, "DllOverrides");
     char **p;
     int sel, count = 0;
 
@@ -375,7 +375,7 @@ static void load_library_settings(HWND d
         const char *label;
         struct dll *dll;
 
-        value = get_reg_key(config_key, keypath("DllOverrides"), *p, NULL);
+        value = get_app_reg_key(config_key, "DllOverrides", *p, NULL);
 
         label = mode_to_label(string_to_mode(value));
         
@@ -457,7 +457,7 @@ static void set_dllmode(HWND dialog, DWO
     WINE_TRACE("Setting %s to %s\n", dll->name, str);
 
     SendMessageW(GetParent(dialog), PSM_CHANGED, 0, 0);
-    set_reg_key(config_key, keypath("DllOverrides"), dll->name, str);
+    set_app_reg_key(config_key, "DllOverrides", dll->name, str);
 
     load_library_settings(dialog);  /* ... and refresh  */
 }
@@ -510,7 +510,7 @@ static void on_add_click(HWND dialog)
     WINE_TRACE("Adding %s as native, builtin\n", buffer);
 
     SendMessageW(GetParent(dialog), PSM_CHANGED, 0, 0);
-    set_reg_key(config_key, keypath("DllOverrides"), buffer, "native,builtin");
+    set_app_reg_key(config_key, "DllOverrides", buffer, "native,builtin");
 
     load_library_settings(dialog);
 
@@ -583,7 +583,7 @@ static void on_remove_click(HWND dialog)
     SendDlgItemMessageW(dialog, IDC_DLLS_LIST, LB_DELETESTRING, sel, 0);
 
     SendMessageW(GetParent(dialog), PSM_CHANGED, 0, 0);
-    set_reg_key(config_key, keypath("DllOverrides"), dll->name, NULL);
+    set_app_reg_key(config_key, "DllOverrides", dll->name, NULL);
 
     HeapFree(GetProcessHeap(), 0, dll->name);
     HeapFree(GetProcessHeap(), 0, dll);
diff -dupr a/programs/winecfg/theme.c b/programs/winecfg/theme.c
--- a/programs/winecfg/theme.c	2020-03-13 21:23:09.000000000 +0100
+++ b/programs/winecfg/theme.c	2020-03-18 15:30:39.667223704 +0100
@@ -1169,7 +1169,7 @@ static void on_select_font(HWND hDlg)
 
 static void init_mime_types(HWND hDlg)
 {
-    char *buf = get_reg_key(config_key, keypath("FileOpenAssociations"), "Enable", "Y");
+    char *buf = get_app_reg_key(config_key, "FileOpenAssociations", "Enable", "Y");
     int state = IS_OPTION_TRUE(*buf) ? BST_CHECKED : BST_UNCHECKED;
 
     CheckDlgButton(hDlg, IDC_ENABLE_FILE_ASSOCIATIONS, state);
@@ -1184,7 +1184,7 @@ static void update_mime_types(HWND hDlg)
     if (IsDlgButtonChecked(hDlg, IDC_ENABLE_FILE_ASSOCIATIONS) != BST_CHECKED)
         state = "N";
 
-    set_reg_key(config_key, keypath("FileOpenAssociations"), "Enable", state);
+    set_app_reg_key(config_key, "FileOpenAssociations", "Enable", state);
 }
 
 INT_PTR CALLBACK
diff -dupr a/programs/winecfg/winecfg.c b/programs/winecfg/winecfg.c
--- a/programs/winecfg/winecfg.c	2020-03-13 21:23:09.000000000 +0100
+++ b/programs/winecfg/winecfg.c	2020-03-18 15:40:09.158980481 +0100
@@ -316,6 +316,43 @@ char *get_reg_key(HKEY root, const char
     return szRet;
 }
 
+char *get_app_reg_key(HKEY root, const char *path, const char *name, const char *def)
+{
+    WCHAR *wpath, *wname, *wdef = NULL, *wRet = NULL;
+    char *szRet = NULL;
+    int len;
+
+    WINE_TRACE("path=%s, name=%s, def=%s\n", path, name, def);
+
+    wpath = HeapAlloc(GetProcessHeap(), 0, (strlen(path)+1)*sizeof(WCHAR));
+    wname = HeapAlloc(GetProcessHeap(), 0, (strlen(name)+1)*sizeof(WCHAR));
+
+    MultiByteToWideChar(CP_ACP, 0, path, -1, wpath, strlen(path)+1);
+    MultiByteToWideChar(CP_ACP, 0, name, -1, wname, strlen(name)+1);
+
+    if (def)
+    {
+        wdef = HeapAlloc(GetProcessHeap(), 0, (strlen(def)+1)*sizeof(WCHAR));
+        MultiByteToWideChar(CP_ACP, 0, def, -1, wdef, strlen(def)+1);
+    }
+
+    wRet = get_reg_keyW(root, keypathW(wpath), wname, wdef);
+
+    len = WideCharToMultiByte(CP_ACP, 0, wRet, -1, NULL, 0, NULL, NULL);
+    if (len)
+    {
+        szRet = HeapAlloc(GetProcessHeap(), 0, len);
+        WideCharToMultiByte(CP_ACP, 0, wRet, -1, szRet, len, NULL, NULL);
+    }
+
+    HeapFree(GetProcessHeap(), 0, wpath);
+    HeapFree(GetProcessHeap(), 0, wname);
+    HeapFree(GetProcessHeap(), 0, wdef);
+    HeapFree(GetProcessHeap(), 0, wRet);
+
+    return szRet;
+}
+
 /**
  * Used to set a registry key.
  *
@@ -429,6 +466,32 @@ void set_reg_key(HKEY root, const char *
     HeapFree(GetProcessHeap(), 0, wvalue);
 }
 
+void set_app_reg_key(HKEY root, const char *path, const char *name, const char *value)
+{
+    WCHAR *wpath, *wname = NULL, *wvalue = NULL;
+
+    wpath = HeapAlloc(GetProcessHeap(), 0, (strlen(path)+1)*sizeof(WCHAR));
+    MultiByteToWideChar(CP_ACP, 0, path, -1, wpath, strlen(path)+1);
+
+    if (name)
+    {
+        wname = HeapAlloc(GetProcessHeap(), 0, (strlen(name)+1)*sizeof(WCHAR));
+        MultiByteToWideChar(CP_ACP, 0, name, -1, wname, strlen(name)+1);
+    }
+
+    if (value)
+    {
+        wvalue = HeapAlloc(GetProcessHeap(), 0, (strlen(value)+1)*sizeof(WCHAR));
+        MultiByteToWideChar(CP_ACP, 0, value, -1, wvalue, strlen(value)+1);
+    }
+
+    set_reg_key_ex(root, keypathW(wpath), wname, wvalue, REG_SZ);
+
+    HeapFree(GetProcessHeap(), 0, wpath);
+    HeapFree(GetProcessHeap(), 0, wname);
+    HeapFree(GetProcessHeap(), 0, wvalue);
+}
+
 void set_reg_key_dword(HKEY root, const char *path, const char *name, DWORD value)
 {
     WCHAR *wpath, *wname;
@@ -574,7 +637,7 @@ char **enumerate_values(HKEY root, char
     wpath = HeapAlloc(GetProcessHeap(), 0, (strlen(path)+1)*sizeof(WCHAR));
     MultiByteToWideChar(CP_ACP, 0, path, -1, wpath, strlen(path)+1);
 
-    wret = enumerate_valuesW(root, wpath);
+    wret = enumerate_valuesW(root, keypathW(wpath));
 
     if (wret)
     {
diff -dupr a/programs/winecfg/winecfg.h b/programs/winecfg/winecfg.h
--- a/programs/winecfg/winecfg.h	2020-03-13 21:23:09.000000000 +0100
+++ b/programs/winecfg/winecfg.h	2020-03-18 15:38:11.916562897 +0100
@@ -56,8 +56,10 @@ void set_reg_key_dwordW(HKEY root, const
 WCHAR *get_reg_keyW(HKEY root, const WCHAR *path, const WCHAR *name, const WCHAR *def);
 
 void set_reg_key(HKEY root, const char *path, const char *name, const char *value);
+void set_app_reg_key(HKEY root, const char *path, const char *name, const char *value);
 void set_reg_key_dword(HKEY root, const char *path, const char *name, DWORD value);
 char *get_reg_key(HKEY root, const char *path, const char *name, const char *def);
+char *get_app_reg_key(HKEY root, const char *path, const char *name, const char *def);
 BOOL reg_key_exists(HKEY root, const char *path, const char *name);
 void apply(void);
 char **enumerate_values(HKEY root, char *path);
diff -dupr a/programs/winecfg/x11drvdlg.c b/programs/winecfg/x11drvdlg.c
--- a/programs/winecfg/x11drvdlg.c	2020-03-13 21:23:09.000000000 +0100
+++ b/programs/winecfg/x11drvdlg.c	2020-03-18 15:34:44.409169604 +0100
@@ -91,7 +91,8 @@ static void update_gui_for_desktop_mode(
     HeapFree(GetProcessHeap(), 0, buf);
 
     /* do we have desktop mode enabled? */
-    if (reg_key_exists(config_key, keypath("Explorer"), "Desktop"))
+    buf = (WCHAR *)get_app_reg_key(config_key, "Explorer", "Desktop", NULL);
+    if (buf)
     {
 	CheckDlgButton(dialog, IDC_ENABLE_DESKTOP, BST_CHECKED);
         enable(IDC_DESKTOP_WIDTH);
@@ -107,6 +108,7 @@ static void update_gui_for_desktop_mode(
 	disable(IDC_DESKTOP_SIZE);
 	disable(IDC_DESKTOP_BY);
     }
+    HeapFree(GetProcessHeap(), 0, buf);
 
     updating_ui = FALSE;
 }
@@ -123,21 +125,21 @@ static void init_dialog(HWND dialog)
     SendDlgItemMessageW(dialog, IDC_DESKTOP_WIDTH, EM_LIMITTEXT, RES_MAXLEN, 0);
     SendDlgItemMessageW(dialog, IDC_DESKTOP_HEIGHT, EM_LIMITTEXT, RES_MAXLEN, 0);
 
-    buf = get_reg_key(config_key, keypath("X11 Driver"), "GrabFullscreen", "N");
+    buf = get_app_reg_key(config_key, "X11 Driver", "GrabFullscreen", "N");
     if (IS_OPTION_TRUE(*buf))
 	CheckDlgButton(dialog, IDC_FULLSCREEN_GRAB, BST_CHECKED);
     else
 	CheckDlgButton(dialog, IDC_FULLSCREEN_GRAB, BST_UNCHECKED);
     HeapFree(GetProcessHeap(), 0, buf);
 
-    buf = get_reg_key(config_key, keypath("X11 Driver"), "Managed", "Y");
+    buf = get_app_reg_key(config_key, "X11 Driver", "Managed", "Y");
     if (IS_OPTION_TRUE(*buf))
 	CheckDlgButton(dialog, IDC_ENABLE_MANAGED, BST_CHECKED);
     else
 	CheckDlgButton(dialog, IDC_ENABLE_MANAGED, BST_UNCHECKED);
     HeapFree(GetProcessHeap(), 0, buf);
 
-    buf = get_reg_key(config_key, keypath("X11 Driver"), "Decorated", "Y");
+    buf = get_app_reg_key(config_key, "X11 Driver", "Decorated", "Y");
     if (IS_OPTION_TRUE(*buf))
 	CheckDlgButton(dialog, IDC_ENABLE_DECORATED, BST_CHECKED);
     else
@@ -201,7 +203,7 @@ static void on_enable_desktop_clicked(HW
     if (IsDlgButtonChecked(dialog, IDC_ENABLE_DESKTOP) == BST_CHECKED) {
         set_from_desktop_edits(dialog);
     } else {
-        set_reg_key(config_key, keypath("Explorer"), "Desktop", NULL);
+        set_app_reg_key(config_key, "Explorer", "Desktop", NULL);
     }
     
     update_gui_for_desktop_mode(dialog);
@@ -211,9 +213,9 @@ static void on_enable_managed_clicked(HW
     WINE_TRACE("\n");
     
     if (IsDlgButtonChecked(dialog, IDC_ENABLE_MANAGED) == BST_CHECKED) {
-        set_reg_key(config_key, keypath("X11 Driver"), "Managed", "Y");
+        set_app_reg_key(config_key, "X11 Driver", "Managed", "Y");
     } else {
-        set_reg_key(config_key, keypath("X11 Driver"), "Managed", "N");
+        set_app_reg_key(config_key, "X11 Driver", "Managed", "N");
     }
 }
 
@@ -221,9 +223,9 @@ static void on_enable_decorated_clicked(
     WINE_TRACE("\n");
 
     if (IsDlgButtonChecked(dialog, IDC_ENABLE_DECORATED) == BST_CHECKED) {
-        set_reg_key(config_key, keypath("X11 Driver"), "Decorated", "Y");
+        set_app_reg_key(config_key, "X11 Driver", "Decorated", "Y");
     } else {
-        set_reg_key(config_key, keypath("X11 Driver"), "Decorated", "N");
+        set_app_reg_key(config_key, "X11 Driver", "Decorated", "N");
     }
 }
 
