Process.GetProcesses и IsWow64Process не возвращает все запущенные процессы - PullRequest
0 голосов
/ 30 января 2019

Я использую этот простой код для перечисления всех запущенных процессов и их архитектуры (32bit или 64bit) на консоли, и он работает почти точно, но число процессов в результате - даже не половина того, что я вижу в WindowsTaskManager или ProcessHacker .Большинство моих запущенных процессов не включены в возвращаемый результат.И это почти возвращает только системные процессы.Иногда я получаю «Win32Exception» или «Отказано в доступе» (может быть, потому что некоторые процессы защищены), а иногда и без исключения:

internal static class Program
{
    private static void Main()
    {
        foreach (var p in Process.GetProcesses())
        {
            try
            {
                if (p.IsWin64Emulator())
                {
                    Console.WriteLine(p.ProcessName + " x86 " + p.MainModule.FileName);
                }
                else
                {
                    Console.WriteLine(p.ProcessName + " x64 " + p.MainModule.FileName);
                }
            }
            catch (Win32Exception ex)
            {
                if (ex.NativeErrorCode != 0x00000005)
                {
                    throw;
                }
            }
        }

        Console.ReadLine();
    }

    private static bool IsWin64Emulator(this Process process)
    {
        if (Environment.OSVersion.Version.Major > 5 || Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1)
        {
            return NativeMethods.IsWow64Process(process.Handle, out var retVal) && retVal;
        }

        return false;
    }
}

internal static class NativeMethods
{
    [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool IsWow64Process([In] IntPtr process, [Out] out bool wow64Process);
}

Так вот мой вопрос: почему этот код не показывает мне всепроцессы в результате?И как решить эту проблему?

Пример того, что включено:

conhost x64
OpenWith x64
LockApp x64
ShellExperienceHost x64
SearchUI x64
...

Пример того, что не включено:

CSh_Test x64 --> Current Running Sotfware in debug mode
explorer x64
ccSvcHst x86 --> Symantec AV
devenv x86   --> Visual Studio
XYplorer x86 --> File manager

1 Ответ

0 голосов
/ 30 января 2019

GetProcesses () предоставляет вам запущенные процессы, но не базовые службы, которые также отображаются в WindowsTaskManager.Может быть, в этом разница?

Источник: https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.getprocesses?view=netframework-4.7.2

Если нет, пожалуйста, дайте больше информации о том, что показано, а что нет.

...