[PATCH] regedit/tests: Add Unicode import tests and remove the WCHAR support check

Hugh McMaster hugh.mcmaster at outlook.com
Wed Aug 23 07:57:30 CDT 2017


Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
---
 programs/regedit/tests/regedit.c | 580 ++++++++++++++++++++++++++++++++-------
 1 file changed, 481 insertions(+), 99 deletions(-)

diff --git a/programs/regedit/tests/regedit.c b/programs/regedit/tests/regedit.c
index 2839a11072..17f7c1d826 100644
--- a/programs/regedit/tests/regedit.c
+++ b/programs/regedit/tests/regedit.c
@@ -20,19 +20,40 @@
 
 #include "wine/test.h"
 
-static BOOL supports_wchar;
-
 #define lok ok_(__FILE__,line)
 
-#define exec_import_str(c) r_exec_import_str(__LINE__, c)
-static BOOL r_exec_import_str(unsigned line, const char *file_contents)
+#define run_regedit_exe(c) run_regedit_exe_(__LINE__,c)
+static BOOL run_regedit_exe_(unsigned line, const char *cmd)
 {
     STARTUPINFOA si = {sizeof(STARTUPINFOA)};
     PROCESS_INFORMATION pi;
+    DWORD ret;
+    char cmdline[256];
+
+    si.dwFlags = STARTF_USESTDHANDLES;
+    si.hStdInput  = INVALID_HANDLE_VALUE;
+    si.hStdOutput = INVALID_HANDLE_VALUE;
+    si.hStdError  = INVALID_HANDLE_VALUE;
+
+    strcpy(cmdline, cmd);
+    if (!CreateProcessA(NULL, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
+        return FALSE;
+
+    ret = WaitForSingleObject(pi.hProcess, 10000);
+    if (ret == WAIT_TIMEOUT)
+        TerminateProcess(pi.hProcess, 1);
+
+    CloseHandle(pi.hThread);
+    CloseHandle(pi.hProcess);
+    return (ret != WAIT_TIMEOUT);
+}
+
+#define exec_import_str(c) r_exec_import_str(__LINE__, c)
+static BOOL r_exec_import_str(unsigned line, const char *file_contents)
+{
     HANDLE regfile;
-    DWORD written, dr;
+    DWORD written;
     BOOL br;
-    char cmd[] = "regedit /s test.reg";
 
     regfile = CreateFileA("test.reg", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
             FILE_ATTRIBUTE_NORMAL, NULL);
@@ -40,62 +61,56 @@ static BOOL r_exec_import_str(unsigned line, const char *file_contents)
     if(regfile == INVALID_HANDLE_VALUE)
         return FALSE;
 
-    br = WriteFile(regfile, file_contents, strlen(file_contents), &written,
-            NULL);
-    lok(br == TRUE, "WriteFile failed: %d\n", GetLastError());
-
+    br = WriteFile(regfile, file_contents, strlen(file_contents), &written, NULL);
+    lok(br, "WriteFile failed: %u\n", GetLastError());
     CloseHandle(regfile);
 
-    if(!CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
-        return FALSE;
-
-    dr = WaitForSingleObject(pi.hProcess, 10000);
-    if(dr == WAIT_TIMEOUT)
-        TerminateProcess(pi.hProcess, 1);
-    CloseHandle(pi.hThread);
-    CloseHandle(pi.hProcess);
+    run_regedit_exe("regedit.exe /s test.reg");
 
     br = DeleteFileA("test.reg");
-    lok(br == TRUE, "DeleteFileA failed: %d\n", GetLastError());
+    lok(br, "DeleteFile failed: %u\n", GetLastError());
 
-    return (dr != WAIT_TIMEOUT);
+    return br;
 }
 
 #define exec_import_wstr(c) r_exec_import_wstr(__LINE__, c)
-static BOOL r_exec_import_wstr(unsigned line, const WCHAR *file_contents)
+static BOOL r_exec_import_wstr(unsigned line, const char *file_contents)
 {
-    STARTUPINFOA si = {sizeof(STARTUPINFOA)};
-    PROCESS_INFORMATION pi;
+    int lenA, len, memsize;
+    WCHAR *wstr;
     HANDLE regfile;
-    DWORD written, dr;
+    DWORD written;
     BOOL br;
-    char cmd[] = "regedit /s test.reg";
+
+    lenA = strlen(file_contents);
+
+    len = MultiByteToWideChar(CP_UTF8, 0, file_contents, lenA, NULL, 0);
+    memsize = len * sizeof(WCHAR);
+    wstr = HeapAlloc(GetProcessHeap(), 0, memsize);
+    if (!wstr) return FALSE;
+    MultiByteToWideChar(CP_UTF8, 0, file_contents, lenA, wstr, len);
 
     regfile = CreateFileA("test.reg", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
             FILE_ATTRIBUTE_NORMAL, NULL);
     lok(regfile != INVALID_HANDLE_VALUE, "Failed to create test.reg file\n");
-    if(regfile == INVALID_HANDLE_VALUE)
+    if (regfile == INVALID_HANDLE_VALUE)
+    {
+        HeapFree(GetProcessHeap(), 0, wstr);
         return FALSE;
+    }
 
-    br = WriteFile(regfile, file_contents,
-            lstrlenW(file_contents) * sizeof(WCHAR), &written, NULL);
-    lok(br == TRUE, "WriteFile failed: %d\n", GetLastError());
-
+    br = WriteFile(regfile, wstr, memsize, &written, NULL);
+    lok(br, "WriteFile failed: %u\n", GetLastError());
     CloseHandle(regfile);
 
-    if(!CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
-        return FALSE;
+    HeapFree(GetProcessHeap(), 0, wstr);
 
-    dr = WaitForSingleObject(pi.hProcess, 10000);
-    if(dr == WAIT_TIMEOUT)
-        TerminateProcess(pi.hProcess, 1);
-    CloseHandle(pi.hThread);
-    CloseHandle(pi.hProcess);
+    run_regedit_exe("regedit.exe /s test.reg");
 
     br = DeleteFileA("test.reg");
-    lok(br == TRUE, "DeleteFileA failed: %d\n", GetLastError());
+    lok(br, "DeleteFile failed: %u\n", GetLastError());
 
-    return (dr != WAIT_TIMEOUT);
+    return br;
 }
 
 #define TODO_REG_TYPE    (0x0001u)
@@ -126,30 +141,6 @@ static void verify_reg_(unsigned line, HKEY hkey, const char *value,
         lok(memcmp(data, exp_data, size) == 0, "got wrong data\n");
 }
 
-#define verify_reg_wsz(k,n,e) r_verify_reg_wsz(__LINE__,k,n,e)
-static void r_verify_reg_wsz(unsigned line, HKEY key, const char *value_name, const WCHAR *exp_value)
-{
-    LONG lr;
-    DWORD fnd_type, fnd_len;
-    WCHAR fnd_value[1024], value_nameW[1024];
-
-    MultiByteToWideChar(CP_ACP, 0, value_name, -1, value_nameW,
-            sizeof(value_nameW)/sizeof(value_nameW[0]));
-
-    fnd_len = sizeof(fnd_value);
-    lr = RegQueryValueExW(key, value_nameW, NULL, &fnd_type, (BYTE*)fnd_value, &fnd_len);
-    lok(lr == ERROR_SUCCESS, "RegQueryValueExW failed: %d\n", lr);
-    if(lr != ERROR_SUCCESS)
-        return;
-
-    lok(fnd_type == REG_SZ, "Got wrong type: %d\n", fnd_type);
-    if(fnd_type != REG_SZ)
-        return;
-    lok(!lstrcmpW(exp_value, fnd_value),
-            "Strings differ: expected %s, got %s\n",
-            wine_dbgstr_w(exp_value), wine_dbgstr_w(fnd_value));
-}
-
 #define verify_reg_nonexist(k,n) r_verify_reg_nonexist(__LINE__,k,n)
 static void r_verify_reg_nonexist(unsigned line, HKEY key, const char *value_name)
 {
@@ -194,25 +185,8 @@ static void test_basic_import(void)
     HKEY hkey, subkey;
     DWORD dword = 0x17, type, size;
     char exp_binary[] = {0xAA,0xBB,0xCC,0x11};
-    WCHAR wide_test[] = {0xFEFF,'W','i','n','d','o','w','s',' ','R','e','g',
-        'i','s','t','r','y',' ','E','d','i','t','o','r',' ','V','e','r','s',
-        'i','o','n',' ','5','.','0','0','\n','\n',
-        '[','H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E',
-        'R','\\','S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
-        'r','e','g','e','d','i','t','_','t','e','s','t',']','\n',
-        '"','T','e','s','t','V','a','l','u','e','3','"','=','"',0x3041,'V','a',
-        'l','u','e','"','\n',0};
-    WCHAR wide_test_r[] = {0xFEFF,'W','i','n','d','o','w','s',' ','R','e','g',
-        'i','s','t','r','y',' ','E','d','i','t','o','r',' ','V','e','r','s',
-        'i','o','n',' ','5','.','0','0','\r','\r',
-        '[','H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E',
-        'R','\\','S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
-        'r','e','g','e','d','i','t','_','t','e','s','t',']','\r',
-        '"','T','e','s','t','V','a','l','u','e','5','"','=','"',0x3041,'V','a',
-        'l','u','e','"','\r',0};
-    WCHAR wide_exp[] = {0x3041,'V','a','l','u','e',0};
     LONG lr;
-    char buffer[8];
+    char buffer[256];
     BYTE hex[8];
 
     lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
@@ -231,22 +205,21 @@ static void test_basic_import(void)
                 "\"TestValue2\"=\"BValue\"\r\n");
     verify_reg(hkey, "TestValue2", REG_SZ, "BValue", 7, 0);
 
-    if (supports_wchar)
-    {
-        exec_import_wstr(wide_test);
-        verify_reg_wsz(hkey, "TestValue3", wide_exp);
-
-        exec_import_wstr(wide_test_r);
-        verify_reg_wsz(hkey, "TestValue5", wide_exp);
-    }
-    else
-        win_skip("Some WCHAR tests skipped\n");
+    exec_import_str("Windows Registry Editor Version 5.00\n\n"
+                    "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                    "\"TestValue3\"=\"Value\"\n");
+    verify_reg(hkey, "TestValue3", REG_SZ, "Value", 6, 0);
 
     exec_import_str("REGEDIT4\r\r"
                 "[HKEY_CURRENT_USER\\" KEY_BASE "]\r"
                 "\"TestValue4\"=\"DValue\"\r");
     verify_reg(hkey, "TestValue4", REG_SZ, "DValue", 7, 0);
 
+    exec_import_str("Windows Registry Editor Version 5.00\r\r"
+                    "[HKEY_CURRENT_USER\\" KEY_BASE "]\r"
+                    "\"TestValue5\"=\"Value\"\r");
+    verify_reg(hkey, "TestValue5", REG_SZ, "Value", 6, 0);
+
     exec_import_str("REGEDIT4\n\n"
                 "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
                 "\"TestDword\"=dword:00000017\n");
@@ -534,8 +507,22 @@ static void test_basic_import(void)
     verify_reg(hkey, "Wine18a", REG_MULTI_SZ, "Line\0", 6, 0);
     verify_reg(hkey, "Wine18b", REG_MULTI_SZ, "Line concatenation\0", 20, 0);
     verify_reg(hkey, "Wine18c", REG_MULTI_SZ, "Line concatenation\0", 20, 0);
-    verify_reg(hkey, "Wine18d", REG_MULTI_SZ, "Line concat", 12, 0);
-    verify_reg(hkey, "Wine18e", REG_MULTI_SZ, "Line concat", 12, 0);
+    /* Wine18d */
+    size = sizeof(buffer);
+    memset(buffer, '-', size);
+    lr = RegQueryValueExA(hkey, "Wine18d", NULL, &type, (BYTE *)&buffer, &size);
+    ok(lr == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", lr);
+    ok(type == REG_MULTI_SZ, "got wrong type %u, expected %u\n", type, REG_MULTI_SZ);
+    ok(size == 12 || broken(size == 11) /* Win2k */, "got wrong size %u, expected 12\n", size);
+    ok(memcmp(buffer, "Line concat", size) == 0, "got wrong data\n");
+    /* Wine18e */
+    size = sizeof(buffer);
+    memset(buffer, '-', size);
+    lr = RegQueryValueExA(hkey, "Wine18e", NULL, &type, (BYTE *)&buffer, &size);
+    ok(lr == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", lr);
+    ok(type == REG_MULTI_SZ, "got wrong type %u, expected %u\n", type, REG_MULTI_SZ);
+    ok(size == 12 || broken(size == 11) /* Win2k */, "got wrong size %u, expected 12\n", size);
+    ok(memcmp(buffer, "Line concat", size) == 0, "got wrong data\n");
 
     exec_import_str("REGEDIT4\n\n"
                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
@@ -590,6 +577,406 @@ static void test_basic_import(void)
     ok(lr == ERROR_SUCCESS, "RegDeleteKeyA failed: %d\n", lr);
 }
 
+static void test_basic_import_unicode(void)
+{
+    HKEY hkey, subkey;
+    DWORD dword = 0x17, type, size;
+    char exp_binary[] = {0xAA,0xBB,0xCC,0x11};
+    LONG lr;
+    char buffer[256];
+    BYTE hex[8];
+
+    lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
+    ok(lr == ERROR_SUCCESS || lr == ERROR_FILE_NOT_FOUND, "RegDeleteKeyA failed: %d\n", lr);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"TestValue\"=\"AValue\"\n");
+    lr = RegOpenKeyExA(HKEY_CURRENT_USER, KEY_BASE, 0, KEY_READ, &hkey);
+    ok(lr == ERROR_SUCCESS, "RegOpenKeyExA failed: %d\n", lr);
+    verify_reg(hkey, "TestValue", REG_SZ, "AValue", 7, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\r\n\r\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\r\n"
+                     "\"TestValue2\"=\"BValue\"\r\n");
+    verify_reg(hkey, "TestValue2", REG_SZ, "BValue", 7, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"TestValue3\"=\"Value\"\n");
+    verify_reg(hkey, "TestValue3", REG_SZ, "Value", 6, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\r\r"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\r"
+                     "\"TestValue4\"=\"DValue\"\r");
+    verify_reg(hkey, "TestValue4", REG_SZ, "DValue", 7, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\r\r"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\r"
+                     "\"TestValue5\"=\"Value\"\r");
+    verify_reg(hkey, "TestValue5", REG_SZ, "Value", 6, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"TestDword\"=dword:00000017\n");
+    verify_reg(hkey, "TestDword", REG_DWORD, &dword, sizeof(dword), 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                    "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                    "\"TestBinary\"=hex:aa,bb,cc,11\n");
+    verify_reg(hkey, "TestBinary", REG_BINARY, exp_binary, sizeof(exp_binary), 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                    "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                    "\"With=Equals\"=\"asdf\"\n");
+    verify_reg(hkey, "With=Equals", REG_SZ, "asdf", 5, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Empty string\"=\"\"\n"
+                     "\"\"=\"Default registry value\"\n\n");
+    verify_reg(hkey, "Empty string", REG_SZ, "", 1, 0);
+    verify_reg(hkey, NULL, REG_SZ, "Default registry value", 23, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Line1\"=\"Value1\"\n\n"
+                     "\"Line2\"=\"Value2\"\n\n\n"
+                     "\"Line3\"=\"Value3\"\n\n\n\n"
+                     "\"Line4\"=\"Value4\"\n\n");
+    verify_reg(hkey, "Line1", REG_SZ, "Value1", 7, 0);
+    verify_reg(hkey, "Line2", REG_SZ, "Value2", 7, 0);
+    verify_reg(hkey, "Line3", REG_SZ, "Value3", 7, 0);
+    verify_reg(hkey, "Line4", REG_SZ, "Value4", 7, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine1\"=dword:00000782\n\n"
+                     "\"Wine2\"=\"Test Value\"\n"
+                     "\"Wine3\"=hex(7):4c,00,69,00,6e,00,65,00,20,00,\\\n"
+                     "  63,00,6f,00,6e,00,63,00,61,00,74,00,\\\n"
+                     "  65,00,6e,00,61,00,74,00,69,00,6f,00,6e,00,00,00,00,00\n"
+                     "#comment\n"
+                     "@=\"Test\"\n"
+                     ";comment\n\n"
+                     "\"Wine4\"=dword:12345678\n\n");
+    dword = 0x782;
+    verify_reg(hkey, "Wine1", REG_DWORD, &dword, sizeof(dword), 0);
+    verify_reg(hkey, "Wine2", REG_SZ, "Test Value", 11, 0);
+    verify_reg(hkey, "Wine3", REG_MULTI_SZ, "Line concatenation\0", 20, 0);
+    verify_reg(hkey, "", REG_SZ, "Test", 5, 0);
+    dword = 0x12345678;
+    verify_reg(hkey, "Wine4", REG_DWORD, &dword, sizeof(dword), 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine5\"=\"No newline\"");
+    verify_reg(hkey, "Wine5", REG_SZ, "No newline", 11, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine6\"=dword:00000050\n\n"
+                     "\"Wine7\"=\"No newline\"");
+    dword = 0x50;
+    verify_reg(hkey, "Wine6", REG_DWORD, &dword, sizeof(dword), 0);
+    verify_reg(hkey, "Wine7", REG_SZ, "No newline", 11, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine8a\"=dword:1\n"
+                     "\"Wine8b\"=dword:4444\n\n");
+    dword = 0x1;
+    verify_reg(hkey, "Wine8a", REG_DWORD, &dword, sizeof(dword), 0);
+    dword = 0x4444;
+    verify_reg(hkey, "Wine8b", REG_DWORD, &dword, sizeof(dword), 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine9a\"=hex(2):4c,00,69,00,6e,00,65,00,00,00\n"
+                     "\"Wine9b\"=\"Value 1\"\n"
+                     "\"Wine9c\"=hex(2):4c,00,69,00,6e,00,65,00\\\n"
+                     "\"Wine9d\"=\"Value 2\"\n"
+                     "\"Wine9e\"=hex(2):4c,00,69,00,6e,00,65,00,\\\n"
+                     "\"Wine9f\"=\"Value 3\"\n"
+                     "\"Wine9g\"=\"Value 4\"\n\n");
+    verify_reg(hkey, "Wine9a", REG_EXPAND_SZ, "Line", 5, 0);
+    verify_reg(hkey, "Wine9b", REG_SZ, "Value 1", 8, 0);
+    verify_reg_nonexist(hkey, "Wine9c");
+    verify_reg(hkey, "Wine9d", REG_SZ, "Value 2", 8, 0);
+    verify_reg_nonexist(hkey, "Wine9e");
+    verify_reg_nonexist(hkey, "Wine9f");
+    verify_reg(hkey, "Wine9g", REG_SZ, "Value 4", 8, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"double\\\"quote\"=\"valid \\\"or\\\" not\"\n"
+                     "\"single'quote\"=dword:00000008\n\n");
+    verify_reg(hkey, "double\"quote", REG_SZ, "valid \"or\" not", 15, 0);
+    dword = 0x00000008;
+    verify_reg(hkey, "single'quote", REG_DWORD, &dword, sizeof(dword), 0);
+
+    /* Test hex data concatenation for REG_NONE, REG_EXPAND_SZ and REG_BINARY */
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine10a\"=hex(0):56,00,61,00,6c,00,75,00,65,00,00,00\n"
+                     "\"Wine10b\"=hex(0):56,00,61,00,6c,00,\\\n"
+                     "  75,00,65,00,00,00\n"
+                     "\"Wine10c\"=hex(0):56,00,61,00,\\;comment\n"
+                     "  6c,00,75,00,\\\n"
+                     "  65,00,00,00\n"
+                     "\"Wine10d\"=hex(0):56,00,61,00,\\;comment\n"
+                     "  6c,00,75,00,\n"
+                     "  65,00,00,00\n"
+                     "\"Wine10e\"=hex(0):56,00,61,00,\\;comment\n"
+                     "  6c,00,75,00,;comment\n"
+                     "  65,00,00,00\n");
+    verify_reg(hkey, "Wine10a", REG_NONE, "V\0a\0l\0u\0e\0\0", 12, 0);
+    verify_reg(hkey, "Wine10b", REG_NONE, "V\0a\0l\0u\0e\0\0", 12, 0);
+    verify_reg(hkey, "Wine10c", REG_NONE, "V\0a\0l\0u\0e\0\0", 12, 0);
+    verify_reg(hkey, "Wine10d", REG_NONE, "V\0a\0l\0u", 8, 0);
+    verify_reg(hkey, "Wine10e", REG_NONE, "V\0a\0l\0u", 8, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine11a\"=hex(2):25,00,50,00,41,00,54,00,48,00,25,00,00,00\n"
+                     "\"Wine11b\"=hex(2):25,00,50,00,41,00,\\\n"
+                     "  54,00,48,00,25,00,00,00\n"
+                     "\"Wine11c\"=hex(2):25,00,50,00,41,00,\\;comment\n"
+                     "  54,00,48,00,\\\n"
+                     "  25,00,00,00\n"
+                     "\"Wine11d\"=hex(2):25,00,50,00,41,00,\\;comment\n"
+                     "  54,00,48,00,\n"
+                     "  25,00,00,00\n"
+                     "\"Wine11e\"=hex(2):25,00,50,00,41,00,\\;comment\n"
+                     "  54,00,48,00,;comment\n"
+                     "  25,00,00,00\n");
+    verify_reg(hkey, "Wine11a", REG_EXPAND_SZ, "%PATH%", 7, 0);
+    verify_reg(hkey, "Wine11b", REG_EXPAND_SZ, "%PATH%", 7, 0);
+    verify_reg(hkey, "Wine11c", REG_EXPAND_SZ, "%PATH%", 7, 0);
+    /* Wine11d */
+    size = sizeof(buffer);
+    lr = RegQueryValueExA(hkey, "Wine11d", NULL, &type, (BYTE *)&buffer, &size);
+    ok(lr == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", lr);
+    ok(type == REG_EXPAND_SZ, "got wrong type %u, expected %u\n", type, REG_EXPAND_SZ);
+    todo_wine ok(size == 6 || broken(size == 5) /* Win2k */, "got wrong size %u, expected 6\n", size);
+    ok(memcmp(buffer, "%PATH", size) == 0, "got wrong data\n");
+    /* Wine11e */
+    size = sizeof(buffer);
+    memset(buffer, '-', size);
+    lr = RegQueryValueExA(hkey, "Wine11e", NULL, &type, (BYTE *)&buffer, &size);
+    ok(lr == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", lr);
+    ok(type == REG_EXPAND_SZ, "got wrong type %u, expected %u\n", type, REG_EXPAND_SZ);
+    todo_wine ok(size == 6 || broken(size == 5) /* Win2k */, "got wrong size %u, expected 6\n", size);
+    ok(memcmp(buffer, "%PATH", size) == 0, "got wrong data\n");
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine12a\"=hex:11,22,33,44,55,66,77,88\n"
+                     "\"Wine12b\"=hex:11,22,33,44,\\\n"
+                     "  55,66,77,88\n"
+                     "\"Wine12c\"=hex:11,22,33,44,\\;comment\n"
+                     "  55,66,\\\n"
+                     "  77,88\n"
+                     "\"Wine12d\"=hex:11,22,33,44,\\;comment\n"
+                     "  55,66,\n"
+                     "  77,88\n"
+                     "\"Wine12e\"=hex:11,22,33,44,\\;comment\n"
+                     "  55,66,;comment\n"
+                     "  77,88\n");
+    hex[0] = 0x11; hex[1] = 0x22; hex[2] = 0x33; hex[3] = 0x44;
+    hex[4] = 0x55; hex[5] = 0x66; hex[6] = 0x77; hex[7] = 0x88;
+    verify_reg(hkey, "Wine12a", REG_BINARY, hex, sizeof(hex), 0);
+    verify_reg(hkey, "Wine12b", REG_BINARY, hex, sizeof(hex), 0);
+    verify_reg(hkey, "Wine12c", REG_BINARY, hex, sizeof(hex), 0);
+    verify_reg(hkey, "Wine12d", REG_BINARY, hex, 6, 0);
+    verify_reg(hkey, "Wine12e", REG_BINARY, hex, 6, 0);
+
+    /* Test import with subkeys */
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey\"1]\n"
+                     "\"Wine\\\\31\"=\"Test value\"\n\n");
+    lr = RegOpenKeyExA(hkey, "Subkey\"1", 0, KEY_READ, &subkey);
+    ok(lr == ERROR_SUCCESS, "got %d, expected 0\n", lr);
+    verify_reg(subkey, "Wine\\31", REG_SZ, "Test value", 11, 0);
+    lr = RegCloseKey(subkey);
+    ok(lr == ERROR_SUCCESS, "got %d, expected 0\n", lr);
+    lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE "\\Subkey\"1");
+    ok(lr == ERROR_SUCCESS, "got %d, expected 0\n", lr);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey/2]\n"
+                     "\"123/\\\"4;'5\"=\"Random value name\"\n\n");
+    lr = RegOpenKeyExA(hkey, "Subkey/2", 0, KEY_READ, &subkey);
+    ok(lr == ERROR_SUCCESS, "got %d, expected 0\n", lr);
+    verify_reg(subkey, "123/\"4;'5", REG_SZ, "Random value name", 18, 0);
+    lr = RegCloseKey(subkey);
+    ok(lr == ERROR_SUCCESS, "got %d, expected 0\n", lr);
+    lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE "\\Subkey/2");
+    ok(lr == ERROR_SUCCESS, "got %d, expected 0\n", lr);
+
+    /* Test the accepted range of the hex-based data types */
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine13a\"=hex(0):56,61,6c,75,65,00\n"
+                     "\"Wine13b\"=hex(10):56,61,6c,75,65,00\n"
+                     "\"Wine13c\"=hex(100):56,61,6c,75,65,00\n"
+                     "\"Wine13d\"=hex(1000):56,61,6c,75,65,00\n"
+                     "\"Wine13e\"=hex(7fff):56,61,6c,75,65,00\n"
+                     "\"Wine13f\"=hex(ffff):56,61,6c,75,65,00\n"
+                     "\"Wine13g\"=hex(7fffffff):56,61,6c,75,65,00\n"
+                     "\"Wine13h\"=hex(ffffffff):56,61,6c,75,65,00\n"
+                     "\"Wine13i\"=hex(100000000):56,61,6c,75,65,00\n"
+                     "\"Wine13j\"=hex(0x2):56,61,6c,75,65,00\n"
+                     "\"Wine13k\"=hex(0X2):56,61,6c,75,65,00\n"
+                     "\"Wine13l\"=hex(x2):56,61,6c,75,65,00\n\n");
+    verify_reg(hkey, "Wine13a", REG_NONE, "Value", 6, 0);
+    verify_reg(hkey, "Wine13b", 0x10, "Value", 6, 0);
+    verify_reg(hkey, "Wine13c", 0x100, "Value", 6, 0);
+    verify_reg(hkey, "Wine13d", 0x1000, "Value", 6, 0);
+    verify_reg(hkey, "Wine13e", 0x7fff, "Value", 6, 0);
+    verify_reg(hkey, "Wine13f", 0xffff, "Value", 6, 0);
+    verify_reg(hkey, "Wine13g", 0x7fffffff, "Value", 6, 0);
+    verify_reg(hkey, "Wine13h", 0xffffffff, "Value", 6, 0);
+    verify_reg_nonexist(hkey, "Wine13i");
+    verify_reg_nonexist(hkey, "Wine13j");
+    verify_reg_nonexist(hkey, "Wine13k");
+    verify_reg_nonexist(hkey, "Wine13l");
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine14a\"=hex(7):4c,00,69,00,6e,00,65,00,20,00,  \\\n"
+                     "  63,00,6f,00,6e,00,63,00,61,00,74,00,\\\n"
+                     "  65,00,6e,00,61,00,74,00,69,00,6f,00,6e,00,00,00,00,00\n"
+                     "\"Wine14b\"=hex(7):4c,00,69,00,6e,00,65,00,20,00,\t\\\n"
+                     "  63,00,6f,00,6e,00,63,00,61,00,74,00,\\\n"
+                     "  65,00,6e,00,61,00,74,00,69,00,6f,00,6e,00,00,00,00,00\n\n");
+    verify_reg(hkey, "Wine14a", REG_MULTI_SZ, "Line concatenation\0", 20, 0);
+    verify_reg(hkey, "Wine14b", REG_MULTI_SZ, "Line concatenation\0", 20, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine15\"=hex(2):25,00,50,00,41,00,54,00,48,00,25,00,00,00,\n\n");
+    verify_reg(hkey, "Wine15", REG_EXPAND_SZ, "%PATH%", 7, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine16\"=hex(2):\\\n"
+                     "  25,00,48,00,4f,00,4d,00,45,00,25,00,00,00\n\n");
+    verify_reg(hkey, "Wine16", REG_EXPAND_SZ, "%HOME%", 7, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine17a\"=hex(0):56,61,6c,75,65,\\");
+    verify_reg(hkey, "Wine17a", REG_NONE, "Value", 5, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine17b\"=hex(2):25,00,50,00,41,00,54,00,48,00,25,00,\\");
+    verify_reg(hkey, "Wine17b", REG_EXPAND_SZ, "%PATH%", 7, TODO_REG_SIZE);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine17c\"=hex:11,22,33,44,55,\\");
+    verify_reg(hkey, "Wine17c", REG_BINARY, hex, 5, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine17d\"=hex(7):4c,00,69,00,6e,00,65,00,\\");
+    verify_reg(hkey, "Wine17d", REG_MULTI_SZ, "Line", 5, TODO_REG_SIZE);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine17e\"=hex(100):56,61,6c,75,65,\\");
+    verify_reg(hkey, "Wine17e", 0x100, "Value", 5, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine18a\"=hex(7):4c,00,69,00,6e,00,65,00,00,00,00,00\n"
+                     "\"Wine18b\"=hex(7):4c,00,69,00,6e,00,65,00,20,00,\\\n"
+                     "  63,00,6f,00,6e,00,63,00,61,00,74,00,\\\n"
+                     "  65,00,6e,00,61,00,74,00,69,00,6f,00,6e,00,00,00,00,00\n"
+                     "\"Wine18c\"=hex(7):4c,00,69,00,6e,00,65,00,20,00,\\;comment\n"
+                     "  63,00,6f,00,6e,00,63,00,61,00,74,00,\\\n"
+                     "  65,00,6e,00,61,00,74,00,69,00,6f,00,6e,00,00,00,00,00\n"
+                     "\"Wine18d\"=hex(7):4c,00,69,00,6e,00,65,00,20,00,\\;comment\n"
+                     "  63,00,6f,00,6e,00,63,00,61,00,74,00,\n"
+                     "  65,00,6e,00,61,00,74,00,69,00,6f,00,6e,00,00,00,00,00\n"
+                     "\"Wine18e\"=hex(7):4c,00,69,00,6e,00,65,00,20,00,\\\n"
+                     "  63,00,6f,00,6e,00,63,00,61,00,74,00,;comment\n"
+                     "  65,00,6e,00,61,00,74,00,69,00,6f,00,6e,00,00,00,00,00\n\n");
+    verify_reg(hkey, "Wine18a", REG_MULTI_SZ, "Line\0", 6, 0);
+    verify_reg(hkey, "Wine18b", REG_MULTI_SZ, "Line concatenation\0", 20, 0);
+    verify_reg(hkey, "Wine18c", REG_MULTI_SZ, "Line concatenation\0", 20, 0);
+    /* Wine18d */
+    size = sizeof(buffer);
+    memset(buffer, '-', size);
+    lr = RegQueryValueExA(hkey, "Wine18d", NULL, &type, (BYTE *)&buffer, &size);
+    ok(lr == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", lr);
+    ok(type == REG_MULTI_SZ, "got wrong type %u, expected %u\n", type, REG_MULTI_SZ);
+    todo_wine ok(size == 12 || broken(size == 11) /* Win2k */, "got wrong size %u, expected 12\n", size);
+    ok(memcmp(buffer, "Line concat", size) == 0, "got wrong data\n");
+    /* Wine18e */
+    size = sizeof(buffer);
+    memset(buffer, '-', size);
+    lr = RegQueryValueExA(hkey, "Wine18e", NULL, &type, (BYTE *)&buffer, &size);
+    ok(lr == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", lr);
+    ok(type == REG_MULTI_SZ, "got wrong type %u, expected %u\n", type, REG_MULTI_SZ);
+    todo_wine ok(size == 12 || broken(size == 11) /* Win2k */, "got wrong size %u, expected 12\n", size);
+    ok(memcmp(buffer, "Line concat", size) == 0, "got wrong data\n");
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine19a\"=hex(100):25,50,41,54,48,25,00\n"
+                     "\"Wine19b\"=hex(100):25,50,41,\\\n"
+                     "  54,48,25,00\n"
+                     "\"Wine19c\"=hex(100):25,50,41,\\;comment\n"
+                     "  54,48,\\\n"
+                     "  25,00\n"
+                     "\"Wine19d\"=hex(100):25,50,41,\\;comment\n"
+                     "  54,48,\n"
+                     "  25,00\n"
+                     "\"Wine19e\"=hex(100):25,50,41,\\;comment\n"
+                     "  54,48,;comment\n"
+                     "  25,00\n");
+    verify_reg(hkey, "Wine19a", 0x100, "%PATH%", 7, 0);
+    verify_reg(hkey, "Wine19b", 0x100, "%PATH%", 7, 0);
+    verify_reg(hkey, "Wine19c", 0x100, "%PATH%", 7, 0);
+    verify_reg(hkey, "Wine19d", 0x100, "%PATH", 5, 0);
+    verify_reg(hkey, "Wine19e", 0x100, "%PATH", 5, 0);
+
+    /* Test null-termination of REG_EXPAND_SZ and REG_MULTI_SZ data*/
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine20a\"=hex(7):4c,00,69,00,6e,00,65,00\n"
+                     "\"Wine20b\"=hex(7):4c,00,69,00,6e,00,65,00,\n"
+                     "\"Wine20c\"=hex(7):4c,00,69,00,6e,00,65,00,00,00\n"
+                     "\"Wine20d\"=hex(7):4c,00,69,00,6e,00,65,00,00,00,\n"
+                     "\"Wine20e\"=hex(7):4c,00,69,00,6e,00,65,00,00,00,00,00\n"
+                     "\"Wine20f\"=hex(7):4c,00,69,00,6e,00,65,00,00,00,00,00,\n\n");
+    verify_reg(hkey, "Wine20a", REG_MULTI_SZ, "Line", 5, TODO_REG_SIZE);
+    verify_reg(hkey, "Wine20b", REG_MULTI_SZ, "Line", 5, TODO_REG_SIZE);
+    verify_reg(hkey, "Wine20c", REG_MULTI_SZ, "Line", 5, 0);
+    verify_reg(hkey, "Wine20d", REG_MULTI_SZ, "Line", 5, 0);
+    verify_reg(hkey, "Wine20e", REG_MULTI_SZ, "Line\0", 6, 0);
+    verify_reg(hkey, "Wine20f", REG_MULTI_SZ, "Line\0", 6, 0);
+
+    exec_import_wstr("\xef\xbb\xbfWindows Registry Editor Version 5.00\n\n"
+                     "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+                     "\"Wine21a\"=hex(2):25,00,50,00,41,00,54,00,48,00,25,00\n"
+                     "\"Wine21b\"=hex(2):25,00,50,00,41,00,54,00,48,00,25,00,\n"
+                     "\"Wine21c\"=hex(2):25,00,50,00,41,00,54,00,48,00,25,00,00,00\n"
+                     "\"Wine21d\"=hex(2):25,00,50,00,41,00,54,00,48,00,25,00,00,00,\n\n");
+    verify_reg(hkey, "Wine21a", REG_EXPAND_SZ, "%PATH%", 7, TODO_REG_SIZE);
+    verify_reg(hkey, "Wine21b", REG_EXPAND_SZ, "%PATH%", 7, TODO_REG_SIZE);
+    verify_reg(hkey, "Wine21c", REG_EXPAND_SZ, "%PATH%", 7, 0);
+    verify_reg(hkey, "Wine21d", REG_EXPAND_SZ, "%PATH%", 7, 0);
+
+    RegCloseKey(hkey);
+
+    lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
+    ok(lr == ERROR_SUCCESS, "RegDeleteKeyA failed: %d\n", lr);
+}
+
 static void test_basic_import_31(void)
 {
     HKEY hkey;
@@ -1772,18 +2159,13 @@ static void test_value_deletion(void)
 
 START_TEST(regedit)
 {
-    WCHAR wchar_test[] = {0xFEFF,'W','i','n','d','o','w','s',' ','R','e','g',
-        'i','s','t','r','y',' ','E','d','i','t','o','r',' ','V','e','r','s',
-        'i','o','n',' ','5','.','0','0','\n','\n',0};
-
     if(!exec_import_str("REGEDIT4\r\n\r\n")){
         win_skip("regedit not available, skipping regedit tests\n");
         return;
     }
 
-    supports_wchar = exec_import_wstr(wchar_test);
-
     test_basic_import();
+    test_basic_import_unicode();
     test_basic_import_31();
     test_invalid_import();
     test_invalid_import_31();
-- 
2.14.1




More information about the wine-patches mailing list