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..4a8a209fd988c44ca51e338ffd5828245eb77ad6 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,114 @@ 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()); |
+ |
+ SECURITY_ATTRIBUTES security_attributes = {0}; |
+ security_attributes.bInheritHandle = true; |
+ ScopedFileHandle inherited_file(CreateFile(L"CONOUT$", |
+ GENERIC_WRITE, |
+ 0, |
+ &security_attributes, |
+ OPEN_EXISTING, |
+ FILE_ATTRIBUTE_NORMAL, |
+ nullptr)); |
+ ASSERT_TRUE(inherited_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_inherited_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_NE(0u, handle.pointer_count); |
+ EXPECT_EQ(STANDARD_RIGHTS_READ | STANDARD_RIGHTS_WRITE | SYNCHRONIZE, |
+ handle.granted_access & STANDARD_RIGHTS_ALL); |
+ EXPECT_EQ(0, handle.attributes); |
+ } |
+ if (reinterpret_cast<uint32_t>(inherited_file.get()) == handle.handle) { |
+ EXPECT_FALSE(found_inherited_file_handle); |
+ found_inherited_file_handle = true; |
+ EXPECT_EQ(L"File", handle.type_name); |
+ EXPECT_EQ(1, handle.handle_count); |
+ EXPECT_NE(0u, handle.pointer_count); |
+ EXPECT_EQ(STANDARD_RIGHTS_READ | STANDARD_RIGHTS_WRITE | SYNCHRONIZE, |
+ handle.granted_access & STANDARD_RIGHTS_ALL); |
+ |
+ // OBJ_INHERIT from ntdef.h, but including that conflicts with other |
+ // headers. |
+ const int kObjInherit = 0x2; |
+ EXPECT_EQ(kObjInherit, handle.attributes); |
+ } |
+ 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_NE(0u, handle.pointer_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_NE(0u, handle.pointer_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 |