diff --git a/Resources/Devices.es.resx b/Resources/Devices.es.resx
index 30131e9..a2d2cb9 100644
--- a/Resources/Devices.es.resx
+++ b/Resources/Devices.es.resx
@@ -516,6 +516,12 @@
Hace que todos los procesos compartan el temporizador más fino que pida una aplicación, como en Windows 10. Aumenta el consumo; mantenlo solo si un juego antiguo concreto lo necesita.
+
+ Estado mínimo del procesador bloqueado
+
+
+ Una herramienta de ajustes redujo el valor más alto que Windows permite para el estado mínimo del procesador (normalmente 100 %). La configuración queda fija en ese valor, el editor del plan no puede subirla y el ajuste de limitación de la CPU puede fallar. La reparación restablece el límite de Windows del 100 %.
+
Scripts de Marius Heier
diff --git a/Resources/Devices.it.resx b/Resources/Devices.it.resx
index 231acca..def3b5d 100644
--- a/Resources/Devices.it.resx
+++ b/Resources/Devices.it.resx
@@ -516,6 +516,12 @@
Fa condividere a tutti i processi il timer più fine richiesto da un'app, come in Windows 10. Aumenta i consumi; tienilo solo se serve a un vecchio gioco specifico.
+
+ Stato minimo del processore bloccato
+
+
+ Un tool di tweak ha abbassato il valore massimo che Windows consente per lo stato minimo del processore (normalmente 100%). L'impostazione resta bloccata su quel valore, l'editor del piano non può alzarla e il tweak sul throttling della CPU può fallire. La correzione ripristina il limite di Windows al 100%.
+
Script di Marius Heier
diff --git a/Resources/Devices.ja.resx b/Resources/Devices.ja.resx
index 10673a8..c2e798a 100644
--- a/Resources/Devices.ja.resx
+++ b/Resources/Devices.ja.resx
@@ -516,6 +516,12 @@
Windows 10 と同様に、いずれかのアプリが要求した最も細かいタイマーをすべてのプロセスで共有させます。消費電力が増えるため、特定の古いゲームで必要な場合のみ維持してください。
+
+ 最小のプロセッサの状態がロックされています
+
+
+ チューニングツールが、最小のプロセッサの状態に Windows が許可する上限値(通常は 100%)を下げています。設定はその値に固定され、電源プランエディターでは上げられず、CPU スロットリングの調整が失敗する場合があります。修復すると Windows の上限 100% に戻ります。
+
Marius Heier のスクリプト
diff --git a/Resources/Devices.resx b/Resources/Devices.resx
index a11ca13..6486ade 100644
--- a/Resources/Devices.resx
+++ b/Resources/Devices.resx
@@ -516,6 +516,12 @@
Makes every process share the finest timer any app requests, as on Windows 10. It raises power use; keep it only if a specific old game needs it.
+
+ Minimum processor state locked
+
+
+ A tweaking tool lowered the highest value Windows allows for minimum processor state (normally 100%). The setting stays stuck at that value, the power plan editor cannot raise it and the CPU throttling tweak may fail. The repair puts the Windows limit of 100% back.
+
Marius Heier scripts
diff --git a/Resources/Devices.ru.resx b/Resources/Devices.ru.resx
index 0015b56..451f397 100644
--- a/Resources/Devices.ru.resx
+++ b/Resources/Devices.ru.resx
@@ -516,6 +516,12 @@
Заставляет все процессы использовать самый точный таймер, запрошенный любым приложением, как в Windows 10. Повышает энергопотребление; оставляйте только если это нужно конкретной старой игре.
+
+ Минимальное состояние процессора заблокировано
+
+
+ Утилита твиков снизила максимальное значение, которое Windows допускает для минимального состояния процессора (обычно 100%). Параметр застревает на этом значении, редактор схемы не может его повысить, а твик троттлинга ЦП может не сработать. Исправление возвращает предел Windows в 100%.
+
Скрипты Marius Heier
diff --git a/Resources/Devices.zh-CN.resx b/Resources/Devices.zh-CN.resx
index 5248e51..b299246 100644
--- a/Resources/Devices.zh-CN.resx
+++ b/Resources/Devices.zh-CN.resx
@@ -516,6 +516,12 @@
使所有进程共享任一应用请求的最高计时器精度(与 Windows 10 相同)。会增加功耗;仅在特定旧游戏需要时保留。
+
+ 最小处理器状态被锁定
+
+
+ 某个优化工具降低了 Windows 允许的最小处理器状态上限(通常为 100%)。该设置会卡在这个值,电源计划编辑器无法调高它,CPU 节流优化也可能失败。修复会恢复 Windows 的 100% 上限。
+
Marius Heier 脚本
diff --git a/Services/TweakCheckService.cs b/Services/TweakCheckService.cs
index d20c032..112a307 100644
--- a/Services/TweakCheckService.cs
+++ b/Services/TweakCheckService.cs
@@ -33,6 +33,9 @@ private TweakCheckService() { }
private const string Csrss = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\csrss.exe\PerfOptions";
private const string Dwm = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Dwm";
private const string Mouse = @"HKEY_CURRENT_USER\Control Panel\Mouse";
+ // Definition of "Minimum processor state": ValueMax is the highest value any plan may use (Windows default 100).
+ private const string MinProcessorState = Control + @"\Power\PowerSettingsť33251-82be-4824-96c1-47b60b740d00\893dee8e-2bef-41e0-89c6-b55d0929964c";
+ internal const int DefaultProcessorStateMax = 100;
internal const int DefaultSvcHostSplitThreshold = 0x380000;
internal static readonly string[] BcdTimerValues = ["useplatformclock", "disabledynamictick", "useplatformtick", "tscsyncpolicy"];
private static readonly string[] RawMouseThrottleValues = ["RawMouseThrottleEnabled", "RawMouseThrottleForced", "RawMouseThrottleDuration", "RawMouseThrottleLeeway"];
@@ -100,7 +103,11 @@ .. DeleteExisting(MemoryManagement, "IoPageLockLimit", "CacheUnmapBehindLengthIn
],
Show(MemoryManagement, "DisablePagingExecutive", "LargeSystemCache", "IoPageLockLimit", "CacheUnmapBehindLengthInMB"), restart: true),
Check("RawMouseThrottle", DeleteExisting(Mouse, RawMouseThrottleValues), Show(Mouse, RawMouseThrottleValues)),
- Check("GlobalTimer", DeleteExisting(Kernel, "GlobalTimerResolutionRequests"), Show(Kernel, "GlobalTimerResolutionRequests"), restart: true)
+ Check("GlobalTimer", DeleteExisting(Kernel, "GlobalTimerResolutionRequests"), Show(Kernel, "GlobalTimerResolutionRequests"), restart: true),
+ Check("ProcessorStateRange",
+ Value(MinProcessorState, "ValueMax") is int max && max < DefaultProcessorStateMax
+ ? [new(MinProcessorState, "ValueMax", DefaultProcessorStateMax)] : [],
+ Show(MinProcessorState, "ValueMax"), restart: true)
};
return checks.Select(check => check with { Managed = ManagedValues(check.Id) }).ToList();
}
@@ -120,6 +127,7 @@ private static RegistryValueChange[] ManagedValues(string id)
"MemoryManagement" => Values(MemoryManagement, "DisablePagingExecutive", "LargeSystemCache", "IoPageLockLimit", "CacheUnmapBehindLengthInMB"),
"RawMouseThrottle" => Values(Mouse, RawMouseThrottleValues),
"GlobalTimer" => Values(Kernel, "GlobalTimerResolutionRequests"),
+ "ProcessorStateRange" => Values(MinProcessorState, "ValueMax"),
_ => []
};
}
diff --git a/TweakHub.Tests/DevicesLatencyTests.cs b/TweakHub.Tests/DevicesLatencyTests.cs
index 2d813f1..c24052b 100644
--- a/TweakHub.Tests/DevicesLatencyTests.cs
+++ b/TweakHub.Tests/DevicesLatencyTests.cs
@@ -152,7 +152,8 @@ public void TweakChecksFlagBadValuesAndBuildRepairs()
[(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management", "FeatureSettingsOverride")] = 3,
[(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management", "LargeSystemCache")] = 1,
[(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control", "SvcHostSplitThresholdInKB")] = 0x380000,
- [(@"HKEY_CURRENT_USER\Control Panel\Mouse", "RawMouseThrottleEnabled")] = 1
+ [(@"HKEY_CURRENT_USER\Control Panel\Mouse", "RawMouseThrottleEnabled")] = 1,
+ [(@"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettingsť33251-82be-4824-96c1-47b60b740d00\893dee8e-2bef-41e0-89c6-b55d0929964c", "ValueMax")] = 0
};
var checks = TweakCheckService.Evaluate(name => values.GetValueOrDefault((name.Key, name.Value)), ["useplatformclock"], "Restricted")
.ToDictionary(check => check.Id);
@@ -168,10 +169,13 @@ public void TweakChecksFlagBadValuesAndBuildRepairs()
Assert.That(checks["AutoTuning"].RepairScript, Does.Contain("autotuninglevel=normal"));
Assert.That(checks["ThreadDpc"].Status, Is.EqualTo(TweakCheckStatus.Ok));
Assert.That(checks["InputQueues"].Managed, Has.Count.EqualTo(2), "Undo can find backups even after the repair");
+ Assert.That(checks["ProcessorStateRange"].Repair.Single().Value, Is.EqualTo(100), "A lowered limit goes back to the Windows default");
});
var withoutAdmin = TweakCheckService.Evaluate(_ => null, null, "Normal").Single(check => check.Id == "BcdTimers");
Assert.That(withoutAdmin.Status, Is.EqualTo(TweakCheckStatus.NeedsAdministrator));
+ Assert.That(TweakCheckService.Evaluate(_ => 100, [], "Normal").Single(check => check.Id == "ProcessorStateRange").Status,
+ Is.EqualTo(TweakCheckStatus.Ok), "The Windows default is not flagged");
}
[Test]