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 3 // found in the LICENSE file. 4 5 #ifndef BASE_WIN_REGISTRY_H_ 6 #define BASE_WIN_REGISTRY_H_ 7 8 #include <windows.h> 9 #include <string> 10 #include <vector> 11 12 #include "base/base_export.h" 13 #include "base/basictypes.h" 14 #include "base/stl_util.h" 15 16 namespace base { 17 namespace win { 18 19 // Utility class to read, write and manipulate the Windows Registry. 20 // Registry vocabulary primer: a "key" is like a folder, in which there 21 // are "values", which are <name, data> pairs, with an associated data type. 22 // 23 // Note: 24 // ReadValue family of functions guarantee that the return arguments 25 // are not touched in case of failure. 26 class BASE_EXPORT RegKey { 27 public: 28 RegKey(); 29 explicit RegKey(HKEY key); 30 RegKey(HKEY rootkey, const wchar_t* subkey, REGSAM access); 31 ~RegKey(); 32 33 LONG Create(HKEY rootkey, const wchar_t* subkey, REGSAM access); 34 35 LONG CreateWithDisposition(HKEY rootkey, const wchar_t* subkey, 36 DWORD* disposition, REGSAM access); 37 38 // Creates a subkey or open it if it already exists. 39 LONG CreateKey(const wchar_t* name, REGSAM access); 40 41 // Opens an existing reg key. 42 LONG Open(HKEY rootkey, const wchar_t* subkey, REGSAM access); 43 44 // Opens an existing reg key, given the relative key name. 45 LONG OpenKey(const wchar_t* relative_key_name, REGSAM access); 46 47 // Closes this reg key. 48 void Close(); 49 50 // Replaces the handle of the registry key and takes ownership of the handle. 51 void Set(HKEY key); 52 53 // Transfers ownership away from this object. 54 HKEY Take(); 55 56 // Returns false if this key does not have the specified value, of if an error 57 // occurrs while attempting to access it. 58 bool HasValue(const wchar_t* value_name) const; 59 60 // Returns the number of values for this key, of 0 if the number cannot be 61 // determined. 62 DWORD GetValueCount() const; 63 64 // Determine the nth value's name. 65 LONG GetValueNameAt(int index, std::wstring* name) const; 66 67 // True while the key is valid. 68 bool Valid() const { return key_ != NULL; } 69 70 // Kill a key and everything that live below it; please be careful when using 71 // it. 72 LONG DeleteKey(const wchar_t* name); 73 74 // Deletes a single value within the key. 75 LONG DeleteValue(const wchar_t* name); 76 77 // Getters: 78 79 // Returns an int32 value. If |name| is NULL or empty, returns the default 80 // value, if any. 81 LONG ReadValueDW(const wchar_t* name, DWORD* out_value) const; 82 83 // Returns an int64 value. If |name| is NULL or empty, returns the default 84 // value, if any. 85 LONG ReadInt64(const wchar_t* name, int64* out_value) const; 86 87 // Returns a string value. If |name| is NULL or empty, returns the default 88 // value, if any. 89 LONG ReadValue(const wchar_t* name, std::wstring* out_value) const; 90 91 // Reads a REG_MULTI_SZ registry field into a vector of strings. Clears 92 // |values| initially and adds further strings to the list. Returns 93 // ERROR_CANTREAD if type is not REG_MULTI_SZ. 94 LONG ReadValues(const wchar_t* name, std::vector<std::wstring>* values); 95 96 // Returns raw data. If |name| is NULL or empty, returns the default 97 // value, if any. 98 LONG ReadValue(const wchar_t* name, 99 void* data, 100 DWORD* dsize, 101 DWORD* dtype) const; 102 103 // Setters: 104 105 // Sets an int32 value. 106 LONG WriteValue(const wchar_t* name, DWORD in_value); 107 108 // Sets a string value. 109 LONG WriteValue(const wchar_t* name, const wchar_t* in_value); 110 111 // Sets raw data, including type. 112 LONG WriteValue(const wchar_t* name, 113 const void* data, 114 DWORD dsize, 115 DWORD dtype); 116 117 // Starts watching the key to see if any of its values have changed. 118 // The key must have been opened with the KEY_NOTIFY access privilege. 119 LONG StartWatching(); 120 121 // If StartWatching hasn't been called, always returns false. 122 // Otherwise, returns true if anything under the key has changed. 123 // This can't be const because the |watch_event_| may be refreshed. 124 bool HasChanged(); 125 126 // Will automatically be called by destructor if not manually called 127 // beforehand. Returns true if it was watching, false otherwise. 128 LONG StopWatching(); 129 130 inline bool IsWatching() const { return watch_event_ != 0; } 131 HANDLE watch_event() const { return watch_event_; } 132 HKEY Handle() const { return key_; } 133 134 private: 135 HKEY key_; // The registry key being iterated. 136 HANDLE watch_event_; 137 138 DISALLOW_COPY_AND_ASSIGN(RegKey); 139 }; 140 141 // Iterates the entries found in a particular folder on the registry. 142 class BASE_EXPORT RegistryValueIterator { 143 public: 144 RegistryValueIterator(HKEY root_key, const wchar_t* folder_key); 145 146 ~RegistryValueIterator(); 147 148 DWORD ValueCount() const; 149 150 // True while the iterator is valid. 151 bool Valid() const; 152 153 // Advances to the next registry entry. 154 void operator++(); 155 156 const wchar_t* Name() const { return name_.c_str(); } 157 const wchar_t* Value() const { return vector_as_array(&value_); } 158 // ValueSize() is in bytes. 159 DWORD ValueSize() const { return value_size_; } 160 DWORD Type() const { return type_; } 161 162 int Index() const { return index_; } 163 164 private: 165 // Read in the current values. 166 bool Read(); 167 168 // The registry key being iterated. 169 HKEY key_; 170 171 // Current index of the iteration. 172 int index_; 173 174 // Current values. 175 std::wstring name_; 176 std::vector<wchar_t> value_; 177 DWORD value_size_; 178 DWORD type_; 179 180 DISALLOW_COPY_AND_ASSIGN(RegistryValueIterator); 181 }; 182 183 class BASE_EXPORT RegistryKeyIterator { 184 public: 185 RegistryKeyIterator(HKEY root_key, const wchar_t* folder_key); 186 187 ~RegistryKeyIterator(); 188 189 DWORD SubkeyCount() const; 190 191 // True while the iterator is valid. 192 bool Valid() const; 193 194 // Advances to the next entry in the folder. 195 void operator++(); 196 197 const wchar_t* Name() const { return name_; } 198 199 int Index() const { return index_; } 200 201 private: 202 // Read in the current values. 203 bool Read(); 204 205 // The registry key being iterated. 206 HKEY key_; 207 208 // Current index of the iteration. 209 int index_; 210 211 wchar_t name_[MAX_PATH]; 212 213 DISALLOW_COPY_AND_ASSIGN(RegistryKeyIterator); 214 }; 215 216 } // namespace win 217 } // namespace base 218 219 #endif // BASE_WIN_REGISTRY_H_ 220