Releases: purelogiccode/BatchConvertIsoToXiso
Release list
release_2.7.1
New Features
- New unit tests — Added tests for
DiskMonitorService,FileExtractorService,OrchestratorService, andStatsService.
Improvements
- Better
DirectoryNotFoundExceptionhandling inExtractXisoService— Shows a clear message when a drive or path is missing instead of a generic error. - Better
EndOfStreamExceptionhandling inExtractFiles— Corrupt/incomplete archives now show a "re-download" message. - Better xdvdfs error messages — Non-zero exit codes now suggest the ISO may be invalid or corrupt, without sending a bug report.
- Encrypted archives no longer trigger bug reports — Password-protected archives are treated as environmental errors.
- CancellationToken passed to temp folder cleanup — Cleanup operations now respect cancellation instead of running unconditionally.
UI Changes
- Terminal text color changed from green to white.
- Start button changed from green to cyan.
- Exit button changed from slate gray to purple.
Internal
- Added
staticannotation to lambda expressions where applicable. Microsoft.NET.Test.Sdkupdated from 18.6.0 to 18.7.0.
Full Changelog: release_2.7.0...release_2.7.1
release_2.7.0
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
release_2.6.1
Features
- Support for multiple Xbox disc formats: Added detection for XGD1, XGD2, XGD3, and additional disc variants. The converter now tries multiple known partition offsets when reading the XDVDFS volume descriptor, improving compatibility with a wider range of Xbox ISO dumps.
Bug Fixes
- Fixed missing partition offset in signature scan: The fallback signature scan (
FindXisoSignatureOffset) now includes the0x89D80000offset, matching the offset used byXisoWriterfor Redump type 5 ISOs. Previously, if signature validation failed at the expected offset, the scan would not find this variant.
Full Changelog: release_2.6.0...release_2.6.1
release_2.6.0
New Features
7-Zip CLI Fallback for Unsupported Compression Methods
- ZIP archives using unsupported compression methods (e.g., ZSTD/method 21) now automatically fall back to 7-Zip CLI extraction
- If 7-Zip is not installed, provides clear instructions on how to install it or place
7za.exein the application directory
Multilingual Network Error Detection
- Added network error detection with support for multiple languages:
- English: "network", "device", "no longer available"
- German: "Netzwerk", "nicht mehr verfügbar"
- French: "réseau", "n'est plus disponible"
- Spanish: "red"
- Italian: "rete"
- Network errors now display helpful guidance to users instead of generic error messages
Improved Disk Space Handling
- Added
ResolveTempDirectorymethod to automatically find alternative drives when default temp drive lacks space - Pre-conversion disk space checks now use
IDiskMonitorServicefor better accuracy TempFolderCleanupHelpernow scans all fixed drives for orphaned temp folders
Bug Fixes
Archive Extraction Improvements
- Fixed bug #56363: 7-Zip fallback for unsupported compression methods
- Fixed bug #56306: Improved path validation for archive extraction
- Improved disk space error detection to handle:
- Negative HResult values
- Inner exceptions
- French error messages ("Espace insuffisant", "disque plein")
IO Error Resilience
- Added retry logic with exponential backoff for transient IO errors in file copy operations
- Added retry logic for directory enumeration during extraction
- Handle
EndOfStreamExceptionin XDVDFS traversal to return partial results for corrupted ISOs - Catch
InvalidDataExceptionandNullReferenceExceptionduring integrity check and startup
XISO Explorer Improvements
- Improved disk space handling in XISO Explorer extraction
- Better error messages for disk space issues
Dependencies
- Updated
Microsoft.Extensions.DependencyInjectionto version 10.0.9 - Updated
SharpCompressto version 0.49.1
Full Changelog: release_2.5.0...release_2.6.0
release_2.5.0
7-Zip CLI Fallback for .7z Archives
SharpCompress can struggle with certain .7z archives (especially those using newer compression methods). This release adds an automatic fallback to the 7-Zip command-line tool when SharpCompress fails.
Smart Temp Drive Selection
When the system temp drive runs low on space during archive extraction, the app now automatically searches alternative local drives with sufficient free space. This prevents failures when processing large archives on systems where the C: drive is nearly full.
Archive Info Pre-Scan
Before extraction, archives are now analyzed to determine their uncompressed size and file count. This enables the drive space check to be smarter and provides a more accurate progress indicator before extraction begins.
Enhanced Error Handling
- Added bug reporting for failures in
ExternalToolService,ExtractXisoService,NativeIsoIntegrityService, andXisoWriter - Disk space checks now include a 10% safety buffer (minimum 200MB) to account for filesystem overhead
Under the Hood
- Upgraded SharpCompress to 0.49.0
- Over 30 new unit tests covering
DisplayInstructions,Formatter,GenerateFilename, andConvertToPastTense
Full Changelog: release_2.4.0...release_2.5.0
release_2.4.0
Encrypted Archive Detection
Password-protected archives (ZIP, RAR, 7z) are now automatically detected. Instead of cryptic "bad state" or "end of stream" errors, you'll see a clear message explaining the file is encrypted and guidance on how to extract it manually. This prevents confusion when processing archives downloaded from sites that password-protect their downloads.
File Lock Detection
If an archive is currently open in another program (file explorer preview, antivirus scan, download manager, etc.), the application now detects this before attempting extraction and provides a clear error message asking you to close the locking program.
Retry Logic with Exponential Backoff
Archive analysis and extraction now include automatic retry on transient I/O errors (up to 3 attempts with increasing delays), reducing failures caused by temporary file locks or brief network interruptions.
Drive Readiness Check
Before processing files, the application verifies the target drive is actually ready — preventing confusing errors when working with disconnected external drives or network shares that have gone offline.
Improved Shutdown Handling
- The application now properly cancels and disposes background operations when closing
- Added a safety net that force-terminates the process if the UI becomes unresponsive during shutdown (prevents the app from lingering in the background)
- Closing the window while an operation is running is now smoother and more reliable
Code Quality & Maintainability
- Extracted
GetXgdTypemethod for cleaner Redump ISO type detection BuildFullMessagemade testable (nowinternal static)UpdateCheckernow uses injected version string instead of runtime assembly reflection- Removed unused
ApplicationSettingsmodel and orphaned methods (GetUncompressedArchiveSizeAsync,RobustMoveFileAsync) - Added 4 new unit test files, bringing the test suite to 173 passing tests
- Async methods now follow the
Asyncsuffix naming convention - NuGet dependencies updated:
SharpCompress0.48.1,Microsoft.Extensions.DependencyInjection10.0.8
Full Changelog: release_2.3.1...release_2.4.0
release_2.3.1
- Update Microsoft.Extensions.DependencyInjection to 10.0.6
- Remove unused TextOptions from App.xaml
- Fix a bug during application launch
release_2.3.0
- Add fallback-safe font families (Segoe UI, Arial, etc.) and terminal fonts for better rendering on Windows, Wine/Proton, and Linux.
- Enhance error handling for font/rendering issues with detailed diagnostics and user guidance.
- Update SharpCompress package.
- Improve exception reporting with environment details.
release_2.2.0
- Add a helper method to detect when output drives or network paths become unavailable. When such errors occur, the batch operation is now stopped immediately rather than continuing to process files that cannot be written.
- Improves error detection by checking specific HRESULT codes.
- Adds Czech translation support for device not ready errors.
- Batch operations will now stop immediately on fatal environmental errors instead of marking files as failed and continuing.
- Implement IsDiskSpaceError check to stop batch processing when the output drive is full.
- Improve the bug reports.
- Update SharpCompress dependency to version 0.47.3.
release_2.1.2
1. New Features & Improvements
- Disk Space Verification: Added a
CheckDiskSpacemethod that calculates the total size of an archive's contents and verifies if the destination drive has sufficient free space before starting the extraction. - Extraction Metadata: The logs now display the total size of the files to be extracted alongside the file count and archive format.
- Dependency Update: Updated the
SharpCompresslibrary from version0.47.0to0.47.1.
2. Enhanced Error Handling
- Specific Archive Exceptions: Added dedicated catch blocks for
ArchiveExceptionandArchiveOperationException. This provides users with clearer feedback if an archive is corrupt, invalid, or in an unsupported format. - Disk Space Alerts: Improved the reporting of "not enough space" errors, providing a user-friendly message suggesting the user free up space rather than showing a generic IO error.
- Refined Bug Reporting Filters: Updated the exception filtering logic to ensure that environmental issues (like low disk space) and archive-specific errors (like corruption or invalid passwords) are handled gracefully and not flagged as application bugs.
3. Code Cleanup
- Simplified the extraction loop by pre-filtering entries to exclude directories.
- Added necessary imports (
SharpCompress.Common) to support new exception types.