Squashed 'FSI.Lib/' changes from 6aa4846..4a27cd3

4a27cd3 RoboSharp eingefügt
1b2fc1f Erweiterungsmethode für Startparameter einefügt

git-subtree-dir: FSI.Lib
git-subtree-split: 4a27cd377a1959dc669625473b018e42c31ef147
This commit is contained in:
maier_S
2022-03-23 14:17:56 +01:00
parent a0095a0516
commit 907ad039c4
57 changed files with 11301 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace FSI.Lib.Tools.RoboSharp
{
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
/// <summary>
/// Native Methods for Pause/Suspend/Resume processes
/// </summary>
public static class NativeMethods
{
[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)
}
[DllImport("kernel32.dll")]
static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId);
[DllImport("kernel32.dll")]
static extern uint SuspendThread(IntPtr hThread);
[DllImport("kernel32.dll")]
static extern int ResumeThread(IntPtr hThread);
public static bool Suspend(this Process process)
{
if (process.HasExited) return false;
foreach (ProcessThread thread in process.Threads)
{
var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id);
if (pOpenThread == IntPtr.Zero)
{
break;
}
SuspendThread(pOpenThread);
}
return true;
}
public static bool Resume(this Process process)
{
if (process.HasExited) return false;
foreach (ProcessThread thread in process.Threads)
{
var pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)thread.Id);
if (pOpenThread == IntPtr.Zero)
{
break;
}
ResumeThread(pOpenThread);
}
return true;
}
}
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member
}