<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>---
<br><div><div dir="ltr"><div><span style="font-family:monospace;"> programs/reg/reg.c       | 145 ++++++++++++++++++++++++++++++++++++++---------
<br> programs/reg/reg.h       |   1 +
<br> programs/reg/reg.rc      |   1 +
<br> programs/reg/tests/reg.c |  57 +++++++++----------
<br> 4 files changed, 149 insertions(+), 55 deletions(-)
<br>
<br>diff --git a/programs/reg/reg.c b/programs/reg/reg.c
<br>index cf6425e..b2447fc 100644
<br>--- a/programs/reg/reg.c
<br>+++ b/programs/reg/reg.c
<br>@@ -18,10 +18,15 @@
<br>  <br> #include <windows.h>
<br> #include <wine/unicode.h>
<br>+#include <wine/debug.h>
<br> #include "reg.h"
<br>  <br> #define ARRAY_SIZE(A) (sizeof(A)/sizeof(*A))
<br>  <br>+WINE_DEFAULT_DEBUG_CHANNEL(reg);
<br>+
<br>+static const WCHAR empty_wstr[] = {0};
<br>+
<br> static const WCHAR short_hklm[] = {'H','K','L','M',0};
<br> static const WCHAR short_hkcu[] = {'H','K','C','U',0};
<br> static const WCHAR short_hkcr[] = {'H','K','C','R',0};
<br>@@ -189,43 +194,126 @@ static DWORD wchar_get_type(const WCHAR *type_name)
<br>     return ~0u;
<br> }
<br>  <br>-static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *reg_count)
<br>+static BYTE *wchar_get_data(const WCHAR *input, const DWORD type, const WCHAR separator,
<br>+    DWORD *size_out)
<br> {
<br>-    LPBYTE out_data = NULL;
<br>-    *reg_count = 0;
<br>+    DWORD i;
<br>+
<br>+    if (!input)
<br>+        input = empty_wstr;
<br>  <br>-    switch (reg_type)
<br>+    switch (type)
<br>     {
<br>+        case REG_NONE:
<br>         case REG_SZ:
<br>+        case REG_EXPAND_SZ:
<br>         {
<br>-            *reg_count = (lstrlenW(data) + 1) * sizeof(WCHAR);
<br>-            out_data = HeapAlloc(GetProcessHeap(),0,*reg_count);
<br>-            lstrcpyW((LPWSTR)out_data,data);
<br>-            break;
<br>+            BYTE *data;
<br>+
<br>+            i = (strlenW(input) + 1) * sizeof(WCHAR);
<br>+            *size_out = i;
<br>+            data = HeapAlloc(GetProcessHeap(), 0, i);
<br>+            memcpy(data, input, i);
<br>+            return data;
<br>         }
<br>         case REG_DWORD:
<br>+        case REG_DWORD_BIG_ENDIAN:
<br>         {
<br>-            LPWSTR rest;
<br>-            DWORD val;
<br>-            val = strtolW(data, &rest, 0);
<br>-            if (rest == data) {
<br>-                static const WCHAR nonnumber[] = {'E','r','r','o','r',':',' ','/','d',' ','r','e','q','u','i','r','e','s',' ','n','u','m','b','e','r','.','\n',0};
<br>-                reg_printfW(nonnumber);
<br>-                break;
<br>+            BYTE *data;
<br>+            WCHAR *temp;
<br>+
<br>+            if (input[0] == '0' && (input[1] == 'x' || input[1] == 'X'))
<br>+                i = strtoulW(input, &temp, 16);
<br>+            else
<br>+                i = strtoulW(input, &temp, 10);
<br>+
<br>+            if (input[0] == '-' || temp[0] || temp == input)
<br>+            {
<br>+                reg_message(STRING_INVALID_DWORD);
<br>+                return NULL;
<br>             }
<br>-            *reg_count = sizeof(DWORD);
<br>-            out_data = HeapAlloc(GetProcessHeap(),0,*reg_count);
<br>-            ((LPDWORD)out_data)[0] = val;
<br>-            break;
<br>+
<br>+            if (i == 0xffffffff)
<br>+                WINE_FIXME("Check for integer overflow.\n");
<br>+
<br>+            data = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD));
<br>+            *(DWORD *) data = i;
<br>+            *size_out = sizeof(DWORD);
<br>+            return data;
<br>+        }
<br>+        case REG_MULTI_SZ:
<br>+        {
<br>+            WCHAR *data = HeapAlloc(GetProcessHeap(), 0, (strlenW(input) + 1) * sizeof(WCHAR));
<br>+            DWORD p;
<br>+
<br>+            for (i = 0, p = 0; i <= strlenW(input); i++, p++)
<br>+            {
<br>+                /* If this character is the separator, or no separator has been given and these
<br>+                 * characters are "\\0", then add a 0 indicating the end of this string */
<br>+                if ( (separator && input[i] == separator) ||
<br>+                     (!separator && input[i] == '\\' && input[i + 1] == '0') )
<br>+                {
<br>+                    /* If it's the first character or the previous one was a separator */
<br>+                    if (!p || data[p - 1] == 0)
<br>+                    {
<br>+                        HeapFree(GetProcessHeap(), 0, data);
<br>+                        reg_message(STRING_INVALID_CMDLINE);
<br>+                        return NULL;
<br>+                    }
<br>+                    data[p] = 0;
<br>+
<br>+                    if (!separator)
<br>+                        i++;
<br>+                }
<br>+                else
<br>+                    data[p] = input[i];
<br>+            }
<br>+
<br>+            /* Add a 0 to the end if the string wasn't "", and it wasn't
<br>+             * double-0-terminated already (In the case of a trailing separator) */
<br>+            if (p > 1 && data[p - 2])
<br>+                data[p++] = 0;
<br>+
<br>+            *size_out = p * sizeof(WCHAR);
<br>+            return (BYTE *) data;
<br>+        }
<br>+        case REG_BINARY:
<br>+        {
<br>+            BYTE *data = HeapAlloc(GetProcessHeap(), 0, strlenW(input));
<br>+            DWORD p, odd;
<br>+
<br>+            for (i = 0; i < strlenW(input); i++)
<br>+            {
<br>+                if (input[i] >= '0' && input[i] <= '9')
<br>+                    data[i] = input[i] - '0';
<br>+                else if (input[i] >= 'a' && input[i] <= 'f')
<br>+                    data[i] = input[i] - 'a' + 10;
<br>+                else if (input[i] >= 'A' && input[i] <= 'F')
<br>+                    data[i] = input[i] - 'A' + 10;
<br>+                else
<br>+                {
<br>+                    HeapFree(GetProcessHeap(), 0, data);
<br>+                    reg_message(STRING_INVALID_CMDLINE);
<br>+                    return NULL;
<br>+                }
<br>+            }
<br>+
<br>+            odd = i & 1;
<br>+            p = i >> 1;
<br>+            data += odd;
<br>+
<br>+            for (i = 0; i < p; i++)
<br>+                data[i] = (data[i * 2] << 4) | data[i * 2 + 1];
<br>+
<br>+            *size_out = p + odd;
<br>+            return data - odd;
<br>         }
<br>         default:
<br>         {
<br>-            static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','x',' ',' ','d','a','t','a',' ','%','s','\n',0};
<br>-            reg_printfW(unhandled, reg_type,data);
<br>+            WINE_FIXME("Add support for registry type: %u\n", type);
<br>+            return NULL;
<br>         }
<br>     }
<br>-
<br>-    return out_data;
<br> }
<br>  <br> static BOOL sane_path(const WCHAR *key)
<br>@@ -286,7 +374,14 @@ static int reg_add(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
<br>         }
<br>  <br>         if (data)
<br>-            reg_data = get_regdata(data,reg_type,separator,�_count);
<br>+        {
<br>+            reg_data = wchar_get_data(data, reg_type, separator, �_count);
<br>+            if (!reg_data)
<br>+            {
<br>+                RegCloseKey(subkey);
<br>+                return 1;
<br>+            }
<br>+        }
<br>  <br>         RegSetValueExW(subkey,value_name,0,reg_type,reg_data,reg_count);
<br>         HeapFree(GetProcessHeap(),0,reg_data);
<br>@@ -336,8 +431,6 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
<br>     /* Delete subtree only if no /v* option is given */
<br>     if (!value_name && !value_empty && !value_all)
<br>     {
<br>-        static const WCHAR empty_wstr[] = {0};
<br>-
<br>         err = RegDeleteTreeW(subkey, NULL);
<br>         if (err != ERROR_SUCCESS)
<br>         {
<br>diff --git a/programs/reg/reg.h b/programs/reg/reg.h
<br>index 6fca7eb..c6fb151 100644
<br>--- a/programs/reg/reg.h
<br>+++ b/programs/reg/reg.h
<br>@@ -31,3 +31,4 @@
<br> #define STRING_NO_REMOTE        108
<br> #define STRING_CANNOT_FIND      109
<br> #define STRING_UNSUPPORTED_TYPE 110
<br>+#define STRING_INVALID_DWORD    111
<br>diff --git a/programs/reg/reg.rc b/programs/reg/reg.rc
<br>index 94dddf2..dbd92ea 100644
<br>--- a/programs/reg/reg.rc
<br>+++ b/programs/reg/reg.rc
<br>@@ -36,4 +36,5 @@ STRINGTABLE
<br>     STRING_NO_REMOTE, "Error: Unable to access remote machine\n"
<br>     STRING_CANNOT_FIND, "Error: The system was unable to find the specified registry key or value\n"
<br>     STRING_UNSUPPORTED_TYPE, "Error: Unsupported type\n"
<br>+    STRING_INVALID_DWORD, "Error: /d must be positive number\n"
<br> }
<br>diff --git a/programs/reg/tests/reg.c b/programs/reg/tests/reg.c
<br>index dbfce89..99b4813 100644
<br>--- a/programs/reg/tests/reg.c
<br>+++ b/programs/reg/tests/reg.c
<br>@@ -154,7 +154,7 @@ static void test_add(void)
<br>     /* REG_NONE */
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /v none0 /d deadbeef /t REG_NONE /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %d\n", r);
<br>-    verify_reg(hkey, "none0", REG_NONE, "d\0e\0a\0d\0b\0e\0e\0f\0\0", 18, TODO_REG_SIZE);
<br>+    verify_reg(hkey, "none0", REG_NONE, "d\0e\0a\0d\0b\0e\0e\0f\0\0", 18, 0);
<br>  <br>     /* REG_SZ */
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /d WineTest /f", &r);
<br>@@ -188,11 +188,11 @@ static void test_add(void)
<br>     /* REG_EXPAND_SZ */
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /v expand0 /t REG_EXpand_sz /d \"dead%PATH%beef\" /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>-    verify_reg(hkey, "expand0", REG_EXPAND_SZ, "dead%PATH%beef", 15, TODO_REG_SIZE);
<br>+    verify_reg(hkey, "expand0", REG_EXPAND_SZ, "dead%PATH%beef", 15, 0);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /v expand1 /t REG_EXpand_sz /d \"dead^%PATH^%beef\" /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>-    verify_reg(hkey, "expand1", REG_EXPAND_SZ, "dead^%PATH^%beef", 17, TODO_REG_SIZE);
<br>+    verify_reg(hkey, "expand1", REG_EXPAND_SZ, "dead^%PATH^%beef", 17, 0);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_EXPAND_SZ /v expand2 /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>@@ -200,11 +200,11 @@ static void test_add(void)
<br>  <br>     run_reg_exe("reg add HKEY_CURRENT_USER\\" KEY_BASE " /ve /t REG_EXPAND_SZ /d WineTEST /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>-    verify_reg(hkey, "", REG_EXPAND_SZ, "WineTEST", 9, TODO_REG_SIZE);
<br>+    verify_reg(hkey, "", REG_EXPAND_SZ, "WineTEST", 9, 0);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_EXPAND_SZ /v expand3 /f /d \"\"", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>-    verify_reg(hkey, "expand3", REG_EXPAND_SZ, "", 1, TODO_REG_SIZE);
<br>+    verify_reg(hkey, "expand3", REG_EXPAND_SZ, "", 1, 0);
<br>  <br>     /* REG_BINARY */
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_BINARY /v bin0 /f", &r);
<br>@@ -214,14 +214,14 @@ static void test_add(void)
<br>     run_reg_exe("reg add HKEY_CURRENT_USER\\" KEY_BASE " /ve /t REG_BINARY /d deadbeef /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>     dword = 0xefbeadde;
<br>-    verify_reg(hkey, "", REG_BINARY, &dword, sizeof(DWORD), TODO_REG_SIZE);
<br>+    verify_reg(hkey, "", REG_BINARY, &dword, sizeof(DWORD), 0);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_BINARY /v bin1 /f /d 0xDeAdBeEf", &r);
<br>-    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>+    ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_BINARY /v bin2 /f /d x01", &r);
<br>-    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>+    ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_BINARY /v bin3 /f /d 01x", &r);
<br>-    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>+    ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_BINARY /v bin4 /f /d DeAdBeEf0DD", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>@@ -235,8 +235,8 @@ static void test_add(void)
<br>     err = RegQueryValueExA(hkey, "bin4", NULL, &type, (void *) (buffer+12), &size);
<br>     ok(err == ERROR_SUCCESS, "RegQueryValueEx failed: got %d\n", err);
<br>     ok(type == REG_BINARY, "got wrong type %u\n", type);
<br>-    todo_wine ok(size == 6, "got wrong size %u\n", size);
<br>-    todo_wine ok(memcmp(buffer, buffer+12, 6) == 0 ||
<br>+    ok(size == 6, "got wrong size %u\n", size);
<br>+    ok(memcmp(buffer, buffer+12, 6) == 0 ||
<br>         broken(memcmp(buffer+6, buffer+12, 6) == 0 /* WinXP */), "got wrong data\n");
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_BINARY /v bin5 /d \"\" /f", &r);
<br>@@ -257,11 +257,11 @@ static void test_add(void)
<br>     todo_wine ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */),
<br>        "got exit code %d, expected 0\n", r);
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /v dword2 /t REG_DWORD /d zzz /f", &r);
<br>-    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
<br>+    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /v dword3 /t REG_DWORD /d deadbeef /f", &r);
<br>-    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
<br>+    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /v dword4 /t REG_DWORD /d 123xyz /f", &r);
<br>-    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
<br>+    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /v dword5 /t reg_dword /d 12345678 /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
<br>@@ -275,22 +275,21 @@ static void test_add(void)
<br>     ok(err == ERROR_SUCCESS, "RegQueryValueEx failed: got %d\n", err);
<br>     ok(type == REG_DWORD, "got wrong type %d, expected %d\n", type, REG_DWORD);
<br>     ok(size == sizeof(DWORD), "got wrong size %d, expected %d\n", size, (int)sizeof(DWORD));
<br>-    todo_wine ok(dword == 123 || broken(dword == 0123 /* WinXP */),
<br>+    ok(dword == 123 || broken(dword == 0123 /* WinXP */),
<br>                  "got wrong data %d, expected %d\n", dword, 123);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /v dword7 /t reg_dword /d 0xabcdefg /f", &r);
<br>-    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
<br>+    ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /v dword8 /t REG_dword /d 0xdeadbeef /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
<br>     dword = 0xdeadbeef;
<br>-    verify_reg(hkey, "dword8", REG_DWORD, &dword, sizeof(dword),
<br>-               (sizeof(long) > sizeof(DWORD)) ? 0 : TODO_REG_DATA);
<br>+    verify_reg(hkey, "dword8", REG_DWORD, &dword, sizeof(dword), 0);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_DWORD /v dword9 /f /d -1", &r);
<br>-    todo_wine ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */), "got exit code %u\n", r);
<br>+    ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */), "got exit code %u\n", r);
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_DWORD /v dword10 /f /d -0x1", &r);
<br>-    todo_wine ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */), "got exit code %u\n", r);
<br>+    ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */), "got exit code %u\n", r);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /v dword8 /t REG_dword /d 0x01ffffffff /f", &r);
<br>     todo_wine ok(r == REG_EXIT_FAILURE || broken(r == REG_EXIT_SUCCESS /* WinXP */), "got exit code %d\n", r);
<br>@@ -305,7 +304,7 @@ static void test_add(void)
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /v DWORD_BE /t REG_DWORD_BIG_ENDIAN /d 456 /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>     dword = 456;
<br>-    verify_reg(hkey, "DWORD_BE", REG_DWORD_BIG_ENDIAN, &dword, sizeof(dword), TODO_REG_SIZE);
<br>+    verify_reg(hkey, "DWORD_BE", REG_DWORD_BIG_ENDIAN, &dword, sizeof(dword), 0);
<br>     /* REG_DWORD_BIG_ENDIAN is broken in every version of windows. It behaves like
<br>      * an ordinary REG_DWORD - that is little endian. GG */
<br>  <br>@@ -313,15 +312,15 @@ static void test_add(void)
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /v multi0 /t REG_MULTI_SZ /d \"three\\0little\\0strings\" /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>     memcpy(buffer, "three\0little\0strings\0", 22);
<br>-    verify_reg(hkey, "multi0", REG_MULTI_SZ, buffer, 22, TODO_REG_SIZE);
<br>+    verify_reg(hkey, "multi0", REG_MULTI_SZ, buffer, 22, 0);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi1 /s \"#\" /d \"three#little#strings\" /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>-    verify_reg(hkey, "multi1", REG_MULTI_SZ, buffer, 22, TODO_REG_SIZE);
<br>+    verify_reg(hkey, "multi1", REG_MULTI_SZ, buffer, 22, 0);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi2 /d \"\" /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>-    verify_reg(hkey, "multi2", REG_MULTI_SZ, &buffer[21], 1, TODO_REG_SIZE);
<br>+    verify_reg(hkey, "multi2", REG_MULTI_SZ, &buffer[21], 1, 0);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi3 /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>@@ -329,7 +328,7 @@ static void test_add(void)
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi4 /s \"#\" /d \"threelittlestrings\" /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>-    verify_reg(hkey, "multi4", REG_MULTI_SZ, "threelittlestrings\0", 20, TODO_REG_SIZE);
<br>+    verify_reg(hkey, "multi4", REG_MULTI_SZ, "threelittlestrings\0", 20, 0);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi5 /s \"#randomgibberish\" /d \"three#little#strings\" /f", &r);
<br>     todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>@@ -338,16 +337,16 @@ static void test_add(void)
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi7 /s \"\" /d \"three#little#strings\" /f", &r);
<br>     todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi8 /s \"#\" /d \"##\" /f", &r);
<br>-    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>+    ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi9 /s \"#\" /d \"two##strings\" /f", &r);
<br>-    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>+    ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi10 /s \"#\" /d \"#a\" /f", &r);
<br>-    todo_wine ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>+    ok(r == REG_EXIT_FAILURE, "got exit code %u\n", r);
<br>  <br>     run_reg_exe("reg add HKCU\\" KEY_BASE " /t REG_MULTI_SZ /v multi11 /s \"#\" /d \"a#\" /f", &r);
<br>     ok(r == REG_EXIT_SUCCESS, "got exit code %u\n", r);
<br>     buffer[0]='a'; buffer[1]=0; buffer[2]=0;
<br>-    verify_reg(hkey, "multi11", REG_MULTI_SZ, buffer, 3, TODO_REG_SIZE);
<br>+    verify_reg(hkey, "multi11", REG_MULTI_SZ, buffer, 3, 0);
<br>  <br>     RegCloseKey(hkey);
<br>  <br>--  <br>2.5.0<br></span></div>


                                          </div></div>                                        </div></body>
</html>