[Symbian Installation File] Split files into subcomponents.

This commit is contained in:
2023-10-06 03:04:32 +01:00
parent aadfc89b31
commit 96b9908edd
11 changed files with 784 additions and 328 deletions

View File

@@ -46,6 +46,10 @@
<EmbeddedResource Include="..\LICENSE.LGPL"> <EmbeddedResource Include="..\LICENSE.LGPL">
<Link>LICENSE.LGPL</Link> <Link>LICENSE.LGPL</Link>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Update="Localization\Localization.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Localization.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Aaru.CommonTypes\Aaru.CommonTypes.csproj"/> <ProjectReference Include="..\Aaru.CommonTypes\Aaru.CommonTypes.csproj"/>

View File

@@ -0,0 +1,5 @@
<wpf:ResourceDictionary xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xml:space="preserve">
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=symbian/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

37
Aaru.Archives/Authors.cs Normal file
View File

@@ -0,0 +1,37 @@
// /***************************************************************************
// Aaru Data Preservation Suite
// ----------------------------------------------------------------------------
//
// Filename : Authors.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Aaru.Filesystems.
//
// --[ License ] --------------------------------------------------------------
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
// License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright © 2011-2023 Natalia Portillo
// ****************************************************************************/
using System.Diagnostics.CodeAnalysis;
namespace Aaru.Archives;
[SuppressMessage("ReSharper", "InconsistentNaming")]
static class Authors
{
internal const string NataliaPortillo = "Natalia Portillo";
}

View File

@@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Aaru.Filters {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Localization {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Localization() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Aaru.Archives.Localization.Localization", typeof(Localization).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Symbian Installation File.
/// </summary>
internal static string Symbian_Name {
get {
return ResourceManager.GetString("Symbian_Name", resourceCulture);
}
}
}
}

View File

@@ -0,0 +1,21 @@
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="Symbian_Name" xml:space="preserve">
<value>Fichero de Instalación de Symbian</value>
</data>
</root>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
id="root"
xmlns="">
<xsd:element name="root" msdata:IsDataSet="true"></xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="Symbian_Name" xml:space="preserve">
<value>Symbian Installation File</value>
</data>
</root>

View File

@@ -0,0 +1,46 @@
// /***************************************************************************
// Aaru Data Preservation Suite
// ----------------------------------------------------------------------------
//
// Filename : Symbian.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Symbian plugin.
//
// --[ Description ] ----------------------------------------------------------
//
// Identifies Symbian installer (.sis) packages and shows information.
//
// --[ License ] --------------------------------------------------------------
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
// License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright © 2011-2023 Natalia Portillo
// ****************************************************************************/
using System.Diagnostics.CodeAnalysis;
namespace Aaru.Archives;
[SuppressMessage("ReSharper", "UnusedType.Global")]
[SuppressMessage("ReSharper", "UnusedMember.Local")]
public partial class Symbian
{
// Magics
const uint SYMBIAN_MAGIC = 0x10000419;
const uint EPOC_MAGIC = 0x1000006D;
const uint EPOC6_MAGIC = 0x10003A12;
const uint SYMBIAN9_MAGIC = 0x10201A7A;
}

View File

