From f8f987ad8f35954e7c98c242521e4e71efb80f76 Mon Sep 17 00:00:00 2001 From: game1024 Date: Sun, 13 Jul 2025 08:12:51 +0800 Subject: [PATCH] fix python time.sleep not working --- OpenSpeedy_en_US.ts | 74 +++++++++++---------- OpenSpeedy_zh_CN.ts | 74 +++++++++++---------- OpenSpeedy_zh_TW.ts | 74 +++++++++++---------- mainwindow.ui | 2 +- speedpatch/speedpatch.cpp | 107 +++++++++++++++++++++++++------ translations/OpenSpeedy_en_US.qm | Bin 7302 -> 7373 bytes translations/OpenSpeedy_zh_TW.qm | Bin 6457 -> 6514 bytes 7 files changed, 207 insertions(+), 124 deletions(-) diff --git a/OpenSpeedy_en_US.ts b/OpenSpeedy_en_US.ts index efa274a..e3bd9a8 100644 --- a/OpenSpeedy_en_US.ts +++ b/OpenSpeedy_en_US.ts @@ -181,7 +181,7 @@ - + OpenSpeedy @@ -193,7 +193,7 @@ - + ⚡变速速率 ⚡Acceleration @@ -203,7 +203,7 @@ - + 🖥️ 操作系统 🖥️ Operate System @@ -214,7 +214,7 @@ - + windows 11 24H2 @@ -225,7 +225,7 @@ - + 🔥 CPU @@ -236,7 +236,7 @@ - + 10.0% @@ -247,7 +247,7 @@ - + 📊 内存 📊 Memory @@ -258,7 +258,7 @@ - + ( 7.2G / 32.0G ) 12.3% @@ -269,7 +269,7 @@ - + ♥️ 32bit 注入器 ♥️ 32bit Injector @@ -286,8 +286,8 @@ - - + + 正常 Normal @@ -298,7 +298,7 @@ - + ♥️ 64bit 注入器 ♥️ 64bit Injector @@ -309,21 +309,28 @@ - + ▲ 原速 ▲ Origin + + + + + 💻进程 + 💻Processes + + 架构 Arch - 体系结构 Arch @@ -345,7 +352,7 @@ Origin - + ✖️1.0倍 ✖️1.0 times @@ -355,7 +362,7 @@ Origin - + Ctrl + Alt + ⬆️ 增加速度 Ctrl + Alt + ⬆️ Speed Up @@ -365,7 +372,7 @@ Origin - + Ctrl + Alt + ⬇️ 减少速度 Ctrl + Alt + ⬇️ Speed Down @@ -375,7 +382,7 @@ Origin - + Ctrl + Alt + 0 重置速度 Ctrl + Alt + 0 Reset Speed @@ -385,18 +392,15 @@ Origin - + 开机自启 Launch at startup - - - 💻系统进程 💻System Process @@ -407,7 +411,7 @@ Origin - + 🔍输入进程名搜索... 🔍Search with process name @@ -424,7 +428,7 @@ Origin - + 进程名称 Process Name @@ -442,7 +446,7 @@ Origin - + PID @@ -460,7 +464,7 @@ Origin - + 内存使用 Memory @@ -486,7 +490,7 @@ Origin - + 优先级 Priority @@ -504,7 +508,7 @@ Origin - + 是否加速 isAccelerated @@ -522,7 +526,7 @@ Origin - + 搜索到1200个进程, 已过滤展示20个 Found 1200 processes, filtered to show 20 @@ -532,6 +536,7 @@ Origin + 📖关于 📖About @@ -541,7 +546,7 @@ Origin - + ⌨️快捷键 ⌨️Keyboard @@ -551,7 +556,7 @@ Origin - + 🌐语言 🌐Language @@ -559,7 +564,7 @@ Origin - + 中文(简体) @@ -567,7 +572,7 @@ Origin - + 中文(繁體) @@ -583,7 +588,7 @@ Origin - + English @@ -681,7 +686,6 @@ Origin - 是否注入 diff --git a/OpenSpeedy_zh_CN.ts b/OpenSpeedy_zh_CN.ts index de3f1f9..b54bb76 100644 --- a/OpenSpeedy_zh_CN.ts +++ b/OpenSpeedy_zh_CN.ts @@ -165,7 +165,7 @@ - + OpenSpeedy @@ -177,7 +177,7 @@ - + ⚡变速速率 @@ -187,7 +187,7 @@ - + 🖥️ 操作系统 @@ -198,7 +198,7 @@ - + windows 11 24H2 @@ -209,7 +209,7 @@ - + 🔥 CPU @@ -220,7 +220,7 @@ - + 10.0% @@ -231,7 +231,7 @@ - + 📊 内存 @@ -242,7 +242,7 @@ - + ( 7.2G / 32.0G ) 12.3% @@ -253,7 +253,7 @@ - + ♥️ 32bit 注入器 @@ -270,8 +270,8 @@ - - + + 正常 @@ -282,7 +282,7 @@ - + ♥️ 64bit 注入器 @@ -293,20 +293,27 @@ - + ▲ 原速 + + + + + 💻进程 + + + 架构 - 体系结构 @@ -328,7 +335,7 @@ - + ✖️1.0倍 @@ -338,7 +345,7 @@ - + Ctrl + Alt + ⬆️ 增加速度 @@ -348,7 +355,7 @@ - + Ctrl + Alt + ⬇️ 减少速度 @@ -358,7 +365,7 @@ - + Ctrl + Alt + 0 重置速度 @@ -368,18 +375,15 @@ - + 开机自启 - - - 💻系统进程 @@ -390,7 +394,7 @@ - + 🔍输入进程名搜索... @@ -407,7 +411,7 @@ - + 进程名称 @@ -425,7 +429,7 @@ - + PID @@ -443,7 +447,7 @@ - + 内存使用 @@ -469,7 +473,7 @@ - + 优先级 @@ -487,7 +491,7 @@ - + 是否加速 @@ -505,7 +509,7 @@ - + 搜索到1200个进程, 已过滤展示20个 @@ -515,6 +519,7 @@ + 📖关于 @@ -524,7 +529,7 @@ - + ⌨️快捷键 @@ -534,7 +539,7 @@ - + 🌐语言 @@ -542,7 +547,7 @@ - + 中文(简体) @@ -550,7 +555,7 @@ - + 中文(繁體) @@ -566,7 +571,7 @@ - + English @@ -664,7 +669,6 @@ - 是否注入 diff --git a/OpenSpeedy_zh_TW.ts b/OpenSpeedy_zh_TW.ts index 1c420b9..8d88859 100644 --- a/OpenSpeedy_zh_TW.ts +++ b/OpenSpeedy_zh_TW.ts @@ -165,7 +165,7 @@ - + OpenSpeedy @@ -177,7 +177,7 @@ - + ⚡变速速率 ⚡變速倍率 @@ -187,7 +187,7 @@ - + 开机自启 開機自啟 @@ -197,7 +197,7 @@ - + ✖️1.0倍 ✖️1.0倍 @@ -207,7 +207,7 @@ - + 🖥️ 操作系统 🖥️ 作業系統 @@ -218,7 +218,7 @@ - + windows 11 24H2 @@ -229,7 +229,7 @@ - + 🔥 CPU @@ -240,7 +240,7 @@ - + 10.0% @@ -251,7 +251,7 @@ - + 📊 内存 📊 記憶體 @@ -262,7 +262,7 @@ - + ( 7.2G / 32.0G ) 12.3% @@ -273,7 +273,7 @@ - + ♥️ 32bit 注入器 ♥️ 32bit 注入器 @@ -290,8 +290,8 @@ - - + + 正常 正常 @@ -302,7 +302,7 @@ - + ♥️ 64bit 注入器 ♥️ 64bit 注入器 @@ -313,7 +313,7 @@ - + ▲ 原速 ▲ @@ -325,7 +325,7 @@ - + Ctrl + Alt + ⬆️ 增加速度 Ctrl + Alt + ⬆️ 增加速度 @@ -335,7 +335,7 @@ - + Ctrl + Alt + ⬇️ 减少速度 Ctrl + Alt + ⬇️ 減少速度 @@ -345,18 +345,22 @@ - + Ctrl + Alt + 0 重置速度 Ctrl + Alt + 0 重設速度 + + + 💻进程 + 💻行程 + + - - 💻系统进程 💻系統行程 @@ -367,7 +371,7 @@ - + 🔍输入进程名搜索... 🔍輸入行程名搜尋... @@ -384,7 +388,7 @@ - + 进程名称 行程名稱 @@ -402,7 +406,7 @@ - + PID @@ -420,7 +424,7 @@ - + 内存使用 記憶體使用 @@ -428,6 +432,7 @@ + 架构 架構 @@ -452,7 +457,7 @@ - + 优先级 優先順序 @@ -470,7 +475,7 @@ - + 是否加速 是否加速 @@ -488,7 +493,7 @@ - + 搜索到1200个进程, 已过滤展示20个 搜索到1200个行程, 已過濾顯示20個 @@ -498,6 +503,7 @@ + 📖关于 📖關於 @@ -507,7 +513,7 @@ - + ⌨️快捷键 ⌨️快速鍵 @@ -517,7 +523,7 @@ - + 🌐语言 🌐語言 @@ -525,7 +531,7 @@ - + 中文(简体) @@ -535,7 +541,7 @@ - + English @@ -543,7 +549,7 @@ - + 中文(繁體) @@ -659,15 +665,13 @@ - 是否注入 是否注入 - 体系结构 - + 架构 diff --git a/mainwindow.ui b/mainwindow.ui index 2f9d20e..890b9d9 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -632,7 +632,7 @@ QSlider::handle:horizontal:pressed { - 💻系统进程 + 💻进程 diff --git a/speedpatch/speedpatch.cpp b/speedpatch/speedpatch.cpp index 7571bf7..8ad9afb 100644 --- a/speedpatch/speedpatch.cpp +++ b/speedpatch/speedpatch.cpp @@ -1,4 +1,4 @@ -/* +/* * OpenSpeedy - Open Source Game Speed Controller * Copyright (C) 2025 Game1024 * @@ -19,6 +19,7 @@ * . */ #include +#include #include "Minhook.h" #include "speedpatch.h" #include @@ -37,18 +38,22 @@ static HANDLE hShare; static bool* pEnable; typedef VOID (WINAPI* SLEEP) (DWORD); -typedef UINT_PTR (WINAPI* SETTIMER) (HWND, - UINT_PTR, - UINT, - TIMERPROC - ); +typedef DWORD (WINAPI* SLEEPEX) (DWORD, BOOL); + +typedef UINT_PTR (WINAPI* SETTIMER) ( + HWND, + UINT_PTR, + UINT, + TIMERPROC + ); typedef DWORD (WINAPI* TIMEGETTIME) (VOID); -typedef MMRESULT (WINAPI* TIMESETEVENT) (UINT, - UINT, - LPTIMECALLBACK, - DWORD_PTR, - UINT - ); +typedef MMRESULT (WINAPI* TIMESETEVENT) ( + UINT, + UINT, + LPTIMECALLBACK, + DWORD_PTR, + UINT + ); typedef LONG (WINAPI* GETMESSAGETIME) (VOID); typedef DWORD (WINAPI* GETTICKCOUNT) (VOID); @@ -60,11 +65,23 @@ typedef BOOL (WINAPI* QUERYPERFORMANCEFREQUENCY) (LARGE_INTEGER*); typedef VOID (WINAPI* GETSYSTEMTIMEASFILETIME) (LPFILETIME); typedef VOID (WINAPI* GETSYSTEMTIMEPRECISEASFILETIME) (LPFILETIME); +typedef BOOL (WINAPI* SETWAITABLETIMEREX) ( + HANDLE, + const LARGE_INTEGER*, + LONG, + PTIMERAPCROUTINE, + LPVOID, + PREASON_CONTEXT, + ULONG); + inline VOID shouldUpdateAll(); static SLEEP pfnKernelSleep = NULL; static SLEEP pfnDetourSleep = NULL; +static SLEEPEX pfnKernelSleepEx = NULL; +static SLEEPEX pfnDetourSleepEx = NULL; + static SETTIMER pfnKernelSetTimer = NULL; static SETTIMER pfnDetourSetTimer = NULL; @@ -95,6 +112,9 @@ static GETSYSTEMTIMEASFILETIME pfnDetourGetSystemTimeAsFileTime = NULL; static GETSYSTEMTIMEPRECISEASFILETIME pfnKernelGetSystemTimePreciseAsFileTime = NULL; static GETSYSTEMTIMEPRECISEASFILETIME pfnDetourGetSystemTimePreciseAsFileTime = NULL; +static SETWAITABLETIMEREX pfnKernelSetWaitableTimerEx = NULL; +static SETWAITABLETIMEREX pfnDetourSetWaitableTimerEx = NULL; + SPEEDPATCH_API void ChangeSpeed(double factor_) { factor.store(factor_); @@ -199,6 +219,12 @@ VOID WINAPI DetourSleep(DWORD dwMilliseconds) pfnKernelSleep(dwMilliseconds / SpeedFactor()); } +DWORD WINAPI DetourSleepEx(DWORD dwMilliseconds, BOOL bAlertable) +{ + std::shared_lock lock(mutex); + return pfnKernelSleepEx(dwMilliseconds / SpeedFactor(), bAlertable); +} + UINT_PTR WINAPI DetourSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, @@ -484,6 +510,27 @@ DetourGetSystemTimePreciseAsFileTime(LPFILETIME lpSystemTimeAsFileTime) (*lpSystemTimeAsFileTime) = { ulRtn.LowPart, ulRtn.HighPart }; } +BOOL WINAPI DetourSetWaitableTimerEx( + HANDLE hTimer, + const LARGE_INTEGER* lpDueTime, + LONG lPeriod, + PTIMERAPCROUTINE pfnCompletionRoutine, + LPVOID lpArgToCompletionRoutine, + PREASON_CONTEXT WakeContext, + ULONG TolerableDelay + ) +{ + LARGE_INTEGER dueTime = {0}; + dueTime.QuadPart = lpDueTime->QuadPart / SpeedFactor(); + return pfnKernelSetWaitableTimerEx(hTimer, + &dueTime, + lPeriod, + pfnCompletionRoutine, + lpArgToCompletionRoutine, + WakeContext, + TolerableDelay); +} + inline VOID shouldUpdateAll() { shouldUpdateTimeGetTime = true; @@ -498,10 +545,18 @@ inline VOID shouldUpdateAll() template inline VOID MH_HOOK(S* pTarget, S* pDetour, T** ppOriginal) { - MH_CreateHook(reinterpret_cast (pTarget), - reinterpret_cast (pDetour), - reinterpret_cast (ppOriginal)); - MH_EnableHook(reinterpret_cast (pTarget)); + + if (MH_CreateHook(reinterpret_cast (pTarget), + reinterpret_cast (pDetour), + reinterpret_cast (ppOriginal)) != MH_OK) + { + MessageBoxW(NULL, L"MH装载失败", L"DLL", MB_OK); + } + + if (MH_EnableHook(reinterpret_cast (pTarget)) != MH_OK) + { + MessageBoxW(NULL, L"MH装载失败", L"DLL", MB_OK); + } } template @@ -533,9 +588,13 @@ BOOL APIENTRY DllMain(HMODULE hModule, LPVOID lpReserved) { FILETIME now = { 0 }; + HMODULE hKernel32; + SETWAITABLETIMEREX pSetWaitableTimerEx; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: + hKernel32 = GetModuleHandleW(L"kernel32.dll"); + if (MH_Initialize() != MH_OK) { MessageBoxW(NULL, L"MH装载失败", L"DLL", MB_OK); @@ -587,8 +646,17 @@ BOOL APIENTRY DllMain(HMODULE hModule, baselineDetourGetSystemTimePreciseAsFileTime.store(now); prevcallDetourGetSystemTimePreciseAsFileTime.store(now); - MH_HOOK( - &Sleep, &DetourSleep, reinterpret_cast (&pfnKernelSleep)); + MH_HOOK(&Sleep, + &DetourSleep, + reinterpret_cast (&pfnKernelSleep)); + MH_HOOK(&SleepEx, + &DetourSleepEx, + reinterpret_cast(&pfnKernelSleepEx)); + + pSetWaitableTimerEx = (SETWAITABLETIMEREX)GetProcAddress(hKernel32, "SetWaitableTimerEx"); + MH_HOOK(pSetWaitableTimerEx, + &DetourSetWaitableTimerEx, + reinterpret_cast(&pfnKernelSetWaitableTimerEx)); MH_HOOK(&SetTimer, &DetourSetTimer, reinterpret_cast (&pfnKernelSetTimer)); @@ -617,6 +685,8 @@ BOOL APIENTRY DllMain(HMODULE hModule, &DetourGetSystemTimePreciseAsFileTime, reinterpret_cast ( &pfnKernelGetSystemTimePreciseAsFileTime)); + + break; case DLL_THREAD_ATTACH: break; @@ -633,6 +703,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, MH_UNHOOK(pfnKernelSleep); MH_UNHOOK(pfnKernelSetTimer); MH_UNHOOK(pfnKernelTimeGetTime); + MH_UNHOOK(pfnKernelTimeSetEvent); MH_UNHOOK(pfnKernelGetTickCount); MH_UNHOOK(pfnKernelGetTickCount64); MH_UNHOOK(pfnKernelQueryPerformanceCounter); diff --git a/translations/OpenSpeedy_en_US.qm b/translations/OpenSpeedy_en_US.qm index 4f228c80ff577552cc33051bb75aad92ffe82e3c..f8f05e9c5dfc4f3c184af0d169110229867b801a 100644 GIT binary patch delta 500 zcmX}oO-K}B7zgnG%+9JioAa8kv+E-2668U)B|&RMTcr;_K-+`fBHL`m{6NvVCP;;- z2e%OsM3)YNw+$9D6cf65DGD?R6vaa(in-eEA+hWaLNhQwo|)%;=Xw7xjZemCp2r0= zt^%nl5cdMkoAf??3M6WPoO@xv->Aojlw%1ey3gDQM zcB)H(OnZ3FXIqp{s@C|@6F&4`Jyps^bbe`4Zm(|w8PAl%dDhl9O8nhl*44^UbQw_B ztlr3H;9`f_EZvn3%&6q_EZKg?8o1G>n*OI9aAm3$>ux~aQ)}w>0rAn?VsDe_lXZ87 zT{B9`0L!4(ekG6R8`HKfMY*BFY?hrytCpC0z%gcMkgn2)K$eBJ&|>8yB^^1^nC5V+KEDIpdYaRKZ9wUf%YktMf*ATPPT-x6Fwm p{aeMx0s`noH(C%vA8$VYFHqx=R|~sKlRsvM&276QreqD+{sAmOirxSK delta 402 zcmXBQ-77<390&04IXh-&D$hTa5`aM0*_xJ5N_D*}}@(OG~=Q)sS1zyVmheCU44UlXB zoVj72&nvKReh0Gr^n*^&B#qHe`YZ*j_W;DCdyg5&?3M1D8IXPy-twpu@^`}}V808$ z_$qgm+F2dQ(3PgE8^GpMUUoRAtSPVCznm?~+v*`;y-X>OoG_ux=#v7{im@s=oRjKT zw2kQzYue8kE1p^FuUvrqWIRX#r=FG?TL9EXQ83;Qh#pb2xeRDWMnKj(Y!@P)Ujdl9 zL?RyHf<^Jzo?uvsNG|YtMvxBBc{)fB=n(y&!)#wjM`*kF3_bJRwXr3;)pgBsTFfd- z#;vTEW+$}lhAcoY)?8KNJRa0saX;r7E$3{C%fJ8CyA8L=Vcr1AoCc@@Btv=gucuA;Ql z-2w>1cpfP2lYe)75fQ!FVX)F@MBi^5lTmVP?alM%iS4||yxetncVOZYQgoOea_#w>429a_06 z&NM`McT{waJpszML~pj1+hRA_e2eWbKL=|CJH^A+;mOfk?XAOuvBU-2g7dgztL^j3 eo%2&=|08NHet#wV`q9^Ccg;7dJ5i{JIQ{`GfQcOd delta 402 zcmXBQJxD@f6b9h;UazK-_nN;YVM#v_WQJf+RAOK`B|>vqSx{im(%4Xq1<8e=L5y0W z#lZfNh?d+6iWadF!mKFGbVx`#(DZQ5`8en0E7(u%>t>4@7`X#v2SDBm=$gqrybx%!y zDA#Y-zH>dR1{!U1?&Jf&H*vW$s-<&W{-gq^3fx!p3Q!uP*2p!@pTsf7%Pfdd#$Zxc z6hAQvreTz--&qQoQuZZH0Q)AsFy14&<|Aa@hykDv@$MwS)(t^ryDx} ziHFaoBY@(AfAwW4)+S#J(`(_G90$}|a)KNnC&_s-KyHy!