OpenThread (kernel32)
Last changed: -131.107.159.171

.
Summary

C# Signature:

[DllImport("kernel32.dll")]
static extern Microsoft.Win32.SafeHandles.SafeAccessTokenHandle OpenThread(
   ThreadAccess dwDesiredAccess,
   bool bInheritHandle,
   uint dwThreadId
   );

[DllImport("kernel32.dll")]
static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle,
   uint dwThreadId);

User-Defined Types:

  [Flags]
  public enum    ThreadAccess : int
  {
    TERMINATE           = (0x0001)  ,
    SUSPEND_RESUME      = (0x0002)  ,
    GET_CONTEXT         = (0x0008)  ,
    SET_CONTEXT         = (0x0010)  ,
    SET_INFORMATION     = (0x0020)  ,
    QUERY_INFORMATION       = (0x0040)  ,
    SET_THREAD_TOKEN    = (0x0080)  ,
    IMPERSONATE         = (0x0100)  ,
    DIRECT_IMPERSONATION    = (0x0200)
  }

Notes:

None.

Tips & Tricks:

Use the SafeAccessTokenHandle version where possible, as it will ensure proper disposal of the handle.

Don't forget to call CloseHandle

Sample Code:

private static void SuspendProcess(int pid)

{

  var process = Process.GetProcessById(pid);
  if (process.ProcessName == string.Empty)
  {
    return;
  }
  foreach (ProcessThread thread in process.Threads)
  {
    using (var handle = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.IdThreadAccess) )
    {
      if (!handle.IsInvalid)
      {
    SuspendThread(pOpenThread);
      }
    }
  }

}

Alternative Managed API:

Do you know one? Please contribute it!

Documentation
OpenThread on MSDN