processApi.h
1 #pragma once 2 3 #include <vector> 4 #include <wil/resource.h> 5 #include <Shlwapi.h> 6 #include <Psapi.h> 7 #include <string_view> 8 9 inline std::vector<wil::unique_process_handle> getProcessHandlesByName(const std::wstring_view processName, DWORD handleAccess) 10 { 11 std::vector<wil::unique_process_handle> result; 12 DWORD bytesRequired; 13 std::vector<DWORD> processIds; 14 processIds.resize(4096 / sizeof(processIds[0])); 15 auto processIdSize = static_cast<DWORD>(size(processIds) * sizeof(processIds[0])); 16 EnumProcesses(processIds.data(), processIdSize, &bytesRequired); 17 while (bytesRequired == processIdSize) 18 { 19 processIdSize *= 2; 20 processIds.resize(processIdSize / sizeof(processIds[0])); 21 EnumProcesses(processIds.data(), processIdSize, &bytesRequired); 22 } 23 processIds.resize(bytesRequired / sizeof(processIds[0])); 24 25 handleAccess |= PROCESS_QUERY_LIMITED_INFORMATION; 26 for (const DWORD processId : processIds) 27 { 28 try 29 { 30 wil::unique_process_handle hProcess{ OpenProcess(handleAccess, FALSE, processId) }; 31 wchar_t name[MAX_PATH + 1]; 32 DWORD length = MAX_PATH; 33 if (!hProcess || !QueryFullProcessImageNameW(hProcess.get(), 0, name, &length)) 34 { 35 continue; 36 } 37 if (processName == PathFindFileNameW(name)) 38 { 39 result.push_back(std::move(hProcess)); 40 } 41 } 42 catch (...) 43 { 44 } 45 } 46 return result; 47 }