/ src / common / utils / processApi.h
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  }