From e0d819b88da86767c3091f61842f5d103b31c75f Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 30 Jul 2025 14:54:19 -0400 Subject: [PATCH] Fix spanned blocks, previously skipped --- .../Wrappers/MicrosoftCabinet.cs | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/SabreTools.Serialization/Wrappers/MicrosoftCabinet.cs b/SabreTools.Serialization/Wrappers/MicrosoftCabinet.cs index 5b50164a..55682dec 100644 --- a/SabreTools.Serialization/Wrappers/MicrosoftCabinet.cs +++ b/SabreTools.Serialization/Wrappers/MicrosoftCabinet.cs @@ -511,14 +511,29 @@ namespace SabreTools.Serialization.Wrappers for (int i = 0; i < dataBlocks.Length; i++) { var db = dataBlocks[i]; - if (db?.CompressedData == null) + if (db.CompressedData == null) continue; + // Get the data to be processed + byte[] blockData = db.CompressedData; + + // If the block is continued, append + if (db.UncompressedSize == 0) + { + var nextBlock = dataBlocks[i++]; + byte[]? nextData = nextBlock.CompressedData; + if (nextData == null) + continue; + + blockData = [.. blockData, .. nextData]; + db.UncompressedSize = nextBlock.UncompressedSize; + } + // Get the uncompressed data block byte[] data = compressionType switch { - CompressionType.TYPE_NONE => db.CompressedData, - CompressionType.TYPE_MSZIP => DecompressMSZIPBlock(folderIndex, mszip, i, db, includeDebug), + CompressionType.TYPE_NONE => blockData, + CompressionType.TYPE_MSZIP => DecompressMSZIPBlock(folderIndex, mszip, i, db, blockData, includeDebug), // TODO: Unsupported CompressionType.TYPE_QUANTUM => [], @@ -543,19 +558,16 @@ namespace SabreTools.Serialization.Wrappers /// MS-ZIP decompressor with persistent state /// Index of the block within the folder /// Block data to be used for decompression + /// Block data to be used for decompression /// True to include debug data, false otherwise /// Byte array representing the decompressed data, empty on error - private static byte[] DecompressMSZIPBlock(int folderIndex, Decompressor mszip, int blockIndex, CFDATA block, bool includeDebug) + private byte[] DecompressMSZIPBlock(int folderIndex, Decompressor mszip, int blockIndex, CFDATA block, byte[] blockData, bool includeDebug) { - // Ignore invalid blocks - if (block.CompressedData == null) - return []; - try { // Decompress to a temporary stream using var stream = new MemoryStream(); - mszip.CopyTo(block.CompressedData, stream); + mszip.CopyTo(blockData, stream); // Pad to the correct size but throw a warning about this if (stream.Length < block.UncompressedSize)