From b7a961ff7167fc932c736aa723b857a20c652d85 Mon Sep 17 00:00:00 2001 From: Hay1tsme Date: Tue, 20 Aug 2024 10:14:10 -0400 Subject: [PATCH] port clock fixes from dniel segatools --- hkbhook/unity.c | 2 ++ mai2hook/unity.c | 2 ++ mu3hook/unity.c | 2 ++ platform/clock.c | 27 ++++++++++++++++++--------- platform/clock.h | 1 + 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/hkbhook/unity.c b/hkbhook/unity.c index 8c0aac18..b1e8344b 100644 --- a/hkbhook/unity.c +++ b/hkbhook/unity.c @@ -10,6 +10,7 @@ #include "hooklib/reg.h" #include "hook/procaddr.h" #include "hooklib/serial.h" +#include "platform/clock.h" #include "util/dprintf.h" @@ -96,6 +97,7 @@ static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name) path_hook_insert_hooks(result); reg_hook_insert_hooks(result); proc_addr_insert_hooks(result); + clock_hook_insert_hooks(result); serial_hook_apply_hooks(result); iohook_apply_hooks(result); } diff --git a/mai2hook/unity.c b/mai2hook/unity.c index 4c82b07e..67154656 100644 --- a/mai2hook/unity.c +++ b/mai2hook/unity.c @@ -10,6 +10,7 @@ #include "hooklib/reg.h" #include "hook/procaddr.h" #include "hooklib/serial.h" +#include "platform/clock.h" #include "util/dprintf.h" @@ -107,6 +108,7 @@ static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name) path_hook_insert_hooks(result); reg_hook_insert_hooks(result); proc_addr_insert_hooks(result); + clock_hook_insert_hooks(result); serial_hook_apply_hooks(result); iohook_apply_hooks(result); } diff --git a/mu3hook/unity.c b/mu3hook/unity.c index efefc32a..62695b9f 100644 --- a/mu3hook/unity.c +++ b/mu3hook/unity.c @@ -6,6 +6,7 @@ #include "hooklib/dll.h" #include "hooklib/path.h" +#include "platform/clock.h" #include "util/dprintf.h" @@ -88,6 +89,7 @@ static HMODULE WINAPI my_LoadLibraryW(const wchar_t *name) dll_hook_insert_hooks(result); path_hook_insert_hooks(result); + clock_hook_insert_hooks(result); } } diff --git a/platform/clock.c b/platform/clock.c index b67b1114..e163961a 100644 --- a/platform/clock.c +++ b/platform/clock.c @@ -4,6 +4,7 @@ #include #include "hook/table.h" +#include "hook/procaddr.h" #include "platform/clock.h" @@ -19,7 +20,9 @@ static BOOL WINAPI my_SetTimeZoneInformation(TIME_ZONE_INFORMATION *tzinfo); static BOOL (WINAPI * next_GetSystemTimeAsFileTime)(FILETIME *out); static int64_t clock_current_day; +static bool clock_timezone; static bool clock_time_warp; +static bool clock_writeable; static const struct hook_symbol clock_base_hook_syms[] = { { @@ -158,7 +161,7 @@ static BOOL WINAPI my_GetSystemTime(SYSTEMTIME *out) return ok; } -#if 0 +#if defined(LOG_CLOCK) static int last_second; if (out->wSecond != last_second) { @@ -225,35 +228,41 @@ HRESULT clock_hook_init(const struct clock_config *cfg) { assert(cfg != NULL); + clock_timezone = cfg->timezone; clock_time_warp = cfg->timewarp; + clock_writeable = cfg->writeable; - if (cfg->timezone || cfg->timewarp || !cfg->writeable) { + clock_hook_insert_hooks(NULL); + + return S_OK; +} + +void clock_hook_insert_hooks(HMODULE target) { + if (clock_timezone || clock_time_warp || !clock_writeable) { /* All the clock hooks require the core GSTAFT hook to be installed */ /* Note the ! up there btw. */ hook_table_apply( - NULL, + target, "kernel32.dll", clock_base_hook_syms, _countof(clock_base_hook_syms)); } - if (cfg->timezone) { + if (clock_timezone) { hook_table_apply( - NULL, + target, "kernel32.dll", clock_read_hook_syms, _countof(clock_read_hook_syms)); } - if (!cfg->writeable) { + if (!clock_writeable) { /* Install hook if this config parameter is FALSE! */ hook_table_apply( - NULL, + target, "kernel32.dll", clock_write_hook_syms, _countof(clock_write_hook_syms)); } - - return S_OK; } diff --git a/platform/clock.h b/platform/clock.h index 4d67754b..6d8c201e 100644 --- a/platform/clock.h +++ b/platform/clock.h @@ -11,3 +11,4 @@ struct clock_config { }; HRESULT clock_hook_init(const struct clock_config *cfg); +void clock_hook_insert_hooks(HMODULE target);