Module: wine Branch: stable Commit: baa48dd07d895de1fee7443686f7c3937e97e436 URL: http://source.winehq.org/git/wine.git/?a=commit;h=baa48dd07d895de1fee7443686...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Dec 15 22:30:18 2010 +0100
winecfg: Set Wow64 registry keys as well as the 64-bit ones for version information. (cherry picked from commit d15d52ddab95d246cf20f4fbc0f1674d1b777b83)
---
programs/winecfg/winecfg.c | 62 ++++++++++++++++++++++++++----------------- 1 files changed, 37 insertions(+), 25 deletions(-)
diff --git a/programs/winecfg/winecfg.c b/programs/winecfg/winecfg.c index 1abf8ed..c41d2ba 100644 --- a/programs/winecfg/winecfg.c +++ b/programs/winecfg/winecfg.c @@ -34,6 +34,7 @@ #include <limits.h> #include <windows.h> #include <winreg.h> +#include <wine/unicode.h> #include <wine/debug.h> #include <wine/list.h>
@@ -42,6 +43,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(winecfg); #include "winecfg.h" #include "resource.h"
+static const int is_win64 = (sizeof(void *) > sizeof(int)); + HKEY config_key = NULL; HMENU hPopupMenus = 0;
@@ -159,7 +162,8 @@ end: * * If valueName or value is NULL, an empty section will be created */ -static int set_config_key(HKEY root, const WCHAR *subkey, const WCHAR *name, const void *value, DWORD type) { +static int set_config_key(HKEY root, const WCHAR *subkey, REGSAM access, const WCHAR *name, const void *value, DWORD type) +{ DWORD res = 1; HKEY key = NULL;
@@ -170,7 +174,8 @@ static int set_config_key(HKEY root, const WCHAR *subkey, const WCHAR *name, con
if (subkey[0]) { - res = RegCreateKeyW(root, subkey, &key); + res = RegCreateKeyExW( root, subkey, 0, NULL, REG_OPTION_NON_VOLATILE, + access, NULL, &key, NULL ); if (res != ERROR_SUCCESS) goto end; } else key = root; @@ -192,25 +197,6 @@ end: return res; }
-/* removes the requested value from the registry, however, does not - * remove the section if empty. Returns S_OK (0) on success. - */ -static HRESULT remove_value(HKEY root, const WCHAR *subkey, const WCHAR *name) -{ - HRESULT hr; - HKEY key; - - WINE_TRACE("subkey=%s, name=%s\n", wine_dbgstr_w(subkey), wine_dbgstr_w(name)); - - hr = RegOpenKeyW(root, subkey, &key); - if (hr != S_OK) return hr; - - hr = RegDeleteValueW(key, name); - if (hr != ERROR_SUCCESS) return hr; - - return S_OK; -} - /* ========================================================================= */
/* This code exists for the following reasons: @@ -635,17 +621,43 @@ BOOL reg_key_exists(HKEY root, const char *path, const char *name)
static void process_setting(struct setting *s) { + static const WCHAR softwareW[] = {'S','o','f','t','w','a','r','e','\'}; + HKEY key; + BOOL needs_wow64 = (is_win64 && s->root == HKEY_LOCAL_MACHINE && s->path && + !strncmpiW( s->path, softwareW, sizeof(softwareW)/sizeof(WCHAR) )); + if (s->value) { WINE_TRACE("Setting %s:%s to '%s'\n", wine_dbgstr_w(s->path), wine_dbgstr_w(s->name), wine_dbgstr_w(s->value)); - set_config_key(s->root, s->path, s->name, s->value, s->type); + set_config_key(s->root, s->path, MAXIMUM_ALLOWED, s->name, s->value, s->type); + if (needs_wow64) + { + WINE_TRACE("Setting 32-bit %s:%s to '%s'\n", wine_dbgstr_w(s->path), + wine_dbgstr_w(s->name), wine_dbgstr_w(s->value)); + set_config_key(s->root, s->path, MAXIMUM_ALLOWED | KEY_WOW64_32KEY, s->name, s->value, s->type); + } } else { - /* NULL name means remove that path/section entirely */ - if (s->path && s->name) remove_value(s->root, s->path, s->name); - else if (s->path && !s->name) RegDeleteTreeW(s->root, s->path); + WINE_TRACE("Removing %s:%s\n", wine_dbgstr_w(s->path), wine_dbgstr_w(s->name)); + if (!RegOpenKeyW( s->root, s->path, &key )) + { + /* NULL name means remove that path/section entirely */ + if (s->name) RegDeleteValueW( key, s->name ); + else RegDeleteTreeW( key, NULL ); + RegCloseKey( key ); + } + if (needs_wow64) + { + WINE_TRACE("Removing 32-bit %s:%s\n", wine_dbgstr_w(s->path), wine_dbgstr_w(s->name)); + if (!RegOpenKeyExW( s->root, s->path, 0, MAXIMUM_ALLOWED | KEY_WOW64_32KEY, &key )) + { + if (s->name) RegDeleteValueW( key, s->name ); + else RegDeleteTreeW( key, NULL ); + RegCloseKey( key ); + } + } } }