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 4f228c8..f8f05e9 100644
Binary files a/translations/OpenSpeedy_en_US.qm and b/translations/OpenSpeedy_en_US.qm differ
diff --git a/translations/OpenSpeedy_zh_TW.qm b/translations/OpenSpeedy_zh_TW.qm
index 4598c7c..efe881c 100644
Binary files a/translations/OpenSpeedy_zh_TW.qm and b/translations/OpenSpeedy_zh_TW.qm differ