| // Copyright 2018 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_CHROME_CLEANER_OS_REGISTRY_H_ |
| #define CHROME_CHROME_CLEANER_OS_REGISTRY_H_ |
| |
| #include <windows.h> |
| |
| #include <set> |
| #include <string> |
| #include <vector> |
| |
| #include "base/strings/string16.h" |
| |
| namespace base { |
| namespace win { |
| class RegKey; |
| } // namespace win |
| } // namespace base |
| |
| namespace chrome_cleaner { |
| |
| bool GetNativeKeyPath(const base::win::RegKey& key, |
| base::string16* native_key_path); |
| |
| // Returns true for predefined handles, such as NULL, INVALID_HANDLE_VALUE, and |
| // for predefined registry root keys, such as HKEY_CLASSES_ROOT. |
| bool IsPredefinedRegistryHandle(HANDLE key); |
| |
| // Utility class to store a registry key path. Unlike a RegKey, this class is |
| // copy/moveable. |
| // It stores |rootkey|, which must be a predefined registry root key. |
| // TODO(veranika): to make the requirement of a predefined registry root key |
| // explicit, change the constructors to take the PredefinedHandle enum instead |
| // of the broader HKEY. |
| class RegKeyPath { |
| public: |
| RegKeyPath(); |
| RegKeyPath(HKEY rootkey, const base::string16& subkey); |
| |
| // Create a path with an explicit wow64 view. Permissible values are |
| // KEY_WOW64_32KEY, KEY_WOW64_64KEY and 0 (default based target architecture). |
| RegKeyPath(HKEY rootkey, const base::string16& subkey, REGSAM wow64access); |
| |
| HKEY rootkey() const { return rootkey_; } |
| const base::string16& subkey() const { return subkey_; } |
| REGSAM wow64access() const { return wow64access_; } |
| |
| // Return whether the key exists (without creating it). |
| bool Exists() const; |
| |
| // Return whether a value name exists for a key (without creating it). |
| bool HasValue(const wchar_t* value_name) const; |
| |
| // Open an already existing registry key. Returns false on failure. |
| bool Open(REGSAM access, base::win::RegKey* key) const; |
| |
| // Like Open, but will create the key if it does not exist yet. |
| bool Create(REGSAM access, base::win::RegKey* key) const; |
| |
| // Return the full path as a string. Intended for logging purposes only. |
| base::string16 FullPath() const; |
| |
| // Return the native full path as a string. |
| bool GetNativeFullPath(base::string16* native_path) const; |
| |
| // Test whether two paths are exactly identical. This returns false if the |
| // same key is addressed with different Wow64 access bits. Behaviour is |
| // unaffected by whether the key path exists or not. |
| bool operator==(const RegKeyPath& other) const; |
| |
| // Test whether two paths are equivalent. If the same key path is addressed |
| // with different Wow64 access bits, the last write timestamp is used to |
| // deduce whether the same key is being referenced. Return false if at least |
| // one of the two keys does not exist. |
| bool IsEquivalent(const RegKeyPath& other) const; |
| |
| // Required for some STL containers and operations. |
| bool operator<(const RegKeyPath& other) const; |
| |
| // Return all keys for the given subkey under all roots listed. The result set |
| // contains only existing keys and may explicitly specify 32 or 64bit views |
| // where WoW redirection is enabled. |
| static std::set<RegKeyPath> FindExisting(const std::vector<HKEY>& rootkeys, |
| const wchar_t* subkey); |
| |
| private: |
| HKEY rootkey_; |
| base::string16 subkey_; |
| REGSAM wow64access_; |
| }; |
| |
| } // namespace chrome_cleaner |
| |
| #endif // CHROME_CHROME_CLEANER_OS_REGISTRY_H_ |