Быстрый поиск процесса по имени

88
25 июня 2021, 23:40

Необходимо максимально быстро найти процесс по названию исполняемого файла. Поиск выполняется из 32 битного приложения, искомый процесс может быть как 32 так и 64 бит.

Пока есть два варианта:

#include <string>
#include <iostream>
#include <windows.h>
#include <Tlhelp32.h>
#include <psapi.h>
#pragma comment(lib, "psapi.lib")
size_t r_wcsstr(const wchar_t* str, const wchar_t* search)
{
    for (size_t i = wcslen(str) - wcslen(search); i > 0; --i)
    {
        if (wcsstr(str + i, search) != NULL)
            return i + 1;
    }
    return -1;
}
bool find_process_1(const std::wstring& name, DWORD& pid)
{
    DWORD aProcesses[1024] { 0 };
    DWORD cbNeeded { 0 };
    DWORD cProcesses { 0 };
    unsigned int i;
    if (EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded) == 0)
        return false;
    cProcesses = cbNeeded / sizeof(DWORD);
    for (i = 0; i < cProcesses; i++)
    {
        WCHAR module_name[MAX_PATH] { 0 };
        HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
        if (process == NULL || 
            GetProcessImageFileNameW(process, module_name, sizeof(module_name) / sizeof(WCHAR)) == 0)
            continue;
        size_t pos = r_wcsstr(module_name, name.c_str());
        if (pos != -1)
        {
            pid = aProcesses[i];
                return true;
        }
    }
    return false;
}
bool find_process_2(const std::wstring& name, DWORD& pid)
{
    HANDLE snapshot = INVALID_HANDLE_VALUE;
    PROCESSENTRY32 process_entry = { 0 };
    process_entry.dwSize = sizeof(process_entry);
    bool found = false;
    snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (snapshot == INVALID_HANDLE_VALUE)
        return false;
    BOOL success = Process32First(snapshot, &process_entry);
    while (success == TRUE)
    {
        if (_wcsicmp(process_entry.szExeFile, name.c_str()) == 0)
        {
            pid = process_entry.th32ProcessID;
            CloseHandle(snapshot);
            return true;
        }
        success = Process32Next(snapshot, &process_entry);
    }
    CloseHandle(snapshot);
    return false;
}
int main(int argc, WCHAR **argv)
{
    unsigned long pid { 0 };
    unsigned long long total { 0 };
    for (int i = 0; i < 1000; ++i)
    {
        unsigned long long start = GetTickCount64();
        find_process_1(L"Calculator.exe", pid);
        total += (GetTickCount64() - start);
    }
    std::wcout << L"Total: " << total << L"\tper call: " << total / 1000. << std::endl;
    total = 0;
    for (int i = 0; i < 1000; ++i)
    {
        unsigned long long start = GetTickCount64();
        find_process_2(L"Calculator.exe", pid);
        total += (GetTickCount64() - start);
    }
    std::wcout << L"Total: " << total << L"\tper call: " << total / 1000. << std::endl;
    return 0;
}
Total: 4094     per call: 4.094
Total: 4688     per call: 4.688

Существует ли способ быстрее OpenProcess + GetProcessImageFileName?
Также как его можно оптимизировать?

UPD: при получении имени исполняемого файла через QueryFullProcessImageNameW(process, PROCESS_NAME_NATIVE, module_name, &cbNeeded) способ 1 удалось еще чуток ускорить.

READ ALSO
Подсчёт кол-во символов в PlainTextEdit

Подсчёт кол-во символов в PlainTextEdit

Как подсчитать кол-во символов введённых в поле QPlainTextEdit? Я еще новичок в теме QT и в С++ в целом, но кое что уже умею, иду на новые высоты)

70
Как сверстать блок с изогнутой линией?

Как сверстать блок с изогнутой линией?

Никак не получается заверстать вот такой блок

79
Как получить численное значение из input?

Как получить численное значение из input?

Как с помощью JS получить цифры с каждого input и с селектора чтобы в JS например я имел 3 переменные содержат в себе 50 из input = text, 5 c radio, и 60 из селектора...

225
Перенос игры на мобильную платформу

Перенос игры на мобильную платформу

Есть небольшая игра, которая состоит из JS, CSS, HTML, PHP

103