Prepared for the release_1.5.0 tag. Framework-dependent win-x64/win-arm64,
linux-x64/linux-arm64 and osx-x64/osx-arm64 builds require the .NET 10.0 Runtime (the base
runtime; the Desktop Runtime also works but is not required).
- Update checks run immediately. The GitHub release check runs at startup on both front ends, before argument handling and mounting. A newer release is offered through the native message box (Windows) or the console prompt (Linux/macOS); non-interactive runs print the version and URL instead of showing a dialog, so scripts never block.
- Missing Dokan offers the download page. When
dokan2.dll(runtime) ordokan2.sys(driver) is missing, the Windows front end warns and offers to open the Dokan releases page. A missing runtime still exits with code 1; a missing driver warns and lets mounting proceed. - Help is instant and offline.
-h/--helpprints the usage text and exits with code 0 before the update check, launch statistics, or the Dokan/FUSE probe. - Usage before the backend probe. A run without arguments prints the usage text and the drag-and-drop hint even when Dokan/FUSE is not installed.
- Options may appear before or after the mount path, matching the Unix front end
(
SimpleXisoDrive.exe game.iso -d Z:works). - A single image argument with options stays in drag-and-drop mode (
game.iso -i), with--launchimplied. - Folder mount paths are validated up front: a missing folder is reported before Dokan is invoked (drive letters are created by Dokan and are exempt).
- The administrator warning now covers
Z:as well asZ:\.
- Read failures are I/O errors, not silent EOF. A failed read now maps to
DokanResult.Erroron Windows and-EIOon Linux/macOS instead of returning a truncated result; short reads from the XISO layer are detected as truncation. - ZArchive reader access is serialized, so Explorer browsing and an emulator reading the same mount cannot corrupt the archive reader state.
- Case-sensitive entry caches keep case-only-distinct names apart on case-sensitive file systems while the case-insensitive library lookup still serves any spelling on Windows.
- The XISO explorer handle is released when the volume descriptor cannot be read, and
ReaderOwningVfsVolumedisposal is idempotent. - Lookup misses are classified. Paths that do not exist in the image (which Windows routinely
probes, for example
\System Volume Information) are logged at Debug level and are no longer forwarded to the bug report API.
- The FUSE 3 mount layer is now a standalone library.
FuseSharp(NuGet package idSimpleXisoDrive.FuseSharp) contains the high-level mount, the platform interop and the availability probe, and has no dependency onSimpleXisoDrive.Core. - New
IFuseVolume/IFuseEntryabstraction with POSIX paths;FuseFileSystemconsumes the interface, and the Unix app adapts the Xbox volume throughFuseVolumeAdapter. - Direct use works without the app: constructing
FuseFileSystemregisters the native library resolver itself.
- Expected user-setup and input conditions no longer auto-report: missing Dokan/FUSE, missing
image files, invalid or unsupported images, a failed
explorer.exe/xdg-openlaunch and a failed FUSE session setup are logged below the bug-report threshold. Duplicate error reports were removed. - Launch statistics are tracked and awaited at shutdown (up to 5 seconds), matching the bug
report grace period, and
Processhandles from browser launches are disposed.
- The suite grew to 476 tests: 395 in
SimpleXisoDrive.Testsand 81 inSimpleXisoDrive.Unix.Tests. New coverage includes the read-only access allow list (including the volume root), expected-condition logging,XisoPathNotFoundclassification, mount-path validation, deterministic FUSE probes, theFuseVolumeAdapter, and API failure handling. - Documentation was refreshed for the new startup flow, CLI behavior and
FuseSharp; both renderings (GitHub wiki and Pages) keep a shared side menu, now including theFuseSharppage.
Prepared for the release_1.4.0 tag. Framework-dependent win-x64/win-arm64,
linux-x64/linux-arm64 and osx-x64/osx-arm64 builds require the .NET 10.0 Runtime (the base
runtime; the Desktop Runtime also works but is not required).
- New FUSE 3 backend. The project was split into a shared
SimpleXisoDrive.Corelibrary plus two light front ends: the existing Windows/Dokan app and a newSimpleXisoDrive.Unixapp that mounts through the FUSE 3 high-level API (libfuse3on Linux, macFUSE on macOS). Native builds are produced forlinux-x64,linux-arm64,osx-x64andosx-arm64. - Command-line mount.
SimpleXisoDrive <image-file> [mount-path] [options]. When the mount path is omitted, a temporary directory is created and printed;fusermount3 -u/umount,Ctrl+C, SIGTERM and SIGHUP all unmount cleanly. - Platform-correct ABI. The FUSE operation table,
struct statandstruct statvfslayouts are pinned for Linux x64/aarch64 and macOS, and the library is discovered in the standard locations (override withSIMPLEXISODRIVE_FUSE_LIBRARY).
- New
-i/--image-isooption adds a synthetic read-onlyimage.isofile at the mount root while the normal tree stays browsable, so emulators that only accept a disc image (such as xemu) can open<mount>\image.iso. - Plain ISO/XISO inputs and CISO
.csoimages (including split.1.csosets) are served on demand: CISO blocks are decompressed through the XISOSharp block device, nothing is extracted. - A ZArchive with a single embedded XISO is served from the embedded image on demand.
- A ZArchive directory tree is synthesized into an XISO in memory: the XDVDFS layout
(volume descriptor, directory tables and file extents) is built with XISOSharp's public layout
primitives and file data is read from the archive on demand. Nothing is extracted, the mount
appears immediately, and the synthesized image is byte-identical to
XisoWriter.PackFromDirectoryoutput for the same tree. - When the mounted image already contains a real
image.isofile, that file is shown instead of the synthetic one.
- New
.chdmounting. Xbox ISO images stored as CHD are mounted read-only through the CHDSharp library: hunks are decompressed on demand (CHD V1–V5, all codecs) and the source file is never modified. - Xbox ISO only. CD and GD-ROM CHDs are rejected up front, and the decompressed image must parse
as XDVDFS; anything else fails with
"<path>" is not an Xbox ISO CHD (XDVDFS filesystem not found). --image-isoworks for CHDs. The virtualimage.isoserves the decompressed Xbox image (a second independent CHD reader, so raw-image reads never race the volume stream).- Renamed CHDs still mount. A valid CHD with any extension falls back to the CHD path when the XISO probe fails.
- The resolver recognizes
.chdfor extensionless paths and directory lookups.
image.isono longer inflates the reported volume size for plain ISO/XISO/CISO, CHD and embedded-XISO mounts: the raw image is only added to the volume size for a synthesized ZArchive tree, where it is genuinely additional content.- Renamed files always mount.
.isorenamed to.chd/.zar(and the reverse) falls back to content detection instead of failing on the extension mismatch. - Bounded caches. Volume entry and directory-listing caches stop growing at 4096 entries and 512 listings, so a long-lived mount over a huge tree cannot consume memory without limit.
- Clean ownership. Identical-idempotent disposal across volumes and decorators; embedded-XISO probes never leak the archive reader; failed opens leave no stale Dokan handle context.
- FUSE fixes. macOS uses the exported
fuse_new_31entry point (macFUSE's libfuse3 is built without ELF symbol versioning, so plainfuse_newis only a header macro); thestatfswake-up poke allocates a buffer that covers the macOS structure (2168 bytes vs 120 on Linux); temporary mount directories are removed on unmount; and option validation is case-insensitive like the Windows front end. - Windows update notification never blocks scripts. The update message box is skipped when input or output is redirected or the process is non-interactive; the version and release URL are printed instead.
- Truthful errors. Locked or unreadable images surface the real I/O exception; only format failures are reported as "not a valid image".
- All logging is routed through Serilog with a console level switch (
--debug) and a rolling file sink;Warning-and-higher events are archived toerror.logand forwarded to the bug report API with an 8-per-minute rate limit. - In-flight bug reports are tracked and given a 5-second grace period at shutdown
(
BugReport.WaitForPendingReportsAsync), and all API clients (bug reports, launch statistics, update check) share one connection pool and TLS configuration. - Launch statistics and the GitHub update check skip work when the API key is unavailable and never forward failures to the bug report API.
- The suite grew from 89 to 336 tests: 286 in
SimpleXisoDrive.Testsand 50 inSimpleXisoDrive.Unix.Tests. ChdVfsContainerTestsencodes real CHDs with the CHDSharp encoder and mounts them (rebuilt and standard layouts, trees,--image-iso, non-Xbox rejection, CD rejection, renamed fallbacks).VirtualXisoImageSourceTestsproves the synthesized ZAR image is byte-identical to the XISOSharp whole-image writer for nested trees (sector-crossing files, empty files/directories) and validates unaligned reads;ImageIsoVfsVolumeTestsandStreamRawImageSourceTestscover the decorator, size policy and stream reads.VfsContainerTestsmounts.iso,.cso, embedded-XISO.zar, tree.zarand.chdinputs, including renamed files and the--image-isooption.- The FUSE suite pins the Linux/macFUSE
fuse_operationslayouts and delegate conventions, covers resolver/library probing, mount arguments, path/time/directory helpers, POSIX errno values and case-insensitive option validation.
- Every page was refreshed for the cross-platform, CHD and
--image-isoreleases. - Both renderings now have a side menu:
docs/_Sidebar.mdfor the GitHub wiki, anddocs/_data/navigation.yml+docs/_layouts/default.htmlfor the published GitHub Pages site. The same Markdown serves both, with wiki-style links rewritten for the site at runtime.
Prepared for the release_1.3.0 tag. Framework-dependent win-x64 and win-arm64 builds require
the .NET 10.0 Runtime (the base runtime; the Desktop Runtime also works but is not required).
This release adds ZArchive (.zar) mounting, CISO (.cso) image support, moves all XDVDFS parsing
to the XISOSharp 1.2.0 library, modernizes ZArchive reads on ZArchiveSharp 1.3.0, and adds
CI plus a tag-driven release pipeline.
- ZArchive support.
.zarfiles mount directly: directory-tree archives expose the stored game files, and an archive holding a single XISO image mounts that image. Content is read on demand through a zstd block cache; nothing is extracted to disk. - CISO support. Compressed
.csoimages mount like plain ISOs, including split.1.csopart sets; the resolver recognizes.csoand treats a numbered part set as a single image. - Renamed archives still mount. A valid ZArchive with any extension (including
.iso) falls back to the archive path when the XISO probe fails. - ZArchiveSharp 1.3.0 reader API. Node-handle enumeration (
TryGetDirEntry), canonical names (TryGetNodeName), computed volume size (TotalUncompressedSize), seekable entry streams (OpenRead), shared-read opens, and typedZArchiveOpenFailurereasons in error messages.
- Parsing delegated to XISOSharp 1.2.0. The in-repo parser (
IsoSt,VolumeDescriptor,FileEntry,XisoFsFileAttributes) was removed. Path-based images use a keep-openXisoExplorerwith a shared read/write handle; images embedded in archives use theXisoReaderstream APIs. - Rebuilt sector-0 images are detected alongside the standard sector-32 layouts (plain, GLOBAL, XGD3, XGD2 hybrid, XGD1), and the app reports the library's parsed attributes, size, and creation time.
- Truthful I/O errors. Locked or unreadable images now surface the real
IOException; only format failures are reported as "not a valid image". ZArchive open failures keep their type (missing file, access denied/read error, invalid path, or bad format). - No handle leaks. The embedded-ISO probe disposes the archive reader when the probe itself errors, and the probe stream on a failed validation.
- Directory walks use XISOSharp's hardened TOC traversal: cycle detection, per-table entry limits, and rejection of separator-bearing names.
- Reads are clamped to each entry's size, never the image length.
- Every Dokan operation still contains failures, logs them, and returns an error status instead of propagating.
- The shared console key-press watcher no longer swallows the key meant for an error prompt.
- The bug report / stats API key is no longer stored in plain text: it is double-encrypted in the assembly (AES-256-CBC over a SHA-256 XOR layer) and decrypted once at startup.
- The suite grew from 43 to 89 tests.
XisoVfsVolumeTreeTestscovers multi-file and nested images, empty files/directories, reads across sector boundaries, clamped reads, attribute mapping, descriptor FILETIMEs, and parallel reads in path and stream modes.XboxIsoVfsDokanTestsexercises the Dokan operation layer directly withMockDokanFileInfo— volume information,./..listings, wildcard filtering,CreateFile/ReadFilesemantics, path normalization, and read-only denials — with no Dokan driver installed.ResolveImagePathTestsandVfsContainerTestscover.csoresolution (including split sets), locked/missing images, andApiKeyProviderTestsverifies the decrypted key without storing it.TestImageFactorynow builds arbitrary nested trees (withTestImageEntry) for standard sector-32 and rebuilt sector-0 layouts.
.github/workflows/ci.ymlbuilds and tests every push/pull request tomasteronwindows-latestand uploads TRX results plus Cobertura coverage..github/workflows/release.ymlruns onrelease_*tags: it verifies the tag against<AssemblyVersion>, runs the suite, publishes framework-dependent single-file executables forwin-x64andwin-arm64, packs each asrelease_<version>_<rid>.zipcontaining onlySimpleXisoDrive.exe, and creates the GitHub release.- The workflow can also be dispatched manually to produce the same zips as artifacts.
- Updated
ReadMe.mdwith a CI badge and the building guide; refreshed Architecture, Virtual File System, XDVDFS Format, Glossary, Testing, Troubleshooting, Contributing, and Release History for the library-based architecture and the new pipeline.