OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome_elf/nt_registry/nt_registry.h" | 5 #include "chrome_elf/nt_registry/nt_registry.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 #include <rpc.h> | 8 #include <rpc.h> |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 | 10 |
(...skipping 13 matching lines...) Expand all Loading... |
24 // https://cs.chromium.org/chromium/src/build/toolchain/win/BUILD.gn?sq%3Dpackag
e:chromium&l=314 | 24 // https://cs.chromium.org/chromium/src/build/toolchain/win/BUILD.gn?sq%3Dpackag
e:chromium&l=314 |
25 //------------------------------------------------------------------------------ | 25 //------------------------------------------------------------------------------ |
26 | 26 |
27 // Utility function for the WOW64 redirection test suites. | 27 // Utility function for the WOW64 redirection test suites. |
28 // Note: Testing redirection through ADVAPI32 here as well, to get notice if | 28 // Note: Testing redirection through ADVAPI32 here as well, to get notice if |
29 // expected behaviour changes! | 29 // expected behaviour changes! |
30 // If |redirected_path| == nullptr, no redirection is expected in any case. | 30 // If |redirected_path| == nullptr, no redirection is expected in any case. |
31 void DoRedirectTest(nt::ROOT_KEY nt_root_key, | 31 void DoRedirectTest(nt::ROOT_KEY nt_root_key, |
32 const wchar_t* path, | 32 const wchar_t* path, |
33 const wchar_t* redirected_path OPTIONAL) { | 33 const wchar_t* redirected_path OPTIONAL) { |
34 HANDLE handle = INVALID_HANDLE_VALUE; | |
35 HKEY key_handle = nullptr; | 34 HKEY key_handle = nullptr; |
36 constexpr ACCESS_MASK kAccess = KEY_WRITE | DELETE; | 35 constexpr ACCESS_MASK kAccess = KEY_WRITE | DELETE; |
37 const HKEY root_key = | 36 const HKEY root_key = |
38 (nt_root_key == nt::HKCU) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE; | 37 (nt_root_key == nt::HKCU) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE; |
39 | 38 |
40 // Make sure clean before starting. | 39 // Make sure clean before starting. |
41 nt::DeleteRegKey(nt_root_key, nt::NONE, path); | 40 nt::DeleteRegKey(nt_root_key, nt::NONE, path); |
42 if (redirected_path) | 41 if (redirected_path) |
43 nt::DeleteRegKey(nt_root_key, nt::NONE, redirected_path); | 42 nt::DeleteRegKey(nt_root_key, nt::NONE, redirected_path); |
44 | 43 |
45 //---------------------------------------------------------------------------- | 44 //---------------------------------------------------------------------------- |
46 // No redirection through ADVAPI32 on straight x86 or x64. | 45 // No redirection through ADVAPI32 on straight x86 or x64. |
47 ASSERT_EQ(ERROR_SUCCESS, | 46 ASSERT_EQ(ERROR_SUCCESS, |
48 RegCreateKeyExW(root_key, path, 0, nullptr, REG_OPTION_NON_VOLATILE, | 47 RegCreateKeyExW(root_key, path, 0, nullptr, REG_OPTION_NON_VOLATILE, |
49 kAccess, nullptr, &key_handle, nullptr)); | 48 kAccess, nullptr, &key_handle, nullptr)); |
50 ASSERT_EQ(ERROR_SUCCESS, RegCloseKey(key_handle)); | 49 ASSERT_EQ(ERROR_SUCCESS, RegCloseKey(key_handle)); |
51 ASSERT_TRUE(nt::OpenRegKey(nt_root_key, path, kAccess, &handle, nullptr)); | 50 { |
52 ASSERT_TRUE(nt::DeleteRegKey(handle)); | 51 nt::ScopedHANDLE handle( |
53 nt::CloseRegKey(handle); | 52 nt::OpenRegKey(nt_root_key, path, kAccess, nullptr)); |
| 53 ASSERT_TRUE(handle.is_valid()); |
| 54 ASSERT_TRUE(nt::DeleteRegKey(handle.get())); |
| 55 } |
54 | 56 |
55 #ifdef _WIN64 | 57 #ifdef _WIN64 |
56 //---------------------------------------------------------------------------- | 58 //---------------------------------------------------------------------------- |
57 // Try forcing WOW64 redirection on x64 through ADVAPI32. | 59 // Try forcing WOW64 redirection on x64 through ADVAPI32. |
58 ASSERT_EQ(ERROR_SUCCESS, | 60 ASSERT_EQ(ERROR_SUCCESS, |
59 RegCreateKeyExW(root_key, path, 0, nullptr, REG_OPTION_NON_VOLATILE, | 61 RegCreateKeyExW(root_key, path, 0, nullptr, REG_OPTION_NON_VOLATILE, |
60 kAccess | KEY_WOW64_32KEY, nullptr, &key_handle, | 62 kAccess | KEY_WOW64_32KEY, nullptr, &key_handle, |
61 nullptr)); | 63 nullptr)); |
62 ASSERT_EQ(ERROR_SUCCESS, RegCloseKey(key_handle)); | 64 ASSERT_EQ(ERROR_SUCCESS, RegCloseKey(key_handle)); |
63 // Check path: | 65 // Check path: |
64 if (nt::OpenRegKey(nt_root_key, path, kAccess, &handle, nullptr)) { | 66 { |
65 if (redirected_path) | 67 nt::ScopedHANDLE handle( |
| 68 nt::OpenRegKey(nt_root_key, path, kAccess, nullptr)); |
| 69 if (handle.is_valid()) { |
| 70 if (redirected_path) |
| 71 ADD_FAILURE(); |
| 72 ASSERT_TRUE(nt::DeleteRegKey(handle.get())); |
| 73 } else if (!redirected_path) { |
| 74 // Should have succeeded. |
66 ADD_FAILURE(); | 75 ADD_FAILURE(); |
67 ASSERT_TRUE(nt::DeleteRegKey(handle)); | 76 } |
68 nt::CloseRegKey(handle); | |
69 } else if (!redirected_path) { | |
70 // Should have succeeded. | |
71 ADD_FAILURE(); | |
72 } | 77 } |
73 if (redirected_path) { | 78 if (redirected_path) { |
74 // Check redirected path: | 79 // Check redirected path: |
75 if (nt::OpenRegKey(nt_root_key, redirected_path, kAccess, &handle, | 80 nt::ScopedHANDLE handle( |
76 nullptr)) { | 81 nt::OpenRegKey(nt_root_key, redirected_path, kAccess, nullptr)); |
| 82 if (handle.is_valid()) { |
77 if (!redirected_path) | 83 if (!redirected_path) |
78 ADD_FAILURE(); | 84 ADD_FAILURE(); |
79 ASSERT_TRUE(nt::DeleteRegKey(handle)); | 85 ASSERT_TRUE(nt::DeleteRegKey(handle.get())); |
80 nt::CloseRegKey(handle); | |
81 } else { | 86 } else { |
82 // Should have succeeded. | 87 // Should have succeeded. |
83 ADD_FAILURE(); | 88 ADD_FAILURE(); |
84 } | 89 } |
85 } | 90 } |
86 | 91 |
87 //---------------------------------------------------------------------------- | 92 //---------------------------------------------------------------------------- |
88 // Try forcing WOW64 redirection on x64 through NTDLL. | 93 // Try forcing WOW64 redirection on x64 through NTDLL. |
89 ASSERT_TRUE( | 94 ASSERT_TRUE(nt::CreateRegKey(nt_root_key, path, kAccess | KEY_WOW64_32KEY) |
90 nt::CreateRegKey(nt_root_key, path, kAccess | KEY_WOW64_32KEY, nullptr)); | 95 .is_valid()); |
91 // Check path: | 96 // Check path: |
92 if (nt::OpenRegKey(nt_root_key, path, kAccess, &handle, nullptr)) { | 97 { |
93 if (redirected_path) | 98 nt::ScopedHANDLE handle( |
| 99 nt::OpenRegKey(nt_root_key, path, kAccess, nullptr)); |
| 100 if (handle.is_valid()) { |
| 101 if (redirected_path) |
| 102 ADD_FAILURE(); |
| 103 ASSERT_TRUE(nt::DeleteRegKey(handle.get())); |
| 104 } else if (!redirected_path) { |
| 105 // Should have succeeded. |
94 ADD_FAILURE(); | 106 ADD_FAILURE(); |
95 ASSERT_TRUE(nt::DeleteRegKey(handle)); | 107 } |
96 nt::CloseRegKey(handle); | |
97 } else if (!redirected_path) { | |
98 // Should have succeeded. | |
99 ADD_FAILURE(); | |
100 } | 108 } |
101 if (redirected_path) { | 109 if (redirected_path) { |
102 // Check redirected path: | 110 // Check redirected path: |
103 if (nt::OpenRegKey(nt_root_key, redirected_path, kAccess, &handle, | 111 nt::ScopedHANDLE handle( |
104 nullptr)) { | 112 nt::OpenRegKey(nt_root_key, redirected_path, kAccess, nullptr)); |
| 113 if (handle.is_valid()) { |
105 if (!redirected_path) | 114 if (!redirected_path) |
106 ADD_FAILURE(); | 115 ADD_FAILURE(); |
107 ASSERT_TRUE(nt::DeleteRegKey(handle)); | 116 ASSERT_TRUE(nt::DeleteRegKey(handle.get())); |
108 nt::CloseRegKey(handle); | |
109 } else { | 117 } else { |
110 // Should have succeeded. | 118 // Should have succeeded. |
111 ADD_FAILURE(); | 119 ADD_FAILURE(); |
112 } | 120 } |
113 } | 121 } |
114 #endif // _WIN64 | 122 #endif // _WIN64 |
115 } | 123 } |
116 | 124 |
117 // These test reg paths match |kClassesSubtree| in nt_registry.cc. | 125 // These test reg paths match |kClassesSubtree| in nt_registry.cc. |
118 constexpr const wchar_t* kClassesRedirects[] = { | 126 constexpr const wchar_t* kClassesRedirects[] = { |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
308 | 316 |
309 private: | 317 private: |
310 registry_util::RegistryOverrideManager override_manager_; | 318 registry_util::RegistryOverrideManager override_manager_; |
311 }; | 319 }; |
312 | 320 |
313 //------------------------------------------------------------------------------ | 321 //------------------------------------------------------------------------------ |
314 // NT registry API tests | 322 // NT registry API tests |
315 //------------------------------------------------------------------------------ | 323 //------------------------------------------------------------------------------ |
316 | 324 |
317 TEST_F(NtRegistryTest, API_DWORD) { | 325 TEST_F(NtRegistryTest, API_DWORD) { |
318 HANDLE key_handle; | |
319 const wchar_t* dword_val_name = L"DwordTestValue"; | 326 const wchar_t* dword_val_name = L"DwordTestValue"; |
320 DWORD dword_val = 1234; | 327 DWORD dword_val = 1234; |
321 | 328 |
322 // Create a subkey to play under. | 329 // Create a subkey to play under. |
323 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\dword", KEY_ALL_ACCESS, | 330 nt::ScopedHANDLE key_handle( |
324 &key_handle)); | 331 nt::CreateRegKey(nt::HKCU, L"NTRegistry\\dword", KEY_ALL_ACCESS)); |
325 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); | 332 ASSERT_TRUE(key_handle.is_valid()); |
326 ASSERT_NE(key_handle, nullptr); | 333 ASSERT_NE(key_handle.get(), nullptr); |
327 | 334 |
328 DWORD get_dword = 0; | 335 DWORD get_dword = 0; |
329 EXPECT_FALSE(nt::QueryRegValueDWORD(key_handle, dword_val_name, &get_dword)); | 336 EXPECT_FALSE( |
| 337 nt::QueryRegValueDWORD(key_handle.get(), dword_val_name, &get_dword)); |
330 | 338 |
331 // Set | 339 // Set |
332 EXPECT_TRUE(nt::SetRegValueDWORD(key_handle, dword_val_name, dword_val)); | 340 EXPECT_TRUE( |
| 341 nt::SetRegValueDWORD(key_handle.get(), dword_val_name, dword_val)); |
333 | 342 |
334 // Get | 343 // Get |
335 EXPECT_TRUE(nt::QueryRegValueDWORD(key_handle, dword_val_name, &get_dword)); | 344 EXPECT_TRUE( |
| 345 nt::QueryRegValueDWORD(key_handle.get(), dword_val_name, &get_dword)); |
336 EXPECT_TRUE(get_dword == dword_val); | 346 EXPECT_TRUE(get_dword == dword_val); |
337 | 347 |
338 // Clean up | 348 // Clean up |
339 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); | 349 EXPECT_TRUE(nt::DeleteRegKey(key_handle.get())); |
340 nt::CloseRegKey(key_handle); | |
341 } | 350 } |
342 | 351 |
343 TEST_F(NtRegistryTest, API_SZ) { | 352 TEST_F(NtRegistryTest, API_SZ) { |
344 HANDLE key_handle; | |
345 const wchar_t* sz_val_name = L"SzTestValue"; | 353 const wchar_t* sz_val_name = L"SzTestValue"; |
346 std::wstring sz_val = L"blah de blah de blahhhhh."; | 354 std::wstring sz_val = L"blah de blah de blahhhhh."; |
347 const wchar_t* sz_val_name2 = L"SzTestValueEmpty"; | 355 const wchar_t* sz_val_name2 = L"SzTestValueEmpty"; |
348 std::wstring sz_val2 = L""; | 356 std::wstring sz_val2 = L""; |
349 | 357 |
350 // Create a subkey to play under. | 358 // Create a subkey to play under. |
351 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\sz", KEY_ALL_ACCESS, | 359 nt::ScopedHANDLE key_handle( |
352 &key_handle)); | 360 nt::CreateRegKey(nt::HKCU, L"NTRegistry\\sz", KEY_ALL_ACCESS)); |
353 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); | 361 ASSERT_TRUE(key_handle.is_valid()); |
354 ASSERT_NE(key_handle, nullptr); | 362 ASSERT_NE(key_handle.get(), nullptr); |
355 | 363 |
356 std::wstring get_sz; | 364 std::wstring get_sz; |
357 EXPECT_FALSE(nt::QueryRegValueSZ(key_handle, sz_val_name, &get_sz)); | 365 EXPECT_FALSE(nt::QueryRegValueSZ(key_handle.get(), sz_val_name, &get_sz)); |
358 | 366 |
359 // Set | 367 // Set |
360 EXPECT_TRUE(nt::SetRegValueSZ(key_handle, sz_val_name, sz_val)); | 368 EXPECT_TRUE(nt::SetRegValueSZ(key_handle.get(), sz_val_name, sz_val)); |
361 EXPECT_TRUE(nt::SetRegValueSZ(key_handle, sz_val_name2, sz_val2)); | 369 EXPECT_TRUE(nt::SetRegValueSZ(key_handle.get(), sz_val_name2, sz_val2)); |
362 | 370 |
363 // Get | 371 // Get |
364 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name, &get_sz)); | 372 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle.get(), sz_val_name, &get_sz)); |
365 EXPECT_TRUE(get_sz.compare(sz_val) == 0); | 373 EXPECT_TRUE(get_sz.compare(sz_val) == 0); |
366 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name2, &get_sz)); | 374 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle.get(), sz_val_name2, &get_sz)); |
367 EXPECT_TRUE(get_sz.compare(sz_val2) == 0); | 375 EXPECT_TRUE(get_sz.compare(sz_val2) == 0); |
368 | 376 |
369 // Clean up | 377 // Clean up |
370 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); | 378 EXPECT_TRUE(nt::DeleteRegKey(key_handle.get())); |
371 nt::CloseRegKey(key_handle); | |
372 } | 379 } |
373 | 380 |
374 TEST_F(NtRegistryTest, API_MULTISZ) { | 381 TEST_F(NtRegistryTest, API_MULTISZ) { |
375 HANDLE key_handle; | |
376 const wchar_t* multisz_val_name = L"SzmultiTestValue"; | 382 const wchar_t* multisz_val_name = L"SzmultiTestValue"; |
377 std::vector<std::wstring> multisz_val; | 383 std::vector<std::wstring> multisz_val; |
378 std::wstring multi1 = L"one"; | 384 std::wstring multi1 = L"one"; |
379 std::wstring multi2 = L"two"; | 385 std::wstring multi2 = L"two"; |
380 std::wstring multi3 = L"three"; | 386 std::wstring multi3 = L"three"; |
381 const wchar_t* multisz_val_name2 = L"SzmultiTestValueBad"; | 387 const wchar_t* multisz_val_name2 = L"SzmultiTestValueBad"; |
382 std::wstring multi_empty = L""; | 388 std::wstring multi_empty = L""; |
383 | 389 |
384 // Create a subkey to play under. | 390 // Create a subkey to play under. |
385 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\multisz", KEY_ALL_ACCESS, | 391 nt::ScopedHANDLE key_handle( |
386 &key_handle)); | 392 nt::CreateRegKey(nt::HKCU, L"NTRegistry\\multisz", KEY_ALL_ACCESS)); |
387 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); | 393 ASSERT_TRUE(key_handle.is_valid()); |
388 ASSERT_NE(key_handle, nullptr); | 394 ASSERT_NE(key_handle.get(), nullptr); |
389 | 395 |
390 multisz_val.push_back(multi1); | 396 multisz_val.push_back(multi1); |
391 multisz_val.push_back(multi2); | 397 multisz_val.push_back(multi2); |
392 multisz_val.push_back(multi3); | 398 multisz_val.push_back(multi3); |
393 // Set | 399 // Set |
394 EXPECT_TRUE( | 400 EXPECT_TRUE( |
395 nt::SetRegValueMULTISZ(key_handle, multisz_val_name, multisz_val)); | 401 nt::SetRegValueMULTISZ(key_handle.get(), multisz_val_name, multisz_val)); |
396 multisz_val.clear(); | 402 multisz_val.clear(); |
397 multisz_val.push_back(multi_empty); | 403 multisz_val.push_back(multi_empty); |
398 // Set | 404 // Set |
399 EXPECT_TRUE( | 405 EXPECT_TRUE( |
400 nt::SetRegValueMULTISZ(key_handle, multisz_val_name2, multisz_val)); | 406 nt::SetRegValueMULTISZ(key_handle.get(), multisz_val_name2, multisz_val)); |
401 multisz_val.clear(); | 407 multisz_val.clear(); |
402 | 408 |
403 // Get | 409 // Get |
404 EXPECT_TRUE( | 410 EXPECT_TRUE(nt::QueryRegValueMULTISZ(key_handle.get(), multisz_val_name, |
405 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name, &multisz_val)); | 411 &multisz_val)); |
406 if (multisz_val.size() == 3) { | 412 if (multisz_val.size() == 3) { |
407 EXPECT_TRUE(multi1.compare(multisz_val.at(0)) == 0); | 413 EXPECT_TRUE(multi1.compare(multisz_val.at(0)) == 0); |
408 EXPECT_TRUE(multi2.compare(multisz_val.at(1)) == 0); | 414 EXPECT_TRUE(multi2.compare(multisz_val.at(1)) == 0); |
409 EXPECT_TRUE(multi3.compare(multisz_val.at(2)) == 0); | 415 EXPECT_TRUE(multi3.compare(multisz_val.at(2)) == 0); |
410 } else { | 416 } else { |
411 EXPECT_TRUE(false); | 417 EXPECT_TRUE(false); |
412 } | 418 } |
413 multisz_val.clear(); | 419 multisz_val.clear(); |
414 | 420 |
415 // Get | 421 // Get |
416 EXPECT_TRUE( | 422 EXPECT_TRUE(nt::QueryRegValueMULTISZ(key_handle.get(), multisz_val_name2, |
417 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name2, &multisz_val)); | 423 &multisz_val)); |
418 if (multisz_val.size() == 1) { | 424 if (multisz_val.size() == 1) { |
419 EXPECT_TRUE(multi_empty.compare(multisz_val.at(0)) == 0); | 425 EXPECT_TRUE(multi_empty.compare(multisz_val.at(0)) == 0); |
420 } else { | 426 } else { |
421 EXPECT_TRUE(false); | 427 EXPECT_TRUE(false); |
422 } | 428 } |
423 multisz_val.clear(); | 429 multisz_val.clear(); |
424 | 430 |
425 // Clean up | 431 // Clean up |
426 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); | 432 EXPECT_TRUE(nt::DeleteRegKey(key_handle.get())); |
427 nt::CloseRegKey(key_handle); | |
428 } | 433 } |
429 | 434 |
430 TEST_F(NtRegistryTest, CreateRegKeyRecursion) { | 435 TEST_F(NtRegistryTest, CreateRegKeyRecursion) { |
431 HANDLE key_handle; | |
432 const wchar_t* sz_new_key_1 = L"test1\\new\\subkey"; | 436 const wchar_t* sz_new_key_1 = L"test1\\new\\subkey"; |
433 const wchar_t* sz_new_key_2 = L"test2\\new\\subkey\\blah\\"; | 437 const wchar_t* sz_new_key_2 = L"test2\\new\\subkey\\blah\\"; |
434 const wchar_t* sz_new_key_3 = L"\\test3\\new\\subkey\\\\blah2"; | 438 const wchar_t* sz_new_key_3 = L"\\test3\\new\\subkey\\\\blah2"; |
435 | 439 |
436 // Tests for CreateRegKey recursion. | 440 // Tests for CreateRegKey recursion. |
437 ASSERT_TRUE( | 441 { |
438 nt::CreateRegKey(nt::HKCU, sz_new_key_1, KEY_ALL_ACCESS, nullptr)); | 442 nt::ScopedHANDLE create_handle( |
439 EXPECT_TRUE(nt::OpenRegKey(nt::HKCU, sz_new_key_1, KEY_ALL_ACCESS, | 443 nt::CreateRegKey(nt::HKCU, sz_new_key_1, KEY_ALL_ACCESS)); |
440 &key_handle, nullptr)); | 444 ASSERT_TRUE(create_handle.is_valid()); |
441 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); | 445 } |
442 nt::CloseRegKey(key_handle); | 446 { |
| 447 nt::ScopedHANDLE key_handle( |
| 448 nt::OpenRegKey(nt::HKCU, sz_new_key_1, KEY_ALL_ACCESS, nullptr)); |
| 449 EXPECT_TRUE(key_handle.is_valid()); |
| 450 EXPECT_TRUE(nt::DeleteRegKey(key_handle.get())); |
| 451 } |
443 | 452 |
444 ASSERT_TRUE( | 453 { |
445 nt::CreateRegKey(nt::HKCU, sz_new_key_2, KEY_ALL_ACCESS, nullptr)); | 454 nt::ScopedHANDLE key_handle( |
446 EXPECT_TRUE(nt::OpenRegKey(nt::HKCU, sz_new_key_2, KEY_ALL_ACCESS, | 455 nt::CreateRegKey(nt::HKCU, sz_new_key_2, KEY_ALL_ACCESS)); |
447 &key_handle, nullptr)); | 456 ASSERT_TRUE(key_handle.is_valid()); |
448 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); | 457 } |
449 nt::CloseRegKey(key_handle); | 458 { |
| 459 nt::ScopedHANDLE key_handle( |
| 460 nt::OpenRegKey(nt::HKCU, sz_new_key_2, KEY_ALL_ACCESS, nullptr)); |
| 461 EXPECT_TRUE(key_handle.is_valid()); |
| 462 EXPECT_TRUE(nt::DeleteRegKey(key_handle.get())); |
| 463 } |
450 | 464 |
451 ASSERT_TRUE( | 465 { |
452 nt::CreateRegKey(nt::HKCU, sz_new_key_3, KEY_ALL_ACCESS, nullptr)); | 466 nt::ScopedHANDLE key_handle( |
453 EXPECT_TRUE(nt::OpenRegKey(nt::HKCU, L"test3\\new\\subkey\\blah2", | 467 nt::CreateRegKey(nt::HKCU, sz_new_key_3, KEY_ALL_ACCESS)); |
454 KEY_ALL_ACCESS, &key_handle, nullptr)); | 468 ASSERT_TRUE(key_handle.is_valid()); |
455 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); | 469 } |
456 nt::CloseRegKey(key_handle); | 470 { |
| 471 nt::ScopedHANDLE key_handle(nt::OpenRegKey( |
| 472 nt::HKCU, L"test3\\new\\subkey\\blah2", KEY_ALL_ACCESS, nullptr)); |
| 473 EXPECT_TRUE(key_handle.is_valid()); |
| 474 EXPECT_TRUE(nt::DeleteRegKey(key_handle.get())); |
| 475 } |
457 | 476 |
458 // Subkey path can be null. | 477 // Subkey path can be null. |
459 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, nullptr, KEY_ALL_ACCESS, &key_handle)); | 478 { |
460 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); | 479 nt::ScopedHANDLE key_handle( |
461 ASSERT_NE(key_handle, nullptr); | 480 nt::CreateRegKey(nt::HKCU, nullptr, KEY_ALL_ACCESS)); |
462 nt::CloseRegKey(key_handle); | 481 ASSERT_TRUE(key_handle.is_valid()); |
| 482 ASSERT_NE(key_handle.get(), nullptr); |
| 483 } |
463 } | 484 } |
464 | 485 |
465 } // namespace | 486 } // namespace |
OLD | NEW |