The headline of this release is first-class Windows support: AmiFUSE now integrates with Explorer end-to-end — double-click an .hdf to mount every partition it contains, manage mounts from the system tray, and install everything with one script. Alongside
that, this release adds new diagnostic and inspection commands, fixes a long list of correctness issues found in a full-codebase review, and removes ~2,400 lines of dead code.
🪟 Windows shell integration
- Double-click mounting:
amifuse registeradds Explorer file associations for.hdf/.adf. Double-clicking mounts read-write and opens Explorer; the context menu offers Mount & Open and Mount Read-Only. - Multi-partition fan-out: opening an image mounts every partition, one free drive letter each, with a single summary dialog on partial failure.
- System tray mount manager: see active mounts, inspect images, and unmount cleanly (
pip install amifuse[windows]). - Zero-to-ready installer:
tools\install-windows.ps1(withinstall.batUAC wrapper and-Uninstallswitch) handles Python, WinFSP, venv, and registration. - Drive letters are selected via
GetLogicalDrives, so assigned-but-empty slots (e.g. an empty card reader onD:) are no longer picked by mistake; mount failures now surface as dialogs instead of silently vanishing. - Explorer refreshes immediately on mount/unmount via
SHChangeNotify.
✨ New features
amifuse doctor— checks Python, amitools, machine68k, fusepy, the FUSE backend, drivers, PATH, and shell registration;--fixauto-repairs what it can,--jsonfor scripting.amifuse status— lists active AmiFUSE mounts (PID, mountpoint, image, uptime), with--jsonoutput.- Disk space reporting (
statfs): Finder, Explorer, anddfnow show real volume capacity and free space. - ADF driver auto-resolution: floppy mounts find
FastFileSystemin the driver search path automatically. - Handler compatibility: handlers get a minimal dos.library process at startup (fixes crashes in handlers calling
GetCurrentDir/CurrentDirduring init), INQUIRY reports a CD-ROM device type for ISO images (CD filesystems no longer reject the disk), and the bundled amitools gainsexpansion.library(FindConfigDev()).
🐛 Bug fixes
- Fixed handler-memory lock leaks: intermediate locks are freed while walking path components, and
rename/mkdirrelease their locks on error paths too. Leaked locks could previously block deletes withERROR_OBJECT_IN_USEuntil unmount. - The bootstrap no longer keeps (or leaks) a second open handle on the image file for the lifetime of the mount.
- RDB images with non-512-byte blocks are now parsed correctly by the block-device backend (block size is auto-detected instead of forced to 512).
- Only genuine "object not found" errors are negative-cached; transient handler errors (e.g. object-in-use) no longer masquerade as
ENOENTfor seconds afterwards. doctor --fixnow actually applies fixes when combined with--json.- Mount discovery falls back to PowerShell CIM when
wmicis missing or broken (newer Windows 11 builds), and the tray survives discovery errors instead of silently freezing. - Security and concurrency fixes from review: command-injection hardening in the launcher/tray Inspect actions, PID-reuse guard before killing mount processes, VBS argument-escaping and TOCTOU fixes, and consistent locking around deferred deletes.
- Fixed a file-creation race with Explorer/WinFSP (stat pinned across create→release), SCSI WRITE(10) short-buffer validation (proper sense data), a
statfscrash guard,.Trashes.<uid>filtering on macOS, capped metadata caches for large trees, and temp-file cleanup when icon installation hits a locked file.
⚠️ Behavior changes
- Double-click mount is now read-write on Windows (was read-only); use the Mount Read-Only context menu entry for the old behavior.
- No bundled FastFileSystem binary yet pending licensing resolution. Supply your own (e.g. from a Workbench install) in the driver directory —
doctorandmountnow report a missing driver gracefully instead of failing on load.
🧹 Internal
- Removed ~2,400 lines of dead scaffolding (five unused modules, a 750-line debug scanner, dead helpers, unused imports).
- Deduplicated the RDB inspect flow (
amifuse inspectandrdb-inspectshare one implementation), FUSE stat construction, the handler main-loop capture, and RDB parsing (backend now delegates toopen_rdisk). - The version string is resolved in exactly one place.
- CI now runs Windows integration and tools-smoke jobs, plus new mount-lifecycle and integration tests for statfs, write persistence, and unmount.
Full Changelog: v0.5.0...v0.6.0