// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_INSTALLER_UTIL_REGISTRY_KEY_BACKUP_H_ #define CHROME_INSTALLER_UTIL_REGISTRY_KEY_BACKUP_H_ #include <windows.h> #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" // A container for a registry key, its values, and its subkeys. We don't use // more obvious methods for various reasons: // - RegCopyTree isn't supported pre-Vista, so we'd have to do something // different for XP anyway. // - SHCopyKey can't copy subkeys into a volatile destination, so we'd have to // worry about polluting the registry. // We don't persist security attributes since we only delete keys that we own, // and we don't set custom attributes on them anyway. class RegistryKeyBackup { public: RegistryKeyBackup(); ~RegistryKeyBackup(); // Recursively reads |key_path| into this instance. Backing up a non-existent // key is valid. Returns true if the backup was successful; false otherwise, // in which case the state of this instance is not modified. bool Initialize(HKEY root, const wchar_t* key_path, REGSAM wow64_acccess); // Writes the contents of this instance into |key|. The contents of // |key_path| are not modified If this instance is uninitialized or was // initialized from a non-existent key. bool WriteTo(HKEY root, const wchar_t* key_path, REGSAM wow64_acccess) const; void swap(RegistryKeyBackup& other) { key_data_.swap(other.key_data_); } private: class KeyData; // The values and subkeys of the backed-up key. scoped_ptr<KeyData> key_data_; DISALLOW_COPY_AND_ASSIGN(RegistryKeyBackup); }; #endif // CHROME_INSTALLER_UTIL_REGISTRY_KEY_BACKUP_H_