From 6c92af5841b1c81227c2e525db6b541419edda0f Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 28 Jul 2016 05:34:23 +0100 Subject: [PATCH] Added support for LisaFS v1. --- DiscImageChef.Filesystems/LisaFS/Dir.cs | 2 +- DiscImageChef.Filesystems/LisaFS/Extent.cs | 31 ++++++++++++++++----- DiscImageChef.Filesystems/LisaFS/File.cs | 2 +- DiscImageChef.Filesystems/LisaFS/Structs.cs | 6 ++-- DiscImageChef.Filesystems/LisaFS/Super.cs | 6 ++-- 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/DiscImageChef.Filesystems/LisaFS/Dir.cs b/DiscImageChef.Filesystems/LisaFS/Dir.cs index fbebd1248..fddd0635c 100644 --- a/DiscImageChef.Filesystems/LisaFS/Dir.cs +++ b/DiscImageChef.Filesystems/LisaFS/Dir.cs @@ -95,7 +95,7 @@ namespace DiscImageChef.Filesystems.LisaFS Errno error; - if(mddf.fsversion == LisaFSv2) + if(mddf.fsversion == LisaFSv2 || mddf.fsversion == LisaFSv1) { if(fileId != FILEID_DIRECTORY) { diff --git a/DiscImageChef.Filesystems/LisaFS/Extent.cs b/DiscImageChef.Filesystems/LisaFS/Extent.cs index ec139ee49..830507a0f 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 < 4 || (fileId == 4 && mddf.fsversion != LisaFSv2)) + if(fileId < 4 || (fileId == 4 && (mddf.fsversion != LisaFSv2 && mddf.fsversion != LisaFSv1))) return Errno.InvalidArgument; if(extentCache.TryGetValue(fileId, out file)) @@ -105,7 +105,12 @@ namespace DiscImageChef.Filesystems.LisaFS if(extTag.fileID == ((short)(-1 * fileId))) { - byte[] sector = device.ReadSector(ptr); + byte[] sector; + + if(mddf.fsversion == LisaFSv1) + sector = device.ReadSectors(ptr, 2); + else + sector = device.ReadSector(ptr); if(sector[0] >= 32 || sector[0] == 0) return Errno.InvalidArgument; @@ -147,17 +152,29 @@ namespace DiscImageChef.Filesystems.LisaFS file.overhead = BigEndianBitConverter.ToUInt16(sector, 0x6E); file.unknown8 = new byte[16]; Array.Copy(sector, 0x70, file.unknown8, 0, 16); - file.length = BigEndianBitConverter.ToInt32(sector, 0x80); - file.unknown9 = BigEndianBitConverter.ToInt32(sector, 0x84); file.unknown10 = BigEndianBitConverter.ToInt16(sector, 0x17E); file.LisaInfo = new byte[128]; Array.Copy(sector, 0x180, file.LisaInfo, 0, 128); int extentsCount = 0; + int extentsOffset; + if(mddf.fsversion == LisaFSv1) + { + file.length = BigEndianBitConverter.ToInt32(sector, 0x200); + file.unknown9 = BigEndianBitConverter.ToInt32(sector, 0x204); + extentsOffset = 0x208; + } + else + { + file.length = BigEndianBitConverter.ToInt32(sector, 0x80); + file.unknown9 = BigEndianBitConverter.ToInt32(sector, 0x84); + extentsOffset = 0x88; + } + for(int j = 0; j < 41; j++) { - if(BigEndianBitConverter.ToInt16(sector, 0x88 + j * 6 + 4) == 0) + if(BigEndianBitConverter.ToInt16(sector, extentsOffset + j * 6 + 4) == 0) break; extentsCount++; @@ -168,8 +185,8 @@ namespace DiscImageChef.Filesystems.LisaFS for(int j = 0; j < extentsCount; j++) { file.extents[j] = new Extent(); - file.extents[j].start = BigEndianBitConverter.ToInt32(sector, 0x88 + j * 6); - file.extents[j].length = BigEndianBitConverter.ToInt16(sector, 0x88 + j * 6 + 4); + file.extents[j].start = BigEndianBitConverter.ToInt32(sector, extentsOffset + j * 6); + file.extents[j].length = BigEndianBitConverter.ToInt16(sector, extentsOffset + j * 6 + 4); } extentCache.Add(fileId, file); diff --git a/DiscImageChef.Filesystems/LisaFS/File.cs b/DiscImageChef.Filesystems/LisaFS/File.cs index f6851d626..2cdd7ce68 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 || (fileId == 4 && mddf.fsversion != LisaFSv2)) + if(fileId < 4 || (fileId == 4 && (mddf.fsversion != LisaFSv2 && mddf.fsversion != LisaFSv1))) 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 e4ff3b7f5..bdb014c4d 100644 --- a/DiscImageChef.Filesystems/LisaFS/Structs.cs +++ b/DiscImageChef.Filesystems/LisaFS/Structs.cs @@ -346,11 +346,11 @@ namespace DiscImageChef.Filesystems.LisaFS public ushort overhead; /// 0x70, 16 bytes, unknown public byte[] unknown8; - /// 0x80, file length in blocks + /// 0x80, 0x200 in v1, file length in blocks public Int32 length; - /// 0x84, unknown + /// 0x84, 0x204 in v1, unknown public Int32 unknown9; - /// 0x88, extents, can contain up to 41 extents, dunno LisaOS maximum (never seen more than 3) + /// 0x88, 0x208 in v1, extents, can contain up to 41 extents (85 in v1), dunno LisaOS maximum (never seen more than 3) public Extent[] extents; /// 0x17E, unknown, empty, padding? public short unknown10; diff --git a/DiscImageChef.Filesystems/LisaFS/Super.cs b/DiscImageChef.Filesystems/LisaFS/Super.cs index 8139ac010..a62dfa06f 100644 --- a/DiscImageChef.Filesystems/LisaFS/Super.cs +++ b/DiscImageChef.Filesystems/LisaFS/Super.cs @@ -191,13 +191,13 @@ namespace DiscImageChef.Filesystems.LisaFS switch(mddf.fsversion) { case LisaFSv1: - DicConsole.ErrorWriteLine("Cannot mount LisaFS v1"); - return Errno.NotSupported; + DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v1"); + break; case LisaFSv2: DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v2"); break; case LisaFSv3: - DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v2"); + DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v3"); break; default: DicConsole.ErrorWriteLine("Cannot mount LisaFS version {0}", mddf.fsversion.ToString());