diff --git a/BinaryObjectScanner/FileType/MicrosoftCAB.cs b/BinaryObjectScanner/FileType/MicrosoftCAB.cs
index 1419d18e..5d8bf728 100644
--- a/BinaryObjectScanner/FileType/MicrosoftCAB.cs
+++ b/BinaryObjectScanner/FileType/MicrosoftCAB.cs
@@ -41,60 +41,10 @@ namespace BinaryObjectScanner.FileType
// Loop through the folders
for (int f = 0; f < cabArchive!.Model.Folders.Length; f++)
{
- // Ensure data blocks
+ // Decompress the blocks, if possible
var folder = cabArchive.Model.Folders[f];
- if (folder?.DataBlocks == null || folder.DataBlocks.Length == 0)
- continue;
-
- // Setup decompressors
- var mszip = SabreTools.Compression.MSZIP.Decompressor.Create();
- uint quantumWindowBits = (uint)(((ushort)folder.CompressionType >> 8) & 0x1f);
-
- // Loop through the data blocks
- var ms = new MemoryStream();
- foreach (var db in folder.DataBlocks)
- {
- if (db?.CompressedData == null)
- continue;
-
- // Uncompressed data
- if ((folder.CompressionType & CompressionType.TYPE_NONE) != 0)
- {
- ms.Write(db.CompressedData, 0, db.CompressedData.Length);
- ms.Flush();
- }
-
- // MS-ZIP
- else if ((folder.CompressionType & CompressionType.TYPE_MSZIP) != 0)
- {
- mszip.CopyTo(db.CompressedData, ms);
- }
-
- // Quantum
- else if ((folder.CompressionType & CompressionType.TYPE_QUANTUM) != 0)
- {
- var quantum = SabreTools.Compression.Quantum.Decompressor.Create(db.CompressedData, quantumWindowBits);
- byte[] data = quantum.Process();
- ms.Write(data, 0, data.Length);
- ms.Flush();
- }
-
- // LZX
- else if ((folder.CompressionType & CompressionType.TYPE_LZX) != 0)
- {
- // TODO: Unsupported
- continue;
- }
-
- // Unknown
- else
- {
- continue;
- }
- }
-
- // If no data was read
- if (ms.Length == 0)
+ var ms = DecompressBlocks(cabArchive, folder);
+ if (ms == null || ms.Length == 0)
continue;
// Ensure files
@@ -168,6 +118,65 @@ namespace BinaryObjectScanner.FileType
#endif
}
+ ///
+ /// Decompress all blocks for a folder
+ ///
+ private MemoryStream? DecompressBlocks(SabreTools.Serialization.Wrappers.MicrosoftCabinet cabArchive, CFFOLDER? folder)
+ {
+ // Ensure data blocks
+ if (folder?.DataBlocks == null || folder.DataBlocks.Length == 0)
+ return null;
+
+ // Setup decompressors
+ var mszip = SabreTools.Compression.MSZIP.Decompressor.Create();
+ uint quantumWindowBits = (uint)(((ushort)folder.CompressionType >> 8) & 0x1f);
+
+ // Loop through the data blocks
+ var ms = new MemoryStream();
+ foreach (var db in folder.DataBlocks)
+ {
+ if (db?.CompressedData == null)
+ continue;
+
+ // Uncompressed data
+ if ((folder.CompressionType & CompressionType.TYPE_NONE) != 0)
+ {
+ ms.Write(db.CompressedData, 0, db.CompressedData.Length);
+ ms.Flush();
+ }
+
+ // MS-ZIP
+ else if ((folder.CompressionType & CompressionType.TYPE_MSZIP) != 0)
+ {
+ mszip.CopyTo(db.CompressedData, ms);
+ }
+
+ // Quantum
+ else if ((folder.CompressionType & CompressionType.TYPE_QUANTUM) != 0)
+ {
+ var quantum = SabreTools.Compression.Quantum.Decompressor.Create(db.CompressedData, quantumWindowBits);
+ byte[] data = quantum.Process();
+ ms.Write(data, 0, data.Length);
+ ms.Flush();
+ }
+
+ // LZX
+ else if ((folder.CompressionType & CompressionType.TYPE_LZX) != 0)
+ {
+ // TODO: Unsupported
+ continue;
+ }
+
+ // Unknown
+ else
+ {
+ continue;
+ }
+ }
+
+ return ms;
+ }
+
///
/// Get all files for the current folder index
///