2017-07-19 16:31:08 +01:00
// /***************************************************************************
2016-07-28 18:13:49 +01:00
// The Disc Image Chef
// ----------------------------------------------------------------------------
//
// Filename : SolarFS.cs
// Author(s) : Natalia Portillo <claunia@claunia.com>
//
// Component : SolarOS filesystem plugin.
//
// --[ Description ] ----------------------------------------------------------
//
// Identifies the SolarOS filesystem 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/>.
//
// ----------------------------------------------------------------------------
2017-05-19 20:28:49 +01:00
// Copyright © 2011-2017 Natalia Portillo
2016-07-28 18:13:49 +01:00
// ****************************************************************************/
2014-04-17 19:58:14 +00:00
2012-08-06 20:51:28 +00:00
using System ;
2016-07-21 17:16:08 +01:00
using System.Collections.Generic ;
2017-07-19 16:31:08 +01:00
using System.Text ;
using DiscImageChef.CommonTypes ;
2015-10-18 22:04:03 +01:00
using DiscImageChef.Console ;
2016-07-21 16:15:39 +01:00
namespace DiscImageChef.Filesystems
2012-08-06 20:51:28 +00:00
{
2016-07-28 22:25:26 +01:00
// Based on FAT's BPB, cannot find a FAT or directory
2017-07-01 03:26:08 +01:00
public class SolarFS : Filesystem
2014-04-14 02:29:13 +00:00
{
2015-10-05 20:04:05 +01:00
public SolarFS ( )
2012-08-06 20:51:28 +00:00
{
2014-04-14 02:29:13 +00:00
Name = "Solar_OS filesystem" ;
PluginUUID = new Guid ( "EA3101C1-E777-4B4F-B5A3-8C57F50F6E65" ) ;
2017-06-06 21:23:20 +01:00
CurrentEncoding = Encoding . GetEncoding ( "iso-8859-15" ) ;
2012-08-06 20:51:28 +00:00
}
2014-04-14 02:29:13 +00:00
2017-07-19 16:31:08 +01:00
public SolarFS ( ImagePlugins . ImagePlugin imagePlugin , Partition partition , Encoding encoding )
2016-07-27 13:32:45 +01:00
{
Name = "Solar_OS filesystem" ;
PluginUUID = new Guid ( "EA3101C1-E777-4B4F-B5A3-8C57F50F6E65" ) ;
2017-06-06 21:23:20 +01:00
if ( encoding = = null )
CurrentEncoding = Encoding . GetEncoding ( "iso-8859-15" ) ;
2017-07-26 12:25:18 +01:00
else
CurrentEncoding = encoding ;
2016-07-27 13:32:45 +01:00
}
2017-07-19 16:31:08 +01:00
public override bool Identify ( ImagePlugins . ImagePlugin imagePlugin , Partition partition )
2014-04-14 02:29:13 +00:00
{
2017-07-19 16:37:11 +01:00
if ( ( 2 + partition . Start ) > = partition . End )
2014-07-09 19:49:14 +01:00
return false ;
2015-12-06 07:18:36 +00:00
byte signature ; /// <summary>0x29
2014-04-14 02:29:13 +00:00
string fs_type ; // "SOL_FS "
2012-08-06 20:51:28 +00:00
2017-07-19 16:37:11 +01:00
byte [ ] bpb = imagePlugin . ReadSector ( 0 + partition . Start ) ;
2014-04-14 01:14:20 +00:00
byte [ ] fs_type_b = new byte [ 8 ] ;
2012-08-06 20:51:28 +00:00
2014-04-14 02:29:13 +00:00
signature = bpb [ 0x25 ] ;
Array . Copy ( bpb , 0x35 , fs_type_b , 0 , 8 ) ;
fs_type = StringHandlers . CToString ( fs_type_b ) ;
2016-04-19 02:11:47 +01:00
if ( signature = = 0x29 & & fs_type = = "SOL_FS " )
2014-04-14 02:29:13 +00:00
return true ;
return false ;
}
2012-08-06 20:51:28 +00:00
2017-07-19 16:31:08 +01:00
public override void GetInformation ( ImagePlugins . ImagePlugin imagePlugin , Partition partition , out string information )
2014-04-14 02:29:13 +00:00
{
information = "" ;
2016-04-19 02:11:47 +01:00
2014-04-14 02:29:13 +00:00
StringBuilder sb = new StringBuilder ( ) ;
2017-07-19 16:37:11 +01:00
byte [ ] bpb_sector = imagePlugin . ReadSector ( 0 + partition . Start ) ;
2014-04-14 01:14:20 +00:00
byte [ ] bpb_strings ;
2012-08-06 20:51:28 +00:00
2014-04-14 02:29:13 +00:00
SolarOSParameterBlock BPB = new SolarOSParameterBlock ( ) ;
2012-08-06 20:51:28 +00:00
2014-04-14 01:14:20 +00:00
bpb_strings = new byte [ 8 ] ;
Array . Copy ( bpb_sector , 0x03 , bpb_strings , 0 , 8 ) ;
BPB . OEMName = StringHandlers . CToString ( bpb_strings ) ;
BPB . bps = BitConverter . ToUInt16 ( bpb_sector , 0x0B ) ;
BPB . root_ent = BitConverter . ToUInt16 ( bpb_sector , 0x10 ) ;
BPB . sectors = BitConverter . ToUInt16 ( bpb_sector , 0x12 ) ;
BPB . media = bpb_sector [ 0x14 ] ;
BPB . spfat = BitConverter . ToUInt16 ( bpb_sector , 0x15 ) ;
BPB . sptrk = BitConverter . ToUInt16 ( bpb_sector , 0x17 ) ;
BPB . heads = BitConverter . ToUInt16 ( bpb_sector , 0x19 ) ;
BPB . signature = bpb_sector [ 0x25 ] ;
bpb_strings = new byte [ 8 ] ;
Array . Copy ( bpb_sector , 0x2A , bpb_strings , 0 , 11 ) ;
2017-06-06 21:23:20 +01:00
BPB . vol_name = StringHandlers . CToString ( bpb_strings , CurrentEncoding ) ;
2014-04-14 01:14:20 +00:00
bpb_strings = new byte [ 8 ] ;
Array . Copy ( bpb_sector , 0x35 , bpb_strings , 0 , 8 ) ;
2017-06-06 21:23:20 +01:00
BPB . fs_type = StringHandlers . CToString ( bpb_strings , CurrentEncoding ) ;
2012-08-06 20:51:28 +00:00
2015-10-18 22:04:03 +01:00
BPB . x86_jump = new byte [ 3 ] ;
Array . Copy ( bpb_sector , 0x00 , BPB . x86_jump , 0 , 3 ) ;
BPB . unk1 = bpb_sector [ 0x0D ] ;
BPB . unk2 = BitConverter . ToUInt16 ( bpb_sector , 0x0E ) ;
BPB . unk3 = new byte [ 10 ] ;
Array . Copy ( bpb_sector , 0x1B , BPB . unk3 , 0 , 10 ) ;
BPB . unk4 = BitConverter . ToUInt32 ( bpb_sector , 0x26 ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.x86_jump: 0x{0:X2}{1:X2}{2:X2}" , BPB . x86_jump [ 0 ] , BPB . x86_jump [ 1 ] , BPB . x86_jump [ 2 ] ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.OEMName: \"{0}\"" , BPB . OEMName ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.bps: {0}" , BPB . bps ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.unk1: 0x{0:X2}" , BPB . unk1 ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.unk2: 0x{0:X4}" , BPB . unk2 ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.root_ent: {0}" , BPB . root_ent ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.sectors: {0}" , BPB . sectors ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.media: 0x{0:X2}" , BPB . media ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.spfat: {0}" , BPB . spfat ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.sptrk: {0}" , BPB . sptrk ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.heads: {0}" , BPB . heads ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.unk3: 0x{0:X2}{1:X2}{2:X2}{3:X2}{4:X2}{5:X2}{6:X2}{7:X2}{8:X2}{9:X2}" , BPB . unk3 [ 0 ] , BPB . unk3 [ 1 ] , BPB . unk3 [ 2 ] , BPB . unk3 [ 3 ] , BPB . unk3 [ 4 ] , BPB . unk3 [ 5 ] , BPB . unk3 [ 6 ] , BPB . unk3 [ 7 ] , BPB . unk3 [ 8 ] , BPB . unk3 [ 9 ] ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.signature: 0x{0:X2}" , BPB . signature ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.unk4: 0x{0:X8}" , BPB . unk4 ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.vol_name: \"{0}\"" , BPB . vol_name ) ;
DicConsole . DebugWriteLine ( "SolarFS plugin" , "BPB.fs_type: \"{0}\"" , BPB . fs_type ) ;
2012-08-06 20:51:28 +00:00
2014-04-14 02:29:13 +00:00
sb . AppendLine ( "Solar_OS filesystem" ) ;
sb . AppendFormat ( "Media descriptor: 0x{0:X2}" , BPB . media ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} bytes per sector" , BPB . bps ) . AppendLine ( ) ;
2016-04-19 02:11:47 +01:00
if ( imagePlugin . GetSectorSize ( ) = = 2336 | | imagePlugin . GetSectorSize ( ) = = 2352 | | imagePlugin . GetSectorSize ( ) = = 2448 )
2014-04-14 01:14:20 +00:00
{
2016-04-19 02:11:47 +01:00
if ( BPB . bps ! = imagePlugin . GetSectorSize ( ) )
2014-04-14 01:14:20 +00:00
{
sb . AppendFormat ( "WARNING: Filesystem describes a {0} bytes/sector, while device describes a {1} bytes/sector" , BPB . bps , 2048 ) . AppendLine ( ) ;
}
}
2016-04-19 02:11:47 +01:00
else if ( BPB . bps ! = imagePlugin . GetSectorSize ( ) )
2014-04-14 02:29:13 +00:00
{
sb . AppendFormat ( "WARNING: Filesystem describes a {0} bytes/sector, while device describes a {1} bytes/sector" , BPB . bps , imagePlugin . GetSectorSize ( ) ) . AppendLine ( ) ;
}
sb . AppendFormat ( "{0} sectors on volume ({1} bytes)" , BPB . sectors , BPB . sectors * BPB . bps ) . AppendLine ( ) ;
2016-04-19 02:11:47 +01:00
if ( BPB . sectors > imagePlugin . GetSectors ( ) )
2014-04-14 01:14:20 +00:00
sb . AppendFormat ( "WARNING: Filesystem describes a {0} sectors volume, bigger than device ({1} sectors)" , BPB . sectors , imagePlugin . GetSectors ( ) ) ;
2014-04-14 02:29:13 +00:00
sb . AppendFormat ( "{0} heads" , BPB . heads ) . AppendLine ( ) ;
sb . AppendFormat ( "{0} sectors per track" , BPB . sptrk ) . AppendLine ( ) ;
sb . AppendFormat ( "Volume name: {0}" , BPB . vol_name ) . AppendLine ( ) ;
2012-08-06 20:51:28 +00:00
2015-12-05 17:10:27 +00:00
xmlFSType = new Schemas . FileSystemType ( ) ;
xmlFSType . Type = "SolarFS" ;
xmlFSType . Clusters = BPB . sectors ;
xmlFSType . ClusterSize = BPB . bps ;
xmlFSType . VolumeName = BPB . vol_name ;
2014-04-14 02:29:13 +00:00
information = sb . ToString ( ) ;
}
public struct SolarOSParameterBlock
{
2015-12-06 07:18:36 +00:00
/// <summary>0x00, x86 jump (3 bytes), jumps to 0x60</summary>
2014-04-14 02:29:13 +00:00
public byte [ ] x86_jump ;
2015-12-06 07:18:36 +00:00
/// <summary>0x03, 8 bytes, "SOLAR_OS"</summary>
2014-04-14 02:29:13 +00:00
public string OEMName ;
2015-12-06 07:18:36 +00:00
/// <summary>0x0B, Bytes per sector</summary>
2016-07-28 22:25:26 +01:00
public ushort bps ;
2015-12-06 07:18:36 +00:00
/// <summary>0x0D, unknown, 0x01</summary>
2014-04-14 02:29:13 +00:00
public byte unk1 ;
2015-12-06 07:18:36 +00:00
/// <summary>0x0E, unknown, 0x0201</summary>
2016-07-28 22:25:26 +01:00
public ushort unk2 ;
2015-12-06 07:18:36 +00:00
/// <summary>0x10, Number of entries on root directory ? (no root directory found)</summary>
2016-07-28 22:25:26 +01:00
public ushort root_ent ;
2015-12-06 07:18:36 +00:00
/// <summary>0x12, Sectors in volume</summary>
2016-07-28 22:25:26 +01:00
public ushort sectors ;
2015-12-06 07:18:36 +00:00
/// <summary>0x14, Media descriptor</summary>
2014-04-14 02:29:13 +00:00
public byte media ;
2015-12-06 07:18:36 +00:00
/// <summary>0x15, Sectors per FAT ? (no FAT found)</summary>
2016-07-28 22:25:26 +01:00
public ushort spfat ;
2015-12-06 07:18:36 +00:00
/// <summary>0x17, Sectors per track</summary>
2016-07-28 22:25:26 +01:00
public ushort sptrk ;
2015-12-06 07:18:36 +00:00
/// <summary>0x19, Heads</summary>
2016-07-28 22:25:26 +01:00
public ushort heads ;
2015-12-06 07:18:36 +00:00
/// <summary>0x1B, unknown, 10 bytes, zero-filled</summary>
2014-04-14 02:29:13 +00:00
public byte [ ] unk3 ;
2015-12-06 07:18:36 +00:00
/// <summary>0x25, 0x29</summary>
2014-04-14 02:29:13 +00:00
public byte signature ;
2015-12-06 07:18:36 +00:00
/// <summary>0x26, unknown, zero-filled</summary>
2016-07-28 22:25:26 +01:00
public uint unk4 ;
2015-12-06 07:18:36 +00:00
/// <summary>0x2A, 11 bytes, volume name, space-padded</summary>
2014-04-14 02:29:13 +00:00
public string vol_name ;
2015-12-06 07:18:36 +00:00
/// <summary>0x35, 8 bytes, "SOL_FS "</summary>
2014-04-14 02:29:13 +00:00
public string fs_type ;
}
2016-07-21 17:16:08 +01:00
public override Errno Mount ( )
{
return Errno . NotImplemented ;
}
2016-07-22 00:43:22 +01:00
public override Errno Mount ( bool debug )
{
return Errno . NotImplemented ;
}
2016-07-21 17:16:08 +01:00
public override Errno Unmount ( )
{
return Errno . NotImplemented ;
}
public override Errno MapBlock ( string path , long fileBlock , ref long deviceBlock )
{
return Errno . NotImplemented ;
}
public override Errno GetAttributes ( string path , ref FileAttributes attributes )
{
return Errno . NotImplemented ;
}
public override Errno ListXAttr ( string path , ref List < string > xattrs )
{
return Errno . NotImplemented ;
}
public override Errno GetXattr ( string path , string xattr , ref byte [ ] buf )
{
return Errno . NotImplemented ;
}
public override Errno Read ( string path , long offset , long size , ref byte [ ] buf )
{
return Errno . NotImplemented ;
}
public override Errno ReadDir ( string path , ref List < string > contents )
{
return Errno . NotImplemented ;
}
public override Errno StatFs ( ref FileSystemInfo stat )
{
return Errno . NotImplemented ;
}
public override Errno Stat ( string path , ref FileEntryInfo stat )
{
return Errno . NotImplemented ;
}
public override Errno ReadLink ( string path , ref string dest )
{
return Errno . NotImplemented ;
}
2014-04-14 02:29:13 +00:00
}
2014-04-14 01:14:20 +00:00
}