diff --git a/src/mount.rs b/src/mount.rs
index 912a5d1..c9979c8 100644
--- a/src/mount.rs
+++ b/src/mount.rs
@@ -59,11 +59,36 @@ pub fn unmount_drive(drive_letter: char) -> Result<()> {
fn run_net_use_mount(drive_str: &str, port: u16, session_token: &str) -> Result<()> {
let url = format!("http://127.0.0.1:{}/{}/", port, session_token);
- let output = Command::new("net")
+ let mut output = Command::new("net")
.args(["use", drive_str, &url, "/persistent:no"])
.output()
.context("Fehler beim Ausführen des Befehls 'net use'")?;
+ // PRR-01: Selbstreparatur bei verwaister Zuordnung nach unsauberem Vorläufer (Systemfehler 85)
+ if !output.status.success() {
+ let stderr = String::from_utf8_lossy(&output.stderr);
+ let stdout = String::from_utf8_lossy(&output.stdout);
+ let is_already_in_use = stderr.contains("85")
+ || stderr.contains("bereits verwendet")
+ || stderr.contains("already in use")
+ || stdout.contains("85")
+ || stdout.contains("bereits verwendet")
+ || stdout.contains("already in use");
+
+ if is_already_in_use {
+ debug!("Verwaiste Zuordnung für {} entdeckt — führe automatische Bereinigung durch...", drive_str);
+ let _ = Command::new("net")
+ .args(["use", drive_str, "/delete", "/y"])
+ .output();
+
+ // Zweiter Versuch nach automatischer Bereinigung
+ output = Command::new("net")
+ .args(["use", drive_str, &url, "/persistent:no"])
+ .output()
+ .context("Fehler beim erneuten Ausführen des Befehls 'net use'")?;
+ }
+ }
+
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
let stdout = String::from_utf8_lossy(&output.stdout);
@@ -318,13 +343,21 @@ pub async fn mount_container(
println!(" [{}] Drücke [Ctrl+C] oder nutze das Tray-Icon zum Beenden.", ui::yellow("Tipp"));
println!();
- // Warten auf Beendigungssignal (Ctrl+C, Tray-Klick, Inaktivität, Win+L)
+ // Windows Console Close Monitor (CTRL_CLOSE_EVENT / CTRL_SHUTDOWN_EVENT)
+ let (console_close_tx, mut console_close_rx) = tokio::sync::mpsc::channel::<()>(1);
+ let _console_guard = crate::windows::start_console_ctrl_monitor(console_close_tx, drive_letter).ok();
+
+ // Warten auf Beendigungssignal (Ctrl+C, Tray-Klick, Inaktivität, Win+L, Konsolenfenster-Schließen)
tokio::select! {
res = tokio::signal::ctrl_c() => {
let _ = res;
println!();
println!(" {} Beendigungssignal (Ctrl+C) empfangen.", ui::yellow("[!]"));
}
+ _ = console_close_rx.recv() => {
+ println!();
+ println!(" {} Konsolenfenster wird geschlossen — sichere Trennung ausgeführt!", ui::yellow("[!]"));
+ }
_ = tray_shutdown_rx.recv() => {
println!();
println!(" {} Beendigungssignal aus System-Tray empfangen.", ui::yellow("[!]"));
diff --git a/src/windows.rs b/src/windows.rs
index 8672e3a..b1e7d57 100644
--- a/src/windows.rs
+++ b/src/windows.rs
@@ -419,6 +419,114 @@ pub fn start_session_lock_monitor(
Ok(SessionLockGuard)
}
+// ─────────────────────────────────────────────────────────────
+// Console Close Event Monitor (CTRL_CLOSE_EVENT / CTRL_SHUTDOWN_EVENT)
+// ─────────────────────────────────────────────────────────────
+
+#[cfg(windows)]
+static CONSOLE_CTRL_TX: std::sync::Mutex