//////////////////////////////////////////////////////////////////////////////// // List all process threads //////////////////////////////////////////////////////////////////////////////// public bool ListThreads(int processId) { if (0 == processId) { processId = Process.GetCurrentProcess().Id; } IntPtr hSnapshot = kernel32.CreateToolhelp32Snapshot(TiHelp32.TH32CS_SNAPTHREAD, 0); if (IntPtr.Zero == hSnapshot) { Misc.GetWin32Error("CreateToolhelp32Snapshot"); return(false); } TiHelp32.tagTHREADENTRY32 threadyEntry32 = new TiHelp32.tagTHREADENTRY32() { dwSize = (uint)Marshal.SizeOf(typeof(TiHelp32.tagTHREADENTRY32)) }; if (!kernel32.Thread32First(hSnapshot, ref threadyEntry32)) { Misc.GetWin32Error("Thread32First"); return(false); } if (threadyEntry32.th32OwnerProcessID == processId) { threads.Add(threadyEntry32.th32ThreadID); } while (kernel32.Thread32Next(hSnapshot, ref threadyEntry32)) { if (threadyEntry32.th32OwnerProcessID == processId) { threads.Add(threadyEntry32.th32ThreadID); } } return(true); }
//////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////// internal static UInt32 GetMainThread(UInt32 processId) { IntPtr hThread = IntPtr.Zero; IntPtr hSnapshot = IntPtr.Zero; try { hSnapshot = kernel32.CreateToolhelp32Snapshot(TiHelp32.TH32CS_SNAPTHREAD, processId); if (IntPtr.Zero == hSnapshot) { return(0); } TiHelp32.tagTHREADENTRY32 threadEntry = new TiHelp32.tagTHREADENTRY32(); threadEntry.dwSize = (UInt32)Marshal.SizeOf(threadEntry); if (!kernel32.Thread32First(hSnapshot, ref threadEntry)) { return(0); } do { Console.WriteLine(threadEntry.th32ThreadID); hThread = kernel32.OpenThread(ntpsapi.PROCESS_ALL_ACCESS, false, threadEntry.th32ThreadID); threadEntry = new TiHelp32.tagTHREADENTRY32(); threadEntry.dwSize = (UInt32)Marshal.SizeOf(threadEntry); }while (kernel32.Thread32Next(hSnapshot, ref threadEntry)); } catch (Exception) { return(0); } finally { kernel32.CloseHandle(hSnapshot); } return(0); }
public static extern Boolean Thread32Next(IntPtr hSnapshot, ref TiHelp32.tagTHREADENTRY32 lpte);
public static extern bool Thread32First(IntPtr hSnapshot, ref TiHelp32.tagTHREADENTRY32 lpte);