diff --git a/src/features/game_networking.rs b/src/features/game_networking.rs index 9468203..afad2a8 100644 --- a/src/features/game_networking.rs +++ b/src/features/game_networking.rs @@ -11,7 +11,7 @@ use windows::{ Win32::{ NetworkManagement::WindowsFirewall::{ 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::{ CLSCTX_INPROC_SERVER, COINIT_MULTITHREADED, CoCreateInstance, CoInitializeEx, @@ -21,8 +21,7 @@ use windows::{ core::BSTR, }; -const FILTER_NAME_IN: &str = "[GTA Tools] Block all inbound traffic for GTA V"; -const FILTER_NAME_OUT: &str = "[GTA Tools] Block all outbound traffic for GTA V"; +const FILTER_NAME_EXE: &str = "[GTA Tools] Block outbound traffic for all of GTA V"; const INTERVAL: Duration = Duration::from_secs(3); @@ -71,7 +70,7 @@ impl Drop for 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 { self.blocked_status = BlockedStatus::Failed; return; @@ -80,30 +79,24 @@ impl GameNetworking { unsafe { CoCreateInstance(&NetFwPolicy2, None, CLSCTX_INPROC_SERVER) }.unwrap(); let rules = unsafe { policy.Rules() }.unwrap(); let exe_path = BSTR::from(exe_path.to_string_lossy().to_string()); - for filter in [ - (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 = - unsafe { CoCreateInstance(&NetFwRule, None, CLSCTX_INPROC_SERVER) }.unwrap(); - unsafe { rule.SetName(&BSTR::from(filter.0)) }.unwrap(); - unsafe { rule.SetApplicationName(&exe_path) }.unwrap(); - unsafe { rule.SetDirection(filter.1) }.unwrap(); - unsafe { rule.SetEnabled(true.into()) }.unwrap(); - unsafe { rule.SetAction(NET_FW_ACTION_BLOCK) }.unwrap(); - unsafe { rule.SetProtocol(NET_FW_IP_PROTOCOL_ANY.0) }.unwrap(); - unsafe { rules.Add(&rule) }.unwrap(); - } + unsafe { rules.Remove(&BSTR::from(FILTER_NAME_EXE)) }.unwrap(); + let rule: INetFwRule = + unsafe { CoCreateInstance(&NetFwRule, None, CLSCTX_INPROC_SERVER) }.unwrap(); + unsafe { rule.SetName(&BSTR::from(FILTER_NAME_EXE)) }.unwrap(); + unsafe { rule.SetApplicationName(&exe_path) }.unwrap(); + unsafe { rule.SetDirection(NET_FW_RULE_DIR_OUT) }.unwrap(); + unsafe { rule.SetEnabled(true.into()) }.unwrap(); + unsafe { rule.SetAction(NET_FW_ACTION_BLOCK) }.unwrap(); + unsafe { rule.SetProtocol(NET_FW_IP_PROTOCOL_ANY.0) }.unwrap(); + unsafe { rules.Add(&rule) }.unwrap(); self.blocked_status = Self::is_blocked().into(); } - pub fn unblock_all(&mut self) { + pub fn unblock_exe(&mut self) { let policy: INetFwPolicy2 = unsafe { CoCreateInstance(&NetFwPolicy2, None, CLSCTX_INPROC_SERVER) }.unwrap(); let rules = unsafe { policy.Rules() }.unwrap(); - unsafe { rules.Remove(&BSTR::from(FILTER_NAME_IN)) }.unwrap(); - unsafe { rules.Remove(&BSTR::from(FILTER_NAME_OUT)) }.unwrap(); + unsafe { rules.Remove(&BSTR::from(FILTER_NAME_EXE)) }.unwrap(); self.blocked_status = Self::is_blocked().into(); } @@ -111,12 +104,11 @@ impl GameNetworking { let policy: INetFwPolicy2 = unsafe { CoCreateInstance(&NetFwPolicy2, None, CLSCTX_INPROC_SERVER) }.unwrap(); let rules = unsafe { policy.Rules() }.unwrap(); - let in_rule_exists = unsafe { rules.Item(&BSTR::from(FILTER_NAME_IN)) }.is_ok(); - let out_rule_exists = unsafe { rules.Item(&BSTR::from(FILTER_NAME_OUT)) }.is_ok(); - in_rule_exists || out_rule_exists + let exe_rule_exists = unsafe { rules.Item(&BSTR::from(FILTER_NAME_EXE)) }.is_ok(); + exe_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 { self.counting = true; self.timer = Instant::now(); diff --git a/src/gui/app.rs b/src/gui/app.rs index a02bf08..11e6a01 100644 --- a/src/gui/app.rs +++ b/src/gui/app.rs @@ -168,7 +168,7 @@ impl App { .on_hover_text( "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 }); ui.horizontal(|ui| { @@ -179,13 +179,13 @@ impl App { .add_sized([button_width, 18.0], egui::Button::new("Block")) .clicked() { - self.game_networking.block_all(&mut self.system_info); + self.game_networking.block_exe(&mut self.system_info); } if ui .add_sized([button_width, 18.0], egui::Button::new("Unblock")) .clicked() { - self.game_networking.unblock_all(); + self.game_networking.unblock_exe(); } }); });