release_2.7.0
·
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
IsDiskSpaceErrorandIsNetworkErrorintoPathHelper, eliminating duplicate code acrossOrchestratorService,ExtractXisoService, andExtractFiles - 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 checking —
IsNetworkErrorandIsDiskSpaceErrornow checkInnerExceptionmessages, catching wrapped errors from network share failures - Centralized temp directory resolution —
PathHelper.ResolveTempDirectoryprovides a single implementation used by bothOrchestratorServiceandExtractXisoService
Cancellation & Threading Improvements
- TaskCompletionSource for shutdown — Replaced the polling loop in
WaitForOperationToCompleteAsyncwithTaskCompletionSource, 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.Nonesince the original token is already cancelled at that point - Safe CTS disposal — Wrapped
CancellationTokenSource.Dispose()in try-catch to handleObjectDisposedExceptionduring shutdown - Thread-safe XisoExplorer — Added
_explorerIsoStLockto 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>.Sharedinstead of allocating new arrays each time, reducing GC pressure during batch operations - Stopwatch for elapsed time — Replaced
DateTime.Nowsubtraction withSystem.Diagnostics.Stopwatchfor accurate, high-resolution operation timing - IHttpClientFactory integration —
BugReportService,StatsService, andUpdateCheckernow receiveHttpClientfrom the DI container viaIHttpClientFactory, 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 reading —
ReportBugAsyncnow usesDispatcher.InvokeAsyncfor 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 files —
OrchestratorServicenow uses the original filename (not the temp copy path) when generating the output.isoname - Removed
Math.Absfrom HResult — HResult values forERROR_DISK_FULL(0x70) andERROR_HANDLE_DISK_FULL(0x27) are positive; theMath.Abswas a no-op - Proper
usingfor HTTP resources —JsonContentandHttpResponseMessageare now disposed correctly inBugReportService BinaryReaderleave-open —IsoStnow creates itsBinaryReaderwithleaveOpen: 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 formatting —
ExceptionFormatternow iterates all inner exceptions in anAggregateException, not just the first one - Fixed sharing violation detection —
IsFileLockednow uses the HResult code (0x80070020) instead of string matching on the error message
Removed Unused Dependencies
- Removed
System.Text.Encoding.CodePagesNuGet package — The encoding provider is registered at startup viaCodePagesEncodingProvider.Instance, but the explicit package reference was no longer needed in the main project (added to tests viaModuleInitializer)
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,
ConvertToPastTensegrammar rules,XisoWriter.GetXgdTypemapping, andUrlOpenerServiceerror logging
Full Changelog: release_2.6.1...release_2.7.0