diff --git a/README.md b/README.md index 6af7fad..cdf9893 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ +

+ Sanctum Logo +

+ # Sanctum 🛡️ +**Verschlüsselter Ein-Datei-Container unter Windows 10/11 im reinen Userland** + Sanctum ist eine eigenständige, speichersichere und hochperformante CLI-Anwendung in Rust, die verschlüsselte Ein-Datei-Container (`.sanctum`) unter Windows 10/11 im reinen Userland verwaltet. - **100% Userland**: Keine Administratorrechte erforderlich, keine Kernel-Treiber (weder WinFsp noch Dokan). diff --git a/assets/icon.ico b/assets/icon.ico new file mode 100644 index 0000000..5b0ba7f Binary files /dev/null and b/assets/icon.ico differ diff --git a/assets/logo.jpg b/assets/logo.jpg new file mode 100644 index 0000000..f4fc6d6 Binary files /dev/null and b/assets/logo.jpg differ diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000..f427bd0 Binary files /dev/null and b/assets/logo.png differ diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..62e7707 --- /dev/null +++ b/build.rs @@ -0,0 +1,28 @@ +fn main() { + println!("cargo:rerun-if-changed=assets/icon.ico"); + println!("cargo:rerun-if-changed=build.rs"); + + let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap_or_default(); + if target_os == "windows" { + let out_dir = std::env::var("OUT_DIR").unwrap(); + let rc_path = format!("{}/sanctum.rc", out_dir); + let res_path = format!("{}/sanctum.res", out_dir); + + let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); + let ico_path = format!("{}/assets/icon.ico", manifest_dir).replace('\\', "/"); + + if std::path::Path::new(&ico_path).exists() { + let rc_content = format!("1 ICON \"{}\"\n", ico_path); + if std::fs::write(&rc_path, rc_content).is_ok() { + let status = std::process::Command::new("windres") + .args(["-i", &rc_path, "-O", "coff", "-o", &res_path]) + .status(); + if let Ok(s) = status { + if s.success() { + println!("cargo:rustc-link-arg={}", res_path); + } + } + } + } + } +} diff --git a/scripts/package-release.ps1 b/scripts/package-release.ps1 index 327894b..d97300f 100644 --- a/scripts/package-release.ps1 +++ b/scripts/package-release.ps1 @@ -65,6 +65,7 @@ Copy-Item $ExeSource (Join-Path $StagingDir "sanctum.exe") Copy-Item (Join-Path $ProjectRoot "README.md") (Join-Path $StagingDir "README.md") Copy-Item (Join-Path $ProjectRoot "LICENSE") (Join-Path $StagingDir "LICENSE") Copy-Item (Join-Path $ProjectRoot "CHANGELOG.md") (Join-Path $StagingDir "CHANGELOG.md") +Copy-Item (Join-Path $ProjectRoot "assets") (Join-Path $StagingDir "assets") -Recurse # ZIP-Archiv schnueren Compress-Archive -Path "$StagingDir\*" -DestinationPath $ZipFile -Force diff --git a/src/windows.rs b/src/windows.rs index cdc2f45..8672e3a 100644 --- a/src/windows.rs +++ b/src/windows.rs @@ -172,9 +172,17 @@ pub fn unregister_explorer_integration() -> Result<()> { pub fn get_default_system_icon() -> Option { extern "system" { fn LoadIconW(instance: isize, icon_name: *const u16) -> isize; + fn GetModuleHandleW(module_name: *const u16) -> isize; } - // IDI_SHIELD = 32518, IDI_APPLICATION = 32512 + // 1. Eingebettetes Anwendungs-Icon (Ressource ID 1) aus eigenem Modul laden + let h_instance = unsafe { GetModuleHandleW(std::ptr::null()) }; + let app_icon = unsafe { LoadIconW(h_instance, 1 as *const u16) }; + if app_icon != 0 { + return Some(tray_item::IconSource::RawIcon(app_icon)); + } + + // 2. Fallback: Windows IDI_SHIELD = 32518, IDI_APPLICATION = 32512 let icon = unsafe { LoadIconW(0, 32518 as *const u16) }; if icon != 0 { Some(tray_item::IconSource::RawIcon(icon))