2 * Copyright 2014 Akihiro Sagawa
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
20 #include "wine/test.h"
22 #define lok ok_(__FILE__,line)
23 #define KEY_BASE "Software\\Wine\\reg_test"
24 #define REG_EXIT_SUCCESS 0
25 #define REG_EXIT_FAILURE 1
26 #define TODO_REG_TYPE (0x0001u)
27 #define TODO_REG_SIZE (0x0002u)
28 #define TODO_REG_DATA (0x0004u)
30 #define run_reg_exe(c,r) run_reg_exe_(__LINE__,c,r)
31 static BOOL
run_reg_exe_(unsigned line
, const char *cmd
, DWORD
*rc
)
33 STARTUPINFOA si
= {sizeof(STARTUPINFOA
)};
34 PROCESS_INFORMATION pi
;
39 si
.dwFlags
= STARTF_USESTDHANDLES
;
40 si
.hStdInput
= INVALID_HANDLE_VALUE
;
41 si
.hStdOutput
= INVALID_HANDLE_VALUE
;
42 si
.hStdError
= INVALID_HANDLE_VALUE
;
45 if (!CreateProcessA(NULL
, cmdline
, NULL
, NULL
, TRUE
, 0, NULL
, NULL
, &si
, &pi
))
48 ret
= WaitForSingleObject(pi
.hProcess
, 10000);
49 if (ret
== WAIT_TIMEOUT
)
50 TerminateProcess(pi
.hProcess
, 1);
52 bret
= GetExitCodeProcess(pi
.hProcess
, rc
);
53 lok(bret
, "GetExitCodeProcess failed: %d\n", GetLastError());
55 CloseHandle(pi
.hThread
);
56 CloseHandle(pi
.hProcess
);
60 #define verify_reg(k,v,t,d,s,todo) verify_reg_(__LINE__,k,v,t,d,s,todo)
61 static void verify_reg_(unsigned line
, HKEY hkey
, const char* value
,
62 DWORD exp_type
, const void *exp_data
, DWORD exp_size
, DWORD todo
)
69 memset(data
, 0xdd, size
);
70 err
= RegQueryValueExA(hkey
, value
, NULL
, &type
, data
, &size
);
71 lok(err
== ERROR_SUCCESS
, "RegQueryValueEx failed: got %d\n", err
);
72 if (err
!= ERROR_SUCCESS
)
75 if (todo
& TODO_REG_TYPE
)
76 todo_wine
lok(type
== exp_type
, "got wrong type %d, expected %d\n", type
, exp_type
);
78 lok(type
== exp_type
, "got wrong type %d, expected %d\n", type
, exp_type
);
79 if (todo
& TODO_REG_SIZE
)
80 todo_wine
lok(size
== exp_size
, "got wrong size %d, expected %d\n", size
, exp_size
);
82 lok(size
== exp_size
, "got wrong size %d, expected %d\n", size
, exp_size
);
83 if (todo
& TODO_REG_DATA
)
84 todo_wine
lok(memcmp(data
, exp_data
, size
) == 0, "got wrong data\n");
86 lok(memcmp(data
, exp_data
, size
) == 0, "got wrong data\n");
89 static void test_add(void)
93 DWORD r
, dword
, type
, size
;
96 run_reg_exe("reg add", &r
);
97 ok(r
== REG_EXIT_FAILURE
, "got exit code %d, expected 1\n", r
);
99 err
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
);
100 ok(err
== ERROR_SUCCESS
|| err
== ERROR_FILE_NOT_FOUND
, "got %d\n", err
);
102 err
= RegOpenKeyExA(HKEY_CURRENT_USER
, KEY_BASE
, 0, KEY_READ
, &hkey
);
103 ok(err
== ERROR_FILE_NOT_FOUND
, "got %d\n", err
);
105 run_reg_exe("reg add HKCU\\" KEY_BASE
" /f", &r
);
106 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
108 err
= RegOpenKeyExA(HKEY_CURRENT_USER
, KEY_BASE
, 0, KEY_READ
, &hkey
);
109 ok(err
== ERROR_SUCCESS
, "key creation failed, got %d\n", err
);
111 /* Test empty type */
112 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v emptyType /t \"\" /d WineTest /f", &r
);
113 todo_wine
ok(r
== REG_EXIT_SUCCESS
|| broken(r
== REG_EXIT_FAILURE
/* WinXP */),
114 "got exit code %u\n", r
);
115 if (r
== REG_EXIT_SUCCESS
)
116 todo_wine
verify_reg(hkey
, "emptyType", REG_SZ
, "", 1, 0);
118 todo_wine
win_skip("broken reg.exe detected\n");
120 /* Test input key formats */
121 run_reg_exe("reg add \\HKCU\\" KEY_BASE
"\\keytest0 /f", &r
);
122 ok(r
== REG_EXIT_FAILURE
, "got exit code %u\n", r
);
123 err
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
"\\keytest0");
124 ok(err
== ERROR_FILE_NOT_FOUND
, "got exit code %d\n", r
);
126 run_reg_exe("reg add \\\\HKCU\\" KEY_BASE
"\\keytest1 /f", &r
);
127 ok(r
== REG_EXIT_FAILURE
, "got exit code %u\n", r
);
128 err
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
"\\keytest1");
129 ok(err
== ERROR_FILE_NOT_FOUND
, "got exit code %d\n", r
);
131 run_reg_exe("reg add HKCU\\" KEY_BASE
"\\keytest2\\\\ /f", &r
);
132 ok(r
== REG_EXIT_FAILURE
|| broken(r
== REG_EXIT_SUCCESS
/* WinXP */),
133 "got exit code %u\n", r
);
134 err
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
"\\keytest2");
135 ok(err
== ERROR_FILE_NOT_FOUND
|| broken(err
== ERROR_SUCCESS
/* WinXP */),
136 "got exit code %d\n", r
);
138 run_reg_exe("reg add HKCU\\" KEY_BASE
"\\keytest3\\ /f", &r
);
139 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
140 err
= RegOpenKeyExA(HKEY_CURRENT_USER
, KEY_BASE
"\\keytest3", 0, KEY_READ
, &subkey
);
141 ok(err
== ERROR_SUCCESS
, "key creation failed, got %d\n", err
);
143 err
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
"\\keytest3");
144 ok(err
== ERROR_SUCCESS
, "got exit code %d\n", r
);
146 run_reg_exe("reg add HKCU\\" KEY_BASE
"\\keytest4 /f", &r
);
147 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
148 err
= RegOpenKeyExA(HKEY_CURRENT_USER
, KEY_BASE
"\\keytest4", 0, KEY_READ
, &subkey
);
149 ok(err
== ERROR_SUCCESS
, "key creation failed, got %d\n", err
);
151 err
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
"\\keytest4");
152 ok(err
== ERROR_SUCCESS
, "got exit code %d\n", r
);
155 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v none0 /d deadbeef /t REG_NONE /f", &r
);
156 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d\n", r
);
157 verify_reg(hkey
, "none0", REG_NONE
, "d\0e\0a\0d\0b\0e\0e\0f\0\0", 18, TODO_REG_SIZE
);
160 run_reg_exe("reg add HKCU\\" KEY_BASE
" /d WineTest /f", &r
);
161 ok(r
== REG_EXIT_SUCCESS
|| broken(r
== REG_EXIT_FAILURE
/* WinXP */),
162 "got exit code %d, expected 0\n", r
);
163 if (r
== REG_EXIT_SUCCESS
)
164 verify_reg(hkey
, "", REG_SZ
, "WineTest", 9, 0);
166 win_skip("broken reg.exe detected\n");
168 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v test /d deadbeef /f", &r
);
169 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
170 verify_reg(hkey
, "test", REG_SZ
, "deadbeef", 9, 0);
172 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v test /f", &r
);
173 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
174 verify_reg(hkey
, "test", REG_SZ
, "", 1, TODO_REG_SIZE
);
176 run_reg_exe("reg add HKEY_CURRENT_USER\\" KEY_BASE
" /ve /d WineTEST /f", &r
);
177 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
178 verify_reg(hkey
, "", REG_SZ
, "WineTEST", 9, 0);
180 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_SZ /v test2 /f", &r
);
181 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
182 verify_reg(hkey
, "test2", REG_SZ
, "", 1, TODO_REG_SIZE
);
184 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_SZ /v test3 /f /d \"\"", &r
);
185 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
186 verify_reg(hkey
, "test3", REG_SZ
, "", 1, 0);
189 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v expand0 /t REG_EXpand_sz /d \"dead%PATH%beef\" /f", &r
);
190 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
191 verify_reg(hkey
, "expand0", REG_EXPAND_SZ
, "dead%PATH%beef", 15, TODO_REG_SIZE
);
193 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v expand1 /t REG_EXpand_sz /d \"dead^%PATH^%beef\" /f", &r
);
194 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
195 verify_reg(hkey
, "expand1", REG_EXPAND_SZ
, "dead^%PATH^%beef", 17, TODO_REG_SIZE
);
197 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_EXPAND_SZ /v expand2 /f", &r
);
198 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
199 verify_reg(hkey
, "expand2", REG_EXPAND_SZ
, "", 1, TODO_REG_SIZE
);
201 run_reg_exe("reg add HKEY_CURRENT_USER\\" KEY_BASE
" /ve /t REG_EXPAND_SZ /d WineTEST /f", &r
);
202 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
203 verify_reg(hkey
, "", REG_EXPAND_SZ
, "WineTEST", 9, TODO_REG_SIZE
);
205 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_EXPAND_SZ /v expand3 /f /d \"\"", &r
);
206 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
207 verify_reg(hkey
, "expand3", REG_EXPAND_SZ
, "", 1, TODO_REG_SIZE
);
210 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_BINARY /v bin0 /f", &r
);
211 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
212 verify_reg(hkey
, "bin0", REG_BINARY
, buffer
, 0, 0);
214 run_reg_exe("reg add HKEY_CURRENT_USER\\" KEY_BASE
" /ve /t REG_BINARY /d deadbeef /f", &r
);
215 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
217 verify_reg(hkey
, "", REG_BINARY
, &dword
, sizeof(DWORD
), 0);
219 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_BINARY /v bin1 /f /d 0xDeAdBeEf", &r
);
220 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %u\n", r
);
221 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_BINARY /v bin2 /f /d x01", &r
);
222 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %u\n", r
);
223 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_BINARY /v bin3 /f /d 01x", &r
);
224 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %u\n", r
);
226 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_BINARY /v bin4 /f /d DeAdBeEf0DD", &r
);
227 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
228 /* Remaining nibble prefixed */
229 buffer
[0] = 0x0d; buffer
[1] = 0xea; buffer
[2] = 0xdb;
230 buffer
[3] = 0xee; buffer
[4] = 0xf0; buffer
[5] = 0xdd;
231 /* Remaining nibble suffixed on winXP */
232 buffer
[6] = 0xde; buffer
[7] = 0xad; buffer
[8] = 0xbe;
233 buffer
[9] = 0xef; buffer
[10] = 0x0d; buffer
[11] = 0xd0;
235 err
= RegQueryValueExA(hkey
, "bin4", NULL
, &type
, (void *) (buffer
+12), &size
);
236 ok(err
== ERROR_SUCCESS
, "RegQueryValueEx failed: got %d\n", err
);
237 ok(type
== REG_BINARY
, "got wrong type %u\n", type
);
238 ok(size
== 6, "got wrong size %u\n", size
);
239 ok(memcmp(buffer
, buffer
+12, 6) == 0 ||
240 broken(memcmp(buffer
+6, buffer
+12, 6) == 0 /* WinXP */), "got wrong data\n");
242 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_BINARY /v bin5 /d \"\" /f", &r
);
243 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
244 verify_reg(hkey
, "bin5", REG_BINARY
, buffer
, 0, 0);
247 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_DWORD /f /d 12345678", &r
);
248 ok(r
== REG_EXIT_SUCCESS
|| broken(r
== REG_EXIT_FAILURE
/* WinXP */),
249 "got exit code %d, expected 0\n", r
);
251 if (r
== REG_EXIT_SUCCESS
)
252 verify_reg(hkey
, "", REG_DWORD
, &dword
, sizeof(dword
), 0);
254 win_skip("broken reg.exe detected\n");
256 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v dword1 /t REG_DWORD /f", &r
);
257 todo_wine
ok(r
== REG_EXIT_FAILURE
|| broken(r
== REG_EXIT_SUCCESS
/* WinXP */),
258 "got exit code %d, expected 0\n", r
);
259 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v dword2 /t REG_DWORD /d zzz /f", &r
);
260 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %d, expected 1\n", r
);
261 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v dword3 /t REG_DWORD /d deadbeef /f", &r
);
262 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %d, expected 1\n", r
);
263 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v dword4 /t REG_DWORD /d 123xyz /f", &r
);
264 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %d, expected 1\n", r
);
266 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v dword5 /t reg_dword /d 12345678 /f", &r
);
267 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
269 verify_reg(hkey
, "dword5", REG_DWORD
, &dword
, sizeof(dword
), 0);
271 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v dword6 /t REG_DWORD /D 0123 /f", &r
);
272 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
273 size
= sizeof(dword
);
274 err
= RegQueryValueExA(hkey
, "dword6", NULL
, &type
, (LPBYTE
)&dword
, &size
);
275 ok(err
== ERROR_SUCCESS
, "RegQueryValueEx failed: got %d\n", err
);
276 ok(type
== REG_DWORD
, "got wrong type %d, expected %d\n", type
, REG_DWORD
);
277 ok(size
== sizeof(DWORD
), "got wrong size %d, expected %d\n", size
, (int)sizeof(DWORD
));
278 todo_wine
ok(dword
== 123 || broken(dword
== 0123 /* WinXP */),
279 "got wrong data %d, expected %d\n", dword
, 123);
281 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v dword7 /t reg_dword /d 0xabcdefg /f", &r
);
282 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %d, expected 1\n", r
);
284 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v dword8 /t REG_dword /d 0xdeadbeef /f", &r
);
285 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
287 verify_reg(hkey
, "dword8", REG_DWORD
, &dword
, sizeof(dword
),
288 (sizeof(long) > sizeof(DWORD
)) ? 0 : TODO_REG_DATA
);
290 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_DWORD /v dword9 /f /d -1", &r
);
291 todo_wine
ok(r
== REG_EXIT_FAILURE
|| broken(r
== REG_EXIT_SUCCESS
/* WinXP */), "got exit code %u\n", r
);
292 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_DWORD /v dword10 /f /d -0x1", &r
);
293 todo_wine
ok(r
== REG_EXIT_FAILURE
|| broken(r
== REG_EXIT_SUCCESS
/* WinXP */), "got exit code %u\n", r
);
295 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v dword8 /t REG_dword /d 0x01ffffffff /f", &r
);
296 todo_wine
ok(r
== REG_EXIT_FAILURE
|| broken(r
== REG_EXIT_SUCCESS
/* WinXP */), "got exit code %d\n", r
);
298 /* REG_DWORD_LITTLE_ENDIAN */
299 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v DWORD_LE /t REG_DWORD_LITTLE_ENDIAN /d 456 /f", &r
);
300 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
302 verify_reg(hkey
, "DWORD_LE", REG_DWORD_LITTLE_ENDIAN
, &dword
, sizeof(dword
), 0);
304 /* REG_DWORD_BIG_ENDIAN */
305 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v DWORD_BE /t REG_DWORD_BIG_ENDIAN /d 456 /f", &r
);
306 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
308 verify_reg(hkey
, "DWORD_BE", REG_DWORD_BIG_ENDIAN
, &dword
, sizeof(dword
), TODO_REG_SIZE
);
309 /* REG_DWORD_BIG_ENDIAN is broken in every version of windows. It behaves like
310 * an ordinary REG_DWORD - that is little endian. GG */
313 run_reg_exe("reg add HKCU\\" KEY_BASE
" /v multi0 /t REG_MULTI_SZ /d \"three\\0little\\0strings\" /f", &r
);
314 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
315 memcpy(buffer
, "three\0little\0strings\0", 22);
316 verify_reg(hkey
, "multi0", REG_MULTI_SZ
, buffer
, 22, TODO_REG_SIZE
);
318 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_MULTI_SZ /v multi1 /s \"#\" /d \"three#little#strings\" /f", &r
);
319 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
320 verify_reg(hkey
, "multi1", REG_MULTI_SZ
, buffer
, 22, TODO_REG_SIZE
);
322 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_MULTI_SZ /v multi2 /d \"\" /f", &r
);
323 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
324 verify_reg(hkey
, "multi2", REG_MULTI_SZ
, &buffer
[21], 1, TODO_REG_SIZE
);
326 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_MULTI_SZ /v multi3 /f", &r
);
327 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
328 verify_reg(hkey
, "multi3", REG_MULTI_SZ
, &buffer
[21], 1, TODO_REG_SIZE
);
330 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_MULTI_SZ /v multi4 /s \"#\" /d \"threelittlestrings\" /f", &r
);
331 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
332 verify_reg(hkey
, "multi4", REG_MULTI_SZ
, "threelittlestrings\0", 20, TODO_REG_SIZE
);
334 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_MULTI_SZ /v multi5 /s \"#randomgibberish\" /d \"three#little#strings\" /f", &r
);
335 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %u\n", r
);
336 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_MULTI_SZ /v multi6 /s \"\\0\" /d \"three\\0little\\0strings\" /f", &r
);
337 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %u\n", r
);
338 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_MULTI_SZ /v multi7 /s \"\" /d \"three#little#strings\" /f", &r
);
339 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %u\n", r
);
340 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_MULTI_SZ /v multi8 /s \"#\" /d \"##\" /f", &r
);
341 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %u\n", r
);
342 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_MULTI_SZ /v multi9 /s \"#\" /d \"two##strings\" /f", &r
);
343 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %u\n", r
);
344 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_MULTI_SZ /v multi10 /s \"#\" /d \"#a\" /f", &r
);
345 todo_wine
ok(r
== REG_EXIT_FAILURE
, "got exit code %u\n", r
);
347 run_reg_exe("reg add HKCU\\" KEY_BASE
" /t REG_MULTI_SZ /v multi11 /s \"#\" /d \"a#\" /f", &r
);
348 ok(r
== REG_EXIT_SUCCESS
, "got exit code %u\n", r
);
349 buffer
[0]='a'; buffer
[1]=0; buffer
[2]=0;
350 verify_reg(hkey
, "multi11", REG_MULTI_SZ
, buffer
, 3, TODO_REG_SIZE
);
354 err
= RegDeleteKeyA(HKEY_CURRENT_USER
, KEY_BASE
);
355 ok(err
== ERROR_SUCCESS
, "got %d\n", err
);
358 static void test_delete(void)
363 const DWORD deadbeef
= 0xdeadbeef;
365 run_reg_exe("reg delete", &r
);
366 ok(r
== REG_EXIT_FAILURE
, "got exit code %d, expected 1\n", r
);
368 err
= RegCreateKeyExA(HKEY_CURRENT_USER
, KEY_BASE
, 0, NULL
, 0, KEY_ALL_ACCESS
, NULL
, &hkey
, NULL
);
369 ok(err
== ERROR_SUCCESS
, "got %d\n", err
);
371 err
= RegSetValueExA(hkey
, "foo", 0, REG_DWORD
, (LPBYTE
)&deadbeef
, sizeof(deadbeef
));
372 ok(err
== ERROR_SUCCESS
, "got %d\n" ,err
);
374 err
= RegSetValueExA(hkey
, "bar", 0, REG_DWORD
, (LPBYTE
)&deadbeef
, sizeof(deadbeef
));
375 ok(err
== ERROR_SUCCESS
, "got %d\n" ,err
);
377 err
= RegSetValueExA(hkey
, "", 0, REG_DWORD
, (LPBYTE
)&deadbeef
, sizeof(deadbeef
));
378 ok(err
== ERROR_SUCCESS
, "got %d\n" ,err
);
380 err
= RegCreateKeyExA(hkey
, "subkey", 0, NULL
, 0, KEY_ALL_ACCESS
, NULL
, &hsubkey
, NULL
);
381 ok(err
== ERROR_SUCCESS
, "got %d\n" ,err
);
382 RegCloseKey(hsubkey
);
384 run_reg_exe("reg delete HKCU\\" KEY_BASE
" /v bar /f", &r
);
385 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
386 err
= RegQueryValueExA(hkey
, "bar", NULL
, NULL
, NULL
, NULL
);
387 ok(err
== ERROR_FILE_NOT_FOUND
, "got %d\n", err
);
389 run_reg_exe("reg delete HKCU\\" KEY_BASE
" /ve /f", &r
);
390 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
391 err
= RegQueryValueExA(hkey
, "", NULL
, NULL
, NULL
, NULL
);
392 todo_wine
ok(err
== ERROR_FILE_NOT_FOUND
, "got %d\n", err
);
394 run_reg_exe("reg delete HKCU\\" KEY_BASE
" /va /f", &r
);
395 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
396 err
= RegQueryValueExA(hkey
, "foo", NULL
, NULL
, NULL
, NULL
);
397 ok(err
== ERROR_FILE_NOT_FOUND
, "got %d\n", err
);
398 err
= RegOpenKeyExA(hkey
, "subkey", 0, KEY_READ
, &hsubkey
);
399 ok(err
== ERROR_SUCCESS
, "got %d\n", err
);
400 RegCloseKey(hsubkey
);
403 run_reg_exe("reg delete HKCU\\" KEY_BASE
" /f", &r
);
404 ok(r
== REG_EXIT_SUCCESS
, "got exit code %d, expected 0\n", r
);
405 err
= RegOpenKeyExA(HKEY_CURRENT_USER
, KEY_BASE
, 0, KEY_READ
, &hkey
);
406 ok(err
== ERROR_FILE_NOT_FOUND
, "got %d\n", err
);
408 run_reg_exe("reg delete HKCU\\" KEY_BASE
" /f", &r
);
409 ok(r
== REG_EXIT_FAILURE
, "got exit code %u\n", r
);
412 static void test_query(void)
415 run_reg_exe("reg Query", &r
);
416 ok(r
== REG_EXIT_FAILURE
, "got exit code %d, expected 1\n", r
);
422 if (!run_reg_exe("reg.exe /?", &r
)) {
423 win_skip("reg.exe not available, skipping reg.exe tests\n");
427 if (!winetest_interactive
)
428 skip("ROSTESTS-200: Skipping test_add because of exceptions in Cm.\n");