diff --git a/BurnOutSharp/FileType/Executable.cs b/BurnOutSharp/FileType/Executable.cs
index b119eee5..73e7fcf7 100644
--- a/BurnOutSharp/FileType/Executable.cs
+++ b/BurnOutSharp/FileType/Executable.cs
@@ -4,8 +4,6 @@ using System.IO;
using System.Text;
using System.Threading.Tasks;
using BurnOutSharp.Interfaces;
-using BurnOutSharp.Matching;
-using BurnOutSharp.Utilities;
using BurnOutSharp.Wrappers;
using static BurnOutSharp.Utilities.Dictionary;
@@ -56,7 +54,7 @@ namespace BurnOutSharp.FileType
}
// Get the wrapper for the appropriate executable type
- WrapperBase wrapper = DetermineExecutableType(stream);
+ WrapperBase wrapper = Tools.Utilities.DetermineExecutableType(stream);
if (wrapper == null)
return protections;
@@ -147,52 +145,6 @@ namespace BurnOutSharp.FileType
#region Helpers
- ///
- /// Determine the executable type from the stream
- ///
- /// Stream data to parse
- /// WrapperBase representing the executable, null on error
- private WrapperBase DetermineExecutableType(Stream stream)
- {
- // Try to get an MS-DOS wrapper first
- WrapperBase wrapper = MSDOS.Create(stream);
- if (wrapper == null)
- return null;
-
- // Check for a valid new executable address
- if ((wrapper as MSDOS).NewExeHeaderAddr >= stream.Length)
- return wrapper;
-
- // Try to read the executable info
- stream.Seek((wrapper as MSDOS).NewExeHeaderAddr, SeekOrigin.Begin);
- byte[] magic = stream.ReadBytes(4);
-
- // New Executable
- if (magic.StartsWith(Models.NewExecutable.Constants.SignatureBytes))
- {
- stream.Seek(0, SeekOrigin.Begin);
- return NewExecutable.Create(stream);
- }
-
- // Linear Executable
- else if (magic.StartsWith(Models.LinearExecutable.Constants.LESignatureBytes)
- || magic.StartsWith(Models.LinearExecutable.Constants.LXSignatureBytes))
- {
- stream.Seek(0, SeekOrigin.Begin);
- return LinearExecutable.Create(stream);
- }
-
- // Portable Executable
- else if (magic.StartsWith(Models.PortableExecutable.Constants.SignatureBytes))
- {
- stream.Seek(0, SeekOrigin.Begin);
- return PortableExecutable.Create(stream);
- }
-
- // Everything else fails
- return null;
- }
-
///
/// Check to see if a protection should be added or not
///
diff --git a/BurnOutSharp/Tools/Utilities.cs b/BurnOutSharp/Tools/Utilities.cs
index 84f10f27..528e491f 100644
--- a/BurnOutSharp/Tools/Utilities.cs
+++ b/BurnOutSharp/Tools/Utilities.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO;
using BurnOutSharp.Interfaces;
using BurnOutSharp.Matching;
+using BurnOutSharp.Utilities;
using BurnOutSharp.Wrappers;
namespace BurnOutSharp.Tools
@@ -833,6 +834,99 @@ namespace BurnOutSharp.Tools
}
}
+ ///
+ /// Create an instance of a wrapper based on file type
+ ///
+ public static WrapperBase CreateWrapper(SupportedFileType fileType, Stream data)
+ {
+ switch (fileType)
+ {
+ case SupportedFileType.AACSMediaKeyBlock: return AACSMediaKeyBlock.Create(data);
+ case SupportedFileType.BDPlusSVM: return BDPlusSVM.Create(data);
+ case SupportedFileType.BFPK: return BFPK.Create(data);
+ case SupportedFileType.BSP: return BSP.Create(data);
+ //case SupportedFileType.BZip2: return BZip2.Create(data);
+ case SupportedFileType.CFB: return CFB.Create(data);
+ case SupportedFileType.CIA: return CIA.Create(data);
+ case SupportedFileType.Executable: return DetermineExecutableType(data);
+ case SupportedFileType.GCF: return GCF.Create(data);
+ //case SupportedFileType.GZIP: return GZIP.Create(data);
+ //case SupportedFileType.IniFile: return IniFile.Create(data);
+ //case SupportedFileType.InstallShieldArchiveV3: return InstallShieldArchiveV3.Create(data);
+ case SupportedFileType.InstallShieldCAB: return InstallShieldCabinet.Create(data);
+ //case SupportedFileType.LDSCRYPT: return LDSCRYPT.Create(data);
+ case SupportedFileType.MicrosoftCAB: return MicrosoftCabinet.Create(data);
+ //case SupportedFileType.MicrosoftLZ: return MicrosoftLZ.Create(data);
+ //case SupportedFileType.MPQ: return MoPaQ.Create(data);
+ case SupportedFileType.N3DS: return N3DS.Create(data);
+ case SupportedFileType.NCF: return NCF.Create(data);
+ case SupportedFileType.Nitro: return Nitro.Create(data);
+ case SupportedFileType.PAK: return PAK.Create(data);
+ case SupportedFileType.PFF: return PFF.Create(data);
+ //case SupportedFileType.PKZIP: return PKZIP.Create(data);
+ case SupportedFileType.PLJ: return PlayJAudioFile.Create(data);
+ case SupportedFileType.Quantum: return Quantum.Create(data);
+ //case SupportedFileType.RAR: return RAR.Create(data);
+ //case SupportedFileType.SevenZip: return SevenZip.Create(data);
+ //case SupportedFileType.SFFS: return SFFS.Create(data);
+ case SupportedFileType.SGA: return SGA.Create(data);
+ //case SupportedFileType.TapeArchive: return TapeArchive.Create(data);
+ //case SupportedFileType.Textfile: return Textfile.Create(data);
+ case SupportedFileType.VBSP: return VBSP.Create(data);
+ case SupportedFileType.VPK: return VPK.Create(data);
+ case SupportedFileType.WAD: return WAD.Create(data);
+ //case SupportedFileType.XZ: return XZ.Create(data);
+ case SupportedFileType.XZP: return XZP.Create(data);
+ default: return null;
+ }
+ }
+
+ ///
+ /// Determine the executable type from the stream
+ ///
+ /// Stream data to parse
+ /// WrapperBase representing the executable, null on error
+ public static WrapperBase DetermineExecutableType(Stream stream)
+ {
+ // Try to get an MS-DOS wrapper first
+ WrapperBase wrapper = MSDOS.Create(stream);
+ if (wrapper == null)
+ return null;
+
+ // Check for a valid new executable address
+ if ((wrapper as MSDOS).NewExeHeaderAddr >= stream.Length)
+ return wrapper;
+
+ // Try to read the executable info
+ stream.Seek((wrapper as MSDOS).NewExeHeaderAddr, SeekOrigin.Begin);
+ byte[] magic = stream.ReadBytes(4);
+
+ // New Executable
+ if (magic.StartsWith(Models.NewExecutable.Constants.SignatureBytes))
+ {
+ stream.Seek(0, SeekOrigin.Begin);
+ return NewExecutable.Create(stream);
+ }
+
+ // Linear Executable
+ else if (magic.StartsWith(Models.LinearExecutable.Constants.LESignatureBytes)
+ || magic.StartsWith(Models.LinearExecutable.Constants.LXSignatureBytes))
+ {
+ stream.Seek(0, SeekOrigin.Begin);
+ return LinearExecutable.Create(stream);
+ }
+
+ // Portable Executable
+ else if (magic.StartsWith(Models.PortableExecutable.Constants.SignatureBytes))
+ {
+ stream.Seek(0, SeekOrigin.Begin);
+ return PortableExecutable.Create(stream);
+ }
+
+ // Everything else fails
+ return null;
+ }
+
#endregion
#region Processed Executable Information