[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