improve reliability and logging when running into game access denied issues
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
use crate::util::{
|
use crate::util::{
|
||||||
consts::game::{EXE_ENHANCED, EXE_LEGACY},
|
consts::game::{EXE_ENHANCED, EXE_LEGACY},
|
||||||
countdown::Countdown,
|
countdown::Countdown,
|
||||||
|
log,
|
||||||
};
|
};
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
use sysinfo::System;
|
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 {
|
let Some(pid) = get_gta_pid(sysinfo) else {
|
||||||
return;
|
return Err(());
|
||||||
};
|
};
|
||||||
unsafe {
|
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);
|
let _ = NtSuspendProcess(*game_handle);
|
||||||
}
|
}
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn deactivate(game_handle: &mut HANDLE) {
|
pub fn deactivate(game_handle: &mut HANDLE) {
|
||||||
|
|||||||
@@ -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 std::time::{Duration, Instant};
|
||||||
use sysinfo::System;
|
use sysinfo::System;
|
||||||
|
|
||||||
@@ -58,7 +61,12 @@ fn activate(sysinfo: &mut System) {
|
|||||||
.iter()
|
.iter()
|
||||||
.filter(|(_, p)| p.name() == EXE_ENHANCED || p.name() == EXE_LEGACY)
|
.filter(|(_, p)| p.name() == EXE_ENHANCED || p.name() == EXE_LEGACY)
|
||||||
.for_each(|(_, p)| {
|
.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();
|
sysinfo.refresh_all();
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -117,9 +117,12 @@ impl App {
|
|||||||
ui.add_enabled_ui(!self.empty_session.disabled, |ui| {
|
ui.add_enabled_ui(!self.empty_session.disabled, |ui| {
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
if ui.button("Empty current session").clicked() {
|
if ui.button("Empty current session").clicked() {
|
||||||
|
if features::empty_session::activate(&mut self.game_handle, &mut self.sysinfo)
|
||||||
|
.is_ok()
|
||||||
|
{
|
||||||
self.empty_session.interval = Instant::now();
|
self.empty_session.interval = Instant::now();
|
||||||
self.empty_session.disabled = true;
|
self.empty_session.disabled = true;
|
||||||
features::empty_session::activate(&mut self.game_handle, &mut self.sysinfo);
|
}
|
||||||
}
|
}
|
||||||
ui.label(&self.empty_session.countdown.i_string);
|
ui.label(&self.empty_session.countdown.i_string);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user