Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(86)

Side by Side Diff: chrome/installer/util/install_util.cc

Issue 282363003: Add WOW64 support to the installer registry work items (Closed) Base URL: https://chromium.googlesource.com/chromium/src
Patch Set: nits. fix call to DeleteRegistryKey Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/installer/util/install_util.h ('k') | chrome/installer/util/install_util_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 // See the corresponding header file for description of the functions in this 5 // See the corresponding header file for description of the functions in this
6 // file. 6 // file.
7 7
8 #include "chrome/installer/util/install_util.h" 8 #include "chrome/installer/util/install_util.h"
9 9
10 #include <shellapi.h> 10 #include <shellapi.h>
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 void InstallUtil::AddInstallerResultItems( 279 void InstallUtil::AddInstallerResultItems(
280 bool system_install, 280 bool system_install,
281 const base::string16& state_key, 281 const base::string16& state_key,
282 installer::InstallStatus status, 282 installer::InstallStatus status,
283 int string_resource_id, 283 int string_resource_id,
284 const base::string16* const launch_cmd, 284 const base::string16* const launch_cmd,
285 WorkItemList* install_list) { 285 WorkItemList* install_list) {
286 DCHECK(install_list); 286 DCHECK(install_list);
287 const HKEY root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 287 const HKEY root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
288 DWORD installer_result = (GetInstallReturnCode(status) == 0) ? 0 : 1; 288 DWORD installer_result = (GetInstallReturnCode(status) == 0) ? 0 : 1;
289 install_list->AddCreateRegKeyWorkItem(root, state_key); 289 install_list->AddCreateRegKeyWorkItem(
290 install_list->AddSetRegValueWorkItem(root, state_key, 290 root, state_key, WorkItem::kWow64Default);
291 install_list->AddSetRegValueWorkItem(root,
292 state_key,
293 WorkItem::kWow64Default,
291 installer::kInstallerResult, 294 installer::kInstallerResult,
292 installer_result, true); 295 installer_result,
293 install_list->AddSetRegValueWorkItem(root, state_key, 296 true);
297 install_list->AddSetRegValueWorkItem(root,
298 state_key,
299 WorkItem::kWow64Default,
294 installer::kInstallerError, 300 installer::kInstallerError,
295 static_cast<DWORD>(status), true); 301 static_cast<DWORD>(status),
302 true);
296 if (string_resource_id != 0) { 303 if (string_resource_id != 0) {
297 base::string16 msg = installer::GetLocalizedString(string_resource_id); 304 base::string16 msg = installer::GetLocalizedString(string_resource_id);
298 install_list->AddSetRegValueWorkItem(root, state_key, 305 install_list->AddSetRegValueWorkItem(root,
299 installer::kInstallerResultUIString, msg, true); 306 state_key,
307 WorkItem::kWow64Default,
308 installer::kInstallerResultUIString,
309 msg,
310 true);
300 } 311 }
301 if (launch_cmd != NULL && !launch_cmd->empty()) { 312 if (launch_cmd != NULL && !launch_cmd->empty()) {
302 install_list->AddSetRegValueWorkItem(root, state_key, 313 install_list->AddSetRegValueWorkItem(
303 installer::kInstallerSuccessLaunchCmdLine, *launch_cmd, true); 314 root,
315 state_key,
316 WorkItem::kWow64Default,
317 installer::kInstallerSuccessLaunchCmdLine,
318 *launch_cmd,
319 true);
304 } 320 }
305 } 321 }
306 322
307 void InstallUtil::UpdateInstallerStage(bool system_install, 323 void InstallUtil::UpdateInstallerStage(bool system_install,
308 const base::string16& state_key_path, 324 const base::string16& state_key_path,
309 installer::InstallerStage stage) { 325 installer::InstallerStage stage) {
310 DCHECK_LE(static_cast<installer::InstallerStage>(0), stage); 326 DCHECK_LE(static_cast<installer::InstallerStage>(0), stage);
311 DCHECK_GT(installer::NUM_STAGES, stage); 327 DCHECK_GT(installer::NUM_STAGES, stage);
312 const HKEY root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; 328 const HKEY root = system_install ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
313 RegKey state_key; 329 RegKey state_key;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 if (!PathService::Get(chrome::DIR_USER_DATA, &user_data_dir)) 430 if (!PathService::Get(chrome::DIR_USER_DATA, &user_data_dir))
415 return false; 431 return false;
416 *path = user_data_dir.Append(installer::kEULASentinelFile); 432 *path = user_data_dir.Append(installer::kEULASentinelFile);
417 return true; 433 return true;
418 } 434 }
419 435
420 // This method tries to delete a registry key and logs an error message 436 // This method tries to delete a registry key and logs an error message
421 // in case of failure. It returns true if deletion is successful (or the key did 437 // in case of failure. It returns true if deletion is successful (or the key did
422 // not exist), otherwise false. 438 // not exist), otherwise false.
423 bool InstallUtil::DeleteRegistryKey(HKEY root_key, 439 bool InstallUtil::DeleteRegistryKey(HKEY root_key,
424 const base::string16& key_path) { 440 const base::string16& key_path,
441 REGSAM wow64_access) {
425 VLOG(1) << "Deleting registry key " << key_path; 442 VLOG(1) << "Deleting registry key " << key_path;
426 LONG result = ::SHDeleteKey(root_key, key_path.c_str()); 443 RegKey target_key;
427 if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) { 444 LONG result = target_key.Open(root_key, key_path.c_str(),
445 KEY_READ | KEY_WRITE | wow64_access);
446
447 if (result == ERROR_FILE_NOT_FOUND)
448 return true;
449
450 if (result == ERROR_SUCCESS)
451 result = target_key.DeleteKey(L"");
452
453 if (result != ERROR_SUCCESS) {
428 LOG(ERROR) << "Failed to delete registry key: " << key_path 454 LOG(ERROR) << "Failed to delete registry key: " << key_path
429 << " error: " << result; 455 << " error: " << result;
430 return false; 456 return false;
431 } 457 }
432 return true; 458 return true;
433 } 459 }
434 460
435 // This method tries to delete a registry value and logs an error message 461 // This method tries to delete a registry value and logs an error message
436 // in case of failure. It returns true if deletion is successful (or the key did 462 // in case of failure. It returns true if deletion is successful (or the key did
437 // not exist), otherwise false. 463 // not exist), otherwise false.
438 bool InstallUtil::DeleteRegistryValue(HKEY reg_root, 464 bool InstallUtil::DeleteRegistryValue(HKEY reg_root,
439 const base::string16& key_path, 465 const base::string16& key_path,
466 REGSAM wow64_access,
440 const base::string16& value_name) { 467 const base::string16& value_name) {
441 RegKey key; 468 RegKey key;
442 LONG result = key.Open(reg_root, key_path.c_str(), KEY_SET_VALUE); 469 LONG result = key.Open(reg_root, key_path.c_str(),
470 KEY_SET_VALUE | wow64_access);
443 if (result == ERROR_SUCCESS) 471 if (result == ERROR_SUCCESS)
444 result = key.DeleteValue(value_name.c_str()); 472 result = key.DeleteValue(value_name.c_str());
445 if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) { 473 if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) {
446 LOG(ERROR) << "Failed to delete registry value: " << value_name 474 LOG(ERROR) << "Failed to delete registry value: " << value_name
447 << " error: " << result; 475 << " error: " << result;
448 return false; 476 return false;
449 } 477 }
450 return true; 478 return true;
451 } 479 }
452 480
453 // static 481 // static
454 InstallUtil::ConditionalDeleteResult InstallUtil::DeleteRegistryKeyIf( 482 InstallUtil::ConditionalDeleteResult InstallUtil::DeleteRegistryKeyIf(
455 HKEY root_key, 483 HKEY root_key,
456 const base::string16& key_to_delete_path, 484 const base::string16& key_to_delete_path,
457 const base::string16& key_to_test_path, 485 const base::string16& key_to_test_path,
486 const REGSAM wow64_access,
458 const wchar_t* value_name, 487 const wchar_t* value_name,
459 const RegistryValuePredicate& predicate) { 488 const RegistryValuePredicate& predicate) {
460 DCHECK(root_key); 489 DCHECK(root_key);
461 ConditionalDeleteResult delete_result = NOT_FOUND; 490 ConditionalDeleteResult delete_result = NOT_FOUND;
462 RegKey key; 491 RegKey key;
463 base::string16 actual_value; 492 base::string16 actual_value;
464 if (key.Open(root_key, key_to_test_path.c_str(), 493 if (key.Open(root_key, key_to_test_path.c_str(),
465 KEY_QUERY_VALUE) == ERROR_SUCCESS && 494 KEY_QUERY_VALUE | wow64_access) == ERROR_SUCCESS &&
466 key.ReadValue(value_name, &actual_value) == ERROR_SUCCESS && 495 key.ReadValue(value_name, &actual_value) == ERROR_SUCCESS &&
467 predicate.Evaluate(actual_value)) { 496 predicate.Evaluate(actual_value)) {
468 key.Close(); 497 key.Close();
469 delete_result = DeleteRegistryKey(root_key, key_to_delete_path) 498 delete_result = DeleteRegistryKey(root_key,
499 key_to_delete_path,
500 wow64_access)
470 ? DELETED : DELETE_FAILED; 501 ? DELETED : DELETE_FAILED;
471 } 502 }
472 return delete_result; 503 return delete_result;
473 } 504 }
474 505
475 // static 506 // static
476 InstallUtil::ConditionalDeleteResult InstallUtil::DeleteRegistryValueIf( 507 InstallUtil::ConditionalDeleteResult InstallUtil::DeleteRegistryValueIf(
477 HKEY root_key, 508 HKEY root_key,
478 const wchar_t* key_path, 509 const wchar_t* key_path,
510 REGSAM wow64_access,
479 const wchar_t* value_name, 511 const wchar_t* value_name,
480 const RegistryValuePredicate& predicate) { 512 const RegistryValuePredicate& predicate) {
481 DCHECK(root_key); 513 DCHECK(root_key);
482 DCHECK(key_path); 514 DCHECK(key_path);
483 ConditionalDeleteResult delete_result = NOT_FOUND; 515 ConditionalDeleteResult delete_result = NOT_FOUND;
484 RegKey key; 516 RegKey key;
485 base::string16 actual_value; 517 base::string16 actual_value;
486 if (key.Open(root_key, key_path, 518 if (key.Open(root_key, key_path,
487 KEY_QUERY_VALUE | KEY_SET_VALUE) == ERROR_SUCCESS && 519 KEY_QUERY_VALUE | KEY_SET_VALUE | wow64_access)
520 == ERROR_SUCCESS &&
488 key.ReadValue(value_name, &actual_value) == ERROR_SUCCESS && 521 key.ReadValue(value_name, &actual_value) == ERROR_SUCCESS &&
489 predicate.Evaluate(actual_value)) { 522 predicate.Evaluate(actual_value)) {
490 LONG result = key.DeleteValue(value_name); 523 LONG result = key.DeleteValue(value_name);
491 if (result != ERROR_SUCCESS) { 524 if (result != ERROR_SUCCESS) {
492 LOG(ERROR) << "Failed to delete registry value: " 525 LOG(ERROR) << "Failed to delete registry value: "
493 << (value_name ? value_name : L"(Default)") 526 << (value_name ? value_name : L"(Default)")
494 << " error: " << result; 527 << " error: " << result;
495 delete_result = DELETE_FAILED; 528 delete_result = DELETE_FAILED;
496 } 529 }
497 delete_result = DELETED; 530 delete_result = DELETED;
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 // Open the program and see if it references the expected file. 637 // Open the program and see if it references the expected file.
605 base::File file; 638 base::File file;
606 BY_HANDLE_FILE_INFORMATION info = {}; 639 BY_HANDLE_FILE_INFORMATION info = {};
607 640
608 return (OpenForInfo(path, &file) && 641 return (OpenForInfo(path, &file) &&
609 GetInfo(file, &info) && 642 GetInfo(file, &info) &&
610 info.dwVolumeSerialNumber == file_info_.dwVolumeSerialNumber && 643 info.dwVolumeSerialNumber == file_info_.dwVolumeSerialNumber &&
611 info.nFileIndexHigh == file_info_.nFileIndexHigh && 644 info.nFileIndexHigh == file_info_.nFileIndexHigh &&
612 info.nFileIndexLow == file_info_.nFileIndexLow); 645 info.nFileIndexLow == file_info_.nFileIndexLow);
613 } 646 }
OLDNEW
« no previous file with comments | « chrome/installer/util/install_util.h ('k') | chrome/installer/util/install_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698