Index: util/win/process_info_test.cc |
diff --git a/util/win/process_info_test.cc b/util/win/process_info_test.cc |
index ce9e8ac7a53a5b248427b770060f750d2f86431c..03382fbb97d59fd5b8393f00b569322a45b214ee 100644 |
--- a/util/win/process_info_test.cc |
+++ b/util/win/process_info_test.cc |
@@ -20,8 +20,12 @@ |
#include "base/files/file_path.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/rand_util.h" |
+#include "base/strings/stringprintf.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "build/build_config.h" |
#include "gtest/gtest.h" |
+#include "test/scoped_temp_dir.h" |
#include "test/paths.h" |
#include "test/win/child_launcher.h" |
#include "util/file/file_io.h" |
@@ -510,6 +514,84 @@ TEST(ProcessInfo, ReadableRanges) { |
&bytes_read)); |
} |
+struct ScopedRegistryKeyCloseTraits { |
+ static HKEY InvalidValue() { |
+ return nullptr; |
+ } |
+ static void Free(HKEY key) { |
+ RegCloseKey(key); |
+ } |
+}; |
+using ScopedRegistryKey = |
+ base::ScopedGeneric<HKEY, ScopedRegistryKeyCloseTraits>; |
+ |
+TEST(ProcessInfo, Handles) { |
+ ScopedTempDir temp_dir; |
+ ScopedFileHandle file(LoggingOpenFileForWrite( |
+ temp_dir.path().Append(FILE_PATH_LITERAL("test_file")), |
+ FileWriteMode::kTruncateOrCreate, |
+ FilePermissions::kWorldReadable)); |
+ ASSERT_TRUE(file.is_valid()); |
+ |
+ HKEY key; |
+ ASSERT_EQ(ERROR_SUCCESS, |
+ RegOpenKeyEx( |
+ HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft", 0, KEY_READ, &key)); |
+ ScopedRegistryKey scoped_key(key); |
+ ASSERT_TRUE(scoped_key.is_valid()); |
+ |
+ std::wstring mapping_name = |
+ base::UTF8ToUTF16(base::StringPrintf("Global\\test_mapping_%d_%I64x", |
+ GetCurrentProcessId(), |
+ base::RandUint64())); |
+ ScopedKernelHANDLE mapping(CreateFileMapping(INVALID_HANDLE_VALUE, |
+ nullptr, |
+ PAGE_READWRITE, |
+ 0, |
+ 1024, |
+ mapping_name.c_str())); |
+ ASSERT_TRUE(mapping.is_valid()); |
+ |
+ ProcessInfo info; |
+ info.Initialize(GetCurrentProcess()); |
+ bool found_file_handle = false; |
+ bool found_key_handle = false; |
+ bool found_mapping_handle = false; |
+ for (auto handle : info.Handles()) { |
+ if (reinterpret_cast<uint32_t>(file.get()) == handle.handle) { |
+ EXPECT_FALSE(found_file_handle); |
+ found_file_handle = true; |
+ EXPECT_EQ(L"File", handle.type_name); |
+ EXPECT_EQ(1, handle.handle_count); |
+ EXPECT_EQ(STANDARD_RIGHTS_READ | STANDARD_RIGHTS_WRITE | SYNCHRONIZE, |
+ handle.granted_access & STANDARD_RIGHTS_ALL); |
+ EXPECT_EQ(0, handle.attributes); |
Mark Mentovai
2015/10/15 05:25:17
Can we reason about pointer_count for any of these
Mark Mentovai
2015/10/15 05:25:17
Not critical, but can we at least conjure up one H
scottmg
2015/10/15 21:38:45
So conjured!
scottmg
2015/10/15 21:38:45
They seem reasonable-ish on XP (1s and 2s), but on
Mark Mentovai
2015/10/16 04:03:04
scottmg wrote:
|
+ } |
+ if (reinterpret_cast<uint32_t>(scoped_key.get()) == handle.handle) { |
+ EXPECT_FALSE(found_key_handle); |
+ found_key_handle = true; |
+ EXPECT_EQ(L"Key", handle.type_name); |
+ EXPECT_EQ(1, handle.handle_count); |
+ EXPECT_EQ(STANDARD_RIGHTS_READ, |
+ handle.granted_access & STANDARD_RIGHTS_ALL); |
+ EXPECT_EQ(0, handle.attributes); |
+ } |
+ if (reinterpret_cast<uint32_t>(mapping.get()) == handle.handle) { |
+ EXPECT_FALSE(found_mapping_handle); |
+ found_mapping_handle = true; |
+ EXPECT_EQ(L"Section", handle.type_name); |
+ EXPECT_EQ(1, handle.handle_count); |
+ EXPECT_EQ(DELETE | READ_CONTROL | WRITE_DAC | WRITE_OWNER | |
+ STANDARD_RIGHTS_READ | STANDARD_RIGHTS_WRITE, |
+ handle.granted_access & STANDARD_RIGHTS_ALL); |
+ EXPECT_EQ(0, handle.attributes); |
+ } |
+ } |
+ EXPECT_TRUE(found_file_handle); |
+ EXPECT_TRUE(found_key_handle); |
+ EXPECT_TRUE(found_mapping_handle); |
+} |
+ |
} // namespace |
} // namespace test |
} // namespace crashpad |