Add windows version registry entries.
diff --git a/programs/winecfg/winecfg.c b/programs/winecfg/winecfg.c
index a3051e6..8612619 100644
--- a/programs/winecfg/winecfg.c
+++ b/programs/winecfg/winecfg.c
@@ -139,11 +139,11 @@
*
* If valueName or value is NULL, an empty section will be created
*/
-static int set_config_key(HKEY root, const char *subkey, const char *name, const char *value) {
+static int set_config_key(HKEY root, const char *subkey, const char *name, const BYTE *value, DWORD type) {
DWORD res = 1;
HKEY key = NULL;
- WINE_TRACE("subkey=%s: name=%s, value=%s\n", subkey, name, value);
+ WINE_TRACE("subkey=%s: name=%s, value=%s, type=%ld\n", subkey, name, value, type);
assert( subkey != NULL );
@@ -155,7 +155,11 @@
else key = root;
if (name == NULL || value == NULL) goto end;
- res = RegSetValueEx(key, name, 0, REG_SZ, value, strlen(value) + 1);
+ switch (type)
+ {
+ case REG_SZ: res = RegSetValueEx(key, name, 0, REG_SZ, value, strlen(value) + 1); break;
+ case REG_DWORD: res = RegSetValueEx(key, name, 0, REG_DWORD, value, sizeof(DWORD)); break;
+ }
if (res != ERROR_SUCCESS) goto end;
res = 0;
@@ -213,6 +217,7 @@
char *path; /* path in the registry rooted at root */
char *name; /* name of the registry value. if null, this means delete the key */
char *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 */
};
struct list *settings;
@@ -281,16 +286,18 @@
*
* value is what to set the value to, or NULL to delete it.
*
+ * type is REG_SZ or REG_DWORD.
+ *
* These values will be copied when necessary.
*/
-void set_reg_key(HKEY root, const char *path, const char *name, const char *value)
+static void set_reg_key_ex(HKEY root, const char *path, const char *name, const void *value, DWORD type)
{
struct list *cursor;
struct setting *s;
assert( path != NULL );
- WINE_TRACE("path=%s, name=%s, value=%s\n", path, name, value);
+ WINE_TRACE("path=%s, name=%s, value=%p\n", path, name, value);
/* firstly, see if we already set this setting */
LIST_FOR_EACH( cursor, settings )
@@ -309,7 +316,17 @@
/* yes, we have already set it, so just replace the content and return */
HeapFree(GetProcessHeap(), 0, s->value);
- s->value = value ? strdupA(value) : NULL;
+ s->type = type;
+ switch (type)
+ {
+ case REG_SZ:
+ s->value = value ? strdupA(value) : NULL;
+ break;
+ case REG_DWORD:
+ s->value = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD));
+ memcpy( s->value, value, sizeof(DWORD) );
+ break;
+ }
/* are we deleting this key? this won't remove any of the
* children from the overlay so if the user adds it again in
@@ -329,11 +346,31 @@
s->root = root;
s->path = strdupA(path);
s->name = name ? strdupA(name) : NULL;
- s->value = value ? strdupA(value) : NULL;
+ s->type = type;
+ switch (type)
+ {
+ case REG_SZ:
+ s->value = value ? strdupA(value) : NULL;
+ break;
+ case REG_DWORD:
+ s->value = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD));
+ memcpy( s->value, value, sizeof(DWORD) );
+ break;
+ }
list_add_tail(settings, &s->entry);
}
+void set_reg_key(HKEY root, const char *path, const char *name, const char *value)
+{
+ set_reg_key_ex(root, path, name, value, REG_SZ);
+}
+
+void set_reg_key_dword(HKEY root, const char *path, const char *name, DWORD value)
+{
+ set_reg_key_ex(root, path, name, &value, REG_DWORD);
+}
+
/**
* enumerates the value names at the given path, taking into account
* the changes in the settings list.
@@ -466,7 +503,7 @@
if (s->value)
{
WINE_TRACE("Setting %s:%s to '%s'\n", s->path, s->name, s->value);
- set_config_key(s->root, s->path, s->name, s->value);
+ set_config_key(s->root, s->path, s->name, s->value, s->type);
}
else
{