Files
BinaryObjectScanner/BinaryObjectScanner.Wrappers/WrapperFactory.cs

133 lines
5.8 KiB
C#
Raw Normal View History

using System;
using System.IO;
2023-03-07 12:04:48 -05:00
using BinaryObjectScanner.Utilities;
using SabreTools.IO;
2023-09-16 22:08:18 -04:00
using SabreTools.Matching;
2023-09-16 00:44:22 -04:00
using SabreTools.Serialization.Interfaces;
using SabreTools.Serialization.Wrappers;
namespace BinaryObjectScanner.Wrappers
{
public static class WrapperFactory
{
2023-01-18 10:56:19 -08:00
/// <summary>
/// Create an instance of a wrapper based on file type
/// </summary>
2023-09-12 17:12:23 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
public static IWrapper CreateWrapper(SupportedFileType fileType, Stream data)
2023-09-12 17:12:23 -04:00
#else
public static IWrapper? CreateWrapper(SupportedFileType fileType, Stream? data)
#endif
2023-01-18 10:56:19 -08:00
{
switch (fileType)
{
case SupportedFileType.AACSMediaKeyBlock: return AACSMediaKeyBlock.Create(data);
case SupportedFileType.BDPlusSVM: return BDPlusSVM.Create(data);
2023-03-13 16:06:45 -04:00
case SupportedFileType.BFPK: return BFPK.Create(data);
case SupportedFileType.BSP: return BSP.Create(data);
2023-01-18 10:56:19 -08:00
//case SupportedFileType.BZip2: return BZip2.Create(data);
2023-03-13 16:06:45 -04:00
case SupportedFileType.CFB: return CFB.Create(data);
2023-01-18 10:56:19 -08:00
case SupportedFileType.CIA: return CIA.Create(data);
case SupportedFileType.Executable: return CreateExecutableWrapper(data);
2023-03-13 16:06:45 -04:00
case SupportedFileType.GCF: return GCF.Create(data);
2023-01-18 10:56:19 -08:00
//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);
2023-03-13 16:06:45 -04:00
//case SupportedFileType.LDSCRYPT: return BinaryObjectScanner.Wrappers.LDSCRYPT.Create(data);
2023-01-18 10:56:19 -08:00
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);
2023-03-13 16:06:45 -04:00
case SupportedFileType.PAK: return PAK.Create(data);
case SupportedFileType.PFF: return PFF.Create(data);
2023-01-18 10:56:19 -08:00
//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);
2023-03-13 16:06:45 -04:00
case SupportedFileType.SGA: return SGA.Create(data);
2023-01-18 10:56:19 -08:00
//case SupportedFileType.TapeArchive: return TapeArchive.Create(data);
//case SupportedFileType.Textfile: return Textfile.Create(data);
2023-03-13 16:06:45 -04:00
case SupportedFileType.VBSP: return VBSP.Create(data);
case SupportedFileType.VPK: return VPK.Create(data);
case SupportedFileType.WAD: return WAD.Create(data);
2023-01-18 10:56:19 -08:00
//case SupportedFileType.XZ: return XZ.Create(data);
2023-03-13 16:06:45 -04:00
case SupportedFileType.XZP: return XZP.Create(data);
2023-01-18 10:56:19 -08:00
default: return null;
}
}
/// <summary>
/// Create an instance of a wrapper based on the executable type
2023-01-18 10:56:19 -08:00
/// </summary>
/// <param name="stream">Stream data to parse</param>
2023-09-12 17:12:23 -04:00
/// <returns>IWrapper representing the executable, null on error</returns>
#if NET48
2023-09-11 23:25:09 -04:00
public static IWrapper CreateExecutableWrapper(Stream stream)
2023-09-12 17:12:23 -04:00
#else
public static IWrapper? CreateExecutableWrapper(Stream? stream)
#endif
2023-01-18 10:56:19 -08:00
{
2023-09-13 00:08:11 -04:00
// If we have no stream
if (stream == null)
return null;
2023-01-18 10:56:19 -08:00
// Try to get an MS-DOS wrapper first
2023-09-13 00:08:11 -04:00
#if NET48
2023-09-11 23:25:09 -04:00
IWrapper wrapper = MSDOS.Create(stream);
2023-09-13 00:08:11 -04:00
#else
IWrapper? wrapper = MSDOS.Create(stream);
#endif
if (wrapper == null || !(wrapper is MSDOS msdos))
2023-01-18 10:56:19 -08:00
return null;
// Check for a valid new executable address
if (msdos.Model.Header?.NewExeHeaderAddr == null || msdos.Model.Header.NewExeHeaderAddr >= stream.Length)
2023-01-18 10:56:19 -08:00
return wrapper;
// Try to read the executable info
stream.Seek(msdos.Model.Header.NewExeHeaderAddr, SeekOrigin.Begin);
2023-09-13 00:08:11 -04:00
#if NET48
2023-01-18 10:56:19 -08:00
byte[] magic = stream.ReadBytes(4);
2023-09-13 00:08:11 -04:00
#else
byte[]? magic = stream.ReadBytes(4);
#endif
// If we didn't get valid data at the offset
if (magic == null)
{
return wrapper;
}
2023-01-18 10:56:19 -08:00
// New Executable
2023-09-13 00:08:11 -04:00
else if (magic.StartsWith(SabreTools.Models.NewExecutable.Constants.SignatureBytes))
2023-01-18 10:56:19 -08:00
{
stream.Seek(0, SeekOrigin.Begin);
return NewExecutable.Create(stream);
}
// Linear Executable
2023-09-04 23:44:45 -04:00
else if (magic.StartsWith(SabreTools.Models.LinearExecutable.Constants.LESignatureBytes)
|| magic.StartsWith(SabreTools.Models.LinearExecutable.Constants.LXSignatureBytes))
2023-01-18 10:56:19 -08:00
{
stream.Seek(0, SeekOrigin.Begin);
return LinearExecutable.Create(stream);
}
// Portable Executable
2023-09-04 23:44:45 -04:00
else if (magic.StartsWith(SabreTools.Models.PortableExecutable.Constants.SignatureBytes))
2023-01-18 10:56:19 -08:00
{
stream.Seek(0, SeekOrigin.Begin);
return PortableExecutable.Create(stream);
}
// Everything else fails
return null;
}
}
}