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 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) 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) 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 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 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 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