10#include "kprocesslist.h"
17#if !defined(_WIN32_WINNT)
18#define _WIN32_WINNT 0x0502
20#include <qt_windows.h>
21#if !defined(PROCESS_SUSPEND_RESUME)
22#define PROCESS_SUSPEND_RESUME (0x0800)
29using namespace KProcessList;
34static inline BOOL queryFullProcessImageName(HANDLE h, DWORD flags, LPWSTR buffer, DWORD *size)
37 typedef BOOL(WINAPI * QueryFullProcessImageNameWProtoType)(
HANDLE, DWORD, LPWSTR, PDWORD);
38 static QueryFullProcessImageNameWProtoType queryFullProcessImageNameW =
nullptr;
39 if (!queryFullProcessImageNameW) {
41 if (kernel32Lib.isLoaded() || kernel32Lib.load()) {
42 queryFullProcessImageNameW = (QueryFullProcessImageNameWProtoType)kernel32Lib.resolve(
"QueryFullProcessImageNameW");
45 if (!queryFullProcessImageNameW)
48 return (*queryFullProcessImageNameW)(h, flags, buffer, size);
56static inline ProcessInfo winProcessInfo(DWORD processId)
59 HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION, TOKEN_READ, processId);
60 if (handle == INVALID_HANDLE_VALUE)
62 HANDLE processTokenHandle =
nullptr;
63 if (!OpenProcessToken(handle, TOKEN_READ, &processTokenHandle) || !processTokenHandle)
66 TCHAR fullProcessPath[MAX_PATH] = {0};
67 DWORD fullProcessPathLength = MAX_PATH;
68 if (queryFullProcessImageName(handle, 0, fullProcessPath, &fullProcessPathLength)) {
73 GetTokenInformation(processTokenHandle, TokenUser,
nullptr, 0, &size);
75 if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
78 PTOKEN_USER userToken =
reinterpret_cast<PTOKEN_USER
>(buf.
data());
79 if (userToken && GetTokenInformation(processTokenHandle, TokenUser, userToken, size, &size)) {
80 SID_NAME_USE sidNameUse;
81 TCHAR user[MAX_PATH] = {0};
82 DWORD userNameLength = MAX_PATH;
83 TCHAR domain[MAX_PATH] = {0};
84 DWORD domainNameLength = MAX_PATH;
86 if (LookupAccountSid(
nullptr, userToken->User.Sid, user, &userNameLength, domain, &domainNameLength, &sidNameUse))
91 CloseHandle(processTokenHandle);
96KProcessInfoList KProcessList::processInfoList()
101 pe.dwSize =
sizeof(PROCESSENTRY32);
102 HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
103 if (snapshot == INVALID_HANDLE_VALUE)
106 for (
bool hasNext = Process32First(snapshot, &pe); hasNext; hasNext = Process32Next(snapshot, &pe)) {
107 const ProcessInfo processInf = winProcessInfo(pe.th32ProcessID);
109 if (processInf.fullPath.
isEmpty()) {
112 rc.
push_back(
KProcessInfo(pe.th32ProcessID, processInf.fullPath, commandName, processInf.processOwner));
115 CloseHandle(snapshot);
121 KProcessInfoList processInfoList = KProcessList::processInfoList();
122 auto testProcessIterator = std::find_if(processInfoList.begin(), processInfoList.end(), [pid](
const KProcessList::KProcessInfo &info) {
123 return info.pid() == pid;
125 if (testProcessIterator != processInfoList.end()) {
126 return *testProcessIterator;
Contains information about a process.
void resize(qsizetype newSize, char c)
void push_back(parameter_type value)
QString fromUtf16(const char16_t *unicode, qsizetype size)
bool isEmpty() const const