From dc18951d0bf8ae00f90bfd041b9344799a2e91ce Mon Sep 17 00:00:00 2001 From: gmipf Date: Mon, 26 Oct 2026 02:30:32 +0100 Subject: [PATCH] Close the Wise script and the multipart file after extraction (#104) * Look for the Wise overlay header before opening the file again ExtractWiseOverlay (and ExtractWise for NE) opened a second stream on the executable for multi-part Wise installers before checking for a Wise overlay header at all. For any other executable that stream was never closed, so the file stayed open until the stream was finalized. On Windows such a file cannot be deleted, so an extraction folder that contains it is left behind in TEMP. Co-Authored-By: Claude Opus 5.5 * Close the Wise script and the multipart file after extraction ExtractWiseOverlay (and ExtractWise for NE) never closed WiseScript.bin, which it opens from the output directory, nor the stream with the installer and its parts, so these files stayed open until their streams were finalized. Co-Authored-By: Claude Opus 5.5 * Keep the original block that opens the multipart file Close the multipart stream with a separate using declaration after the block instead of rewriting it. Co-Authored-By: Claude Opus 5.5 --------- Co-authored-by: Claude Opus 5.5 --- SabreTools.Wrappers/NewExecutable.Extraction.cs | 5 ++++- SabreTools.Wrappers/PortableExecutable.Extraction.cs | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/SabreTools.Wrappers/NewExecutable.Extraction.cs b/SabreTools.Wrappers/NewExecutable.Extraction.cs index 239a56e5..4ddeed63 100644 --- a/SabreTools.Wrappers/NewExecutable.Extraction.cs +++ b/SabreTools.Wrappers/NewExecutable.Extraction.cs @@ -222,6 +222,9 @@ namespace SabreTools.Wrappers source = temp; } + // Close the multipart file again on return + using var multipart = source == _dataSource ? null : source; + return ExtractWiseOverlay(outputDirectory, includeDebug, source, offset); } @@ -253,7 +256,7 @@ namespace SabreTools.Wrappers } // Open the script file from the output directory - var scriptStream = File.OpenRead(Path.Combine(outputDirectory, "WiseScript.bin")); + using var scriptStream = File.OpenRead(Path.Combine(outputDirectory, "WiseScript.bin")); var script = WiseScript.Create(scriptStream); if (script is null) { diff --git a/SabreTools.Wrappers/PortableExecutable.Extraction.cs b/SabreTools.Wrappers/PortableExecutable.Extraction.cs index 426b8d3c..2f305749 100644 --- a/SabreTools.Wrappers/PortableExecutable.Extraction.cs +++ b/SabreTools.Wrappers/PortableExecutable.Extraction.cs @@ -652,6 +652,9 @@ namespace SabreTools.Wrappers source = temp; } + // Close the multipart file again on return + using var multipart = source == _dataSource ? null : source; + // Seek to the overlay and parse source.SeekIfPossible(offset, SeekOrigin.Begin); var header = WiseOverlayHeader.Create(source); @@ -670,7 +673,7 @@ namespace SabreTools.Wrappers } // Open the script file from the output directory - var scriptStream = File.OpenRead(Path.Combine(outputDirectory, "WiseScript.bin")); + using var scriptStream = File.OpenRead(Path.Combine(outputDirectory, "WiseScript.bin")); var script = WiseScript.Create(scriptStream); if (script is null) {