| 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..2f0852d9b701df1e863dca1e224c016f4fa94d16 100644 | 
| --- a/chrome_elf/nt_registry/nt_registry.h | 
| +++ b/chrome_elf/nt_registry/nt_registry.h | 
| @@ -45,6 +45,31 @@ enum WOW64_OVERRIDE { | 
| WOW6464 = KEY_WOW64_64KEY | 
| }; | 
|  | 
| +// ScopedHANDLE wraps a generic Windows HANDLE (with an invalid value of | 
| +// nullptr), allowing it to be closed automatically (via NtClose) when the | 
| +// object goes out of scope. Use is_valid() function to check validity of | 
| +// internal HANDLE. This class may not be used with HANDLEs that have an invalid | 
| +// value of INVALID_HANDLE_VALUE (e.g. CreateFile()). | 
| +class ScopedHANDLE { | 
| + public: | 
| +  ScopedHANDLE(); | 
| +  explicit ScopedHANDLE(HANDLE handle); | 
| +  ScopedHANDLE(ScopedHANDLE&& rvalue) : handle_(rvalue.release()) {} | 
| +  ScopedHANDLE(const ScopedHANDLE&) = delete; | 
| +  void operator=(const ScopedHANDLE&) = delete; | 
| +  ~ScopedHANDLE(); | 
| + | 
| +  HANDLE get() { return handle_; } | 
| +  bool is_valid() const; | 
| + | 
| + private: | 
| +  // Transfers ownership. If the returned is non-null, it needs to be closed by | 
| +  // the caller. | 
| +  HANDLE release(); | 
| + | 
| +  HANDLE handle_; | 
| +}; | 
| + | 
| //------------------------------------------------------------------------------ | 
| // Create, open, delete, close functions | 
| //------------------------------------------------------------------------------ | 
| @@ -52,27 +77,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. | 
| -//   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); | 
| +// - On success, the returned object will hold the open handle to the deepest | 
| +//   subkey. | 
| +ScopedHANDLE 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 ScopedHANDLE.is_valid() == false. | 
| +ScopedHANDLE 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); | 
|  | 
| // Delete a registry key. | 
| @@ -82,9 +103,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 +120,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 +137,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 +154,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 +184,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 +199,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 +216,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); | 
|  |