mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-11-10 00:40:09 +01:00
41 lines
1.4 KiB
C
41 lines
1.4 KiB
C
#include "processes.h"
|
|
#include "common/mallocHelper.h"
|
|
|
|
#include <ntstatus.h>
|
|
#include <winternl.h>
|
|
|
|
const char* ffDetectProcesses(const FFProcessesOptions* options, FFProcessesResult* result) {
|
|
FF_AUTO_FREE SYSTEM_PROCESS_INFORMATION* pstart = nullptr;
|
|
|
|
// Multiple attempts in case processes change while
|
|
// we are in the middle of querying them.
|
|
ULONG size = 0;
|
|
for (int attempts = 0;; ++attempts) {
|
|
if (size) {
|
|
pstart = (SYSTEM_PROCESS_INFORMATION*) realloc(pstart, size);
|
|
assert(pstart);
|
|
}
|
|
NTSTATUS status = NtQuerySystemInformation(SystemProcessInformation, pstart, size, &size);
|
|
if (NT_SUCCESS(status)) {
|
|
break;
|
|
} else if (status == STATUS_INFO_LENGTH_MISMATCH && attempts < 4) {
|
|
size += sizeof(SYSTEM_PROCESS_INFORMATION) * 5;
|
|
} else {
|
|
return "NtQuerySystemInformation(SystemProcessInformation) failed";
|
|
}
|
|
}
|
|
|
|
for (SYSTEM_PROCESS_INFORMATION* ptr = pstart; ; ptr = (SYSTEM_PROCESS_INFORMATION*) ((uint8_t*) ptr + ptr->NextEntryOffset)) {
|
|
if (!options->countKprocs && (uintptr_t) ptr->InheritedFromUniqueProcessId > 0) {
|
|
continue;
|
|
}
|
|
++result->processes;
|
|
result->threads += ptr->NumberOfThreads;
|
|
if (ptr->NextEntryOffset == 0) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return nullptr;
|
|
}
|