Hugh McMaster : regedit: Export value names from a separate function.

Alexandre Julliard julliard at winehq.org
Wed Jul 19 16:05:32 CDT 2017


Module: wine
Branch: master
Commit: 40ce665836caafd0e7afcc1bff89f514f7c71a8b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=40ce665836caafd0e7afcc1bff89f514f7c71a8b

Author: Hugh McMaster <hugh.mcmaster at outlook.com>
Date:   Wed Jul 19 05:28:38 2017 +0000

regedit: Export value names from a separate function.

Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/regedit/regproc.c | 92 ++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 77 insertions(+), 15 deletions(-)

diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index b5bc3bf..8bdbcd2 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -1241,24 +1241,12 @@ static void REGPROC_write_line(FILE *file, const WCHAR* str, BOOL unicode)
  *      Is resized if necessary.
  * val_size - size of the buffer for storing values in bytes.
  */
-static void export_hkey(FILE *file, WCHAR **val_name_buf, DWORD *val_name_size,
-                        DWORD value_type, BYTE **val_buf, DWORD *val_size,
+static void export_hkey(FILE *file, DWORD value_type, BYTE **val_buf, DWORD *val_size,
                         WCHAR **line_buf, DWORD *line_buf_size, BOOL unicode)
 {
     DWORD line_len = 0;
     DWORD val_size1 = *val_size;
 
-            if (*val_name_buf && (*val_name_buf)[0]) {
-                const WCHAR val_start[] = {'"','%','s','"','=',0};
-
-                REGPROC_export_string(line_buf, line_buf_size, &line_len, *val_name_buf, lstrlenW(*val_name_buf));
-                line_len = sprintfW(*line_buf, val_start, *val_name_buf);
-            } else {
-                const WCHAR std_val[] = {'@','=',0};
-                line_len = 2;
-                lstrcpyW(*line_buf, std_val);
-            }
-
             switch (value_type) {
             case REG_SZ:
             {
@@ -1375,6 +1363,80 @@ void delete_registry_key(WCHAR *reg_key_name)
     RegDeleteTreeW(key_class, key_name);
 }
 
+static WCHAR *REGPROC_escape_string(WCHAR *str, size_t str_len, size_t *line_len)
+{
+    size_t i, escape_count, pos;
+    WCHAR *buf;
+
+    for (i = 0, escape_count = 0; i < str_len; i++)
+    {
+        WCHAR c = str[i];
+        if (c == '\r' || c == '\n' || c == '\\' || c == '"' || c == '\0')
+            escape_count++;
+    }
+
+    buf = resize_buffer(NULL, (str_len + escape_count + 1) * sizeof(WCHAR));
+
+    for (i = 0, pos = 0; i < str_len; i++, pos++)
+    {
+        WCHAR c = str[i];
+
+        switch (c)
+        {
+        case '\r':
+            buf[pos++] = '\\';
+            buf[pos] = 'r';
+            break;
+        case '\n':
+            buf[pos++] = '\\';
+            buf[pos] = 'n';
+            break;
+        case '\\':
+            buf[pos++] = '\\';
+            buf[pos] = '\\';
+            break;
+        case '"':
+            buf[pos++] = '\\';
+            buf[pos] = '"';
+            break;
+        case '\0':
+            buf[pos++] = '\\';
+            buf[pos] = '0';
+            break;
+        default:
+            buf[pos] = c;
+        }
+    }
+
+    buf[pos] = 0;
+    *line_len = pos;
+    return buf;
+}
+
+static size_t export_value_name(FILE *fp, WCHAR *name, size_t len, BOOL unicode)
+{
+    static const WCHAR quoted_fmt[] = {'"','%','s','"','=',0};
+    static const WCHAR default_name[] = {'@','=',0};
+    size_t line_len;
+
+    if (name && *name)
+    {
+        WCHAR *str = REGPROC_escape_string(name, len, &line_len);
+        WCHAR *buf = resize_buffer(NULL, (line_len + 4) * sizeof(WCHAR));
+        line_len = sprintfW(buf, quoted_fmt, str);
+        REGPROC_write_line(fp, buf, unicode);
+        HeapFree(GetProcessHeap(), 0, buf);
+        HeapFree(GetProcessHeap(), 0, str);
+    }
+    else
+    {
+        line_len = lstrlenW(default_name);
+        REGPROC_write_line(fp, default_name, unicode);
+    }
+
+    return line_len;
+}
+
 static WCHAR *build_subkey_path(WCHAR *path, DWORD path_len, WCHAR *subkey_name, DWORD subkey_len)
 {
     WCHAR *subkey_path;
@@ -1428,8 +1490,8 @@ static int export_registry_data(FILE *fp, HKEY key, WCHAR *path, BOOL unicode)
         rc = RegEnumValueW(key, i, value_name, &value_len, NULL, &type, data, &data_size);
         if (rc == ERROR_SUCCESS)
         {
-            export_hkey(fp, &value_name, &value_len, type, &data, &data_size,
-                        &line_buf, &line_buf_size, unicode);
+            export_value_name(fp, value_name, value_len, unicode);
+            export_hkey(fp, type, &data, &data_size, &line_buf, &line_buf_size, unicode);
             i++;
         }
         else if (rc == ERROR_MORE_DATA)




More information about the wine-cvs mailing list