diff --git a/src/core_main.rs b/src/core_main.rs index 77b9d157e..2b2467729 100644 --- a/src/core_main.rs +++ b/src/core_main.rs @@ -151,6 +151,10 @@ pub fn core_main() -> Option> { #[cfg(windows)] hbb_common::allow_err!(crate::platform::windows::install_cert(&args[1])); return None; + } else if args[0] == "--uninstall-cert" { + #[cfg(windows)] + hbb_common::allow_err!(crate::platform::windows::uninstall_cert()); + return None; } else if args[0] == "--portable-service" { crate::platform::elevate_or_run_as_system( click_setup, diff --git a/src/platform/windows.rs b/src/platform/windows.rs index 8723e11e2..a6916c4b8 100644 --- a/src/platform/windows.rs +++ b/src/platform/windows.rs @@ -1245,10 +1245,18 @@ fn get_before_uninstall(kill_self: bool) -> String { } fn get_uninstall(kill_self: bool) -> String { + let mut uninstall_cert_cmd = "".to_string(); + if let Ok(exe) = std::env::current_exe() { + if let Some(exe_path) = exe.to_str() { + uninstall_cert_cmd = format!("\"{}\" --uninstall-cert", exe_path); + } + } + let (subkey, path, start_menu, _, _) = get_install_info(); format!( " {before_uninstall} + {uninstall_cert_cmd} reg delete {subkey} /f if exist \"{path}\" rd /s /q \"{path}\" if exist \"{start_menu}\" rd /s /q \"{start_menu}\" @@ -1256,6 +1264,7 @@ fn get_uninstall(kill_self: bool) -> String { if exist \"%PROGRAMDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\{app_name} Tray.lnk\" del /f /q \"%PROGRAMDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\{app_name} Tray.lnk\" ", before_uninstall=get_before_uninstall(kill_self), + uninstall_cert_cmd = uninstall_cert_cmd, subkey=subkey, app_name = crate::get_app_name(), path = path, @@ -1264,7 +1273,6 @@ fn get_uninstall(kill_self: bool) -> String { } pub fn uninstall_me(kill_self: bool) -> ResultType<()> { - allow_err!(cert::uninstall_certs()); run_cmds(get_uninstall(kill_self), true, "uninstall") } @@ -1901,7 +1909,11 @@ pub fn current_resolution(name: &str) -> ResultType { } } -pub(super) fn change_resolution_directly(name: &str, width: usize, height: usize) -> ResultType<()> { +pub(super) fn change_resolution_directly( + name: &str, + width: usize, + height: usize, +) -> ResultType<()> { let device_name = str_to_device_name(name); unsafe { let mut dm: DEVMODEW = std::mem::zeroed(); @@ -1956,6 +1968,11 @@ pub fn install_cert(cert_file: &str) -> ResultType<()> { Ok(()) } +#[inline] +pub fn uninstall_cert() -> ResultType<()> { + cert::uninstall_cert() +} + mod cert { use hbb_common::{allow_err, bail, log, ResultType}; use std::{path::Path, str::from_utf8}; @@ -2096,7 +2113,7 @@ mod cert { Ok(thumbprints) } - pub fn uninstall_certs() -> ResultType<()> { + pub fn uninstall_cert() -> ResultType<()> { let thumbprints = get_thumbprints_to_rm()?; let reg_cert_key = unsafe { open_reg_cert_store()? }; for thumbprint in thumbprints.iter() { @@ -2176,7 +2193,7 @@ mod tests { #[test] fn test_uninstall_cert() { - println!("uninstall driver certs: {:?}", cert::uninstall_certs()); + println!("uninstall driver certs: {:?}", cert::uninstall_cert()); } #[test]