Chromium Code Reviews| Index: base/win/registry.cc |
| diff --git a/base/win/registry.cc b/base/win/registry.cc |
| index 2fe53cf8b8c4308dcdebc4caca5afbb826999eac..671baa9934c3ccc019322c95280a98a340baf8e3 100644 |
| --- a/base/win/registry.cc |
| +++ b/base/win/registry.cc |
| @@ -34,6 +34,16 @@ inline DWORD to_wchar_size(DWORD byte_size) { |
| // Mask to pull WOW64 access flags out of REGSAM access. |
| const REGSAM kWow64AccessMask = KEY_WOW64_32KEY | KEY_WOW64_64KEY; |
| +#if DCHECK_IS_ON() |
| +inline bool isValidRootKey(HKEY key) { |
| + return key == HKEY_CLASSES_ROOT || key == HKEY_CURRENT_USER || |
| + key == HKEY_LOCAL_MACHINE || key == HKEY_USERS || |
| + key == HKEY_PERFORMANCE_DATA || key == HKEY_PERFORMANCE_TEXT || |
| + key == HKEY_PERFORMANCE_NLSTEXT || key == HKEY_CURRENT_CONFIG || |
| + key == HKEY_DYN_DATA || key == HKEY_CURRENT_USER_LOCAL_SETTINGS; |
| +} |
| +#endif // DCHECK_IS_ON() |
| + |
| } // namespace |
| // Watches for modifications to a key. |
| @@ -42,6 +52,9 @@ class RegKey::Watcher : public ObjectWatcher::Delegate { |
| Watcher() {} |
| ~Watcher() override {} |
| + Watcher(Watcher&&) = default; |
| + Watcher& operator=(Watcher&&) = default; |
| + |
| bool StartWatching(HKEY key, const ChangeCallback& callback); |
| // Implementation of ObjectWatcher::Delegate. |
| @@ -91,7 +104,8 @@ bool RegKey::Watcher::StartWatching(HKEY key, const ChangeCallback& callback) { |
| RegKey::RegKey() : key_(NULL), wow64access_(0) { |
| } |
| -RegKey::RegKey(HKEY key) : key_(key), wow64access_(0) { |
| +RegKey::RegKey(HKEY rootkey) : key_(rootkey), wow64access_(0) { |
| + DCHECK(isValidRootKey(rootkey)); |
| } |
| RegKey::RegKey(HKEY rootkey, const wchar_t* subkey, REGSAM access) |
| @@ -112,7 +126,12 @@ RegKey::~RegKey() { |
| Close(); |
| } |
| +RegKey::RegKey(RegKey&&) = default; |
| + |
| +RegKey& RegKey::operator=(RegKey&&) = default; |
| + |
| LONG RegKey::Create(HKEY rootkey, const wchar_t* subkey, REGSAM access) { |
| + DCHECK(isValidRootKey(rootkey)); |
| DWORD disposition_value; |
| return CreateWithDisposition(rootkey, subkey, &disposition_value, access); |
| } |
| @@ -120,6 +139,7 @@ LONG RegKey::Create(HKEY rootkey, const wchar_t* subkey, REGSAM access) { |
| LONG RegKey::CreateWithDisposition(HKEY rootkey, const wchar_t* subkey, |
| DWORD* disposition, REGSAM access) { |
| DCHECK(rootkey && subkey && access && disposition); |
| + DCHECK(isValidRootKey(rootkey)); |
| HKEY subhkey = NULL; |
| LONG result = RegCreateKeyEx(rootkey, subkey, 0, NULL, |
| REG_OPTION_NON_VOLATILE, access, NULL, &subhkey, |
| @@ -135,6 +155,7 @@ LONG RegKey::CreateWithDisposition(HKEY rootkey, const wchar_t* subkey, |
| LONG RegKey::CreateKey(const wchar_t* name, REGSAM access) { |
| DCHECK(name && access); |
| + DCHECK(key_); |
|
grt (UTC plus 2)
2017/06/29 08:49:47
i'm not sure about this. when you don't care about
|
| // After the application has accessed an alternate registry view using one of |
| // the [KEY_WOW64_32KEY / KEY_WOW64_64KEY] flags, all subsequent operations |
| // (create, delete, or open) on child registry keys must explicitly use the |
| @@ -158,6 +179,7 @@ LONG RegKey::CreateKey(const wchar_t* name, REGSAM access) { |
| LONG RegKey::Open(HKEY rootkey, const wchar_t* subkey, REGSAM access) { |
| DCHECK(rootkey && subkey && access); |
| + DCHECK(isValidRootKey(rootkey)); |
| HKEY subhkey = NULL; |
| LONG result = RegOpenKeyEx(rootkey, subkey, 0, access, &subhkey); |
| @@ -172,6 +194,7 @@ LONG RegKey::Open(HKEY rootkey, const wchar_t* subkey, REGSAM access) { |
| LONG RegKey::OpenKey(const wchar_t* relative_key_name, REGSAM access) { |
| DCHECK(relative_key_name && access); |
| + DCHECK(key_); |
| // After the application has accessed an alternate registry view using one of |
| // the [KEY_WOW64_32KEY / KEY_WOW64_64KEY] flags, all subsequent operations |
| // (create, delete, or open) on child registry keys must explicitly use the |
| @@ -202,26 +225,13 @@ void RegKey::Close() { |
| } |
| } |
| -// TODO(wfh): Remove this and other unsafe methods. See http://crbug.com/375400 |
| -void RegKey::Set(HKEY key) { |
| - if (key_ != key) { |
| - Close(); |
| - key_ = key; |
| - } |
| -} |
| - |
| -HKEY RegKey::Take() { |
| - DCHECK_EQ(wow64access_, 0u); |
| - HKEY key = key_; |
| - key_ = NULL; |
| - return key; |
| -} |
| - |
| bool RegKey::HasValue(const wchar_t* name) const { |
| + DCHECK(key_); |
| return RegQueryValueEx(key_, name, 0, NULL, NULL, NULL) == ERROR_SUCCESS; |
| } |
| DWORD RegKey::GetValueCount() const { |
| + DCHECK(key_); |
| DWORD count = 0; |
| LONG result = RegQueryInfoKey(key_, NULL, 0, NULL, NULL, NULL, NULL, &count, |
| NULL, NULL, NULL, NULL); |
| @@ -229,6 +239,7 @@ DWORD RegKey::GetValueCount() const { |
| } |
| LONG RegKey::GetValueNameAt(int index, std::wstring* name) const { |
| + DCHECK(key_); |
| wchar_t buf[256]; |
| DWORD bufsize = arraysize(buf); |
| LONG r = ::RegEnumValue(key_, index, buf, &bufsize, NULL, NULL, NULL, NULL); |
| @@ -353,6 +364,7 @@ LONG RegKey::ReadValue(const wchar_t* name, |
| void* data, |
| DWORD* dsize, |
| DWORD* dtype) const { |
| + DCHECK(key_); |
| LONG result = RegQueryValueEx(key_, name, 0, dtype, |
| reinterpret_cast<LPBYTE>(data), dsize); |
| return result; |
| @@ -404,6 +416,7 @@ LONG RegKey::WriteValue(const wchar_t* name, |
| DWORD dsize, |
| DWORD dtype) { |
| DCHECK(data || !dsize); |
| + DCHECK(key_); |
| LONG result = RegSetValueEx(key_, name, 0, dtype, |
| reinterpret_cast<LPBYTE>(const_cast<void*>(data)), dsize); |
| @@ -621,6 +634,7 @@ RegistryKeyIterator::~RegistryKeyIterator() { |
| } |
| DWORD RegistryKeyIterator::SubkeyCount() const { |
| + DCHECK(key_); |
| DWORD count = 0; |
| LONG result = ::RegQueryInfoKey(key_, NULL, 0, NULL, &count, NULL, NULL, |
| NULL, NULL, NULL, NULL, NULL); |