2021-08-29 14:18:45 +02:00
|
|
|
#include <hex/api/content_registry.hpp>
|
2021-06-06 19:17:51 +02:00
|
|
|
|
2021-08-29 22:15:18 +02:00
|
|
|
#include <hex/helpers/utils.hpp>
|
|
|
|
|
2021-06-06 19:17:51 +02:00
|
|
|
#include <windows.h>
|
|
|
|
#include <psapi.h>
|
|
|
|
|
2021-08-29 14:18:45 +02:00
|
|
|
#include <imgui.h>
|
2021-12-31 01:10:06 +01:00
|
|
|
#include <hex/ui/imgui_imhex_extensions.h>
|
2022-02-02 00:36:09 +01:00
|
|
|
|
2022-07-26 14:59:08 +02:00
|
|
|
#include <fonts/fontawesome_font.h>
|
|
|
|
#include <fonts/codicons_font.h>
|
2021-08-29 14:18:45 +02:00
|
|
|
|
2021-06-06 19:17:51 +02:00
|
|
|
namespace hex::plugin::windows {
|
|
|
|
|
2022-02-02 00:36:09 +01:00
|
|
|
void addTitleBarButtons() {
|
|
|
|
#if defined(DEBUG)
|
|
|
|
ContentRegistry::Interface::addTitleBarButton(ICON_VS_DEBUG, "hex.windows.title_bar_button.debug_build", []{
|
|
|
|
if (ImGui::GetIO().KeyCtrl) {
|
|
|
|
// Explicitly trigger a segfault by writing to an invalid memory location
|
|
|
|
// Used for debugging crashes
|
|
|
|
*reinterpret_cast<u8 *>(0x10) = 0x10;
|
2023-02-09 23:07:04 +01:00
|
|
|
std::unreachable();
|
2022-02-02 00:36:09 +01:00
|
|
|
} else if (ImGui::GetIO().KeyShift) {
|
|
|
|
// Explicitly trigger an abort by throwing an uncaught exception
|
|
|
|
// Used for debugging exception errors
|
|
|
|
throw std::runtime_error("Debug Error");
|
2023-02-09 23:07:04 +01:00
|
|
|
std::unreachable();
|
2022-02-02 00:36:09 +01:00
|
|
|
} else {
|
|
|
|
hex::openWebpage("https://imhex.werwolv.net/debug");
|
|
|
|
}
|
|
|
|
});
|
|
|
|
#endif
|
|
|
|
|
|
|
|
ContentRegistry::Interface::addTitleBarButton(ICON_VS_SMILEY, "hex.windows.title_bar_button.feedback", []{
|
2023-02-01 09:20:32 +01:00
|
|
|
hex::openWebpage("https://github.com/WerWolv/ImHex/discussions/categories/feedback");
|
2022-02-02 00:36:09 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-06-06 19:17:51 +02:00
|
|
|
void addFooterItems() {
|
|
|
|
|
2021-06-06 19:18:14 +02:00
|
|
|
ContentRegistry::Interface::addFooterItem([] {
|
|
|
|
static float cpuUsage = 0.0F;
|
|
|
|
|
2021-06-07 18:13:54 +02:00
|
|
|
if (ImGui::HasSecondPassed()) {
|
2021-06-06 19:18:14 +02:00
|
|
|
static ULARGE_INTEGER lastCPU, lastSysCPU, lastUserCPU;
|
|
|
|
static u32 numProcessors;
|
|
|
|
static HANDLE self = GetCurrentProcess();
|
|
|
|
|
|
|
|
ULARGE_INTEGER now, sys, user;
|
2022-03-27 00:01:28 +01:00
|
|
|
{
|
|
|
|
FILETIME ftime, fsys, fuser;
|
2021-06-06 19:18:14 +02:00
|
|
|
|
2022-03-27 00:01:28 +01:00
|
|
|
GetSystemTimeAsFileTime(&ftime);
|
|
|
|
memcpy(&now, &ftime, sizeof(FILETIME));
|
2021-06-06 19:18:14 +02:00
|
|
|
|
2022-03-27 00:01:28 +01:00
|
|
|
GetProcessTimes(self, &ftime, &ftime, &fsys, &fuser);
|
|
|
|
memcpy(&sys, &fsys, sizeof(FILETIME));
|
|
|
|
memcpy(&user, &fuser, sizeof(FILETIME));
|
|
|
|
}
|
2021-06-06 19:18:14 +02:00
|
|
|
|
|
|
|
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;
|
2022-02-01 22:09:44 +01:00
|
|
|
lastCPU = now;
|
2021-06-06 19:18:14 +02:00
|
|
|
lastUserCPU = user;
|
2022-02-01 22:09:44 +01:00
|
|
|
lastSysCPU = sys;
|
2021-06-06 19:18:14 +02:00
|
|
|
}
|
2021-09-21 03:10:09 +02:00
|
|
|
|
|
|
|
cpuUsage *= 100;
|
2021-06-06 19:18:14 +02:00
|
|
|
}
|
|
|
|
|
2021-12-31 01:10:06 +01:00
|
|
|
ImGui::TextFormatted(ICON_FA_TACHOMETER_ALT " {0:2}.{1:02}", u32(cpuUsage), u32(cpuUsage * 100) % 100);
|
2021-06-06 19:18:14 +02:00
|
|
|
});
|
|
|
|
|
2021-06-06 19:17:51 +02:00
|
|
|
ContentRegistry::Interface::addFooterItem([] {
|
|
|
|
static MEMORYSTATUSEX memInfo;
|
|
|
|
static PROCESS_MEMORY_COUNTERS_EX pmc;
|
|
|
|
|
2021-06-07 18:13:54 +02:00
|
|
|
if (ImGui::HasSecondPassed()) {
|
2021-06-06 19:17:51 +02:00
|
|
|
memInfo.dwLength = sizeof(MEMORYSTATUSEX);
|
|
|
|
GlobalMemoryStatusEx(&memInfo);
|
2022-01-24 20:53:17 +01:00
|
|
|
GetProcessMemoryInfo(GetCurrentProcess(), reinterpret_cast<PROCESS_MEMORY_COUNTERS *>(&pmc), sizeof(pmc));
|
2021-06-06 19:17:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
auto totalMem = memInfo.ullTotalPhys;
|
2023-05-04 23:23:44 +02:00
|
|
|
auto usedMem = pmc.WorkingSetSize;
|
2021-06-06 19:17:51 +02:00
|
|
|
|
2021-12-31 01:10:06 +01:00
|
|
|
ImGui::TextFormatted(ICON_FA_MICROCHIP " {0} / {1}", hex::toByteString(usedMem), hex::toByteString(totalMem));
|
2021-06-06 19:17:51 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|