diff --git a/.gitmodules b/.gitmodules
index f8409a69..ae64007f 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -7,3 +7,6 @@
[submodule "LibMSPackSharp"]
path = LibMSPackSharp
url = https://github.com/mnadareski/LibMSPackSharp.git
+[submodule "Dtf"]
+ path = Dtf
+ url = https://github.com/wixtoolset/Dtf.git
diff --git a/BurnOutSharp.sln b/BurnOutSharp.sln
index 6f8d7c17..212c7788 100644
--- a/BurnOutSharp.sln
+++ b/BurnOutSharp.sln
@@ -18,6 +18,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HLLibSharp", "HLLibSharp\HL
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibMSPackSharp", "LibMSPackSharp\LibMSPackSharp\LibMSPackSharp.csproj", "{BD8144B8-4857-47E6-9717-E9F2DB374A89}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Dtf.Compression.Cab", "Dtf\src\WixToolset.Dtf.Compression.Cab\WixToolset.Dtf.Compression.Cab.csproj", "{55B1D2D8-7470-4332-96EE-E18079C8A306}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Dtf.Compression", "Dtf\src\WixToolset.Dtf.Compression\WixToolset.Dtf.Compression.csproj", "{3065BE52-CB56-4557-80CD-E3AC57C242F2}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -40,6 +44,14 @@ Global
{BD8144B8-4857-47E6-9717-E9F2DB374A89}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BD8144B8-4857-47E6-9717-E9F2DB374A89}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BD8144B8-4857-47E6-9717-E9F2DB374A89}.Release|Any CPU.Build.0 = Release|Any CPU
+ {55B1D2D8-7470-4332-96EE-E18079C8A306}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {55B1D2D8-7470-4332-96EE-E18079C8A306}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {55B1D2D8-7470-4332-96EE-E18079C8A306}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {55B1D2D8-7470-4332-96EE-E18079C8A306}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3065BE52-CB56-4557-80CD-E3AC57C242F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3065BE52-CB56-4557-80CD-E3AC57C242F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3065BE52-CB56-4557-80CD-E3AC57C242F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3065BE52-CB56-4557-80CD-E3AC57C242F2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/BurnOutSharp/BurnOutSharp.csproj b/BurnOutSharp/BurnOutSharp.csproj
index 11fb4a17..93e73695 100644
--- a/BurnOutSharp/BurnOutSharp.csproj
+++ b/BurnOutSharp/BurnOutSharp.csproj
@@ -57,6 +57,7 @@
+
diff --git a/BurnOutSharp/FileType/MicrosoftCAB.cs b/BurnOutSharp/FileType/MicrosoftCAB.cs
index 3be18181..6efed7d3 100644
--- a/BurnOutSharp/FileType/MicrosoftCAB.cs
+++ b/BurnOutSharp/FileType/MicrosoftCAB.cs
@@ -3,8 +3,7 @@ using System.Collections.Concurrent;
using System.IO;
using BurnOutSharp.Interfaces;
using BurnOutSharp.Tools;
-using LibMSPackSharp;
-using LibMSPackSharp.CABExtract;
+using WixToolset.Dtf.Compression.Cab;
namespace BurnOutSharp.FileType
{
@@ -32,7 +31,6 @@ namespace BurnOutSharp.FileType
}
}
- // TODO: Add stream opening support
///
public ConcurrentDictionary> Scan(Scanner scanner, Stream stream, string file)
{
@@ -42,55 +40,8 @@ namespace BurnOutSharp.FileType
string tempPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
Directory.CreateDirectory(tempPath);
- // Create the decompressor
- var decompressor = Library.CreateCABDecompressor(null);
- decompressor.Debug = scanner.IncludeDebug;
-
- // Open the cab file
- var cabFile = decompressor.Open(file);
- if (cabFile == null)
- {
- if (scanner.IncludeDebug) Console.WriteLine($"Error occurred opening of '{file}': {decompressor.Error}");
- return null;
- }
-
- // If we have a previous CAB and it exists, don't try scanning
- string directory = Path.GetDirectoryName(file);
- if (!string.IsNullOrWhiteSpace(cabFile.PreviousCabinetName))
- {
- if (File.Exists(Path.Combine(directory, cabFile.PreviousCabinetName)))
- return null;
- }
-
- // If there are additional next CABs, add those
- string fileName = Path.GetFileName(file);
- CABExtract.LoadSpanningCabinets(cabFile, fileName);
-
- // Loop through the found internal files
- var sub = cabFile.Files;
- while (sub != null)
- {
- // If an individual entry fails
- try
- {
- // The trim here is for some very odd and stubborn files
- string tempFile = Path.Combine(tempPath, sub.Filename.TrimEnd('\0', ' ', '.'));
- Error error = decompressor.Extract(sub, tempFile);
- if (error != Error.MSPACK_ERR_OK)
- {
- if (scanner.IncludeDebug) Console.WriteLine($"Error occurred during extraction of '{sub.Filename}': {error}");
- }
- }
- catch (Exception ex)
- {
- if (scanner.IncludeDebug) Console.WriteLine(ex);
- }
-
- sub = sub.Next;
- }
-
- // Destroy the decompressor
- Library.DestroyCABDecompressor(decompressor);
+ CabInfo cabInfo = new CabInfo(file);
+ cabInfo.Unpack(tempPath);
// Collect and format all found protections
var protections = scanner.GetProtections(tempPath);
@@ -117,5 +68,95 @@ namespace BurnOutSharp.FileType
return null;
}
+
+ #region LibMSPackSharp
+
+ // TODO: Add stream opening support
+ ///
+ //public ConcurrentDictionary> Scan(Scanner scanner, Stream stream, string file)
+ //{
+ // // If the cab file itself fails
+ // try
+ // {
+ // string tempPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
+ // Directory.CreateDirectory(tempPath);
+
+ // // Create the decompressor
+ // var decompressor = Library.CreateCABDecompressor(null);
+ // decompressor.Debug = scanner.IncludeDebug;
+
+ // // Open the cab file
+ // var cabFile = decompressor.Open(file);
+ // if (cabFile == null)
+ // {
+ // if (scanner.IncludeDebug) Console.WriteLine($"Error occurred opening of '{file}': {decompressor.Error}");
+ // return null;
+ // }
+
+ // // If we have a previous CAB and it exists, don't try scanning
+ // string directory = Path.GetDirectoryName(file);
+ // if (!string.IsNullOrWhiteSpace(cabFile.PreviousCabinetName))
+ // {
+ // if (File.Exists(Path.Combine(directory, cabFile.PreviousCabinetName)))
+ // return null;
+ // }
+
+ // // If there are additional next CABs, add those
+ // string fileName = Path.GetFileName(file);
+ // CABExtract.LoadSpanningCabinets(cabFile, fileName);
+
+ // // Loop through the found internal files
+ // var sub = cabFile.Files;
+ // while (sub != null)
+ // {
+ // // If an individual entry fails
+ // try
+ // {
+ // // The trim here is for some very odd and stubborn files
+ // string tempFile = Path.Combine(tempPath, sub.Filename.TrimEnd('\0', ' ', '.'));
+ // Error error = decompressor.Extract(sub, tempFile);
+ // if (error != Error.MSPACK_ERR_OK)
+ // {
+ // if (scanner.IncludeDebug) Console.WriteLine($"Error occurred during extraction of '{sub.Filename}': {error}");
+ // }
+ // }
+ // catch (Exception ex)
+ // {
+ // if (scanner.IncludeDebug) Console.WriteLine(ex);
+ // }
+
+ // sub = sub.Next;
+ // }
+
+ // // Destroy the decompressor
+ // Library.DestroyCABDecompressor(decompressor);
+
+ // // Collect and format all found protections
+ // var protections = scanner.GetProtections(tempPath);
+
+ // // If temp directory cleanup fails
+ // try
+ // {
+ // Directory.Delete(tempPath, true);
+ // }
+ // catch (Exception ex)
+ // {
+ // if (scanner.IncludeDebug) Console.WriteLine(ex);
+ // }
+
+ // // Remove temporary path references
+ // Utilities.StripFromKeys(protections, tempPath);
+
+ // return protections;
+ // }
+ // catch (Exception ex)
+ // {
+ // if (scanner.IncludeDebug) Console.WriteLine(ex);
+ // }
+
+ // return null;
+ //}
+
+ #endregion
}
}
diff --git a/Dtf b/Dtf
new file mode 160000
index 00000000..fcca002e
--- /dev/null
+++ b/Dtf
@@ -0,0 +1 @@
+Subproject commit fcca002ecd51ad32ef5c9c85b217acb9888cbf5c
diff --git a/README.md b/README.md
index 97d5adbd..cb8d5235 100644
--- a/README.md
+++ b/README.md
@@ -14,6 +14,7 @@ In addition to the original BurnOut code, the following libraries (or ports ther
- [StormLibSharp](https://github.com/robpaveza/stormlibsharp) - MPQ extraction
- [UnshieldSharp](https://github.com/mnadareski/UnshieldSharp) - InstallShield CAB extraction
- [WiseUnpacker](https://github.com/mnadareski/WiseUnpacker) - Wise Installer extraction
+- [WixToolset.Dtf](https://github.com/wixtoolset/Dtf) - Microsoft CAB extraction
Please note that due to current library limitations, the functionality of StormLibSharp is locked to Windows only.