| 80 | }; |
| 81 | |
| 82 | static inline ProcessInfo processInfo(DWORD processId) |
| 83 | { |
| 84 | ProcessInfo pi; |
| 85 | HANDLE handle = OpenProcess(PROCESS_QUERY_INFORMATION, TOKEN_READ, processId); |
| 86 | if (handle == INVALID_HANDLE_VALUE) |
| 87 | return pi; |
| 88 | WCHAR buffer[MAX_PATH]; |
| 89 | DWORD bufSize = MAX_PATH; |
| 90 | if (queryFullProcessImageName(handle, 0, buffer, &bufSize)) |
| 91 | pi.imageName = QString::fromUtf16(reinterpret_cast<const char16_t *>(buffer)); |
| 92 | |
| 93 | HANDLE processTokenHandle = NULL; |
| 94 | if (!OpenProcessToken(handle, TOKEN_READ, &processTokenHandle) || !processTokenHandle) { |
| 95 | CloseHandle(handle); |
| 96 | return pi; |
| 97 | } |
| 98 | |
| 99 | DWORD size = 0; |
| 100 | GetTokenInformation(processTokenHandle, TokenUser, NULL, 0, &size); |
| 101 | |
| 102 | if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { |
| 103 | QByteArray buf; |
| 104 | buf.resize(size); |
| 105 | PTOKEN_USER userToken = reinterpret_cast<PTOKEN_USER>(buf.data()); |
| 106 | if (userToken |
| 107 | && GetTokenInformation(processTokenHandle, TokenUser, userToken, size, &size)) { |
| 108 | SID_NAME_USE sidNameUse; |
| 109 | TCHAR user[MAX_PATH] = { 0 }; |
| 110 | DWORD userNameLength = MAX_PATH; |
| 111 | TCHAR domain[MAX_PATH] = { 0 }; |
| 112 | DWORD domainNameLength = MAX_PATH; |
| 113 | |
| 114 | if (LookupAccountSid(NULL, |
| 115 | userToken->User.Sid, |
| 116 | user, |
| 117 | &userNameLength, |
| 118 | domain, |
| 119 | &domainNameLength, |
| 120 | &sidNameUse)) |
| 121 | pi.processOwner = QString::fromUtf16(reinterpret_cast<const char16_t *>(user)); |
| 122 | } |
| 123 | } |
| 124 | |
| 125 | CloseHandle(processTokenHandle); |
| 126 | CloseHandle(handle); |
| 127 | return pi; |
| 128 | } |
| 129 | |
| 130 | ProcDataList processList(const ProcDataList & /*previous*/) |
| 131 | { |
no test coverage detected