Files
esuo1198_TaikoArcadeLoader/src/patches/timer.cpp
T
ptmaster 466e6d2e59 Log Optimization & add Banner
layeredfs add mod_dir option allow uses different folder
add simple input option to allow input direct apply to game
2025-03-16 16:49:07 +08:00

45 lines
1.5 KiB
C++

#include "constants.h"
#include "helpers.h"
#include "patches.h"
extern "C" NTSTATUS NTAPI NtSetTimerResolution(
IN ULONG DesiredResolution,
IN BOOLEAN SetResolution,
OUT PULONG CurrentResolution
);
extern "C" NTSTATUS NTAPI NtQueryTimerResolution(
OUT PULONG CurrentResolution,
OUT PULONG MinimumResolution,
OUT PULONG MaximumResolution
);
namespace patches::Timer {
ULONG currentResolution = 0;
ULONG minimumResolution = 0;
ULONG maximumResolution = 0;
void
Release () {
NtSetTimerResolution(currentResolution, FALSE, &currentResolution);
}
void
Init () {
NTSTATUS queryStatus = NtQueryTimerResolution(&currentResolution, &minimumResolution, &maximumResolution);
if (queryStatus == 0) {
bool setHighResolutionTimer = currentResolution > maximumResolution;
if (setHighResolutionTimer) {
ULONG targetResolution = currentResolution;
NTSTATUS status = NtSetTimerResolution(maximumResolution, TRUE, &targetResolution);
if (status == 0) {
LogMessage (LogLevel::INFO, "Using HiRes Timer: {}ms -> {}ms", currentResolution / 10000.0, targetResolution / 10000.0);
} else {
LogMessage (LogLevel::WARN, "Failed to change Timer resolution, status={}", status);
}
atexit (Release);
}
} else LogMessage (LogLevel::WARN, "Failed to query Timer resolution, status={}", queryStatus);
}
}