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

Side by Side Diff: chrome_elf/nt_registry/nt_registry.h

Issue 2507263002: Make nt_registry Create/OpenRegKey return a scoped object
Patch Set: fixes Created 3 years, 10 months 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // This API is a usability layer for direct registry access via NTDLL. 5 // This API is a usability layer for direct registry access via NTDLL.
6 // It allows for "advapi32-free" registry access, which is especially 6 // It allows for "advapi32-free" registry access, which is especially
7 // useful for accessing registy from DllMain (holding loader lock), 7 // useful for accessing registy from DllMain (holding loader lock),
8 // or if a dependency on/linkage of ADVAPI32.dll is not desired. 8 // or if a dependency on/linkage of ADVAPI32.dll is not desired.
9 9
10 // The implementation of this API should only use ntdll and kernel32 system 10 // The implementation of this API should only use ntdll and kernel32 system
(...skipping 27 matching lines...) Expand all
38 typedef enum _ROOT_KEY { AUTO = 0, HKLM, HKCU } ROOT_KEY; 38 typedef enum _ROOT_KEY { AUTO = 0, HKLM, HKCU } ROOT_KEY;
39 39
40 // Used with wrapper functions to request registry redirection override. 40 // Used with wrapper functions to request registry redirection override.
41 // Maps to KEY_WOW64_32KEY and KEY_WOW64_64KEY access flags. 41 // Maps to KEY_WOW64_32KEY and KEY_WOW64_64KEY access flags.
42 enum WOW64_OVERRIDE { 42 enum WOW64_OVERRIDE {
43 NONE = 0L, 43 NONE = 0L,
44 WOW6432 = KEY_WOW64_32KEY, 44 WOW6432 = KEY_WOW64_32KEY,
45 WOW6464 = KEY_WOW64_64KEY 45 WOW6464 = KEY_WOW64_64KEY
46 }; 46 };
47 47
48 // ScopedHANDLE wraps a generic Windows HANDLE (with an invalid value of
49 // nullptr), allowing it to be closed automatically (via NtClose) when the
50 // object goes out of scope. Use is_valid() function to check validity of
51 // internal HANDLE. This class may not be used with HANDLEs that have an invalid
52 // value of INVALID_HANDLE_VALUE (e.g. CreateFile()).
53 class ScopedHANDLE {
54 public:
55 ScopedHANDLE();
56 explicit ScopedHANDLE(HANDLE handle);
57 ScopedHANDLE(ScopedHANDLE&& rvalue) : handle_(rvalue.release()) {}
58 ScopedHANDLE(const ScopedHANDLE&) = delete;
59 void operator=(const ScopedHANDLE&) = delete;
60 ~ScopedHANDLE();
61
62 HANDLE get() { return handle_; }
63 bool is_valid() const;
64
65 private:
66 // Transfers ownership. If the returned is non-null, it needs to be closed by
67 // the caller.
68 HANDLE release();
69
70 HANDLE handle_;
71 };
72
48 //------------------------------------------------------------------------------ 73 //------------------------------------------------------------------------------
49 // Create, open, delete, close functions 74 // Create, open, delete, close functions
50 //------------------------------------------------------------------------------ 75 //------------------------------------------------------------------------------
51 76
52 // Create and/or open a registry key. 77 // Create and/or open a registry key.
53 // - This function will recursively create multiple sub-keys if required for 78 // - This function will recursively create multiple sub-keys if required for
54 // |key_path|. 79 // |key_path|.
55 // - If the key doesn't need to be left open, pass in nullptr for |out_handle|.
56 // - This function will happily succeed if the key already exists. 80 // - This function will happily succeed if the key already exists.
57 // - Optional |out_handle|. If nullptr, function will close handle when done. 81 // - Optional |out_handle|. If nullptr, function will close handle when done.
58 // Otherwise, will hold the open handle to the deepest subkey. 82 // - On success, the returned object will hold the open handle to the deepest
59 // - Caller must call CloseRegKey on returned handle (on success). 83 // subkey.
60 bool CreateRegKey(ROOT_KEY root, 84 ScopedHANDLE CreateRegKey(ROOT_KEY root,
61 const wchar_t* key_path, 85 const wchar_t* key_path,
62 ACCESS_MASK access, 86 ACCESS_MASK access);
63 HANDLE* out_handle OPTIONAL);
64 87
65 // Open existing registry key. 88 // Open existing registry key.
66 // - Caller must call CloseRegKey on returned handle (on success). 89 // - Optional error code can be returned on failure for extra detail. This will
67 // - Optional error code can be returned on failure for extra detail. 90 // be set if the returned ScopedHANDLE.is_valid() == false.
68 bool OpenRegKey(ROOT_KEY root, 91 ScopedHANDLE OpenRegKey(ROOT_KEY root,
69 const wchar_t* key_path, 92 const wchar_t* key_path,
70 ACCESS_MASK access, 93 ACCESS_MASK access,
71 HANDLE* out_handle, 94 NTSTATUS* error_code OPTIONAL);
72 NTSTATUS* error_code OPTIONAL);
73 95
74 // Delete a registry key. 96 // Delete a registry key.
75 // - Caller must still call CloseRegKey after the delete.
76 bool DeleteRegKey(HANDLE key); 97 bool DeleteRegKey(HANDLE key);
77 98
78 // Delete a registry key. 99 // Delete a registry key.
79 // - WRAPPER: Function opens and closes the target key for caller. 100 // - WRAPPER: Function opens and closes the target key for caller.
80 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE. 101 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE.
81 bool DeleteRegKey(ROOT_KEY root, 102 bool DeleteRegKey(ROOT_KEY root,
82 WOW64_OVERRIDE wow64_override, 103 WOW64_OVERRIDE wow64_override,
83 const wchar_t* key_path); 104 const wchar_t* key_path);
84 105
85 // Close a registry key handle that was opened with CreateRegKey or OpenRegKey.
86 void CloseRegKey(HANDLE key);
87
88 //------------------------------------------------------------------------------ 106 //------------------------------------------------------------------------------
89 // Getter functions 107 // Getter functions
90 //------------------------------------------------------------------------------ 108 //------------------------------------------------------------------------------
91 109
92 // Main function to query a registry value. 110 // Main function to query a registry value.
93 // - Key handle should have been opened with CreateRegKey or OpenRegKey. 111 // - Key handle should have been opened with CreateRegKey or OpenRegKey.
94 // - Types defined in winnt.h. E.g.: REG_DWORD, REG_SZ. 112 // - Types defined in winnt.h. E.g.: REG_DWORD, REG_SZ.
95 // - Caller is responsible for calling "delete[] *out_buffer" (on success). 113 // - Caller is responsible for calling "delete[] *out_buffer" (on success).
96 bool QueryRegKeyValue(HANDLE key, 114 bool QueryRegKeyValue(HANDLE key,
97 const wchar_t* value_name, 115 const wchar_t* value_name,
98 ULONG* out_type, 116 ULONG* out_type,
99 BYTE** out_buffer, 117 BYTE** out_buffer,
100 DWORD* out_size); 118 DWORD* out_size);
101 119
102 // Query DWORD value. 120 // Query DWORD value.
103 // - WRAPPER: Function works with DWORD data type. 121 // - WRAPPER: Function works with DWORD data type.
104 // - Key handle should have been opened with CreateRegKey or OpenRegKey. 122 // - Key handle should have been opened with CreateRegKey or OpenRegKey.
105 // - Handle will be left open. Caller must still call CloseRegKey when done.
106 bool QueryRegValueDWORD(HANDLE key, 123 bool QueryRegValueDWORD(HANDLE key,
107 const wchar_t* value_name, 124 const wchar_t* value_name,
108 DWORD* out_dword); 125 DWORD* out_dword);
109 126
110 // Query DWORD value. 127 // Query DWORD value.
111 // - WRAPPER: Function opens and closes the target key for caller, and works 128 // - WRAPPER: Function opens and closes the target key for caller, and works
112 // with DWORD data type. 129 // with DWORD data type.
113 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE. 130 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE.
114 bool QueryRegValueDWORD(ROOT_KEY root, 131 bool QueryRegValueDWORD(ROOT_KEY root,
115 WOW64_OVERRIDE wow64_override, 132 WOW64_OVERRIDE wow64_override,
116 const wchar_t* key_path, 133 const wchar_t* key_path,
117 const wchar_t* value_name, 134 const wchar_t* value_name,
118 DWORD* out_dword); 135 DWORD* out_dword);
119 136
120 // Query SZ (string) value. 137 // Query SZ (string) value.
121 // - WRAPPER: Function works with SZ data type. 138 // - WRAPPER: Function works with SZ data type.
122 // - Key handle should have been opened with CreateRegKey or OpenRegKey. 139 // - Key handle should have been opened with CreateRegKey or OpenRegKey.
123 // - Handle will be left open. Caller must still call CloseRegKey when done.
124 bool QueryRegValueSZ(HANDLE key, 140 bool QueryRegValueSZ(HANDLE key,
125 const wchar_t* value_name, 141 const wchar_t* value_name,
126 std::wstring* out_sz); 142 std::wstring* out_sz);
127 143
128 // Query SZ (string) value. 144 // Query SZ (string) value.
129 // - WRAPPER: Function opens and closes the target key for caller, and works 145 // - WRAPPER: Function opens and closes the target key for caller, and works
130 // with SZ data type. 146 // with SZ data type.
131 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE. 147 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE.
132 bool QueryRegValueSZ(ROOT_KEY root, 148 bool QueryRegValueSZ(ROOT_KEY root,
133 WOW64_OVERRIDE wow64_override, 149 WOW64_OVERRIDE wow64_override,
134 const wchar_t* key_path, 150 const wchar_t* key_path,
135 const wchar_t* value_name, 151 const wchar_t* value_name,
136 std::wstring* out_sz); 152 std::wstring* out_sz);
137 153
138 // Query MULTI_SZ (multiple strings) value. 154 // Query MULTI_SZ (multiple strings) value.
139 // - WRAPPER: Function works with MULTI_SZ data type. 155 // - WRAPPER: Function works with MULTI_SZ data type.
140 // - Key handle should have been opened with CreateRegKey or OpenRegKey. 156 // - Key handle should have been opened with CreateRegKey or OpenRegKey.
141 // - Handle will be left open. Caller must still call CloseRegKey when done.
142 bool QueryRegValueMULTISZ(HANDLE key, 157 bool QueryRegValueMULTISZ(HANDLE key,
143 const wchar_t* value_name, 158 const wchar_t* value_name,
144 std::vector<std::wstring>* out_multi_sz); 159 std::vector<std::wstring>* out_multi_sz);
145 160
146 // Query MULTI_SZ (multiple strings) value. 161 // Query MULTI_SZ (multiple strings) value.
147 // - WRAPPER: Function opens and closes the target key for caller, and works 162 // - WRAPPER: Function opens and closes the target key for caller, and works
148 // with MULTI_SZ data type. 163 // with MULTI_SZ data type.
149 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE. 164 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE.
150 bool QueryRegValueMULTISZ(ROOT_KEY root, 165 bool QueryRegValueMULTISZ(ROOT_KEY root,
151 WOW64_OVERRIDE wow64_override, 166 WOW64_OVERRIDE wow64_override,
(...skipping 10 matching lines...) Expand all
162 // - Types defined in winnt.h. E.g.: REG_DWORD, REG_SZ. 177 // - Types defined in winnt.h. E.g.: REG_DWORD, REG_SZ.
163 bool SetRegKeyValue(HANDLE key, 178 bool SetRegKeyValue(HANDLE key,
164 const wchar_t* value_name, 179 const wchar_t* value_name,
165 ULONG type, 180 ULONG type,
166 const BYTE* data, 181 const BYTE* data,
167 DWORD data_size); 182 DWORD data_size);
168 183
169 // Set DWORD value. 184 // Set DWORD value.
170 // - WRAPPER: Function works with DWORD data type. 185 // - WRAPPER: Function works with DWORD data type.
171 // - Key handle should have been opened with CreateRegKey or OpenRegKey. 186 // - Key handle should have been opened with CreateRegKey or OpenRegKey.
172 // - Handle will be left open. Caller must still call CloseRegKey when done.
173 bool SetRegValueDWORD(HANDLE key, const wchar_t* value_name, DWORD value); 187 bool SetRegValueDWORD(HANDLE key, const wchar_t* value_name, DWORD value);
174 188
175 // Set DWORD value. 189 // Set DWORD value.
176 // - WRAPPER: Function opens and closes the target key for caller, and works 190 // - WRAPPER: Function opens and closes the target key for caller, and works
177 // with DWORD data type. 191 // with DWORD data type.
178 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE. 192 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE.
179 bool SetRegValueDWORD(ROOT_KEY root, 193 bool SetRegValueDWORD(ROOT_KEY root,
180 WOW64_OVERRIDE wow64_override, 194 WOW64_OVERRIDE wow64_override,
181 const wchar_t* key_path, 195 const wchar_t* key_path,
182 const wchar_t* value_name, 196 const wchar_t* value_name,
183 DWORD value); 197 DWORD value);
184 198
185 // Set SZ (string) value. 199 // Set SZ (string) value.
186 // - WRAPPER: Function works with SZ data type. 200 // - WRAPPER: Function works with SZ data type.
187 // - Key handle should have been opened with CreateRegKey or OpenRegKey. 201 // - Key handle should have been opened with CreateRegKey or OpenRegKey.
188 // - Handle will be left open. Caller must still call CloseRegKey when done.
189 bool SetRegValueSZ(HANDLE key, 202 bool SetRegValueSZ(HANDLE key,
190 const wchar_t* value_name, 203 const wchar_t* value_name,
191 const std::wstring& value); 204 const std::wstring& value);
192 205
193 // Set SZ (string) value. 206 // Set SZ (string) value.
194 // - WRAPPER: Function opens and closes the target key for caller, and works 207 // - WRAPPER: Function opens and closes the target key for caller, and works
195 // with SZ data type. 208 // with SZ data type.
196 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE. 209 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE.
197 bool SetRegValueSZ(ROOT_KEY root, 210 bool SetRegValueSZ(ROOT_KEY root,
198 WOW64_OVERRIDE wow64_override, 211 WOW64_OVERRIDE wow64_override,
199 const wchar_t* key_path, 212 const wchar_t* key_path,
200 const wchar_t* value_name, 213 const wchar_t* value_name,
201 const std::wstring& value); 214 const std::wstring& value);
202 215
203 // Set MULTI_SZ (multiple strings) value. 216 // Set MULTI_SZ (multiple strings) value.
204 // - WRAPPER: Function works with MULTI_SZ data type. 217 // - WRAPPER: Function works with MULTI_SZ data type.
205 // - Key handle should have been opened with CreateRegKey or OpenRegKey. 218 // - Key handle should have been opened with CreateRegKey or OpenRegKey.
206 // - Handle will be left open. Caller must still call CloseRegKey when done.
207 bool SetRegValueMULTISZ(HANDLE key, 219 bool SetRegValueMULTISZ(HANDLE key,
208 const wchar_t* value_name, 220 const wchar_t* value_name,
209 const std::vector<std::wstring>& values); 221 const std::vector<std::wstring>& values);
210 222
211 // Set MULTI_SZ (multiple strings) value. 223 // Set MULTI_SZ (multiple strings) value.
212 // - WRAPPER: Function opens and closes the target key for caller, and works 224 // - WRAPPER: Function opens and closes the target key for caller, and works
213 // with MULTI_SZ data type. 225 // with MULTI_SZ data type.
214 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE. 226 // - Use |wow64_override| to force redirection behaviour, or pass nt::NONE.
215 bool SetRegValueMULTISZ(ROOT_KEY root, 227 bool SetRegValueMULTISZ(ROOT_KEY root,
216 WOW64_OVERRIDE wow64_override, 228 WOW64_OVERRIDE wow64_override,
(...skipping 13 matching lines...) Expand all
230 242
231 // Setter function for test suites that use reg redirection. 243 // Setter function for test suites that use reg redirection.
232 bool SetTestingOverride(ROOT_KEY root, const std::wstring& new_path); 244 bool SetTestingOverride(ROOT_KEY root, const std::wstring& new_path);
233 245
234 // Getter function for test suites that use reg redirection. 246 // Getter function for test suites that use reg redirection.
235 std::wstring GetTestingOverride(ROOT_KEY root); 247 std::wstring GetTestingOverride(ROOT_KEY root);
236 248
237 }; // namespace nt 249 }; // namespace nt
238 250
239 #endif // CHROME_ELF_NT_REGISTRY_NT_REGISTRY_H_ 251 #endif // CHROME_ELF_NT_REGISTRY_NT_REGISTRY_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698