From f63d24ea43581877706b6aae729defb28b7f499e Mon Sep 17 00:00:00 2001 From: futile Date: Tue, 9 Sep 2025 03:03:32 +0100 Subject: [PATCH] improve reliability and logging when running into game access denied issues --- src/features/empty_session.rs | 15 ++++++++++++--- src/features/force_close.rs | 12 ++++++++++-- src/gui/app.rs | 9 ++++++--- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/features/empty_session.rs b/src/features/empty_session.rs index 7c6e0a2..31c9e2e 100644 --- a/src/features/empty_session.rs +++ b/src/features/empty_session.rs @@ -1,6 +1,7 @@ use crate::util::{ consts::game::{EXE_ENHANCED, EXE_LEGACY}, countdown::Countdown, + log, }; use std::time::{Duration, Instant}; use sysinfo::System; @@ -61,14 +62,22 @@ fn get_gta_pid(sysinfo: &mut System) -> Option { } } -pub fn activate(game_handle: &mut HANDLE, sysinfo: &mut System) { +pub fn activate(game_handle: &mut HANDLE, sysinfo: &mut System) -> Result<(), ()> { let Some(pid) = get_gta_pid(sysinfo) else { - return; + return Err(()); }; unsafe { - *game_handle = OpenProcess(PROCESS_SUSPEND_RESUME, false, pid).unwrap(); + match OpenProcess(PROCESS_SUSPEND_RESUME, false, pid) { + Ok(handle) => *game_handle = handle, + Err(why) => { + let message = format!("failed to suspend game for empty session:\n{why}"); + log::log(log::LogLevel::Error, &message); + return Err(()); + } + } let _ = NtSuspendProcess(*game_handle); } + Ok(()) } pub fn deactivate(game_handle: &mut HANDLE) { diff --git a/src/features/force_close.rs b/src/features/force_close.rs index 605e5ca..6f39a0a 100644 --- a/src/features/force_close.rs +++ b/src/features/force_close.rs @@ -1,4 +1,7 @@ -use crate::util::consts::game::{EXE_ENHANCED, EXE_LEGACY}; +use crate::util::{ + consts::game::{EXE_ENHANCED, EXE_LEGACY}, + log, +}; use std::time::{Duration, Instant}; use sysinfo::System; @@ -58,7 +61,12 @@ fn activate(sysinfo: &mut System) { .iter() .filter(|(_, p)| p.name() == EXE_ENHANCED || p.name() == EXE_LEGACY) .for_each(|(_, p)| { - p.kill(); + if p.kill() == false { + log::log( + log::LogLevel::Error, + "failed to force close game, probably due to access denied", + ); + } }); sysinfo.refresh_all(); } diff --git a/src/gui/app.rs b/src/gui/app.rs index 416b11b..2be89cb 100644 --- a/src/gui/app.rs +++ b/src/gui/app.rs @@ -117,9 +117,12 @@ impl App { ui.add_enabled_ui(!self.empty_session.disabled, |ui| { ui.horizontal(|ui| { if ui.button("Empty current session").clicked() { - self.empty_session.interval = Instant::now(); - self.empty_session.disabled = true; - features::empty_session::activate(&mut self.game_handle, &mut self.sysinfo); + if features::empty_session::activate(&mut self.game_handle, &mut self.sysinfo) + .is_ok() + { + self.empty_session.interval = Instant::now(); + self.empty_session.disabled = true; + } } ui.label(&self.empty_session.countdown.i_string); });