Skip to content

Releases: purelogiccode/SimpleZipDrive

3.0.1

Choose a tag to compare

@github-actions github-actions released this 16 Sep 02:57

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 transient Error and StartError statuses 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.Analyzer to 3.0.259, SharpSevenZip to 2.0.128, Microsoft.NET.Test.Sdk to 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

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 13 Sep 18:30

Added

  • ZArchive (.zar) mount support with true Zstd seekable random access. .zar containers 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 .cso containers (single file or split .1.cso part 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>.zip bundles (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 .cso map to the XISO reader; .zar maps to the ZArchive reader. Xbox image mounts are read-only and passwordless, like every other supported format.
  • Xbox image note: because .iso support 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 XISOSharp 1.2.0; updated ZArchiveSharp to 1.3.0.
  • Updated Meziantou.Analyzer to 3.0.257 across all projects.
  • New XisoArchive / XisoArchiveEntry / XisoEntryStream adapters with dedicated test coverage (adapter plus ZipFileSystemCore integration, 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.md is tracked in the repository again so it ships inside every bundle.

Full changelog: WhatsNew.md

2.9.1

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 10 Sep 01:30

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 DokanRegisterWaitForFileSystemClosed export, 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 uncatchable EntryPointNotFoundException (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.dll is missing. If the interop library was removed beside the executable (typically by antivirus software) or the package was extracted incompletely, mounting previously failed with Could 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

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 02 Sep 21:15

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 MemoryStream and copying it with ToArray(). 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.dll is 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. IsDriveLetterMountPoint misclassified every absolute folder path (C:\...) as a drive letter, so the mount-point directory was never created and mounting failed with 0xC0000034. A bare M or M: 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.dll fallback libraries (and winfsp-msil.dll for 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 native 7z.dll / 7z_arm64.dll fallback libraries (and winfsp-msil.dll for 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/ and Interfaces/ folders; ErrorLogger and StoredEntryStream split into per-type files; all analyzer warnings resolved.
  • SharpCompress updated to 0.50.4 and SharpSevenZip to 2.0.115.

release_2.8.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 05 Aug 03:06

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.net 2.2.x package rejected the stable native 2.1 driver with incorrect dll version (need 2.2, have 2.1). The interop package is now winfsp.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, unused ComicExtensions field) and cleaned up formatting.
  • Test suite hardened: the applicationId assertion 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

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 16 Jul 04:15

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 AddFailedEntry is called in all read exception handlers across both Dokan and WinFsp hosts, so failed entries are correctly skipped on retry.
  • Null-check for node.Entry in Dokan CreateFile. A corrupted or race-conditioned archive entry with a null Entry property now returns an error immediately instead of causing a NullReferenceException. This brings parity with the WinFsp host, which already had this guard.
  • Broader exception catching in entry extraction. The OpenEntryStream and OpenDiskCachedStream methods now catch all exception types (not just ZlibException, 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

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 13 Jul 00:35

Fixes

  • File previews & thumbnails no longer fail: ReadFile now 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.log in favor of the single session log.
  • Updated SharpSevenZip to 2.0.109.

Full Changelog: release_2.7.0...release_2.7.1

release_2.7.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 05 Jul 00:09

Dependency Updates

  • winfsp.net updated from 2.2.261122.2.26183
  • SharpSevenZip updated from 2.0.992.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.
  • TypeInitializationException caused by a WinFsp DLL version mismatch during FileSystemHost creation 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.TryExtractEntry no longer throws ObjectDisposedException when called after disposal — it returns false instead, improving robustness during shutdown.
  • OpenDiskCachedStream now returns null on extraction failure instead of propagating exceptions, allowing callers to handle the error gracefully.

Error Classification

  • TypeInitializationException with Fsp.Interop inner exceptions (missing/outdated WinFsp) are now classified as known non-fatal errors and won't be reported as app bugs.
  • NullReferenceException originating 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 ErrorLogger since they are environment issues, not application bugs.

Code Quality

  • Extracted FindWinFspBinDir() as a separate method, reducing duplication in EnsureWinFspOnPath.
  • Semaphore release in OpenDiskCachedStream is now wrapped in try/catch for ObjectDisposedException, preventing crashes during shutdown.
  • Removed the unused ShowWinFspVersionMismatchWarningDialog method.
  • FindWinFspBinDir now falls back to SOFTWARE\WinFsp registry key, matching the behavior of other WinFsp detection methods.

Full Changelog: release_2.6.2...release_2.7.0

release_2.6.2

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 24 Jun 04:36

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

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 21 Jun 19:02

Changes

  • Updated SharpSevenZip from v2.0.91 to v2.0.99
  • Removed obsolete winfsp-msil.dll dependency

Full Changelog: release_2.6.0...release_2.6.1