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 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); | 341 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); |
342 nt::CloseRegKey(key_handle); | 342 nt::CloseRegKey(key_handle); |
343 } | 343 } |
344 | 344 |
345 TEST_F(NtRegistryTest, API_SZ) { | 345 TEST_F(NtRegistryTest, API_SZ) { |
346 HANDLE key_handle; | 346 HANDLE key_handle; |
347 const wchar_t* sz_val_name = L"SzTestValue"; | 347 const wchar_t* sz_val_name = L"SzTestValue"; |
348 std::wstring sz_val = L"blah de blah de blahhhhh."; | 348 std::wstring sz_val = L"blah de blah de blahhhhh."; |
349 const wchar_t* sz_val_name2 = L"SzTestValueEmpty"; | 349 const wchar_t* sz_val_name2 = L"SzTestValueEmpty"; |
350 std::wstring sz_val2 = L""; | 350 std::wstring sz_val2 = L""; |
| 351 const wchar_t* sz_val_name3 = L"SzTestValueMalformed"; |
| 352 const wchar_t* sz_val_name4 = L"SzTestValueMalformed2"; |
| 353 std::wstring sz_val3 = L"malformed"; |
| 354 BYTE* sz_val3_byte = reinterpret_cast<BYTE*>(&sz_val3[0]); |
| 355 std::vector<BYTE> malform; |
| 356 for (size_t i = 0; i < (sz_val3.size() * sizeof(wchar_t)); i++) |
| 357 malform.push_back(sz_val3_byte[i]); |
| 358 const wchar_t* sz_val_name5 = L"SzTestValueSize0"; |
351 | 359 |
352 // Create a subkey to play under. | 360 // Create a subkey to play under. |
| 361 // ------------------------------ |
353 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\sz", KEY_ALL_ACCESS, | 362 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\sz", KEY_ALL_ACCESS, |
354 &key_handle)); | 363 &key_handle)); |
355 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); | 364 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); |
356 ASSERT_NE(key_handle, nullptr); | 365 ASSERT_NE(key_handle, nullptr); |
357 | 366 |
358 std::wstring get_sz; | 367 std::wstring get_sz; |
359 EXPECT_FALSE(nt::QueryRegValueSZ(key_handle, sz_val_name, &get_sz)); | 368 EXPECT_FALSE(nt::QueryRegValueSZ(key_handle, sz_val_name, &get_sz)); |
360 | 369 |
361 // Set | 370 // Set |
| 371 // ------------------------------ |
362 EXPECT_TRUE(nt::SetRegValueSZ(key_handle, sz_val_name, sz_val)); | 372 EXPECT_TRUE(nt::SetRegValueSZ(key_handle, sz_val_name, sz_val)); |
363 EXPECT_TRUE(nt::SetRegValueSZ(key_handle, sz_val_name2, sz_val2)); | 373 EXPECT_TRUE(nt::SetRegValueSZ(key_handle, sz_val_name2, sz_val2)); |
| 374 // No null terminator. |
| 375 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, sz_val_name3, REG_SZ, |
| 376 malform.data(), malform.size())); |
| 377 malform.push_back(0); |
| 378 // Single trailing 0 byte. |
| 379 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, sz_val_name4, REG_SZ, |
| 380 malform.data(), malform.size())); |
| 381 // Size 0 value. |
| 382 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, sz_val_name5, REG_SZ, nullptr, 0)); |
364 | 383 |
365 // Get | 384 // Get |
| 385 // ------------------------------ |
366 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name, &get_sz)); | 386 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name, &get_sz)); |
367 EXPECT_TRUE(get_sz.compare(sz_val) == 0); | 387 EXPECT_TRUE(get_sz.compare(sz_val) == 0); |
368 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name2, &get_sz)); | 388 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name2, &get_sz)); |
369 EXPECT_TRUE(get_sz.compare(sz_val2) == 0); | 389 EXPECT_TRUE(get_sz.compare(sz_val2) == 0); |
| 390 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name3, &get_sz)); |
| 391 // Should be adjusted under the hood to equal sz_val3. |
| 392 EXPECT_TRUE(get_sz.compare(sz_val3) == 0); |
| 393 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name4, &get_sz)); |
| 394 // Should be adjusted under the hood to equal sz_val3. |
| 395 EXPECT_TRUE(get_sz.compare(sz_val3) == 0); |
| 396 EXPECT_TRUE(nt::QueryRegValueSZ(key_handle, sz_val_name5, &get_sz)); |
| 397 // Should be adjusted under the hood to an empty string. |
| 398 EXPECT_TRUE(get_sz.compare(sz_val2) == 0); |
370 | 399 |
371 // Clean up | 400 // Clean up |
| 401 // ------------------------------ |
372 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); | 402 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); |
373 nt::CloseRegKey(key_handle); | 403 nt::CloseRegKey(key_handle); |
374 } | 404 } |
375 | 405 |
376 TEST_F(NtRegistryTest, API_MULTISZ) { | 406 TEST_F(NtRegistryTest, API_MULTISZ) { |
377 HANDLE key_handle; | 407 HANDLE key_handle; |
378 const wchar_t* multisz_val_name = L"SzmultiTestValue"; | 408 const wchar_t* multisz_val_name = L"SzmultiTestValue"; |
379 std::vector<std::wstring> multisz_val; | 409 std::vector<std::wstring> multisz_val; |
380 std::wstring multi1 = L"one"; | 410 std::wstring multi1 = L"one"; |
381 std::wstring multi2 = L"two"; | 411 std::wstring multi2 = L"two"; |
382 std::wstring multi3 = L"three"; | 412 std::wstring multi3 = L"three"; |
383 const wchar_t* multisz_val_name2 = L"SzmultiTestValueBad"; | 413 const wchar_t* multisz_val_name2 = L"SzmultiTestValueBad"; |
384 std::wstring multi_empty = L""; | 414 std::wstring multi_empty = L""; |
| 415 const wchar_t* multisz_val_name3 = L"SzmultiTestValueMalformed"; |
| 416 const wchar_t* multisz_val_name4 = L"SzmultiTestValueMalformed2"; |
| 417 const wchar_t* multisz_val_name5 = L"SzmultiTestValueMalformed3"; |
| 418 const wchar_t* multisz_val_name6 = L"SzmultiTestValueMalformed4"; |
| 419 std::wstring multisz_val3 = L"malformed"; |
| 420 BYTE* multisz_val3_byte = reinterpret_cast<BYTE*>(&multisz_val3[0]); |
| 421 std::vector<BYTE> malform; |
| 422 for (size_t i = 0; i < (multisz_val3.size() * sizeof(wchar_t)); i++) |
| 423 malform.push_back(multisz_val3_byte[i]); |
| 424 const wchar_t* multisz_val_name7 = L"SzmultiTestValueSize0"; |
385 | 425 |
386 // Create a subkey to play under. | 426 // Create a subkey to play under. |
| 427 // ------------------------------ |
387 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\multisz", KEY_ALL_ACCESS, | 428 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, L"NTRegistry\\multisz", KEY_ALL_ACCESS, |
388 &key_handle)); | 429 &key_handle)); |
389 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); | 430 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); |
390 ASSERT_NE(key_handle, nullptr); | 431 ASSERT_NE(key_handle, nullptr); |
391 | 432 |
392 multisz_val.push_back(multi1); | 433 multisz_val.push_back(multi1); |
393 multisz_val.push_back(multi2); | 434 multisz_val.push_back(multi2); |
394 multisz_val.push_back(multi3); | 435 multisz_val.push_back(multi3); |
| 436 |
395 // Set | 437 // Set |
| 438 // ------------------------------ |
396 EXPECT_TRUE( | 439 EXPECT_TRUE( |
397 nt::SetRegValueMULTISZ(key_handle, multisz_val_name, multisz_val)); | 440 nt::SetRegValueMULTISZ(key_handle, multisz_val_name, multisz_val)); |
398 multisz_val.clear(); | 441 multisz_val.clear(); |
399 multisz_val.push_back(multi_empty); | 442 multisz_val.push_back(multi_empty); |
400 // Set | 443 |
401 EXPECT_TRUE( | 444 EXPECT_TRUE( |
402 nt::SetRegValueMULTISZ(key_handle, multisz_val_name2, multisz_val)); | 445 nt::SetRegValueMULTISZ(key_handle, multisz_val_name2, multisz_val)); |
403 multisz_val.clear(); | 446 multisz_val.clear(); |
404 | 447 |
| 448 // No null terminator. |
| 449 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name3, REG_MULTI_SZ, |
| 450 malform.data(), malform.size())); |
| 451 malform.push_back(0); |
| 452 // Single trailing 0 byte. |
| 453 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name4, REG_MULTI_SZ, |
| 454 malform.data(), malform.size())); |
| 455 malform.push_back(0); |
| 456 // Two trailing 0 bytes. |
| 457 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name5, REG_MULTI_SZ, |
| 458 malform.data(), malform.size())); |
| 459 malform.push_back(0); |
| 460 // Three trailing 0 bytes. |
| 461 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name6, REG_MULTI_SZ, |
| 462 malform.data(), malform.size())); |
| 463 |
| 464 // Size 0 value. |
| 465 EXPECT_TRUE(nt::SetRegKeyValue(key_handle, multisz_val_name7, REG_MULTI_SZ, |
| 466 nullptr, 0)); |
| 467 |
405 // Get | 468 // Get |
| 469 // ------------------------------ |
406 EXPECT_TRUE( | 470 EXPECT_TRUE( |
407 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name, &multisz_val)); | 471 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name, &multisz_val)); |
408 if (multisz_val.size() == 3) { | 472 if (multisz_val.size() == 3) { |
409 EXPECT_TRUE(multi1.compare(multisz_val.at(0)) == 0); | 473 EXPECT_TRUE(multi1.compare(multisz_val.at(0)) == 0); |
410 EXPECT_TRUE(multi2.compare(multisz_val.at(1)) == 0); | 474 EXPECT_TRUE(multi2.compare(multisz_val.at(1)) == 0); |
411 EXPECT_TRUE(multi3.compare(multisz_val.at(2)) == 0); | 475 EXPECT_TRUE(multi3.compare(multisz_val.at(2)) == 0); |
412 } else { | 476 } else { |
413 EXPECT_TRUE(false); | 477 EXPECT_TRUE(false); |
414 } | 478 } |
415 multisz_val.clear(); | 479 multisz_val.clear(); |
416 | 480 |
417 // Get | |
418 EXPECT_TRUE( | 481 EXPECT_TRUE( |
419 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name2, &multisz_val)); | 482 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name2, &multisz_val)); |
420 if (multisz_val.size() == 1) { | 483 EXPECT_EQ(multisz_val.size(), static_cast<DWORD>(0)); |
421 EXPECT_TRUE(multi_empty.compare(multisz_val.at(0)) == 0); | 484 multisz_val.clear(); |
| 485 |
| 486 EXPECT_TRUE( |
| 487 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name3, &multisz_val)); |
| 488 if (multisz_val.size(), 1) { |
| 489 // Should be adjusted under the hood to equal sz_val3. |
| 490 EXPECT_TRUE(multisz_val3.compare(multisz_val.at(0)) == 0); |
422 } else { | 491 } else { |
423 EXPECT_TRUE(false); | 492 EXPECT_TRUE(false); |
424 } | 493 } |
425 multisz_val.clear(); | 494 multisz_val.clear(); |
426 | 495 |
| 496 EXPECT_TRUE( |
| 497 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name4, &multisz_val)); |
| 498 if (multisz_val.size(), 1) { |
| 499 // Should be adjusted under the hood to equal sz_val3. |
| 500 EXPECT_TRUE(multisz_val3.compare(multisz_val.at(0)) == 0); |
| 501 } else { |
| 502 EXPECT_TRUE(false); |
| 503 } |
| 504 multisz_val.clear(); |
| 505 |
| 506 EXPECT_TRUE( |
| 507 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name5, &multisz_val)); |
| 508 if (multisz_val.size(), 1) { |
| 509 // Should be adjusted under the hood to equal sz_val3. |
| 510 EXPECT_TRUE(multisz_val3.compare(multisz_val.at(0)) == 0); |
| 511 } else { |
| 512 EXPECT_TRUE(false); |
| 513 } |
| 514 multisz_val.clear(); |
| 515 |
| 516 EXPECT_TRUE( |
| 517 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name6, &multisz_val)); |
| 518 if (multisz_val.size(), 1) { |
| 519 // Should be adjusted under the hood to equal sz_val3. |
| 520 EXPECT_TRUE(multisz_val3.compare(multisz_val.at(0)) == 0); |
| 521 } else { |
| 522 EXPECT_TRUE(false); |
| 523 } |
| 524 multisz_val.clear(); |
| 525 |
| 526 EXPECT_TRUE( |
| 527 nt::QueryRegValueMULTISZ(key_handle, multisz_val_name7, &multisz_val)); |
| 528 // Should be adjusted under the hood to an empty string. |
| 529 EXPECT_TRUE(multisz_val.empty()); |
| 530 |
427 // Clean up | 531 // Clean up |
| 532 // ------------------------------ |
428 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); | 533 EXPECT_TRUE(nt::DeleteRegKey(key_handle)); |
429 nt::CloseRegKey(key_handle); | 534 nt::CloseRegKey(key_handle); |
430 } | 535 } |
431 | 536 |
432 TEST_F(NtRegistryTest, CreateRegKeyRecursion) { | 537 TEST_F(NtRegistryTest, CreateRegKeyRecursion) { |
433 HANDLE key_handle; | 538 HANDLE key_handle; |
434 const wchar_t* sz_new_key_1 = L"test1\\new\\subkey"; | 539 const wchar_t* sz_new_key_1 = L"test1\\new\\subkey"; |
435 const wchar_t* sz_new_key_2 = L"test2\\new\\subkey\\blah\\"; | 540 const wchar_t* sz_new_key_2 = L"test2\\new\\subkey\\blah\\"; |
436 const wchar_t* sz_new_key_3 = L"\\test3\\new\\subkey\\\\blah2"; | 541 const wchar_t* sz_new_key_3 = L"\\test3\\new\\subkey\\\\blah2"; |
437 | 542 |
(...skipping 20 matching lines...) Expand all Loading... |
458 nt::CloseRegKey(key_handle); | 563 nt::CloseRegKey(key_handle); |
459 | 564 |
460 // Subkey path can be null. | 565 // Subkey path can be null. |
461 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, nullptr, KEY_ALL_ACCESS, &key_handle)); | 566 ASSERT_TRUE(nt::CreateRegKey(nt::HKCU, nullptr, KEY_ALL_ACCESS, &key_handle)); |
462 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); | 567 ASSERT_NE(key_handle, INVALID_HANDLE_VALUE); |
463 ASSERT_NE(key_handle, nullptr); | 568 ASSERT_NE(key_handle, nullptr); |
464 nt::CloseRegKey(key_handle); | 569 nt::CloseRegKey(key_handle); |
465 } | 570 } |
466 | 571 |
467 } // namespace | 572 } // namespace |
OLD | NEW |