improve reliability and logging when running into game access denied issues

This commit is contained in:
2025-09-09 03:03:32 +01:00
parent 356d5f17e5
commit f63d24ea43
3 changed files with 28 additions and 8 deletions
+12 -3
View File
@@ -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<u32> {
}
}
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) {
+10 -2
View File
@@ -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();
}
+6 -3
View File
@@ -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);
});