Releases: purelogiccode/SimpleZipDrive
Release list
3.0.1
Fixed
- Dokan variant: mount-point failures are now detected by error status instead of error text (issue #67092). The retry guard matched the English-only message "Can't install", so on localized systems (DokanNet ships German, French, and Swedish resources) it silently broke and deterministic failures were pointlessly retried, adding ~3 s of latency per failed mount. Retries are now gated on
DokanException.ErrorStatus: only the transientErrorandStartErrorstatuses are retried; driver-install, drive-letter/mount-point, and version failures fail immediately. - Dokan variant: a failed drive letter or mount folder now shows a dedicated "Mount Point Unavailable" dialog instead of the misleading reinstall-driver dialog. It explains that the letter or folder may already be in use or that permission is missing, and suggests a different letter/folder or running as administrator.
Internal
- Update checks now read the current version from the Core assembly (version-pinned to both app executables) instead of
Assembly.GetEntryAssembly(), which under IDE test runners is the test host and made the "same version" tests spuriously notify the user when the runner version was below the latest release. - Updated
Meziantou.Analyzerto 3.0.259,SharpSevenZipto 2.0.128,Microsoft.NET.Test.Sdkto 18.10.1, and the GitHub Actions (checkout v5, setup-dotnet v5, upload-artifact v7, download-artifact v8); restored trailing newlines accidentally removed from six Core source files by the analyzer cleanup.
Full changelog: https://github.com/purelogiccode/SimpleZipDrive/blob/master/WhatsNew.md
3.0.0
Added
- ZArchive (
.zar) mount support with true Zstd seekable random access..zarcontainers are mounted via ZArchiveSharp, a pure C# implementation of the Zstd seekable format with no native dependencies. Every read decompresses only the 64 KiB zstd blocks it touches, so files are never extracted to memory or a temporary directory - seeks are immediate, and opening a 20 GB container costs the same as opening a 20 MB one. This also brings seekable-zstd support to the Xbox 360 scene, the main producer of this format (issue #5). - Xbox XISO disc image support (
.iso,.xiso,.cso) via XISOSharp. Original Xbox and Xbox 360 game images mount directly, in all common disc layouts (RAW, rebuilt sector-0, GLOBAL/XGD2, XGD3, XGD2 Hybrid, XGD1). File data is read on demand straight from the disc sectors; compressed CISO.csocontainers (single file or split.1.csopart sets) are decoded block-by-block per read. Generic ISO 9660/UDF data discs are rejected at mount time with a clear "not a valid Xbox XISO disc image" message. - Automated releases (GitHub Actions). Every push/PR builds the solution warning-clean and runs the full test suite. The release workflow produces the four
release_<version>_<Variant>_win-<arch>.zipbundles (Dokan/WinFsp x x64/ARM64) and waits for manual approval in a protected environment before creating the GitHub release - bundles can be downloaded and reviewed as workflow artifacts first.
Changed
- Archive detection, file dialogs, and error messages now include the new formats.
.iso,.xiso, and.csomap to the XISO reader;.zarmaps to the ZArchive reader. Xbox image mounts are read-only and passwordless, like every other supported format. - Xbox image note: because
.isosupport targets the Xbox XDVDFS filesystem only, mounting a regular (non-Xbox) ISO image now produces a specific format error instead of the generic "not a supported archive" rejection.
Internal
- Added
XISOSharp1.2.0; updatedZArchiveSharpto 1.3.0. - Updated
Meziantou.Analyzerto 3.0.257 across all projects. - New
XisoArchive/XisoArchiveEntry/XisoEntryStreamadapters with dedicated test coverage (adapter plusZipFileSystemCoreintegration, path-backed, stream-backed,.cso, and cyclic-image coverage); the suite now runs 1,245 tests. - Pre-release hardening: ZArchive extended-length (
128+character) names decode correctly, corrupt ZArchive blocks fail the entry instead of caching truncated data, cyclic/corrupt XISO directory tables terminate instead of hanging the mount, and a corrupt-image mount no longer leaks the image handle. - Docs in
docs/sync automatically to the repository wiki;WhatsNew.mdis tracked in the repository again so it ships inside every bundle.
Full changelog: WhatsNew.md
2.9.1
What's New in 2.9.1
Fixed
- Outdated Dokan drivers are blocked with a clear dialog instead of crashing the app. DokanNet 2.3 requires the
DokanRegisterWaitForFileSystemClosedexport, which only exists in dokan2.dll 2.3.0+. On older Dokan installations (2.2.x and earlier) every mount crashed the process with an uncatchableEntryPointNotFoundException(crash reports #66665-#66667). Mounts are now refused up front with a "Dokan Driver Outdated" dialog showing the installed and required versions and offering to open the Dokan download page. - WinFsp variant: clear error instead of a raw assembly-load crash when
winfsp-msil.dllis missing. If the interop library was removed beside the executable (typically by antivirus software) or the package was extracted incompletely, mounting previously failed withCould not load file or assembly 'winfsp-msil'. The app now verifies the interop assembly can be loaded before every mount and shows a plain-language dialog explaining how to restore the file. This failure is also recognized as an environment condition, so it no longer floods the bug-report API. - Dokan variant: architecture mismatches detected during the version check now show the correct "Dokan Driver Incompatible" dialog instead of the outdated-driver dialog with a bogus "Installed version: 0.0.0".
Changed
- Dokan driver requirement documented: Dokan v2 2.3.0 or newer (ReadMe, docs, and the new dialog all state this).
2.9.0
2.9.0
Fixed
- Halved peak memory during memory-cache decompression. Decompression now streams directly into the final exact-size buffer instead of building a growing
MemoryStreamand copying it withToArray(). A 424 MB entry now peaks at roughly one copy of the data (first-open working set ~460 MB, down from ~880 MB) — this addresses the memory-inflation follow-up reported in issue #10: the previous transient double copy made Task Manager show about twice the true footprint, and any second transient allocation could look like memory "doubling" between runs. - Bug-report filtering no longer masks potential real bugs. Only canceled HTTP requests are treated as expected user errors; other network failures and
CryptographicExceptions that do not originate from archive decryption (SharpCompress) are reported to the bug API again. The update check remains quiet on offline machines because it handles its own network errors. - Corrupt RAR archives are no longer misclassified as wrong-password prompts. A "Unknown Rar Header" failure during an encrypted mount now routes to the corruption path instead of re-prompting for a password up to three times with a misleading message.
- Duplicate log suppression restored to case-sensitive comparison, so two distinct messages that differ only in case are both kept.
- The archive open retry backoff no longer blocks the UI thread. Waiting for a transiently locked archive file uses an awaited delay instead of
Thread.Sleep. - WinFsp variant: fixed mount failure "The path is empty" in the packaged single-file build. The winfsp-msil interop's static initializer calls
FileVersionInfo.GetVersionInfo(Assembly.Location), which is an empty string inside a single-file bundle.winfsp-msil.dllis now shipped as a real file beside the executable so the interop version check succeeds. - WinFsp variant: fixed cross-integrity folder mounts on fresh directories.
IsDriveLetterMountPointmisclassified every absolute folder path (C:\...) as a drive letter, so the mount-point directory was never created and mounting failed with0xC0000034. A bareMorM:is a drive letter; any longer path is a folder and is created on demand.
Changed
- Consistent packaging for both variants. The Dokan and WinFsp executables ship with the native
7z.dll/7z_arm64.dllfallback libraries (andwinfsp-msil.dllfor the WinFsp variant) as real files beside the executable, so the SevenZip extraction fallback is available in both.
Changed
- Update check now uses the canonical repository endpoint (
https://github.com/purelogiccode/SimpleZipDrive). The fallback endpoint pointing at the previous repository owner was removed now that the GitHub transfer is complete. - Framework-dependent single-file executables. Releases are now built without the .NET runtime embedded — only the .NET Desktop Runtime and the filesystem driver (Dokan or WinFsp) remain prerequisites. Each package contains the single
exe, the native7z.dll/7z_arm64.dllfallback libraries (andwinfsp-msil.dllfor the WinFsp variant) beside it, plus this README, the license, and these release notes.
Internal
- ReDoS-safe match timeouts added to all regular expressions.
- Lock objects migrated to
System.Threading.Lock. - Solution reorganized with dedicated
Models/andInterfaces/folders;ErrorLoggerandStoredEntryStreamsplit into per-type files; all analyzer warnings resolved. - SharpCompress updated to 0.50.4 and SharpSevenZip to 2.0.115.
release_2.8.0
SimpleZipDrive 2.8.0 — Release Notes
Released: 2026-08-04
This release fixes a major memory/performance issue in the memory-cache mode (GitHub issue #10), adds comic-book archive support, aligns the WinFsp variant with the stable WinFsp 2.1 driver, and reduces noise in the bug-report pipeline.
Fixed: High memory usage & poor performance with the memory cache (issue #10)
Mounting an archive and running a large file (e.g. a game executable) from the virtual drive could inflate memory usage to multi-GB (up to ~13 GB in reports) and freeze the machine — while disk-cache mode used only ~200 MB.
Root cause: the memory cache decompressed the entire file into a fresh buffer on every open, and one read path re-decompressed the whole file per read (paging/memory-mapped I/O). With several applications (hash tool, antivirus, Explorer, the game loader) opening the file at once, memory scaled by number of opens × file size, and repeated full decompressions stalled the loader.
Fix — shared refcounted memory cache with LRU eviction:
- Each file is decompressed once; the buffer is shared by all open handles and on-demand reads.
- After the last handle closes, the buffer stays warm so re-opens reuse it instantly.
- Cached buffers are evicted least-recently-used when the total cache would exceed the memory limit (90% of RAM), falling back to the existing disk cache.
- Memory usage is now ≈ base + one copy per file, regardless of how many applications access it.
Both the Dokan and WinFsp variants benefit (shared core filesystem engine).
New: Comic-book archive support
- Mount
.cbz(ZIP),.cbr(RAR) and.cb7(7-Zip) archives. - Comic extensions are mapped to their container format, so they work with the existing readers; file dialogs, drag-and-drop, error messages and the ReadMe are updated accordingly.
WinFsp variant: stable driver support & better errors
- WinFsp 2.1 (stable) is now the supported baseline — the previous
winfsp.net2.2.x package rejected the stable native 2.1 driver withincorrect dll version (need 2.2, have 2.1). The interop package is nowwinfsp.net 2.1.25156, which accepts native WinFsp 2.1 (stable) and 2.2+ (beta). - Mount-point-in-use (0xC0000035) now shows a clear "Mount Point In Use" dialog instead of a generic driver error suggesting a reinstall.
- The native WinFsp DLL is pre-validated before mounting (guards against stale PATH entries and corrupted installations).
- Version-mismatch handling is retained: mounts are blocked with an "Update WinFsp" dialog when the installed driver is older than 2.1.
Smarter bug reporting
- Missing/outdated filesystem drivers (Dokan, WinFsp), driver version mismatches, mount-point collisions and "Can't install the Dokan driver" are recognized as expected environment/user conditions and no longer flood the bug-report API — they already surface as clear in-app dialogs.
- Unsupported-archive errors are classified as user errors as well.
Other changes
- SharpCompress updated to 0.50.3 across all projects.
- Removed dead code (
StatusSuccess,GetWinFspLibraryVersion, unusedComicExtensionsfield) and cleaned up formatting. - Test suite hardened: the
applicationIdassertion is now test-runner agnostic (no more false failure under ReSharper/Rider), and new tests cover the shared memory cache (single decompression, warm reuse, LRU eviction). - All projects bumped to 2.8.0; 1182 tests passing.
Full Changelog: release_2.7.2...release_2.8.0
release_2.7.2
NuGet Updates:
- SharpCompress 0.49.1 → 0.50.0
- winfsp.net 2.2.26183 → 2.2.26194
- Microsoft.NET.Test.Sdk 18.7.0 → 18.8.1
Fixes:
- Entries now marked as failed on read/decompression exceptions. Previously, when a read or extraction exception occurred (e.g., corrupted data, decompression error), the error was logged but the entry was not marked as failed. Subsequent reads would retry the same entry and fail again with the same error. Now
AddFailedEntryis called in all read exception handlers across both Dokan and WinFsp hosts, so failed entries are correctly skipped on retry. - Null-check for
node.Entryin DokanCreateFile. A corrupted or race-conditioned archive entry with a nullEntryproperty now returns an error immediately instead of causing aNullReferenceException. This brings parity with the WinFsp host, which already had this guard. - Broader exception catching in entry extraction. The
OpenEntryStreamandOpenDiskCachedStreammethods now catch all exception types (not justZlibException,ZstdException, and extraction-specific failures). Unexpected exceptions are now logged, the entry is marked as failed, and the filesystem operation fails gracefully instead of propagating the exception to the caller.
Full Changelog: release_2.7.1...release_2.7.2
release_2.7.1
Fixes
- File previews & thumbnails no longer fail:
ReadFilenow falls back to a transient on-demand read when a read arrives without a handle context. This is common during paging I/O (e.g. Windows Explorer generating thumbnails via memory-mapped reads) and previously caused previews/thumbnails to fail. Applies to both the Dokan and WinFsp variants. - More resilient decompression: Out-of-memory conditions are now handled separately from Zlib/Zstd decompression errors. When decompression fails, the engine attempts a 7-Zip fallback before giving up, improving compatibility with tricky archives.
- Correct handling of non-Windows archives: Archive entry paths are now normalized to Unicode Form C, so accented names created on other platforms (e.g. macOS, which uses decomposed Form D) match lookups from Windows. Invalid Unicode (such as unpaired surrogates) is handled gracefully instead of throwing.
- No lost crash reports on shutdown: Pending bug reports are now drained before the network client is disposed during exit, so reports queued moments before closing are no longer dropped.
- Cleaner process termination: Shutdown now terminates with a success exit code (0) instead of a hardcoded failure code, while still bypassing managed finalization that could hang on native filesystem driver threads.
Improvements
- Unified logging pipeline (Serilog): All logging is now consolidated into a single Serilog pipeline that writes a per-session log file, mirrors output to the debugger, and forwards warning-and-above events to the remote bug report service. Expected user/environment errors (bad archives, wrong passwords, cancellations) are filtered out to reduce noise.
- Retired the legacy
error.login favor of the single session log. - Updated
SharpSevenZipto2.0.109.
Full Changelog: release_2.7.0...release_2.7.1
release_2.7.0
Dependency Updates
- winfsp.net updated from
2.2.26112→2.2.26183 - SharpSevenZip updated from
2.0.99→2.0.100
Improvements
WinFsp Version Enforcement
- Mounting is now blocked when the installed WinFsp driver version is older than required, instead of showing a warning dialog and allowing a potentially broken mount. A clear error dialog is shown with the version mismatch details.
- Added a native DLL pre-load check before attempting to mount. If the WinFsp native DLL cannot be loaded (missing, wrong architecture, corrupted install), the mount fails early with a descriptive error instead of crashing.
TypeInitializationExceptioncaused by a WinFsp DLL version mismatch duringFileSystemHostcreation is now caught and handled gracefully with a user-friendly error dialog.
Extraction Resilience
- Disk-cached extraction now has a SevenZip fallback: if the primary extraction fails (corrupt data, unsupported compression), the system automatically attempts extraction via the SevenZip library before marking the entry as failed.
SevenZipFallback.TryExtractEntryno longer throwsObjectDisposedExceptionwhen called after disposal — it returnsfalseinstead, improving robustness during shutdown.OpenDiskCachedStreamnow returnsnullon extraction failure instead of propagating exceptions, allowing callers to handle the error gracefully.
Error Classification
TypeInitializationExceptionwithFsp.Interopinner exceptions (missing/outdated WinFsp) are now classified as known non-fatal errors and won't be reported as app bugs.NullReferenceExceptionoriginating from SharpCompress is now classified as a known library limitation.- Additional exception types (
ArgumentNullException,ArgumentException,IndexOutOfRangeException) originating from compression libraries are now handled as extraction failures, improving fallback coverage for corrupt or malformed archives. - WinFsp version mismatch errors are no longer reported via
ErrorLoggersince they are environment issues, not application bugs.
Code Quality
- Extracted
FindWinFspBinDir()as a separate method, reducing duplication inEnsureWinFspOnPath. - Semaphore release in
OpenDiskCachedStreamis now wrapped intry/catchforObjectDisposedException, preventing crashes during shutdown. - Removed the unused
ShowWinFspVersionMismatchWarningDialogmethod. FindWinFspBinDirnow falls back toSOFTWARE\WinFspregistry key, matching the behavior of other WinFsp detection methods.
Full Changelog: release_2.6.2...release_2.7.0
release_2.6.2
Bug Fixes
Dokan Driver Not Installed — Immediate Error Dialog
When the Dokan driver is not installed on the user's system, the mount attempt no longer retries pointlessly. The error dialog ("Would you like to open the Dokan download page?") now appears immediately instead of after multiple failed retries.
WinFsp MSIL Version Mismatch — Blocked Before Failure
Fixed TypeInitializationException ("incorrect dll version — need 2.2, have 2.1") caused by a mismatched winfsp-msil.dll wrapper. The application now checks the MSIL library version independently of the installed driver and blocks the mount with a clear error message if the library is incompatible, rather than attempting the mount and crashing.
Zstandard Decompression Errors — Proper Fallback and Single-Failure Marking
SharpCompress ZstdException errors ("Unknown frame descriptor", "Data corruption detected", "Destination buffer is too small") are now properly handled in three ways:
- Disk cache fallback — When ZstdException occurs during in-memory caching, the file is automatically retried via disk cache
- SevenZip fallback — When ZstdException occurs during extraction, the SevenZip fallback extractor is attempted instead
- Single-failure marking — Affected entries are now permanently marked as failed after the first error, preventing repeated decompression attempts
Full Changelog: release_2.6.1...release_2.6.2
release_2.6.1
Changes
- Updated SharpSevenZip from v2.0.91 to v2.0.99
- Removed obsolete
winfsp-msil.dlldependency
Full Changelog: release_2.6.0...release_2.6.1