From a7e64c86aece8b1ba07b7e62203f5f8a8fc3cb21 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 17 Sep 2016 16:56:09 +0100 Subject: [PATCH] Adds support for ECMA-67, closes #12. --- .../DiscImageChef.Filesystems.csproj | 1 + DiscImageChef.Filesystems/ECMA67.cs | 193 ++++++++++++++++++ README.md | 1 + TODO | 1 - 4 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 DiscImageChef.Filesystems/ECMA67.cs diff --git a/DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj b/DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj index b0f36155..cd0461a9 100644 --- a/DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj +++ b/DiscImageChef.Filesystems/DiscImageChef.Filesystems.csproj @@ -113,6 +113,7 @@ + diff --git a/DiscImageChef.Filesystems/ECMA67.cs b/DiscImageChef.Filesystems/ECMA67.cs new file mode 100644 index 00000000..2e1bfc1e --- /dev/null +++ b/DiscImageChef.Filesystems/ECMA67.cs @@ -0,0 +1,193 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : ECMA67.cs +// Author(s) : Natalia Portillo +// +// Component : ECMA-67 plugin. +// +// --[ Description ] ---------------------------------------------------------- +// +// Identifies the ECMA-67 file system 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 . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2016 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using DiscImageChef.ImagePlugins; + +namespace DiscImageChef.Filesystems +{ + class ECMA67 : Filesystem + { + public ECMA67() + { + Name = "ECMA-67"; + PluginUUID = new Guid("62A2D44A-CBC1-4377-B4B6-28C5C92034A1"); + } + + public ECMA67(ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) + { + Name = "ECMA-67"; + PluginUUID = new Guid("62A2D44A-CBC1-4377-B4B6-28C5C92034A1"); + } + + readonly byte[] ECMA67_Magic = { 0x56, 0x4F, 0x4C }; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + struct VolumeLabel + { + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] labelIdentifier; + public byte labelNumber; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] + public byte[] volumeIdentifier; + public byte volumeAccessibility; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)] + public byte[] reserved1; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 14)] + public byte[] owner; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] + public byte[] reserved2; + public byte surface; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] + public byte[] reserved3; + public byte recordLength; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] + public byte[] reserved4; + public byte fileLabelAllocation; + public byte labelStandardVersion; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] + public byte[] reserved5; + } + + public override bool Identify(ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd) + { + if(partitionStart > 0) + return false; + + if(partitionEnd < 8) + return false; + + byte[] sector = imagePlugin.ReadSector(6); + + if(sector.Length != 128) + return false; + + VolumeLabel vol = new VolumeLabel(); + IntPtr volPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vol)); + Marshal.Copy(sector, 0, volPtr, Marshal.SizeOf(vol)); + vol = (VolumeLabel)Marshal.PtrToStructure(volPtr, typeof(VolumeLabel)); + Marshal.FreeHGlobal(volPtr); + + return ECMA67_Magic.SequenceEqual(vol.labelIdentifier) && vol.labelNumber == 1 && vol.recordLength == 0x31; + } + + public override void GetInformation(ImagePlugin imagePlugin, ulong partitionStart, ulong partitionEnd, out string information) + { + byte[] sector = imagePlugin.ReadSector(6); + + StringBuilder sbInformation = new StringBuilder(); + + VolumeLabel vol = new VolumeLabel(); + IntPtr volPtr = Marshal.AllocHGlobal(Marshal.SizeOf(vol)); + Marshal.Copy(sector, 0, volPtr, Marshal.SizeOf(vol)); + vol = (VolumeLabel)Marshal.PtrToStructure(volPtr, typeof(VolumeLabel)); + Marshal.FreeHGlobal(volPtr); + + sbInformation.AppendLine("ECMA-67"); + + sbInformation.AppendFormat("Volume name: {0}", Encoding.ASCII.GetString(vol.volumeIdentifier)).AppendLine(); + sbInformation.AppendFormat("Volume owner: {0}", Encoding.ASCII.GetString(vol.owner)).AppendLine(); + + xmlFSType = new Schemas.FileSystemType(); + xmlFSType.Type = "ECMA-67"; + xmlFSType.ClusterSize = 256; + xmlFSType.Clusters = (long)(partitionEnd - partitionStart + 1); + xmlFSType.VolumeName = Encoding.ASCII.GetString(vol.volumeIdentifier); + + information = sbInformation.ToString(); + } + + public override Errno Mount() + { + return Errno.NotImplemented; + } + + public override Errno Mount(bool debug) + { + return Errno.NotImplemented; + } + + 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 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 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; + } + } +} \ No newline at end of file diff --git a/README.md b/README.md index 64f2d292..7804724c 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,7 @@ Supported file systems for identification and information only * Cram file system * Commodore 1540/1541/1571/1581 filesystems * Universal Disk Format (UDF) +* ECMA-67: 130mm Flexible Disk Cartridge Labelling and File Structure for Information Interchange Supported checksums =================== diff --git a/TODO b/TODO index 23ab419f..8dd4fe10 100644 --- a/TODO +++ b/TODO @@ -14,7 +14,6 @@ Filesystem plugins: --- Add support for NwFS --- Add support for X-Box filesystems --- Add support for ReFS ---- Add support for ECMA-67 Partitioning scheme plugins: --- Add support for AIX partitions