Adds RemoteThread, ThreadFactory (enumeration, main-thread selection, get-by-id), and FrozenThread scoped freeze. Supports suspend/resume, 32/64-bit context round-trip, TEB query, and reverse-order resume on dispose. Closes section 2 of add-thread-region-finder.
62 lines
1.8 KiB
C#
62 lines
1.8 KiB
C#
using System.Linq;
|
|
using System.Threading;
|
|
using SysThread = System.Threading.Thread;
|
|
using WhiteMagic;
|
|
using WhiteMagic.Native;
|
|
using WhiteMagic.Thread;
|
|
using Xunit;
|
|
|
|
namespace WhiteMagicTest.Thread;
|
|
|
|
/// <summary>
|
|
/// Tests for <see cref="ThreadFactory"/> enumeration and main-thread selection.
|
|
/// </summary>
|
|
public sealed class ThreadFactoryTests
|
|
{
|
|
[Fact]
|
|
public void Enumerate_returns_only_target_threads()
|
|
{
|
|
using var magic = Magic.OpenInProcess();
|
|
var factory = new ThreadFactory(magic.Memory);
|
|
|
|
int currentOsId = (int)NativeMethods.GetCurrentThreadId();
|
|
var ids = factory.Enumerate().Select(t => t.Id).ToList();
|
|
|
|
Assert.True(ids.Count > 0);
|
|
Assert.Contains(currentOsId, ids);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetThreadById_returns_matching_thread()
|
|
{
|
|
using var magic = Magic.OpenInProcess();
|
|
var factory = new ThreadFactory(magic.Memory);
|
|
|
|
int currentOsId = (int)NativeMethods.GetCurrentThreadId();
|
|
using RemoteThread thread = factory.GetThreadById(currentOsId);
|
|
Assert.Equal(currentOsId, thread.Id);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetThreadById_throws_for_nonexistent_thread()
|
|
{
|
|
using var magic = Magic.OpenInProcess();
|
|
var factory = new ThreadFactory(magic.Memory);
|
|
|
|
Assert.Throws<InvalidOperationException>(() => factory.GetThreadById(0x7FFFFFFF));
|
|
}
|
|
|
|
[Fact]
|
|
public void MainThread_returns_a_thread_belonging_to_the_target()
|
|
{
|
|
using var magic = Magic.OpenInProcess();
|
|
var factory = new ThreadFactory(magic.Memory);
|
|
|
|
using RemoteThread main = factory.MainThread;
|
|
Assert.NotNull(main);
|
|
|
|
var ids = factory.Enumerate().Select(t => t.Id).ToList();
|
|
Assert.Contains(main.Id, ids);
|
|
}
|
|
}
|