Проверка процессов критический или нет

122
26 декабря 2019, 21:40

Какой самый надёжный метод определения системных процессов в системе?

Использую данный способ:

namespace MoreInfoTest
{
    using System;
    using System.ComponentModel;
    using System.Diagnostics;
    internal static class Program
    {
        private static void Main()
        {
            Console.Title = "Process check is critical";
            try
            {
                foreach (Process process in Process.GetProcesses())
                {
                    if (!IsProcessCritical(process))
                    {
                        Console.WriteLine($"Process: {process.ProcessName.ToString()} is normal.");
                    }
                    else
                    {
                        Console.WriteLine($"Process: {process.ProcessName.ToString()} is critical.");
                    }
                }
            }
            catch { }
            Console.ReadKey();
        }
        private const uint ProcessBreakOnTermination = 29;
        public static bool IsProcessCritical(Process pr)
        {
            uint val = 0;
            if (NativeMethods.NtQueryInformationProcess(pr.Handle, ProcessBreakOnTermination, ref val, sizeof(uint), out int size) != 0 || size != sizeof(uint))
            {
                throw new Win32Exception("NtQueryInformationProcess failed");
            }
            return val != 0;
        }
    }
}
internal static class NativeMethods
{
   [DllImport("NTDLL.DLL")]
   internal static extern int NtQueryInformationProcess(IntPtr hProcess, uint pic,ref uint pi, int cb, out int pSize);
}

Выводит список всего из пару процессов и то не все критичные пример на скриншоте:

Второй способ тоже не так работает:

 bool criticalProcess = false;
 foreach (Process process in Process.GetProcesses())
 {
   if (!NativeMethods.IsProcessCritical(process.Handle, ref criticalProcess))
   {
      continue; // Если не удалось получить информацию по процессам.
   }
   if (criticalProcess)
   {
     Console.WriteLine($"Process: {process.ProcessName.ToString()} is critical");
   }
   else
   {
     Console.WriteLine($"Process: {process.ProcessName.ToString()} is not critical");
   }
}
Answer 1

Если верить msdn, то говорится, что используемый метод устарел и начиная с Windows 8.1 следует использовать другой:

ProcessBreakOnTermination
29
Retrieves a ULONG value indicating whether the process is considered critical.

Note This value can be used starting in Windows XP with SP3. Starting in Windows 8.1, IsProcessCritical should be used instead.

У тебя явно скриншот с Win10, а значит, надо воспользоваться функцией IsProcessCritical. Если верить pinvoke, то она объявляется так:

[DllImport("ntdll.dll", SetLastError=true)]
static extern bool IsProcessCritical(IntPtr hProcess, ref bool Critical);
READ ALSO
Как назначить StreamSource в BitmapImage в codebehind?

Как назначить StreamSource в BitmapImage в codebehind?

Есть zip файл, в котором хранится FlowDocument (Cardxaml) и папка с изображениями (Media)

118
как задать цвет числу в С#?

как задать цвет числу в С#?

Есть код, который переводит все в двоичный кодТеперь мне нужно задать числу 1 - черный цвет, а 0 - белый цвет

134
Вопрос по интеграции Яндекс.Кассы на сайте

Вопрос по интеграции Яндекс.Кассы на сайте

Зарегистрировался в ЯндексКассе

135
Валидация полей в модальном окне

Валидация полей в модальном окне

В моделе есть правила

147