Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
194 commits
Select commit Hold shift + click to select a range
641bde8
Bump Microsoft.Windows.CsWin32 from 0.3.183 to 0.3.275
dependabot[bot] May 15, 2026
d37d85f
Merge pull request #5 from faizinuha/dependabot/nuget/Bloxstrap/Micro…
tsukiforge May 15, 2026
a19d6bc
Update BoneFish
tsukiforge May 15, 2026
2acf63f
FIx Update
tsukiforge May 15, 2026
25c9a25
Update Fx
tsukiforge May 15, 2026
8e91301
Update wpfui submodule
tsukiforge May 15, 2026
6f51fbe
Fix artifact compatibility - use v4
tsukiforge May 15, 2026
5b52d1b
Fix artifact compatibility - use v4
tsukiforge May 15, 2026
2af2ab0
update version 3.0.8
tsukiforge May 15, 2026
c823ffd
Fix
tsukiforge May 15, 2026
d8b4cc0
FIx p
tsukiforge May 15, 2026
f49af1a
Fix
tsukiforge May 15, 2026
2c555f9
update version 3.0.9
tsukiforge May 15, 2026
f60d740
Bump actions/download-artifact from 4 to 8
dependabot[bot] May 15, 2026
2e87551
Bump actions/checkout from 4 to 6
dependabot[bot] May 15, 2026
96075b7
Fix csproj encoding and update workflows
tsukiforge May 16, 2026
adc9b78
Fix csproj encoding and update workflows
tsukiforge May 16, 2026
3c3f1ae
Bump actions/upload-artifact from 4 to 7
dependabot[bot] May 16, 2026
39224e6
Merge pull request #8 from faizinuha/dependabot/github_actions/action…
tsukiforge May 16, 2026
190d828
Merge pull request #7 from faizinuha/dependabot/github_actions/action…
tsukiforge May 16, 2026
b6a1a9d
Merge pull request #6 from faizinuha/dependabot/github_actions/action…
tsukiforge May 16, 2026
485e01f
CI/Cd
tsukiforge May 16, 2026
0bb13ed
Update Fix Mingrate
tsukiforge May 16, 2026
36bd258
Update Fix Mingrate1
tsukiforge May 16, 2026
ce7dec9
update 3.1.0 Version
tsukiforge May 18, 2026
22a219d
Bump actions/download-artifact from 4 to 8
dependabot[bot] May 19, 2026
a21d45e
Bump actions/upload-artifact from 4 to 7
dependabot[bot] May 19, 2026
76514aa
Bump actions/checkout from 4 to 6
dependabot[bot] May 19, 2026
29f4c76
Bump Microsoft.Windows.CsWin32 from 0.3.183 to 0.3.275
dependabot[bot] May 19, 2026
041f89d
Bump SharpVectors.Wpf from 1.8.4.2 to 1.8.5
dependabot[bot] May 19, 2026
73f66eb
Bump XamlAnimatedGif from 2.3.0 to 2.3.2
dependabot[bot] May 19, 2026
8d918fb
(Chore) Update 3.2.0 v1
tsukiforge May 20, 2026
de8bea0
Merge pull request #14 from faizinuha/dependabot/nuget/Bloxstrap/Xaml…
tsukiforge May 20, 2026
9f029aa
Merge pull request #13 from faizinuha/dependabot/nuget/Bloxstrap/Shar…
tsukiforge May 20, 2026
128e50b
Merge pull request #9 from faizinuha/dependabot/github_actions/action…
tsukiforge May 20, 2026
651203e
Merge pull request #10 from faizinuha/dependabot/github_actions/actio…
tsukiforge May 20, 2026
ae3e0b8
Merge pull request #12 from faizinuha/dependabot/nuget/Bloxstrap/Micr…
tsukiforge May 20, 2026
580ef86
Merge pull request #11 from faizinuha/dependabot/github_actions/actio…
tsukiforge May 20, 2026
7dc3fa7
Update version Net 6 -> Net 9
tsukiforge May 30, 2026
3078437
Up
tsukiforge May 30, 2026
ca4cc73
Update
tsukiforge May 30, 2026
2e850a3
Change Jekyll source and destination paths
tsukiforge May 30, 2026
c30a717
Create static.yml
tsukiforge May 30, 2026
9492495
Update
tsukiforge May 30, 2026
e78a1a3
Bump actions/upload-pages-artifact from 3 to 5
dependabot[bot] Jun 3, 2026
5eec265
Bump actions/configure-pages from 5 to 6
dependabot[bot] Jun 3, 2026
07fab79
Bump actions/checkout from 4 to 6
dependabot[bot] Jun 3, 2026
91109a6
Update v3.3.3
tsukiforge Jun 4, 2026
596b42b
Merge pull request #17 from faizinuha/dependabot/github_actions/actio…
tsukiforge Jun 4, 2026
5e25377
Merge pull request #16 from faizinuha/dependabot/github_actions/actio…
tsukiforge Jun 4, 2026
92574ee
Merge pull request #15 from faizinuha/dependabot/github_actions/actio…
tsukiforge Jun 4, 2026
d8293f3
(Fix_)
tsukiforge Jun 4, 2026
d00d573
Fix NuGet package references for notifications
tsukiforge Jun 4, 2026
659348c
Update
tsukiforge Jun 4, 2026
c1254a0
(Fix_) 1
tsukiforge Jun 4, 2026
a698392
( Update ) + New Features
tsukiforge Jun 5, 2026
af814c7
update
tsukiforge Jun 5, 2026
af60b06
Up
tsukiforge Jun 5, 2026
20ade73
Update repo
tsukiforge Jun 8, 2026
b3282ad
Bump wpfui from `1ae3f32` to `25cee6b`
dependabot[bot] Jun 8, 2026
0094eb3
Merge pull request #18 from BoneFishStudio/dependabot/submodules/wpfu…
tsukiforge Jun 9, 2026
fa63d58
Update Desain Sofwere[ Beta ]
tsukiforge Jun 9, 2026
2f0641e
Update Desain Sofwere[ Beta ]
tsukiforge Jun 9, 2026
5773f38
Update Desain Sofwere[ Beta ]
tsukiforge Jun 9, 2026
4d7c3b9
Update Ui & Optimize New Desain
tsukiforge Jun 10, 2026
a0cdd33
Publish Release 3.7.0
tsukiforge Jun 10, 2026
8645ef0
Add comprehensive logging for wallpaper debugging
tsukiforge Jun 10, 2026
884965f
Add comprehensive logging for wallpaper debugging
tsukiforge Jun 14, 2026
05bd0a0
Fix
tsukiforge Jun 14, 2026
c83e88e
update
tsukiforge Jun 14, 2026
1379d1e
Publish Release 3.8.3
tsukiforge Jun 14, 2026
faf3a28
Publish Release 3.8.4
tsukiforge Jun 14, 2026
74b1dd8
Publish Release 3.8.4
tsukiforge Jun 14, 2026
9c1a595
Bump Markdig from 0.40.0 to 1.3.0
dependabot[bot] Jun 15, 2026
155f4a0
Bump Microsoft.Windows.CsWin32 from 0.3.275 to 0.3.296
dependabot[bot] Jun 15, 2026
8122d88
Fix
tsukiforge Jun 16, 2026
bf1ee8a
Merge pull request #21 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Jun 16, 2026
8d2646b
Merge pull request #20 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Jun 16, 2026
1ebcc1b
Bump Microsoft.Diagnostics.Tracing.TraceEvent from 3.2.3 to 3.2.4
dependabot[bot] Jun 16, 2026
38c2d43
Bump actions/checkout from 6 to 7
dependabot[bot] Jun 18, 2026
405d1d4
New Fitur Exstream Fast Flag
tsukiforge Jul 3, 2026
9a42714
Merge branch 'main' of https://github.com/BoneFishStudio/BoneFish
tsukiforge Jul 3, 2026
25bd991
Merge pull request #22 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Jul 3, 2026
d30710c
Bump Microsoft.Windows.CsWin32 from 0.3.296 to 0.3.298
dependabot[bot] Jul 3, 2026
b0a8436
Bump Markdig from 1.3.0 to 1.3.2
dependabot[bot] Jul 3, 2026
1dec191
New Fitur Exstream Fast Flag
tsukiforge Jul 3, 2026
13b74e6
Merge branch 'main' of https://github.com/BoneFishStudio/BoneFish
tsukiforge Jul 3, 2026
4cd72df
fix
tsukiforge Jul 3, 2026
a6eb864
fix
tsukiforge Jul 3, 2026
ae13ca8
update
tsukiforge Jul 3, 2026
f7a3c19
Update
tsukiforge Jul 4, 2026
fcf3c35
v1
tsukiforge Jul 4, 2026
4d6596c
udpaet 4.1.0
tsukiforge Jul 4, 2026
22c702c
update & fux
tsukiforge Jul 4, 2026
f773e80
update v3
tsukiforge Jul 5, 2026
93b95ae
v4
tsukiforge Jul 5, 2026
20685ec
Update program bonefish fast flag
tsukiforge Jul 5, 2026
e26c65d
Update program bonefish fast flag
tsukiforge Jul 5, 2026
553b5a1
downgrade 5.0.0 -> 4.5.0
tsukiforge Jul 10, 2026
467be27
Merge branch 'origin/main' into local v4.5.0 work
tsukiforge Jul 10, 2026
f423397
fix(App.xaml): remove v4.5.0 preset migration footgun
tsukiforge Jul 10, 2026
63dcd89
v5
tsukiforge Jul 10, 2026
6ef5e5b
update
tsukiforge Jul 10, 2026
0ab6c94
v5
tsukiforge Jul 11, 2026
9f5ef77
v1
tsukiforge Jul 11, 2026
8ca4de3
v5.1.0 - Crosshair Overlay, Global Hotkeys, Turbo Mode, Cleanup Wallp…
tsukiforge Jul 12, 2026
b860553
v5.1.0 - Fix Crosshair/Hotkey bug, restore Wallpaper, rename FastFlag…
Jul 15, 2026
b1fca7c
v5.1.0 - Fix wallpaper auto-load bug (pindah ke ExperimentalViewModel)
Jul 15, 2026
f485b41
v5.1.0 - Fix 3 minor memory leak: ActivityWatcher History auto-prune,…
Jul 15, 2026
9c2bbd0
v5.1.0 - Update CHANGELOG.md with all fixes: Crosshair/Hotkey bug, Wa…
Jul 15, 2026
328d1f3
v5.3.0 - Optimasi Total: Rounding Fix, HDD DeviceIoControl, Custom Wa…
Jul 16, 2026
95080fa
v5.3.1 - Refactor: ApplyHDDBalancedOptimizations delegates to ApplyAg…
tsukiforge Jul 16, 2026
4a37517
v5.3.1 - UX: hapus tombol 'Pilih' redundan di baris Custom wallpaper
tsukiforge Jul 16, 2026
b0f9759
v5.3.1 - Docs: append CHANGELOG.md entry describing both fixes
tsukiforge Jul 16, 2026
de3228a
Bump actions/setup-dotnet from 5 to 6
dependabot[bot] Jul 16, 2026
e7f04d7
Merge pull request #27 from BoneFishStudio/dependabot/github_actions/…
tsukiforge Jul 17, 2026
12cc000
Merge pull request #26 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Jul 17, 2026
f8c5b07
Merge pull request #25 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Jul 17, 2026
e047b30
Merge pull request #24 from BoneFishStudio/dependabot/github_actions/…
tsukiforge Jul 17, 2026
0196826
v5.5.0 - Wallpaper global full-screen, Repair Shortcut, Cache Cleaner…
tsukiforge Jul 17, 2026
be4683b
Fix: Hotkey auto-create CrosshairService when Watcher not running
tsukiforge Jul 17, 2026
0f7da51
Refine: Hotkey auto-create crosshair - hapus Toggle() redundant
tsukiforge Jul 17, 2026
c4264b9
Fix: EnableCrosshair=true sebelum Start() biar overlay langsung muncul
tsukiforge Jul 17, 2026
09a016c
v5.5.3: Fix FastFlags ComboBox reset + ProductVersion build config
tsukiforge Jul 18, 2026
ef45f2e
Move
tsukiforge Jul 18, 2026
bbd89bc
v6.0.0 - Network Refactor, Fast Loading Toggle, Anti Not-Responding A…
tsukiforge Jul 20, 2026
6565153
Bump Microsoft.Diagnostics.Tracing.TraceEvent from 3.2.4 to 3.2.5
dependabot[bot] Jul 20, 2026
66d226b
v6.1.0 - Auto-Reconnect + Documentation Polish
tsukiforge Jul 22, 2026
eb0e814
v6.3.1 - Fix: Icon sidebar tofu karena global font override
tsukiforge Jul 22, 2026
60eabaf
Integrate BoneFish website v1.0 as submodule + FITUR 1 & 2
tsukiforge Jul 29, 2026
c9a6b34
Merge pull request #28 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Jul 29, 2026
b67f23e
Bump version to v7.0.0
tsukiforge Jul 29, 2026
a90ea8e
Bump version to v7.0.0
tsukiforge Jul 29, 2026
6a8abaf
Update website submodule reference
tsukiforge Jul 29, 2026
a23e46b
Add Google Search Console verification file + update submodule
tsukiforge Jul 29, 2026
0c7844c
v7.0.0 - Fix krusial: freeze Not Responding saat Hapus->Yes + jaringa…
tsukiforge Aug 6, 2026
b70e0fe
v7.0.1 - Audit white-screen: memory trim SSD-only + Render-Stall Dete…
tsukiforge Aug 7, 2026
7042918
v7.0.2 - Fix kombinasi preset: LOD HDD-aware, Fast Loading re-apply, …
tsukiforge Aug 8, 2026
b169ea3
Update program bonefish fast flag
tsukiforge Aug 8, 2026
51bf49d
v7.0.5 + website v7.0.5 design & SEO, README/CHANGELOG text updates
tsukiforge Aug 9, 2026
8a986f5
v7.0.6 - TDR Mitigation Mode: kurangi freeze/layar putih (iGPU legacy…
tsukiforge Aug 10, 2026
d7f47de
v7.1.0 - Optimization Sandbox: eksperimen FastFlag reversibel + recov…
tsukiforge Aug 11, 2026
4821a94
fix: InfoBarSeverity 'Critical' -> 'Error' (runtime XAML parse error …
tsukiforge Aug 11, 2026
e5c6b52
Bump Microsoft.NET.Test.Sdk from 17.11.1 to 18.8.1
dependabot[bot] Aug 11, 2026
941adc8
Bump xunit from 2.9.2 to 2.9.3
dependabot[bot] Aug 11, 2026
ccac739
Bump xunit.runner.visualstudio from 2.8.2 to 3.1.5
dependabot[bot] Aug 11, 2026
b84fcdd
v7.1.1 - Optimization Sandbox: alur eksperimen 5 langkah + dialog Add…
tsukiforge Aug 12, 2026
67f3ec4
Merge pull request #31 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Aug 12, 2026
d85be76
Merge branch 'main' into dependabot/nuget/Bloxstrap.Tests/xunit-2.9.3
tsukiforge Aug 12, 2026
135c5de
Merge pull request #30 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Aug 12, 2026
ae47010
Merge branch 'main' into dependabot/nuget/Bloxstrap.Tests/Microsoft.N…
tsukiforge Aug 12, 2026
f6219a8
Merge pull request #29 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Aug 12, 2026
7ed7786
Update website submodule ke v7.1.1 (index hero badge, meta tags, What…
tsukiforge Aug 12, 2026
23cdac5
v7.1.2 - Fix toggle FastFlag hilang saat reload + rekomendasi FastFla…
tsukiforge Aug 12, 2026
e973d5f
Bump xunit from 2.9.2 to 2.9.3
dependabot[bot] Aug 12, 2026
0c5be68
Replace Optimization Sandbox with fail-safe Game Session Manager
tsukiforge Aug 13, 2026
7cb9a5e
v7.2.0 - Game Session Manager (pengganti Optimization Sandbox), fix R…
tsukiforge Aug 13, 2026
febb456
Bump System.Management from 9.0.0 to 10.0.11
dependabot[bot] Aug 13, 2026
a7a3092
Bump Microsoft.NET.Test.Sdk from 18.8.1 to 18.9.0
dependabot[bot] Aug 14, 2026
933d152
v7.2.5 - Game Session opt-in zero overhead, fix manual flags terhapus…
tsukiforge Aug 15, 2026
1a48fd0
v7.2.6 - fix proteksi Game Session mati tiap launch (stale recovery s…
tsukiforge Aug 16, 2026
602ad3d
Bump Microsoft.Windows.CsWin32 from 0.3.298 to 0.3.321
dependabot[bot] Aug 17, 2026
5bf0688
Bump xunit.runner.visualstudio from 2.8.2 to 4.0.0
dependabot[bot] Aug 17, 2026
0627973
v7.2.7 - rombak FastFlags berbahaya (penyebab layar putih di iGPU tua…
tsukiforge Aug 18, 2026
1ee80f9
v7.2.8 - fix headset mati suara: RAVBg64/RAVCpl64 (audio vendor servi…
tsukiforge Aug 20, 2026
8fbf3ea
v7.2.9 - Fix Mic Roblox: tambah 5 proses audio vendor ke CRITICAL list
Aug 23, 2026
e4bba3b
Merge pull request #37 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Aug 24, 2026
dbb0214
Merge pull request #36 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Aug 24, 2026
57cebf2
Merge pull request #35 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Aug 24, 2026
5de35e0
Merge pull request #34 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Aug 24, 2026
a1c223f
Merge branch 'main' into dependabot/nuget/Bloxstrap.Tests/xunit-2.9.3
tsukiforge Aug 24, 2026
e2e3a4c
Merge pull request #32 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Aug 24, 2026
4c7cbe6
Bump Microsoft.Diagnostics.Tracing.TraceEvent from 3.2.5 to 3.2.6
dependabot[bot] Aug 24, 2026
39f5239
Bump xunit from 2.9.2 to 2.9.3
dependabot[bot] Aug 24, 2026
013a372
persistent cache IsSSD (TTL 30 hari, validasi drive+serial) + tombol …
tsukiforge Aug 26, 2026
fdf8cdd
fix: serialize session lifecycle, skip log replay on reattach, enhanc…
tsukiforge Aug 30, 2026
0a03c2e
Update Bloxstrap.csproj
tsukiforge Aug 30, 2026
1429c5b
Bump Microsoft.Windows.CsWin32 from 0.3.321 to 0.3.333
dependabot[bot] Sep 3, 2026
fbf4a5a
Merge pull request #42 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Sep 4, 2026
753eba8
Merge pull request #39 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Sep 4, 2026
3d78552
Merge branch 'main' into dependabot/nuget/Bloxstrap/Microsoft.Diagnos…
tsukiforge Sep 4, 2026
71f90e5
Merge pull request #38 from BoneFishStudio/dependabot/nuget/Bloxstrap…
tsukiforge Sep 4, 2026
ec516dd
fix: tahan crash TaskDialog invalid cursor handle + migrasi Bootstrap…
tsukiforge Sep 4, 2026
f8dfea8
feat: FPS Unlocker toggle + fix log (timestamp lokal, append per hari)
tsukiforge Sep 7, 2026
3adcc42
Update version to 7.5.0 in project file
tsukiforge Sep 7, 2026
69b8083
chore: bersihkan branding Fishstrap & rapikan repo
tsukiforge Sep 8, 2026
5bb5822
docs: kembalikan README lengkap, tanpa gambar showcase
tsukiforge Sep 8, 2026
dfef7ec
docs: tambahkan link sponsor (tako.id) di README
tsukiforge Sep 8, 2026
9c6cfab
Add custom sponsorship URL to FUNDING.yml
tsukiforge Sep 8, 2026
254f98f
Update Bloxstrap.csproj
tsukiforge Sep 9, 2026
b71876b
Changes Name
tsukiforge Sep 9, 2026
ed8e746
Merge upstream v7.6.2 (tsukiforge/BoneFish) - resolve conflicts favor…
tsukiforge Sep 17, 2026
c43d46e
v7.6.3: fix storage detection, game session suspend & crosshair cente…
tsukiforge Sep 17, 2026
926016a
Bump System.Management from 10.0.11 to 10.0.12
dependabot[bot] Sep 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions Bloxstrap/Bloxstrap.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
<UseWPF>true</UseWPF>
<UseWindowsForms>True</UseWindowsForms>
<ApplicationIcon>Bloxstrap.ico</ApplicationIcon>
<Version>7.6.2</Version>
<FileVersion>7.6.2</FileVersion>
<Version>7.6.3</Version>
<FileVersion>7.6.3</FileVersion>
<AssemblyVersion>$(Version)</AssemblyVersion>
<AssemblyInformationalVersion>$(Version)</AssemblyInformationalVersion>
<ApplicationManifest>app.manifest</ApplicationManifest>
Expand Down Expand Up @@ -85,7 +85,7 @@
<PackageReference Include="securifybv.ShellLink" Version="0.1.0" />
<PackageReference Include="SharpVectors.Wpf" Version="1.8.5" />
<PackageReference Include="SharpZipLib" Version="1.4.2" />
<PackageReference Include="System.Management" Version="10.0.11" />
<PackageReference Include="System.Management" Version="10.0.12" />
<PackageReference Include="System.Resources.ResourceManager" Version="4.3.0" />
<PackageReference Include="XamlAnimatedGif" Version="2.3.2" />
<PackageReference Include="CommunityToolkit.WinUI.Notifications" Version="7.1.2" />
Expand Down
101 changes: 93 additions & 8 deletions Bloxstrap/GameSession/GameSessionService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,21 @@ public async Task<GameSessionRecord> BeginSessionAsync(CancellationToken cancell
}
}

/// <summary>
/// v7.6.3 — identitas proses dianggap cukup dikenal bila NAMA prosesnya
/// terbaca, walau path/StartTime tidak bisa dibaca (akibat handle akses
/// dibatasi pada proses tertentu, mis. browser Chromium terbaru, launcher
/// anti-cheat, atau aplikasi UWP). Dulu kondisi itu langsung diklasifikasi
/// Critical sehingga aplikasi yang justru paling ingin di-suspend tidak
/// pernah tersentuh (feedback: "aplikasi yang saya pilih tidak ikut suspend").
/// Proses tanpa nama tetap ditolak — nama dipakai untuk mencocokkan rule
/// dan untuk me-restore.
/// </summary>
public static bool IsKnownProcess(ProcessSnapshot snapshot)
{
return !String.IsNullOrWhiteSpace(snapshot.ProcessName);
}

private async Task<GameSessionRecord> BeginSessionCoreAsync(CancellationToken cancellationToken)
{
const string LOG_IDENT_LOCAL = "GameSession::BeginSession";
Expand All @@ -71,19 +86,68 @@ private async Task<GameSessionRecord> BeginSessionCoreAsync(CancellationToken ca
EndSessionCore(null);

if (Store.ReadActive() is not null)
throw new InvalidOperationException("A previous Game Session still has processes pending restore.");
{
// v7.6.3 FIX — dulu kondisi ini melempar InvalidOperationException
// SETIAP kali user masuk game, sehingga Game Session tampak "tidak
// pernah berhasil sama sekali" setelah satu kegagalan restore.
// Sekarang record pending yang tidak bisa di-restore dipulihkan
// sekaligus: semua thread di-resume lewat rescue scan, record
// dibuang, lalu sesi baru dimulai normal.
App.Logger.WriteLine(LOG_IDENT_LOCAL,
"Sesi sebelumnya masih pending restore — memaksa pemulihan dan memulai sesi baru");

try
{
IReadOnlyList<RescuedProcess> rescued = Suspension.RescueSuspendedProcesses();
App.Logger.WriteLine(LOG_IDENT_LOCAL,
$"Pemulihan paksa selesai: {rescued.Count} proses di-resume (rescue scan)");
}
catch (Exception ex)
{
App.Logger.WriteLine(LOG_IDENT_LOCAL, $"Rescue scan gagal (dilanjutkan): {ex.Message}");
}

EndSessionCore(null);
}
}

SecurityDetectionState detectorState;
try
{
detectorState = await Detector.RefreshAsync(cancellationToken);
}
catch (Exception ex)
{
// v7.6.3 FIX — kegagalan WMI (Timeout/COMException, sering di PC dengan
// antivirus third-party atau WMI repository bermasalah) dulu membuat
// BeginSessionAsync gagal total sehingga TIDAK ADA aplikasi yang
// ter-suspend. Sekarang detector yang error diperlakukan seperti
// Degraded: proses tetap aman dari daftar proteksi statis, user tetap
// bisa suspend aplikasi pilihannya sendiri.
App.Logger.WriteLine(LOG_IDENT_LOCAL, $"Detector refresh gagal — dilanjutkan sebagai Degraded: {ex.Message}");
detectorState = SecurityDetectionState.Degraded;
}

SecurityDetectionState detectorState = await Detector.RefreshAsync(cancellationToken);
List<ProcessSnapshot> processes = _processSource().ToList();

// PID semua Windows service (SCM). Service = komponen sistem/vendor —
// sinyal CRITICAL tambahan di classifier supaya audio stack, driver
// companion, dan sync service (bahkan yang jalan di session user,
// mis. OneDrive.Sync.Service) tidak pernah ter-suspend.
IReadOnlySet<int> serviceProcessIds = ServiceProcessDetector.GetServiceProcessIds(cancellationToken);
if (serviceProcessIds.Count > 0)
App.Logger.WriteLine(LOG_IDENT_LOCAL, $"{serviceProcessIds.Count} Windows service PID terdaftar sebagai protected");
// v7.6.3: kegagalan query WMI TIDAK lagi membatalkan seluruh sesi —
// cukup dengan daftar proteksi statis (ProcessClassifier) dijalankan.
IReadOnlySet<int> serviceProcessIds;
try
{
serviceProcessIds = ServiceProcessDetector.GetServiceProcessIds(cancellationToken);
if (serviceProcessIds.Count > 0)
App.Logger.WriteLine(LOG_IDENT_LOCAL, $"{serviceProcessIds.Count} Windows service PID terdaftar sebagai protected");
}
catch (Exception ex)
{
App.Logger.WriteLine(LOG_IDENT_LOCAL, $"Service PID enumeration gagal — lanjut tanpa daftar service: {ex.Message}");
serviceProcessIds = new HashSet<int>();
}

var session = new GameSessionRecord
{
Expand Down Expand Up @@ -164,8 +228,28 @@ private async Task<GameSessionRecord> BeginSessionCoreAsync(CancellationToken ca
continue;
}

ProcessSuspendResult result = Suspension.SuspendProcess(process.ProcessId, cancellationToken);
if (result.SuspendedThreadIds.Count == 0)
ProcessSuspendResult result;
try
{
result = Suspension.SuspendProcess(process.ProcessId, cancellationToken);
}
catch (OperationCanceledException)
{
throw;
}
catch (Exception ex)
{
// v7.6.3 FIX — satu proses bermasalah tidak boleh menggagalkan
// seluruh sesi (dulu exception dari SuspendProcess merambat ke
// try blok luar → EndSessionCore → SEMUA aplikasi yang sudah
// terlanjur disuspend ikut di-resume dan user kehilangan
// proteksi sepenuhnya).
App.Logger.WriteLine(LOG_IDENT_LOCAL,
$"Suspend PID={process.ProcessId} ({process.ProcessName}) gagal — dilewati: {ex.Message}");
continue;
}

if (result.SuspendedThreadIds.Count == 0 && !result.ProcessLevelSuspend)
continue;

session.AppliedRules.Add(RuleKey(rule));
Expand All @@ -179,7 +263,7 @@ private async Task<GameSessionRecord> BeginSessionCoreAsync(CancellationToken ca
AppliedRule = RuleKey(rule),
ThreadIds = result.SuspendedThreadIds,
TotalThreadCount = result.TotalThreadCount,
SuspendedThreadCount = result.SuspendedThreadIds.Count,
SuspendedThreadCount = result.ProcessLevelSuspend ? result.TotalThreadCount : result.SuspendedThreadIds.Count,
FailedThreadCount = result.FailedThreadCount,
PartiallySuspended = result.PartiallySuspended
});
Expand All @@ -188,6 +272,7 @@ private async Task<GameSessionRecord> BeginSessionCoreAsync(CancellationToken ca
App.Logger.WriteLine(
LOG_IDENT_LOCAL,
$"{process.ProcessName} ter-suspend {result.SuspendedThreadIds.Count}/{result.TotalThreadCount} thread" +
(result.ProcessLevelSuspend ? " [process-level]" : "") +
(result.PartiallySuspended ? " (PartiallySuspended)" : ""));
}
}
Expand Down
21 changes: 11 additions & 10 deletions Bloxstrap/GameSession/ProcessClassifier.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,14 @@ public static ProcessClassification Classify(
if (detector.State != SecurityDetectionState.Ok)
return ProcessClassification.Critical;

// A readable identity is required before a rule can mutate another process.
if (String.IsNullOrWhiteSpace(snapshot.ProcessName)
|| String.IsNullOrWhiteSpace(snapshot.ExecutablePath)
|| !snapshot.StartTimeUtc.HasValue)
{
// v7.6.3 FIX — dulu path executable DAN StartTime wajib terbaca, sehingga
// aplikasi yang handle aksesnya dibatasi (browser Chromium, launcher
// anti-cheat, UWP) tidak PERNAH bisa di-suspend meski user mencentangnya
// di UI (feedback: "tidak benar2 ke suspend dan masih berjalan").
// Nama proses sekarang cukup: pencocokan rule dan label restore memakai
// nama, dan keamanan target tetap dijaga daftar proteksi IsAlwaysProtected.
if (!GameSessionService.IsKnownProcess(snapshot))
return ProcessClassification.Critical;
}

return ProcessClassification.Safe;
}
Expand All @@ -97,10 +98,10 @@ public static bool IsCritical(
if (IsAlwaysProtected(snapshot, detector, selfProcessId, gameProcessId, serviceProcessIds))
return true;

// Unknown identity is never safe to touch.
return String.IsNullOrWhiteSpace(snapshot.ProcessName)
|| String.IsNullOrWhiteSpace(snapshot.ExecutablePath)
|| !snapshot.StartTimeUtc.HasValue;
// v7.6.3 — proses tanpa nama tidak bisa dicocokkan ke rule maupun
// di-restore, jadi tetap ditolak. Path/StartTime yang tak terbaca tidak
// lagi dianggap critical (lihat Classify).
return String.IsNullOrWhiteSpace(snapshot.ProcessName);
}

public static bool IsAlwaysProtected(
Expand Down
135 changes: 134 additions & 1 deletion Bloxstrap/GameSession/ProcessControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,51 @@ public interface IProcessAccessor : IDisposable
bool IsThreadSuspended(int threadId);
DateTime? GetStartTimeUtc();
long GetProcessorTimeTicks();

// v7.6.3 — suspend/resume level proses (atomik, mencakup thread yang lahir
// di tengah operasi). Implementasi boleh tidak mendukung (returns false).
bool TrySuspendProcess();
bool TryResumeProcess();
bool SupportsProcessLevelControl { get; }
}

/// <summary>
/// v7.6.3 FIX — feedback "aplikasi yang dipilih untuk di-suspend tidak benar-benar
/// ter-suspend dan masih berjalan seperti biasa".
///
/// Dulu suspend hanya per-thread via SuspendThread dengan maksimal 5 sweep pass
/// dalam 2 detik. Aplikasi seperti browser/launcher terus menambah thread baru,
/// sehingga sweep tidak pernah menangkap semuanya — thread yang lolos membuat
/// proses tetap hidup. Selain itu OpenThread(THREAD_SUSPEND_RESUME) bisa gagal
/// untuk thread yang baru dibuat, dan proses modern yang diproteksi
/// (PROCESS_SUSPEND_RESUME butuh akses eksplisit) menolak handle Process.GetProcessById.
///
/// Sekarang: NtSuspendProcess/NtResumeProcess (syscall ntdll yang sama dipakai
/// Process Explorer / pssuspend) men-suspend SELURUH proses secara atomik —
/// kernel menahan setiap thread termasuk yang baru lahir. Per-thread API tetap
/// ada sebagai fallback dan untuk verifikasi.
/// </summary>
internal sealed class Win32ProcessAccessor : IProcessAccessor
{
private const uint THREAD_SUSPEND_RESUME = 0x0002;

// PROCESS_SUSPEND_RESUME (0x0800) — hak minimal untuk NtSuspendProcess/NtResumeProcess.
private const uint PROCESS_SUSPEND_RESUME = 0x0800;

private const string LOG_IDENT = "GameSession::Win32ProcessAccessor";

private readonly Process _process;
private readonly int _processId;

public Win32ProcessAccessor(int processId)
{
_processId = processId;
_process = Process.GetProcessById(processId);
}

public int ProcessId => _process.Id;
public int ProcessId => _processId;

public bool SupportsProcessLevelControl => true;

public bool IsAlive
{
Expand All @@ -51,6 +82,94 @@ public IReadOnlyCollection<int> GetThreadIds()
}
}

public bool TrySuspendProcess()
{
if (TryProcessLevelSuspend())
return true;

// Fallback: sweep semua thread saat ini. Tidak sempurna (thread baru
// bisa lolos), tapi tetap lebih baik daripada gagal total.
int attempted = 0, succeeded = 0;
foreach (int threadId in GetThreadIds())
{
attempted++;
if (TrySuspendThread(threadId))
succeeded++;
}

App.Logger.WriteLine(LOG_IDENT,
$"PID={_processId}: NtSuspendProcess unavailable — per-thread fallback {succeeded}/{attempted} threads");
return attempted > 0 && succeeded == attempted;
}

public bool TryResumeProcess()
{
if (TryProcessLevelResume())
return true;

int attempted = 0, succeeded = 0;
foreach (int threadId in GetThreadIds())
{
attempted++;
if (TryResumeThread(threadId))
succeeded++;
}

App.Logger.WriteLine(LOG_IDENT,
$"PID={_processId}: NtResumeProcess unavailable — per-thread fallback {succeeded}/{attempted} threads");
return attempted > 0 && succeeded == attempted;
}

private bool TryProcessLevelSuspend()
{
IntPtr handle = OpenProcess(PROCESS_SUSPEND_RESUME, false, (uint)_processId);
if (handle == IntPtr.Zero)
{
App.Logger.WriteLine(LOG_IDENT,
$"PID={_processId}: OpenProcess(PROCESS_SUSPEND_RESUME) failed (error={Marshal.GetLastWin32Error()})");
return false;
}

try
{
NTSTATUS status = NtSuspendProcess(handle);
if (status != NTSTATUS.Success)
{
App.Logger.WriteLine(LOG_IDENT, $"PID={_processId}: NtSuspendProcess returned {status}");
return false;
}

return true;
}
finally
{
CloseHandle(handle);
}
}

private bool TryProcessLevelResume()
{
IntPtr handle = OpenProcess(PROCESS_SUSPEND_RESUME, false, (uint)_processId);
if (handle == IntPtr.Zero)
return false;

try
{
NTSTATUS status = NtResumeProcess(handle);
if (status != NTSTATUS.Success)
{
App.Logger.WriteLine(LOG_IDENT, $"PID={_processId}: NtResumeProcess returned {status}");
return false;
}

return true;
}
finally
{
CloseHandle(handle);
}
}

public bool TrySuspendThread(int threadId)
{
IntPtr handle = OpenThread(THREAD_SUSPEND_RESUME, false, (uint)threadId);
Expand Down Expand Up @@ -130,6 +249,9 @@ public long GetProcessorTimeTicks()

public void Dispose() => _process.Dispose();

[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr OpenProcess(uint desiredAccess, bool inheritHandle, uint processId);

[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr OpenThread(uint desiredAccess, bool inheritHandle, uint threadId);

Expand All @@ -142,5 +264,16 @@ public long GetProcessorTimeTicks()
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CloseHandle(IntPtr handle);

private enum NTSTATUS : uint
{
Success = 0x00000000
}

[DllImport("ntdll.dll")]
private static extern NTSTATUS NtSuspendProcess(IntPtr processHandle);

[DllImport("ntdll.dll")]
private static extern NTSTATUS NtResumeProcess(IntPtr processHandle);
}
}
Loading