Skip to content

release_2.7.0

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 21 Jun 18:31
· 11 commits to master since this release

Improved ISO Compatibility

  • Rebuilt XISO support — Added detection of XDVDFS volumes at Sector 0 for rebuilt XISO images that have no video partition header
  • Secondary signature validation — Now validates both the primary signature at the header offset and the secondary signature at +0x7EC, matching the reference implementations in extract-xiso and xdvdfs
  • Relaxed partition validation — Reduced false negatives when detecting valid Xbox disc images by accepting empty root directories (rootOffset == 0 && rootSize == 0) and removing overly aggressive first-entry validation
  • Expanded scan regions — The sector-by-sector fallback scan now covers 64KB–512MB (previously 8MB–512MB), catching XGD3 partitions that start closer to the beginning of the file
  • Windows-1252 encoding for filenames — Xbox filenames with accented characters (e.g. é, ü, ñ) are now displayed correctly instead of being garbled by ASCII decoding

Disk Space Detection & Error Handling

  • Centralized disk space detection — Consolidated IsDiskSpaceError and IsNetworkError into PathHelper, eliminating duplicate code across OrchestratorService, ExtractXisoService, and ExtractFiles
  • Multilingual network error detection — Added support for German (Netzwerk, nicht mehr verfügbar), French (réseau, n'est plus disponible), Spanish (la red, de red), and Italian (rete) network error messages
  • Improved "device" error filtering — Excludes "The device is not ready" (ERROR_NOT_READY) from network error matches, preventing false positives on disconnected USB drives
  • Inner exception checkingIsNetworkError and IsDiskSpaceError now check InnerException messages, catching wrapped errors from network share failures
  • Centralized temp directory resolutionPathHelper.ResolveTempDirectory provides a single implementation used by both OrchestratorService and ExtractXisoService

Cancellation & Threading Improvements

  • TaskCompletionSource for shutdown — Replaced the polling loop in WaitForOperationToCompleteAsync with TaskCompletionSource, enabling instant detection of operation completion during window close
  • Proper shutdown ordering_cts.Cancel() now fires after the operation is fully set up, preventing race conditions where cancel is called before the operation starts
  • Fixed cancellation token in process termination — Process kill tasks now use CancellationToken.None since the original token is already cancelled at that point
  • Safe CTS disposal — Wrapped CancellationTokenSource.Dispose() in try-catch to handle ObjectDisposedException during shutdown
  • Thread-safe XisoExplorer — Added _explorerIsoStLock to protect the ISO stream from concurrent access during drag-and-drop, file open, and directory navigation

Memory & Performance

  • ArrayPool for large buffers — Surface scan and file verification now rent 4MB buffers from ArrayPool<byte>.Shared instead of allocating new arrays each time, reducing GC pressure during batch operations
  • Stopwatch for elapsed time — Replaced DateTime.Now subtraction with System.Diagnostics.Stopwatch for accurate, high-resolution operation timing
  • IHttpClientFactory integrationBugReportService, StatsService, and UpdateChecker now receive HttpClient from the DI container via IHttpClientFactory, enabling proper connection pooling and DNS refresh

UI Improvements

  • Subfolder search for ISO testing — Added a "Search for files in subfolders" checkbox to the Test tab, matching the existing behavior on the Convert tab
  • Responsive XISO Explorer columns — The Name column auto-resizes to fill available space when the explorer panel is resized
  • Delayed temp file cleanup — Files extracted for "Open" or drag-and-drop are cleaned up after a 30-second delay instead of immediately, preventing file-in-use errors
  • Async log readingReportBugAsync now uses Dispatcher.InvokeAsync for reading the log viewer, avoiding potential deadlocks on the UI thread

Code Quality & Correctness

  • Fixed Utils.WriteBytes — The buffer read offset was always 0, overwriting previously-read bytes; now correctly reads at (int)numBytes
  • Fixed output filename for renamed filesOrchestratorService now uses the original filename (not the temp copy path) when generating the output .iso name
  • Removed Math.Abs from HResult — HResult values for ERROR_DISK_FULL (0x70) and ERROR_HANDLE_DISK_FULL (0x27) are positive; the Math.Abs was a no-op
  • Proper using for HTTP resourcesJsonContent and HttpResponseMessage are now disposed correctly in BugReportService
  • BinaryReader leave-openIsoSt now creates its BinaryReader with leaveOpen: true, preventing the stream from being closed when the reader is disposed
  • Fixed Zip Slip detection — Changed from entryPath.Contains("..") to checking individual path components, preventing false positives on filenames like "my..file.txt"
  • AggregateException formattingExceptionFormatter now iterates all inner exceptions in an AggregateException, not just the first one
  • Fixed sharing violation detectionIsFileLocked now uses the HResult code (0x80070020) instead of string matching on the error message

Removed Unused Dependencies

  • Removed System.Text.Encoding.CodePages NuGet package — The encoding provider is registered at startup via CodePagesEncodingProvider.Instance, but the explicit package reference was no longer needed in the main project (added to tests via ModuleInitializer)

Test Coverage

  • 222 tests passing — All existing and new tests pass with zero warnings
  • New tests for: empty root directory handling, rebuilt XISO detection, multilingual network/disk errors, ConvertToPastTense grammar rules, XisoWriter.GetXgdType mapping, and UrlOpenerService error logging

Full Changelog: release_2.6.1...release_2.7.0