From 32c9ea78386ae6f52377a951cf5e287862d66b61 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 28 Jul 2025 13:14:33 -0400 Subject: [PATCH] Add MS-CAB GetFiles helper --- BinaryObjectScanner/FileType/MicrosoftCAB.cs | 28 ++++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/BinaryObjectScanner/FileType/MicrosoftCAB.cs b/BinaryObjectScanner/FileType/MicrosoftCAB.cs index 98d906c7..1419d18e 100644 --- a/BinaryObjectScanner/FileType/MicrosoftCAB.cs +++ b/BinaryObjectScanner/FileType/MicrosoftCAB.cs @@ -98,15 +98,13 @@ namespace BinaryObjectScanner.FileType continue; // Ensure files - if (cabArchive?.Model?.Files == null || cabArchive.Model.Files.Length == 0) + var files = GetFiles(cabArchive, f); + if (files.Length == 0) continue; // Loop through the files - foreach (var compressedFile in cabArchive.Model.Files) + foreach (var compressedFile in files) { - if (compressedFile?.Name == null || GetFolderIndex(cabArchive, compressedFile) != f) - continue; - try { byte[] fileData = new byte[compressedFile.FileSize]; @@ -170,6 +168,26 @@ namespace BinaryObjectScanner.FileType #endif } + /// + /// Get all files for the current folder index + /// + private CFFILE[] GetFiles(SabreTools.Serialization.Wrappers.MicrosoftCabinet cabArchive, int folderIndex) + { + // Ignore invalid archives + if (cabArchive.Model.Files == null) + return []; + + // Get all files with a name and matching index + return Array.FindAll(cabArchive.Model.Files, f => + { + if (string.IsNullOrEmpty(f.Name)) + return false; + + int fileFolder = GetFolderIndex(cabArchive, f); + return fileFolder == folderIndex; + }); + } + /// /// Get the corrected folder index ///