@@ -0,0 +1,197 @@
// /***************************************************************************
// Aaru Data Preservation Suite
// ----------------------------------------------------------------------------
//
// Filename : Symbian.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Symbian plugin.
//
// --[ Description ] ----------------------------------------------------------
//
// Identifies Symbian installer (.sis) packages and shows information.
//
// --[ License ] --------------------------------------------------------------
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
// License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright © 2011-2023 Natalia Portillo
// ****************************************************************************/
using System;
using System.Diagnostics.CodeAnalysis;
namespace Aaru.Archives;
[SuppressMessage("ReSharper", "UnusedMember.Local")]
[SuppressMessage("ReSharper", "UnusedType.Local")]
[SuppressMessage("ReSharper", "UnusedType.Global")]
public partial class Symbian
{
#region Nested type: LanguageCodes
[SuppressMessage("ReSharper", "InconsistentNaming")]
enum LanguageCodes
{
Test,
EN,
FR,
GE,
SP,
IT,
SW,
DA,
NO,
FI,
AM,
SF,
SG,
PO,
TU,
IC,
RU,
HU,
DU,
BL,
AU,
BF,
AS,
NZ,
IF,
CS,
SK,
PL,
SL,
TC,
HK,
ZH,
JA,
TH,
AF,
SQ,
AH,
AR,
HY,
TL,
BE,
BN,
BG,
MY,
CA,
HR,
CE,
IE,
ZA,
ET,
FA,
CF,
GD,
KA,
EL,
CG,
GU,
HE,
HI,
IN,
GA,
SZ,
KN,
KK,
KM,
KO,
LO,
LV,
LT,
MK,
MS,
ML,
MR,
MO,
MN,
NN,
BP,
PA,
RO,
SR,
SI,
SO,
OS,
LS,
SH,
FS,
TA,
TE,
BO,
TI,
CT,
TK,
UK,
UR,
VI,
CY,
ZU
}
#endregion
#region Nested type: SymbianOptions
/// <summary>
/// Options
/// </summary>
[Flags]
enum SymbianOptions : ushort
{
IsUnicode = 0x0001,
IsDistributable = 0x0002,
NoCompress = 0x0008,
ShutdownApps = 0x0010
}
#endregion
#region Nested type: SymbianType
// Types
enum SymbianType : ushort
{
/// <summary>
/// Application
/// </summary>
Application = 0x0000,
/// <summary>
/// System component (library)
/// </summary>
SystemComponent = 0x0001,
/// <summary>
/// Optional component
/// </summary>
OptionalComponent = 0x0002,
/// <summary>
/// Configures an application
/// </summary>
Configurator = 0x0003,
/// <summary>
/// Patch
/// </summary>
Patch = 0x0004,
/// <summary>
/// Upgrade
/// </summary>
Upgrade = 0x0005
}
#endregion
}

View File

