Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Unified Diff: chrome_elf/nt_registry/nt_registry.h

Issue 2507263002: Make nt_registry Create/OpenRegKey return a scoped object
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome_elf/nt_registry/nt_registry.h
diff --git a/chrome_elf/nt_registry/nt_registry.h b/chrome_elf/nt_registry/nt_registry.h
index 5115410bcd24359e7186b2d67f3635c663ff372f..b1de0463745d955d4943f266d8caf76e79e01391 100644
--- a/chrome_elf/nt_registry/nt_registry.h
+++ b/chrome_elf/nt_registry/nt_registry.h
@@ -45,6 +45,23 @@ enum WOW64_OVERRIDE {
WOW6464 = KEY_WOW64_64KEY
};
penny 2016/11/21 21:35:48 Please add a small class comment. " // ScopedHAND
scottmg 2016/11/22 22:47:36 Done.
+class ScopedRegKeyHANDLE {
penny 2016/11/21 21:35:47 Let's make this class generic ScopedHANDLE. Nothi
scottmg 2016/11/22 22:47:36 The INVALID_HANDLE_VALUE vs nullptr was why I didn
+ public:
+ ScopedRegKeyHANDLE();
+ explicit ScopedRegKeyHANDLE(HANDLE handle);
penny 2016/11/21 21:35:47 Just for my own c++ learnin': why did you think t
scottmg 2016/11/22 22:47:37 Yeah, it's for this. Otherwise, any old HANDLE cou
+ ScopedRegKeyHANDLE(ScopedRegKeyHANDLE&& rvalue) : handle_(rvalue.release()) {}
penny 2016/11/21 21:35:47 Why did you have to release and then set in this c
scottmg 2016/11/22 22:47:36 The ones below are =delete, so they're not impleme
+ ScopedRegKeyHANDLE(const ScopedRegKeyHANDLE&) = delete;
penny 2016/11/21 21:35:47 Did you need to add one with "const"? Is that jus
scottmg 2016/11/22 22:47:36 You kind of lost me by this point. But the operato
+ void operator=(ScopedRegKeyHANDLE&) = delete;
+ ~ScopedRegKeyHANDLE();
+
+ HANDLE get() { return handle_; }
+ bool is_valid() const { return handle_ != INVALID_HANDLE_VALUE; }
penny 2016/11/21 21:35:47 I think I'd like is_valid to *also* check for NULL
scottmg 2016/11/22 22:47:36 How about I assert for non-null? I'd prefer to kee
+ HANDLE release();
penny 2016/11/21 21:35:47 Please add tiny comment like: " // Caller is resp
scottmg 2016/11/22 22:47:36 Done. Also made it private for now, since we don't
+
+ private:
+ HANDLE handle_;
+};
+
//------------------------------------------------------------------------------
// Create, open, delete, close functions
//------------------------------------------------------------------------------
@@ -52,28 +69,23 @@ enum WOW64_OVERRIDE {
// Create and/or open a registry key.
// - This function will recursively create multiple sub-keys if required for
// |key_path|.
-// - If the key doesn't need to be left open, pass in nullptr for |out_handle|.
// - This function will happily succeed if the key already exists.
// - Optional |out_handle|. If nullptr, function will close handle when done.
penny 2016/11/21 21:35:47 Change this comment to be: // - On success, the r
scottmg 2016/11/22 22:47:36 Done.
// Otherwise, will hold the open handle to the deepest subkey.
-// - Caller must call CloseRegKey on returned handle (on success).
-bool CreateRegKey(ROOT_KEY root,
- const wchar_t* key_path,
- ACCESS_MASK access,
- HANDLE* out_handle OPTIONAL);
+ScopedRegKeyHANDLE CreateRegKey(ROOT_KEY root,
+ const wchar_t* key_path,
+ ACCESS_MASK access);
// Open existing registry key.
-// - Caller must call CloseRegKey on returned handle (on success).
-// - Optional error code can be returned on failure for extra detail.
-bool OpenRegKey(ROOT_KEY root,
- const wchar_t* key_path,
- ACCESS_MASK access,
- HANDLE* out_handle,
- NTSTATUS* error_code OPTIONAL);
+// - Optional error code can be returned on failure for extra detail. This will
+// be set if the returned ScopedRegKeyHANDLE.is_valid() == false.
+ScopedRegKeyHANDLE OpenRegKey(ROOT_KEY root,
+ const wchar_t* key_path,
+ ACCESS_MASK access,
+ NTSTATUS* error_code OPTIONAL);
// Delete a registry key.
-// - Caller must still call CloseRegKey after the delete.
-bool DeleteRegKey(HANDLE key);
+bool DeleteRegKey(HANDLE handle);
penny 2016/11/21 21:35:47 I was fine with the name change, but then I realiz
scottmg 2016/11/22 22:47:36 Oops, sorry, unintentional. I was fiddling a bit m
// Delete a registry key.
// - WRAPPER: Function opens and closes the target key for caller.
@@ -82,9 +94,6 @@ bool DeleteRegKey(ROOT_KEY root,
WOW64_OVERRIDE wow64_override,
const wchar_t* key_path);
-// Close a registry key handle that was opened with CreateRegKey or OpenRegKey.
-void CloseRegKey(HANDLE key);
-
//------------------------------------------------------------------------------
// Getter functions
//------------------------------------------------------------------------------
@@ -102,7 +111,6 @@ bool QueryRegKeyValue(HANDLE key,
// Query DWORD value.
// - WRAPPER: Function works with DWORD data type.
// - Key handle should have been opened with CreateRegKey or OpenRegKey.
-// - Handle will be left open. Caller must still call CloseRegKey when done.
bool QueryRegValueDWORD(HANDLE key,
const wchar_t* value_name,
DWORD* out_dword);
@@ -120,7 +128,6 @@ bool QueryRegValueDWORD(ROOT_KEY root,
// Query SZ (string) value.
// - WRAPPER: Function works with SZ data type.
// - Key handle should have been opened with CreateRegKey or OpenRegKey.
-// - Handle will be left open. Caller must still call CloseRegKey when done.
bool QueryRegValueSZ(HANDLE key,
const wchar_t* value_name,
std::wstring* out_sz);
@@ -138,7 +145,6 @@ bool QueryRegValueSZ(ROOT_KEY root,
// Query MULTI_SZ (multiple strings) value.
// - WRAPPER: Function works with MULTI_SZ data type.
// - Key handle should have been opened with CreateRegKey or OpenRegKey.
-// - Handle will be left open. Caller must still call CloseRegKey when done.
bool QueryRegValueMULTISZ(HANDLE key,
const wchar_t* value_name,
std::vector<std::wstring>* out_multi_sz);
@@ -169,7 +175,6 @@ bool SetRegKeyValue(HANDLE key,
// Set DWORD value.
// - WRAPPER: Function works with DWORD data type.
// - Key handle should have been opened with CreateRegKey or OpenRegKey.
-// - Handle will be left open. Caller must still call CloseRegKey when done.
bool SetRegValueDWORD(HANDLE key, const wchar_t* value_name, DWORD value);
// Set DWORD value.
@@ -185,7 +190,6 @@ bool SetRegValueDWORD(ROOT_KEY root,
// Set SZ (string) value.
// - WRAPPER: Function works with SZ data type.
// - Key handle should have been opened with CreateRegKey or OpenRegKey.
-// - Handle will be left open. Caller must still call CloseRegKey when done.
bool SetRegValueSZ(HANDLE key,
const wchar_t* value_name,
const std::wstring& value);
@@ -203,7 +207,6 @@ bool SetRegValueSZ(ROOT_KEY root,
// Set MULTI_SZ (multiple strings) value.
// - WRAPPER: Function works with MULTI_SZ data type.
// - Key handle should have been opened with CreateRegKey or OpenRegKey.
-// - Handle will be left open. Caller must still call CloseRegKey when done.
bool SetRegValueMULTISZ(HANDLE key,
const wchar_t* value_name,
const std::vector<std::wstring>& values);

Powered by Google App Engine
This is Rietveld 408576698