nicen up game_networking
This commit is contained in:
@@ -11,7 +11,7 @@ use windows::{
|
|||||||
Win32::{
|
Win32::{
|
||||||
NetworkManagement::WindowsFirewall::{
|
NetworkManagement::WindowsFirewall::{
|
||||||
INetFwPolicy2, INetFwRule, NET_FW_ACTION_BLOCK, NET_FW_IP_PROTOCOL_ANY,
|
INetFwPolicy2, INetFwRule, NET_FW_ACTION_BLOCK, NET_FW_IP_PROTOCOL_ANY,
|
||||||
NET_FW_RULE_DIR_IN, NET_FW_RULE_DIR_OUT, NetFwPolicy2, NetFwRule,
|
NET_FW_RULE_DIR_OUT, NetFwPolicy2, NetFwRule,
|
||||||
},
|
},
|
||||||
System::Com::{
|
System::Com::{
|
||||||
CLSCTX_INPROC_SERVER, COINIT_MULTITHREADED, CoCreateInstance, CoInitializeEx,
|
CLSCTX_INPROC_SERVER, COINIT_MULTITHREADED, CoCreateInstance, CoInitializeEx,
|
||||||
@@ -21,8 +21,7 @@ use windows::{
|
|||||||
core::BSTR,
|
core::BSTR,
|
||||||
};
|
};
|
||||||
|
|
||||||
const FILTER_NAME_IN: &str = "[GTA Tools] Block all inbound traffic for GTA V";
|
const FILTER_NAME_EXE: &str = "[GTA Tools] Block outbound traffic for all of GTA V";
|
||||||
const FILTER_NAME_OUT: &str = "[GTA Tools] Block all outbound traffic for GTA V";
|
|
||||||
|
|
||||||
const INTERVAL: Duration = Duration::from_secs(3);
|
const INTERVAL: Duration = Duration::from_secs(3);
|
||||||
|
|
||||||
@@ -71,7 +70,7 @@ impl Drop for GameNetworking {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl GameNetworking {
|
impl GameNetworking {
|
||||||
pub fn block_all(&mut self, system_info: &mut SystemInfo) {
|
pub fn block_exe(&mut self, system_info: &mut SystemInfo) {
|
||||||
let Some(exe_path) = get_game_exe_path(system_info) else {
|
let Some(exe_path) = get_game_exe_path(system_info) else {
|
||||||
self.blocked_status = BlockedStatus::Failed;
|
self.blocked_status = BlockedStatus::Failed;
|
||||||
return;
|
return;
|
||||||
@@ -80,30 +79,24 @@ impl GameNetworking {
|
|||||||
unsafe { CoCreateInstance(&NetFwPolicy2, None, CLSCTX_INPROC_SERVER) }.unwrap();
|
unsafe { CoCreateInstance(&NetFwPolicy2, None, CLSCTX_INPROC_SERVER) }.unwrap();
|
||||||
let rules = unsafe { policy.Rules() }.unwrap();
|
let rules = unsafe { policy.Rules() }.unwrap();
|
||||||
let exe_path = BSTR::from(exe_path.to_string_lossy().to_string());
|
let exe_path = BSTR::from(exe_path.to_string_lossy().to_string());
|
||||||
for filter in [
|
unsafe { rules.Remove(&BSTR::from(FILTER_NAME_EXE)) }.unwrap();
|
||||||
(FILTER_NAME_IN, NET_FW_RULE_DIR_IN),
|
|
||||||
(FILTER_NAME_OUT, NET_FW_RULE_DIR_OUT),
|
|
||||||
] {
|
|
||||||
unsafe { rules.Remove(&BSTR::from(filter.0)) }.unwrap();
|
|
||||||
let rule: INetFwRule =
|
let rule: INetFwRule =
|
||||||
unsafe { CoCreateInstance(&NetFwRule, None, CLSCTX_INPROC_SERVER) }.unwrap();
|
unsafe { CoCreateInstance(&NetFwRule, None, CLSCTX_INPROC_SERVER) }.unwrap();
|
||||||
unsafe { rule.SetName(&BSTR::from(filter.0)) }.unwrap();
|
unsafe { rule.SetName(&BSTR::from(FILTER_NAME_EXE)) }.unwrap();
|
||||||
unsafe { rule.SetApplicationName(&exe_path) }.unwrap();
|
unsafe { rule.SetApplicationName(&exe_path) }.unwrap();
|
||||||
unsafe { rule.SetDirection(filter.1) }.unwrap();
|
unsafe { rule.SetDirection(NET_FW_RULE_DIR_OUT) }.unwrap();
|
||||||
unsafe { rule.SetEnabled(true.into()) }.unwrap();
|
unsafe { rule.SetEnabled(true.into()) }.unwrap();
|
||||||
unsafe { rule.SetAction(NET_FW_ACTION_BLOCK) }.unwrap();
|
unsafe { rule.SetAction(NET_FW_ACTION_BLOCK) }.unwrap();
|
||||||
unsafe { rule.SetProtocol(NET_FW_IP_PROTOCOL_ANY.0) }.unwrap();
|
unsafe { rule.SetProtocol(NET_FW_IP_PROTOCOL_ANY.0) }.unwrap();
|
||||||
unsafe { rules.Add(&rule) }.unwrap();
|
unsafe { rules.Add(&rule) }.unwrap();
|
||||||
}
|
|
||||||
self.blocked_status = Self::is_blocked().into();
|
self.blocked_status = Self::is_blocked().into();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn unblock_all(&mut self) {
|
pub fn unblock_exe(&mut self) {
|
||||||
let policy: INetFwPolicy2 =
|
let policy: INetFwPolicy2 =
|
||||||
unsafe { CoCreateInstance(&NetFwPolicy2, None, CLSCTX_INPROC_SERVER) }.unwrap();
|
unsafe { CoCreateInstance(&NetFwPolicy2, None, CLSCTX_INPROC_SERVER) }.unwrap();
|
||||||
let rules = unsafe { policy.Rules() }.unwrap();
|
let rules = unsafe { policy.Rules() }.unwrap();
|
||||||
unsafe { rules.Remove(&BSTR::from(FILTER_NAME_IN)) }.unwrap();
|
unsafe { rules.Remove(&BSTR::from(FILTER_NAME_EXE)) }.unwrap();
|
||||||
unsafe { rules.Remove(&BSTR::from(FILTER_NAME_OUT)) }.unwrap();
|
|
||||||
self.blocked_status = Self::is_blocked().into();
|
self.blocked_status = Self::is_blocked().into();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,12 +104,11 @@ impl GameNetworking {
|
|||||||
let policy: INetFwPolicy2 =
|
let policy: INetFwPolicy2 =
|
||||||
unsafe { CoCreateInstance(&NetFwPolicy2, None, CLSCTX_INPROC_SERVER) }.unwrap();
|
unsafe { CoCreateInstance(&NetFwPolicy2, None, CLSCTX_INPROC_SERVER) }.unwrap();
|
||||||
let rules = unsafe { policy.Rules() }.unwrap();
|
let rules = unsafe { policy.Rules() }.unwrap();
|
||||||
let in_rule_exists = unsafe { rules.Item(&BSTR::from(FILTER_NAME_IN)) }.is_ok();
|
let exe_rule_exists = unsafe { rules.Item(&BSTR::from(FILTER_NAME_EXE)) }.is_ok();
|
||||||
let out_rule_exists = unsafe { rules.Item(&BSTR::from(FILTER_NAME_OUT)) }.is_ok();
|
exe_rule_exists
|
||||||
in_rule_exists || out_rule_exists
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn if_failed_return_to_boolean(&mut self) {
|
pub fn reset_if_failed(&mut self) {
|
||||||
if self.blocked_status == BlockedStatus::Failed && !self.counting {
|
if self.blocked_status == BlockedStatus::Failed && !self.counting {
|
||||||
self.counting = true;
|
self.counting = true;
|
||||||
self.timer = Instant::now();
|
self.timer = Instant::now();
|
||||||
|
|||||||
+3
-3
@@ -168,7 +168,7 @@ impl App {
|
|||||||
.on_hover_text(
|
.on_hover_text(
|
||||||
"This turns yellow if GTA Tools\ncannot find your game.",
|
"This turns yellow if GTA Tools\ncannot find your game.",
|
||||||
);
|
);
|
||||||
self.game_networking.if_failed_return_to_boolean();
|
self.game_networking.reset_if_failed();
|
||||||
label
|
label
|
||||||
});
|
});
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
@@ -179,13 +179,13 @@ impl App {
|
|||||||
.add_sized([button_width, 18.0], egui::Button::new("Block"))
|
.add_sized([button_width, 18.0], egui::Button::new("Block"))
|
||||||
.clicked()
|
.clicked()
|
||||||
{
|
{
|
||||||
self.game_networking.block_all(&mut self.system_info);
|
self.game_networking.block_exe(&mut self.system_info);
|
||||||
}
|
}
|
||||||
if ui
|
if ui
|
||||||
.add_sized([button_width, 18.0], egui::Button::new("Unblock"))
|
.add_sized([button_width, 18.0], egui::Button::new("Unblock"))
|
||||||
.clicked()
|
.clicked()
|
||||||
{
|
{
|
||||||
self.game_networking.unblock_all();
|
self.game_networking.unblock_exe();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user