@@ -0,0 +1,197 @@
// /***************************************************************************
// Aaru Data Preservation Suite
// ----------------------------------------------------------------------------
//
// Filename : Symbian.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Symbian plugin.
//
// --[ Description ] ----------------------------------------------------------
//
// Identifies Symbian installer (.sis) packages and shows information.
//
// --[ License ] --------------------------------------------------------------
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
// License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright © 2011-2023 Natalia Portillo
// ****************************************************************************/
namespace Aaru.Archives;
public partial class Symbian
{
/*
public override bool Identify(FileStream fileStream, long offset)
{
uint uid1, uid2, uid3;
BinaryReader br = new BinaryReader(fileStream);
br.BaseStream.Seek(0 + offset, SeekOrigin.Begin);
uid1 = br.Readuint();
uid2 = br.Readuint();
uid3 = br.Readuint();
if(uid1 == Symbian9Magic)
return true;
else if(uid3 == SymbianMagic)
{
if(uid2 == EPOCMagic || uid2 == EPOC6Magic)
return true;
else
return false;
}
return false;
}
public override void GetInformation (FileStream fileStream, long offset, out string information)
{
information = "";
StringBuilder description = new StringBuilder();
List<string> languages = new List<string>();
Dictionary<uint, uint> capabilities = new Dictionary<uint, uint>();
int ENpos = 0;
uint comp_len;
uint comp_name_ptr;
byte[] ComponentName_b;
string ComponentName = "";
SymbianHeader sh = new SymbianHeader();
BinaryReader br = new BinaryReader(fileStream);
br.BaseStream.Seek(0 + offset, SeekOrigin.Begin);
sh.uid1 = br.Readuint();
sh.uid2 = br.Readuint();
sh.uid3 = br.Readuint();
sh.uid4 = br.Readuint();
sh.crc16 = br.Readushort();
sh.languages = br.Readushort();
sh.files = br.Readushort();
sh.requisites = br.Readushort();
sh.inst_lang = br.Readushort();
sh.inst_files = br.Readushort();
sh.inst_drive = br.Readushort();
sh.capabilities = br.Readushort();
sh.inst_version = br.Readuint();
sh.options = br.Readushort();
sh.type = br.Readushort();
sh.major = br.Readushort();
sh.minor = br.Readushort();
sh.variant = br.Readuint();
sh.lang_ptr = br.Readuint();
sh.files_ptr = br.Readuint();
sh.reqs_ptr = br.Readuint();
sh.certs_ptr = br.Readuint();
sh.comp_ptr = br.Readuint();
sh.sig_ptr = br.Readuint();
sh.caps_ptr = br.Readuint();
sh.instspace = br.Readuint();
sh.maxinsspc = br.Readuint();
sh.reserved1 = br.Readulong();
sh.reserved2 = br.Readulong();
// Go to enumerate languages
br.BaseStream.Seek(sh.lang_ptr + offset, SeekOrigin.Begin);
for(int i = 0; i < sh.languages; i++)
{
ushort language = br.Readushort();
if(language == 0x0001)
ENpos = i;
languages.Add(((LanguageCodes)language).ToString("G"));
}
// Go to component record
br.BaseStream.Seek(sh.comp_ptr + offset, SeekOrigin.Begin);
for(int i = 0; i < sh.languages; i++)
{
comp_len = br.Readuint();
comp_name_ptr = br.Readuint();
if(i == ENpos)
{
br.BaseStream.Seek(comp_name_ptr + offset, SeekOrigin.Begin);
ComponentName_b = new byte[comp_len];
ComponentName_b = br.ReadBytes((int)comp_len);
ComponentName = Encoding.ASCII.GetString(ComponentName_b);
break;
}
}
// Go to capabilities (???)
br.BaseStream.Seek(sh.caps_ptr + offset, SeekOrigin.Begin);
for(int i = 0; i < sh.capabilities; i++)
{
uint cap_key = br.Readuint();
uint cap_value = br.Readuint();
capabilities.Add(cap_key, cap_value);
}
if(sh.uid1 == Symbian9Magic)
{
description.AppendLine("Symbian Installation File");
description.AppendLine("SymbianOS 9.1 or later");
description.AppendFormat("Application ID: 0x{0:X8}", sh.uid3).AppendLine();
description.AppendFormat("UIDs checksum: 0x{0:X8}", sh.uid4).AppendLine();
}
else if(sh.uid3 == SymbianMagic)
{
description.AppendLine("Symbian Installation File");
if(sh.uid2 == EPOCMagic)
description.AppendLine("SymbianOS 3 or later");
else if (sh.uid2 == EPOC6Magic)
description.AppendLine("SymbianOS 6 or later");
else
description.AppendFormat("Unknown EPOC magic 0x{0:X8}", sh.uid2).AppendLine();
description.AppendFormat("Application ID: 0x{0:X8}", sh.uid1).AppendLine();
description.AppendFormat("UIDs checksum: 0x{0:X8}", sh.uid4).AppendLine();
description.AppendFormat("CRC16 of header: 0x{0:X4}", sh.crc16).AppendLine();
description.AppendLine();
switch(sh.type)
{
case SISApp:
description.AppendLine("SIS contains an application");
break;
}
description.AppendFormat("Component: {0} v{1}.{2}", ComponentName, sh.major, sh.minor).AppendLine();
description.AppendFormat("File contains {0} languages:", sh.languages).AppendLine();
for(int i = 0; i < languages.Count; i++)
{
if(i>0)
description.Append(", ");
description.AppendFormat("{0}", languages[i]);
}
description.AppendLine();
description.AppendFormat("File contains {0} files (pointer: {1})", sh.files, sh.files_ptr).AppendLine();
description.AppendFormat("File contains {0} requisites", sh.requisites).AppendLine();
// description.AppendLine("Capabilities:");
// foreach(KeyValuePair<uint, uint> kvp in capabilities)
// description.AppendFormat("{0} = {1}", kvp.Key, kvp.Value).AppendLine();
}
information = description.ToString();
}
*/
}

View File

