Index: sandbox/win/tools/finder/finder_registry.cc |
diff --git a/sandbox/win/tools/finder/finder_registry.cc b/sandbox/win/tools/finder/finder_registry.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a84e413d326ea0ce2dc1bbeb7881cda2f971a702 |
--- /dev/null |
+++ b/sandbox/win/tools/finder/finder_registry.cc |
@@ -0,0 +1,93 @@ |
+// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "sandbox/win/src/restricted_token.h" |
+#include "sandbox/win/src/restricted_token_utils.h" |
+#include "sandbox/win/tools/finder/finder.h" |
+ |
+DWORD Finder::ParseRegistry(HKEY key, ATL::CString print_name) { |
+ DWORD index = 0; |
+ DWORD name_size = 2048; |
+ wchar_t buffer[2048] = {0}; |
+ // TODO(nsylvain): Don't hardcode 2048. Get the key len by calling the |
+ // function. |
+ LONG err_code = ::RegEnumKey(key, index, buffer, name_size); |
+ while (ERROR_SUCCESS == err_code) { |
+ ATL::CString name_complete = print_name + buffer + L"\\"; |
+ TestRegAccess(key, buffer, name_complete); |
+ |
+ // Call the function recursively to parse all subkeys |
+ HKEY key_to_parse; |
+ err_code = ::RegOpenKeyEx(key, buffer, 0, KEY_ENUMERATE_SUB_KEYS, |
+ &key_to_parse); |
+ if (ERROR_SUCCESS == err_code) { |
+ ParseRegistry(key_to_parse, name_complete); |
+ ::RegCloseKey(key_to_parse); |
+ } else { |
+ registry_stats_[BROKEN]++; |
+ Output(REG_ERR, err_code, name_complete); |
+ } |
+ |
+ index++; |
+ err_code = ::RegEnumKey(key, index, buffer, name_size); |
+ } |
+ |
+ if (ERROR_NO_MORE_ITEMS != err_code) { |
+ registry_stats_[BROKEN]++; |
+ Output(REG_ERR, err_code, print_name); |
+ } |
+ |
+ return ERROR_SUCCESS; |
+} |
+ |
+DWORD Finder::TestRegAccess(HKEY key, ATL::CString name, |
+ ATL::CString print_name) { |
+ Impersonater impersonate(token_handle_); |
+ |
+ registry_stats_[PARSE]++; |
+ |
+ HKEY key_res; |
+ LONG err_code = 0; |
+ |
+ if (access_type_ & kTestForAll) { |
+ err_code = ::RegOpenKeyEx(key, name, 0, GENERIC_ALL, &key_res); |
+ if (ERROR_SUCCESS == err_code) { |
+ registry_stats_[ALL]++; |
+ Output(REG, L"R/W", print_name); |
+ ::RegCloseKey(key_res); |
+ return GENERIC_ALL; |
+ } else if (err_code != ERROR_ACCESS_DENIED) { |
+ Output(REG_ERR, err_code, print_name); |
+ registry_stats_[BROKEN]++; |
+ } |
+ } |
+ |
+ if (access_type_ & kTestForWrite) { |
+ err_code = ::RegOpenKeyEx(key, name, 0, GENERIC_WRITE, &key_res); |
+ if (ERROR_SUCCESS == err_code) { |
+ registry_stats_[WRITE]++; |
+ Output(REG, L"W", print_name); |
+ ::RegCloseKey(key_res); |
+ return GENERIC_WRITE; |
+ } else if (err_code != ERROR_ACCESS_DENIED) { |
+ Output(REG_ERR, err_code, print_name); |
+ registry_stats_[BROKEN]++; |
+ } |
+ } |
+ |
+ if (access_type_ & kTestForRead) { |
+ err_code = ::RegOpenKeyEx(key, name, 0, GENERIC_READ, &key_res); |
+ if (ERROR_SUCCESS == err_code) { |
+ registry_stats_[READ]++; |
+ Output(REG, L"R", print_name); |
+ ::RegCloseKey(key_res); |
+ return GENERIC_READ; |
+ } else if (err_code != ERROR_ACCESS_DENIED) { |
+ Output(REG_ERR, err_code, print_name); |
+ registry_stats_[BROKEN]++; |
+ } |
+ } |
+ |
+ return 0; |
+} |