From: "Rafał Mużyło" Subject: [PATCH v2] winecfg: don't trash app names Message-Id: <20200318175846.GA7428@blackspire3> Date: Wed, 18 Mar 2020 18:58:46 +0100 References: <20200318153313.GA3064@blackspire3> Currently, if app name isn't representable in CP_ACP, it gets trashed during creation. There's no reason for it - the name is originally retrived as widechar string. This isn't the cleanest way, but still one that works. gothas: enumerate_values is no longer usable for other maens, yet this was its only use; reg_key_exists becomes unused; {g,s}et_app_reg_key copy a lot of existing code, instead of reusing minor note: winecfg could use a better check for KEY_WOW64_32KEY case - in my experience, it's quite often that key created by winecfg should actually under Wow6432Node, otherwise it has no effect. v2: no real changes, just a cast to silence a warning and a non-patch bit I've missed Signed-off-by: Rafał Mużyło diff -dupr a/programs/winecfg/appdefaults.c b/programs/winecfg/appdefaults.c --- a/programs/winecfg/appdefaults.c +++ b/programs/winecfg/appdefaults.c @@ -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 +++ b/programs/winecfg/libraries.c @@ -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 +++ b/programs/winecfg/theme.c @@ -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 +++ b/programs/winecfg/winecfg.c @@ -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 +++ b/programs/winecfg/winecfg.h @@ -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 +++ b/programs/winecfg/x11drvdlg.c @@ -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"); } }