@@ -0,0 +1,167 @@
// /***************************************************************************
// Aaru Data Preservation Suite
// ----------------------------------------------------------------------------
//
// Filename : Symbian.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : Symbian plugin.
//
// --[ Description ] ----------------------------------------------------------
//
// Identifies Symbian installer (.sis) packages and shows information.
//
// --[ License ] --------------------------------------------------------------
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
// License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright © 2011-2023 Natalia Portillo
// ****************************************************************************/
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices;
namespace Aaru.Archives;
[SuppressMessage("ReSharper", "UnusedType.Global")]
[SuppressMessage("ReSharper", "UnusedType.Local")]
public partial class Symbian
{
#region Nested type: SymbianHeader
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct SymbianHeader
{
/// <summary>
/// Application UID before SymbianOS 9, magic after
/// </summary>
public uint uid1;
/// <summary>
/// EPOC release magic before SOS 9, NULLs after
/// </summary>
public uint uid2;
/// <summary>
/// Application UID after SOS 9, magic before
/// </summary>
public uint uid3;
/// <summary>
/// Checksum of UIDs 1 to 3
/// </summary>
public uint uid4;
/// <summary>
/// CRC16 of all header
/// </summary>
public ushort crc16;
/// <summary>
/// Number of languages
/// </summary>
public ushort languages;
/// <summary>
/// Number of files
/// </summary>
public ushort files;
/// <summary>
/// Number of requisites
/// </summary>
public ushort requisites;
/// <summary>
/// Installed language (only residual SIS)
/// </summary>
public ushort inst_lang;
/// <summary>
/// Installed files (only residual SIS)
/// </summary>
public ushort inst_files;
/// <summary>
/// Installed drive (only residual SIS), NULL or 0x0021
/// </summary>
public ushort inst_drive;
/// <summary>
/// Number of capabilities
/// </summary>
public ushort capabilities;
/// <summary>
/// Version of Symbian Installer required
/// </summary>
public uint inst_version;
/// <summary>
/// Option flags
/// </summary>
public SymbianOptions options;
/// <summary>
/// Type
/// </summary>
public SymbianType type;
/// <summary>
/// Major version of application
/// </summary>
public ushort major;
/// <summary>
/// Minor version of application
/// </summary>
public ushort minor;
/// <summary>
/// Variant when SIS is a prerequisite for other SISs
/// </summary>
public uint variant;
/// <summary>
/// Pointer to language records
/// </summary>
public uint lang_ptr;
/// <summary>
/// Pointer to file records
/// </summary>
public uint files_ptr;
/// <summary>
/// Pointer to requisite records
/// </summary>
public uint reqs_ptr;
/// <summary>
/// Pointer to certificate records
/// </summary>
public uint certs_ptr;
/// <summary>
/// Pointer to component name record
/// </summary>
public uint comp_ptr;
// From EPOC Release 6
/// <summary>
/// Pointer to signature record
/// </summary>
public uint sig_ptr;
/// <summary>
/// Pointer to capability records
/// </summary>
public uint caps_ptr;
/// <summary>
/// Installed space (only residual SIS)
/// </summary>
public uint instspace;
/// <summary>
/// Space required
/// </summary>
public uint maxinsspc;
/// <summary>
/// Reserved
/// </summary>
public ulong reserved1;
/// <summary>
/// Reserved
/// </summary>
public ulong reserved2;
}
#endregion
}

View File

