diff --git a/util/win/scoped_process_suspend_test.cc b/util/win/scoped_process_suspend_test.cc index 98f06433..f663d38b 100644 --- a/util/win/scoped_process_suspend_test.cc +++ b/util/win/scoped_process_suspend_test.cc @@ -20,7 +20,9 @@ #include #include "gtest/gtest.h" +#include "test/errors.h" #include "test/win/win_child_process.h" +#include "util/win/xp_compat.h" namespace crashpad { namespace test { @@ -33,23 +35,33 @@ bool SuspendCountMatches(HANDLE process, DWORD desired_suspend_count) { DWORD process_id = GetProcessId(process); ScopedKernelHANDLE snapshot(CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0)); - if (!snapshot.is_valid()) + if (!snapshot.is_valid()) { + ADD_FAILURE() << ErrorMessage("CreateToolhelp32Snapshot"); return false; + } THREADENTRY32 te; te.dwSize = sizeof(te); - if (!Thread32First(snapshot.get(), &te)) + + BOOL ret = Thread32First(snapshot.get(), &te); + if (!ret) { + ADD_FAILURE() << ErrorMessage("Thread32First"); return false; + } do { if (te.dwSize >= offsetof(THREADENTRY32, th32OwnerProcessID) + sizeof(te.th32OwnerProcessID) && te.th32OwnerProcessID == process_id) { ScopedKernelHANDLE thread( - OpenThread(THREAD_ALL_ACCESS, false, te.th32ThreadID)); + OpenThread(kXPThreadAllAccess, false, te.th32ThreadID)); + EXPECT_TRUE(thread.is_valid()) << ErrorMessage("OpenThread"); DWORD result = SuspendThread(thread.get()); - EXPECT_NE(result, static_cast(-1)); - if (result != static_cast(-1)) - ResumeThread(thread.get()); + EXPECT_NE(result, static_cast(-1)) + << ErrorMessage("SuspendThread"); + if (result != static_cast(-1)) { + EXPECT_NE(ResumeThread(thread.get()), static_cast(-1)) + << ErrorMessage("ResumeThread"); + } if (result != desired_suspend_count) return false; } diff --git a/util/win/xp_compat.h b/util/win/xp_compat.h index 1501f3c5..7c62e41b 100644 --- a/util/win/xp_compat.h +++ b/util/win/xp_compat.h @@ -25,7 +25,14 @@ enum { //! Requesting `PROCESS_ALL_ACCESS` with the value defined when building //! against a Vista+ SDK results in `ERROR_ACCESS_DENIED` when running on XP. //! See https://msdn.microsoft.com/en-ca/library/windows/desktop/ms684880.aspx - kXPProcessAllAccess = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF + kXPProcessAllAccess = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF, + + //! \brief This is the XP-suitable value of `THREAD_ALL_ACCESS`. + //! + //! Requesting `THREAD_ALL_ACCESS` with the value defined when building + //! against a Vista+ SDK results in `ERROR_ACCESS_DENIED` when running on XP. + //! See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686769.aspx + kXPThreadAllAccess = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF, }; } // namespace crashpad