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.