From 6f4e7138fbf917d411e8e61efdd677dd14a48514 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Tue, 29 Jul 2025 08:28:37 -0400 Subject: [PATCH] Split out MS-CAB ExtractFile logic --- BinaryObjectScanner/FileType/MicrosoftCAB.cs | 59 ++++++++++++-------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/BinaryObjectScanner/FileType/MicrosoftCAB.cs b/BinaryObjectScanner/FileType/MicrosoftCAB.cs index 0f1a1139..66031ceb 100644 --- a/BinaryObjectScanner/FileType/MicrosoftCAB.cs +++ b/BinaryObjectScanner/FileType/MicrosoftCAB.cs @@ -197,32 +197,45 @@ namespace BinaryObjectScanner.FileType // Loop through the files for (int i = 0; i < files.Length; i++) { - try - { - var compressedFile = files[i]; - blockStream.Seek(compressedFile.FolderStartOffset, SeekOrigin.Begin); - byte[] fileData = blockStream.ReadBytes((int)compressedFile.FileSize); + var file = files[i]; + ExtractFile(outDir, blockStream, file, includeDebug); + } + } - // Ensure directory separators are consistent - string fileName = compressedFile.Name!; - if (Path.DirectorySeparatorChar == '\\') - fileName = fileName.Replace('/', '\\'); - else if (Path.DirectorySeparatorChar == '/') - fileName = fileName.Replace('\\', '/'); + /// + /// Extract the contents of a single file + /// + /// Path to the output directory + /// Stream representing the uncompressed block data + /// File information + /// True to include debug data, false otherwise + /// TODO: Remove once Serialization is updated + private static void ExtractFile(string outDir, Stream blockStream, CFFILE file, bool includeDebug) + { + try + { + blockStream.Seek(file.FolderStartOffset, SeekOrigin.Begin); + byte[] fileData = blockStream.ReadBytes((int)file.FileSize); - string tempFile = Path.Combine(outDir, fileName); - var directoryName = Path.GetDirectoryName(tempFile); - if (directoryName != null && !Directory.Exists(directoryName)) - Directory.CreateDirectory(directoryName); + // Ensure directory separators are consistent + string fileName = file.Name!; + if (Path.DirectorySeparatorChar == '\\') + fileName = fileName.Replace('/', '\\'); + else if (Path.DirectorySeparatorChar == '/') + fileName = fileName.Replace('\\', '/'); - using var of = File.OpenWrite(tempFile); - of.Write(fileData, 0, fileData.Length); - of.Flush(); - } - catch (Exception ex) - { - if (includeDebug) Console.WriteLine(ex); - } + string tempFile = Path.Combine(outDir, fileName); + var directoryName = Path.GetDirectoryName(tempFile); + if (directoryName != null && !Directory.Exists(directoryName)) + Directory.CreateDirectory(directoryName); + + using var of = File.OpenWrite(tempFile); + of.Write(fileData, 0, fileData.Length); + of.Flush(); + } + catch (Exception ex) + { + if (includeDebug) Console.WriteLine(ex); } }