diff --git a/plugins/windows/source/content/footer_items.cpp b/plugins/windows/source/content/footer_items.cpp index 391004aeb..36f0444da 100644 --- a/plugins/windows/source/content/footer_items.cpp +++ b/plugins/windows/source/content/footer_items.cpp @@ -19,6 +19,52 @@ namespace hex::plugin::windows { void addFooterItems() { + ContentRegistry::Interface::addFooterItem([] { + static float cpuUsage = 0.0F; + + if (ImGui::GetFrameCount() % 60 == 0) { + static ULARGE_INTEGER lastCPU, lastSysCPU, lastUserCPU; + static u32 numProcessors; + static HANDLE self = GetCurrentProcess(); + + FILETIME ftime, fsys, fuser; + ULARGE_INTEGER now, sys, user; + + GetSystemTimeAsFileTime(&ftime); + memcpy(&now, &ftime, sizeof(FILETIME)); + + GetProcessTimes(self, &ftime, &ftime, &fsys, &fuser); + memcpy(&sys, &fsys, sizeof(FILETIME)); + memcpy(&user, &fuser, sizeof(FILETIME)); + + if (lastCPU.QuadPart == 0) { + SYSTEM_INFO sysInfo; + FILETIME ftime, fsys, fuser; + + GetSystemInfo(&sysInfo); + numProcessors = sysInfo.dwNumberOfProcessors; + + GetSystemTimeAsFileTime(&ftime); + memcpy(&lastCPU, &ftime, sizeof(FILETIME)); + + self = GetCurrentProcess(); + GetProcessTimes(self, &ftime, &ftime, &fsys, &fuser); + memcpy(&lastSysCPU, &fsys, sizeof(FILETIME)); + memcpy(&lastUserCPU, &fuser, sizeof(FILETIME)); + } else { + cpuUsage = (sys.QuadPart - lastSysCPU.QuadPart) + + (user.QuadPart - lastUserCPU.QuadPart); + cpuUsage /= (now.QuadPart - lastCPU.QuadPart); + cpuUsage /= numProcessors; + lastCPU = now; + lastUserCPU = user; + lastSysCPU = sys; + } + } + + ImGui::TextUnformatted(hex::format(ICON_FA_TACHOMETER_ALT " {0:.3}%", cpuUsage * 100).c_str()); + }); + ContentRegistry::Interface::addFooterItem([] { static MEMORYSTATUSEX memInfo; static PROCESS_MEMORY_COUNTERS_EX pmc;