diff --git a/src-tauri/src/browser_interceptor/mod.rs b/src-tauri/src/browser_interceptor/mod.rs index 9335b16a1..6bc278667 100644 --- a/src-tauri/src/browser_interceptor/mod.rs +++ b/src-tauri/src/browser_interceptor/mod.rs @@ -38,6 +38,9 @@ pub enum BrowserInterceptorError { StateError(String), PlatformError(String), NotificationError(String), + AlreadyRunning, + UnsupportedPlatform(String), + IoError(String), } impl fmt::Display for BrowserInterceptorError { @@ -48,10 +51,19 @@ impl fmt::Display for BrowserInterceptorError { BrowserInterceptorError::StateError(msg) => write!(f, "状态管理错误: {}", msg), BrowserInterceptorError::PlatformError(msg) => write!(f, "平台错误: {}", msg), BrowserInterceptorError::NotificationError(msg) => write!(f, "通知错误: {}", msg), + BrowserInterceptorError::AlreadyRunning => write!(f, "拦截器已在运行"), + BrowserInterceptorError::UnsupportedPlatform(msg) => write!(f, "不支持的平台: {}", msg), + BrowserInterceptorError::IoError(msg) => write!(f, "IO错误: {}", msg), } } } impl Error for BrowserInterceptorError {} +impl From for BrowserInterceptorError { + fn from(err: std::io::Error) -> Self { + BrowserInterceptorError::IoError(err.to_string()) + } +} + pub type Result = std::result::Result; diff --git a/src-tauri/src/browser_interceptor/platform/windows.rs b/src-tauri/src/browser_interceptor/platform/windows.rs index 1e4acdcce..7822233bc 100644 --- a/src-tauri/src/browser_interceptor/platform/windows.rs +++ b/src-tauri/src/browser_interceptor/platform/windows.rs @@ -108,19 +108,21 @@ impl WindowsInterceptor { let mut buffer = vec![0u16; 1024]; let mut buffer_size = buffer.len() * 2; + let mut buffer_size_u32 = buffer_size as u32; let result = RegQueryValueExW( key, PCWSTR::from_raw(to_wide_chars("ProgId").as_ptr()), None, None, Some(buffer.as_mut_ptr() as *mut u8), - Some(&mut buffer_size as *mut u32), + Some(&mut buffer_size_u32), ); RegCloseKey(key); if result.is_ok() { - let prog_id = String::from_utf16_lossy(&buffer[..buffer_size / 2 - 1]); + let actual_size = buffer_size_u32 as usize; + let prog_id = String::from_utf16_lossy(&buffer[..actual_size / 2 - 1]); self.original_browser = Some(prog_id); tracing::info!( "备份原始默认浏览器: {}", diff --git a/src-tauri/src/browser_interceptor/state_manager.rs b/src-tauri/src/browser_interceptor/state_manager.rs index 5586a3725..3334ea21a 100644 --- a/src-tauri/src/browser_interceptor/state_manager.rs +++ b/src-tauri/src/browser_interceptor/state_manager.rs @@ -267,19 +267,21 @@ impl StateManager { let mut buffer = vec![0u16; 1024]; let mut buffer_size = buffer.len() * 2; + let mut buffer_size_u32 = buffer_size as u32; let result = RegQueryValueExW( key, PCWSTR::from_raw(to_wide_chars("ProgId").as_ptr()), None, None, Some(buffer.as_mut_ptr() as *mut u8), - Some(&mut buffer_size as *mut u32), + Some(&mut buffer_size_u32), ); RegCloseKey(key); if result.is_ok() { - let prog_id = String::from_utf16_lossy(&buffer[..buffer_size / 2 - 1]); + let actual_size = buffer_size_u32 as usize; + let prog_id = String::from_utf16_lossy(&buffer[..actual_size / 2 - 1]); return Ok(Some(prog_id)); } } @@ -329,19 +331,21 @@ impl StateManager { let mut buffer = vec![0u16; 1024]; let mut buffer_size = buffer.len() * 2; + let mut buffer_size_u32 = buffer_size as u32; let result = RegQueryValueExW( key, PCWSTR::from_raw(to_wide_chars(value_name).as_ptr()), None, None, Some(buffer.as_mut_ptr() as *mut u8), - Some(&mut buffer_size as *mut u32), + Some(&mut buffer_size_u32), ); RegCloseKey(key); if result.is_ok() { - let value = String::from_utf16_lossy(&buffer[..buffer_size / 2 - 1]); + let actual_size = buffer_size_u32 as usize; + let value = String::from_utf16_lossy(&buffer[..actual_size / 2 - 1]); return Ok(value); } } @@ -449,13 +453,17 @@ impl StateManager { let value_name_wide = to_wide_chars(value_name); let value_data_wide = to_wide_chars(value_data); + let data_bytes = std::slice::from_raw_parts( + value_data_wide.as_ptr() as *const u8, + value_data_wide.len() * 2, + ); + RegSetValueExW( key, PCWSTR::from_raw(value_name_wide.as_ptr()), 0, REG_SZ, - Some(value_data_wide.as_ptr() as *const u8), - value_data_wide.len() * 2, + Some(data_bytes), ); RegCloseKey(key);