public static ThreadInfo[] EnumThreads(int pid = -1) { using (var handle = Win32.CreateToolhelp32Snapshot(CreateToolhelpSnapshotFlags.SnapThread)) { if (handle.DangerousGetHandle() == Win32.InvalidFileHandle) { throw new Win32Exception(Marshal.GetLastWin32Error()); } var threads = new List <ThreadInfo>(1024); var te = new ThreadEntry(); te.Init(); if (!Win32.Thread32First(handle, ref te)) { return(null); } do { if (pid >= 0 && te.ProcessId != pid) { continue; } if (te.ThreadId != 0) { threads.Add(new ThreadInfo(te)); } } while (Win32.Thread32Next(handle, ref te)); return(threads.ToArray()); } }
internal static extern bool Thread32Next(SafeFileHandle hSnapshot, ref ThreadEntry pe);
internal ThreadInformation(ThreadEntry entry) { _entry = entry; }
internal ThreadInfo(ThreadEntry entry) { _entry = entry; }