From 99c567d3b369e18defeb1cd206117bc881bdbe8c Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 28 Jul 2016 04:12:49 +0100 Subject: [PATCH] Added support for LisaFS v2. --- DiscImageChef.Filesystems/LisaFS/Dir.cs | 62 +++++++++++++++++++++ DiscImageChef.Filesystems/LisaFS/Extent.cs | 2 +- DiscImageChef.Filesystems/LisaFS/File.cs | 2 +- DiscImageChef.Filesystems/LisaFS/Structs.cs | 18 ++++++ DiscImageChef.Filesystems/LisaFS/Super.cs | 28 +++++----- 5 files changed, 95 insertions(+), 17 deletions(-) diff --git a/DiscImageChef.Filesystems/LisaFS/Dir.cs b/DiscImageChef.Filesystems/LisaFS/Dir.cs index 01e47785..fbebd124 100644 --- a/DiscImageChef.Filesystems/LisaFS/Dir.cs +++ b/DiscImageChef.Filesystems/LisaFS/Dir.cs @@ -93,6 +93,68 @@ namespace DiscImageChef.Filesystems.LisaFS if(catalogCache.TryGetValue(fileId, out catalog)) return Errno.NoError; + Errno error; + + if(mddf.fsversion == LisaFSv2) + { + if(fileId != FILEID_DIRECTORY) + { + ExtentFile ext; + error = ReadExtentsFile(fileId, out ext); + if(error == Errno.NoError) + return Errno.NotDirectory; + } + + byte[] buf; + error = ReadFile(4, out buf); + + int offset = 0; + List catalogV2 = new List(); + + while(offset + 54 < buf.Length) + { + CatalogEntryV2 entV2 = new CatalogEntryV2(); + entV2.filenameLen = buf[offset]; + entV2.filename = new byte[E_NAME]; + Array.Copy(buf, offset + 0x01, entV2.filename, 0, E_NAME); + entV2.unknown1 = buf[offset + 0x21]; + entV2.fileType = buf[offset + 0x22]; + entV2.unknown2 = buf[offset + 0x23]; + entV2.fileID = BigEndianBitConverter.ToInt16(buf, offset + 0x24); + entV2.unknown3 = new byte[16]; + Array.Copy(buf, offset + 0x26, entV2.unknown3, 0, 16); + + offset += 54; + + if(entV2.filenameLen != 0 && entV2.filenameLen <= E_NAME && entV2.fileType != 0 && entV2.fileID > 0) + catalogV2.Add(entV2); + } + + catalog = new List(); + + foreach(CatalogEntryV2 entV2 in catalogV2) + { + ExtentFile ext; + error = ReadExtentsFile(entV2.fileID, out ext); + if(error == Errno.NoError) + { + CatalogEntry entV3 = new CatalogEntry(); + entV3.fileID = entV2.fileID; + entV3.filename = new byte[32]; + Array.Copy(entV2.filename, 0, entV3.filename, 0, entV2.filenameLen); + entV3.fileType = entV2.fileType; + entV3.length = (int)srecords[entV2.fileID].filesize; + entV3.dtc = ext.dtc; + entV3.dtm = ext.dtm; + + catalog.Add(entV3); + } + } + + catalogCache.Add(fileId, catalog); + return Errno.NoError; + } + byte[] firstCatalogBlock = null; for(ulong i = 0; i < device.GetSectors(); i++) diff --git a/DiscImageChef.Filesystems/LisaFS/Extent.cs b/DiscImageChef.Filesystems/LisaFS/Extent.cs index dfda81ed..ec139ee4 100644 --- a/DiscImageChef.Filesystems/LisaFS/Extent.cs +++ b/DiscImageChef.Filesystems/LisaFS/Extent.cs @@ -62,7 +62,7 @@ namespace DiscImageChef.Filesystems.LisaFS if(!mounted) return Errno.AccessDenied; - if(fileId < 5) + if(fileId < 4 || (fileId == 4 && mddf.fsversion != LisaFSv2)) return Errno.InvalidArgument; if(extentCache.TryGetValue(fileId, out file)) diff --git a/DiscImageChef.Filesystems/LisaFS/File.cs b/DiscImageChef.Filesystems/LisaFS/File.cs index d088bac5..f6851d62 100644 --- a/DiscImageChef.Filesystems/LisaFS/File.cs +++ b/DiscImageChef.Filesystems/LisaFS/File.cs @@ -390,7 +390,7 @@ namespace DiscImageChef.Filesystems.LisaFS tags &= debug; - if(fileId <= 4) + if(fileId < 4 || (fileId == 4 && mddf.fsversion != LisaFSv2)) return Errno.InvalidArgument; if(!tags && fileCache.TryGetValue(fileId, out buf)) diff --git a/DiscImageChef.Filesystems/LisaFS/Structs.cs b/DiscImageChef.Filesystems/LisaFS/Structs.cs index dfff55c5..e4ff3b7f 100644 --- a/DiscImageChef.Filesystems/LisaFS/Structs.cs +++ b/DiscImageChef.Filesystems/LisaFS/Structs.cs @@ -369,6 +369,24 @@ namespace DiscImageChef.Filesystems.LisaFS /// 0x0C, some kind of flags, meaning unknown public UInt16 flags; } + + struct CatalogEntryV2 + { + /// 0x00, filename, 32-bytes, null-padded + public byte filenameLen; + /// 0x01, filename, 31-bytes + public byte[] filename; + /// 0x21, unknown + public byte unknown1; + /// 0x22, unknown + public byte fileType; + /// 0x23, unknown + public byte unknown2; + /// 0x24, unknown + public Int16 fileID; + /// 0x26, 16 bytes, unknown + public byte[] unknown3; + } } } diff --git a/DiscImageChef.Filesystems/LisaFS/Super.cs b/DiscImageChef.Filesystems/LisaFS/Super.cs index 2ee760ef..8139ac01 100644 --- a/DiscImageChef.Filesystems/LisaFS/Super.cs +++ b/DiscImageChef.Filesystems/LisaFS/Super.cs @@ -188,22 +188,20 @@ namespace DiscImageChef.Filesystems.LisaFS return Errno.InvalidArgument; } - if(mddf.fsversion != LisaFSv3) + switch(mddf.fsversion) { - string version = mddf.fsversion.ToString(); - - switch(mddf.fsversion) - { - case LisaFSv1: - version = "v1"; - break; - case LisaFSv2: - version = "v2"; - break; - } - - DicConsole.DebugWriteLine("LisaFS plugin", "Cannot mount LisaFS version {0}", version); - return Errno.NotSupported; + case LisaFSv1: + DicConsole.ErrorWriteLine("Cannot mount LisaFS v1"); + return Errno.NotSupported; + case LisaFSv2: + DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v2"); + break; + case LisaFSv3: + DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v2"); + break; + default: + DicConsole.ErrorWriteLine("Cannot mount LisaFS version {0}", mddf.fsversion.ToString()); + return Errno.NotSupported; } extentCache = new Dictionary();