-
Notifications
You must be signed in to change notification settings - Fork 286
Add Toolhelp32Snapshot helpers #438
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
HO-COOH
wants to merge
9
commits into
microsoft:master
Choose a base branch
from
HO-COOH:master
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 7 commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
009095d
Create stub for toolhelp32
HO-COOH 785d711
Finish implementation
HO-COOH c982bbe
Create stub for toolhelp32
HO-COOH 6ccd95b
Finish implementation
HO-COOH 76eb9f8
Remove from common_source
HO-COOH a9891ad
Merge branch 'master' of https://github.com/HO-COOH/wil
HO-COOH b946d29
Remove Toolhelp32Test from COMMON_SOURCES
HO-COOH 091494e
Fix: Suggested fixes from PR #438
HO-COOH b78d3c8
Fix test not formated
HO-COOH File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -334,3 +334,4 @@ ASALocalRun/ | |
|
|
||
| # CMake/Build output | ||
| build/ | ||
| /CMakeSettings.json | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,133 @@ | ||
| #include "resource.h" | ||
| #ifndef __WIL_TOOLHELP32_INCLUDED | ||
| #define __WIL_TOOLHELP32_INCLUDED | ||
| #include <TlHelp32.h> | ||
| #include <processthreadsapi.h> | ||
| namespace wil | ||
|
HO-COOH marked this conversation as resolved.
Outdated
|
||
| { | ||
| namespace details | ||
| { | ||
| template <typename TEntry, typename TEnumApi, typename TCallback> | ||
| void do_enum_snapshot(HANDLE handle, TEntry& entry, TEnumApi&& enumApiFirst, TEnumApi&& enumApiNext, TCallback&& callback) | ||
| { | ||
| using result_t = decltype(callback(TEntry{})); | ||
| bool enumResult = enumApiFirst(handle, &entry); | ||
| if (!enumResult) | ||
| return; | ||
|
|
||
| do | ||
| { | ||
| if constexpr (wistd::is_void_v<result_t>) | ||
| { | ||
| callback(entry); | ||
| } | ||
| else if constexpr (wistd::is_same_v<result_t, bool>) | ||
| { | ||
| if (callback(entry)) | ||
| return; | ||
| } | ||
| else | ||
| { | ||
| static_assert( | ||
| [] { | ||
| return false; | ||
| }(), | ||
| "Callback must return void or bool"); | ||
| } | ||
| enumResult = enumApiNext(handle, &entry); | ||
| } while (enumResult); | ||
| } | ||
| } // namespace details | ||
|
|
||
| template <typename TCallback> | ||
| void for_each_process(TCallback&& callback) | ||
| { | ||
| PROCESSENTRY32 entry{}; | ||
| entry.dwSize = sizeof(entry); | ||
| details::do_enum_snapshot( | ||
| unique_handle{CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)}.get(), | ||
|
HO-COOH marked this conversation as resolved.
|
||
| entry, | ||
| &Process32First, | ||
| &Process32Next, | ||
| wistd::forward<TCallback>(callback)); | ||
| } | ||
|
|
||
| template <typename TCallback> | ||
| void for_each_thread(TCallback&& callback) | ||
|
HO-COOH marked this conversation as resolved.
Outdated
|
||
| { | ||
| THREADENTRY32 entry{}; | ||
| entry.dwSize = sizeof(entry); | ||
| details::do_enum_snapshot( | ||
| unique_handle{CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0)}.get(), | ||
| entry, | ||
| &Thread32First, | ||
| &Thread32Next, | ||
| wistd::forward<TCallback>(callback)); | ||
| } | ||
|
|
||
| template <typename TCallback> | ||
| void for_each_module(TCallback&& callback, bool include32For64Bit = false) | ||
|
HO-COOH marked this conversation as resolved.
Outdated
|
||
| { | ||
| MODULEENTRY32 entry{}; | ||
| entry.dwSize = sizeof(entry); | ||
| details::do_enum_snapshot( | ||
| unique_handle{CreateToolhelp32Snapshot(include32For64Bit ? TH32CS_SNAPMODULE32 : TH32CS_SNAPMODULE, 0)}.get(), | ||
| entry, | ||
| &Module32First, | ||
| &Module32Next, | ||
| wistd::forward<TCallback>(callback)); | ||
| } | ||
|
|
||
| template <typename TCallback> | ||
| void for_each_heap_list(TCallback&& callback) | ||
| { | ||
| HEAPLIST32 entry{}; | ||
| entry.dwSize = sizeof(entry); | ||
| details::do_enum_snapshot( | ||
| unique_handle{CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST, 0)}.get(), | ||
| entry, | ||
| &Heap32ListFirst, | ||
| &Heap32ListNext, | ||
| wistd::forward<TCallback>(callback)); | ||
| } | ||
|
|
||
| template <typename TCallback> | ||
| void for_each_heap(TCallback&& callback, ULONG_PTR heapId, DWORD pid = GetCurrentProcessId()) | ||
|
HO-COOH marked this conversation as resolved.
Outdated
|
||
| { | ||
| using result_t = decltype(callback(HEAPENTRY32{})); | ||
|
|
||
| HEAPENTRY32 entry{}; | ||
| entry.dwSize = sizeof(entry); | ||
|
|
||
| bool enumResult = Heap32First(&entry, pid, heapId); | ||
| do | ||
| { | ||
| if constexpr (wistd::is_void_v<result_t>) | ||
| { | ||
| callback(entry); | ||
| } | ||
| else if constexpr (wistd::is_same_v<result_t, bool>) | ||
| { | ||
| if (callback(entry)) | ||
| return; | ||
| } | ||
| else | ||
| { | ||
| static_assert( | ||
| [] { | ||
| return false; | ||
| }(), | ||
| "Callback must return void or bool"); | ||
| } | ||
| enumResult = Heap32Next(&entry); | ||
| } while (enumResult); | ||
| } | ||
|
|
||
| template <typename TCallback> | ||
| void for_each_heap(TCallback&& callback, HEAPLIST32 const& heapList, DWORD pid = GetCurrentProcessId()) | ||
|
HO-COOH marked this conversation as resolved.
Outdated
|
||
| { | ||
| for_each_heap(wistd::forward<TCallback>(callback), heapList.th32HeapID, pid); | ||
| } | ||
| } // namespace wil | ||
|
|
||
| #endif | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| #include "common.h" | ||
| #include <WinUser.h> | ||
| #include <wil/toolhelp32.h> | ||
| #include <cstring> | ||
|
|
||
| TEST_CASE("Toolhelp32", "[EnumProcesses]") | ||
| { | ||
| wil::for_each_process([](PROCESSENTRY32 const& entry) { | ||
| REQUIRE_FALSE(std::strlen(entry.szExeFile) == 0); | ||
| }); | ||
| } | ||
|
|
||
| TEST_CASE("Toolhelp32", "[EnumModules]") | ||
| { | ||
| wil::for_each_module([](MODULEENTRY32 const& entry) { | ||
| REQUIRE_FALSE(std::strlen(entry.szExePath) == 0); | ||
| }); | ||
| } | ||
|
|
||
| TEST_CASE("Toolhelp32", "[EnumThreads]") | ||
| { | ||
| wil::for_each_thread([pid = GetCurrentProcessId()](THREADENTRY32 const& entry) { | ||
| if (entry.th32OwnerProcessID == pid) | ||
| { | ||
| REQUIRE_FALSE(entry.th32ThreadID == 0); | ||
| } | ||
| }); | ||
| } | ||
|
|
||
| TEST_CASE("Toolhelp32", "[EnumHeapLists]") | ||
| { | ||
| wil::for_each_heap_list([](HEAPLIST32 const& entry) { | ||
| REQUIRE_FALSE(entry.th32HeapID == 0); | ||
| }); | ||
| } | ||
|
|
||
| TEST_CASE("Toolhelp32", "[EnumHeap]") | ||
| { | ||
| wil::for_each_heap_list([](HEAPLIST32 const& heapListEntry) { | ||
| REQUIRE_FALSE(heapListEntry.th32HeapID == 0); | ||
| wil::for_each_heap( | ||
| [](HEAPENTRY32 const& heapEntry) { | ||
| REQUIRE_FALSE(heapEntry.dwAddress == 0); | ||
| }, | ||
| heapListEntry); | ||
| return false; | ||
| }); | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.