diff --git a/src/detection/cpuUsage/cpuUsage_windows.c b/src/detection/cpuUsage/cpuUsage_windows.c index bf4cc7644..d4ffbd2ca 100644 --- a/src/detection/cpuUsage/cpuUsage_windows.c +++ b/src/detection/cpuUsage/cpuUsage_windows.c @@ -1,6 +1,45 @@ #include "fastfetch.h" #include "cpuUsage.h" +#ifdef FF_USE_WIN_NTAPI + +#include "util/mallocHelper.h" + +#include +#include + +const char* ffGetCpuUsageInfo(uint64_t* inUseAll, uint64_t* totalAll) +{ + ULONG size = 0; + if(NtQuerySystemInformation(SystemProcessorPerformanceInformation, NULL, 0, &size) != STATUS_INFO_LENGTH_MISMATCH) + return "NtQuerySystemInformation(SystemProcessorPerformanceInformation, NULL) failed"; + + SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION* FF_AUTO_FREE pinfo = (SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION*)malloc(size); + if(!NT_SUCCESS(NtQuerySystemInformation(SystemProcessorPerformanceInformation, pinfo, size, &size))) + return "NtQuerySystemInformation(SystemProcessorPerformanceInformation, size) failed"; + + *inUseAll = *totalAll = 0; + + for (uint32_t i = 0; i < size / sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION); ++i) + { + SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION* coreInfo = pinfo + i; + + // KernelTime includes idle time. + LONGLONG dpcTime = coreInfo->Reserved1[0].QuadPart; + LONGLONG interruptTime = coreInfo->Reserved1[1].QuadPart; + coreInfo->KernelTime.QuadPart -= coreInfo->IdleTime.QuadPart; + coreInfo->KernelTime.QuadPart += dpcTime + interruptTime; + + LONGLONG inUse = coreInfo->UserTime.QuadPart + coreInfo->KernelTime.QuadPart; + *inUseAll += (uint64_t)inUse; + *totalAll += (uint64_t)(inUse + coreInfo->IdleTime.QuadPart); + } + + return NULL; +} + +#else + #include static inline uint64_t fileTimeToUint64(const FILETIME* ft) { @@ -19,3 +58,5 @@ const char* ffGetCpuUsageInfo(uint64_t* inUseAll, uint64_t* totalAll) *inUseAll = *totalAll - fileTimeToUint64(&idleTime); return NULL; } + +#endif