Zebediah Figura : regedit: Add support for importing Win 3.1 registry files.

Alexandre Julliard julliard at winehq.org
Mon Jan 30 15:39:18 CST 2017


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Sun Jan 29 22:09:27 2017 -0600

regedit: Add support for importing Win 3.1 registry files.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/regedit/regproc.c | 67 +++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 64 insertions(+), 3 deletions(-)

diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index 5e4c2d2..c055c10 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -608,6 +608,49 @@ static void processRegEntry(WCHAR* stdInput, BOOL isUnicode)
     }
 }
 
+/* version for Windows 3.1 */
+static void processRegEntry31(WCHAR *line)
+{
+    int key_end = 0;
+    WCHAR *value;
+    int res;
+
+    static WCHAR empty[] = {0};
+
+    if (line[0] == '\0') return;
+
+    /* get key name */
+    while (line[key_end] && !isspaceW(line[key_end])) key_end++;
+
+    value = line + key_end;
+    while (isspaceW(value[0])) value++;
+
+    if (value[0] == '=') value++;
+    if (value[0] == ' ') value++; /* at most one space is skipped */
+
+    line[key_end] = '\0';
+    if (openKeyW(line) != ERROR_SUCCESS)
+	output_message(STRING_OPEN_KEY_FAILED, line);
+
+    res = RegSetValueExW(
+	       currentKeyHandle,
+	       empty,
+               0,                  /* Reserved */
+	       REG_SZ,
+	       (BYTE *)value,
+	       (strlenW(value) + 1) * sizeof(WCHAR));
+    if (res != ERROR_SUCCESS)
+	output_message(STRING_SETVALUE_FAILED, empty, currentKeyName);
+
+    closeKey();
+}
+
+/* version constants */
+
+#define REG_VERSION_31  3
+#define REG_VERSION_40  4
+#define REG_VERSION_50  5
+
 /******************************************************************************
  * Processes a registry file.
  * Correctly processes comments (in # and ; form), line continuation.
@@ -624,6 +667,11 @@ static void processRegLinesA(FILE *in, char* first_chars)
     char *s; /* A pointer to buf for fread */
     char *line; /* The start of the current line */
     WCHAR *lineW;
+    unsigned long version = 0;
+
+    static const char header_31[] = "REGEDIT";
+    static const char header_40[] = "REGEDIT4";
+    static const char header_50[] = "Windows Registry Editor Version 5.00";
 
     buf = HeapAlloc(GetProcessHeap(), 0, line_size);
     CHECK_ENOUGH_MEMORY(buf);
@@ -720,9 +768,22 @@ static void processRegLinesA(FILE *in, char* first_chars)
                 *s_eol++ = '\0';
             *s_eol = '\0';
 
-            lineW = GetWideString(line);
-            processRegEntry(lineW, FALSE);
-            HeapFree(GetProcessHeap(), 0, lineW);
+	    /* Check if the line is a header string */
+	    if (!memcmp(line, header_31, sizeof(header_31))) {
+		version = REG_VERSION_31;
+	    } else if (!memcmp(line, header_40, sizeof(header_40))) {
+		version = REG_VERSION_40;
+	    } else if (!memcmp(line, header_50, sizeof(header_50))) {
+		version = REG_VERSION_50;
+	    } else {
+		lineW = GetWideString(line);
+		if (version == REG_VERSION_31) {
+		    processRegEntry31(lineW);
+		} else if(version == REG_VERSION_40 || version == REG_VERSION_50) {
+		    processRegEntry(lineW, FALSE);
+		}
+		HeapFree(GetProcessHeap(), 0, lineW);
+	    }
             line = s_eol + 1;
         }
     }




More information about the wine-cvs mailing list