| Index: snapshot/win/process_reader_win_test.cc | 
| diff --git a/snapshot/win/process_reader_win_test.cc b/snapshot/win/process_reader_win_test.cc | 
| index 23306315522acd4e1dc5f45bd9e6ccf0e1640c1a..1cb4bdda51ad37efe98fdc25f256adaf9cbcf352 100644 | 
| --- a/snapshot/win/process_reader_win_test.cc | 
| +++ b/snapshot/win/process_reader_win_test.cc | 
| @@ -19,6 +19,7 @@ | 
|  | 
| #include "gtest/gtest.h" | 
| #include "test/win/win_multiprocess.h" | 
| +#include "util/win/scoped_process_suspend.h" | 
|  | 
| namespace crashpad { | 
| namespace test { | 
| @@ -26,7 +27,8 @@ namespace { | 
|  | 
| TEST(ProcessReaderWin, SelfBasic) { | 
| ProcessReaderWin process_reader; | 
| -  ASSERT_TRUE(process_reader.Initialize(GetCurrentProcess())); | 
| +  ASSERT_TRUE(process_reader.Initialize(GetCurrentProcess(), | 
| +                                        ProcessSuspensionState::kRunning)); | 
|  | 
| #if !defined(ARCH_CPU_64_BITS) | 
| EXPECT_FALSE(process_reader.Is64Bit()); | 
| @@ -55,7 +57,8 @@ class ProcessReaderChild final : public WinMultiprocess { | 
| private: | 
| void WinMultiprocessParent() override { | 
| ProcessReaderWin process_reader; | 
| -    ASSERT_TRUE(process_reader.Initialize(ChildProcess())); | 
| +    ASSERT_TRUE(process_reader.Initialize(ChildProcess(), | 
| +                                          ProcessSuspensionState::kRunning)); | 
|  | 
| #if !defined(ARCH_CPU_64_BITS) | 
| EXPECT_FALSE(process_reader.Is64Bit()); | 
| @@ -90,7 +93,8 @@ TEST(ProcessReaderWin, ChildBasic) { | 
|  | 
| TEST(ProcessReaderWin, SelfOneThread) { | 
| ProcessReaderWin process_reader; | 
| -  ASSERT_TRUE(process_reader.Initialize(GetCurrentProcess())); | 
| +  ASSERT_TRUE(process_reader.Initialize(GetCurrentProcess(), | 
| +                                        ProcessSuspensionState::kRunning)); | 
|  | 
| const std::vector<ProcessReaderWin::Thread>& threads = | 
| process_reader.Threads(); | 
| @@ -110,6 +114,56 @@ TEST(ProcessReaderWin, SelfOneThread) { | 
| EXPECT_EQ(0, threads[0].suspend_count); | 
| } | 
|  | 
| +class ProcessReaderChildThreadSuspendCount final : public WinMultiprocess { | 
| + public: | 
| +  ProcessReaderChildThreadSuspendCount() : WinMultiprocess() {} | 
| +  ~ProcessReaderChildThreadSuspendCount() {} | 
| + | 
| + private: | 
| +  void WinMultiprocessParent() override { | 
| +    { | 
| +      ProcessReaderWin process_reader; | 
| +      ASSERT_TRUE(process_reader.Initialize(ChildProcess(), | 
| +                                            ProcessSuspensionState::kRunning)); | 
| + | 
| +      const auto& threads = process_reader.Threads(); | 
| +      ASSERT_FALSE(threads.empty()); | 
| +      for (const auto& thread : threads) | 
| +        EXPECT_EQ(0u, thread.suspend_count); | 
| +    } | 
| + | 
| +    { | 
| +      ScopedProcessSuspend suspend(ChildProcess()); | 
| + | 
| +      ProcessReaderWin process_reader; | 
| +      ASSERT_TRUE(process_reader.Initialize( | 
| +          ChildProcess(), ProcessSuspensionState::kSuspended)); | 
| + | 
| +      // Confirm that thread counts are adjusted correctly for the process being | 
| +      // suspended. | 
| +      const auto& threads = process_reader.Threads(); | 
| +      ASSERT_FALSE(threads.empty()); | 
| +      for (const auto& thread : threads) | 
| +        EXPECT_EQ(0u, thread.suspend_count); | 
| +    } | 
| +  } | 
| + | 
| +  void WinMultiprocessChild() override { | 
| +    WinVMAddress address = reinterpret_cast<WinVMAddress>(kTestMemory); | 
| +    CheckedWriteFile(WritePipeHandle(), &address, sizeof(address)); | 
| + | 
| +    // Wait for the parent to signal that it's OK to exit by closing its end of | 
| +    // the pipe. | 
| +    CheckedReadFileAtEOF(ReadPipeHandle()); | 
| +  } | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(ProcessReaderChildThreadSuspendCount); | 
| +}; | 
| + | 
| +TEST(ProcessReaderWin, ChildThreadSuspendCounts) { | 
| +  WinMultiprocess::Run<ProcessReaderChildThreadSuspendCount>(); | 
| +} | 
| + | 
| }  // namespace | 
| }  // namespace test | 
| }  // namespace crashpad | 
|  |