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