73 lines
1.8 KiB
Rust
73 lines
1.8 KiB
Rust
#![allow(clippy::zombie_processes)]
|
|
|
|
use crate::util::consts::{ENHANCED, LEGACY};
|
|
use std::{os::windows::process::CommandExt, path::Path, process::Command};
|
|
use sysinfo::System;
|
|
|
|
const FILTER_NAME: &str = "[GTA Tools] Block all traffic for GTA V";
|
|
const CREATE_NO_WINDOW: u32 = 0x0800_0000;
|
|
|
|
fn get_game_exe_path(sysinfo: &mut System) -> Option<&Path> {
|
|
sysinfo.refresh_all();
|
|
if let Some((_, process)) = sysinfo
|
|
.processes()
|
|
.iter()
|
|
.find(|(_, p)| p.name() == ENHANCED || p.name() == LEGACY)
|
|
{
|
|
process.exe()
|
|
} else {
|
|
None
|
|
}
|
|
}
|
|
|
|
pub fn block_all(sysinfo: &mut System) {
|
|
let Some(exe_path) = get_game_exe_path(sysinfo) else {
|
|
return;
|
|
};
|
|
let exe_path = exe_path.display().to_string();
|
|
Command::new("netsh")
|
|
.args([
|
|
"advfirewall",
|
|
"firewall",
|
|
"add",
|
|
"rule",
|
|
&format!("name={FILTER_NAME}"),
|
|
"dir=out",
|
|
"action=block",
|
|
"protocol=ANY",
|
|
&format!("program={exe_path}"),
|
|
])
|
|
.creation_flags(CREATE_NO_WINDOW)
|
|
.spawn()
|
|
.unwrap();
|
|
Command::new("netsh")
|
|
.args([
|
|
"advfirewall",
|
|
"firewall",
|
|
"add",
|
|
"rule",
|
|
&format!("name={FILTER_NAME}"),
|
|
"dir=in",
|
|
"action=block",
|
|
"protocol=ANY",
|
|
&format!("program={exe_path}"),
|
|
])
|
|
.creation_flags(CREATE_NO_WINDOW)
|
|
.spawn()
|
|
.unwrap();
|
|
}
|
|
|
|
pub fn unblock_all() {
|
|
Command::new("netsh")
|
|
.args([
|
|
"advfirewall",
|
|
"firewall",
|
|
"delete",
|
|
"rule",
|
|
&format!("name={FILTER_NAME}"),
|
|
])
|
|
.creation_flags(CREATE_NO_WINDOW)
|
|
.spawn()
|
|
.unwrap();
|
|
}
|