[PATCH] winecfg: Implement read/write of REG_MULTI_SZ register types
Nigel Liang
ncliang at gmail.com
Wed Aug 8 20:07:04 CDT 2007
diff --git a/programs/winecfg/winecfg.c b/programs/winecfg/winecfg.c
index 4c86514..b80c992 100644
--- a/programs/winecfg/winecfg.c
+++ b/programs/winecfg/winecfg.c
@@ -180,6 +180,15 @@ static int set_config_key(HKEY root, con
{
case REG_SZ: res = RegSetValueExW(key, name, 0, REG_SZ, value, (lstrlenW(value)+1)*sizeof(WCHAR)); break;
case REG_DWORD: res = RegSetValueExW(key, name, 0, REG_DWORD, value, sizeof(DWORD)); break;
+ case REG_MULTI_SZ:
+ {
+ int len;
+ /* parse until reach double-null termination */
+ for (len=1; ((WCHAR*)value)[len-1]||((WCHAR*)value)[len]; len++);
+ res = RegSetValueExW(key, name, 0, REG_MULTI_SZ, value,
+ (len+1)*sizeof(WCHAR));
+ break;
+ }
}
if (res != ERROR_SUCCESS) goto end;
@@ -279,6 +288,7 @@ struct setting
WCHAR *name; /* name of the registry value. if null, this means delete the key */
WCHAR *value; /* contents of the registry value. if null, this means delete the value */
DWORD type; /* type of registry value. REG_SZ or REG_DWORD for now */
+ DWORD size; /* size of entry in bytes */
};
struct list *settings;
@@ -330,7 +340,14 @@ WCHAR *get_reg_keyW(HKEY root, const WCH
WINE_TRACE("found %s:%s in settings list, returning %s\n",
wine_dbgstr_w(path), wine_dbgstr_w(name),
wine_dbgstr_w(s->value));
- return s->value ? strdupW(s->value) : NULL;
+ if (s->type!=REG_MULTI_SZ)
+ return s->value ? strdupW(s->value) : NULL;
+ else
+ {
+ WCHAR *ret = HeapAlloc(GetProcessHeap(), 0, s->size);
+ memcpy( ret, s->value, s->size );
+ return ret;
+ }
}
/* no, so get from the registry */
@@ -393,7 +410,7 @@ char *get_reg_key(HKEY root, const char
*
* These values will be copied when necessary.
*/
-static void set_reg_key_ex(HKEY root, const WCHAR *path, const WCHAR *name, const void *value, DWORD type)
+void set_reg_key_ex(HKEY root, const WCHAR *path, const WCHAR *name, const void *value, DWORD type)
{
struct list *cursor;
struct setting *s;
@@ -424,12 +441,24 @@ static void set_reg_key_ex(HKEY root, co
switch (type)
{
case REG_SZ:
+ s->size = (lstrlenW((WCHAR*)value)+1)*sizeof(WCHAR);
s->value = value ? strdupW(value) : NULL;
break;
case REG_DWORD:
+ s->size = sizeof(DWORD);
s->value = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD));
memcpy( s->value, value, sizeof(DWORD) );
break;
+ case REG_MULTI_SZ:
+ {
+ int len;
+ for (len=1; ((WCHAR*)value)[len-1]||((WCHAR*)value)[len]; len++);
+ s->size = (len+1)*sizeof(WCHAR);
+ s->value = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR));
+ ZeroMemory(s->value, (len+1)*sizeof(WCHAR));
+ memcpy( s->value, value, (len+1)*sizeof(WCHAR));
+ break;
+ }
}
/* are we deleting this key? this won't remove any of the
@@ -454,12 +483,24 @@ static void set_reg_key_ex(HKEY root, co
switch (type)
{
case REG_SZ:
+ s->size = (lstrlenW(value)+1)*sizeof(WCHAR);
s->value = value ? strdupW(value) : NULL;
break;
case REG_DWORD:
+ s->size = sizeof(DWORD);
s->value = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD));
memcpy( s->value, value, sizeof(DWORD) );
break;
+ case REG_MULTI_SZ:
+ {
+ int len;
+ for (len=1; ((WCHAR*)value)[len-1]||((WCHAR*)value)[len]; len++);
+ s->size = (len+1) * sizeof(WCHAR);
+ s->value = HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR));
+ ZeroMemory(s->value, (len+1)*sizeof(WCHAR));
+ memcpy( s->value, value, (len+1)*sizeof(WCHAR));
+ break;
+ }
}
list_add_tail(settings, &s->entry);
diff --git a/programs/winecfg/winecfg.h b/programs/winecfg/winecfg.h
index 4ad7129..fa769b5 100644
--- a/programs/winecfg/winecfg.h
+++ b/programs/winecfg/winecfg.h
@@ -51,10 +51,9 @@ extern WCHAR* current_app; /* NULL means
be copied, so free them too when necessary.
*/
-void set_reg_keyW(HKEY root, const WCHAR *path, const WCHAR *name, const WCHAR *value);
-void set_reg_key_dwordW(HKEY root, const WCHAR *path, const WCHAR *name, DWORD value);
WCHAR *get_reg_keyW(HKEY root, const WCHAR *path, const WCHAR *name, const WCHAR *def);
WCHAR **enumerate_valuesW(HKEY root, WCHAR *path);
+void set_reg_key_ex(HKEY root, const WCHAR *path, const WCHAR *name, const void *value, DWORD type);
void set_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);
--
1.4.1
More information about the wine-patches
mailing list