2 * Copyright 2010 Andrew Eikum for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "wine/test.h"
23 static BOOL supports_wchar
;
25 #define lok ok_(__FILE__,line)
27 #define exec_import_str(c) r_exec_import_str(__LINE__, c)
28 static BOOL
r_exec_import_str(unsigned line
, const char *file_contents
)
30 STARTUPINFOA si
= {sizeof(STARTUPINFOA
)};
31 PROCESS_INFORMATION pi
;
35 char cmd
[] = "regedit /s test.reg";
37 regfile
= CreateFileA("test.reg", GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
,
38 FILE_ATTRIBUTE_NORMAL
, NULL
);
39 lok(regfile
!= INVALID_HANDLE_VALUE
, "Failed to create test.reg file\n");
40 if(regfile
== INVALID_HANDLE_VALUE
)
43 br
= WriteFile(regfile
, file_contents
, strlen(file_contents
), &written
,
45 lok(br
== TRUE
, "WriteFile failed: %d\n", GetLastError());
49 if(!CreateProcessA(NULL
, cmd
, NULL
, NULL
, FALSE
, 0, NULL
, NULL
, &si
, &pi
))
52 dr
= WaitForSingleObject(pi
.hProcess
, 10000);
53 if(dr
== WAIT_TIMEOUT
)
54 TerminateProcess(pi
.hProcess
, 1);
55 CloseHandle(pi
.hThread
);
56 CloseHandle(pi
.hProcess
);
58 br
= DeleteFileA("test.reg");
59 lok(br
== TRUE
, "DeleteFileA failed: %d\n", GetLastError());
61 return (dr
!= WAIT_TIMEOUT
);
64 #define exec_import_wstr(c) r_exec_import_wstr(__LINE__, c)
65 static BOOL
r_exec_import_wstr(unsigned line
, const WCHAR
*file_contents
)
67 STARTUPINFOA si
= {sizeof(STARTUPINFOA
)};
68 PROCESS_INFORMATION pi
;
72 char cmd
[] = "regedit /s test.reg";
74 regfile
= CreateFileA("test.reg", GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
,
75 FILE_ATTRIBUTE_NORMAL
, NULL
);
76 lok(regfile
!= INVALID_HANDLE_VALUE
, "Failed to create test.reg file\n");
77 if(regfile
== INVALID_HANDLE_VALUE
)
80 br
= WriteFile(regfile
, file_contents
,
81 lstrlenW(file_contents
) * sizeof(WCHAR
), &written
, NULL
);
82 lok(br
== TRUE
, "WriteFile failed: %d\n", GetLastError());
86 if(!CreateProcessA(NULL
, cmd
, NULL
, NULL
, FALSE
, 0, NULL
, NULL
, &si
, &pi
))
89 dr
= WaitForSingleObject(pi
.hProcess
, 10000);
90 if(dr
== WAIT_TIMEOUT
)
91 TerminateProcess(pi
.hProcess
, 1);
92 CloseHandle(pi
.hThread
);
93 CloseHandle(pi
.hProcess
);
95 br
= DeleteFileA("test.reg");
96 lok(br
== TRUE
, "DeleteFileA failed: %d\n", GetLastError());
98 return (dr
!= WAIT_TIMEOUT
);
101 #define TODO_REG_TYPE (0x0001u)
102 #define TODO_REG_SIZE (0x0002u)
103 #define TODO_REG_DATA (0x0004u)
105 /* verify_reg() adapted from programs/reg/tests/reg.c */
106 #define verify_reg(k,v,t,d,s,todo) verify_reg_(__LINE__,k,v,t,d,s,todo)
107 static void verify_reg_(unsigned line
, HKEY hkey
, const char *value
,
108 DWORD exp_type
, const void *exp_data
, DWORD exp_size
, DWORD todo
)
115 memset(data
, 0xdd, size
);
116 err
= RegQueryValueExA(hkey
, value
, NULL
, &type
, data
, &size
);
117 lok(err
== ERROR_SUCCESS
, "RegQueryValueEx failed: got %d\n", err
);
118 if (err
!= ERROR_SUCCESS
)
121 todo_wine_if (todo
& TODO_REG_TYPE
)
122 lok(type
== exp_type
, "got wrong type %d, expected %d\n", type
, exp_type
);
123 todo_wine_if (todo
& TODO_REG_SIZE
)
124 lok(size
== exp_size
, "got wrong size %d, expected %d\n", size
, exp_size
);
125 todo_wine_if (todo
& TODO_REG_DATA
)
126 lok(memcmp(data
, exp_data
, size
) == 0, "got wrong data\n");
129 #define verify_reg_wsz(k,n,e) r_verify_reg_wsz(__LINE__,k,n,e)
130 static void r_verify_reg_wsz(unsigned line
, HKEY key
, const char *value_name
, const WCHAR
*exp_value
)
133 DWORD fnd_type
, fnd_len
;
134 WCHAR fnd_value
[1024], value_nameW
[1024];
136 MultiByteToWideChar(CP_ACP
, 0, value_name
, -1, value_nameW
,
137 sizeof(value_nameW
)/sizeof(value_nameW
[0]));
139 fnd_len
= sizeof(fnd_value
);
140 lr
= RegQueryValueExW(key
, value_nameW
, NULL
, &fnd_type
, (BYTE
*)fnd_value
, &fnd_len
);
141 lok(lr
== ERROR_SUCCESS
, "RegQueryValueExW failed: %d\n", lr
);
142 if(lr
!= ERROR_SUCCESS
)
145 lok(fnd_type
== REG_SZ
, "Got wrong type: %d\n", fnd_type
);
146 if(fnd_type
!= REG_SZ
)
148 lok(!lstrcmpW(exp_value
, fnd_value
),
149 "Strings differ: expected %s, got %s\n",
150 wine_dbgstr_w(exp_value
), wine_dbgstr_w(fnd_value
));
153 #define verify_reg_nonexist(k,n) r_verify_reg_nonexist(__LINE__,k,n)
154 static void r_verify_reg_nonexist(unsigned line
, HKEY key
, const char *value_name
)
157 DWORD fnd_type
, fnd_len
;
160 fnd_len
= sizeof(fnd_value
);
161 lr
= RegQueryValueExA(key
, value_name
, NULL
, &fnd_type
, (BYTE
*)fnd_value
, &fnd_len
);
162 lok(lr
== ERROR_FILE_NOT_FOUND
, "Reg value shouldn't exist: %s\n",
166 #define KEY_BASE "Software\\Wine\\regedit_test"
168 static void test_basic_import(void)
172 char exp_binary
[] = {0xAA,0xBB,0xCC,0x11};
173 WCHAR wide_test
[] = {0xFEFF,'W','i','n','d','o','w','s',' ','R','e','g',
174 'i','s','t','r','y',' ','E','d','i','t','o','r',' ','V','e','r','s',
175 'i','o','n',' ','5','.','0','0','\n','\n',
176 '[','H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E',
177 'R','\\','S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
178 'r','e','g','e','d','i','t','_','t','e','s','t',']','\n',
179 '"','T','e','s','t','V','a','l','u','e','3','"','=','"',0x3041,'V','a',
180 'l','u','e','"','\n',0};
181 WCHAR wide_test_r
[] = {0xFEFF,'W','i','n','d','o','w','s',' ','R','e','g',
182 'i','s','t','r','y',' ','E','d','i','t','o','r',' ','V','e','r','s',
183 'i','o','n',' ','5','.','0','0','\r','\r',
184 '[','H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E',
185 'R','\\','S','o','f','t','w','a','r','e','\\','W','i','n','e','\\',
186 'r','e','g','e','d','i','t','_','t','e','s','t',']','\r',
187 '"','T','e','s','t','V','a','l','u','e','5','"','=','"',0x3041,'V','a',
188 'l','u','e','"','\r',0};
189 WCHAR wide_exp
[] = {0x3041,'V','a','l','u','e',0};
192 lr
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
);
193 ok(lr
== ERROR_SUCCESS
|| lr
== ERROR_FILE_NOT_FOUND
,
194 "RegDeleteKeyA failed: %d\n", lr
);
196 exec_import_str("REGEDIT4\n\n"
197 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
198 "\"TestValue\"=\"AValue\"\n");
199 lr
= RegOpenKeyExA(HKEY_CURRENT_USER
, KEY_BASE
, 0, KEY_READ
, &hkey
);
200 ok(lr
== ERROR_SUCCESS
, "RegOpenKeyExA failed: %d\n", lr
);
201 verify_reg(hkey
, "TestValue", REG_SZ
, "AValue", 7, 0);
203 exec_import_str("REGEDIT4\r\n\r\n"
204 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\r\n"
205 "\"TestValue2\"=\"BValue\"\r\n");
206 verify_reg(hkey
, "TestValue2", REG_SZ
, "BValue", 7, 0);
210 exec_import_wstr(wide_test
);
211 verify_reg_wsz(hkey
, "TestValue3", wide_exp
);
213 exec_import_wstr(wide_test_r
);
214 verify_reg_wsz(hkey
, "TestValue5", wide_exp
);
217 win_skip("Some WCHAR tests skipped\n");
219 exec_import_str("REGEDIT4\r\r"
220 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\r"
221 "\"TestValue4\"=\"DValue\"\r");
222 verify_reg(hkey
, "TestValue4", REG_SZ
, "DValue", 7, 0);
224 exec_import_str("REGEDIT4\n\n"
225 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
226 "\"TestDword\"=dword:00000017\n");
227 verify_reg(hkey
, "TestDword", REG_DWORD
, &dword
, sizeof(dword
), 0);
229 exec_import_str("REGEDIT4\n\n"
230 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
231 "\"TestBinary\"=hex:aa,bb,cc,11\n");
232 verify_reg(hkey
, "TestBinary", REG_BINARY
, exp_binary
, sizeof(exp_binary
), 0);
234 exec_import_str("REGEDIT4\n\n"
235 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
236 "\"With=Equals\"=\"asdf\"\n");
237 verify_reg(hkey
, "With=Equals", REG_SZ
, "asdf", 5, 0);
239 exec_import_str("REGEDIT4\n\n"
240 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
241 "\"Line1\"=\"Value1\"\n\n"
242 "\"Line2\"=\"Value2\"\n\n\n"
243 "\"Line3\"=\"Value3\"\n\n\n\n"
244 "\"Line4\"=\"Value4\"\n\n");
245 verify_reg(hkey
, "Line1", REG_SZ
, "Value1", 7, 0);
246 verify_reg(hkey
, "Line2", REG_SZ
, "Value2", 7, 0);
247 verify_reg(hkey
, "Line3", REG_SZ
, "Value3", 7, 0);
248 verify_reg(hkey
, "Line4", REG_SZ
, "Value4", 7, 0);
250 exec_import_str("REGEDIT4\n\n"
251 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
252 "\"Wine1\"=dword:00000782\n\n"
253 "\"Wine2\"=\"Test Value\"\n"
254 "\"Wine3\"=hex(7):4c,69,6e,65,20,\\\n"
255 " 63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n"
259 "\"Wine4\"=dword:12345678\n\n");
261 verify_reg(hkey
, "Wine1", REG_DWORD
, &dword
, sizeof(dword
), 0);
262 verify_reg(hkey
, "Wine2", REG_SZ
, "Test Value", 11, 0);
263 verify_reg(hkey
, "Wine3", REG_MULTI_SZ
, "Line concatenation\0", 20, 0);
264 verify_reg(hkey
, "", REG_SZ
, "Test", 5, 0);
266 verify_reg(hkey
, "Wine4", REG_DWORD
, &dword
, sizeof(dword
), 0);
268 exec_import_str("REGEDIT4\n\n"
269 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
270 "\"Wine5\"=\"No newline\"");
271 todo_wine
verify_reg(hkey
, "Wine5", REG_SZ
, "No newline", 11, 0);
273 exec_import_str("REGEDIT4\n\n"
274 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
275 "\"Wine6\"=dword:00000050\n\n"
276 "\"Wine7\"=\"No newline\"");
278 verify_reg(hkey
, "Wine6", REG_DWORD
, &dword
, sizeof(dword
), 0);
279 todo_wine
verify_reg(hkey
, "Wine7", REG_SZ
, "No newline", 11, 0);
281 exec_import_str("REGEDIT4\n\n"
282 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
283 "\"double\\\"quote\"=\"valid \\\"or\\\" not\"\n"
284 "\"single'quote\"=dword:00000008\n\n");
285 verify_reg(hkey
, "double\"quote", REG_SZ
, "valid \"or\" not", 15, 0);
287 verify_reg(hkey
, "single'quote", REG_DWORD
, &dword
, sizeof(dword
), 0);
289 exec_import_str("REGEDIT4\n\n"
290 "[HKEY_CURRENT_USER\\" KEY_BASE
"\\Subkey\"1]\n"
291 "\"Wine\\\\31\"=\"Test value\"\n\n");
292 lr
= RegOpenKeyExA(hkey
, "Subkey\"1", 0, KEY_READ
, &subkey
);
293 ok(lr
== ERROR_SUCCESS
, "got %d, expected 0\n", lr
);
294 verify_reg(subkey
, "Wine\\31", REG_SZ
, "Test value", 11, 0);
295 lr
= RegCloseKey(subkey
);
296 ok(lr
== ERROR_SUCCESS
, "got %d, expected 0\n", lr
);
297 lr
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
"\\Subkey\"1");
298 ok(lr
== ERROR_SUCCESS
, "got %d, expected 0\n", lr
);
300 exec_import_str("REGEDIT4\n\n"
301 "[HKEY_CURRENT_USER\\" KEY_BASE
"\\Subkey/2]\n"
302 "\"123/\\\"4;'5\"=\"Random value name\"\n\n");
303 lr
= RegOpenKeyExA(hkey
, "Subkey/2", 0, KEY_READ
, &subkey
);
304 ok(lr
== ERROR_SUCCESS
, "got %d, expected 0\n", lr
);
305 verify_reg(subkey
, "123/\"4;'5", REG_SZ
, "Random value name", 18, 0);
306 lr
= RegCloseKey(subkey
);
307 ok(lr
== ERROR_SUCCESS
, "got %d, expected 0\n", lr
);
308 lr
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
"\\Subkey/2");
309 ok(lr
== ERROR_SUCCESS
, "got %d, expected 0\n", lr
);
313 lr
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
);
314 ok(lr
== ERROR_SUCCESS
, "RegDeleteKeyA failed: %d\n", lr
);
317 static void test_basic_import_31(void)
322 lr
= RegDeleteKeyA(HKEY_CLASSES_ROOT
, KEY_BASE
);
323 ok(lr
== ERROR_SUCCESS
|| lr
== ERROR_FILE_NOT_FOUND
,
324 "RegDeleteKeyA failed: %d\n", lr
);
326 /* Test simple value */
327 exec_import_str("REGEDIT\r\n"
328 "HKEY_CLASSES_ROOT\\" KEY_BASE
" = Value0\r\n");
329 lr
= RegOpenKeyExA(HKEY_CLASSES_ROOT
, KEY_BASE
, 0, KEY_READ
, &hkey
);
330 ok(lr
== ERROR_SUCCESS
, "RegOpenKeyExA failed: %d\n", lr
);
331 verify_reg(hkey
, "", REG_SZ
, "Value0", 7, 0);
333 /* Test proper handling of spaces and equals signs */
334 exec_import_str("REGEDIT\r\n"
335 "HKEY_CLASSES_ROOT\\" KEY_BASE
" =Value1\r\n");
336 verify_reg(hkey
, "", REG_SZ
, "Value1", 7, 0);
338 exec_import_str("REGEDIT\r\n"
339 "HKEY_CLASSES_ROOT\\" KEY_BASE
" = Value2\r\n");
340 verify_reg(hkey
, "", REG_SZ
, " Value2", 8, 0);
342 exec_import_str("REGEDIT\r\n"
343 "HKEY_CLASSES_ROOT\\" KEY_BASE
" = Value3 \r\n");
344 verify_reg(hkey
, "", REG_SZ
, "Value3 ", 8, 0);
346 exec_import_str("REGEDIT\r\n"
347 "HKEY_CLASSES_ROOT\\" KEY_BASE
" Value4\r\n");
348 verify_reg(hkey
, "", REG_SZ
, "Value4", 7, 0);
350 exec_import_str("REGEDIT\r\n"
351 "HKEY_CLASSES_ROOT\\" KEY_BASE
" Value5\r\n");
352 verify_reg(hkey
, "", REG_SZ
, "Value5", 7, 0);
354 exec_import_str("REGEDIT\r\n"
355 "HKEY_CLASSES_ROOT\\" KEY_BASE
"\r\n");
356 verify_reg(hkey
, "", REG_SZ
, "", 1, 0);
358 exec_import_str("REGEDIT\r\n"
359 "HKEY_CLASSES_ROOT\\" KEY_BASE
" \r\n");
360 verify_reg(hkey
, "", REG_SZ
, "", 1, 0);
362 exec_import_str("REGEDIT\r\n"
363 "HKEY_CLASSES_ROOT\\" KEY_BASE
" = No newline");
364 verify_reg(hkey
, "", REG_SZ
, "No newline", 11, TODO_REG_SIZE
| TODO_REG_DATA
);
368 lr
= RegDeleteKeyA(HKEY_CLASSES_ROOT
, KEY_BASE
);
369 ok(lr
== ERROR_SUCCESS
, "RegDeleteKeyA failed: %d\n", lr
);
372 static void test_invalid_import(void)
377 lr
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
);
378 ok(lr
== ERROR_SUCCESS
|| lr
== ERROR_FILE_NOT_FOUND
, "RegDeleteKeyA failed: %d\n", lr
);
380 exec_import_str("REGEDIT4\n\n"
381 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
382 "\"TestNoEndQuote\"=\"Asdffdsa\n");
383 lr
= RegOpenKeyExA(HKEY_CURRENT_USER
, KEY_BASE
, 0, KEY_READ
, &hkey
);
384 ok(lr
== ERROR_SUCCESS
, "RegOpenKeyExA failed: %d\n", lr
);
385 verify_reg_nonexist(hkey
, "TestNoEndQuote");
387 exec_import_str("REGEDIT4\n\n"
388 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
389 "\"TestNoBeginQuote\"=Asdffdsa\"\n");
390 verify_reg_nonexist(hkey
, "TestNoBeginQuote");
392 exec_import_str("REGEDIT4\n\n"
393 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
394 "\"TestNoQuotes\"=Asdffdsa\n");
395 verify_reg_nonexist(hkey
, "TestNoQuotes");
397 exec_import_str("REGEDIT4\n\n"
398 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
399 "\"NameNoEndQuote=\"Asdffdsa\"\n");
400 verify_reg_nonexist(hkey
, "NameNoEndQuote");
402 exec_import_str("REGEDIT4\n\n"
403 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
404 "NameNoBeginQuote\"=\"Asdffdsa\"\n");
405 verify_reg_nonexist(hkey
, "NameNoBeginQuote");
407 exec_import_str("REGEDIT4\n\n"
408 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
409 "NameNoQuotes=\"Asdffdsa\"\n");
410 verify_reg_nonexist(hkey
, "NameNoQuotes");
412 exec_import_str("REGEDIT4\n\n"
413 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
414 "\"MixedQuotes=Asdffdsa\"\n");
415 verify_reg_nonexist(hkey
, "MixedQuotes");
416 verify_reg_nonexist(hkey
, "MixedQuotes=Asdffdsa");
418 /* Test import with non-standard registry file headers */
419 exec_import_str("REGEDIT3\n\n"
420 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
421 "\"Test1\"=\"Value\"\n");
422 verify_reg_nonexist(hkey
, "Test1");
424 exec_import_str("regedit4\n\n"
425 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
426 "\"Test2\"=\"Value\"\n");
427 verify_reg_nonexist(hkey
, "Test2");
429 exec_import_str("Regedit4\n\n"
430 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
431 "\"Test3\"=\"Value\"\n");
432 verify_reg_nonexist(hkey
, "Test3");
434 exec_import_str("REGEDIT 4\n\n"
435 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
436 "\"Test4\"=\"Value\"\n");
437 verify_reg_nonexist(hkey
, "Test4");
439 exec_import_str("REGEDIT4FOO\n\n"
440 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
441 "\"Test5\"=\"Value\"\n");
442 verify_reg_nonexist(hkey
, "Test5");
444 exec_import_str("REGEDIT4 FOO\n\n"
445 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
446 "\"Test6\"=\"Value\"\n");
447 verify_reg_nonexist(hkey
, "Test6");
449 exec_import_str("REGEDIT5\n\n"
450 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
451 "\"Test7\"=\"Value\"\n");
452 verify_reg_nonexist(hkey
, "Test7");
454 exec_import_str("Windows Registry Editor Version 4.00\n\n"
455 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
456 "\"Test8\"=\"Value\"\n");
457 verify_reg_nonexist(hkey
, "Test8");
459 exec_import_str("Windows Registry Editor Version 5\n\n"
460 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
461 "\"Test9\"=\"Value\"\n");
462 verify_reg_nonexist(hkey
, "Test9");
464 exec_import_str("WINDOWS REGISTRY EDITOR VERSION 5.00\n\n"
465 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
466 "\"Test10\"=\"Value\"\n");
467 verify_reg_nonexist(hkey
, "Test10");
469 exec_import_str("Windows Registry Editor version 5.00\n\n"
470 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
471 "\"Test11\"=\"Value\"\n");
472 verify_reg_nonexist(hkey
, "Test11");
474 /* Test multi-line import with incorrect comma placement */
475 exec_import_str("REGEDIT4\n\n"
476 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
477 "\"Multi-Line1\"=hex(7):4c,69,6e,65,20\\\n"
478 ",63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n\n");
479 todo_wine
verify_reg_nonexist(hkey
, "Multi-Line1");
481 exec_import_str("REGEDIT4\n\n"
482 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
483 "\"Multi-Line2\"=hex(7):4c,69,6e,65,20\\\n"
484 " ,63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n\n");
485 verify_reg_nonexist(hkey
, "Multi-Line2");
487 exec_import_str("Windows Registry Editor Version 5.00\n\n"
488 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
489 "\"Multi-Line3\"=hex(7):4c,69,6e,65,20\\\n"
490 ",63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n\n");
491 todo_wine
verify_reg_nonexist(hkey
, "Multi-Line3");
493 exec_import_str("Windows Registry Editor Version 5.00\n\n"
494 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
495 "\"Multi-Line4\"=hex(7):4c,69,6e,65,20\\\n"
496 " ,63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n\n");
497 verify_reg_nonexist(hkey
, "Multi-Line4");
501 lr
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
);
502 ok(lr
== ERROR_SUCCESS
, "RegDeleteKeyA failed: %d\n", lr
);
505 static void test_comments(void)
511 lr
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
);
512 ok(lr
== ERROR_SUCCESS
|| lr
== ERROR_FILE_NOT_FOUND
, "RegDeleteKeyA failed: %d\n", lr
);
514 exec_import_str("REGEDIT4\n\n"
515 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
517 "\"Wine1\"=\"Line 1\"\n"
519 "\"Wine2\"=\"Line 2\"\n\n");
520 lr
= RegOpenKeyExA(HKEY_CURRENT_USER
, KEY_BASE
, 0, KEY_READ
, &hkey
);
521 ok(lr
== ERROR_SUCCESS
, "RegOpenKeyExA failed: %d\n", lr
);
522 verify_reg(hkey
, "Wine1", REG_SZ
, "Line 1", 7, 0);
523 verify_reg(hkey
, "Wine2", REG_SZ
, "Line 2", 7, 0);
525 exec_import_str("REGEDIT4\n\n"
526 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
527 "\"Wine3\"=\"Value 1\"#comment\n"
528 "\"Wine4\"=\"Value 2\";comment\n"
529 "\"Wine5\"=dword:01020304 #comment\n"
530 "\"Wine6\"=dword:02040608 ;comment\n\n");
531 verify_reg_nonexist(hkey
, "Wine3");
532 todo_wine
verify_reg(hkey
, "Wine4", REG_SZ
, "Value 2", 8, 0);
533 verify_reg_nonexist(hkey
, "Wine5");
535 todo_wine
verify_reg(hkey
, "Wine6", REG_DWORD
, &dword
, sizeof(dword
), 0);
537 exec_import_str("REGEDIT4\n\n"
538 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
539 "\"Wine7\"=hex(7):4c,69,6e,65,20,\\\n"
541 " 63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n"
542 "\"Wine8\"=\"A valid line\"\n"
543 "\"Wine9\"=hex(7):4c,69,6e,65,20,\\\n"
545 " 63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n"
546 "\"Wine10\"=\"Another valid line\"\n\n");
547 verify_reg_nonexist(hkey
, "Wine7");
548 verify_reg(hkey
, "Wine8", REG_SZ
, "A valid line", 13, 0);
549 todo_wine
verify_reg(hkey
, "Wine9", REG_MULTI_SZ
, "Line concatenation\0", 20, 0);
550 verify_reg(hkey
, "Wine10", REG_SZ
, "Another valid line", 19, 0);
552 exec_import_str("REGEDIT4\n\n"
553 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
554 "#\"Comment1\"=\"Value 1\"\n"
555 ";\"Comment2\"=\"Value 2\"\n"
556 " #\"Comment3\"=\"Value 3\"\n"
557 " ;\"Comment4\"=\"Value 4\"\n"
558 "\"Wine11\"=\"Value 6\"#\"Comment5\"=\"Value 5\"\n"
559 "\"Wine12\"=\"Value 7\";\"Comment6\"=\"Value 6\"\n\n");
560 verify_reg_nonexist(hkey
, "Comment1");
561 verify_reg_nonexist(hkey
, "Comment2");
562 verify_reg_nonexist(hkey
, "Comment3");
563 verify_reg_nonexist(hkey
, "Comment4");
564 todo_wine
verify_reg_nonexist(hkey
, "Wine11");
565 verify_reg_nonexist(hkey
, "Comment5");
566 verify_reg(hkey
, "Wine12", REG_SZ
, "Value 7", 8, TODO_REG_SIZE
|TODO_REG_DATA
);
567 verify_reg_nonexist(hkey
, "Comment6");
569 exec_import_str("REGEDIT4\n\n"
570 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
571 "\"Wine13\"=#\"Value 8\"\n"
572 "\"Wine14\"=;\"Value 9\"\n"
573 "\"Wine15\"=\"#comment1\"\n"
574 "\"Wine16\"=\";comment2\"\n"
575 "\"Wine17\"=\"Value#comment3\"\n"
576 "\"Wine18\"=\"Value;comment4\"\n"
577 "\"Wine19\"=\"Value #comment5\"\n"
578 "\"Wine20\"=\"Value ;comment6\"\n"
579 "\"Wine21\"=#dword:00000001\n"
580 "\"Wine22\"=;dword:00000002\n"
581 "\"Wine23\"=dword:00000003#comment\n"
582 "\"Wine24\"=dword:00000004;comment\n\n");
583 verify_reg_nonexist(hkey
, "Wine13");
584 verify_reg_nonexist(hkey
, "Wine14");
585 verify_reg(hkey
, "Wine15", REG_SZ
, "#comment1", 10, 0);
586 verify_reg(hkey
, "Wine16", REG_SZ
, ";comment2", 10, 0);
587 verify_reg(hkey
, "Wine17", REG_SZ
, "Value#comment3", 15, 0);
588 verify_reg(hkey
, "Wine18", REG_SZ
, "Value;comment4", 15, 0);
589 verify_reg(hkey
, "Wine19", REG_SZ
, "Value #comment5", 16, 0);
590 verify_reg(hkey
, "Wine20", REG_SZ
, "Value ;comment6", 16, 0);
591 verify_reg_nonexist(hkey
, "Wine21");
592 verify_reg_nonexist(hkey
, "Wine22");
593 verify_reg_nonexist(hkey
, "Wine23");
595 todo_wine
verify_reg(hkey
, "Wine24", REG_DWORD
, &dword
, sizeof(dword
), 0);
597 exec_import_str("REGEDIT4\n\n"
598 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
599 "\"Multi-Line1\"=hex(7):4c,69,6e,65,20,\\\n"
600 " 63,6f,6e,\\;comment\n"
601 " 63,61,74,\\;comment\n"
602 " 65,6e,61,74,69,6f,6e,00,00\n\n");
603 todo_wine
verify_reg(hkey
, "Multi-Line1", REG_MULTI_SZ
, "Line concatenation\0", 20, 0);
605 exec_import_str("REGEDIT4\n\n"
606 "[HKEY_CURRENT_USER\\" KEY_BASE
"]\n"
607 "\"Multi-Line2\"=hex(7):4c,69,6e,65,20,\\\n"
608 " 63,6f,6e,\\;comment\n"
609 " 63,61,74,;comment\n"
610 " 65,6e,61,74,69,6f,6e,00,00\n\n");
611 todo_wine
verify_reg(hkey
, "Multi-Line2", REG_MULTI_SZ
, "Line concat", 12, 0);
615 lr
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
);
616 ok(lr
== ERROR_SUCCESS
, "RegDeleteKeyA failed: %d\n", lr
);
621 WCHAR wchar_test
[] = {0xFEFF,'W','i','n','d','o','w','s',' ','R','e','g',
622 'i','s','t','r','y',' ','E','d','i','t','o','r',' ','V','e','r','s',
623 'i','o','n',' ','5','.','0','0','\n','\n',0};
625 if(!exec_import_str("REGEDIT4\r\n\r\n")){
626 win_skip("regedit not available, skipping regedit tests\n");
630 supports_wchar
= exec_import_wstr(wchar_test
);
633 test_basic_import_31();
634 test_invalid_import();