15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/delete_reg_key_work_item.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <shlwapi.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/installer/util/install_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::RegKey; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeleteRegKeyWorkItem::~DeleteRegKeyWorkItem() { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeleteRegKeyWorkItem::DeleteRegKeyWorkItem(HKEY predefined_root, 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::wstring& path, 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) REGSAM wow64_access) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : predefined_root_(predefined_root), 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) path_(path), 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wow64_access_(wow64_access) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(predefined_root); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It's a safe bet that we don't want to delete one of the root trees. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!path.empty()); 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(wow64_access == 0 || 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wow64_access == KEY_WOW64_32KEY || 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wow64_access == KEY_WOW64_64KEY); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeleteRegKeyWorkItem::Do() { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (path_.empty()) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegistryKeyBackup backup; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only try to make a backup if we're not configured to ignore failures. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ignore_failure_) { 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!backup.Initialize(predefined_root_, path_.c_str(), wow64_access_)) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to backup destination for registry key copy."; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the key. 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!InstallUtil::DeleteRegistryKey( 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) predefined_root_, path_.c_str(), wow64_access_)) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ignore_failure_; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We've succeeded, so remember any backup we may have made. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) backup_.swap(backup); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeleteRegKeyWorkItem::Rollback() { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ignore_failure_) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete anything in the key before restoring the backup in case someone else 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // put new data in the key after Do(). 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InstallUtil::DeleteRegistryKey(predefined_root_, 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) path_.c_str(), 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) wow64_access_); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restore the old contents. The restoration takes on its default security 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attributes; any custom attributes are lost. 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!backup_.WriteTo(predefined_root_, path_.c_str(), wow64_access_)) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Failed to restore key in rollback."; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 73