1 /*
2 * Copyright 2014 Akihiro Sagawa
3 * Copyright 2016-2018, 2021 Hugh McMaster
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18 */
19
20 #include "reg_test.h"
21
read_from_pipe(HANDLE child_proc_stdout,BYTE * buf,DWORD buf_size)22 static void read_from_pipe(HANDLE child_proc_stdout, BYTE *buf, DWORD buf_size)
23 {
24 DWORD read, len = 0;
25 BOOL ret;
26
27 while (1)
28 {
29 ret = ReadFile(child_proc_stdout, buf + len, buf_size - len, &read, NULL);
30 if (!ret || !read) break;
31
32 len += read;
33 }
34
35 buf[len] = 0;
36 }
37
38 #define read_reg_output(c,b,s,r) read_reg_output_(__FILE__,__LINE__,c,b,s,r)
read_reg_output_(const char * file,unsigned line,const char * cmd,BYTE * buf,DWORD buf_size,DWORD * rc)39 static BOOL read_reg_output_(const char *file, unsigned line, const char *cmd,
40 BYTE *buf, DWORD buf_size, DWORD *rc)
41 {
42 SECURITY_ATTRIBUTES sa;
43 HANDLE pipe_stdout_rd, pipe_stdout_wr;
44 STARTUPINFOA si = {0};
45 PROCESS_INFORMATION pi;
46 char cmdline[256];
47 BOOL bret;
48 DWORD ret;
49
50 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
51 sa.bInheritHandle = TRUE;
52 sa.lpSecurityDescriptor = NULL;
53
54 if (!CreatePipe(&pipe_stdout_rd, &pipe_stdout_wr, &sa, 0))
55 return FALSE;
56
57 if (!SetHandleInformation(pipe_stdout_rd, HANDLE_FLAG_INHERIT, 0))
58 return FALSE;
59
60 si.cb = sizeof(si);
61 si.dwFlags = STARTF_USESTDHANDLES;
62 si.hStdInput = INVALID_HANDLE_VALUE;
63 si.hStdOutput = pipe_stdout_wr;
64 si.hStdError = INVALID_HANDLE_VALUE;
65
66 strcpy(cmdline, cmd);
67 if (!CreateProcessA(NULL, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
68 return FALSE;
69
70 CloseHandle(pipe_stdout_wr);
71
72 read_from_pipe(pipe_stdout_rd, buf, buf_size);
73
74 ret = WaitForSingleObject(pi.hProcess, 10000);
75 if (ret == WAIT_TIMEOUT)
76 TerminateProcess(pi.hProcess, 1);
77
78 bret = GetExitCodeProcess(pi.hProcess, rc);
79 lok(bret, "GetExitCodeProcess failed: %d\n", GetLastError());
80
81 CloseHandle(pipe_stdout_rd);
82 CloseHandle(pi.hThread);
83 CloseHandle(pi.hProcess);
84 return bret;
85 }
86
87 #define compare_query(b,e,c,todo) compare_query_(__FILE__,__LINE__,b,e,c,todo)
compare_query_(const char * file,unsigned line,const BYTE * buf,const char * expected,BOOL cmp_len,DWORD todo)88 static void compare_query_(const char *file, unsigned line, const BYTE *buf,
89 const char *expected, BOOL cmp_len, DWORD todo)
90 {
91 const char *str = (const char *)buf;
92 const char *err = "query output does not match expected output";
93
94 if (!cmp_len)
95 {
96 todo_wine_if (todo & TODO_REG_COMPARE)
97 lok(!strcmp(str, expected), "%s\n", err);
98 }
99 else
100 {
101 todo_wine_if (todo & TODO_REG_COMPARE)
102 lok(!strncmp(str, expected, strlen(expected)), "%s\n", err);
103 }
104 }
105
106 /* Unit tests */
107
test_command_syntax(void)108 static void test_command_syntax(void)
109 {
110 DWORD r;
111
112 run_reg_exe("reg query", &r);
113 ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
114
115 run_reg_exe("reg query /?", &r);
116 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
117
118 run_reg_exe("reg query /h", &r);
119 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
120
121 run_reg_exe("reg query -H", &r);
122 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
123
124 run_reg_exe("reg query HKCU\\" KEY_BASE " /v", &r);
125 ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
126
127 run_reg_exe("reg query HKCU\\" KEY_BASE " /v Test1 /v Test2", &r);
128 ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
129
130 run_reg_exe("reg query HKCU\\" KEY_BASE " /v Test1 /ve", &r);
131 ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
132
133 run_reg_exe("reg query HKCU\\" KEY_BASE " /s /s", &r);
134 ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
135
136 /* Test registry view */
137 run_reg_exe("reg query HKCU\\" KEY_BASE " /reg:32 /reg:32", &r);
138 ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
139
140 run_reg_exe("reg query HKCU\\" KEY_BASE " /reg:32 /reg:64", &r);
141 ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
142
143 run_reg_exe("reg query HKCU\\" KEY_BASE " /reg:64 /reg:64", &r);
144 ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
145 }
146
test_query(void)147 static void test_query(void)
148 {
149 const char *test1 = "\r\n"
150 "HKEY_CURRENT_USER\\" KEY_BASE "\r\n"
151 " Test1 REG_SZ Hello, World\r\n"
152 " Test2 REG_DWORD 0x123\r\n\r\n";
153
154 const char *test2 = "\r\n"
155 "HKEY_CURRENT_USER\\" KEY_BASE "\r\n"
156 " Test1 REG_SZ Hello, World\r\n\r\n";
157
158 const char *test3 = "\r\n"
159 "HKEY_CURRENT_USER\\" KEY_BASE "\r\n"
160 " Test1 REG_SZ Hello, World\r\n"
161 " Test2 REG_DWORD 0x123\r\n"
162 " Wine REG_SZ First instance\r\n\r\n"
163 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey\r\n";
164
165 const char *test4 = "\r\n"
166 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey\r\n"
167 " Test3 REG_SZ Some string data\r\n"
168 " Test4 REG_DWORD 0xabc\r\n\r\n";
169
170 const char *test5 = "\r\n"
171 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey\r\n"
172 " Test4 REG_DWORD 0xabc\r\n\r\n";
173
174 const char *test6 = "\r\n"
175 "HKEY_CURRENT_USER\\" KEY_BASE "\r\n"
176 " Test1 REG_SZ Hello, World\r\n"
177 " Test2 REG_DWORD 0x123\r\n"
178 " Wine REG_SZ First instance\r\n\r\n"
179 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey\r\n"
180 " Test3 REG_SZ Some string data\r\n"
181 " Test4 REG_DWORD 0xabc\r\n"
182 " Wine REG_SZ Second instance\r\n\r\n";
183
184 const char *test7 = "\r\n"
185 "HKEY_CURRENT_USER\\" KEY_BASE "\r\n"
186 " Wine REG_SZ First instance\r\n\r\n"
187 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey\r\n"
188 " Wine REG_SZ Second instance\r\n\r\n";
189
190 const char *test8a = "\r\n"
191 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey1\r\n"
192 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey2\r\n"
193 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey3\r\n"
194 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey4\r\n";
195
196 const char *test8b = "\r\n"
197 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey1\r\n\r\n"
198 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey2\r\n\r\n"
199 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey3\r\n\r\n"
200 "HKEY_CURRENT_USER\\" KEY_BASE "\\subkey4\r\n\r\n";
201
202 DWORD r, dword = 0x123;
203 HKEY hkey, subkey;
204 BYTE buf[512];
205
206 delete_tree(HKEY_CURRENT_USER, KEY_BASE, 0);
207
208 /* Key not present */
209 run_reg_exe("reg query HKCU\\" KEY_BASE, &r);
210 ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
211
212 /* Create a test key */
213 add_key(HKEY_CURRENT_USER, KEY_BASE, 0, &hkey);
214 add_value(hkey, "Test1", REG_SZ, "Hello, World", 13);
215 add_value(hkey, "Test2", REG_DWORD, &dword, sizeof(dword));
216
217 run_reg_exe("reg query HKCU\\" KEY_BASE " /v Missing", &r);
218 ok(r == REG_EXIT_FAILURE, "got exit code %d, expected 1\n", r);
219
220 read_reg_output("reg query HKCU\\" KEY_BASE, buf, sizeof(buf), &r);
221 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
222 compare_query(buf, test1, FALSE, 0);
223
224 run_reg_exe("reg query HKCU\\" KEY_BASE " /ve", &r);
225 ok(r == REG_EXIT_SUCCESS || broken(r == REG_EXIT_FAILURE /* WinXP */),
226 "got exit code %d, expected 0\n", r);
227
228 read_reg_output("reg query HKCU\\" KEY_BASE " /v Test1", buf, sizeof(buf), &r);
229 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
230 compare_query(buf, test2, FALSE, 0);
231
232 run_reg_exe("reg query HKCU\\" KEY_BASE " /v Test2", &r);
233 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
234
235 add_value(hkey, "Wine", REG_SZ, "First instance", 15);
236
237 /* Create a test subkey */
238 add_key(hkey, "subkey", 0, &subkey);
239
240 read_reg_output("reg query HKCU\\" KEY_BASE, buf, sizeof(buf), &r);
241 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
242 compare_query(buf, test3, FALSE, 0);
243
244 add_value(subkey, "Test3", REG_SZ, "Some string data", 16);
245 dword = 0xabc;
246 add_value(subkey, "Test4", REG_DWORD, &dword, sizeof(dword));
247
248 read_reg_output("reg query HKCU\\" KEY_BASE "\\subkey", buf, sizeof(buf), &r);
249 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
250 compare_query(buf, test4, FALSE, 0);
251
252 run_reg_exe("reg query HKCU\\" KEY_BASE "\\subkey /v Test3", &r);
253 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
254
255 read_reg_output("reg query HKCU\\" KEY_BASE "\\subkey /v Test4", buf, sizeof(buf), &r);
256 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
257 compare_query(buf, test5, FALSE, 0);
258
259 add_value(subkey, "Wine", REG_SZ, "Second instance", 16);
260
261 /* Test recursion */
262 read_reg_output("reg query HKCU\\" KEY_BASE " /s", buf, sizeof(buf), &r);
263 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
264 compare_query(buf, test6, FALSE, 0);
265
266 read_reg_output("reg query HKCU\\" KEY_BASE "\\ /s", buf, sizeof(buf), &r);
267 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
268 compare_query(buf, test6, FALSE, 0);
269
270 read_reg_output("reg query HKCU\\" KEY_BASE " /v Wine /s", buf, sizeof(buf), &r);
271 ok(r == REG_EXIT_SUCCESS || r == REG_EXIT_FAILURE /* WinXP */,
272 "got exit code %d, expected 0\n", r);
273 compare_query(buf, test7, TRUE, 0);
274
275 add_value(hkey, NULL, REG_SZ, "Empty", 6);
276 add_value(subkey, NULL, REG_SZ, "Empty", 6);
277 close_key(subkey);
278 close_key(hkey);
279
280 run_reg_exe("reg query HKCU\\" KEY_BASE "\\subkey /ve", &r);
281 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
282
283 run_reg_exe("reg query HKCU\\" KEY_BASE " /ve /s", &r);
284 ok(r == REG_EXIT_SUCCESS || r == REG_EXIT_FAILURE /* WinXP */,
285 "got exit code %d, expected 0\n", r);
286
287 delete_tree(HKEY_CURRENT_USER, KEY_BASE, 0);
288
289 /* Subkeys only */
290 add_key(HKEY_CURRENT_USER, KEY_BASE, 0, &hkey);
291 add_key(hkey, "subkey1", 0, NULL);
292 add_key(hkey, "subkey2", 0, NULL);
293 add_key(hkey, "subkey3", 0, NULL);
294 add_key(hkey, "subkey4", 0, NULL);
295 close_key(hkey);
296
297 read_reg_output("reg query HKCU\\" KEY_BASE, buf, sizeof(buf), &r);
298 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
299 compare_query(buf, test8a, FALSE, 0);
300
301 read_reg_output("reg query HKCU\\" KEY_BASE " /s", buf, sizeof(buf), &r);
302 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
303 compare_query(buf, test8b, FALSE, 0);
304
305 delete_tree(HKEY_CURRENT_USER, KEY_BASE, 0);
306 }
307
308 #if 0
309 static const char *test9a = "\r\n"
310 "HKEY_LOCAL_MACHINE\\" KEY_BASE "\r\n"
311 " Test1 REG_SZ Hello, World\r\n"
312 " Test2 REG_DWORD 0x123\r\n"
313 " Wine REG_SZ First instance\r\n\r\n"
314 "HKEY_LOCAL_MACHINE\\" KEY_BASE "\\subkey\r\n";
315
316 static const char *test9b = "\r\n"
317 "HKEY_LOCAL_MACHINE\\" KEY_BASE "\r\n"
318 " Test1 REG_SZ Hello, World\r\n"
319 " Test2 REG_DWORD 0x123\r\n"
320 " Wine REG_SZ First instance\r\n\r\n"
321 "HKEY_LOCAL_MACHINE\\" KEY_BASE "\\subkey\r\n"
322 " Test3 REG_SZ Some string data\r\n"
323 " Test4 REG_DWORD 0xabc\r\n"
324 " Wine REG_SZ Second instance\r\n\r\n";
325
326 static const char *test9c = "\r\n"
327 "HKEY_LOCAL_MACHINE\\" KEY_BASE "\r\n"
328 " Wine REG_SZ First instance\r\n\r\n"
329 "HKEY_LOCAL_MACHINE\\" KEY_BASE "\\subkey\r\n"
330 " Wine REG_SZ Second instance\r\n\r\n";
331
332 static void create_test_key(REGSAM sam)
333 {
334 HKEY hkey, subkey;
335 DWORD dword;
336
337 add_key(HKEY_LOCAL_MACHINE, KEY_BASE, sam, &hkey);
338 add_value(hkey, "Test1", REG_SZ, "Hello, World", 13);
339 dword = 0x123;
340 add_value(hkey, "Test2", REG_DWORD, &dword, sizeof(dword));
341 add_value(hkey, "Wine", REG_SZ, "First instance", 15);
342
343 add_key(hkey, "subkey", sam, &subkey);
344 add_value(subkey, "Test3", REG_SZ, "Some string data", 16);
345 dword = 0xabc;
346 add_value(subkey, "Test4", REG_DWORD, &dword, sizeof(dword));
347 add_value(subkey, "Wine", REG_SZ, "Second instance", 16);
348
349 close_key(subkey);
350 close_key(hkey);
351 }
352
353 static void test_registry_view_win32(void)
354 {
355 BOOL is_wow64, is_win32;
356 DWORD r;
357 BYTE buf[512];
358
359 IsWow64Process(GetCurrentProcess(), &is_wow64);
360 is_win32 = !is_wow64 && (sizeof(void *) == sizeof(int));
361
362 if (!is_win32) return;
363
364 delete_tree(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY);
365
366 /* Try querying the 32-bit registry view (32-bit Windows) */
367 create_test_key(KEY_WOW64_32KEY);
368
369 read_reg_output("reg query HKLM\\" KEY_BASE " /reg:32", buf, sizeof(buf), &r);
370 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
371 compare_query(buf, test9a, FALSE, 0);
372
373 read_reg_output("reg query HKLM\\" KEY_BASE " /s /reg:32", buf, sizeof(buf), &r);
374 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
375 compare_query(buf, test9b, FALSE, 0);
376
377 read_reg_output("reg query HKLM\\" KEY_BASE " /v Wine /s /reg:32", buf, sizeof(buf), &r);
378 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
379 compare_query(buf, test9c, TRUE, 0);
380
381 delete_tree(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY);
382
383 /* Try querying the 64-bit registry view, which doesn't exist on 32-bit Windows */
384 create_test_key(KEY_WOW64_64KEY);
385
386 read_reg_output("reg query HKLM\\" KEY_BASE " /reg:64", buf, sizeof(buf), &r);
387 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
388 compare_query(buf, test9a, FALSE, 0);
389
390 read_reg_output("reg query HKLM\\" KEY_BASE " /s /reg:64", buf, sizeof(buf), &r);
391 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
392 compare_query(buf, test9b, FALSE, 0);
393
394 read_reg_output("reg query HKLM\\" KEY_BASE " /v Wine /s /reg:64", buf, sizeof(buf), &r);
395 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
396 compare_query(buf, test9c, TRUE, 0);
397
398 delete_tree(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY);
399 }
400
401 static void test_registry_view_win64(void)
402 {
403 BOOL is_wow64, is_win64;
404 DWORD r;
405 BYTE buf[512];
406
407 IsWow64Process(GetCurrentProcess(), &is_wow64);
408 is_win64 = !is_wow64 && (sizeof(void *) > sizeof(int));
409
410 if (!is_win64) return;
411
412 delete_tree(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY);
413
414 /* Try querying the 32-bit registry view (64-bit Windows) */
415 create_test_key(KEY_WOW64_32KEY);
416
417 read_reg_output("reg query HKLM\\" KEY_BASE " /reg:32", buf, sizeof(buf), &r);
418 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
419 compare_query(buf, test9a, FALSE, 0);
420
421 read_reg_output("reg query HKLM\\" KEY_BASE " /s /reg:32", buf, sizeof(buf), &r);
422 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
423 compare_query(buf, test9b, FALSE, 0);
424
425 read_reg_output("reg query HKLM\\" KEY_BASE " /v Wine /s /reg:32", buf, sizeof(buf), &r);
426 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
427 compare_query(buf, test9c, TRUE, 0);
428
429 delete_tree(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY);
430 delete_tree(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY);
431
432 /* Try querying the 64-bit registry view (64-bit Windows) */
433 create_test_key(KEY_WOW64_64KEY);
434
435 read_reg_output("reg query HKLM\\" KEY_BASE " /reg:64", buf, sizeof(buf), &r);
436 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
437 compare_query(buf, test9a, FALSE, 0);
438
439 read_reg_output("reg query HKLM\\" KEY_BASE " /s /reg:64", buf, sizeof(buf), &r);
440 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
441 compare_query(buf, test9b, FALSE, 0);
442
443 read_reg_output("reg query HKLM\\" KEY_BASE " /v Wine /s /reg:64", buf, sizeof(buf), &r);
444 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
445 compare_query(buf, test9c, TRUE, 0);
446
447 delete_tree(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY);
448 }
449
450 static void test_registry_view_wow64(void)
451 {
452 BOOL is_wow64;
453 DWORD r;
454 BYTE buf[512];
455
456 IsWow64Process(GetCurrentProcess(), &is_wow64);
457
458 if (!is_wow64) return;
459
460 delete_tree(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY);
461
462 /* Try querying the 32-bit registry view (WOW64) */
463 create_test_key(KEY_WOW64_32KEY);
464
465 read_reg_output("reg query HKLM\\" KEY_BASE " /reg:32", buf, sizeof(buf), &r);
466 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
467 compare_query(buf, test9a, FALSE, 0);
468
469 read_reg_output("reg query HKLM\\" KEY_BASE " /s /reg:32", buf, sizeof(buf), &r);
470 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
471 compare_query(buf, test9b, FALSE, 0);
472
473 read_reg_output("reg query HKLM\\" KEY_BASE " /v Wine /s /reg:32", buf, sizeof(buf), &r);
474 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
475 compare_query(buf, test9c, TRUE, 0);
476
477 delete_tree(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_32KEY);
478 delete_tree(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY);
479
480 /* Try querying the 64-bit registry view (WOW64) */
481 create_test_key(KEY_WOW64_64KEY);
482
483 read_reg_output("reg query HKLM\\" KEY_BASE " /reg:64", buf, sizeof(buf), &r);
484 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
485 compare_query(buf, test9a, FALSE, 0);
486
487 read_reg_output("reg query HKLM\\" KEY_BASE " /s /reg:64", buf, sizeof(buf), &r);
488 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
489 compare_query(buf, test9b, FALSE, 0);
490
491 read_reg_output("reg query HKLM\\" KEY_BASE " /v Wine /s /reg:64", buf, sizeof(buf), &r);
492 ok(r == REG_EXIT_SUCCESS, "got exit code %d, expected 0\n", r);
493 compare_query(buf, test9c, TRUE, 0);
494
495 delete_tree(HKEY_LOCAL_MACHINE, KEY_BASE, KEY_WOW64_64KEY);
496 }
497 #endif
498
START_TEST(query)499 START_TEST(query)
500 {
501 DWORD r;
502
503 if (!run_reg_exe("reg.exe /?", &r)) {
504 win_skip("reg.exe not available, skipping 'query' tests\n");
505 return;
506 }
507
508 test_command_syntax();
509 test_query();
510
511 /* Check if reg.exe is running with elevated privileges */
512 if (!is_elevated_process())
513 {
514 win_skip("reg.exe is not running with elevated privileges; "
515 "skipping registry view tests\n");
516 return;
517 }
518
519 #if 0
520 test_registry_view_win32();
521 test_registry_view_win64();
522 test_registry_view_wow64();
523 #endif
524
525 }
526