@@ -30,333 +30,15 @@
// Copyright © 2011-2023 Natalia Portillo // Copyright © 2011-2023 Natalia Portillo
// ****************************************************************************/ // ****************************************************************************/
using System;
namespace Aaru.Archives;
// Information from http://www.thoukydides.webspace.virginmedia.com/software/psifs/sis.html // Information from http://www.thoukydides.webspace.virginmedia.com/software/psifs/sis.html
// TODO: Implement support for disc images public partial class Symbian
/*
namespace Aaru.Plugins
{ {
class SymbianIS : Plugin const string MODULE_NAME = "Symbian Installation File Plugin";
{ public string Name => Filters.Localization.Symbian_Name;
// Magics public Guid Id => new("0EC84EC7-EAE6-4196-83FE-943B3FE48DBD");
private const uint SymbianMagic = 0x10000419; public string Author => Authors.NataliaPortillo;
private const uint EPOCMagic = 0x1000006D;
private const uint EPOC6Magic = 0x10003A12;
private const uint Symbian9Magic = 0x10201A7A;
// Options
private const ushort IsUnicode = 0x0001;
private const ushort IsDistributable = 0x0002;
private const ushort NoCompress = 0x0008;
private const ushort ShutdownApps = 0x0010;
// Types
private const ushort SISApp = 0x0000; // Application
private const ushort SISSystem = 0x0001; // System component (library)
private const ushort SISOption = 0x0002; // Optional component
private const ushort SISConfig = 0x0003; // Configures an application
private const ushort SISPatch = 0x0004; // Patch
private const ushort SISUpgrade = 0x0005; // Upgrade
private enum LanguageCodes
{
Test,
EN,
FR,
GE,
SP,
IT,
SW,
DA,
NO,
FI,
AM,
SF,
SG,
PO,
TU,
IC,
RU,
HU,
DU,
BL,
AU,
BF,
AS,
NZ,
IF,
CS,
SK,
PL,
SL,
TC,
HK,
ZH,
JA,
TH,
AF,
SQ,
AH,
AR,
HY,
TL,
BE,
BN,
BG,
MY,
CA,
HR,
CE,
IE,
ZA,
ET,
FA,
CF,
GD,
KA,
EL,
CG,
GU,
HE,
HI,
IN,
GA,
SZ,
KN,
KK,
KM,
KO,
LO,
LV,
LT,
MK,
MS,
ML,
MR,
MO,
MN,
NN,
BP,
PA,
RO,
SR,
SI,
SO,
OS,
LS,
SH,
FS,
TA,
TE,
BO,
TI,
CT,
TK,
UK,
UR,
VI,
CY,
ZU
};
public SymbianIS()
{
base.Name = "Symbian Installation File Plugin";
base.PluginUUID = new Guid("0ec84ec7-eae6-4196-83fe-943b3fe48dbd");
}
public override bool Identify(FileStream fileStream, long offset)
{
uint uid1, uid2, uid3;
BinaryReader br = new BinaryReader(fileStream);
br.BaseStream.Seek(0 + offset, SeekOrigin.Begin);
uid1 = br.Readuint();
uid2 = br.Readuint();
uid3 = br.Readuint();
if(uid1 == Symbian9Magic)
return true;
else if(uid3 == SymbianMagic)
{
if(uid2 == EPOCMagic || uid2 == EPOC6Magic)
return true;
else
return false;
}
return false;
}
public override void GetInformation (FileStream fileStream, long offset, out string information)
{
information = "";
StringBuilder description = new StringBuilder();
List<string> languages = new List<string>();
Dictionary<uint, uint> capabilities = new Dictionary<uint, uint>();
int ENpos = 0;
uint comp_len;
uint comp_name_ptr;
byte[] ComponentName_b;
string ComponentName = "";
SymbianHeader sh = new SymbianHeader();
BinaryReader br = new BinaryReader(fileStream);
br.BaseStream.Seek(0 + offset, SeekOrigin.Begin);
sh.uid1 = br.Readuint();
sh.uid2 = br.Readuint();
sh.uid3 = br.Readuint();
sh.uid4 = br.Readuint();
sh.crc16 = br.Readushort();
sh.languages = br.Readushort();
sh.files = br.Readushort();
sh.requisites = br.Readushort();
sh.inst_lang = br.Readushort();
sh.inst_files = br.Readushort();
sh.inst_drive = br.Readushort();
sh.capabilities = br.Readushort();
sh.inst_version = br.Readuint();
sh.options = br.Readushort();
sh.type = br.Readushort();
sh.major = br.Readushort();
sh.minor = br.Readushort();
sh.variant = br.Readuint();
sh.lang_ptr = br.Readuint();
sh.files_ptr = br.Readuint();
sh.reqs_ptr = br.Readuint();
sh.certs_ptr = br.Readuint();
sh.comp_ptr = br.Readuint();
sh.sig_ptr = br.Readuint();
sh.caps_ptr = br.Readuint();
sh.instspace = br.Readuint();
sh.maxinsspc = br.Readuint();
sh.reserved1 = br.Readulong();
sh.reserved2 = br.Readulong();
// Go to enumerate languages
br.BaseStream.Seek(sh.lang_ptr + offset, SeekOrigin.Begin);
for(int i = 0; i < sh.languages; i++)
{
ushort language = br.Readushort();
if(language == 0x0001)
ENpos = i;
languages.Add(((LanguageCodes)language).ToString("G"));
}
// Go to component record
br.BaseStream.Seek(sh.comp_ptr + offset, SeekOrigin.Begin);
for(int i = 0; i < sh.languages; i++)
{
comp_len = br.Readuint();
comp_name_ptr = br.Readuint();
if(i == ENpos)
{
br.BaseStream.Seek(comp_name_ptr + offset, SeekOrigin.Begin);
ComponentName_b = new byte[comp_len];
ComponentName_b = br.ReadBytes((int)comp_len);
ComponentName = Encoding.ASCII.GetString(ComponentName_b);
break;
}
}
// Go to capabilities (???)
br.BaseStream.Seek(sh.caps_ptr + offset, SeekOrigin.Begin);
for(int i = 0; i < sh.capabilities; i++)
{
uint cap_key = br.Readuint();
uint cap_value = br.Readuint();
capabilities.Add(cap_key, cap_value);
}
if(sh.uid1 == Symbian9Magic)
{
description.AppendLine("Symbian Installation File");
description.AppendLine("SymbianOS 9.1 or later");
description.AppendFormat("Application ID: 0x{0:X8}", sh.uid3).AppendLine();
description.AppendFormat("UIDs checksum: 0x{0:X8}", sh.uid4).AppendLine();
}
else if(sh.uid3 == SymbianMagic)
{
description.AppendLine("Symbian Installation File");
if(sh.uid2 == EPOCMagic)
description.AppendLine("SymbianOS 3 or later");
else if (sh.uid2 == EPOC6Magic)
description.AppendLine("SymbianOS 6 or later");
else
description.AppendFormat("Unknown EPOC magic 0x{0:X8}", sh.uid2).AppendLine();
description.AppendFormat("Application ID: 0x{0:X8}", sh.uid1).AppendLine();
description.AppendFormat("UIDs checksum: 0x{0:X8}", sh.uid4).AppendLine();
description.AppendFormat("CRC16 of header: 0x{0:X4}", sh.crc16).AppendLine();
description.AppendLine();
switch(sh.type)
{
case SISApp:
description.AppendLine("SIS contains an application");
break;
}
description.AppendFormat("Component: {0} v{1}.{2}", ComponentName, sh.major, sh.minor).AppendLine();
description.AppendFormat("File contains {0} languages:", sh.languages).AppendLine();
for(int i = 0; i < languages.Count; i++)
{
if(i>0)
description.Append(", ");
description.AppendFormat("{0}", languages[i]);
}
description.AppendLine();
description.AppendFormat("File contains {0} files (pointer: {1})", sh.files, sh.files_ptr).AppendLine();
description.AppendFormat("File contains {0} requisites", sh.requisites).AppendLine();
// description.AppendLine("Capabilities:");
// foreach(KeyValuePair<uint, uint> kvp in capabilities)
// description.AppendFormat("{0} = {1}", kvp.Key, kvp.Value).AppendLine();
}
information = description.ToString();
}
private struct SymbianHeader
{
public uint uid1; // Application UID before SymbianOS 9, magic after
public uint uid2; // EPOC release magic before SOS 9, NULLs after
public uint uid3; // Application UID after SOS 9, magic before
public uint uid4; // Checksum of UIDs 1 to 3
public ushort crc16; // CRC16 of all header
public ushort languages; // Number of languages
public ushort files; // Number of files
public ushort requisites; // Number of requisites
public ushort inst_lang; // Installed language (only residual SIS)
public ushort inst_files; // Installed files (only residual SIS)
public ushort inst_drive; // Installed drive (only residual SIS), NULL or 0x0021
public ushort capabilities; // Number of capabilities
public uint inst_version; // Version of Symbian Installer required
public ushort options; // Option flags
public ushort type; // Type
public ushort major; // Major version of application
public ushort minor; // Minor version of application
public uint variant; // Variant when SIS is a prerequisite for other SISs
public uint lang_ptr; // Pointer to language records
public uint files_ptr; // Pointer to file records
public uint reqs_ptr; // Pointer to requisite records
public uint certs_ptr; // Pointer to certificate records
public uint comp_ptr; // Pointer to component name record
// From EPOC Release 6
public uint sig_ptr; // Pointer to signature record
public uint caps_ptr; // Pointer to capability records
public uint instspace; // Installed space (only residual SIS)
public uint maxinsspc; // Space required
public ulong reserved1; // Reserved
public ulong reserved2; // Reserved
}
}
} }
*/