diff --git a/DiscImageChef.Filesystems/AODOS.cs b/DiscImageChef.Filesystems/AODOS.cs index 85a9406b5..79c0ba4d0 100644 --- a/DiscImageChef.Filesystems/AODOS.cs +++ b/DiscImageChef.Filesystems/AODOS.cs @@ -48,21 +48,21 @@ namespace DiscImageChef.Filesystems public AODOS() { Name = "Alexander Osipov DOS file system"; - PluginUUID = new Guid("668E5039-9DDD-442A-BE1B-A315D6E38E26"); + PluginUuid = new Guid("668E5039-9DDD-442A-BE1B-A315D6E38E26"); CurrentEncoding = Encoding.GetEncoding("koi8-r"); } public AODOS(Encoding encoding) { Name = "Alexander Osipov DOS file system"; - PluginUUID = new Guid("668E5039-9DDD-442A-BE1B-A315D6E38E26"); + PluginUuid = new Guid("668E5039-9DDD-442A-BE1B-A315D6E38E26"); CurrentEncoding = Encoding.GetEncoding("koi8-r"); } public AODOS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Alexander Osipov DOS file system"; - PluginUUID = new Guid("668E5039-9DDD-442A-BE1B-A315D6E38E26"); + PluginUuid = new Guid("668E5039-9DDD-442A-BE1B-A315D6E38E26"); CurrentEncoding = Encoding.GetEncoding("koi8-r"); } @@ -112,9 +112,7 @@ namespace DiscImageChef.Filesystems // Does AO-DOS support any other kind of disk? if(imagePlugin.ImageInfo.Sectors != 800 && imagePlugin.ImageInfo.Sectors != 1600) return false; - byte[] sector; - - sector = imagePlugin.ReadSector(0); + byte[] sector = imagePlugin.ReadSector(0); AODOS_BootBlock bb = new AODOS_BootBlock(); IntPtr bbPtr = Marshal.AllocHGlobal(Marshal.SizeOf(bb)); Marshal.Copy(sector, 0, bbPtr, Marshal.SizeOf(bb)); @@ -127,9 +125,7 @@ namespace DiscImageChef.Filesystems public override void GetInformation(ImagePlugin imagePlugin, Partition partition, out string information) { - byte[] sector; - - sector = imagePlugin.ReadSector(0); + byte[] sector = imagePlugin.ReadSector(0); AODOS_BootBlock bb = new AODOS_BootBlock(); IntPtr bbPtr = Marshal.AllocHGlobal(Marshal.SizeOf(bb)); Marshal.Copy(sector, 0, bbPtr, Marshal.SizeOf(bb)); @@ -140,7 +136,7 @@ namespace DiscImageChef.Filesystems sbInformation.AppendLine("Alexander Osipov DOS file system"); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "Alexander Osipov DOS file system", Clusters = (long)imagePlugin.ImageInfo.Sectors, diff --git a/DiscImageChef.Filesystems/APFS.cs b/DiscImageChef.Filesystems/APFS.cs index e5299cc1b..b9c6b5921 100644 --- a/DiscImageChef.Filesystems/APFS.cs +++ b/DiscImageChef.Filesystems/APFS.cs @@ -42,27 +42,27 @@ namespace DiscImageChef.Filesystems { public class APFS : Filesystem { - const uint ApfsContainerMagic = 0x4253584E; // "NXSB" - const uint ApfsVolumeMagic = 0x42535041; // "APSB" + const uint APFS_CONTAINER_MAGIC = 0x4253584E; // "NXSB" + const uint APFS_VOLUME_MAGIC = 0x42535041; // "APSB" public APFS() { Name = "Apple File System"; - PluginUUID = new Guid("A4060F9D-2909-42E2-9D95-DB31FA7EA797"); + PluginUuid = new Guid("A4060F9D-2909-42E2-9D95-DB31FA7EA797"); CurrentEncoding = Encoding.UTF8; } public APFS(Encoding encoding) { Name = "Apple File System"; - PluginUUID = new Guid("A4060F9D-2909-42E2-9D95-DB31FA7EA797"); + PluginUuid = new Guid("A4060F9D-2909-42E2-9D95-DB31FA7EA797"); CurrentEncoding = Encoding.UTF8; } public APFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Apple File System"; - PluginUUID = new Guid("A4060F9D-2909-42E2-9D95-DB31FA7EA797"); + PluginUuid = new Guid("A4060F9D-2909-42E2-9D95-DB31FA7EA797"); CurrentEncoding = Encoding.UTF8; } @@ -94,16 +94,14 @@ namespace DiscImageChef.Filesystems } catch { return false; } - if(nxSb.magic == ApfsContainerMagic) return true; - - return false; + return nxSb.magic == APFS_CONTAINER_MAGIC; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, out string information) { StringBuilder sbInformation = new StringBuilder(); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); information = ""; if(partition.Start >= partition.End) return; @@ -120,7 +118,7 @@ namespace DiscImageChef.Filesystems } catch { return; } - if(nxSb.magic != ApfsContainerMagic) return; + if(nxSb.magic != APFS_CONTAINER_MAGIC) return; sbInformation.AppendLine("Apple File System"); sbInformation.AppendLine(); @@ -130,11 +128,13 @@ namespace DiscImageChef.Filesystems information = sbInformation.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.Bootable = false; - xmlFSType.Clusters = (long)nxSb.containerBlocks; - xmlFSType.ClusterSize = (int)nxSb.blockSize; - xmlFSType.Type = "Apple File System"; + XmlFsType = new FileSystemType + { + Bootable = false, + Clusters = (long)nxSb.containerBlocks, + ClusterSize = (int)nxSb.blockSize, + Type = "Apple File System" + }; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/Acorn.cs b/DiscImageChef.Filesystems/Acorn.cs index 7050ce6de..413ec7869 100644 --- a/DiscImageChef.Filesystems/Acorn.cs +++ b/DiscImageChef.Filesystems/Acorn.cs @@ -46,49 +46,47 @@ namespace DiscImageChef.Filesystems /// /// Location for boot block, in bytes /// - const ulong bootBlockLocation = 0xC00; + const ulong BOOT_BLOCK_LOCATION = 0xC00; /// /// Size of boot block, in bytes /// - const uint bootBlockSize = 0x200; + const uint BOOT_BLOCK_SIZE = 0x200; /// /// Location of new directory, in bytes /// - const ulong newDirectoryLocation = 0x400; + const ulong NEW_DIRECTORY_LOCATION = 0x400; /// /// Location of old directory, in bytes /// - const ulong oldDirectoryLocation = 0x200; + const ulong OLD_DIRECTORY_LOCATION = 0x200; /// /// Size of old directory /// - const uint oldDirectorySize = 1280; + const uint OLD_DIRECTORY_SIZE = 1280; /// /// Size of new directory /// - const uint newDirectorySize = 2048; + const uint NEW_DIRECTORY_SIZE = 2048; public AcornADFS() { Name = "Acorn Advanced Disc Filing System"; - PluginUUID = new Guid("BAFC1E50-9C64-4CD3-8400-80628CC27AFA"); + PluginUuid = new Guid("BAFC1E50-9C64-4CD3-8400-80628CC27AFA"); CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); } public AcornADFS(Encoding encoding) { Name = "Acorn Advanced Disc Filing System"; - PluginUUID = new Guid("BAFC1E50-9C64-4CD3-8400-80628CC27AFA"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("BAFC1E50-9C64-4CD3-8400-80628CC27AFA"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } public AcornADFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Acorn Advanced Disc Filing System"; - PluginUUID = new Guid("BAFC1E50-9C64-4CD3-8400-80628CC27AFA"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("BAFC1E50-9C64-4CD3-8400-80628CC27AFA"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } /// @@ -186,11 +184,11 @@ namespace DiscImageChef.Filesystems /// /// New directory format magic number, "Nick" /// - const uint newDirMagic = 0x6B63694E; + const uint NEW_DIR_MAGIC = 0x6B63694E; /// /// Old directory format magic number, "Hugo" /// - const uint oldDirMagic = 0x6F677548; + const uint OLD_DIR_MAGIC = 0x6F677548; /// /// Directory header, common to "old" and "new" directories @@ -276,22 +274,15 @@ namespace DiscImageChef.Filesystems // ADFS-S, ADFS-M, ADFS-L, ADFS-D without partitions if(partition.Start == 0) { - OldMapSector0 oldMap0; - OldMapSector1 oldMap1; - OldDirectory oldRoot; - byte oldChk0; - byte oldChk1; - byte dirChk; - sector = imagePlugin.ReadSector(0); - oldChk0 = AcornMapChecksum(sector, 255); + byte oldChk0 = AcornMapChecksum(sector, 255); ptr = GCHandle.Alloc(sector, GCHandleType.Pinned); - oldMap0 = (OldMapSector0)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldMapSector0)); + OldMapSector0 oldMap0 = (OldMapSector0)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldMapSector0)); sector = imagePlugin.ReadSector(1); - oldChk1 = AcornMapChecksum(sector, 255); + byte oldChk1 = AcornMapChecksum(sector, 255); ptr = GCHandle.Alloc(sector, GCHandleType.Pinned); - oldMap1 = (OldMapSector1)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldMapSector1)); + OldMapSector1 oldMap1 = (OldMapSector1)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldMapSector1)); DicConsole.DebugWriteLine("ADFS Plugin", "oldMap0.checksum = {0}", oldMap0.checksum); DicConsole.DebugWriteLine("ADFS Plugin", "oldChk0 = {0}", oldChk0); @@ -313,21 +304,21 @@ namespace DiscImageChef.Filesystems if(oldMap0.checksum == oldChk0 && oldMap1.checksum == oldChk1 && oldMap0.checksum != 0 && oldMap1.checksum != 0) { - sbSector = oldDirectoryLocation / imagePlugin.ImageInfo.SectorSize; - sectorsToRead = oldDirectorySize / imagePlugin.ImageInfo.SectorSize; - if(oldDirectorySize % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; + sbSector = OLD_DIRECTORY_LOCATION / imagePlugin.ImageInfo.SectorSize; + sectorsToRead = OLD_DIRECTORY_SIZE / imagePlugin.ImageInfo.SectorSize; + if(OLD_DIRECTORY_SIZE % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; sector = imagePlugin.ReadSectors(sbSector, sectorsToRead); - if(sector.Length > oldDirectorySize) + if(sector.Length > OLD_DIRECTORY_SIZE) { - byte[] tmp = new byte[oldDirectorySize]; - Array.Copy(sector, 0, tmp, 0, oldDirectorySize - 53); - Array.Copy(sector, sector.Length - 54, tmp, oldDirectorySize - 54, 53); + byte[] tmp = new byte[OLD_DIRECTORY_SIZE]; + Array.Copy(sector, 0, tmp, 0, OLD_DIRECTORY_SIZE - 53); + Array.Copy(sector, sector.Length - 54, tmp, OLD_DIRECTORY_SIZE - 54, 53); sector = tmp; } ptr = GCHandle.Alloc(sector, GCHandleType.Pinned); - oldRoot = (OldDirectory)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldDirectory)); - dirChk = AcornDirectoryChecksum(sector, (int)oldDirectorySize - 1); + OldDirectory oldRoot = (OldDirectory)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldDirectory)); + byte dirChk = AcornDirectoryChecksum(sector, (int)OLD_DIRECTORY_SIZE - 1); DicConsole.DebugWriteLine("ADFS Plugin", "oldRoot.header.magic at 0x200 = {0}", oldRoot.header.magic); @@ -336,25 +327,25 @@ namespace DiscImageChef.Filesystems oldRoot.tail.checkByte); DicConsole.DebugWriteLine("ADFS Plugin", "dirChk at 0x200 = {0}", dirChk); - if(oldRoot.header.magic == oldDirMagic && oldRoot.tail.magic == oldDirMagic || - oldRoot.header.magic == newDirMagic && oldRoot.tail.magic == newDirMagic) return true; + if(oldRoot.header.magic == OLD_DIR_MAGIC && oldRoot.tail.magic == OLD_DIR_MAGIC || + oldRoot.header.magic == NEW_DIR_MAGIC && oldRoot.tail.magic == NEW_DIR_MAGIC) return true; // RISC OS says the old directory can't be in the new location, hard disks created by RISC OS 3.10 do that... - sbSector = newDirectoryLocation / imagePlugin.ImageInfo.SectorSize; - sectorsToRead = newDirectorySize / imagePlugin.ImageInfo.SectorSize; - if(newDirectorySize % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; + sbSector = NEW_DIRECTORY_LOCATION / imagePlugin.ImageInfo.SectorSize; + sectorsToRead = NEW_DIRECTORY_SIZE / imagePlugin.ImageInfo.SectorSize; + if(NEW_DIRECTORY_SIZE % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; sector = imagePlugin.ReadSectors(sbSector, sectorsToRead); - if(sector.Length > oldDirectorySize) + if(sector.Length > OLD_DIRECTORY_SIZE) { - byte[] tmp = new byte[oldDirectorySize]; - Array.Copy(sector, 0, tmp, 0, oldDirectorySize - 53); - Array.Copy(sector, sector.Length - 54, tmp, oldDirectorySize - 54, 53); + byte[] tmp = new byte[OLD_DIRECTORY_SIZE]; + Array.Copy(sector, 0, tmp, 0, OLD_DIRECTORY_SIZE - 53); + Array.Copy(sector, sector.Length - 54, tmp, OLD_DIRECTORY_SIZE - 54, 53); sector = tmp; } ptr = GCHandle.Alloc(sector, GCHandleType.Pinned); oldRoot = (OldDirectory)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldDirectory)); - dirChk = AcornDirectoryChecksum(sector, (int)oldDirectorySize - 1); + dirChk = AcornDirectoryChecksum(sector, (int)OLD_DIRECTORY_SIZE - 1); DicConsole.DebugWriteLine("ADFS Plugin", "oldRoot.header.magic at 0x400 = {0}", oldRoot.header.magic); @@ -363,8 +354,8 @@ namespace DiscImageChef.Filesystems oldRoot.tail.checkByte); DicConsole.DebugWriteLine("ADFS Plugin", "dirChk at 0x400 = {0}", dirChk); - if(oldRoot.header.magic == oldDirMagic && oldRoot.tail.magic == oldDirMagic || - oldRoot.header.magic == newDirMagic && oldRoot.tail.magic == newDirMagic) return true; + if(oldRoot.header.magic == OLD_DIR_MAGIC && oldRoot.tail.magic == OLD_DIR_MAGIC || + oldRoot.header.magic == NEW_DIR_MAGIC && oldRoot.tail.magic == NEW_DIR_MAGIC) return true; } } @@ -376,9 +367,9 @@ namespace DiscImageChef.Filesystems DicConsole.DebugWriteLine("ADFS Plugin", "newChk = {0}", newChk); DicConsole.DebugWriteLine("ADFS Plugin", "map.zoneChecksum = {0}", sector[0]); - sbSector = bootBlockLocation / imagePlugin.ImageInfo.SectorSize; - sectorsToRead = bootBlockSize / imagePlugin.ImageInfo.SectorSize; - if(bootBlockSize % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; + sbSector = BOOT_BLOCK_LOCATION / imagePlugin.ImageInfo.SectorSize; + sectorsToRead = BOOT_BLOCK_SIZE / imagePlugin.ImageInfo.SectorSize; + if(BOOT_BLOCK_SIZE % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; if(sbSector + partition.Start + sectorsToRead >= partition.End) return false; @@ -424,9 +415,7 @@ namespace DiscImageChef.Filesystems bytes *= 0x100000000; bytes += drSb.disc_size; - if(bytes > imagePlugin.GetSectors() * imagePlugin.GetSectorSize()) return false; - - return true; + return bytes <= imagePlugin.GetSectors() * imagePlugin.GetSectorSize(); } // TODO: Find root directory on volumes with DiscRecord @@ -436,7 +425,7 @@ namespace DiscImageChef.Filesystems out string information) { StringBuilder sbInformation = new StringBuilder(); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); information = ""; ulong sbSector; @@ -444,27 +433,19 @@ namespace DiscImageChef.Filesystems uint sectorsToRead; GCHandle ptr; ulong bytes; - string discname; // ADFS-S, ADFS-M, ADFS-L, ADFS-D without partitions if(partition.Start == 0) { - OldMapSector0 oldMap0; - OldMapSector1 oldMap1; - OldDirectory oldRoot; - NewDirectory newRoot; - byte oldChk0; - byte oldChk1; - sector = imagePlugin.ReadSector(0); - oldChk0 = AcornMapChecksum(sector, 255); + byte oldChk0 = AcornMapChecksum(sector, 255); ptr = GCHandle.Alloc(sector, GCHandleType.Pinned); - oldMap0 = (OldMapSector0)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldMapSector0)); + OldMapSector0 oldMap0 = (OldMapSector0)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldMapSector0)); sector = imagePlugin.ReadSector(1); - oldChk1 = AcornMapChecksum(sector, 255); + byte oldChk1 = AcornMapChecksum(sector, 255); ptr = GCHandle.Alloc(sector, GCHandleType.Pinned); - oldMap1 = (OldMapSector1)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldMapSector1)); + OldMapSector1 oldMap1 = (OldMapSector1)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldMapSector1)); // According to documentation map1 MUST start on sector 1. On ADFS-D it starts at 0x100, not on sector 1 (0x400) if(oldMap0.checksum == oldChk0 && oldMap1.checksum != oldChk1 && sector.Length >= 512) @@ -488,7 +469,7 @@ namespace DiscImageChef.Filesystems namebytes[i * 2 + 1] = oldMap1.name[i]; } - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Bootable = oldMap1.boot != 0, // Or not? Clusters = (long)(bytes / imagePlugin.ImageInfo.SectorSize), @@ -498,56 +479,56 @@ namespace DiscImageChef.Filesystems if(ArrayHelpers.ArrayIsNullOrEmpty(namebytes)) { - sbSector = oldDirectoryLocation / imagePlugin.ImageInfo.SectorSize; - sectorsToRead = oldDirectorySize / imagePlugin.ImageInfo.SectorSize; - if(oldDirectorySize % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; + sbSector = OLD_DIRECTORY_LOCATION / imagePlugin.ImageInfo.SectorSize; + sectorsToRead = OLD_DIRECTORY_SIZE / imagePlugin.ImageInfo.SectorSize; + if(OLD_DIRECTORY_SIZE % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; sector = imagePlugin.ReadSectors(sbSector, sectorsToRead); - if(sector.Length > oldDirectorySize) + if(sector.Length > OLD_DIRECTORY_SIZE) { - byte[] tmp = new byte[oldDirectorySize]; - Array.Copy(sector, 0, tmp, 0, oldDirectorySize - 53); - Array.Copy(sector, sector.Length - 54, tmp, oldDirectorySize - 54, 53); + byte[] tmp = new byte[OLD_DIRECTORY_SIZE]; + Array.Copy(sector, 0, tmp, 0, OLD_DIRECTORY_SIZE - 53); + Array.Copy(sector, sector.Length - 54, tmp, OLD_DIRECTORY_SIZE - 54, 53); sector = tmp; } ptr = GCHandle.Alloc(sector, GCHandleType.Pinned); - oldRoot = (OldDirectory)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldDirectory)); + OldDirectory oldRoot = (OldDirectory)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldDirectory)); - if(oldRoot.header.magic == oldDirMagic && oldRoot.tail.magic == oldDirMagic) namebytes = oldRoot.tail.name; + if(oldRoot.header.magic == OLD_DIR_MAGIC && oldRoot.tail.magic == OLD_DIR_MAGIC) namebytes = oldRoot.tail.name; else { // RISC OS says the old directory can't be in the new location, hard disks created by RISC OS 3.10 do that... - sbSector = newDirectoryLocation / imagePlugin.ImageInfo.SectorSize; - sectorsToRead = newDirectorySize / imagePlugin.ImageInfo.SectorSize; - if(newDirectorySize % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; + sbSector = NEW_DIRECTORY_LOCATION / imagePlugin.ImageInfo.SectorSize; + sectorsToRead = NEW_DIRECTORY_SIZE / imagePlugin.ImageInfo.SectorSize; + if(NEW_DIRECTORY_SIZE % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; sector = imagePlugin.ReadSectors(sbSector, sectorsToRead); - if(sector.Length > oldDirectorySize) + if(sector.Length > OLD_DIRECTORY_SIZE) { - byte[] tmp = new byte[oldDirectorySize]; - Array.Copy(sector, 0, tmp, 0, oldDirectorySize - 53); - Array.Copy(sector, sector.Length - 54, tmp, oldDirectorySize - 54, 53); + byte[] tmp = new byte[OLD_DIRECTORY_SIZE]; + Array.Copy(sector, 0, tmp, 0, OLD_DIRECTORY_SIZE - 53); + Array.Copy(sector, sector.Length - 54, tmp, OLD_DIRECTORY_SIZE - 54, 53); sector = tmp; } ptr = GCHandle.Alloc(sector, GCHandleType.Pinned); oldRoot = (OldDirectory)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), typeof(OldDirectory)); - if(oldRoot.header.magic == oldDirMagic && oldRoot.tail.magic == oldDirMagic) namebytes = oldRoot.tail.name; + if(oldRoot.header.magic == OLD_DIR_MAGIC && oldRoot.tail.magic == OLD_DIR_MAGIC) namebytes = oldRoot.tail.name; else { sector = imagePlugin.ReadSectors(sbSector, sectorsToRead); - if(sector.Length > newDirectorySize) + if(sector.Length > NEW_DIRECTORY_SIZE) { - byte[] tmp = new byte[newDirectorySize]; - Array.Copy(sector, 0, tmp, 0, newDirectorySize - 41); - Array.Copy(sector, sector.Length - 42, tmp, newDirectorySize - 42, 41); + byte[] tmp = new byte[NEW_DIRECTORY_SIZE]; + Array.Copy(sector, 0, tmp, 0, NEW_DIRECTORY_SIZE - 41); + Array.Copy(sector, sector.Length - 42, tmp, NEW_DIRECTORY_SIZE - 42, 41); sector = tmp; } ptr = GCHandle.Alloc(sector, GCHandleType.Pinned); - newRoot = (NewDirectory)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), - typeof(NewDirectory)); - if(newRoot.header.magic == newDirMagic && newRoot.tail.magic == newDirMagic) namebytes = newRoot.tail.title; + NewDirectory newRoot = (NewDirectory)Marshal.PtrToStructure(ptr.AddrOfPinnedObject(), + typeof(NewDirectory)); + if(newRoot.header.magic == NEW_DIR_MAGIC && newRoot.tail.magic == NEW_DIR_MAGIC) namebytes = newRoot.tail.title; } } } @@ -560,11 +541,11 @@ namespace DiscImageChef.Filesystems .AppendLine(); if(oldMap1.discId > 0) { - xmlFSType.VolumeSerial = $"{oldMap1.discId:X4}"; + XmlFsType.VolumeSerial = $"{oldMap1.discId:X4}"; sbInformation.AppendFormat("Volume ID: {0:X4}", oldMap1.discId).AppendLine(); } if(!ArrayHelpers.ArrayIsNullOrEmpty(namebytes)) - xmlFSType.VolumeName = StringHandlers.CToString(namebytes, CurrentEncoding); + XmlFsType.VolumeName = StringHandlers.CToString(namebytes, CurrentEncoding); information = sbInformation.ToString(); @@ -580,9 +561,9 @@ namespace DiscImageChef.Filesystems DicConsole.DebugWriteLine("ADFS Plugin", "newChk = {0}", newChk); DicConsole.DebugWriteLine("ADFS Plugin", "map.zoneChecksum = {0}", sector[0]); - sbSector = bootBlockLocation / imagePlugin.ImageInfo.SectorSize; - sectorsToRead = bootBlockSize / imagePlugin.ImageInfo.SectorSize; - if(bootBlockSize % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; + sbSector = BOOT_BLOCK_LOCATION / imagePlugin.ImageInfo.SectorSize; + sectorsToRead = BOOT_BLOCK_SIZE / imagePlugin.ImageInfo.SectorSize; + if(BOOT_BLOCK_SIZE % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; byte[] bootSector = imagePlugin.ReadSectors(sbSector + partition.Start, sectorsToRead); int bootChk = 0; @@ -648,7 +629,7 @@ namespace DiscImageChef.Filesystems if(bytes > imagePlugin.GetSectors() * imagePlugin.GetSectorSize()) return; - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); sbInformation.AppendLine("Acorn Advanced Disc Filing System"); sbInformation.AppendLine(); @@ -666,22 +647,22 @@ namespace DiscImageChef.Filesystems sbInformation.AppendFormat("Volume flags: 0x{0:X4}", drSb.flags).AppendLine(); if(drSb.disc_id > 0) { - xmlFSType.VolumeSerial = $"{drSb.disc_id:X4}"; + XmlFsType.VolumeSerial = $"{drSb.disc_id:X4}"; sbInformation.AppendFormat("Volume ID: {0:X4}", drSb.disc_id).AppendLine(); } if(!ArrayHelpers.ArrayIsNullOrEmpty(drSb.disc_name)) { - discname = StringHandlers.CToString(drSb.disc_name, CurrentEncoding); - xmlFSType.VolumeName = discname; + string discname = StringHandlers.CToString(drSb.disc_name, CurrentEncoding); + XmlFsType.VolumeName = discname; sbInformation.AppendFormat("Volume name: {0}", discname).AppendLine(); } information = sbInformation.ToString(); - xmlFSType.Bootable |= drSb.bootoption != 0; // Or not? - xmlFSType.Clusters = (long)(bytes / (ulong)(1 << drSb.log2secsize)); - xmlFSType.ClusterSize = 1 << drSb.log2secsize; - xmlFSType.Type = "Acorn Advanced Disc Filing System"; + XmlFsType.Bootable |= drSb.bootoption != 0; // Or not? + XmlFsType.Clusters = (long)(bytes / (ulong)(1 << drSb.log2secsize)); + XmlFsType.ClusterSize = 1 << drSb.log2secsize; + XmlFsType.Type = "Acorn Advanced Disc Filing System"; } public override Errno Mount() @@ -768,48 +749,43 @@ namespace DiscImageChef.Filesystems return (byte)(sum & 0xFF); } - byte NewMapChecksum(byte[] map_base) + static byte NewMapChecksum(byte[] mapBase) { - uint sum_vector0; - uint sum_vector1; - uint sum_vector2; - uint sum_vector3; uint rover; + uint sumVector0 = 0; + uint sumVector1 = 0; + uint sumVector2 = 0; + uint sumVector3 = 0; - sum_vector0 = 0; - sum_vector1 = 0; - sum_vector2 = 0; - sum_vector3 = 0; - - for(rover = (uint)(map_base.Length - 4); rover > 0; rover -= 4) + for(rover = (uint)(mapBase.Length - 4); rover > 0; rover -= 4) { - sum_vector0 += map_base[rover + 0] + (sum_vector3 >> 8); - sum_vector3 &= 0xff; - sum_vector1 += map_base[rover + 1] + (sum_vector0 >> 8); - sum_vector0 &= 0xff; - sum_vector2 += map_base[rover + 2] + (sum_vector1 >> 8); - sum_vector1 &= 0xff; - sum_vector3 += map_base[rover + 3] + (sum_vector2 >> 8); - sum_vector2 &= 0xff; + sumVector0 += mapBase[rover + 0] + (sumVector3 >> 8); + sumVector3 &= 0xff; + sumVector1 += mapBase[rover + 1] + (sumVector0 >> 8); + sumVector0 &= 0xff; + sumVector2 += mapBase[rover + 2] + (sumVector1 >> 8); + sumVector1 &= 0xff; + sumVector3 += mapBase[rover + 3] + (sumVector2 >> 8); + sumVector2 &= 0xff; } /* Don't add the check byte when calculating its value */ - sum_vector0 += sum_vector3 >> 8; - sum_vector1 += map_base[rover + 1] + (sum_vector0 >> 8); - sum_vector2 += map_base[rover + 2] + (sum_vector1 >> 8); - sum_vector3 += map_base[rover + 3] + (sum_vector2 >> 8); + sumVector0 += sumVector3 >> 8; + sumVector1 += mapBase[rover + 1] + (sumVector0 >> 8); + sumVector2 += mapBase[rover + 2] + (sumVector1 >> 8); + sumVector3 += mapBase[rover + 3] + (sumVector2 >> 8); - return (byte)((sum_vector0 ^ sum_vector1 ^ sum_vector2 ^ sum_vector3) & 0xff); + return (byte)((sumVector0 ^ sumVector1 ^ sumVector2 ^ sumVector3) & 0xff); } // TODO: This is not correct... - byte AcornDirectoryChecksum(byte[] data, int length) + static byte AcornDirectoryChecksum(IList data, int length) { uint sum = 0; - if(length > data.Length) length = data.Length; + if(length > data.Count) length = data.Count; // EOR r0, r1, r0, ROR #13 for(int i = 0; i < length; i++) diff --git a/DiscImageChef.Filesystems/AmigaDOS.cs b/DiscImageChef.Filesystems/AmigaDOS.cs index 1c95ca0e5..4bf630285 100644 --- a/DiscImageChef.Filesystems/AmigaDOS.cs +++ b/DiscImageChef.Filesystems/AmigaDOS.cs @@ -48,24 +48,22 @@ namespace DiscImageChef.Filesystems public AmigaDOSPlugin() { Name = "Amiga DOS filesystem"; - PluginUUID = new Guid("3c882400-208c-427d-a086-9119852a1bc7"); + PluginUuid = new Guid("3c882400-208c-427d-a086-9119852a1bc7"); CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); } public AmigaDOSPlugin(Encoding encoding) { Name = "Amiga DOS filesystem"; - PluginUUID = new Guid("3c882400-208c-427d-a086-9119852a1bc7"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("3c882400-208c-427d-a086-9119852a1bc7"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } public AmigaDOSPlugin(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Amiga DOS filesystem"; - PluginUUID = new Guid("3c882400-208c-427d-a086-9119852a1bc7"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("3c882400-208c-427d-a086-9119852a1bc7"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } /// @@ -206,11 +204,11 @@ namespace DiscImageChef.Filesystems public uint sec_type; } - public const uint FFS_Mask = 0x444F5300; - public const uint MuFS_Mask = 0x6D754600; + const uint FFS_MASK = 0x444F5300; + const uint MUFS_MASK = 0x6D754600; - public const uint TypeHeader = 2; - public const uint SubTypeRoot = 1; + const uint TYPE_HEADER = 2; + const uint SUBTYPE_ROOT = 1; public override bool Identify(ImagePlugin imagePlugin, Partition partition) { @@ -229,14 +227,14 @@ namespace DiscImageChef.Filesystems // AROS boot floppies... if(sector.Length >= 512 && sector[510] == 0x55 && sector[511] == 0xAA && - (bblk.diskType & FFS_Mask) != FFS_Mask && (bblk.diskType & MuFS_Mask) != MuFS_Mask) + (bblk.diskType & FFS_MASK) != FFS_MASK && (bblk.diskType & MUFS_MASK) != MUFS_MASK) { sector = imagePlugin.ReadSectors(1 + partition.Start, 2); bblk = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); } // Not FFS or MuFS? - if((bblk.diskType & FFS_Mask) != FFS_Mask && (bblk.diskType & MuFS_Mask) != MuFS_Mask) return false; + if((bblk.diskType & FFS_MASK) != FFS_MASK && (bblk.diskType & MUFS_MASK) != MUFS_MASK) return false; // Clear checksum on sector sector[4] = sector[5] = sector[6] = sector[7] = 0; @@ -245,18 +243,18 @@ namespace DiscImageChef.Filesystems DicConsole.DebugWriteLine("AmigaDOS plugin", "bblk.checksum = 0x{0:X8}", bblk.checksum); DicConsole.DebugWriteLine("AmigaDOS plugin", "bsum = 0x{0:X8}", bsum); - ulong b_root_ptr = 0; + ulong bRootPtr = 0; // If bootblock is correct, let's take its rootblock pointer if(bsum == bblk.checksum) { - b_root_ptr = bblk.root_ptr + partition.Start; - DicConsole.DebugWriteLine("AmigaDOS plugin", "Bootblock points to {0} as Rootblock", b_root_ptr); + bRootPtr = bblk.root_ptr + partition.Start; + DicConsole.DebugWriteLine("AmigaDOS plugin", "Bootblock points to {0} as Rootblock", bRootPtr); } - ulong[] root_ptrs = + ulong[] rootPtrs = { - b_root_ptr + partition.Start, (partition.End - partition.Start + 1) / 2 + partition.Start - 2, + bRootPtr + partition.Start, (partition.End - partition.Start + 1) / 2 + partition.Start - 2, (partition.End - partition.Start + 1) / 2 + partition.Start - 1, (partition.End - partition.Start + 1) / 2 + partition.Start, (partition.End - partition.Start + 1) / 2 + partition.Start + 4 @@ -265,14 +263,14 @@ namespace DiscImageChef.Filesystems RootBlock rblk = new RootBlock(); // So to handle even number of sectors - foreach(ulong root_ptr in root_ptrs.Where(root_ptr => root_ptr < partition.End && root_ptr >= partition.Start)) { - DicConsole.DebugWriteLine("AmigaDOS plugin", "Searching for Rootblock in sector {0}", root_ptr); + foreach(ulong rootPtr in rootPtrs.Where(rootPtr => rootPtr < partition.End && rootPtr >= partition.Start)) { + DicConsole.DebugWriteLine("AmigaDOS plugin", "Searching for Rootblock in sector {0}", rootPtr); - sector = imagePlugin.ReadSector(root_ptr); + sector = imagePlugin.ReadSector(rootPtr); rblk.type = BigEndianBitConverter.ToUInt32(sector, 0x00); DicConsole.DebugWriteLine("AmigaDOS plugin", "rblk.type = {0}", rblk.type); - if(rblk.type != TypeHeader) continue; + if(rblk.type != TYPE_HEADER) continue; rblk.hashTableSize = BigEndianBitConverter.ToUInt32(sector, 0x0C); @@ -286,9 +284,9 @@ namespace DiscImageChef.Filesystems if(blockSize % sector.Length > 0) sectorsPerBlock++; - if(root_ptr + sectorsPerBlock >= partition.End) continue; + if(rootPtr + sectorsPerBlock >= partition.End) continue; - sector = imagePlugin.ReadSectors(root_ptr, sectorsPerBlock); + sector = imagePlugin.ReadSectors(rootPtr, sectorsPerBlock); // Clear checksum on sector rblk.checksum = BigEndianBitConverter.ToUInt32(sector, 20); @@ -301,7 +299,7 @@ namespace DiscImageChef.Filesystems rblk.sec_type = BigEndianBitConverter.ToUInt32(sector, sector.Length - 4); DicConsole.DebugWriteLine("AmigaDOS plugin", "rblk.sec_type = {0}", rblk.sec_type); - if(rblk.sec_type == SubTypeRoot && rblk.checksum == rsum) return true; + if(rblk.sec_type == SUBTYPE_ROOT && rblk.checksum == rsum) return true; } return false; @@ -311,88 +309,88 @@ namespace DiscImageChef.Filesystems out string information) { StringBuilder sbInformation = new StringBuilder(); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); information = null; BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; - byte[] BootBlockSectors = imagePlugin.ReadSectors(0 + partition.Start, 2); + byte[] bootBlockSectors = imagePlugin.ReadSectors(0 + partition.Start, 2); - BootBlock bootBlk = BigEndianMarshal.ByteArrayToStructureBigEndian(BootBlockSectors); - bootBlk.bootCode = new byte[BootBlockSectors.Length - 12]; - Array.Copy(BootBlockSectors, 12, bootBlk.bootCode, 0, bootBlk.bootCode.Length); - BootBlockSectors[4] = BootBlockSectors[5] = BootBlockSectors[6] = BootBlockSectors[7] = 0; - uint bsum = AmigaBootChecksum(BootBlockSectors); + BootBlock bootBlk = BigEndianMarshal.ByteArrayToStructureBigEndian(bootBlockSectors); + bootBlk.bootCode = new byte[bootBlockSectors.Length - 12]; + Array.Copy(bootBlockSectors, 12, bootBlk.bootCode, 0, bootBlk.bootCode.Length); + bootBlockSectors[4] = bootBlockSectors[5] = bootBlockSectors[6] = bootBlockSectors[7] = 0; + uint bsum = AmigaBootChecksum(bootBlockSectors); - ulong b_root_ptr = 0; + ulong bRootPtr = 0; // If bootblock is correct, let's take its rootblock pointer if(bsum == bootBlk.checksum) { - b_root_ptr = bootBlk.root_ptr + partition.Start; - DicConsole.DebugWriteLine("AmigaDOS plugin", "Bootblock points to {0} as Rootblock", b_root_ptr); + bRootPtr = bootBlk.root_ptr + partition.Start; + DicConsole.DebugWriteLine("AmigaDOS plugin", "Bootblock points to {0} as Rootblock", bRootPtr); } - ulong[] root_ptrs = + ulong[] rootPtrs = { - b_root_ptr + partition.Start, (partition.End - partition.Start + 1) / 2 + partition.Start - 2, + bRootPtr + partition.Start, (partition.End - partition.Start + 1) / 2 + partition.Start - 2, (partition.End - partition.Start + 1) / 2 + partition.Start - 1, (partition.End - partition.Start + 1) / 2 + partition.Start, (partition.End - partition.Start + 1) / 2 + partition.Start + 4 }; RootBlock rootBlk = new RootBlock(); - byte[] RootBlockSector = null; + byte[] rootBlockSector = null; - bool root_found = false; + bool rootFound = false; uint blockSize = 0; // So to handle even number of sectors - foreach(ulong root_ptr in root_ptrs.Where(root_ptr => root_ptr < partition.End && root_ptr >= partition.Start)) { - DicConsole.DebugWriteLine("AmigaDOS plugin", "Searching for Rootblock in sector {0}", root_ptr); + foreach(ulong rootPtr in rootPtrs.Where(rootPtr => rootPtr < partition.End && rootPtr >= partition.Start)) { + DicConsole.DebugWriteLine("AmigaDOS plugin", "Searching for Rootblock in sector {0}", rootPtr); - RootBlockSector = imagePlugin.ReadSector(root_ptr); + rootBlockSector = imagePlugin.ReadSector(rootPtr); - rootBlk.type = BigEndianBitConverter.ToUInt32(RootBlockSector, 0x00); + rootBlk.type = BigEndianBitConverter.ToUInt32(rootBlockSector, 0x00); DicConsole.DebugWriteLine("AmigaDOS plugin", "rootBlk.type = {0}", rootBlk.type); - if(rootBlk.type != TypeHeader) continue; + if(rootBlk.type != TYPE_HEADER) continue; - rootBlk.hashTableSize = BigEndianBitConverter.ToUInt32(RootBlockSector, 0x0C); + rootBlk.hashTableSize = BigEndianBitConverter.ToUInt32(rootBlockSector, 0x0C); DicConsole.DebugWriteLine("AmigaDOS plugin", "rootBlk.hashTableSize = {0}", rootBlk.hashTableSize); blockSize = (rootBlk.hashTableSize + 56) * 4; - uint sectorsPerBlock = (uint)(blockSize / RootBlockSector.Length); + uint sectorsPerBlock = (uint)(blockSize / rootBlockSector.Length); DicConsole.DebugWriteLine("AmigaDOS plugin", "blockSize = {0}", blockSize); DicConsole.DebugWriteLine("AmigaDOS plugin", "sectorsPerBlock = {0}", sectorsPerBlock); - if(blockSize % RootBlockSector.Length > 0) sectorsPerBlock++; + if(blockSize % rootBlockSector.Length > 0) sectorsPerBlock++; - if(root_ptr + sectorsPerBlock >= partition.End) continue; + if(rootPtr + sectorsPerBlock >= partition.End) continue; - RootBlockSector = imagePlugin.ReadSectors(root_ptr, sectorsPerBlock); + rootBlockSector = imagePlugin.ReadSectors(rootPtr, sectorsPerBlock); // Clear checksum on sector - rootBlk.checksum = BigEndianBitConverter.ToUInt32(RootBlockSector, 20); - RootBlockSector[20] = RootBlockSector[21] = RootBlockSector[22] = RootBlockSector[23] = 0; - uint rsum = AmigaChecksum(RootBlockSector); + rootBlk.checksum = BigEndianBitConverter.ToUInt32(rootBlockSector, 20); + rootBlockSector[20] = rootBlockSector[21] = rootBlockSector[22] = rootBlockSector[23] = 0; + uint rsum = AmigaChecksum(rootBlockSector); DicConsole.DebugWriteLine("AmigaDOS plugin", "rootBlk.checksum = 0x{0:X8}", rootBlk.checksum); DicConsole.DebugWriteLine("AmigaDOS plugin", "rsum = 0x{0:X8}", rsum); - rootBlk.sec_type = BigEndianBitConverter.ToUInt32(RootBlockSector, RootBlockSector.Length - 4); + rootBlk.sec_type = BigEndianBitConverter.ToUInt32(rootBlockSector, rootBlockSector.Length - 4); DicConsole.DebugWriteLine("AmigaDOS plugin", "rootBlk.sec_type = {0}", rootBlk.sec_type); - if(rootBlk.sec_type != SubTypeRoot || rootBlk.checksum != rsum) continue; + if(rootBlk.sec_type != SUBTYPE_ROOT || rootBlk.checksum != rsum) continue; - RootBlockSector = imagePlugin.ReadSectors(root_ptr, sectorsPerBlock); - root_found = true; + rootBlockSector = imagePlugin.ReadSectors(rootPtr, sectorsPerBlock); + rootFound = true; break; } - if(!root_found) return; + if(!rootFound) return; - rootBlk = MarshalRootBlock(RootBlockSector); + rootBlk = MarshalRootBlock(rootBlockSector); string diskName = StringHandlers.PascalToString(rootBlk.diskName, CurrentEncoding); @@ -400,35 +398,35 @@ namespace DiscImageChef.Filesystems { case 0: sbInformation.Append("Amiga Original File System"); - xmlFSType.Type = "Amiga OFS"; + XmlFsType.Type = "Amiga OFS"; break; case 1: sbInformation.Append("Amiga Fast File System"); - xmlFSType.Type = "Amiga FFS"; + XmlFsType.Type = "Amiga FFS"; break; case 2: sbInformation.Append("Amiga Original File System with international characters"); - xmlFSType.Type = "Amiga OFS"; + XmlFsType.Type = "Amiga OFS"; break; case 3: sbInformation.Append("Amiga Fast File System with international characters"); - xmlFSType.Type = "Amiga FFS"; + XmlFsType.Type = "Amiga FFS"; break; case 4: sbInformation.Append("Amiga Original File System with directory cache"); - xmlFSType.Type = "Amiga OFS"; + XmlFsType.Type = "Amiga OFS"; break; case 5: sbInformation.Append("Amiga Fast File System with directory cache"); - xmlFSType.Type = "Amiga FFS"; + XmlFsType.Type = "Amiga FFS"; break; case 6: sbInformation.Append("Amiga Original File System with long filenames"); - xmlFSType.Type = "Amiga OFS2"; + XmlFsType.Type = "Amiga OFS2"; break; case 7: sbInformation.Append("Amiga Fast File System with long filenames"); - xmlFSType.Type = "Amiga FFS2"; + XmlFsType.Type = "Amiga FFS2"; break; } @@ -472,17 +470,17 @@ namespace DiscImageChef.Filesystems sbInformation.AppendFormat("Root block checksum is 0x{0:X8}", rootBlk.checksum).AppendLine(); information = sbInformation.ToString(); - xmlFSType.CreationDate = DateHandlers.AmigaToDateTime(rootBlk.cDays, rootBlk.cMins, rootBlk.cTicks); - xmlFSType.CreationDateSpecified = true; - xmlFSType.ModificationDate = DateHandlers.AmigaToDateTime(rootBlk.vDays, rootBlk.vMins, rootBlk.vTicks); - xmlFSType.ModificationDateSpecified = true; - xmlFSType.Dirty = rootBlk.bitmapFlag != 0xFFFFFFFF; - xmlFSType.Clusters = blocks; - xmlFSType.ClusterSize = (int)blockSize; - xmlFSType.VolumeName = diskName; - xmlFSType.Bootable = bsum == bootBlk.checksum; + XmlFsType.CreationDate = DateHandlers.AmigaToDateTime(rootBlk.cDays, rootBlk.cMins, rootBlk.cTicks); + XmlFsType.CreationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.AmigaToDateTime(rootBlk.vDays, rootBlk.vMins, rootBlk.vTicks); + XmlFsType.ModificationDateSpecified = true; + XmlFsType.Dirty = rootBlk.bitmapFlag != 0xFFFFFFFF; + XmlFsType.Clusters = blocks; + XmlFsType.ClusterSize = (int)blockSize; + XmlFsType.VolumeName = diskName; + XmlFsType.Bootable = bsum == bootBlk.checksum; // Useful as a serial - xmlFSType.VolumeSerial = $"{rootBlk.checksum:X8}"; + XmlFsType.VolumeSerial = $"{rootBlk.checksum:X8}"; } static RootBlock MarshalRootBlock(byte[] block) @@ -511,12 +509,12 @@ namespace DiscImageChef.Filesystems static uint AmigaBootChecksum(byte[] data) { - uint sum, psum; + uint sum; sum = 0; for(int i = 0; i < data.Length; i += 4) { - psum = sum; + uint psum = sum; if((sum += (uint)((data[i] << 24) + (data[i + 1] << 16) + (data[i + 2] << 8) + data[i + 3])) < psum) sum++; } diff --git a/DiscImageChef.Filesystems/AppleDOS/AppleDOS.cs b/DiscImageChef.Filesystems/AppleDOS/AppleDOS.cs index c544df403..6362bc02b 100644 --- a/DiscImageChef.Filesystems/AppleDOS/AppleDOS.cs +++ b/DiscImageChef.Filesystems/AppleDOS/AppleDOS.cs @@ -77,14 +77,14 @@ namespace DiscImageChef.Filesystems.AppleDOS public AppleDOS() { Name = "Apple DOS File System"; - PluginUUID = new Guid("8658A1E9-B2E7-4BCC-9638-157A31B0A700\n"); + PluginUuid = new Guid("8658A1E9-B2E7-4BCC-9638-157A31B0A700\n"); CurrentEncoding = new LisaRoman(); } public AppleDOS(Encoding encoding) { Name = "Apple DOS File System"; - PluginUUID = new Guid("8658A1E9-B2E7-4BCC-9638-157A31B0A700\n"); + PluginUuid = new Guid("8658A1E9-B2E7-4BCC-9638-157A31B0A700\n"); // TODO: Until Apple ][ encoding is implemented CurrentEncoding = new LisaRoman(); } @@ -94,7 +94,7 @@ namespace DiscImageChef.Filesystems.AppleDOS device = imagePlugin; start = partition.Start; Name = "Apple DOS File System"; - PluginUUID = new Guid("8658A1E9-B2E7-4BCC-9638-157A31B0A700\n"); + PluginUuid = new Guid("8658A1E9-B2E7-4BCC-9638-157A31B0A700\n"); // TODO: Until Apple ][ encoding is implemented CurrentEncoding = new LisaRoman(); } diff --git a/DiscImageChef.Filesystems/AppleDOS/Info.cs b/DiscImageChef.Filesystems/AppleDOS/Info.cs index 8e483b3d0..6a3707771 100644 --- a/DiscImageChef.Filesystems/AppleDOS/Info.cs +++ b/DiscImageChef.Filesystems/AppleDOS/Info.cs @@ -91,7 +91,7 @@ namespace DiscImageChef.Filesystems.AppleDOS information = sb.ToString(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Bootable = true, Clusters = (long)imagePlugin.ImageInfo.Sectors, diff --git a/DiscImageChef.Filesystems/AppleDOS/Super.cs b/DiscImageChef.Filesystems/AppleDOS/Super.cs index 2faae5f25..be3ca5f72 100644 --- a/DiscImageChef.Filesystems/AppleDOS/Super.cs +++ b/DiscImageChef.Filesystems/AppleDOS/Super.cs @@ -99,7 +99,7 @@ namespace DiscImageChef.Filesystems.AppleDOS } // Create XML metadata for mounted filesystem - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Bootable = true, Clusters = (long)device.ImageInfo.Sectors, @@ -109,7 +109,7 @@ namespace DiscImageChef.Filesystems.AppleDOS FreeClustersSpecified = true, Type = "Apple DOS" }; - xmlFSType.FreeClusters = xmlFSType.Clusters - usedSectors; + XmlFsType.FreeClusters = XmlFsType.Clusters - usedSectors; this.debug = debug; mounted = true; @@ -141,7 +141,7 @@ namespace DiscImageChef.Filesystems.AppleDOS Blocks = (long)device.ImageInfo.Sectors, FilenameLength = 30, Files = (ulong)catalogCache.Count, - PluginId = PluginUUID, + PluginId = PluginUuid, Type = "Apple DOS" }; stat.FreeFiles = totalFileEntries - stat.Files; diff --git a/DiscImageChef.Filesystems/AppleHFS.cs b/DiscImageChef.Filesystems/AppleHFS.cs index 9284063a0..c8249e583 100644 --- a/DiscImageChef.Filesystems/AppleHFS.cs +++ b/DiscImageChef.Filesystems/AppleHFS.cs @@ -60,58 +60,56 @@ namespace DiscImageChef.Filesystems public AppleHFS() { Name = "Apple Hierarchical File System"; - PluginUUID = new Guid("36405F8D-0D26-6ECC-0BBB-1D5225FF404F"); + PluginUuid = new Guid("36405F8D-0D26-6ECC-0BBB-1D5225FF404F"); CurrentEncoding = Encoding.GetEncoding("macintosh"); } public AppleHFS(Encoding encoding) { Name = "Apple Hierarchical File System"; - PluginUUID = new Guid("36405F8D-0D26-6ECC-0BBB-1D5225FF404F"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("macintosh"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("36405F8D-0D26-6ECC-0BBB-1D5225FF404F"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("macintosh"); } public AppleHFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Apple Hierarchical File System"; - PluginUUID = new Guid("36405F8D-0D26-6ECC-0BBB-1D5225FF404F"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("macintosh"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("36405F8D-0D26-6ECC-0BBB-1D5225FF404F"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("macintosh"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { if(2 + partition.Start >= partition.End) return false; - byte[] mdb_sector; + byte[] mdbSector; ushort drSigWord; if(imagePlugin.GetSectorSize() == 2352 || imagePlugin.GetSectorSize() == 2448 || imagePlugin.GetSectorSize() == 2048) { - mdb_sector = imagePlugin.ReadSectors(partition.Start, 2); + mdbSector = imagePlugin.ReadSectors(partition.Start, 2); foreach(int offset in new[] {0, 0x200, 0x400, 0x600, 0x800, 0xA00}) { - drSigWord = BigEndianBitConverter.ToUInt16(mdb_sector, offset); + drSigWord = BigEndianBitConverter.ToUInt16(mdbSector, offset); if(drSigWord != HFS_MAGIC) continue; drSigWord = BigEndianBitConverter - .ToUInt16(mdb_sector, offset + 0x7C); // Seek to embedded HFS+ signature + .ToUInt16(mdbSector, offset + 0x7C); // Seek to embedded HFS+ signature return drSigWord != HFSP_MAGIC; } } else { - mdb_sector = imagePlugin.ReadSector(2 + partition.Start); - drSigWord = BigEndianBitConverter.ToUInt16(mdb_sector, 0); + mdbSector = imagePlugin.ReadSector(2 + partition.Start); + drSigWord = BigEndianBitConverter.ToUInt16(mdbSector, 0); if(drSigWord != HFS_MAGIC) return false; - drSigWord = BigEndianBitConverter.ToUInt16(mdb_sector, 0x7C); // Seek to embedded HFS+ signature + drSigWord = BigEndianBitConverter.ToUInt16(mdbSector, 0x7C); // Seek to embedded HFS+ signature return drSigWord != HFSP_MAGIC; } @@ -126,11 +124,8 @@ namespace DiscImageChef.Filesystems StringBuilder sb = new StringBuilder(); - HFS_MasterDirectoryBlock MDB; - HFS_BootBlock BB; - - byte[] bb_sector = null; - byte[] mdb_sector = null; + byte[] bbSector = null; + byte[] mdbSector = null; ushort drSigWord; bool APMFromHDDOnCD = false; @@ -138,17 +133,17 @@ namespace DiscImageChef.Filesystems if(imagePlugin.GetSectorSize() == 2352 || imagePlugin.GetSectorSize() == 2448 || imagePlugin.GetSectorSize() == 2048) { - byte[] tmp_sector = imagePlugin.ReadSectors(partition.Start, 2); + byte[] tmpSector = imagePlugin.ReadSectors(partition.Start, 2); foreach(int offset in new[] {0, 0x200, 0x400, 0x600, 0x800, 0xA00}) { - drSigWord = BigEndianBitConverter.ToUInt16(tmp_sector, offset); + drSigWord = BigEndianBitConverter.ToUInt16(tmpSector, offset); if(drSigWord != HFS_MAGIC) continue; - bb_sector = new byte[1024]; - mdb_sector = new byte[512]; - if(offset >= 0x400) Array.Copy(tmp_sector, offset - 0x400, bb_sector, 0, 1024); - Array.Copy(tmp_sector, offset, mdb_sector, 0, 512); + bbSector = new byte[1024]; + mdbSector = new byte[512]; + if(offset >= 0x400) Array.Copy(tmpSector, offset - 0x400, bbSector, 0, 1024); + Array.Copy(tmpSector, offset, mdbSector, 0, 512); APMFromHDDOnCD = true; break; } @@ -157,15 +152,15 @@ namespace DiscImageChef.Filesystems } else { - mdb_sector = imagePlugin.ReadSector(2 + partition.Start); - drSigWord = BigEndianBitConverter.ToUInt16(mdb_sector, 0); + mdbSector = imagePlugin.ReadSector(2 + partition.Start); + drSigWord = BigEndianBitConverter.ToUInt16(mdbSector, 0); - if(drSigWord == HFS_MAGIC) bb_sector = imagePlugin.ReadSector(partition.Start); + if(drSigWord == HFS_MAGIC) bbSector = imagePlugin.ReadSector(partition.Start); else return; } - MDB = BigEndianMarshal.ByteArrayToStructureBigEndian(mdb_sector); - BB = BigEndianMarshal.ByteArrayToStructureBigEndian(bb_sector); + HFS_MasterDirectoryBlock MDB = BigEndianMarshal.ByteArrayToStructureBigEndian(mdbSector); + HFS_BootBlock BB = BigEndianMarshal.ByteArrayToStructureBigEndian(bbSector); sb.AppendLine("Apple Hierarchical File System"); sb.AppendLine(); @@ -182,8 +177,7 @@ namespace DiscImageChef.Filesystems else sb.AppendLine("Volume has never been backed up"); if((MDB.drAtrb & 0x80) == 0x80) sb.AppendLine("Volume is locked by hardware."); - if((MDB.drAtrb & 0x100) == 0x100) sb.AppendLine("Volume was unmonted."); - else sb.AppendLine("Volume is mounted."); + sb.AppendLine((MDB.drAtrb & 0x100) == 0x100 ? "Volume was unmonted." : "Volume is mounted."); if((MDB.drAtrb & 0x200) == 0x200) sb.AppendLine("Volume has spared bad blocks."); if((MDB.drAtrb & 0x400) == 0x400) sb.AppendLine("Volume does not need cache."); if((MDB.drAtrb & 0x800) == 0x800) sb.AppendLine("Boot volume is inconsistent."); @@ -275,45 +269,45 @@ namespace DiscImageChef.Filesystems information = sb.ToString(); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); if(MDB.drVolBkUp > 0) { - xmlFSType.BackupDate = DateHandlers.MacToDateTime(MDB.drVolBkUp); - xmlFSType.BackupDateSpecified = true; + XmlFsType.BackupDate = DateHandlers.MacToDateTime(MDB.drVolBkUp); + XmlFsType.BackupDateSpecified = true; } - xmlFSType.Bootable = BB.signature == HFSBB_MAGIC || MDB.drFndrInfo0 != 0 || MDB.drFndrInfo3 != 0 || MDB.drFndrInfo5 != 0; - xmlFSType.Clusters = MDB.drNmAlBlks; - xmlFSType.ClusterSize = (int)MDB.drAlBlkSiz; + XmlFsType.Bootable = BB.signature == HFSBB_MAGIC || MDB.drFndrInfo0 != 0 || MDB.drFndrInfo3 != 0 || MDB.drFndrInfo5 != 0; + XmlFsType.Clusters = MDB.drNmAlBlks; + XmlFsType.ClusterSize = (int)MDB.drAlBlkSiz; if(MDB.drCrDate > 0) { - xmlFSType.CreationDate = DateHandlers.MacToDateTime(MDB.drCrDate); - xmlFSType.CreationDateSpecified = true; + XmlFsType.CreationDate = DateHandlers.MacToDateTime(MDB.drCrDate); + XmlFsType.CreationDateSpecified = true; } - xmlFSType.Dirty = (MDB.drAtrb & 0x100) != 0x100; - xmlFSType.Files = MDB.drFilCnt; - xmlFSType.FilesSpecified = true; - xmlFSType.FreeClusters = MDB.drFreeBks; - xmlFSType.FreeClustersSpecified = true; + XmlFsType.Dirty = (MDB.drAtrb & 0x100) != 0x100; + XmlFsType.Files = MDB.drFilCnt; + XmlFsType.FilesSpecified = true; + XmlFsType.FreeClusters = MDB.drFreeBks; + XmlFsType.FreeClustersSpecified = true; if(MDB.drLsMod > 0) { - xmlFSType.ModificationDate = DateHandlers.MacToDateTime(MDB.drLsMod); - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.MacToDateTime(MDB.drLsMod); + XmlFsType.ModificationDateSpecified = true; } - xmlFSType.Type = "HFS"; - xmlFSType.VolumeName = StringHandlers.PascalToString(MDB.drVN, CurrentEncoding); + XmlFsType.Type = "HFS"; + XmlFsType.VolumeName = StringHandlers.PascalToString(MDB.drVN, CurrentEncoding); if(MDB.drFndrInfo6 != 0 && MDB.drFndrInfo7 != 0) - xmlFSType.VolumeSerial = $"{MDB.drFndrInfo6:X8}{MDB.drFndrInfo7:X8}"; + XmlFsType.VolumeSerial = $"{MDB.drFndrInfo6:X8}{MDB.drFndrInfo7:X8}"; } - static byte[] Read2048SectorAs512(ImagePlugin imagePlugin, ulong LBA) + static byte[] Read2048SectorAs512(ImagePlugin imagePlugin, ulong lba) { - ulong LBA2k = LBA / 4; - int Remainder = (int)(LBA % 4); + ulong lba2K = lba / 4; + int remainder = (int)(lba % 4); - byte[] buffer = imagePlugin.ReadSector(LBA2k); + byte[] buffer = imagePlugin.ReadSector(lba2K); byte[] sector = new byte[512]; - Array.Copy(buffer, Remainder * 512, sector, 0, 512); + Array.Copy(buffer, remainder * 512, sector, 0, 512); return sector; } diff --git a/DiscImageChef.Filesystems/AppleHFSPlus.cs b/DiscImageChef.Filesystems/AppleHFSPlus.cs index 5a2bc71aa..61aaf83c6 100644 --- a/DiscImageChef.Filesystems/AppleHFSPlus.cs +++ b/DiscImageChef.Filesystems/AppleHFSPlus.cs @@ -59,21 +59,21 @@ namespace DiscImageChef.Filesystems public AppleHFSPlus() { Name = "Apple HFS+ filesystem"; - PluginUUID = new Guid("36405F8D-0D26-6EBE-436F-62F0586B4F08"); + PluginUuid = new Guid("36405F8D-0D26-6EBE-436F-62F0586B4F08"); CurrentEncoding = Encoding.BigEndianUnicode; } public AppleHFSPlus(Encoding encoding) { Name = "Apple HFS+ filesystem"; - PluginUUID = new Guid("36405F8D-0D26-6EBE-436F-62F0586B4F08"); + PluginUuid = new Guid("36405F8D-0D26-6EBE-436F-62F0586B4F08"); CurrentEncoding = Encoding.BigEndianUnicode; } public AppleHFSPlus(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Apple HFS+ filesystem"; - PluginUUID = new Guid("36405F8D-0D26-6EBE-436F-62F0586B4F08"); + PluginUuid = new Guid("36405F8D-0D26-6EBE-436F-62F0586B4F08"); CurrentEncoding = Encoding.BigEndianUnicode; } @@ -82,47 +82,41 @@ namespace DiscImageChef.Filesystems if(2 + partition.Start >= partition.End) return false; ushort drSigWord; - ushort xdrStABNt; - ushort drAlBlSt; - uint drAlBlkSiz; - byte[] vh_sector; - ulong hfsp_offset; + ulong hfspOffset; uint sectorsToRead = 0x800 / imagePlugin.ImageInfo.SectorSize; if(0x800 % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; - vh_sector = imagePlugin.ReadSectors(partition.Start, - sectorsToRead); // Read volume header, of HFS Wrapper MDB + byte[] vhSector = imagePlugin.ReadSectors(partition.Start, + sectorsToRead); - drSigWord = BigEndianBitConverter.ToUInt16(vh_sector, 0x400); // Check for HFS Wrapper MDB + drSigWord = BigEndianBitConverter.ToUInt16(vhSector, 0x400); // Check for HFS Wrapper MDB if(drSigWord == HFS_MAGIC) // "BD" { - drSigWord = BigEndianBitConverter.ToUInt16(vh_sector, 0x47C); // Read embedded HFS+ signature + drSigWord = BigEndianBitConverter.ToUInt16(vhSector, 0x47C); // Read embedded HFS+ signature if(drSigWord == HFSP_MAGIC) // "H+" { - xdrStABNt = BigEndianBitConverter - .ToUInt16(vh_sector, 0x47E); // Starting block number of embedded HFS+ volume + ushort xdrStABNt = BigEndianBitConverter + .ToUInt16(vhSector, 0x47E); - drAlBlkSiz = BigEndianBitConverter.ToUInt32(vh_sector, 0x414); // Block size + uint drAlBlkSiz = BigEndianBitConverter.ToUInt32(vhSector, 0x414); - drAlBlSt = BigEndianBitConverter - .ToUInt16(vh_sector, 0x41C); // Start of allocated blocks (in 512-byte/block) + ushort drAlBlSt = BigEndianBitConverter + .ToUInt16(vhSector, 0x41C); - hfsp_offset = (ulong)((drAlBlSt * 512 + xdrStABNt * drAlBlkSiz) / imagePlugin.GetSectorSize()); + hfspOffset = (ulong)((drAlBlSt * 512 + xdrStABNt * drAlBlkSiz) / imagePlugin.GetSectorSize()); } - else hfsp_offset = 0; + else hfspOffset = 0; } - else hfsp_offset = 0; + else hfspOffset = 0; - vh_sector = imagePlugin.ReadSectors(partition.Start + hfsp_offset, sectorsToRead); // Read volume header + vhSector = imagePlugin.ReadSectors(partition.Start + hfspOffset, sectorsToRead); // Read volume header - drSigWord = BigEndianBitConverter.ToUInt16(vh_sector, 0x400); - if(drSigWord == HFSP_MAGIC || drSigWord == HFSX_MAGIC) return true; - - return false; + drSigWord = BigEndianBitConverter.ToUInt16(vhSector, 0x400); + return drSigWord == HFSP_MAGIC || drSigWord == HFSX_MAGIC; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -131,55 +125,51 @@ namespace DiscImageChef.Filesystems information = ""; ushort drSigWord; - ushort xdrStABNt; - ushort drAlBlSt; - uint drAlBlkSiz; HFSPlusVolumeHeader HPVH = new HFSPlusVolumeHeader(); - ulong hfsp_offset; + ulong hfspOffset; bool wrapped; - byte[] vh_sector; uint sectorsToRead = 0x800 / imagePlugin.ImageInfo.SectorSize; if(0x800 % imagePlugin.ImageInfo.SectorSize > 0) sectorsToRead++; - vh_sector = imagePlugin.ReadSectors(partition.Start, - sectorsToRead); // Read volume header, of HFS Wrapper MDB + byte[] vhSector = imagePlugin.ReadSectors(partition.Start, + sectorsToRead); - drSigWord = BigEndianBitConverter.ToUInt16(vh_sector, 0x400); // Check for HFS Wrapper MDB + drSigWord = BigEndianBitConverter.ToUInt16(vhSector, 0x400); // Check for HFS Wrapper MDB if(drSigWord == HFS_MAGIC) // "BD" { - drSigWord = BigEndianBitConverter.ToUInt16(vh_sector, 0x47C); // Read embedded HFS+ signature + drSigWord = BigEndianBitConverter.ToUInt16(vhSector, 0x47C); // Read embedded HFS+ signature if(drSigWord == HFSP_MAGIC) // "H+" { - xdrStABNt = BigEndianBitConverter - .ToUInt16(vh_sector, 0x47E); // Starting block number of embedded HFS+ volume + ushort xdrStABNt = BigEndianBitConverter + .ToUInt16(vhSector, 0x47E); - drAlBlkSiz = BigEndianBitConverter.ToUInt32(vh_sector, 0x414); // Block size + uint drAlBlkSiz = BigEndianBitConverter.ToUInt32(vhSector, 0x414); - drAlBlSt = BigEndianBitConverter - .ToUInt16(vh_sector, 0x41C); // Start of allocated blocks (in 512-byte/block) + ushort drAlBlSt = BigEndianBitConverter + .ToUInt16(vhSector, 0x41C); - hfsp_offset = (ulong)((drAlBlSt * 512 + xdrStABNt * drAlBlkSiz) / imagePlugin.GetSectorSize()); + hfspOffset = (ulong)((drAlBlSt * 512 + xdrStABNt * drAlBlkSiz) / imagePlugin.GetSectorSize()); wrapped = true; } else { - hfsp_offset = 0; + hfspOffset = 0; wrapped = false; } } else { - hfsp_offset = 0; + hfspOffset = 0; wrapped = false; } - vh_sector = imagePlugin.ReadSectors(partition.Start + hfsp_offset, sectorsToRead); // Read volume header + vhSector = imagePlugin.ReadSectors(partition.Start + hfspOffset, sectorsToRead); // Read volume header - HPVH.signature = BigEndianBitConverter.ToUInt16(vh_sector, 0x400); + HPVH.signature = BigEndianBitConverter.ToUInt16(vhSector, 0x400); if(HPVH.signature == HFSP_MAGIC || HPVH.signature == HFSX_MAGIC) { StringBuilder sb = new StringBuilder(); @@ -189,10 +179,10 @@ namespace DiscImageChef.Filesystems if(wrapped) sb.AppendLine("Volume is wrapped inside an HFS volume."); byte[] tmp = new byte[0x400]; - Array.Copy(vh_sector, 0x400, tmp, 0, 0x400); - vh_sector = tmp; + Array.Copy(vhSector, 0x400, tmp, 0, 0x400); + vhSector = tmp; - HPVH = BigEndianMarshal.ByteArrayToStructureBigEndian(vh_sector); + HPVH = BigEndianMarshal.ByteArrayToStructureBigEndian(vhSector); if(HPVH.version == 4 || HPVH.version == 5) { @@ -247,35 +237,35 @@ namespace DiscImageChef.Filesystems sb.AppendFormat("Mac OS X Volume ID: {0:X8}{1:X8}", HPVH.drFndrInfo6, HPVH.drFndrInfo7) .AppendLine(); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); if(HPVH.backupDate > 0) { - xmlFSType.BackupDate = DateHandlers.MacToDateTime(HPVH.backupDate); - xmlFSType.BackupDateSpecified = true; + XmlFsType.BackupDate = DateHandlers.MacToDateTime(HPVH.backupDate); + XmlFsType.BackupDateSpecified = true; } - xmlFSType.Bootable |= HPVH.drFndrInfo0 != 0 || HPVH.drFndrInfo3 != 0 || HPVH.drFndrInfo5 != 0; - xmlFSType.Clusters = HPVH.totalBlocks; - xmlFSType.ClusterSize = (int)HPVH.blockSize; + XmlFsType.Bootable |= HPVH.drFndrInfo0 != 0 || HPVH.drFndrInfo3 != 0 || HPVH.drFndrInfo5 != 0; + XmlFsType.Clusters = HPVH.totalBlocks; + XmlFsType.ClusterSize = (int)HPVH.blockSize; if(HPVH.createDate > 0) { - xmlFSType.CreationDate = DateHandlers.MacToDateTime(HPVH.createDate); - xmlFSType.CreationDateSpecified = true; + XmlFsType.CreationDate = DateHandlers.MacToDateTime(HPVH.createDate); + XmlFsType.CreationDateSpecified = true; } - xmlFSType.Dirty = (HPVH.attributes & 0x100) != 0x100; - xmlFSType.Files = HPVH.fileCount; - xmlFSType.FilesSpecified = true; - xmlFSType.FreeClusters = HPVH.freeBlocks; - xmlFSType.FreeClustersSpecified = true; + XmlFsType.Dirty = (HPVH.attributes & 0x100) != 0x100; + XmlFsType.Files = HPVH.fileCount; + XmlFsType.FilesSpecified = true; + XmlFsType.FreeClusters = HPVH.freeBlocks; + XmlFsType.FreeClustersSpecified = true; if(HPVH.modifyDate > 0) { - xmlFSType.ModificationDate = DateHandlers.MacToDateTime(HPVH.modifyDate); - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.MacToDateTime(HPVH.modifyDate); + XmlFsType.ModificationDateSpecified = true; } - if(HPVH.signature == 0x482B) xmlFSType.Type = "HFS+"; - if(HPVH.signature == 0x4858) xmlFSType.Type = "HFSX"; + if(HPVH.signature == 0x482B) XmlFsType.Type = "HFS+"; + if(HPVH.signature == 0x4858) XmlFsType.Type = "HFSX"; if(HPVH.drFndrInfo6 != 0 && HPVH.drFndrInfo7 != 0) - xmlFSType.VolumeSerial = $"{HPVH.drFndrInfo6:X8}{HPVH.drFndrInfo7:X8}"; - xmlFSType.SystemIdentifier = Encoding.ASCII.GetString(HPVH.lastMountedVersion); + XmlFsType.VolumeSerial = $"{HPVH.drFndrInfo6:X8}{HPVH.drFndrInfo7:X8}"; + XmlFsType.SystemIdentifier = Encoding.ASCII.GetString(HPVH.lastMountedVersion); } else { diff --git a/DiscImageChef.Filesystems/AppleMFS/AppleMFS.cs b/DiscImageChef.Filesystems/AppleMFS/AppleMFS.cs index 8553b98dc..2627f5323 100644 --- a/DiscImageChef.Filesystems/AppleMFS/AppleMFS.cs +++ b/DiscImageChef.Filesystems/AppleMFS/AppleMFS.cs @@ -65,26 +65,24 @@ namespace DiscImageChef.Filesystems.AppleMFS public AppleMFS() { Name = "Apple Macintosh File System"; - PluginUUID = new Guid("36405F8D-0D26-4066-6538-5DBF5D065C3A"); + PluginUuid = new Guid("36405F8D-0D26-4066-6538-5DBF5D065C3A"); CurrentEncoding = Encoding.GetEncoding("macintosh"); } public AppleMFS(Encoding encoding) { Name = "Apple Macintosh File System"; - PluginUUID = new Guid("36405F8D-0D26-4066-6538-5DBF5D065C3A"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("macintosh"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("36405F8D-0D26-4066-6538-5DBF5D065C3A"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("macintosh"); } public AppleMFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Apple Macintosh File System"; - PluginUUID = new Guid("36405F8D-0D26-4066-6538-5DBF5D065C3A"); + PluginUuid = new Guid("36405F8D-0D26-4066-6538-5DBF5D065C3A"); device = imagePlugin; partitionStart = partition.Start; - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("macintosh"); - else CurrentEncoding = encoding; + CurrentEncoding = encoding ?? Encoding.GetEncoding("macintosh"); } } } \ No newline at end of file diff --git a/DiscImageChef.Filesystems/AppleMFS/Dir.cs b/DiscImageChef.Filesystems/AppleMFS/Dir.cs index 2559bfd4c..986da287a 100644 --- a/DiscImageChef.Filesystems/AppleMFS/Dir.cs +++ b/DiscImageChef.Filesystems/AppleMFS/Dir.cs @@ -61,7 +61,7 @@ namespace DiscImageChef.Filesystems.AppleMFS return Errno.NoError; } - public bool FillDirectory() + bool FillDirectory() { idToFilename = new Dictionary(); idToEntry = new Dictionary(); @@ -70,11 +70,12 @@ namespace DiscImageChef.Filesystems.AppleMFS int offset = 0; while(offset + 51 < directoryBlocks.Length) { - MFS_FileEntry entry = new MFS_FileEntry(); - string lowerFilename; - entry.flUsrWds = new byte[16]; + MFS_FileEntry entry = new MFS_FileEntry + { + flUsrWds = new byte[16], + flFlags = (MFS_FileFlags)directoryBlocks[offset + 0] + }; - entry.flFlags = (MFS_FileFlags)directoryBlocks[offset + 0]; if(!entry.flFlags.HasFlag(MFS_FileFlags.Used)) break; entry.flTyp = directoryBlocks[offset + 1]; @@ -90,8 +91,8 @@ namespace DiscImageChef.Filesystems.AppleMFS entry.flMdDat = BigEndianBitConverter.ToUInt32(directoryBlocks, offset + 46); entry.flNam = new byte[directoryBlocks[offset + 50] + 1]; Array.Copy(directoryBlocks, offset + 50, entry.flNam, 0, entry.flNam.Length); - lowerFilename = StringHandlers.PascalToString(entry.flNam, CurrentEncoding).ToLowerInvariant() - .Replace('/', ':'); + string lowerFilename = StringHandlers.PascalToString(entry.flNam, CurrentEncoding).ToLowerInvariant() + .Replace('/', ':'); if(entry.flFlags.HasFlag(MFS_FileFlags.Used) && !idToFilename.ContainsKey(entry.flFlNum) && !idToEntry.ContainsKey(entry.flFlNum) && !filenameToId.ContainsKey(lowerFilename) && diff --git a/DiscImageChef.Filesystems/AppleMFS/File.cs b/DiscImageChef.Filesystems/AppleMFS/File.cs index ee48db255..ddbf81771 100644 --- a/DiscImageChef.Filesystems/AppleMFS/File.cs +++ b/DiscImageChef.Filesystems/AppleMFS/File.cs @@ -49,12 +49,9 @@ namespace DiscImageChef.Filesystems.AppleMFS string[] pathElements = path.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries); if(pathElements.Length != 1) return Errno.NotSupported; - uint fileID; - MFS_FileEntry entry; + if(!filenameToId.TryGetValue(path.ToLowerInvariant(), out uint fileId)) return Errno.NoSuchFile; - if(!filenameToId.TryGetValue(path.ToLowerInvariant(), out fileID)) return Errno.NoSuchFile; - - if(!idToEntry.TryGetValue(fileID, out entry)) return Errno.NoSuchFile; + if(!idToEntry.TryGetValue(fileId, out MFS_FileEntry entry)) return Errno.NoSuchFile; if(fileBlock > entry.flPyLen / volMDB.drAlBlkSiz) return Errno.InvalidArgument; @@ -85,12 +82,9 @@ namespace DiscImageChef.Filesystems.AppleMFS string[] pathElements = path.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries); if(pathElements.Length != 1) return Errno.NotSupported; - uint fileID; - MFS_FileEntry entry; + if(!filenameToId.TryGetValue(path.ToLowerInvariant(), out uint fileId)) return Errno.NoSuchFile; - if(!filenameToId.TryGetValue(path.ToLowerInvariant(), out fileID)) return Errno.NoSuchFile; - - if(!idToEntry.TryGetValue(fileID, out entry)) return Errno.NoSuchFile; + if(!idToEntry.TryGetValue(fileId, out MFS_FileEntry entry)) return Errno.NoSuchFile; attributes = new FileAttributes(); MFS_FinderFlags fdFlags = (MFS_FinderFlags)BigEndianBitConverter.ToUInt16(entry.flUsrWds, 0x08); @@ -161,16 +155,17 @@ namespace DiscImageChef.Filesystems.AppleMFS string.Compare(path, "$Bitmap", StringComparison.InvariantCulture) == 0 || string.Compare(path, "$MDB", StringComparison.InvariantCulture) == 0) { - stat = new FileEntryInfo(); - stat.Attributes = new FileAttributes(); - stat.Attributes = FileAttributes.System; - stat.BlockSize = device.GetSectorSize(); - stat.DeviceNo = 0; - stat.GID = 0; - stat.Inode = 0; - stat.Links = 1; - stat.Mode = 0x124; - stat.UID = 0; + stat = new FileEntryInfo + { + BlockSize = device.GetSectorSize(), + DeviceNo = 0, + GID = 0, + Inode = 0, + Links = 1, + Mode = 0x124, + UID = 0, + Attributes = FileAttributes.System + }; if(string.Compare(path, "$", StringComparison.InvariantCulture) == 0) { @@ -198,30 +193,29 @@ namespace DiscImageChef.Filesystems.AppleMFS return Errno.NoError; } - uint fileID; - MFS_FileEntry entry; + if(!filenameToId.TryGetValue(path.ToLowerInvariant(), out uint fileId)) return Errno.NoSuchFile; - if(!filenameToId.TryGetValue(path.ToLowerInvariant(), out fileID)) return Errno.NoSuchFile; - - if(!idToEntry.TryGetValue(fileID, out entry)) return Errno.NoSuchFile; + if(!idToEntry.TryGetValue(fileId, out MFS_FileEntry entry)) return Errno.NoSuchFile; FileAttributes attr = new FileAttributes(); Errno error = GetAttributes(path, ref attr); if(error != Errno.NoError) return error; - stat = new FileEntryInfo(); - stat.Attributes = attr; - stat.Blocks = entry.flLgLen / volMDB.drAlBlkSiz; - stat.BlockSize = volMDB.drAlBlkSiz; - stat.CreationTime = DateHandlers.MacToDateTime(entry.flCrDat); - stat.DeviceNo = 0; - stat.GID = 0; - stat.Inode = entry.flFlNum; - stat.LastWriteTime = DateHandlers.MacToDateTime(entry.flMdDat); - stat.Length = entry.flPyLen; - stat.Links = 1; - stat.Mode = 0x124; - stat.UID = 0; + stat = new FileEntryInfo + { + Attributes = attr, + Blocks = entry.flLgLen / volMDB.drAlBlkSiz, + BlockSize = volMDB.drAlBlkSiz, + CreationTime = DateHandlers.MacToDateTime(entry.flCrDat), + DeviceNo = 0, + GID = 0, + Inode = entry.flFlNum, + LastWriteTime = DateHandlers.MacToDateTime(entry.flMdDat), + Length = entry.flPyLen, + Links = 1, + Mode = 0x124, + UID = 0 + }; return Errno.NoError; } @@ -240,12 +234,9 @@ namespace DiscImageChef.Filesystems.AppleMFS string[] pathElements = path.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries); if(pathElements.Length != 1) return Errno.NotSupported; - uint fileID; - MFS_FileEntry entry; + if(!filenameToId.TryGetValue(path.ToLowerInvariant(), out uint fileId)) return Errno.NoSuchFile; - if(!filenameToId.TryGetValue(path.ToLowerInvariant(), out fileID)) return Errno.NoSuchFile; - - if(!idToEntry.TryGetValue(fileID, out entry)) return Errno.NoSuchFile; + if(!idToEntry.TryGetValue(fileId, out MFS_FileEntry entry)) return Errno.NoSuchFile; uint nextBlock; @@ -271,10 +262,10 @@ namespace DiscImageChef.Filesystems.AppleMFS } MemoryStream ms = new MemoryStream(); - byte[] sectors; do { + byte[] sectors; if(tags) sectors = device.ReadSectorsTag((ulong)((nextBlock - 2) * sectorsPerBlock) + volMDB.drAlBlSt + partitionStart, diff --git a/DiscImageChef.Filesystems/AppleMFS/Info.cs b/DiscImageChef.Filesystems/AppleMFS/Info.cs index f6b9ed9b6..0f698698a 100644 --- a/DiscImageChef.Filesystems/AppleMFS/Info.cs +++ b/DiscImageChef.Filesystems/AppleMFS/Info.cs @@ -47,11 +47,11 @@ namespace DiscImageChef.Filesystems.AppleMFS if(2 + partition.Start >= partition.End) return false; - byte[] mdb_sector = imagePlugin.ReadSector(2 + partition.Start); + byte[] mdbSector = imagePlugin.ReadSector(2 + partition.Start); BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; - drSigWord = BigEndianBitConverter.ToUInt16(mdb_sector, 0x000); + drSigWord = BigEndianBitConverter.ToUInt16(mdbSector, 0x000); return drSigWord == MFS_MAGIC; } @@ -67,63 +67,62 @@ namespace DiscImageChef.Filesystems.AppleMFS MFS_BootBlock BB = new MFS_BootBlock(); byte[] pString = new byte[16]; - byte[] variable_size; - byte[] mdb_sector = imagePlugin.ReadSector(2 + partition.Start); - byte[] bb_sector = imagePlugin.ReadSector(0 + partition.Start); + byte[] mdbSector = imagePlugin.ReadSector(2 + partition.Start); + byte[] bbSector = imagePlugin.ReadSector(0 + partition.Start); BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; - MDB.drSigWord = BigEndianBitConverter.ToUInt16(mdb_sector, 0x000); + MDB.drSigWord = BigEndianBitConverter.ToUInt16(mdbSector, 0x000); if(MDB.drSigWord != MFS_MAGIC) return; - MDB.drCrDate = BigEndianBitConverter.ToUInt32(mdb_sector, 0x002); - MDB.drLsBkUp = BigEndianBitConverter.ToUInt32(mdb_sector, 0x006); - MDB.drAtrb = BigEndianBitConverter.ToUInt16(mdb_sector, 0x00A); - MDB.drNmFls = BigEndianBitConverter.ToUInt16(mdb_sector, 0x00C); - MDB.drDirSt = BigEndianBitConverter.ToUInt16(mdb_sector, 0x00E); - MDB.drBlLen = BigEndianBitConverter.ToUInt16(mdb_sector, 0x010); - MDB.drNmAlBlks = BigEndianBitConverter.ToUInt16(mdb_sector, 0x012); - MDB.drAlBlkSiz = BigEndianBitConverter.ToUInt32(mdb_sector, 0x014); - MDB.drClpSiz = BigEndianBitConverter.ToUInt32(mdb_sector, 0x018); - MDB.drAlBlSt = BigEndianBitConverter.ToUInt16(mdb_sector, 0x01C); - MDB.drNxtFNum = BigEndianBitConverter.ToUInt32(mdb_sector, 0x01E); - MDB.drFreeBks = BigEndianBitConverter.ToUInt16(mdb_sector, 0x022); - MDB.drVNSiz = mdb_sector[0x024]; - variable_size = new byte[MDB.drVNSiz + 1]; - Array.Copy(mdb_sector, 0x024, variable_size, 0, MDB.drVNSiz + 1); - MDB.drVN = StringHandlers.PascalToString(variable_size, CurrentEncoding); + MDB.drCrDate = BigEndianBitConverter.ToUInt32(mdbSector, 0x002); + MDB.drLsBkUp = BigEndianBitConverter.ToUInt32(mdbSector, 0x006); + MDB.drAtrb = BigEndianBitConverter.ToUInt16(mdbSector, 0x00A); + MDB.drNmFls = BigEndianBitConverter.ToUInt16(mdbSector, 0x00C); + MDB.drDirSt = BigEndianBitConverter.ToUInt16(mdbSector, 0x00E); + MDB.drBlLen = BigEndianBitConverter.ToUInt16(mdbSector, 0x010); + MDB.drNmAlBlks = BigEndianBitConverter.ToUInt16(mdbSector, 0x012); + MDB.drAlBlkSiz = BigEndianBitConverter.ToUInt32(mdbSector, 0x014); + MDB.drClpSiz = BigEndianBitConverter.ToUInt32(mdbSector, 0x018); + MDB.drAlBlSt = BigEndianBitConverter.ToUInt16(mdbSector, 0x01C); + MDB.drNxtFNum = BigEndianBitConverter.ToUInt32(mdbSector, 0x01E); + MDB.drFreeBks = BigEndianBitConverter.ToUInt16(mdbSector, 0x022); + MDB.drVNSiz = mdbSector[0x024]; + byte[] variableSize = new byte[MDB.drVNSiz + 1]; + Array.Copy(mdbSector, 0x024, variableSize, 0, MDB.drVNSiz + 1); + MDB.drVN = StringHandlers.PascalToString(variableSize, CurrentEncoding); - BB.signature = BigEndianBitConverter.ToUInt16(bb_sector, 0x000); + BB.signature = BigEndianBitConverter.ToUInt16(bbSector, 0x000); if(BB.signature == MFSBB_MAGIC) { - BB.branch = BigEndianBitConverter.ToUInt32(bb_sector, 0x002); - BB.boot_flags = bb_sector[0x006]; - BB.boot_version = bb_sector[0x007]; + BB.branch = BigEndianBitConverter.ToUInt32(bbSector, 0x002); + BB.boot_flags = bbSector[0x006]; + BB.boot_version = bbSector[0x007]; - BB.sec_sv_pages = BigEndianBitConverter.ToInt16(bb_sector, 0x008); + BB.sec_sv_pages = BigEndianBitConverter.ToInt16(bbSector, 0x008); - Array.Copy(mdb_sector, 0x00A, pString, 0, 16); + Array.Copy(mdbSector, 0x00A, pString, 0, 16); BB.system_name = StringHandlers.PascalToString(pString, CurrentEncoding); - Array.Copy(mdb_sector, 0x01A, pString, 0, 16); + Array.Copy(mdbSector, 0x01A, pString, 0, 16); BB.finder_name = StringHandlers.PascalToString(pString, CurrentEncoding); - Array.Copy(mdb_sector, 0x02A, pString, 0, 16); + Array.Copy(mdbSector, 0x02A, pString, 0, 16); BB.debug_name = StringHandlers.PascalToString(pString, CurrentEncoding); - Array.Copy(mdb_sector, 0x03A, pString, 0, 16); + Array.Copy(mdbSector, 0x03A, pString, 0, 16); BB.disasm_name = StringHandlers.PascalToString(pString, CurrentEncoding); - Array.Copy(mdb_sector, 0x04A, pString, 0, 16); + Array.Copy(mdbSector, 0x04A, pString, 0, 16); BB.stupscr_name = StringHandlers.PascalToString(pString, CurrentEncoding); - Array.Copy(mdb_sector, 0x05A, pString, 0, 16); + Array.Copy(mdbSector, 0x05A, pString, 0, 16); BB.bootup_name = StringHandlers.PascalToString(pString, CurrentEncoding); - Array.Copy(mdb_sector, 0x06A, pString, 0, 16); + Array.Copy(mdbSector, 0x06A, pString, 0, 16); BB.clipbrd_name = StringHandlers.PascalToString(pString, CurrentEncoding); - BB.max_files = BigEndianBitConverter.ToUInt16(bb_sector, 0x07A); - BB.queue_size = BigEndianBitConverter.ToUInt16(bb_sector, 0x07C); - BB.heap_128k = BigEndianBitConverter.ToUInt32(bb_sector, 0x07E); - BB.heap_256k = BigEndianBitConverter.ToUInt32(bb_sector, 0x082); - BB.heap_512k = BigEndianBitConverter.ToUInt32(bb_sector, 0x086); + BB.max_files = BigEndianBitConverter.ToUInt16(bbSector, 0x07A); + BB.queue_size = BigEndianBitConverter.ToUInt16(bbSector, 0x07C); + BB.heap_128k = BigEndianBitConverter.ToUInt32(bbSector, 0x07E); + BB.heap_256k = BigEndianBitConverter.ToUInt32(bbSector, 0x082); + BB.heap_512k = BigEndianBitConverter.ToUInt32(bbSector, 0x086); } else BB.signature = 0x0000; @@ -175,26 +174,26 @@ namespace DiscImageChef.Filesystems.AppleMFS information = sb.ToString(); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); if(MDB.drLsBkUp > 0) { - xmlFSType.BackupDate = DateHandlers.MacToDateTime(MDB.drLsBkUp); - xmlFSType.BackupDateSpecified = true; + XmlFsType.BackupDate = DateHandlers.MacToDateTime(MDB.drLsBkUp); + XmlFsType.BackupDateSpecified = true; } - xmlFSType.Bootable = BB.signature == MFSBB_MAGIC; - xmlFSType.Clusters = MDB.drNmAlBlks; - xmlFSType.ClusterSize = (int)MDB.drAlBlkSiz; + XmlFsType.Bootable = BB.signature == MFSBB_MAGIC; + XmlFsType.Clusters = MDB.drNmAlBlks; + XmlFsType.ClusterSize = (int)MDB.drAlBlkSiz; if(MDB.drCrDate > 0) { - xmlFSType.CreationDate = DateHandlers.MacToDateTime(MDB.drCrDate); - xmlFSType.CreationDateSpecified = true; + XmlFsType.CreationDate = DateHandlers.MacToDateTime(MDB.drCrDate); + XmlFsType.CreationDateSpecified = true; } - xmlFSType.Files = MDB.drNmFls; - xmlFSType.FilesSpecified = true; - xmlFSType.FreeClusters = MDB.drFreeBks; - xmlFSType.FreeClustersSpecified = true; - xmlFSType.Type = "MFS"; - xmlFSType.VolumeName = MDB.drVN; + XmlFsType.Files = MDB.drNmFls; + XmlFsType.FilesSpecified = true; + XmlFsType.FreeClusters = MDB.drFreeBks; + XmlFsType.FreeClustersSpecified = true; + XmlFsType.Type = "MFS"; + XmlFsType.VolumeName = MDB.drVN; } } } \ No newline at end of file diff --git a/DiscImageChef.Filesystems/AppleMFS/Structs.cs b/DiscImageChef.Filesystems/AppleMFS/Structs.cs index 3449b91e9..685122538 100644 --- a/DiscImageChef.Filesystems/AppleMFS/Structs.cs +++ b/DiscImageChef.Filesystems/AppleMFS/Structs.cs @@ -31,10 +31,14 @@ // ****************************************************************************/ using System; +using System.Diagnostics.CodeAnalysis; +#pragma warning disable 169 namespace DiscImageChef.Filesystems.AppleMFS { // Information from Inside Macintosh Volume II + [SuppressMessage("ReSharper", "InconsistentNaming")] + [SuppressMessage("ReSharper", "NotAccessedField.Local")] public partial class AppleMFS { /// diff --git a/DiscImageChef.Filesystems/AppleMFS/Super.cs b/DiscImageChef.Filesystems/AppleMFS/Super.cs index 5f291023c..f6b13167c 100644 --- a/DiscImageChef.Filesystems/AppleMFS/Super.cs +++ b/DiscImageChef.Filesystems/AppleMFS/Super.cs @@ -44,8 +44,6 @@ namespace DiscImageChef.Filesystems.AppleMFS this.debug = debug; volMDB = new MFS_MasterDirectoryBlock(); - byte[] variable_size; - mdbBlocks = device.ReadSector(2 + partitionStart); bootBlocks = device.ReadSector(0 + partitionStart); @@ -67,19 +65,19 @@ namespace DiscImageChef.Filesystems.AppleMFS volMDB.drNxtFNum = BigEndianBitConverter.ToUInt32(mdbBlocks, 0x01E); volMDB.drFreeBks = BigEndianBitConverter.ToUInt16(mdbBlocks, 0x022); volMDB.drVNSiz = mdbBlocks[0x024]; - variable_size = new byte[volMDB.drVNSiz + 1]; - Array.Copy(mdbBlocks, 0x024, variable_size, 0, volMDB.drVNSiz + 1); - volMDB.drVN = StringHandlers.PascalToString(variable_size, CurrentEncoding); + byte[] variableSize = new byte[volMDB.drVNSiz + 1]; + Array.Copy(mdbBlocks, 0x024, variableSize, 0, volMDB.drVNSiz + 1); + volMDB.drVN = StringHandlers.PascalToString(variableSize, CurrentEncoding); directoryBlocks = device.ReadSectors(volMDB.drDirSt + partitionStart, volMDB.drBlLen); int bytesInBlockMap = volMDB.drNmAlBlks * 12 / 8 + volMDB.drNmAlBlks * 12 % 8; - int bytesBeforeBlockMap = 64; - int bytesInWholeMDB = bytesInBlockMap + bytesBeforeBlockMap; - int sectorsInWholeMDB = bytesInWholeMDB / (int)device.ImageInfo.SectorSize + - bytesInWholeMDB % (int)device.ImageInfo.SectorSize; - byte[] wholeMDB = device.ReadSectors(partitionStart + 2, (uint)sectorsInWholeMDB); + const int BYTES_BEFORE_BLOCK_MAP = 64; + int bytesInWholeMdb = bytesInBlockMap + BYTES_BEFORE_BLOCK_MAP; + int sectorsInWholeMdb = bytesInWholeMdb / (int)device.ImageInfo.SectorSize + + bytesInWholeMdb % (int)device.ImageInfo.SectorSize; + byte[] wholeMdb = device.ReadSectors(partitionStart + 2, (uint)sectorsInWholeMdb); blockMapBytes = new byte[bytesInBlockMap]; - Array.Copy(wholeMDB, bytesBeforeBlockMap, blockMapBytes, 0, blockMapBytes.Length); + Array.Copy(wholeMdb, BYTES_BEFORE_BLOCK_MAP, blockMapBytes, 0, blockMapBytes.Length); int offset = 0; blockMap = new uint[volMDB.drNmAlBlks + 2 + 1]; @@ -113,7 +111,7 @@ namespace DiscImageChef.Filesystems.AppleMFS bootTags = device.ReadSectorTag(0 + partitionStart, SectorTagType.AppleSectorTag); directoryTags = device.ReadSectorsTag(volMDB.drDirSt + partitionStart, volMDB.drBlLen, SectorTagType.AppleSectorTag); - bitmapTags = device.ReadSectorsTag(partitionStart + 2, (uint)sectorsInWholeMDB, + bitmapTags = device.ReadSectorsTag(partitionStart + 2, (uint)sectorsInWholeMdb, SectorTagType.AppleSectorTag); } @@ -127,26 +125,26 @@ namespace DiscImageChef.Filesystems.AppleMFS if(bbSig != MFSBB_MAGIC) bootBlocks = null; - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); if(volMDB.drLsBkUp > 0) { - xmlFSType.BackupDate = DateHandlers.MacToDateTime(volMDB.drLsBkUp); - xmlFSType.BackupDateSpecified = true; + XmlFsType.BackupDate = DateHandlers.MacToDateTime(volMDB.drLsBkUp); + XmlFsType.BackupDateSpecified = true; } - xmlFSType.Bootable = bbSig == MFSBB_MAGIC; - xmlFSType.Clusters = volMDB.drNmAlBlks; - xmlFSType.ClusterSize = (int)volMDB.drAlBlkSiz; + XmlFsType.Bootable = bbSig == MFSBB_MAGIC; + XmlFsType.Clusters = volMDB.drNmAlBlks; + XmlFsType.ClusterSize = (int)volMDB.drAlBlkSiz; if(volMDB.drCrDate > 0) { - xmlFSType.CreationDate = DateHandlers.MacToDateTime(volMDB.drCrDate); - xmlFSType.CreationDateSpecified = true; + XmlFsType.CreationDate = DateHandlers.MacToDateTime(volMDB.drCrDate); + XmlFsType.CreationDateSpecified = true; } - xmlFSType.Files = volMDB.drNmFls; - xmlFSType.FilesSpecified = true; - xmlFSType.FreeClusters = volMDB.drFreeBks; - xmlFSType.FreeClustersSpecified = true; - xmlFSType.Type = "MFS"; - xmlFSType.VolumeName = volMDB.drVN; + XmlFsType.Files = volMDB.drNmFls; + XmlFsType.FilesSpecified = true; + XmlFsType.FreeClusters = volMDB.drFreeBks; + XmlFsType.FreeClustersSpecified = true; + XmlFsType.Type = "MFS"; + XmlFsType.VolumeName = volMDB.drVN; return Errno.NoError; } @@ -169,14 +167,16 @@ namespace DiscImageChef.Filesystems.AppleMFS public override Errno StatFs(ref FileSystemInfo stat) { - stat = new FileSystemInfo(); - stat.Blocks = volMDB.drNmAlBlks; - stat.FilenameLength = 255; - stat.Files = volMDB.drNmFls; - stat.FreeBlocks = volMDB.drFreeBks; + stat = new FileSystemInfo + { + Blocks = volMDB.drNmAlBlks, + FilenameLength = 255, + Files = volMDB.drNmFls, + FreeBlocks = volMDB.drFreeBks, + PluginId = PluginUuid, + Type = "Apple MFS" + }; stat.FreeFiles = uint.MaxValue - stat.Files; - stat.PluginId = PluginUUID; - stat.Type = "Apple MFS"; return Errno.NoError; } diff --git a/DiscImageChef.Filesystems/AppleMFS/Xattr.cs b/DiscImageChef.Filesystems/AppleMFS/Xattr.cs index 60025976b..1cdeaf239 100644 --- a/DiscImageChef.Filesystems/AppleMFS/Xattr.cs +++ b/DiscImageChef.Filesystems/AppleMFS/Xattr.cs @@ -61,12 +61,9 @@ namespace DiscImageChef.Filesystems.AppleMFS return Errno.NoError; } - uint fileID; - MFS_FileEntry entry; + if(!filenameToId.TryGetValue(path.ToLowerInvariant(), out uint fileId)) return Errno.NoSuchFile; - if(!filenameToId.TryGetValue(path.ToLowerInvariant(), out fileID)) return Errno.NoSuchFile; - - if(!idToEntry.TryGetValue(fileID, out entry)) return Errno.NoSuchFile; + if(!idToEntry.TryGetValue(fileId, out MFS_FileEntry entry)) return Errno.NoSuchFile; if(entry.flRLgLen > 0) { @@ -130,13 +127,11 @@ namespace DiscImageChef.Filesystems.AppleMFS } else return Errno.NoSuchExtendedAttribute; - uint fileID; - MFS_FileEntry entry; Errno error; - if(!filenameToId.TryGetValue(path.ToLowerInvariant(), out fileID)) return Errno.NoSuchFile; + if(!filenameToId.TryGetValue(path.ToLowerInvariant(), out uint fileId)) return Errno.NoSuchFile; - if(!idToEntry.TryGetValue(fileID, out entry)) return Errno.NoSuchFile; + if(!idToEntry.TryGetValue(fileId, out MFS_FileEntry entry)) return Errno.NoSuchFile; if(entry.flRLgLen > 0 && string.Compare(xattr, "com.apple.ResourceFork", StringComparison.InvariantCulture) == 0) diff --git a/DiscImageChef.Filesystems/AtheOS.cs b/DiscImageChef.Filesystems/AtheOS.cs index 045d63e64..1268b7b66 100644 --- a/DiscImageChef.Filesystems/AtheOS.cs +++ b/DiscImageChef.Filesystems/AtheOS.cs @@ -53,24 +53,22 @@ namespace DiscImageChef.Filesystems public AtheOS() { Name = "AtheOS Filesystem"; - PluginUUID = new Guid("AAB2C4F1-DC07-49EE-A948-576CC51B58C5"); + PluginUuid = new Guid("AAB2C4F1-DC07-49EE-A948-576CC51B58C5"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public AtheOS(Encoding encoding) { Name = "AtheOS Filesystem"; - PluginUUID = new Guid("AAB2C4F1-DC07-49EE-A948-576CC51B58C5"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("AAB2C4F1-DC07-49EE-A948-576CC51B58C5"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public AtheOS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "AtheOS Filesystem"; - PluginUUID = new Guid("AAB2C4F1-DC07-49EE-A948-576CC51B58C5"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("AAB2C4F1-DC07-49EE-A948-576CC51B58C5"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -87,10 +85,10 @@ namespace DiscImageChef.Filesystems uint magic; byte[] tmp = imagePlugin.ReadSectors(sector + partition.Start, run); - byte[] sb_sector = new byte[AFS_SUPERBLOCK_SIZE]; - Array.Copy(tmp, offset, sb_sector, 0, AFS_SUPERBLOCK_SIZE); + byte[] sbSector = new byte[AFS_SUPERBLOCK_SIZE]; + Array.Copy(tmp, offset, sbSector, 0, AFS_SUPERBLOCK_SIZE); - magic = BitConverter.ToUInt32(sb_sector, 0x20); + magic = BitConverter.ToUInt32(sbSector, 0x20); return magic == AFS_MAGIC1; } @@ -102,8 +100,6 @@ namespace DiscImageChef.Filesystems StringBuilder sb = new StringBuilder(); - AtheosSuperBlock afs_sb; - ulong sector = AFS_BOOTBLOCK_SIZE / imagePlugin.GetSectorSize(); uint offset = AFS_BOOTBLOCK_SIZE % imagePlugin.GetSectorSize(); uint run = 1; @@ -112,58 +108,58 @@ namespace DiscImageChef.Filesystems run = AFS_SUPERBLOCK_SIZE / imagePlugin.GetSectorSize(); byte[] tmp = imagePlugin.ReadSectors(sector + partition.Start, run); - byte[] sb_sector = new byte[AFS_SUPERBLOCK_SIZE]; - Array.Copy(tmp, offset, sb_sector, 0, AFS_SUPERBLOCK_SIZE); + byte[] sbSector = new byte[AFS_SUPERBLOCK_SIZE]; + Array.Copy(tmp, offset, sbSector, 0, AFS_SUPERBLOCK_SIZE); - GCHandle handle = GCHandle.Alloc(sb_sector, GCHandleType.Pinned); - afs_sb = (AtheosSuperBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(AtheosSuperBlock)); + GCHandle handle = GCHandle.Alloc(sbSector, GCHandleType.Pinned); + AtheosSuperBlock afsSb = (AtheosSuperBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(AtheosSuperBlock)); handle.Free(); sb.AppendLine("Atheos filesystem"); - if(afs_sb.flags == 1) sb.AppendLine("Filesystem is read-only"); + if(afsSb.flags == 1) sb.AppendLine("Filesystem is read-only"); - sb.AppendFormat("Volume name: {0}", StringHandlers.CToString(afs_sb.name, CurrentEncoding)).AppendLine(); - sb.AppendFormat("{0} bytes per block", afs_sb.block_size).AppendLine(); - sb.AppendFormat("{0} blocks in volume ({1} bytes)", afs_sb.num_blocks, - afs_sb.num_blocks * afs_sb.block_size).AppendLine(); - sb.AppendFormat("{0} used blocks ({1} bytes)", afs_sb.used_blocks, afs_sb.used_blocks * afs_sb.block_size) + sb.AppendFormat("Volume name: {0}", StringHandlers.CToString(afsSb.name, CurrentEncoding)).AppendLine(); + sb.AppendFormat("{0} bytes per block", afsSb.block_size).AppendLine(); + sb.AppendFormat("{0} blocks in volume ({1} bytes)", afsSb.num_blocks, + afsSb.num_blocks * afsSb.block_size).AppendLine(); + sb.AppendFormat("{0} used blocks ({1} bytes)", afsSb.used_blocks, afsSb.used_blocks * afsSb.block_size) .AppendLine(); - sb.AppendFormat("{0} bytes per i-node", afs_sb.inode_size).AppendLine(); - sb.AppendFormat("{0} blocks per allocation group ({1} bytes)", afs_sb.blocks_per_ag, - afs_sb.blocks_per_ag * afs_sb.block_size).AppendLine(); - sb.AppendFormat("{0} allocation groups in volume", afs_sb.num_ags).AppendLine(); + sb.AppendFormat("{0} bytes per i-node", afsSb.inode_size).AppendLine(); + sb.AppendFormat("{0} blocks per allocation group ({1} bytes)", afsSb.blocks_per_ag, + afsSb.blocks_per_ag * afsSb.block_size).AppendLine(); + sb.AppendFormat("{0} allocation groups in volume", afsSb.num_ags).AppendLine(); sb.AppendFormat("Journal resides in block {0} of allocation group {1} and runs for {2} blocks ({3} bytes)", - afs_sb.log_blocks_start, afs_sb.log_blocks_ag, afs_sb.log_blocks_len, - afs_sb.log_blocks_len * afs_sb.block_size).AppendLine(); - sb.AppendFormat("Journal starts in byte {0} and has {1} bytes in {2} blocks", afs_sb.log_start, - afs_sb.log_size, afs_sb.log_valid_blocks).AppendLine(); + afsSb.log_blocks_start, afsSb.log_blocks_ag, afsSb.log_blocks_len, + afsSb.log_blocks_len * afsSb.block_size).AppendLine(); + sb.AppendFormat("Journal starts in byte {0} and has {1} bytes in {2} blocks", afsSb.log_start, + afsSb.log_size, afsSb.log_valid_blocks).AppendLine(); sb .AppendFormat("Root folder's i-node resides in block {0} of allocation group {1} and runs for {2} blocks ({3} bytes)", - afs_sb.root_dir_start, afs_sb.root_dir_ag, afs_sb.root_dir_len, - afs_sb.root_dir_len * afs_sb.block_size).AppendLine(); + afsSb.root_dir_start, afsSb.root_dir_ag, afsSb.root_dir_len, + afsSb.root_dir_len * afsSb.block_size).AppendLine(); sb .AppendFormat("Directory containing files scheduled for deletion's i-node resides in block {0} of allocation group {1} and runs for {2} blocks ({3} bytes)", - afs_sb.deleted_start, afs_sb.deleted_ag, afs_sb.deleted_len, - afs_sb.deleted_len * afs_sb.block_size).AppendLine(); + afsSb.deleted_start, afsSb.deleted_ag, afsSb.deleted_len, + afsSb.deleted_len * afsSb.block_size).AppendLine(); sb .AppendFormat("Indices' i-node resides in block {0} of allocation group {1} and runs for {2} blocks ({3} bytes)", - afs_sb.indices_start, afs_sb.indices_ag, afs_sb.indices_len, - afs_sb.indices_len * afs_sb.block_size).AppendLine(); - sb.AppendFormat("{0} blocks for bootloader ({1} bytes)", afs_sb.boot_size, - afs_sb.boot_size * afs_sb.block_size).AppendLine(); + afsSb.indices_start, afsSb.indices_ag, afsSb.indices_len, + afsSb.indices_len * afsSb.block_size).AppendLine(); + sb.AppendFormat("{0} blocks for bootloader ({1} bytes)", afsSb.boot_size, + afsSb.boot_size * afsSb.block_size).AppendLine(); information = sb.ToString(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { - Clusters = afs_sb.num_blocks, - ClusterSize = (int)afs_sb.block_size, + Clusters = afsSb.num_blocks, + ClusterSize = (int)afsSb.block_size, Dirty = false, - FreeClusters = afs_sb.num_blocks - afs_sb.used_blocks, + FreeClusters = afsSb.num_blocks - afsSb.used_blocks, FreeClustersSpecified = true, Type = "AtheOS filesystem", - VolumeName = StringHandlers.CToString(afs_sb.name, CurrentEncoding) + VolumeName = StringHandlers.CToString(afsSb.name, CurrentEncoding) }; } diff --git a/DiscImageChef.Filesystems/BFS.cs b/DiscImageChef.Filesystems/BFS.cs index a8c87853e..a9e0533f5 100644 --- a/DiscImageChef.Filesystems/BFS.cs +++ b/DiscImageChef.Filesystems/BFS.cs @@ -58,24 +58,22 @@ namespace DiscImageChef.Filesystems public BeFS() { Name = "Be Filesystem"; - PluginUUID = new Guid("dc8572b3-b6ad-46e4-8de9-cbe123ff6672"); + PluginUuid = new Guid("dc8572b3-b6ad-46e4-8de9-cbe123ff6672"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public BeFS(Encoding encoding) { Name = "Be Filesystem"; - PluginUUID = new Guid("dc8572b3-b6ad-46e4-8de9-cbe123ff6672"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("dc8572b3-b6ad-46e4-8de9-cbe123ff6672"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public BeFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Be Filesystem"; - PluginUUID = new Guid("dc8572b3-b6ad-46e4-8de9-cbe123ff6672"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("dc8572b3-b6ad-46e4-8de9-cbe123ff6672"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -83,58 +81,55 @@ namespace DiscImageChef.Filesystems if(2 + partition.Start >= partition.End) return false; uint magic; - uint magic_be; + uint magicBe; - byte[] sb_sector = imagePlugin.ReadSector(0 + partition.Start); + byte[] sbSector = imagePlugin.ReadSector(0 + partition.Start); - magic = BitConverter.ToUInt32(sb_sector, 0x20); - magic_be = BigEndianBitConverter.ToUInt32(sb_sector, 0x20); + magic = BitConverter.ToUInt32(sbSector, 0x20); + magicBe = BigEndianBitConverter.ToUInt32(sbSector, 0x20); - if(magic == BEFS_MAGIC1 || magic_be == BEFS_MAGIC1) return true; + if(magic == BEFS_MAGIC1 || magicBe == BEFS_MAGIC1) return true; - if(sb_sector.Length >= 0x400) + if(sbSector.Length >= 0x400) { - magic = BitConverter.ToUInt32(sb_sector, 0x220); - magic_be = BigEndianBitConverter.ToUInt32(sb_sector, 0x220); + magic = BitConverter.ToUInt32(sbSector, 0x220); + magicBe = BigEndianBitConverter.ToUInt32(sbSector, 0x220); } - if(magic == BEFS_MAGIC1 || magic_be == BEFS_MAGIC1) return true; + if(magic == BEFS_MAGIC1 || magicBe == BEFS_MAGIC1) return true; - sb_sector = imagePlugin.ReadSector(1 + partition.Start); + sbSector = imagePlugin.ReadSector(1 + partition.Start); - magic = BitConverter.ToUInt32(sb_sector, 0x20); - magic_be = BigEndianBitConverter.ToUInt32(sb_sector, 0x20); + magic = BitConverter.ToUInt32(sbSector, 0x20); + magicBe = BigEndianBitConverter.ToUInt32(sbSector, 0x20); - if(magic == BEFS_MAGIC1 || magic_be == BEFS_MAGIC1) return true; - - return false; + return magic == BEFS_MAGIC1 || magicBe == BEFS_MAGIC1; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, out string information) { information = ""; - byte[] name_bytes = new byte[32]; StringBuilder sb = new StringBuilder(); BeSuperBlock besb = new BeSuperBlock(); - byte[] sb_sector = imagePlugin.ReadSector(0 + partition.Start); + byte[] sbSector = imagePlugin.ReadSector(0 + partition.Start); bool littleEndian; - besb.magic1 = BigEndianBitConverter.ToUInt32(sb_sector, 0x20); + besb.magic1 = BigEndianBitConverter.ToUInt32(sbSector, 0x20); if(besb.magic1 == BEFS_MAGIC1 || besb.magic1 == BEFS_CIGAM1) // Magic is at offset littleEndian = besb.magic1 == BEFS_CIGAM1; else { - sb_sector = imagePlugin.ReadSector(1 + partition.Start); - besb.magic1 = BigEndianBitConverter.ToUInt32(sb_sector, 0x20); + sbSector = imagePlugin.ReadSector(1 + partition.Start); + besb.magic1 = BigEndianBitConverter.ToUInt32(sbSector, 0x20); if(besb.magic1 == BEFS_MAGIC1 || besb.magic1 == BEFS_CIGAM1) // There is a boot sector littleEndian = besb.magic1 == BEFS_CIGAM1; - else if(sb_sector.Length >= 0x400) + else if(sbSector.Length >= 0x400) { byte[] temp = imagePlugin.ReadSector(0 + partition.Start); besb.magic1 = BigEndianBitConverter.ToUInt32(temp, 0x220); @@ -142,8 +137,8 @@ namespace DiscImageChef.Filesystems if(besb.magic1 == BEFS_MAGIC1 || besb.magic1 == BEFS_CIGAM1) // There is a boot sector { littleEndian = besb.magic1 == BEFS_CIGAM1; - sb_sector = new byte[0x200]; - Array.Copy(temp, 0x200, sb_sector, 0, 0x200); + sbSector = new byte[0x200]; + Array.Copy(temp, 0x200, sbSector, 0, 0x200); } else return; } @@ -152,15 +147,13 @@ namespace DiscImageChef.Filesystems if(littleEndian) { - GCHandle handle = GCHandle.Alloc(sb_sector, GCHandleType.Pinned); + GCHandle handle = GCHandle.Alloc(sbSector, GCHandleType.Pinned); besb = (BeSuperBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(BeSuperBlock)); handle.Free(); } - else besb = BigEndianMarshal.ByteArrayToStructureBigEndian(sb_sector); + else besb = BigEndianMarshal.ByteArrayToStructureBigEndian(sbSector); - if(littleEndian) // Big-endian filesystem - sb.AppendLine("Little-endian BeFS"); - else sb.AppendLine("Big-endian BeFS"); + sb.AppendLine(littleEndian ? "Little-endian BeFS" : "Big-endian BeFS"); if(besb.magic1 != BEFS_MAGIC1 || besb.fs_byte_order != BEFS_ENDIAN || besb.magic2 != BEFS_MAGIC2 || besb.magic3 != BEFS_MAGIC3 || besb.root_dir_len != 1 || besb.indices_len != 1 || @@ -180,8 +173,7 @@ namespace DiscImageChef.Filesystems switch(besb.flags) { case BEFS_CLEAN: - if(besb.log_start == besb.log_end) sb.AppendLine("Filesystem is clean"); - else sb.AppendLine("Filesystem is dirty"); + sb.AppendLine(besb.log_start == besb.log_end ? "Filesystem is clean" : "Filesystem is dirty"); break; case BEFS_DIRTY: sb.AppendLine("Filesystem is dirty"); break; @@ -215,14 +207,16 @@ namespace DiscImageChef.Filesystems information = sb.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.Clusters = besb.num_blocks; - xmlFSType.ClusterSize = (int)besb.block_size; - xmlFSType.Dirty = besb.flags == BEFS_DIRTY; - xmlFSType.FreeClusters = besb.num_blocks - besb.used_blocks; - xmlFSType.FreeClustersSpecified = true; - xmlFSType.Type = "BeFS"; - xmlFSType.VolumeName = StringHandlers.CToString(besb.name, CurrentEncoding); + XmlFsType = new FileSystemType + { + Clusters = besb.num_blocks, + ClusterSize = (int)besb.block_size, + Dirty = besb.flags == BEFS_DIRTY, + FreeClusters = besb.num_blocks - besb.used_blocks, + FreeClustersSpecified = true, + Type = "BeFS", + VolumeName = StringHandlers.CToString(besb.name, CurrentEncoding) + }; } /// diff --git a/DiscImageChef.Filesystems/BTRFS.cs b/DiscImageChef.Filesystems/BTRFS.cs index 2c7d4dd86..4ff634a8a 100644 --- a/DiscImageChef.Filesystems/BTRFS.cs +++ b/DiscImageChef.Filesystems/BTRFS.cs @@ -51,24 +51,22 @@ namespace DiscImageChef.Filesystems public BTRFS() { Name = "B-tree file system"; - PluginUUID = new Guid("C904CF15-5222-446B-B7DB-02EAC5D781B3"); + PluginUuid = new Guid("C904CF15-5222-446B-B7DB-02EAC5D781B3"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public BTRFS(Encoding encoding) { Name = "B-tree file system"; - PluginUUID = new Guid("C904CF15-5222-446B-B7DB-02EAC5D781B3"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("C904CF15-5222-446B-B7DB-02EAC5D781B3"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public BTRFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "B-tree file system"; - PluginUUID = new Guid("C904CF15-5222-446B-B7DB-02EAC5D781B3"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("C904CF15-5222-446B-B7DB-02EAC5D781B3"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -159,17 +157,16 @@ namespace DiscImageChef.Filesystems out string information) { StringBuilder sbInformation = new StringBuilder(); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); information = ""; ulong sbSectorOff = 0x10000 / imagePlugin.GetSectorSize(); uint sbSectorSize = 0x1000 / imagePlugin.GetSectorSize(); byte[] sector = imagePlugin.ReadSectors(sbSectorOff + partition.Start, sbSectorSize); - SuperBlock btrfsSb; GCHandle handle = GCHandle.Alloc(sector, GCHandleType.Pinned); - btrfsSb = (SuperBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(SuperBlock)); + SuperBlock btrfsSb = (SuperBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(SuperBlock)); handle.Free(); DicConsole.DebugWriteLine("BTRFS Plugin", "btrfsSb.checksum = {0}", btrfsSb.checksum); @@ -243,15 +240,17 @@ namespace DiscImageChef.Filesystems information = sbInformation.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.Clusters = (long)(btrfsSb.total_bytes / btrfsSb.sectorsize); - xmlFSType.ClusterSize = (int)btrfsSb.sectorsize; - xmlFSType.FreeClusters = xmlFSType.Clusters - (long)(btrfsSb.bytes_used / btrfsSb.sectorsize); - xmlFSType.FreeClustersSpecified = true; - xmlFSType.VolumeName = btrfsSb.label; - xmlFSType.VolumeSerial = $"{btrfsSb.uuid}"; - xmlFSType.VolumeSetIdentifier = $"{btrfsSb.dev_item.device_uuid}"; - xmlFSType.Type = Name; + XmlFsType = new FileSystemType + { + Clusters = (long)(btrfsSb.total_bytes / btrfsSb.sectorsize), + ClusterSize = (int)btrfsSb.sectorsize, + FreeClustersSpecified = true, + VolumeName = btrfsSb.label, + VolumeSerial = $"{btrfsSb.uuid}", + VolumeSetIdentifier = $"{btrfsSb.dev_item.device_uuid}", + Type = Name + }; + XmlFsType.FreeClusters = XmlFsType.Clusters - (long)(btrfsSb.bytes_used / btrfsSb.sectorsize); } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/CBM.cs b/DiscImageChef.Filesystems/CBM.cs index a6a20e60c..91a83aaaf 100644 --- a/DiscImageChef.Filesystems/CBM.cs +++ b/DiscImageChef.Filesystems/CBM.cs @@ -47,21 +47,21 @@ namespace DiscImageChef.Filesystems public CBM() { Name = "Commodore file system"; - PluginUUID = new Guid("D104744E-A376-450C-BAC0-1347C93F983B"); + PluginUuid = new Guid("D104744E-A376-450C-BAC0-1347C93F983B"); CurrentEncoding = new PETSCII(); } public CBM(Encoding encoding) { Name = "Commodore file system"; - PluginUUID = new Guid("D104744E-A376-450C-BAC0-1347C93F983B"); + PluginUuid = new Guid("D104744E-A376-450C-BAC0-1347C93F983B"); CurrentEncoding = new PETSCII(); } public CBM(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Commodore file system"; - PluginUUID = new Guid("D104744E-A376-450C-BAC0-1347C93F983B"); + PluginUuid = new Guid("D104744E-A376-450C-BAC0-1347C93F983B"); CurrentEncoding = new PETSCII(); } @@ -231,10 +231,12 @@ namespace DiscImageChef.Filesystems sbInformation.AppendLine("Commodore file system"); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "Commodore file system"; - xmlFSType.Clusters = (long)imagePlugin.ImageInfo.Sectors; - xmlFSType.ClusterSize = 256; + XmlFsType = new FileSystemType + { + Type = "Commodore file system", + Clusters = (long)imagePlugin.ImageInfo.Sectors, + ClusterSize = 256 + }; if(imagePlugin.ImageInfo.Sectors == 3200) { @@ -258,8 +260,8 @@ namespace DiscImageChef.Filesystems sbInformation.AppendFormat("Disk name: {0}", StringHandlers.CToString(cbmHdr.name, CurrentEncoding)) .AppendLine(); - xmlFSType.VolumeName = StringHandlers.CToString(cbmHdr.name, CurrentEncoding); - xmlFSType.VolumeSerial = $"{cbmHdr.diskId}"; + XmlFsType.VolumeName = StringHandlers.CToString(cbmHdr.name, CurrentEncoding); + XmlFsType.VolumeSerial = $"{cbmHdr.diskId}"; } else { @@ -281,8 +283,8 @@ namespace DiscImageChef.Filesystems sbInformation.AppendFormat("Disk name: {0}", StringHandlers.CToString(cbmBam.name, CurrentEncoding)) .AppendLine(); - xmlFSType.VolumeName = StringHandlers.CToString(cbmBam.name, CurrentEncoding); - xmlFSType.VolumeSerial = $"{cbmBam.diskId}"; + XmlFsType.VolumeName = StringHandlers.CToString(cbmBam.name, CurrentEncoding); + XmlFsType.VolumeSerial = $"{cbmBam.diskId}"; } information = sbInformation.ToString(); diff --git a/DiscImageChef.Filesystems/CPM/CPM.cs b/DiscImageChef.Filesystems/CPM/CPM.cs index bf871d6e2..db8759596 100644 --- a/DiscImageChef.Filesystems/CPM/CPM.cs +++ b/DiscImageChef.Filesystems/CPM/CPM.cs @@ -113,16 +113,15 @@ namespace DiscImageChef.Filesystems.CPM public CPM() { Name = "CP/M File System"; - PluginUUID = new Guid("AA2B8585-41DF-4E3B-8A35-D1A935E2F8A1"); + PluginUuid = new Guid("AA2B8585-41DF-4E3B-8A35-D1A935E2F8A1"); CurrentEncoding = Encoding.GetEncoding("IBM437"); } public CPM(Encoding encoding) { Name = "CP/M File System"; - PluginUUID = new Guid("AA2B8585-41DF-4E3B-8A35-D1A935E2F8A1"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("IBM437"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("AA2B8585-41DF-4E3B-8A35-D1A935E2F8A1"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("IBM437"); } public CPM(ImagePlugin imagePlugin, Partition partition, Encoding encoding) @@ -130,9 +129,8 @@ namespace DiscImageChef.Filesystems.CPM device = imagePlugin; this.partition = partition; Name = "CP/M File System"; - PluginUUID = new Guid("AA2B8585-41DF-4E3B-8A35-D1A935E2F8A1"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("IBM437"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("AA2B8585-41DF-4E3B-8A35-D1A935E2F8A1"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("IBM437"); } } } \ No newline at end of file diff --git a/DiscImageChef.Filesystems/CPM/Definitions.cs b/DiscImageChef.Filesystems/CPM/Definitions.cs index 4cc71ed97..c4145a027 100644 --- a/DiscImageChef.Filesystems/CPM/Definitions.cs +++ b/DiscImageChef.Filesystems/CPM/Definitions.cs @@ -59,18 +59,14 @@ namespace DiscImageChef.Filesystems.CPM { if(def.side1 == null) { - def.side1 = new Side(); - def.side1.sideId = 0; - def.side1.sectorIds = new int[def.sectorsPerTrack]; + def.side1 = new Side {sideId = 0, sectorIds = new int[def.sectorsPerTrack]}; for(int i = 0; i < def.sectorsPerTrack; i++) def.side1.sectorIds[i] = i + 1; } if(def.sides != 2 || def.side2 != null) continue; { - def.side2 = new Side(); - def.side2.sideId = 1; - def.side2.sectorIds = new int[def.sectorsPerTrack]; + def.side2 = new Side {sideId = 1, sectorIds = new int[def.sectorsPerTrack]}; for(int i = 0; i < def.sectorsPerTrack; i++) def.side2.sectorIds[i] = i + 1; } } diff --git a/DiscImageChef.Filesystems/CPM/Dir.cs b/DiscImageChef.Filesystems/CPM/Dir.cs index 1a3b8c3ba..17cb4bc8d 100644 --- a/DiscImageChef.Filesystems/CPM/Dir.cs +++ b/DiscImageChef.Filesystems/CPM/Dir.cs @@ -69,10 +69,9 @@ namespace DiscImageChef.Filesystems.CPM for(int off = 0; off < directory.Length; off += 32) { - DirectoryEntry entry; IntPtr dirPtr = Marshal.AllocHGlobal(32); Marshal.Copy(directory, off, dirPtr, 32); - entry = (DirectoryEntry)Marshal.PtrToStructure(dirPtr, typeof(DirectoryEntry)); + DirectoryEntry entry = (DirectoryEntry)Marshal.PtrToStructure(dirPtr, typeof(DirectoryEntry)); Marshal.FreeHGlobal(dirPtr); if((entry.statusUser & 0x7F) < 0x20) diff --git a/DiscImageChef.Filesystems/CPM/File.cs b/DiscImageChef.Filesystems/CPM/File.cs index dc1c3aaf6..d0d1cbfd7 100644 --- a/DiscImageChef.Filesystems/CPM/File.cs +++ b/DiscImageChef.Filesystems/CPM/File.cs @@ -43,8 +43,6 @@ namespace DiscImageChef.Filesystems.CPM string[] pathElements = path.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries); if(pathElements.Length != 1) return Errno.NotSupported; - FileEntryInfo fInfo; - if(string.IsNullOrEmpty(pathElements[0]) || string.Compare(pathElements[0], "/", StringComparison.OrdinalIgnoreCase) == 0) { @@ -53,18 +51,16 @@ namespace DiscImageChef.Filesystems.CPM return Errno.NoError; } - if(!statCache.TryGetValue(pathElements[0].ToUpperInvariant(), out fInfo)) return Errno.NoSuchFile; + if(!statCache.TryGetValue(pathElements[0].ToUpperInvariant(), out FileEntryInfo fInfo)) return Errno.NoSuchFile; attributes = fInfo.Attributes; return Errno.NoError; } + // TODO: Implementing this would require storing the interleaving public override Errno MapBlock(string path, long fileBlock, ref long deviceBlock) { - if(!mounted) return Errno.AccessDenied; - - // TODO: Implementing this would require storing the interleaving - return Errno.NotImplemented; + return !mounted ? Errno.AccessDenied : Errno.NotImplemented; } public override Errno Read(string path, long offset, long size, ref byte[] buf) @@ -82,9 +78,7 @@ namespace DiscImageChef.Filesystems.CPM string[] pathElements = path.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries); if(pathElements.Length != 1) return Errno.NotSupported; - byte[] file; - - if(!fileCache.TryGetValue(pathElements[0].ToUpperInvariant(), out file)) return Errno.NoSuchFile; + if(!fileCache.TryGetValue(pathElements[0].ToUpperInvariant(), out byte[] file)) return Errno.NoSuchFile; if(offset >= file.Length) return Errno.EINVAL; @@ -114,7 +108,7 @@ namespace DiscImageChef.Filesystems.CPM if(labelCreationDate != null) stat.CreationTime = DateHandlers.CPMToDateTime(labelCreationDate); if(labelUpdateDate != null) stat.StatusChangeTime = DateHandlers.CPMToDateTime(labelUpdateDate); stat.Attributes = FileAttributes.Directory; - stat.BlockSize = xmlFSType.ClusterSize; + stat.BlockSize = XmlFsType.ClusterSize; return Errno.NoError; } diff --git a/DiscImageChef.Filesystems/CPM/Info.cs b/DiscImageChef.Filesystems/CPM/Info.cs index baf4605a6..e730c69c5 100644 --- a/DiscImageChef.Filesystems/CPM/Info.cs +++ b/DiscImageChef.Filesystems/CPM/Info.cs @@ -164,9 +164,7 @@ namespace DiscImageChef.Filesystems.CPM try { byte[] sector; - ulong sectorCount; ulong sectorSize; - ulong sides; ulong firstDirectorySector; byte[] directory = null; workingDefinition = null; @@ -200,8 +198,8 @@ namespace DiscImageChef.Filesystems.CPM amsSb.format == 2 && (amsSb.sidedness & 0x02) == 2) { // Calculate device limits - sides = (ulong)(amsSb.format == 0 ? 1 : 2); - sectorCount = (ulong)(amsSb.tps * amsSb.spt * (byte)sides); + ulong sides = (ulong)(amsSb.format == 0 ? 1 : 2); + ulong sectorCount = (ulong)(amsSb.tps * amsSb.spt * (byte)sides); sectorSize = (ulong)(128 << amsSb.psh); // Compare device limits from superblock to real limits @@ -211,10 +209,12 @@ namespace DiscImageChef.Filesystems.CPM firstDirectorySector = (ulong)(amsSb.off * amsSb.spt); // Build a DiscParameterBlock - dpb = new DiscParameterBlock(); - dpb.al0 = sectorCount == 1440 ? (byte)0xF0 : (byte)0xC0; - dpb.spt = amsSb.spt; - dpb.bsh = amsSb.bsh; + dpb = new DiscParameterBlock + { + al0 = sectorCount == 1440 ? (byte)0xF0 : (byte)0xC0, + spt = amsSb.spt, + bsh = amsSb.bsh + }; for(int i = 0; i < dpb.bsh; i++) dpb.blm += (byte)Math.Pow(2, i); if(sectorCount >= 1440) @@ -239,27 +239,27 @@ namespace DiscImageChef.Filesystems.CPM directoryLength); // Build a CP/M disk definition - workingDefinition = new CpmDefinition(); - workingDefinition.al0 = dpb.al0; - workingDefinition.al1 = dpb.al1; - workingDefinition.bitrate = "LOW"; - workingDefinition.blm = dpb.blm; - workingDefinition.bsh = dpb.bsh; - workingDefinition.bytesPerSector = 512; - workingDefinition.cylinders = amsSb.tps; - workingDefinition.drm = dpb.drm; - workingDefinition.dsm = dpb.dsm; - workingDefinition.encoding = "MFM"; - workingDefinition.evenOdd = false; - workingDefinition.exm = dpb.exm; - workingDefinition.label = null; - workingDefinition.comment = "Amstrad PCW superblock"; - workingDefinition.ofs = dpb.off; - workingDefinition.sectorsPerTrack = amsSb.spt; + workingDefinition = new CpmDefinition + { + al0 = dpb.al0, + al1 = dpb.al1, + bitrate = "LOW", + blm = dpb.blm, + bsh = dpb.bsh, + bytesPerSector = 512, + cylinders = amsSb.tps, + drm = dpb.drm, + dsm = dpb.dsm, + encoding = "MFM", + evenOdd = false, + exm = dpb.exm, + label = null, + comment = "Amstrad PCW superblock", + ofs = dpb.off, + sectorsPerTrack = amsSb.spt, + side1 = new Side {sideId = 0, sectorIds = new int[amsSb.spt]} + }; - workingDefinition.side1 = new Side(); - workingDefinition.side1.sideId = 0; - workingDefinition.side1.sectorIds = new int[amsSb.spt]; for(int si = 0; si < amsSb.spt; si++) workingDefinition.side1.sectorIds[si] = si + 1; if(amsSb.format == 2) @@ -273,9 +273,7 @@ namespace DiscImageChef.Filesystems.CPM break; } - workingDefinition.side2 = new Side(); - workingDefinition.side2.sideId = 1; - workingDefinition.side2.sectorIds = new int[amsSb.spt]; + workingDefinition.side2 = new Side {sideId = 1, sectorIds = new int[amsSb.spt]}; for(int si = 0; si < amsSb.spt; si++) workingDefinition.side2.sectorIds[si] = si + 1; } else workingDefinition.order = null; @@ -323,56 +321,59 @@ namespace DiscImageChef.Filesystems.CPM firstDirectorySector = (ulong)(hddSb.off * hddSb.sectorsPerTrack); // Build a DiscParameterBlock - dpb = new DiscParameterBlock(); - dpb.al0 = (byte)hddSb.al0; - dpb.al1 = (byte)hddSb.al1; - dpb.blm = hddSb.blm; - dpb.bsh = hddSb.bsh; - dpb.cks = hddSb.cks; - dpb.drm = hddSb.drm; - dpb.dsm = hddSb.dsm; - dpb.exm = hddSb.exm; - dpb.off = hddSb.off; - dpb.phm = 0; // Needed? - dpb.psh = 0; // Needed? - dpb.spt = hddSb.spt; + dpb = new DiscParameterBlock + { + al0 = (byte)hddSb.al0, + al1 = (byte)hddSb.al1, + blm = hddSb.blm, + bsh = hddSb.bsh, + cks = hddSb.cks, + drm = hddSb.drm, + dsm = hddSb.dsm, + exm = hddSb.exm, + off = hddSb.off, + // Needed? + phm = 0, + // Needed? + psh = 0, + spt = hddSb.spt + }; + uint directoryLength = (uint)(((ulong)dpb.drm + 1) * 32 / sectorSize); directory = imagePlugin.ReadSectors(firstDirectorySector + partition.Start, directoryLength); DicConsole.DebugWriteLine("CP/M Plugin", "Found CP/M-86 hard disk superblock."); // Build a CP/M disk definition - workingDefinition = new CpmDefinition(); - workingDefinition.al0 = dpb.al0; - workingDefinition.al1 = dpb.al1; - workingDefinition.bitrate = "HIGH"; - workingDefinition.blm = dpb.blm; - workingDefinition.bsh = dpb.bsh; - workingDefinition.bytesPerSector = 512; - workingDefinition.cylinders = hddSb.cylinders; - workingDefinition.drm = dpb.drm; - workingDefinition.dsm = dpb.dsm; - workingDefinition.encoding = "MFM"; - workingDefinition.evenOdd = false; - workingDefinition.exm = dpb.exm; - workingDefinition.label = null; - workingDefinition.comment = "CP/M-86 hard disk superblock"; - workingDefinition.ofs = dpb.off; - workingDefinition.sectorsPerTrack = hddSb.sectorsPerTrack; - workingDefinition.side1 = new Side(); - workingDefinition.side1.sideId = 0; - workingDefinition.side1.sectorIds = new int[hddSb.sectorsPerTrack]; + workingDefinition = new CpmDefinition + { + al0 = dpb.al0, + al1 = dpb.al1, + bitrate = "HIGH", + blm = dpb.blm, + bsh = dpb.bsh, + bytesPerSector = 512, + cylinders = hddSb.cylinders, + drm = dpb.drm, + dsm = dpb.dsm, + encoding = "MFM", + evenOdd = false, + exm = dpb.exm, + label = null, + comment = "CP/M-86 hard disk superblock", + ofs = dpb.off, + sectorsPerTrack = hddSb.sectorsPerTrack, + side1 = new Side {sideId = 0, sectorIds = new int[hddSb.sectorsPerTrack]}, + order = "SIDES", + side2 = new Side {sideId = 1, sectorIds = new int[hddSb.sectorsPerTrack]}, + skew = 0, + sofs = 0 + }; + for(int si = 0; si < hddSb.sectorsPerTrack; si++) workingDefinition.side1.sectorIds[si] = si + 1; - - workingDefinition.order = "SIDES"; - workingDefinition.side2 = new Side(); - workingDefinition.side2.sideId = 1; - workingDefinition.side2.sectorIds = new int[hddSb.sectorsPerTrack]; for(int si = 0; si < hddSb.spt; si++) workingDefinition.side2.sectorIds[si] = si + 1; - workingDefinition.skew = 0; - workingDefinition.sofs = 0; } } } @@ -404,44 +405,46 @@ namespace DiscImageChef.Filesystems.CPM { cpmFound = true; firstDirectorySector86 = 8; - dpb = new DiscParameterBlock(); - dpb.al0 = 0xC0; - dpb.al1 = 0; - dpb.blm = 7; - dpb.bsh = 3; - dpb.cks = 0x10; - dpb.drm = 0x3F; - dpb.dsm = 0x9B; - dpb.exm = 0; - dpb.off = 1; - dpb.phm = 3; - dpb.psh = 2; - dpb.spt = 8 * 4; + dpb = new DiscParameterBlock + { + al0 = 0xC0, + al1 = 0, + blm = 7, + bsh = 3, + cks = 0x10, + drm = 0x3F, + dsm = 0x9B, + exm = 0, + off = 1, + phm = 3, + psh = 2, + spt = 8 * 4 + }; + + workingDefinition = new CpmDefinition + { + al0 = dpb.al0, + al1 = dpb.al1, + bitrate = "LOW", + blm = dpb.blm, + bsh = dpb.bsh, + bytesPerSector = 512, + cylinders = 40, + drm = dpb.drm, + dsm = dpb.dsm, + encoding = "MFM", + evenOdd = false, + exm = dpb.exm, + label = null, + comment = "CP/M-86 floppy identifier", + ofs = dpb.off, + sectorsPerTrack = 8, + side1 = new Side {sideId = 0, sectorIds = new int[8]}, + skew = 0, + sofs = 0 + }; - workingDefinition = new CpmDefinition(); - workingDefinition.al0 = dpb.al0; - workingDefinition.al1 = dpb.al1; - workingDefinition.bitrate = "LOW"; - workingDefinition.blm = dpb.blm; - workingDefinition.bsh = dpb.bsh; - workingDefinition.bytesPerSector = 512; - workingDefinition.cylinders = 40; - workingDefinition.drm = dpb.drm; - workingDefinition.dsm = dpb.dsm; - workingDefinition.encoding = "MFM"; - workingDefinition.evenOdd = false; - workingDefinition.exm = dpb.exm; - workingDefinition.label = null; - workingDefinition.comment = "CP/M-86 floppy identifier"; - workingDefinition.ofs = dpb.off; - workingDefinition.sectorsPerTrack = 8; - workingDefinition.side1 = new Side(); - workingDefinition.side1.sideId = 0; - workingDefinition.side1.sectorIds = new int[8]; for(int si = 0; si < 8; si++) workingDefinition.side1.sectorIds[si] = si + 1; - - workingDefinition.skew = 0; - workingDefinition.sofs = 0; } break; @@ -450,50 +453,49 @@ namespace DiscImageChef.Filesystems.CPM { cpmFound = true; firstDirectorySector86 = 16; - dpb = new DiscParameterBlock(); - dpb.al0 = 0x80; - dpb.al1 = 0; - dpb.blm = 0x0F; - dpb.bsh = 4; - dpb.cks = 0x10; - dpb.drm = 0x3F; - dpb.dsm = 0x9D; - dpb.exm = 1; - dpb.off = 2; - dpb.phm = 3; - dpb.psh = 2; - dpb.spt = 8 * 4; + dpb = new DiscParameterBlock + { + al0 = 0x80, + al1 = 0, + blm = 0x0F, + bsh = 4, + cks = 0x10, + drm = 0x3F, + dsm = 0x9D, + exm = 1, + off = 2, + phm = 3, + psh = 2, + spt = 8 * 4 + }; + + workingDefinition = new CpmDefinition + { + al0 = dpb.al0, + al1 = dpb.al1, + bitrate = "LOW", + blm = dpb.blm, + bsh = dpb.bsh, + bytesPerSector = 512, + cylinders = 40, + drm = dpb.drm, + dsm = dpb.dsm, + encoding = "MFM", + evenOdd = false, + exm = dpb.exm, + label = null, + comment = "CP/M-86 floppy identifier", + ofs = dpb.off, + sectorsPerTrack = 8, + side1 = new Side {sideId = 0, sectorIds = new int[8]}, + order = "SIDES", + side2 = new Side {sideId = 1, sectorIds = new int[8]}, + skew = 0, + sofs = 0 + }; - workingDefinition = new CpmDefinition(); - workingDefinition.al0 = dpb.al0; - workingDefinition.al1 = dpb.al1; - workingDefinition.bitrate = "LOW"; - workingDefinition.blm = dpb.blm; - workingDefinition.bsh = dpb.bsh; - workingDefinition.bytesPerSector = 512; - workingDefinition.cylinders = 40; - workingDefinition.drm = dpb.drm; - workingDefinition.dsm = dpb.dsm; - workingDefinition.encoding = "MFM"; - workingDefinition.evenOdd = false; - workingDefinition.exm = dpb.exm; - workingDefinition.label = null; - workingDefinition.comment = "CP/M-86 floppy identifier"; - workingDefinition.ofs = dpb.off; - workingDefinition.sectorsPerTrack = 8; - workingDefinition.side1 = new Side(); - workingDefinition.side1.sideId = 0; - workingDefinition.side1.sectorIds = new int[8]; for(int si = 0; si < 8; si++) workingDefinition.side1.sectorIds[si] = si + 1; - - workingDefinition.order = "SIDES"; - workingDefinition.side2 = new Side(); - workingDefinition.side2.sideId = 1; - workingDefinition.side2.sectorIds = new int[8]; for(int si = 0; si < 8; si++) workingDefinition.side2.sectorIds[si] = si + 1; - - workingDefinition.skew = 0; - workingDefinition.sofs = 0; } break; @@ -504,50 +506,49 @@ namespace DiscImageChef.Filesystems.CPM { cpmFound = true; firstDirectorySector86 = 36; - dpb = new DiscParameterBlock(); - dpb.al0 = 0x80; - dpb.al1 = 0; - dpb.blm = 0x0F; - dpb.bsh = 4; - dpb.cks = 0x10; - dpb.drm = 0x3F; - dpb.dsm = 0; // Unknown. Needed? - dpb.exm = 1; - dpb.off = 4; - dpb.phm = 3; - dpb.psh = 2; - dpb.spt = 9 * 4; + dpb = new DiscParameterBlock + { + al0 = 0x80, + al1 = 0, + blm = 0x0F, + bsh = 4, + cks = 0x10, + drm = 0x3F, + dsm = 0, // Unknown. Needed? + exm = 1, + off = 4, + phm = 3, + psh = 2, + spt = 9 * 4 + }; + + workingDefinition = new CpmDefinition + { + al0 = dpb.al0, + al1 = dpb.al1, + bitrate = "LOW", + blm = dpb.blm, + bsh = dpb.bsh, + bytesPerSector = 512, + cylinders = 40, + drm = dpb.drm, + dsm = dpb.dsm, + encoding = "MFM", + evenOdd = false, + exm = dpb.exm, + label = null, + comment = "CP/M-86 floppy identifier", + ofs = dpb.off, + sectorsPerTrack = 9, + side1 = new Side {sideId = 0, sectorIds = new int[9]}, + order = "SIDES", + side2 = new Side {sideId = 1, sectorIds = new int[9]}, + skew = 0, + sofs = 0 + }; - workingDefinition = new CpmDefinition(); - workingDefinition.al0 = dpb.al0; - workingDefinition.al1 = dpb.al1; - workingDefinition.bitrate = "LOW"; - workingDefinition.blm = dpb.blm; - workingDefinition.bsh = dpb.bsh; - workingDefinition.bytesPerSector = 512; - workingDefinition.cylinders = 40; - workingDefinition.drm = dpb.drm; - workingDefinition.dsm = dpb.dsm; - workingDefinition.encoding = "MFM"; - workingDefinition.evenOdd = false; - workingDefinition.exm = dpb.exm; - workingDefinition.label = null; - workingDefinition.comment = "CP/M-86 floppy identifier"; - workingDefinition.ofs = dpb.off; - workingDefinition.sectorsPerTrack = 9; - workingDefinition.side1 = new Side(); - workingDefinition.side1.sideId = 0; - workingDefinition.side1.sectorIds = new int[9]; for(int si = 0; si < 9; si++) workingDefinition.side1.sectorIds[si] = si + 1; - - workingDefinition.order = "SIDES"; - workingDefinition.side2 = new Side(); - workingDefinition.side2.sideId = 1; - workingDefinition.side2.sectorIds = new int[9]; for(int si = 0; si < 9; si++) workingDefinition.side2.sectorIds[si] = si + 1; - - workingDefinition.skew = 0; - workingDefinition.sofs = 0; } break; @@ -557,50 +558,49 @@ namespace DiscImageChef.Filesystems.CPM { cpmFound = true; firstDirectorySector86 = 36; - dpb = new DiscParameterBlock(); - dpb.al0 = 0xF0; - dpb.al1 = 0; - dpb.blm = 0x0F; - dpb.bsh = 4; - dpb.cks = 0x40; - dpb.drm = 0xFF; - dpb.dsm = 0x15E; - dpb.exm = 0; - dpb.off = 4; - dpb.phm = 3; - dpb.psh = 2; - dpb.spt = 9 * 4; + dpb = new DiscParameterBlock + { + al0 = 0xF0, + al1 = 0, + blm = 0x0F, + bsh = 4, + cks = 0x40, + drm = 0xFF, + dsm = 0x15E, + exm = 0, + off = 4, + phm = 3, + psh = 2, + spt = 9 * 4 + }; + + workingDefinition = new CpmDefinition + { + al0 = dpb.al0, + al1 = dpb.al1, + bitrate = "LOW", + blm = dpb.blm, + bsh = dpb.bsh, + bytesPerSector = 512, + cylinders = 80, + drm = dpb.drm, + dsm = dpb.dsm, + encoding = "MFM", + evenOdd = false, + exm = dpb.exm, + label = null, + comment = "CP/M-86 floppy identifier", + ofs = dpb.off, + sectorsPerTrack = 9, + side1 = new Side {sideId = 0, sectorIds = new int[9]}, + order = "SIDES", + side2 = new Side {sideId = 1, sectorIds = new int[9]}, + skew = 0, + sofs = 0 + }; - workingDefinition = new CpmDefinition(); - workingDefinition.al0 = dpb.al0; - workingDefinition.al1 = dpb.al1; - workingDefinition.bitrate = "LOW"; - workingDefinition.blm = dpb.blm; - workingDefinition.bsh = dpb.bsh; - workingDefinition.bytesPerSector = 512; - workingDefinition.cylinders = 80; - workingDefinition.drm = dpb.drm; - workingDefinition.dsm = dpb.dsm; - workingDefinition.encoding = "MFM"; - workingDefinition.evenOdd = false; - workingDefinition.exm = dpb.exm; - workingDefinition.label = null; - workingDefinition.comment = "CP/M-86 floppy identifier"; - workingDefinition.ofs = dpb.off; - workingDefinition.sectorsPerTrack = 9; - workingDefinition.side1 = new Side(); - workingDefinition.side1.sideId = 0; - workingDefinition.side1.sectorIds = new int[9]; for(int si = 0; si < 9; si++) workingDefinition.side1.sectorIds[si] = si + 1; - - workingDefinition.order = "SIDES"; - workingDefinition.side2 = new Side(); - workingDefinition.side2.sideId = 1; - workingDefinition.side2.sectorIds = new int[9]; for(int si = 0; si < 9; si++) workingDefinition.side2.sectorIds[si] = si + 1; - - workingDefinition.skew = 0; - workingDefinition.sofs = 0; } break; @@ -609,50 +609,49 @@ namespace DiscImageChef.Filesystems.CPM { cpmFound = true; firstDirectorySector86 = 18; - dpb = new DiscParameterBlock(); - dpb.al0 = 0xF0; - dpb.al1 = 0; - dpb.blm = 0x0F; - dpb.bsh = 4; - dpb.cks = 0x40; - dpb.drm = 0xFF; - dpb.dsm = 0x162; - dpb.exm = 0; - dpb.off = 2; - dpb.phm = 3; - dpb.psh = 2; - dpb.spt = 9 * 4; + dpb = new DiscParameterBlock + { + al0 = 0xF0, + al1 = 0, + blm = 0x0F, + bsh = 4, + cks = 0x40, + drm = 0xFF, + dsm = 0x162, + exm = 0, + off = 2, + phm = 3, + psh = 2, + spt = 9 * 4 + }; + + workingDefinition = new CpmDefinition + { + al0 = dpb.al0, + al1 = dpb.al1, + bitrate = "LOW", + blm = dpb.blm, + bsh = dpb.bsh, + bytesPerSector = 512, + cylinders = 80, + drm = dpb.drm, + dsm = dpb.dsm, + encoding = "MFM", + evenOdd = false, + exm = dpb.exm, + label = null, + comment = "CP/M-86 floppy identifier", + ofs = dpb.off, + sectorsPerTrack = 9, + side1 = new Side {sideId = 0, sectorIds = new int[9]}, + order = "CYLINDERS", + side2 = new Side {sideId = 1, sectorIds = new int[9]}, + skew = 0, + sofs = 0 + }; - workingDefinition = new CpmDefinition(); - workingDefinition.al0 = dpb.al0; - workingDefinition.al1 = dpb.al1; - workingDefinition.bitrate = "LOW"; - workingDefinition.blm = dpb.blm; - workingDefinition.bsh = dpb.bsh; - workingDefinition.bytesPerSector = 512; - workingDefinition.cylinders = 80; - workingDefinition.drm = dpb.drm; - workingDefinition.dsm = dpb.dsm; - workingDefinition.encoding = "MFM"; - workingDefinition.evenOdd = false; - workingDefinition.exm = dpb.exm; - workingDefinition.label = null; - workingDefinition.comment = "CP/M-86 floppy identifier"; - workingDefinition.ofs = dpb.off; - workingDefinition.sectorsPerTrack = 9; - workingDefinition.side1 = new Side(); - workingDefinition.side1.sideId = 0; - workingDefinition.side1.sectorIds = new int[9]; for(int si = 0; si < 9; si++) workingDefinition.side1.sectorIds[si] = si + 1; - - workingDefinition.order = "CYLINDERS"; - workingDefinition.side2 = new Side(); - workingDefinition.side2.sideId = 1; - workingDefinition.side2.sectorIds = new int[9]; for(int si = 0; si < 9; si++) workingDefinition.side2.sectorIds[si] = si + 1; - - workingDefinition.skew = 0; - workingDefinition.sofs = 0; } break; @@ -661,50 +660,49 @@ namespace DiscImageChef.Filesystems.CPM { cpmFound = true; firstDirectorySector86 = 30; - dpb = new DiscParameterBlock(); - dpb.al0 = 0xC0; - dpb.al1 = 0; - dpb.blm = 0x1F; - dpb.bsh = 5; - dpb.cks = 0x40; - dpb.drm = 0xFF; - dpb.dsm = 0x127; - dpb.exm = 1; - dpb.off = 2; - dpb.phm = 3; - dpb.psh = 2; - dpb.spt = 15 * 4; + dpb = new DiscParameterBlock + { + al0 = 0xC0, + al1 = 0, + blm = 0x1F, + bsh = 5, + cks = 0x40, + drm = 0xFF, + dsm = 0x127, + exm = 1, + off = 2, + phm = 3, + psh = 2, + spt = 15 * 4 + }; + + workingDefinition = new CpmDefinition + { + al0 = dpb.al0, + al1 = dpb.al1, + bitrate = "HIGH", + blm = dpb.blm, + bsh = dpb.bsh, + bytesPerSector = 512, + cylinders = 80, + drm = dpb.drm, + dsm = dpb.dsm, + encoding = "MFM", + evenOdd = false, + exm = dpb.exm, + label = null, + comment = "CP/M-86 floppy identifier", + ofs = dpb.off, + sectorsPerTrack = 15, + side1 = new Side {sideId = 0, sectorIds = new int[15]}, + order = "CYLINDERS", + side2 = new Side {sideId = 1, sectorIds = new int[15]}, + skew = 0, + sofs = 0 + }; - workingDefinition = new CpmDefinition(); - workingDefinition.al0 = dpb.al0; - workingDefinition.al1 = dpb.al1; - workingDefinition.bitrate = "HIGH"; - workingDefinition.blm = dpb.blm; - workingDefinition.bsh = dpb.bsh; - workingDefinition.bytesPerSector = 512; - workingDefinition.cylinders = 80; - workingDefinition.drm = dpb.drm; - workingDefinition.dsm = dpb.dsm; - workingDefinition.encoding = "MFM"; - workingDefinition.evenOdd = false; - workingDefinition.exm = dpb.exm; - workingDefinition.label = null; - workingDefinition.comment = "CP/M-86 floppy identifier"; - workingDefinition.ofs = dpb.off; - workingDefinition.sectorsPerTrack = 15; - workingDefinition.side1 = new Side(); - workingDefinition.side1.sideId = 0; - workingDefinition.side1.sectorIds = new int[15]; for(int si = 0; si < 15; si++) workingDefinition.side1.sectorIds[si] = si + 1; - - workingDefinition.order = "CYLINDERS"; - workingDefinition.side2 = new Side(); - workingDefinition.side2.sideId = 1; - workingDefinition.side2.sectorIds = new int[15]; for(int si = 0; si < 15; si++) workingDefinition.side2.sectorIds[si] = si + 1; - - workingDefinition.skew = 0; - workingDefinition.sofs = 0; } break; @@ -713,50 +711,49 @@ namespace DiscImageChef.Filesystems.CPM { cpmFound = true; firstDirectorySector86 = 36; - dpb = new DiscParameterBlock(); - dpb.al0 = 0xC0; - dpb.al1 = 0; - dpb.blm = 0x1F; - dpb.bsh = 5; - dpb.cks = 0x40; - dpb.drm = 0xFF; - dpb.dsm = 0x162; - dpb.exm = 1; - dpb.off = 2; - dpb.phm = 3; - dpb.psh = 2; - dpb.spt = 18 * 4; + dpb = new DiscParameterBlock + { + al0 = 0xC0, + al1 = 0, + blm = 0x1F, + bsh = 5, + cks = 0x40, + drm = 0xFF, + dsm = 0x162, + exm = 1, + off = 2, + phm = 3, + psh = 2, + spt = 18 * 4 + }; + + workingDefinition = new CpmDefinition + { + al0 = dpb.al0, + al1 = dpb.al1, + bitrate = "LOW", + blm = dpb.blm, + bsh = dpb.bsh, + bytesPerSector = 512, + cylinders = 80, + drm = dpb.drm, + dsm = dpb.dsm, + encoding = "MFM", + evenOdd = false, + exm = dpb.exm, + label = null, + comment = "CP/M-86 floppy identifier", + ofs = dpb.off, + sectorsPerTrack = 18, + side1 = new Side {sideId = 0, sectorIds = new int[18]}, + order = "CYLINDERS", + side2 = new Side {sideId = 1, sectorIds = new int[18]}, + skew = 0, + sofs = 0 + }; - workingDefinition = new CpmDefinition(); - workingDefinition.al0 = dpb.al0; - workingDefinition.al1 = dpb.al1; - workingDefinition.bitrate = "LOW"; - workingDefinition.blm = dpb.blm; - workingDefinition.bsh = dpb.bsh; - workingDefinition.bytesPerSector = 512; - workingDefinition.cylinders = 80; - workingDefinition.drm = dpb.drm; - workingDefinition.dsm = dpb.dsm; - workingDefinition.encoding = "MFM"; - workingDefinition.evenOdd = false; - workingDefinition.exm = dpb.exm; - workingDefinition.label = null; - workingDefinition.comment = "CP/M-86 floppy identifier"; - workingDefinition.ofs = dpb.off; - workingDefinition.sectorsPerTrack = 18; - workingDefinition.side1 = new Side(); - workingDefinition.side1.sideId = 0; - workingDefinition.side1.sectorIds = new int[18]; for(int si = 0; si < 18; si++) workingDefinition.side1.sectorIds[si] = si + 1; - - workingDefinition.order = "CYLINDERS"; - workingDefinition.side2 = new Side(); - workingDefinition.side2.sideId = 1; - workingDefinition.side2.sectorIds = new int[18]; for(int si = 0; si < 18; si++) workingDefinition.side2.sectorIds[si] = si + 1; - - workingDefinition.skew = 0; - workingDefinition.sofs = 0; } break; @@ -787,8 +784,7 @@ namespace DiscImageChef.Filesystems.CPM { // Load all definitions DicConsole.DebugWriteLine("CP/M Plugin", "Trying to load definitions."); - if(LoadDefinitions() && definitions != null && definitions.definitions != null && - definitions.definitions.Count > 0) + if(LoadDefinitions() && definitions?.definitions != null && definitions.definitions.Count > 0) { DicConsole.DebugWriteLine("CP/M Plugin", "Trying all known definitions."); foreach(CpmDefinition def in from def in definitions.definitions let sectors = (ulong)(def.cylinders * def.sides * def.sectorsPerTrack) where sectors == imagePlugin.GetSectors() && def.bytesPerSector == imagePlugin.GetSectorSize() select def) { @@ -889,16 +885,20 @@ namespace DiscImageChef.Filesystems.CPM // Build a Disc Parameter Block workingDefinition = def; - dpb = new DiscParameterBlock(); - dpb.al0 = (byte)def.al0; - dpb.al1 = (byte)def.al1; - dpb.blm = (byte)def.blm; - dpb.bsh = (byte)def.bsh; - dpb.cks = 0; // Needed? - dpb.drm = (ushort)def.drm; - dpb.dsm = (ushort)def.dsm; - dpb.exm = (byte)def.exm; - dpb.off = (ushort)def.ofs; + dpb = new DiscParameterBlock + { + al0 = (byte)def.al0, + al1 = (byte)def.al1, + blm = (byte)def.blm, + bsh = (byte)def.bsh, + // Needed? + cks = 0, + drm = (ushort)def.drm, + dsm = (ushort)def.dsm, + exm = (byte)def.exm, + off = (ushort)def.ofs, + spt = (ushort)(def.sectorsPerTrack * def.bytesPerSector / 128) + }; switch(def.bytesPerSector) { case 128: @@ -939,7 +939,6 @@ namespace DiscImageChef.Filesystems.CPM break; } - dpb.spt = (ushort)(def.sectorsPerTrack * def.bytesPerSector / 128); cpmFound = true; workingDefinition = def; @@ -991,12 +990,9 @@ namespace DiscImageChef.Filesystems.CPM workingDefinition.ofs * workingDefinition.sectorsPerTrack, workingDefinition.ofs) .AppendLine(); - int interleaveSide1; - int interleaveSide2; - if(workingDefinition.side1.sectorIds.Length >= 2) { - interleaveSide1 = workingDefinition.side1.sectorIds[1] - workingDefinition.side1.sectorIds[0]; + int interleaveSide1 = workingDefinition.side1.sectorIds[1] - workingDefinition.side1.sectorIds[0]; if(interleaveSide1 > 1) sb.AppendFormat("Side 0 uses {0}:1 software interleaving", interleaveSide1).AppendLine(); } @@ -1005,7 +1001,7 @@ namespace DiscImageChef.Filesystems.CPM { if(workingDefinition.side2.sectorIds.Length >= 2) { - interleaveSide2 = workingDefinition.side2.sectorIds[1] - workingDefinition.side2.sectorIds[0]; + int interleaveSide2 = workingDefinition.side2.sectorIds[1] - workingDefinition.side2.sectorIds[0]; if(interleaveSide2 > 1) sb.AppendFormat("Side 1 uses {0}:1 software interleaving", interleaveSide2).AppendLine(); } @@ -1046,23 +1042,23 @@ namespace DiscImageChef.Filesystems.CPM if(labelUpdateDate != null) sb.AppendFormat("Volume updated on {0}", DateHandlers.CPMToDateTime(labelUpdateDate)).AppendLine(); - xmlFSType = new FileSystemType(); - xmlFSType.Bootable |= workingDefinition.sofs > 0 || workingDefinition.ofs > 0; - xmlFSType.ClusterSize = 128 << dpb.bsh; - if(dpb.dsm > 0) xmlFSType.Clusters = dpb.dsm; - else xmlFSType.Clusters = (long)(partition.End - partition.Start); + XmlFsType = new FileSystemType(); + XmlFsType.Bootable |= workingDefinition.sofs > 0 || workingDefinition.ofs > 0; + XmlFsType.ClusterSize = 128 << dpb.bsh; + if(dpb.dsm > 0) XmlFsType.Clusters = dpb.dsm; + else XmlFsType.Clusters = (long)(partition.End - partition.Start); if(labelCreationDate != null) { - xmlFSType.CreationDate = DateHandlers.CPMToDateTime(labelCreationDate); - xmlFSType.CreationDateSpecified = true; + XmlFsType.CreationDate = DateHandlers.CPMToDateTime(labelCreationDate); + XmlFsType.CreationDateSpecified = true; } if(labelUpdateDate != null) { - xmlFSType.ModificationDate = DateHandlers.CPMToDateTime(labelUpdateDate); - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.CPMToDateTime(labelUpdateDate); + XmlFsType.ModificationDateSpecified = true; } - xmlFSType.Type = "CP/M"; - xmlFSType.VolumeName = label; + XmlFsType.Type = "CP/M"; + XmlFsType.VolumeName = label; information = sb.ToString(); } diff --git a/DiscImageChef.Filesystems/CPM/Super.cs b/DiscImageChef.Filesystems/CPM/Super.cs index 85a89332b..652989024 100644 --- a/DiscImageChef.Filesystems/CPM/Super.cs +++ b/DiscImageChef.Filesystems/CPM/Super.cs @@ -149,8 +149,7 @@ namespace DiscImageChef.Filesystems.CPM // For each volume sector for(ulong a = 0; a < (ulong)deinterleavedSectors.Count; a++) { - byte[] sector; - deinterleavedSectors.TryGetValue(a, out sector); + deinterleavedSectors.TryGetValue(a, out byte[] sector); // May it happen? Just in case, CP/M blocks are smaller than physical sectors if(sector.Length > blockSize) @@ -187,8 +186,7 @@ namespace DiscImageChef.Filesystems.CPM MemoryStream dirMs = new MemoryStream(); for(int d = 0; d < dirSectors; d++) { - byte[] sector; - deinterleavedSectors.TryGetValue((ulong)(d + dirOff), out sector); + deinterleavedSectors.TryGetValue((ulong)(d + dirOff), out byte[] sector); dirMs.Write(sector, 0, sector.Length); } @@ -219,10 +217,9 @@ namespace DiscImageChef.Filesystems.CPM if((directory[dOff] & 0x7F) < 0x10) if(allocationBlocks.Count > 256) { - DirectoryEntry16 entry; dirPtr = Marshal.AllocHGlobal(32); Marshal.Copy(directory, dOff, dirPtr, 32); - entry = (DirectoryEntry16)Marshal.PtrToStructure(dirPtr, typeof(DirectoryEntry16)); + DirectoryEntry16 entry = (DirectoryEntry16)Marshal.PtrToStructure(dirPtr, typeof(DirectoryEntry16)); Marshal.FreeHGlobal(dirPtr); bool hidden = (entry.statusUser & 0x80) == 0x80; @@ -254,24 +251,18 @@ namespace DiscImageChef.Filesystems.CPM if(!string.IsNullOrEmpty(extension)) filename = filename + "." + extension; int entryNo = (32 * entry.extentCounter + entry.extentCounterHigh) / (dpb.exm + 1); - List blocks; - Dictionary> extentBlocks; - FileEntryInfo fInfo; // Do we have a stat for the file already? - if(statCache.TryGetValue(filename, out fInfo)) statCache.Remove(filename); + if(statCache.TryGetValue(filename, out FileEntryInfo fInfo)) statCache.Remove(filename); else - { - fInfo = new FileEntryInfo(); - fInfo.Attributes = new FileAttributes(); - } + { fInfo = new FileEntryInfo {Attributes = new FileAttributes()}; } // And any extent? - if(fileExtents.TryGetValue(filename, out extentBlocks)) fileExtents.Remove(filename); + if(fileExtents.TryGetValue(filename, out Dictionary> extentBlocks)) fileExtents.Remove(filename); else extentBlocks = new Dictionary>(); // Do we already have this extent? Should never happen - if(extentBlocks.TryGetValue(entryNo, out blocks)) extentBlocks.Remove(entryNo); + if(extentBlocks.TryGetValue(entryNo, out List blocks)) extentBlocks.Remove(entryNo); else blocks = new List(); // Attributes @@ -313,10 +304,9 @@ namespace DiscImageChef.Filesystems.CPM } else { - DirectoryEntry entry; dirPtr = Marshal.AllocHGlobal(32); Marshal.Copy(directory, dOff, dirPtr, 32); - entry = (DirectoryEntry)Marshal.PtrToStructure(dirPtr, typeof(DirectoryEntry)); + DirectoryEntry entry = (DirectoryEntry)Marshal.PtrToStructure(dirPtr, typeof(DirectoryEntry)); Marshal.FreeHGlobal(dirPtr); bool hidden = (entry.statusUser & 0x80) == 0x80; @@ -348,24 +338,18 @@ namespace DiscImageChef.Filesystems.CPM if(!string.IsNullOrEmpty(extension)) filename = filename + "." + extension; int entryNo = (32 * entry.extentCounterHigh + entry.extentCounter) / (dpb.exm + 1); - List blocks; - Dictionary> extentBlocks; - FileEntryInfo fInfo; // Do we have a stat for the file already? - if(statCache.TryGetValue(filename, out fInfo)) statCache.Remove(filename); + if(statCache.TryGetValue(filename, out FileEntryInfo fInfo)) statCache.Remove(filename); else - { - fInfo = new FileEntryInfo(); - fInfo.Attributes = new FileAttributes(); - } + { fInfo = new FileEntryInfo {Attributes = new FileAttributes()}; } // And any extent? - if(fileExtents.TryGetValue(filename, out extentBlocks)) fileExtents.Remove(filename); + if(fileExtents.TryGetValue(filename, out Dictionary> extentBlocks)) fileExtents.Remove(filename); else extentBlocks = new Dictionary>(); // Do we already have this extent? Should never happen - if(extentBlocks.TryGetValue(entryNo, out blocks)) extentBlocks.Remove(entryNo); + if(extentBlocks.TryGetValue(entryNo, out List blocks)) extentBlocks.Remove(entryNo); else blocks = new List(); // Attributes @@ -408,10 +392,9 @@ namespace DiscImageChef.Filesystems.CPM // A password entry (or a file entry in PDOS, but this does not handle that case) else if((directory[dOff] & 0x7F) >= 0x10 && (directory[dOff] & 0x7F) < 0x20) { - PasswordEntry entry; dirPtr = Marshal.AllocHGlobal(32); Marshal.Copy(directory, dOff, dirPtr, 32); - entry = (PasswordEntry)Marshal.PtrToStructure(dirPtr, typeof(PasswordEntry)); + PasswordEntry entry = (PasswordEntry)Marshal.PtrToStructure(dirPtr, typeof(PasswordEntry)); Marshal.FreeHGlobal(dirPtr); int user = entry.userNumber & 0x0F; @@ -488,10 +471,9 @@ namespace DiscImageChef.Filesystems.CPM if(directory[dOff + 10] == 0x00 && directory[dOff + 20] == 0x00 && directory[dOff + 30] == 0x00 && directory[dOff + 31] == 0x00) { - DateEntry dateEntry; dirPtr = Marshal.AllocHGlobal(32); Marshal.Copy(directory, dOff, dirPtr, 32); - dateEntry = (DateEntry)Marshal.PtrToStructure(dirPtr, typeof(DateEntry)); + DateEntry dateEntry = (DateEntry)Marshal.PtrToStructure(dirPtr, typeof(DateEntry)); Marshal.FreeHGlobal(dirPtr); FileEntryInfo fInfo; @@ -544,10 +526,9 @@ namespace DiscImageChef.Filesystems.CPM // However, if this byte is 0, timestamp is in Z80DOS or DOS+ format else if(directory[dOff + 1] == 0x00) { - TrdPartyDateEntry trdPartyDateEntry; dirPtr = Marshal.AllocHGlobal(32); Marshal.Copy(directory, dOff, dirPtr, 32); - trdPartyDateEntry = (TrdPartyDateEntry)Marshal.PtrToStructure(dirPtr, typeof(TrdPartyDateEntry)); + TrdPartyDateEntry trdPartyDateEntry = (TrdPartyDateEntry)Marshal.PtrToStructure(dirPtr, typeof(TrdPartyDateEntry)); Marshal.FreeHGlobal(dirPtr); FileEntryInfo fInfo; @@ -617,24 +598,19 @@ namespace DiscImageChef.Filesystems.CPM foreach(string filename in dirList) { MemoryStream fileMs = new MemoryStream(); - FileEntryInfo fInfo; - if(statCache.TryGetValue(filename, out fInfo)) statCache.Remove(filename); + if(statCache.TryGetValue(filename, out FileEntryInfo fInfo)) statCache.Remove(filename); fInfo.Blocks = 0; - Dictionary> extents; - if(fileExtents.TryGetValue(filename, out extents)) + if(fileExtents.TryGetValue(filename, out Dictionary> extents)) for(int ex = 0; ex < extents.Count; ex++) { - List alBlks; - - if(!extents.TryGetValue(ex, out alBlks)) continue; + if(!extents.TryGetValue(ex, out List alBlks)) continue; foreach(ushort alBlk in alBlks) { - byte[] blk; - allocationBlocks.TryGetValue(alBlk, out blk); + allocationBlocks.TryGetValue(alBlk, out byte[] blk); fileMs.Write(blk, 0, blk.Length); fInfo.Blocks++; } @@ -668,29 +644,31 @@ namespace DiscImageChef.Filesystems.CPM cpmStat.FilenameLength = 11; cpmStat.Files = (ulong)fileCache.Count; cpmStat.FreeBlocks = cpmStat.Blocks - usedBlocks; - cpmStat.PluginId = PluginUUID; + cpmStat.PluginId = PluginUuid; cpmStat.Type = "CP/M filesystem"; // Generate XML info - xmlFSType = new FileSystemType(); - xmlFSType.Clusters = cpmStat.Blocks; - xmlFSType.ClusterSize = blockSize; + XmlFsType = new FileSystemType + { + Clusters = cpmStat.Blocks, + ClusterSize = blockSize, + Files = fileCache.Count, + FilesSpecified = true, + FreeClusters = cpmStat.FreeBlocks, + FreeClustersSpecified = true, + Type = "CP/M filesystem" + }; if(labelCreationDate != null) { - xmlFSType.CreationDate = DateHandlers.CPMToDateTime(labelCreationDate); - xmlFSType.CreationDateSpecified = true; + XmlFsType.CreationDate = DateHandlers.CPMToDateTime(labelCreationDate); + XmlFsType.CreationDateSpecified = true; } if(labelUpdateDate != null) { - xmlFSType.ModificationDate = DateHandlers.CPMToDateTime(labelUpdateDate); - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.CPMToDateTime(labelUpdateDate); + XmlFsType.ModificationDateSpecified = true; } - xmlFSType.Files = fileCache.Count; - xmlFSType.FilesSpecified = true; - xmlFSType.FreeClusters = cpmStat.FreeBlocks; - xmlFSType.FreeClustersSpecified = true; - xmlFSType.Type = "CP/M filesystem"; - if(!string.IsNullOrEmpty(label)) xmlFSType.VolumeName = label; + if(!string.IsNullOrEmpty(label)) XmlFsType.VolumeName = label; mounted = true; return Errno.NoError; diff --git a/DiscImageChef.Filesystems/CPM/Xattr.cs b/DiscImageChef.Filesystems/CPM/Xattr.cs index ee6b75908..961a7fe44 100644 --- a/DiscImageChef.Filesystems/CPM/Xattr.cs +++ b/DiscImageChef.Filesystems/CPM/Xattr.cs @@ -58,9 +58,7 @@ namespace DiscImageChef.Filesystems.CPM if(string.Compare(xattr, "com.caldera.cpm.password.text", StringComparison.InvariantCulture) != 0) return Errno.NoSuchExtendedAttribute; - if(!passwordCache.TryGetValue(pathElements[0].ToUpperInvariant(), out buf)) return Errno.NoError; - - return Errno.NoSuchExtendedAttribute; + return !passwordCache.TryGetValue(pathElements[0].ToUpperInvariant(), out buf) ? Errno.NoError : Errno.NoSuchExtendedAttribute; } /// diff --git a/DiscImageChef.Filesystems/Cram.cs b/DiscImageChef.Filesystems/Cram.cs index 42e07e1d5..862a3d336 100644 --- a/DiscImageChef.Filesystems/Cram.cs +++ b/DiscImageChef.Filesystems/Cram.cs @@ -45,24 +45,22 @@ namespace DiscImageChef.Filesystems public Cram() { Name = "Cram filesystem"; - PluginUUID = new Guid("F8F6E46F-7A2A-48E3-9C0A-46AF4DC29E09"); + PluginUuid = new Guid("F8F6E46F-7A2A-48E3-9C0A-46AF4DC29E09"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public Cram(Encoding encoding) { Name = "Cram filesystem"; - PluginUUID = new Guid("F8F6E46F-7A2A-48E3-9C0A-46AF4DC29E09"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("F8F6E46F-7A2A-48E3-9C0A-46AF4DC29E09"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public Cram(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Cram filesystem"; - PluginUUID = new Guid("F8F6E46F-7A2A-48E3-9C0A-46AF4DC29E09"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("F8F6E46F-7A2A-48E3-9C0A-46AF4DC29E09"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } enum CramCompression : ushort @@ -92,8 +90,8 @@ namespace DiscImageChef.Filesystems /// /// Identifier for Cram /// - const uint Cram_MAGIC = 0x28CD3D45; - const uint Cram_CIGAM = 0x453DCD28; + const uint CRAM_MAGIC = 0x28CD3D45; + const uint CRAM_CIGAM = 0x453DCD28; public override bool Identify(ImagePlugin imagePlugin, Partition partition) { @@ -103,7 +101,7 @@ namespace DiscImageChef.Filesystems uint magic = BitConverter.ToUInt32(sector, 0x00); - return magic == Cram_MAGIC || magic == Cram_CIGAM; + return magic == CRAM_MAGIC || magic == CRAM_CIGAM; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -116,13 +114,13 @@ namespace DiscImageChef.Filesystems bool littleEndian = true; switch(magic) { - case Cram_MAGIC: + case CRAM_MAGIC: IntPtr crSbPtr = Marshal.AllocHGlobal(Marshal.SizeOf(crSb)); Marshal.Copy(sector, 0, crSbPtr, Marshal.SizeOf(crSb)); crSb = (CramSuperBlock)Marshal.PtrToStructure(crSbPtr, typeof(CramSuperBlock)); Marshal.FreeHGlobal(crSbPtr); break; - case Cram_CIGAM: + case CRAM_CIGAM: crSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); littleEndian = false; break; @@ -131,8 +129,7 @@ namespace DiscImageChef.Filesystems StringBuilder sbInformation = new StringBuilder(); sbInformation.AppendLine("Cram file system"); - if(littleEndian) sbInformation.AppendLine("Little-endian"); - else sbInformation.AppendLine("Big-endian"); + sbInformation.AppendLine(littleEndian ? "Little-endian" : "Big-endian"); sbInformation.AppendFormat("Volume edition {0}", crSb.edition).AppendLine(); sbInformation.AppendFormat("Volume name: {0}", StringHandlers.CToString(crSb.name, CurrentEncoding)) .AppendLine(); @@ -142,14 +139,16 @@ namespace DiscImageChef.Filesystems information = sbInformation.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.VolumeName = StringHandlers.CToString(crSb.name, CurrentEncoding); - xmlFSType.Type = "Cram file system"; - xmlFSType.Clusters = crSb.blocks; - xmlFSType.Files = crSb.files; - xmlFSType.FilesSpecified = true; - xmlFSType.FreeClusters = 0; - xmlFSType.FreeClustersSpecified = true; + XmlFsType = new FileSystemType + { + VolumeName = StringHandlers.CToString(crSb.name, CurrentEncoding), + Type = "Cram file system", + Clusters = crSb.blocks, + Files = crSb.files, + FilesSpecified = true, + FreeClusters = 0, + FreeClustersSpecified = true + }; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/ECMA67.cs b/DiscImageChef.Filesystems/ECMA67.cs index 95fb2912b..094cd5949 100644 --- a/DiscImageChef.Filesystems/ECMA67.cs +++ b/DiscImageChef.Filesystems/ECMA67.cs @@ -46,24 +46,22 @@ namespace DiscImageChef.Filesystems public ECMA67() { Name = "ECMA-67"; - PluginUUID = new Guid("62A2D44A-CBC1-4377-B4B6-28C5C92034A1"); + PluginUuid = new Guid("62A2D44A-CBC1-4377-B4B6-28C5C92034A1"); CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); } public ECMA67(Encoding encoding) { Name = "ECMA-67"; - PluginUUID = new Guid("62A2D44A-CBC1-4377-B4B6-28C5C92034A1"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("62A2D44A-CBC1-4377-B4B6-28C5C92034A1"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } public ECMA67(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "ECMA-67"; - PluginUUID = new Guid("62A2D44A-CBC1-4377-B4B6-28C5C92034A1"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("62A2D44A-CBC1-4377-B4B6-28C5C92034A1"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } readonly byte[] ECMA67_Magic = {0x56, 0x4F, 0x4C}; @@ -123,11 +121,13 @@ namespace DiscImageChef.Filesystems sbInformation.AppendFormat("Volume name: {0}", Encoding.ASCII.GetString(vol.volumeIdentifier)).AppendLine(); sbInformation.AppendFormat("Volume owner: {0}", Encoding.ASCII.GetString(vol.owner)).AppendLine(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "ECMA-67"; - xmlFSType.ClusterSize = 256; - xmlFSType.Clusters = (long)(partition.End - partition.Start + 1); - xmlFSType.VolumeName = Encoding.ASCII.GetString(vol.volumeIdentifier); + XmlFsType = new FileSystemType + { + Type = "ECMA-67", + ClusterSize = 256, + Clusters = (long)(partition.End - partition.Start + 1), + VolumeName = Encoding.ASCII.GetString(vol.volumeIdentifier) + }; information = sbInformation.ToString(); } diff --git a/DiscImageChef.Filesystems/EFS.cs b/DiscImageChef.Filesystems/EFS.cs index c8783ee49..451c55bab 100644 --- a/DiscImageChef.Filesystems/EFS.cs +++ b/DiscImageChef.Filesystems/EFS.cs @@ -32,6 +32,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; @@ -44,6 +45,7 @@ namespace DiscImageChef.Filesystems public class EFS : Filesystem { [StructLayout(LayoutKind.Sequential, Pack = 1)] + [SuppressMessage("ReSharper", "InconsistentNaming")] struct EFS_Superblock { /* 0: fs size incl. bb 0 (in bb) */ @@ -90,30 +92,28 @@ namespace DiscImageChef.Filesystems public uint sb_checksum; } - const uint EFS_Magic = 0x00072959; - const uint EFS_Magic_New = 0x0007295A; + const uint EFS_MAGIC = 0x00072959; + const uint EFS_MAGIC_NEW = 0x0007295A; public EFS() { Name = "Extent File System Plugin"; - PluginUUID = new Guid("52A43F90-9AF3-4391-ADFE-65598DEEABAB"); + PluginUuid = new Guid("52A43F90-9AF3-4391-ADFE-65598DEEABAB"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public EFS(Encoding encoding) { Name = "Extent File System Plugin"; - PluginUUID = new Guid("52A43F90-9AF3-4391-ADFE-65598DEEABAB"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("52A43F90-9AF3-4391-ADFE-65598DEEABAB"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public EFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Extent File System Plugin"; - PluginUUID = new Guid("52A43F90-9AF3-4391-ADFE-65598DEEABAB"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("52A43F90-9AF3-4391-ADFE-65598DEEABAB"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -123,24 +123,24 @@ namespace DiscImageChef.Filesystems // Misaligned if(imagePlugin.ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc) { - EFS_Superblock efs_sb = new EFS_Superblock(); + EFS_Superblock efsSb = new EFS_Superblock(); - uint sbSize = (uint)((Marshal.SizeOf(efs_sb) + 0x200) / imagePlugin.GetSectorSize()); - if((Marshal.SizeOf(efs_sb) + 0x200) % imagePlugin.GetSectorSize() != 0) sbSize++; + uint sbSize = (uint)((Marshal.SizeOf(efsSb) + 0x200) / imagePlugin.GetSectorSize()); + if((Marshal.SizeOf(efsSb) + 0x200) % imagePlugin.GetSectorSize() != 0) sbSize++; byte[] sector = imagePlugin.ReadSectors(partition.Start, sbSize); - if(sector.Length < Marshal.SizeOf(efs_sb)) return false; + if(sector.Length < Marshal.SizeOf(efsSb)) return false; - byte[] sbpiece = new byte[Marshal.SizeOf(efs_sb)]; + byte[] sbpiece = new byte[Marshal.SizeOf(efsSb)]; - Array.Copy(sector, 0x200, sbpiece, 0, Marshal.SizeOf(efs_sb)); + Array.Copy(sector, 0x200, sbpiece, 0, Marshal.SizeOf(efsSb)); - efs_sb = BigEndianMarshal.ByteArrayToStructureBigEndian(sbpiece); + efsSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sbpiece); DicConsole.DebugWriteLine("EFS plugin", "magic at 0x{0:X3} = 0x{1:X8} (expected 0x{2:X8} or 0x{3:X8})", - 0x200, efs_sb.sb_magic, EFS_Magic, EFS_Magic_New); + 0x200, efsSb.sb_magic, EFS_MAGIC, EFS_MAGIC_NEW); - if(efs_sb.sb_magic == EFS_Magic || efs_sb.sb_magic == EFS_Magic_New) return true; + if(efsSb.sb_magic == EFS_MAGIC || efsSb.sb_magic == EFS_MAGIC_NEW) return true; } else { @@ -155,9 +155,9 @@ namespace DiscImageChef.Filesystems efsSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); DicConsole.DebugWriteLine("EFS plugin", "magic at {0} = 0x{1:X8} (expected 0x{2:X8} or 0x{3:X8})", 1, - efsSb.sb_magic, EFS_Magic, EFS_Magic_New); + efsSb.sb_magic, EFS_MAGIC, EFS_MAGIC_NEW); - if(efsSb.sb_magic == EFS_Magic || efsSb.sb_magic == EFS_Magic_New) return true; + if(efsSb.sb_magic == EFS_MAGIC || efsSb.sb_magic == EFS_MAGIC_NEW) return true; } return false; @@ -187,7 +187,7 @@ namespace DiscImageChef.Filesystems efsSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sbpiece); DicConsole.DebugWriteLine("EFS plugin", "magic at 0x{0:X3} = 0x{1:X8} (expected 0x{2:X8} or 0x{3:X8})", - 0x200, efsSb.sb_magic, EFS_Magic, EFS_Magic_New); + 0x200, efsSb.sb_magic, EFS_MAGIC, EFS_MAGIC_NEW); } else { @@ -200,15 +200,15 @@ namespace DiscImageChef.Filesystems efsSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); DicConsole.DebugWriteLine("EFS plugin", "magic at {0} = 0x{1:X8} (expected 0x{2:X8} or 0x{3:X8})", 1, - efsSb.sb_magic, EFS_Magic, EFS_Magic_New); + efsSb.sb_magic, EFS_MAGIC, EFS_MAGIC_NEW); } - if(efsSb.sb_magic != EFS_Magic && efsSb.sb_magic != EFS_Magic_New) return; + if(efsSb.sb_magic != EFS_MAGIC && efsSb.sb_magic != EFS_MAGIC_NEW) return; StringBuilder sb = new StringBuilder(); sb.AppendLine("SGI extent filesystem"); - if(efsSb.sb_magic == EFS_Magic_New) sb.AppendLine("New version"); + if(efsSb.sb_magic == EFS_MAGIC_NEW) sb.AppendLine("New version"); sb.AppendFormat("Filesystem size: {0} basic blocks", efsSb.sb_size).AppendLine(); sb.AppendFormat("First cylinder group starts at block {0}", efsSb.sb_firstcg).AppendLine(); sb.AppendFormat("Cylinder group size: {0} basic blocks", efsSb.sb_cgfsize).AppendLine(); @@ -231,7 +231,7 @@ namespace DiscImageChef.Filesystems information = sb.ToString(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "Extent File System", ClusterSize = 512, diff --git a/DiscImageChef.Filesystems/F2FS.cs b/DiscImageChef.Filesystems/F2FS.cs index 038dfc7a6..504783d6b 100644 --- a/DiscImageChef.Filesystems/F2FS.cs +++ b/DiscImageChef.Filesystems/F2FS.cs @@ -32,6 +32,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; @@ -43,6 +44,7 @@ namespace DiscImageChef.Filesystems public class F2FS : Filesystem { [StructLayout(LayoutKind.Sequential, Pack = 1)] + [SuppressMessage("ReSharper", "InconsistentNaming")] struct F2FS_Superblock { public uint magic; @@ -92,39 +94,39 @@ namespace DiscImageChef.Filesystems [MarshalAs(UnmanagedType.ByValArray, SizeConst = 871)] public byte[] reserved; } - const uint F2FS_Magic = 0xF2F52010; - const uint F2FS_SuperOffset = 1024; - const uint F2FS_MinSector = 512; - const uint F2FS_MaxSector = 4096; - const uint F2FS_BlockSize = 4096; + const uint F2FS_MAGIC = 0xF2F52010; + const uint F2FS_SUPER_OFFSET = 1024; + const uint F2FS_MIN_SECTOR = 512; + const uint F2FS_MAX_SECTOR = 4096; + const uint F2FS_BLOCK_SIZE = 4096; public F2FS() { Name = "F2FS Plugin"; - PluginUUID = new Guid("82B0920F-5F0D-4063-9F57-ADE0AE02ECE5"); + PluginUuid = new Guid("82B0920F-5F0D-4063-9F57-ADE0AE02ECE5"); CurrentEncoding = Encoding.Unicode; } public F2FS(Encoding encoding) { Name = "F2FS Plugin"; - PluginUUID = new Guid("82B0920F-5F0D-4063-9F57-ADE0AE02ECE5"); + PluginUuid = new Guid("82B0920F-5F0D-4063-9F57-ADE0AE02ECE5"); CurrentEncoding = Encoding.Unicode; } public F2FS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "F2FS Plugin"; - PluginUUID = new Guid("82B0920F-5F0D-4063-9F57-ADE0AE02ECE5"); + PluginUuid = new Guid("82B0920F-5F0D-4063-9F57-ADE0AE02ECE5"); CurrentEncoding = Encoding.Unicode; } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { - if(imagePlugin.GetSectorSize() < F2FS_MinSector || imagePlugin.GetSectorSize() > F2FS_MaxSector) + if(imagePlugin.GetSectorSize() < F2FS_MIN_SECTOR || imagePlugin.GetSectorSize() > F2FS_MAX_SECTOR) return false; - uint sbAddr = F2FS_SuperOffset / imagePlugin.GetSectorSize(); + uint sbAddr = F2FS_SUPER_OFFSET / imagePlugin.GetSectorSize(); if(sbAddr == 0) sbAddr = 1; F2FS_Superblock f2fsSb = new F2FS_Superblock(); @@ -142,16 +144,16 @@ namespace DiscImageChef.Filesystems f2fsSb = (F2FS_Superblock)Marshal.PtrToStructure(sbPtr, typeof(F2FS_Superblock)); Marshal.FreeHGlobal(sbPtr); - return f2fsSb.magic == F2FS_Magic; + return f2fsSb.magic == F2FS_MAGIC; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, out string information) { information = ""; - if(imagePlugin.GetSectorSize() < F2FS_MinSector || imagePlugin.GetSectorSize() > F2FS_MaxSector) return; + if(imagePlugin.GetSectorSize() < F2FS_MIN_SECTOR || imagePlugin.GetSectorSize() > F2FS_MAX_SECTOR) return; - uint sbAddr = F2FS_SuperOffset / imagePlugin.GetSectorSize(); + uint sbAddr = F2FS_SUPER_OFFSET / imagePlugin.GetSectorSize(); if(sbAddr == 0) sbAddr = 1; F2FS_Superblock f2fsSb = new F2FS_Superblock(); @@ -167,7 +169,7 @@ namespace DiscImageChef.Filesystems f2fsSb = (F2FS_Superblock)Marshal.PtrToStructure(sbPtr, typeof(F2FS_Superblock)); Marshal.FreeHGlobal(sbPtr); - if(f2fsSb.magic != F2FS_Magic) return; + if(f2fsSb.magic != F2FS_MAGIC) return; StringBuilder sb = new StringBuilder(); @@ -193,14 +195,16 @@ namespace DiscImageChef.Filesystems information = sb.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "F2FS filesystem"; - xmlFSType.SystemIdentifier = Encoding.ASCII.GetString(f2fsSb.version); - xmlFSType.Clusters = (long)f2fsSb.block_count; - xmlFSType.ClusterSize = 1 << (int)f2fsSb.log_blocksize; - xmlFSType.DataPreparerIdentifier = Encoding.ASCII.GetString(f2fsSb.init_version); - xmlFSType.VolumeName = StringHandlers.CToString(f2fsSb.volume_name, Encoding.Unicode, true); - xmlFSType.VolumeSerial = f2fsSb.uuid.ToString(); + XmlFsType = new FileSystemType + { + Type = "F2FS filesystem", + SystemIdentifier = Encoding.ASCII.GetString(f2fsSb.version), + Clusters = (long)f2fsSb.block_count, + ClusterSize = 1 << (int)f2fsSb.log_blocksize, + DataPreparerIdentifier = Encoding.ASCII.GetString(f2fsSb.init_version), + VolumeName = StringHandlers.CToString(f2fsSb.volume_name, Encoding.Unicode, true), + VolumeSerial = f2fsSb.uuid.ToString() + }; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/FAT.cs b/DiscImageChef.Filesystems/FAT.cs index c9c4b4224..1c824f2a2 100644 --- a/DiscImageChef.Filesystems/FAT.cs +++ b/DiscImageChef.Filesystems/FAT.cs @@ -52,24 +52,22 @@ namespace DiscImageChef.Filesystems public FAT() { Name = "Microsoft File Allocation Table"; - PluginUUID = new Guid("33513B2C-0D26-0D2D-32C3-79D8611158E0"); + PluginUuid = new Guid("33513B2C-0D26-0D2D-32C3-79D8611158E0"); CurrentEncoding = Encoding.GetEncoding("IBM437"); } public FAT(Encoding encoding) { Name = "Microsoft File Allocation Table"; - PluginUUID = new Guid("33513B2C-0D26-0D2D-32C3-79D8611158E0"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("IBM437"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("33513B2C-0D26-0D2D-32C3-79D8611158E0"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("IBM437"); } public FAT(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Microsoft File Allocation Table"; - PluginUUID = new Guid("33513B2C-0D26-0D2D-32C3-79D8611158E0"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("IBM437"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("33513B2C-0D26-0D2D-32C3-79D8611158E0"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("IBM437"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -78,113 +76,113 @@ namespace DiscImageChef.Filesystems ushort bps; byte spc; - byte fats_no; - ushort reserved_secs; - ushort root_entries; + byte numberOfFats; + ushort reservedSecs; + ushort rootEntries; ushort sectors; - byte media_descriptor; - ushort fat_sectors; - uint big_sectors; - byte bpb_signature; - byte fat32_signature; - ulong huge_sectors; - byte[] fat32_id = new byte[8]; - byte[] msx_id = new byte[6]; - byte fat_id; - byte[] dos_oem = new byte[8]; - byte[] atari_oem = new byte[6]; + byte mediaDescriptor; + ushort fatSectors; + uint bigSectors; + byte bpbSignature; + byte fat32Signature; + ulong hugeSectors; + byte[] fat32Id = new byte[8]; + byte[] msxId = new byte[6]; + byte fatId; + byte[] dosOem = new byte[8]; + byte[] atariOem = new byte[6]; ushort bootable = 0; - byte[] bpb_sector = imagePlugin.ReadSector(0 + partition.Start); - byte[] fat_sector = imagePlugin.ReadSector(1 + partition.Start); + byte[] bpbSector = imagePlugin.ReadSector(0 + partition.Start); + byte[] fatSector = imagePlugin.ReadSector(1 + partition.Start); - Array.Copy(bpb_sector, 0x02, atari_oem, 0, 6); - Array.Copy(bpb_sector, 0x03, dos_oem, 0, 8); - bps = BitConverter.ToUInt16(bpb_sector, 0x00B); - spc = bpb_sector[0x00D]; - reserved_secs = BitConverter.ToUInt16(bpb_sector, 0x00E); - fats_no = bpb_sector[0x010]; - root_entries = BitConverter.ToUInt16(bpb_sector, 0x011); - sectors = BitConverter.ToUInt16(bpb_sector, 0x013); - media_descriptor = bpb_sector[0x015]; - fat_sectors = BitConverter.ToUInt16(bpb_sector, 0x016); - Array.Copy(bpb_sector, 0x052, msx_id, 0, 6); - big_sectors = BitConverter.ToUInt32(bpb_sector, 0x020); - bpb_signature = bpb_sector[0x026]; - fat32_signature = bpb_sector[0x042]; - Array.Copy(bpb_sector, 0x052, fat32_id, 0, 8); - huge_sectors = BitConverter.ToUInt64(bpb_sector, 0x052); - fat_id = fat_sector[0]; - int bits_in_bps = CountBits.Count(bps); - if(imagePlugin.ImageInfo.SectorSize >= 512) bootable = BitConverter.ToUInt16(bpb_sector, 0x1FE); + Array.Copy(bpbSector, 0x02, atariOem, 0, 6); + Array.Copy(bpbSector, 0x03, dosOem, 0, 8); + bps = BitConverter.ToUInt16(bpbSector, 0x00B); + spc = bpbSector[0x00D]; + reservedSecs = BitConverter.ToUInt16(bpbSector, 0x00E); + numberOfFats = bpbSector[0x010]; + rootEntries = BitConverter.ToUInt16(bpbSector, 0x011); + sectors = BitConverter.ToUInt16(bpbSector, 0x013); + mediaDescriptor = bpbSector[0x015]; + fatSectors = BitConverter.ToUInt16(bpbSector, 0x016); + Array.Copy(bpbSector, 0x052, msxId, 0, 6); + bigSectors = BitConverter.ToUInt32(bpbSector, 0x020); + bpbSignature = bpbSector[0x026]; + fat32Signature = bpbSector[0x042]; + Array.Copy(bpbSector, 0x052, fat32Id, 0, 8); + hugeSectors = BitConverter.ToUInt64(bpbSector, 0x052); + fatId = fatSector[0]; + int bitsInBps = CountBits.Count(bps); + if(imagePlugin.ImageInfo.SectorSize >= 512) bootable = BitConverter.ToUInt16(bpbSector, 0x1FE); - bool correct_spc = spc == 1 || spc == 2 || spc == 4 || spc == 8 || spc == 16 || spc == 32 || spc == 64; - string msx_string = Encoding.ASCII.GetString(msx_id); - string fat32_string = Encoding.ASCII.GetString(fat32_id); - bool atari_oem_correct = atari_oem[0] >= 0x20 && atari_oem[1] >= 0x20 && atari_oem[2] >= 0x20 && - atari_oem[3] >= 0x20 && atari_oem[4] >= 0x20 && atari_oem[5] >= 0x20; - bool dos_oem_correct = dos_oem[0] >= 0x20 && dos_oem[1] >= 0x20 && dos_oem[2] >= 0x20 && - dos_oem[3] >= 0x20 && dos_oem[4] >= 0x20 && dos_oem[5] >= 0x20 && - dos_oem[6] >= 0x20 && dos_oem[7] >= 0x20; - string atari_string = Encoding.ASCII.GetString(atari_oem); - string oem_string = Encoding.ASCII.GetString(dos_oem); + bool correctSpc = spc == 1 || spc == 2 || spc == 4 || spc == 8 || spc == 16 || spc == 32 || spc == 64; + string msxString = Encoding.ASCII.GetString(msxId); + string fat32String = Encoding.ASCII.GetString(fat32Id); + bool atariOemCorrect = atariOem[0] >= 0x20 && atariOem[1] >= 0x20 && atariOem[2] >= 0x20 && + atariOem[3] >= 0x20 && atariOem[4] >= 0x20 && atariOem[5] >= 0x20; + bool dosOemCorrect = dosOem[0] >= 0x20 && dosOem[1] >= 0x20 && dosOem[2] >= 0x20 && + dosOem[3] >= 0x20 && dosOem[4] >= 0x20 && dosOem[5] >= 0x20 && + dosOem[6] >= 0x20 && dosOem[7] >= 0x20; + string atariString = Encoding.ASCII.GetString(atariOem); + string oemString = Encoding.ASCII.GetString(dosOem); - DicConsole.DebugWriteLine("FAT plugin", "atari_oem_correct = {0}", atari_oem_correct); - DicConsole.DebugWriteLine("FAT plugin", "dos_oem_correct = {0}", dos_oem_correct); + DicConsole.DebugWriteLine("FAT plugin", "atari_oem_correct = {0}", atariOemCorrect); + DicConsole.DebugWriteLine("FAT plugin", "dos_oem_correct = {0}", dosOemCorrect); DicConsole.DebugWriteLine("FAT plugin", "bps = {0}", bps); - DicConsole.DebugWriteLine("FAT plugin", "bits in bps = {0}", bits_in_bps); + DicConsole.DebugWriteLine("FAT plugin", "bits in bps = {0}", bitsInBps); DicConsole.DebugWriteLine("FAT plugin", "spc = {0}", spc); - DicConsole.DebugWriteLine("FAT plugin", "correct_spc = {0}", correct_spc); - DicConsole.DebugWriteLine("FAT plugin", "reserved_secs = {0}", reserved_secs); - DicConsole.DebugWriteLine("FAT plugin", "fats_no = {0}", fats_no); - DicConsole.DebugWriteLine("FAT plugin", "root_entries = {0}", root_entries); + DicConsole.DebugWriteLine("FAT plugin", "correct_spc = {0}", correctSpc); + DicConsole.DebugWriteLine("FAT plugin", "reserved_secs = {0}", reservedSecs); + DicConsole.DebugWriteLine("FAT plugin", "fats_no = {0}", numberOfFats); + DicConsole.DebugWriteLine("FAT plugin", "root_entries = {0}", rootEntries); DicConsole.DebugWriteLine("FAT plugin", "sectors = {0}", sectors); - DicConsole.DebugWriteLine("FAT plugin", "media_descriptor = 0x{0:X2}", media_descriptor); - DicConsole.DebugWriteLine("FAT plugin", "fat_sectors = {0}", fat_sectors); - DicConsole.DebugWriteLine("FAT plugin", "msx_id = \"{0}\"", msx_string); - DicConsole.DebugWriteLine("FAT plugin", "big_sectors = {0}", big_sectors); - DicConsole.DebugWriteLine("FAT plugin", "bpb_signature = 0x{0:X2}", bpb_signature); - DicConsole.DebugWriteLine("FAT plugin", "fat32_signature = 0x{0:X2}", fat32_signature); - DicConsole.DebugWriteLine("FAT plugin", "fat32_id = \"{0}\"", fat32_string); - DicConsole.DebugWriteLine("FAT plugin", "huge_sectors = {0}", huge_sectors); - DicConsole.DebugWriteLine("FAT plugin", "fat_id = 0x{0:X2}", fat_id); + DicConsole.DebugWriteLine("FAT plugin", "media_descriptor = 0x{0:X2}", mediaDescriptor); + DicConsole.DebugWriteLine("FAT plugin", "fat_sectors = {0}", fatSectors); + DicConsole.DebugWriteLine("FAT plugin", "msx_id = \"{0}\"", msxString); + DicConsole.DebugWriteLine("FAT plugin", "big_sectors = {0}", bigSectors); + DicConsole.DebugWriteLine("FAT plugin", "bpb_signature = 0x{0:X2}", bpbSignature); + DicConsole.DebugWriteLine("FAT plugin", "fat32_signature = 0x{0:X2}", fat32Signature); + DicConsole.DebugWriteLine("FAT plugin", "fat32_id = \"{0}\"", fat32String); + DicConsole.DebugWriteLine("FAT plugin", "huge_sectors = {0}", hugeSectors); + DicConsole.DebugWriteLine("FAT plugin", "fat_id = 0x{0:X2}", fatId); - ushort apricot_bps = BitConverter.ToUInt16(bpb_sector, 0x50); - byte apricot_spc = bpb_sector[0x52]; - ushort apricot_reserved_secs = BitConverter.ToUInt16(bpb_sector, 0x53); - byte apricot_fats_no = bpb_sector[0x55]; - ushort apricot_root_entries = BitConverter.ToUInt16(bpb_sector, 0x56); - ushort apricot_sectors = BitConverter.ToUInt16(bpb_sector, 0x58); - byte apricot_media_descriptor = bpb_sector[0x5A]; - ushort apricot_fat_sectors = BitConverter.ToUInt16(bpb_sector, 0x5B); - bool apricot_correct_spc = apricot_spc == 1 || apricot_spc == 2 || apricot_spc == 4 || apricot_spc == 8 || - apricot_spc == 16 || apricot_spc == 32 || apricot_spc == 64; - int bits_in_apricot_bps = CountBits.Count(apricot_bps); - byte apricot_partitions = bpb_sector[0x0C]; + ushort apricotBps = BitConverter.ToUInt16(bpbSector, 0x50); + byte apricotSpc = bpbSector[0x52]; + ushort apricotReservedSecs = BitConverter.ToUInt16(bpbSector, 0x53); + byte apricotFatsNo = bpbSector[0x55]; + ushort apricotRootEntries = BitConverter.ToUInt16(bpbSector, 0x56); + ushort apricotSectors = BitConverter.ToUInt16(bpbSector, 0x58); + byte apricotMediaDescriptor = bpbSector[0x5A]; + ushort apricotFatSectors = BitConverter.ToUInt16(bpbSector, 0x5B); + bool apricotCorrectSpc = apricotSpc == 1 || apricotSpc == 2 || apricotSpc == 4 || apricotSpc == 8 || + apricotSpc == 16 || apricotSpc == 32 || apricotSpc == 64; + int bitsInApricotBps = CountBits.Count(apricotBps); + byte apricotPartitions = bpbSector[0x0C]; - DicConsole.DebugWriteLine("FAT plugin", "apricot_bps = {0}", apricot_bps); - DicConsole.DebugWriteLine("FAT plugin", "apricot_spc = {0}", apricot_spc); - DicConsole.DebugWriteLine("FAT plugin", "apricot_correct_spc = {0}", apricot_correct_spc); - DicConsole.DebugWriteLine("FAT plugin", "apricot_reserved_secs = {0}", apricot_reserved_secs); - DicConsole.DebugWriteLine("FAT plugin", "apricot_fats_no = {0}", apricot_fats_no); - DicConsole.DebugWriteLine("FAT plugin", "apricot_root_entries = {0}", apricot_root_entries); - DicConsole.DebugWriteLine("FAT plugin", "apricot_sectors = {0}", apricot_sectors); - DicConsole.DebugWriteLine("FAT plugin", "apricot_media_descriptor = 0x{0:X2}", apricot_media_descriptor); - DicConsole.DebugWriteLine("FAT plugin", "apricot_fat_sectors = {0}", apricot_fat_sectors); + DicConsole.DebugWriteLine("FAT plugin", "apricot_bps = {0}", apricotBps); + DicConsole.DebugWriteLine("FAT plugin", "apricot_spc = {0}", apricotSpc); + DicConsole.DebugWriteLine("FAT plugin", "apricot_correct_spc = {0}", apricotCorrectSpc); + DicConsole.DebugWriteLine("FAT plugin", "apricot_reserved_secs = {0}", apricotReservedSecs); + DicConsole.DebugWriteLine("FAT plugin", "apricot_fats_no = {0}", apricotFatsNo); + DicConsole.DebugWriteLine("FAT plugin", "apricot_root_entries = {0}", apricotRootEntries); + DicConsole.DebugWriteLine("FAT plugin", "apricot_sectors = {0}", apricotSectors); + DicConsole.DebugWriteLine("FAT plugin", "apricot_media_descriptor = 0x{0:X2}", apricotMediaDescriptor); + DicConsole.DebugWriteLine("FAT plugin", "apricot_fat_sectors = {0}", apricotFatSectors); // This is to support FAT partitions on hybrid ISO/USB images if(imagePlugin.ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc) { sectors /= 4; - big_sectors /= 4; - huge_sectors /= 4; + bigSectors /= 4; + hugeSectors /= 4; } - switch(oem_string) { + switch(oemString) { // exFAT case "EXFAT ": return false; // NTFS - case "NTFS " when bootable == 0xAA55 && fats_no == 0 && fat_sectors == 0: return false; + case "NTFS " when bootable == 0xAA55 && numberOfFats == 0 && fatSectors == 0: return false; // QNX4 case "FQNX4FS ": return false; } @@ -192,43 +190,43 @@ namespace DiscImageChef.Filesystems // HPFS if(16 + partition.Start <= partition.End) { - uint hpfs_magic1, hpfs_magic2; + uint hpfsMagic1, hpfsMagic2; - byte[] hpfs_sb_sector = + byte[] hpfsSbSector = imagePlugin.ReadSector(16 + partition.Start); // Seek to superblock, on logical sector 16 - hpfs_magic1 = BitConverter.ToUInt32(hpfs_sb_sector, 0x000); - hpfs_magic2 = BitConverter.ToUInt32(hpfs_sb_sector, 0x004); + hpfsMagic1 = BitConverter.ToUInt32(hpfsSbSector, 0x000); + hpfsMagic2 = BitConverter.ToUInt32(hpfsSbSector, 0x004); - if(hpfs_magic1 == 0xF995E849 && hpfs_magic2 == 0xFA53E9C5) return false; + if(hpfsMagic1 == 0xF995E849 && hpfsMagic2 == 0xFA53E9C5) return false; } - switch(bits_in_bps) { + switch(bitsInBps) { // FAT32 for sure - case 1 when correct_spc && fats_no <= 2 && sectors == 0 && fat_sectors == 0 && fat32_signature == 0x29 && fat32_string == "FAT32 ": return true; + case 1 when correctSpc && numberOfFats <= 2 && sectors == 0 && fatSectors == 0 && fat32Signature == 0x29 && fat32String == "FAT32 ": return true; // short FAT32 - case 1 when correct_spc && fats_no <= 2 && sectors == 0 && fat_sectors == 0 && fat32_signature == 0x28: - return big_sectors == 0 - ? huge_sectors <= partition.End - partition.Start + 1 - : big_sectors <= partition.End - partition.Start + 1; + case 1 when correctSpc && numberOfFats <= 2 && sectors == 0 && fatSectors == 0 && fat32Signature == 0x28: + return bigSectors == 0 + ? hugeSectors <= partition.End - partition.Start + 1 + : bigSectors <= partition.End - partition.Start + 1; // MSX-DOS FAT12 - case 1 when correct_spc && fats_no <= 2 && root_entries > 0 && sectors <= partition.End - partition.Start + 1 && fat_sectors > 0 && msx_string == "VOL_ID": return true; + case 1 when correctSpc && numberOfFats <= 2 && rootEntries > 0 && sectors <= partition.End - partition.Start + 1 && fatSectors > 0 && msxString == "VOL_ID": return true; // EBPB - case 1 when correct_spc && fats_no <= 2 && root_entries > 0 && fat_sectors > 0 && (bpb_signature == 0x28 || bpb_signature == 0x29): + case 1 when correctSpc && numberOfFats <= 2 && rootEntries > 0 && fatSectors > 0 && (bpbSignature == 0x28 || bpbSignature == 0x29): return sectors == 0 - ? big_sectors <= partition.End - partition.Start + 1 + ? bigSectors <= partition.End - partition.Start + 1 : sectors <= partition.End - partition.Start + 1; // BPB - case 1 when correct_spc && reserved_secs < partition.End - partition.Start && fats_no <= 2 && root_entries > 0 && fat_sectors > 0: + case 1 when correctSpc && reservedSecs < partition.End - partition.Start && numberOfFats <= 2 && rootEntries > 0 && fatSectors > 0: return sectors == 0 - ? big_sectors <= partition.End - partition.Start + 1 + ? bigSectors <= partition.End - partition.Start + 1 : sectors <= partition.End - partition.Start + 1; } // Apricot BPB - if(bits_in_apricot_bps == 1 && apricot_correct_spc && - apricot_reserved_secs < partition.End - partition.Start && apricot_fats_no <= 2 && - apricot_root_entries > 0 && apricot_fat_sectors > 0 && - apricot_sectors <= partition.End - partition.Start + 1 && apricot_partitions == 0) return true; + if(bitsInApricotBps == 1 && apricotCorrectSpc && + apricotReservedSecs < partition.End - partition.Start && apricotFatsNo <= 2 && + apricotRootEntries > 0 && apricotFatSectors > 0 && + apricotSectors <= partition.End - partition.Start + 1 && apricotPartitions == 0) return true; // All FAT12 without BPB can only be used on floppies, without partitions. if(partition.Start != 0) return false; @@ -237,96 +235,96 @@ namespace DiscImageChef.Filesystems if(imagePlugin.GetSectors() == 800 && imagePlugin.GetSectorSize() == 512) { // DEC Rainbow boots up with a Z80, first byte should be DI (disable interrupts) - byte z80_di = bpb_sector[0]; + byte z80Di = bpbSector[0]; // First FAT1 sector resides at LBA 0x14 - byte[] fat1_sector0 = imagePlugin.ReadSector(0x14); + byte[] fat1Sector0 = imagePlugin.ReadSector(0x14); // First FAT2 sector resides at LBA 0x1A - byte[] fat2_sector0 = imagePlugin.ReadSector(0x1A); - bool equal_fat_ids = fat1_sector0[0] == fat2_sector0[0] && fat1_sector0[1] == fat2_sector0[1]; + byte[] fat2Sector0 = imagePlugin.ReadSector(0x1A); + bool equalFatIds = fat1Sector0[0] == fat2Sector0[0] && fat1Sector0[1] == fat2Sector0[1]; // Volume is software interleaved 2:1 MemoryStream rootMs = new MemoryStream(); foreach(byte[] tmp in from ulong rootSector in new[] {0x17, 0x19, 0x1B, 0x1D, 0x1E, 0x20} select imagePlugin.ReadSector(rootSector)) { rootMs.Write(tmp, 0, tmp.Length); } - byte[] root_dir = rootMs.ToArray(); - bool valid_root_dir = true; + byte[] rootDir = rootMs.ToArray(); + bool validRootDir = true; // Iterate all root directory for(int e = 0; e < 96 * 32; e += 32) { for(int c = 0; c < 11; c++) - if(root_dir[c + e] < 0x20 && root_dir[c + e] != 0x00 && root_dir[c + e] != 0x05 || - root_dir[c + e] == 0xFF || root_dir[c + e] == 0x2E) + if(rootDir[c + e] < 0x20 && rootDir[c + e] != 0x00 && rootDir[c + e] != 0x05 || + rootDir[c + e] == 0xFF || rootDir[c + e] == 0x2E) { - valid_root_dir = false; + validRootDir = false; break; } - if(!valid_root_dir) break; + if(!validRootDir) break; } - if(z80_di == 0xF3 && equal_fat_ids && (fat1_sector0[0] & 0xF0) == 0xF0 && fat1_sector0[1] == 0xFF && - valid_root_dir) return true; + if(z80Di == 0xF3 && equalFatIds && (fat1Sector0[0] & 0xF0) == 0xF0 && fat1Sector0[1] == 0xFF && + validRootDir) return true; } - byte fat2 = fat_sector[1]; - byte fat3 = fat_sector[2]; - ushort fat_2nd_cluster = (ushort)(((fat2 << 8) + fat3) & 0xFFF); + byte fat2 = fatSector[1]; + byte fat3 = fatSector[2]; + ushort fat2ndCluster = (ushort)(((fat2 << 8) + fat3) & 0xFFF); - DicConsole.DebugWriteLine("FAT plugin", "1st fat cluster 1 = {0:X3}", fat_2nd_cluster); - if(fat_2nd_cluster < 0xFF0) return false; + DicConsole.DebugWriteLine("FAT plugin", "1st fat cluster 1 = {0:X3}", fat2ndCluster); + if(fat2ndCluster < 0xFF0) return false; - ulong fat2_sector_no = 0; + ulong fat2SectorNo = 0; - switch(fat_id) + switch(fatId) { case 0xE5: if(imagePlugin.ImageInfo.Sectors == 2002 && imagePlugin.ImageInfo.SectorSize == 128) - fat2_sector_no = 2; + fat2SectorNo = 2; break; case 0xFD: if(imagePlugin.ImageInfo.Sectors == 4004 && imagePlugin.ImageInfo.SectorSize == 128) - fat2_sector_no = 7; + fat2SectorNo = 7; else if(imagePlugin.ImageInfo.Sectors == 2002 && imagePlugin.ImageInfo.SectorSize == 128) - fat2_sector_no = 7; + fat2SectorNo = 7; break; case 0xFE: if(imagePlugin.ImageInfo.Sectors == 320 && imagePlugin.ImageInfo.SectorSize == 512) - fat2_sector_no = 2; + fat2SectorNo = 2; else if(imagePlugin.ImageInfo.Sectors == 2002 && imagePlugin.ImageInfo.SectorSize == 128) - fat2_sector_no = 7; + fat2SectorNo = 7; else if(imagePlugin.ImageInfo.Sectors == 1232 && imagePlugin.ImageInfo.SectorSize == 1024) - fat2_sector_no = 3; + fat2SectorNo = 3; else if(imagePlugin.ImageInfo.Sectors == 616 && imagePlugin.ImageInfo.SectorSize == 1024) - fat2_sector_no = 2; + fat2SectorNo = 2; else if(imagePlugin.ImageInfo.Sectors == 720 && imagePlugin.ImageInfo.SectorSize == 128) - fat2_sector_no = 5; + fat2SectorNo = 5; else if(imagePlugin.ImageInfo.Sectors == 640 && imagePlugin.ImageInfo.SectorSize == 512) - fat2_sector_no = 2; + fat2SectorNo = 2; break; case 0xFF: if(imagePlugin.ImageInfo.Sectors == 640 && imagePlugin.ImageInfo.SectorSize == 512) - fat2_sector_no = 2; + fat2SectorNo = 2; break; default: - if(fat_id < 0xE8) return false; + if(fatId < 0xE8) return false; - fat2_sector_no = 2; + fat2SectorNo = 2; break; } - if(fat2_sector_no > partition.End) return false; + if(fat2SectorNo > partition.End) return false; - DicConsole.DebugWriteLine("FAT plugin", "2nd fat starts at = {0}", fat2_sector_no); + DicConsole.DebugWriteLine("FAT plugin", "2nd fat starts at = {0}", fat2SectorNo); - byte[] fat2_sector = imagePlugin.ReadSector(fat2_sector_no); + byte[] fat2Sector = imagePlugin.ReadSector(fat2SectorNo); - fat2 = fat2_sector[1]; - fat3 = fat2_sector[2]; - fat_2nd_cluster = (ushort)(((fat2 << 8) + fat3) & 0xFFF); - if(fat_2nd_cluster < 0xFF0) return false; + fat2 = fat2Sector[1]; + fat3 = fat2Sector[2]; + fat2ndCluster = (ushort)(((fat2 << 8) + fat3) & 0xFFF); + if(fat2ndCluster < 0xFF0) return false; - return fat_id == fat2_sector[0]; + return fatId == fat2Sector[0]; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -335,767 +333,765 @@ namespace DiscImageChef.Filesystems information = ""; StringBuilder sb = new StringBuilder(); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); - bool useAtariBPB = false; - bool useMSXBPB = false; - bool useDOS2BPB = false; - bool useDOS3BPB = false; - bool useDOS32BPB = false; - bool useDOS33BPB = false; - bool useShortEBPB = false; - bool useEBPB = false; - bool useShortFAT32 = false; - bool useLongFAT32 = false; - bool andos_oem_correct = false; - bool useApricotBPB = false; - bool useDecRainbowBPB = false; + bool useAtariBpb = false; + bool useMsxBpb = false; + bool useDos2Bpb = false; + bool useDos3Bpb = false; + bool useDos32Bpb = false; + bool useDos33Bpb = false; + bool userShortExtendedBpb = false; + bool useExtendedBpb = false; + bool useShortFat32 = false; + bool useLongFat32 = false; + bool andosOemCorrect = false; + bool useApricotBpb = false; + bool useDecRainbowBpb = false; - AtariParameterBlock atariBPB = new AtariParameterBlock(); - MSXParameterBlock msxBPB = new MSXParameterBlock(); - BIOSParameterBlock2 dos2BPB = new BIOSParameterBlock2(); - BIOSParameterBlock30 dos30BPB = new BIOSParameterBlock30(); - BIOSParameterBlock32 dos32BPB = new BIOSParameterBlock32(); - BIOSParameterBlock33 dos33BPB = new BIOSParameterBlock33(); - BIOSParameterBlockShortEBPB shortEBPB = new BIOSParameterBlockShortEBPB(); - BIOSParameterBlockEBPB EBPB = new BIOSParameterBlockEBPB(); - FAT32ParameterBlockShort shortFat32BPB = new FAT32ParameterBlockShort(); - FAT32ParameterBlock Fat32BPB = new FAT32ParameterBlock(); - ApricotLabel ApricotBPB = new ApricotLabel(); + AtariParameterBlock atariBpb = new AtariParameterBlock(); + MsxParameterBlock msxBpb = new MsxParameterBlock(); + BiosParameterBlock2 dos2Bpb = new BiosParameterBlock2(); + BiosParameterBlock30 dos30Bpb = new BiosParameterBlock30(); + BiosParameterBlock32 dos32Bpb = new BiosParameterBlock32(); + BiosParameterBlock33 dos33Bpb = new BiosParameterBlock33(); + BiosParameterBlockShortEbpb shortEbpb = new BiosParameterBlockShortEbpb(); + BiosParameterBlockEbpb ebpb = new BiosParameterBlockEbpb(); + Fat32ParameterBlockShort shortFat32Bpb = new Fat32ParameterBlockShort(); + Fat32ParameterBlock fat32Bpb = new Fat32ParameterBlock(); + ApricotLabel apricotBpb = new ApricotLabel(); - byte[] bpb_sector = imagePlugin.ReadSectors(partition.Start, 2); + byte[] bpbSector = imagePlugin.ReadSectors(partition.Start, 2); if(imagePlugin.ImageInfo.SectorSize >= 256) { IntPtr bpbPtr = Marshal.AllocHGlobal(512); - Marshal.Copy(bpb_sector, 0, bpbPtr, 512); + Marshal.Copy(bpbSector, 0, bpbPtr, 512); - atariBPB = (AtariParameterBlock)Marshal.PtrToStructure(bpbPtr, typeof(AtariParameterBlock)); - msxBPB = (MSXParameterBlock)Marshal.PtrToStructure(bpbPtr, typeof(MSXParameterBlock)); - dos2BPB = (BIOSParameterBlock2)Marshal.PtrToStructure(bpbPtr, typeof(BIOSParameterBlock2)); - dos30BPB = (BIOSParameterBlock30)Marshal.PtrToStructure(bpbPtr, typeof(BIOSParameterBlock30)); - dos32BPB = (BIOSParameterBlock32)Marshal.PtrToStructure(bpbPtr, typeof(BIOSParameterBlock32)); - dos33BPB = (BIOSParameterBlock33)Marshal.PtrToStructure(bpbPtr, typeof(BIOSParameterBlock33)); - shortEBPB = - (BIOSParameterBlockShortEBPB)Marshal.PtrToStructure(bpbPtr, typeof(BIOSParameterBlockShortEBPB)); - EBPB = (BIOSParameterBlockEBPB)Marshal.PtrToStructure(bpbPtr, typeof(BIOSParameterBlockEBPB)); - shortFat32BPB = - (FAT32ParameterBlockShort)Marshal.PtrToStructure(bpbPtr, typeof(FAT32ParameterBlockShort)); - Fat32BPB = (FAT32ParameterBlock)Marshal.PtrToStructure(bpbPtr, typeof(FAT32ParameterBlock)); - ApricotBPB = (ApricotLabel)Marshal.PtrToStructure(bpbPtr, typeof(ApricotLabel)); + atariBpb = (AtariParameterBlock)Marshal.PtrToStructure(bpbPtr, typeof(AtariParameterBlock)); + msxBpb = (MsxParameterBlock)Marshal.PtrToStructure(bpbPtr, typeof(MsxParameterBlock)); + dos2Bpb = (BiosParameterBlock2)Marshal.PtrToStructure(bpbPtr, typeof(BiosParameterBlock2)); + dos30Bpb = (BiosParameterBlock30)Marshal.PtrToStructure(bpbPtr, typeof(BiosParameterBlock30)); + dos32Bpb = (BiosParameterBlock32)Marshal.PtrToStructure(bpbPtr, typeof(BiosParameterBlock32)); + dos33Bpb = (BiosParameterBlock33)Marshal.PtrToStructure(bpbPtr, typeof(BiosParameterBlock33)); + shortEbpb = + (BiosParameterBlockShortEbpb)Marshal.PtrToStructure(bpbPtr, typeof(BiosParameterBlockShortEbpb)); + ebpb = (BiosParameterBlockEbpb)Marshal.PtrToStructure(bpbPtr, typeof(BiosParameterBlockEbpb)); + shortFat32Bpb = + (Fat32ParameterBlockShort)Marshal.PtrToStructure(bpbPtr, typeof(Fat32ParameterBlockShort)); + fat32Bpb = (Fat32ParameterBlock)Marshal.PtrToStructure(bpbPtr, typeof(Fat32ParameterBlock)); + apricotBpb = (ApricotLabel)Marshal.PtrToStructure(bpbPtr, typeof(ApricotLabel)); Marshal.FreeHGlobal(bpbPtr); - int bits_in_bps_atari = CountBits.Count(atariBPB.bps); - int bits_in_bps_msx = CountBits.Count(msxBPB.bps); - int bits_in_bps_dos20 = CountBits.Count(dos2BPB.bps); - int bits_in_bps_dos30 = CountBits.Count(dos30BPB.bps); - int bits_in_bps_dos32 = CountBits.Count(dos32BPB.bps); - int bits_in_bps_dos33 = CountBits.Count(dos33BPB.bps); - int bits_in_bps_dos34 = CountBits.Count(shortEBPB.bps); - int bits_in_bps_dos40 = CountBits.Count(EBPB.bps); - int bits_in_bps_fat32_short = CountBits.Count(shortFat32BPB.bps); - int bits_in_bps_fat32 = CountBits.Count(Fat32BPB.bps); - int bits_in_bps_apricot = CountBits.Count(ApricotBPB.mainBPB.bps); + int bitsInBpsAtari = CountBits.Count(atariBpb.bps); + int bitsInBpsMsx = CountBits.Count(msxBpb.bps); + int bitsInBpsDos20 = CountBits.Count(dos2Bpb.bps); + int bitsInBpsDos30 = CountBits.Count(dos30Bpb.bps); + int bitsInBpsDos32 = CountBits.Count(dos32Bpb.bps); + int bitsInBpsDos33 = CountBits.Count(dos33Bpb.bps); + int bitsInBpsDos34 = CountBits.Count(shortEbpb.bps); + int bitsInBpsDos40 = CountBits.Count(ebpb.bps); + int bitsInBpsFat32Short = CountBits.Count(shortFat32Bpb.bps); + int bitsInBpsFat32 = CountBits.Count(fat32Bpb.bps); + int bitsInBpsApricot = CountBits.Count(apricotBpb.mainBPB.bps); - bool correct_spc_atari = atariBPB.spc == 1 || atariBPB.spc == 2 || atariBPB.spc == 4 || - atariBPB.spc == 8 || atariBPB.spc == 16 || atariBPB.spc == 32 || - atariBPB.spc == 64; - bool correct_spc_msx = msxBPB.spc == 1 || msxBPB.spc == 2 || msxBPB.spc == 4 || msxBPB.spc == 8 || - msxBPB.spc == 16 || msxBPB.spc == 32 || msxBPB.spc == 64; - bool correct_spc_dos20 = dos2BPB.spc == 1 || dos2BPB.spc == 2 || dos2BPB.spc == 4 || dos2BPB.spc == 8 || - dos2BPB.spc == 16 || dos2BPB.spc == 32 || dos2BPB.spc == 64; - bool correct_spc_dos30 = dos30BPB.spc == 1 || dos30BPB.spc == 2 || dos30BPB.spc == 4 || - dos30BPB.spc == 8 || dos30BPB.spc == 16 || dos30BPB.spc == 32 || - dos30BPB.spc == 64; - bool correct_spc_dos32 = dos32BPB.spc == 1 || dos32BPB.spc == 2 || dos32BPB.spc == 4 || - dos32BPB.spc == 8 || dos32BPB.spc == 16 || dos32BPB.spc == 32 || - dos32BPB.spc == 64; - bool correct_spc_dos33 = dos33BPB.spc == 1 || dos33BPB.spc == 2 || dos33BPB.spc == 4 || - dos33BPB.spc == 8 || dos33BPB.spc == 16 || dos33BPB.spc == 32 || - dos33BPB.spc == 64; - bool correct_spc_dos34 = shortEBPB.spc == 1 || shortEBPB.spc == 2 || shortEBPB.spc == 4 || - shortEBPB.spc == 8 || shortEBPB.spc == 16 || shortEBPB.spc == 32 || - shortEBPB.spc == 64; - bool correct_spc_dos40 = EBPB.spc == 1 || EBPB.spc == 2 || EBPB.spc == 4 || EBPB.spc == 8 || - EBPB.spc == 16 || EBPB.spc == 32 || EBPB.spc == 64; - bool correct_spc_fat32_short = shortFat32BPB.spc == 1 || shortFat32BPB.spc == 2 || - shortFat32BPB.spc == 4 || shortFat32BPB.spc == 8 || - shortFat32BPB.spc == 16 || shortFat32BPB.spc == 32 || - shortFat32BPB.spc == 64; - bool correct_spc_fat32 = Fat32BPB.spc == 1 || Fat32BPB.spc == 2 || Fat32BPB.spc == 4 || - Fat32BPB.spc == 8 || Fat32BPB.spc == 16 || Fat32BPB.spc == 32 || - Fat32BPB.spc == 64; - bool correct_spc_apricot = ApricotBPB.mainBPB.spc == 1 || ApricotBPB.mainBPB.spc == 2 || - ApricotBPB.mainBPB.spc == 4 || ApricotBPB.mainBPB.spc == 8 || - ApricotBPB.mainBPB.spc == 16 || ApricotBPB.mainBPB.spc == 32 || - ApricotBPB.mainBPB.spc == 64; + bool correctSpcAtari = atariBpb.spc == 1 || atariBpb.spc == 2 || atariBpb.spc == 4 || + atariBpb.spc == 8 || atariBpb.spc == 16 || atariBpb.spc == 32 || + atariBpb.spc == 64; + bool correctSpcMsx = msxBpb.spc == 1 || msxBpb.spc == 2 || msxBpb.spc == 4 || msxBpb.spc == 8 || + msxBpb.spc == 16 || msxBpb.spc == 32 || msxBpb.spc == 64; + bool correctSpcDos20 = dos2Bpb.spc == 1 || dos2Bpb.spc == 2 || dos2Bpb.spc == 4 || dos2Bpb.spc == 8 || + dos2Bpb.spc == 16 || dos2Bpb.spc == 32 || dos2Bpb.spc == 64; + bool correctSpcDos30 = dos30Bpb.spc == 1 || dos30Bpb.spc == 2 || dos30Bpb.spc == 4 || + dos30Bpb.spc == 8 || dos30Bpb.spc == 16 || dos30Bpb.spc == 32 || + dos30Bpb.spc == 64; + bool correctSpcDos32 = dos32Bpb.spc == 1 || dos32Bpb.spc == 2 || dos32Bpb.spc == 4 || + dos32Bpb.spc == 8 || dos32Bpb.spc == 16 || dos32Bpb.spc == 32 || + dos32Bpb.spc == 64; + bool correctSpcDos33 = dos33Bpb.spc == 1 || dos33Bpb.spc == 2 || dos33Bpb.spc == 4 || + dos33Bpb.spc == 8 || dos33Bpb.spc == 16 || dos33Bpb.spc == 32 || + dos33Bpb.spc == 64; + bool correctSpcDos34 = shortEbpb.spc == 1 || shortEbpb.spc == 2 || shortEbpb.spc == 4 || + shortEbpb.spc == 8 || shortEbpb.spc == 16 || shortEbpb.spc == 32 || + shortEbpb.spc == 64; + bool correctSpcDos40 = ebpb.spc == 1 || ebpb.spc == 2 || ebpb.spc == 4 || ebpb.spc == 8 || + ebpb.spc == 16 || ebpb.spc == 32 || ebpb.spc == 64; + bool correctSpcFat32Short = shortFat32Bpb.spc == 1 || shortFat32Bpb.spc == 2 || + shortFat32Bpb.spc == 4 || shortFat32Bpb.spc == 8 || + shortFat32Bpb.spc == 16 || shortFat32Bpb.spc == 32 || + shortFat32Bpb.spc == 64; + bool correctSpcFat32 = fat32Bpb.spc == 1 || fat32Bpb.spc == 2 || fat32Bpb.spc == 4 || + fat32Bpb.spc == 8 || fat32Bpb.spc == 16 || fat32Bpb.spc == 32 || + fat32Bpb.spc == 64; + bool correctSpcApricot = apricotBpb.mainBPB.spc == 1 || apricotBpb.mainBPB.spc == 2 || + apricotBpb.mainBPB.spc == 4 || apricotBpb.mainBPB.spc == 8 || + apricotBpb.mainBPB.spc == 16 || apricotBpb.mainBPB.spc == 32 || + apricotBpb.mainBPB.spc == 64; // This is to support FAT partitions on hybrid ISO/USB images if(imagePlugin.ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc) { - atariBPB.sectors /= 4; - msxBPB.sectors /= 4; - dos2BPB.sectors /= 4; - dos30BPB.sectors /= 4; - dos32BPB.sectors /= 4; - dos33BPB.sectors /= 4; - dos33BPB.big_sectors /= 4; - shortEBPB.sectors /= 4; - shortEBPB.big_sectors /= 4; - EBPB.sectors /= 4; - EBPB.big_sectors /= 4; - shortFat32BPB.sectors /= 4; - shortFat32BPB.big_sectors /= 4; - shortFat32BPB.huge_sectors /= 4; - Fat32BPB.sectors /= 4; - Fat32BPB.big_sectors /= 4; - ApricotBPB.mainBPB.sectors /= 4; + atariBpb.sectors /= 4; + msxBpb.sectors /= 4; + dos2Bpb.sectors /= 4; + dos30Bpb.sectors /= 4; + dos32Bpb.sectors /= 4; + dos33Bpb.sectors /= 4; + dos33Bpb.big_sectors /= 4; + shortEbpb.sectors /= 4; + shortEbpb.big_sectors /= 4; + ebpb.sectors /= 4; + ebpb.big_sectors /= 4; + shortFat32Bpb.sectors /= 4; + shortFat32Bpb.big_sectors /= 4; + shortFat32Bpb.huge_sectors /= 4; + fat32Bpb.sectors /= 4; + fat32Bpb.big_sectors /= 4; + apricotBpb.mainBPB.sectors /= 4; } - andos_oem_correct = dos33BPB.oem_name[0] < 0x20 && dos33BPB.oem_name[1] >= 0x20 && - dos33BPB.oem_name[2] >= 0x20 && dos33BPB.oem_name[3] >= 0x20 && - dos33BPB.oem_name[4] >= 0x20 && dos33BPB.oem_name[5] >= 0x20 && - dos33BPB.oem_name[6] >= 0x20 && dos33BPB.oem_name[7] >= 0x20; + andosOemCorrect = dos33Bpb.oem_name[0] < 0x20 && dos33Bpb.oem_name[1] >= 0x20 && + dos33Bpb.oem_name[2] >= 0x20 && dos33Bpb.oem_name[3] >= 0x20 && + dos33Bpb.oem_name[4] >= 0x20 && dos33Bpb.oem_name[5] >= 0x20 && + dos33Bpb.oem_name[6] >= 0x20 && dos33Bpb.oem_name[7] >= 0x20; - if(bits_in_bps_fat32 == 1 && correct_spc_fat32 && Fat32BPB.fats_no <= 2 && Fat32BPB.sectors == 0 && - Fat32BPB.spfat == 0 && Fat32BPB.signature == 0x29 && - Encoding.ASCII.GetString(Fat32BPB.fs_type) == "FAT32 ") + if(bitsInBpsFat32 == 1 && correctSpcFat32 && fat32Bpb.fats_no <= 2 && fat32Bpb.sectors == 0 && + fat32Bpb.spfat == 0 && fat32Bpb.signature == 0x29 && + Encoding.ASCII.GetString(fat32Bpb.fs_type) == "FAT32 ") { DicConsole.DebugWriteLine("FAT plugin", "Using FAT32 BPB"); - useLongFAT32 = true; + useLongFat32 = true; } - else if(bits_in_bps_fat32_short == 1 && correct_spc_fat32_short && shortFat32BPB.fats_no <= 2 && - shortFat32BPB.sectors == 0 && shortFat32BPB.spfat == 0 && shortFat32BPB.signature == 0x28) + else if(bitsInBpsFat32Short == 1 && correctSpcFat32Short && shortFat32Bpb.fats_no <= 2 && + shortFat32Bpb.sectors == 0 && shortFat32Bpb.spfat == 0 && shortFat32Bpb.signature == 0x28) { DicConsole.DebugWriteLine("FAT plugin", "Using short FAT32 BPB"); - useShortFAT32 = shortFat32BPB.big_sectors == 0 - ? shortFat32BPB.huge_sectors <= partition.End - partition.Start + 1 - : shortFat32BPB.big_sectors <= partition.End - partition.Start + 1; + useShortFat32 = shortFat32Bpb.big_sectors == 0 + ? shortFat32Bpb.huge_sectors <= partition.End - partition.Start + 1 + : shortFat32Bpb.big_sectors <= partition.End - partition.Start + 1; } - else if(bits_in_bps_msx == 1 && correct_spc_msx && msxBPB.fats_no <= 2 && msxBPB.root_ent > 0 && - msxBPB.sectors <= partition.End - partition.Start + 1 && msxBPB.spfat > 0 && - Encoding.ASCII.GetString(msxBPB.vol_id) == "VOL_ID") + else if(bitsInBpsMsx == 1 && correctSpcMsx && msxBpb.fats_no <= 2 && msxBpb.root_ent > 0 && + msxBpb.sectors <= partition.End - partition.Start + 1 && msxBpb.spfat > 0 && + Encoding.ASCII.GetString(msxBpb.vol_id) == "VOL_ID") { DicConsole.DebugWriteLine("FAT plugin", "Using MSX BPB"); - useMSXBPB = true; + useMsxBpb = true; } - else if(bits_in_bps_apricot == 1 && correct_spc_apricot && ApricotBPB.mainBPB.fats_no <= 2 && - ApricotBPB.mainBPB.root_ent > 0 && - ApricotBPB.mainBPB.sectors <= partition.End - partition.Start + 1 && - ApricotBPB.mainBPB.spfat > 0 && ApricotBPB.partitionCount == 0) + else if(bitsInBpsApricot == 1 && correctSpcApricot && apricotBpb.mainBPB.fats_no <= 2 && + apricotBpb.mainBPB.root_ent > 0 && + apricotBpb.mainBPB.sectors <= partition.End - partition.Start + 1 && + apricotBpb.mainBPB.spfat > 0 && apricotBpb.partitionCount == 0) { DicConsole.DebugWriteLine("FAT plugin", "Using Apricot BPB"); - useApricotBPB = true; + useApricotBpb = true; } - else if(bits_in_bps_dos40 == 1 && correct_spc_dos40 && EBPB.fats_no <= 2 && EBPB.root_ent > 0 && - EBPB.spfat > 0 && (EBPB.signature == 0x28 || EBPB.signature == 0x29 || andos_oem_correct)) + else if(bitsInBpsDos40 == 1 && correctSpcDos40 && ebpb.fats_no <= 2 && ebpb.root_ent > 0 && + ebpb.spfat > 0 && (ebpb.signature == 0x28 || ebpb.signature == 0x29 || andosOemCorrect)) { - if(EBPB.sectors == 0) + if(ebpb.sectors == 0) { - if(EBPB.big_sectors <= partition.End - partition.Start + 1) - if(EBPB.signature == 0x29 || andos_oem_correct) + if(ebpb.big_sectors <= partition.End - partition.Start + 1) + if(ebpb.signature == 0x29 || andosOemCorrect) { DicConsole.DebugWriteLine("FAT plugin", "Using DOS 4.0 BPB"); - useEBPB = true; + useExtendedBpb = true; } else { DicConsole.DebugWriteLine("FAT plugin", "Using DOS 3.4 BPB"); - useShortEBPB = true; + userShortExtendedBpb = true; } } - else if(EBPB.sectors <= partition.End - partition.Start + 1) - if(EBPB.signature == 0x29 || andos_oem_correct) + else if(ebpb.sectors <= partition.End - partition.Start + 1) + if(ebpb.signature == 0x29 || andosOemCorrect) { DicConsole.DebugWriteLine("FAT plugin", "Using DOS 4.0 BPB"); - useEBPB = true; + useExtendedBpb = true; } else { DicConsole.DebugWriteLine("FAT plugin", "Using DOS 3.4 BPB"); - useShortEBPB = true; + userShortExtendedBpb = true; } } - else if(bits_in_bps_dos33 == 1 && correct_spc_dos33 && - dos33BPB.rsectors < partition.End - partition.Start && dos33BPB.fats_no <= 2 && - dos33BPB.root_ent > 0 && dos33BPB.spfat > 0) - if(dos33BPB.sectors == 0 && dos33BPB.hsectors <= partition.Start && dos33BPB.big_sectors > 0 && - dos33BPB.big_sectors <= partition.End - partition.Start + 1) + else if(bitsInBpsDos33 == 1 && correctSpcDos33 && + dos33Bpb.rsectors < partition.End - partition.Start && dos33Bpb.fats_no <= 2 && + dos33Bpb.root_ent > 0 && dos33Bpb.spfat > 0) + if(dos33Bpb.sectors == 0 && dos33Bpb.hsectors <= partition.Start && dos33Bpb.big_sectors > 0 && + dos33Bpb.big_sectors <= partition.End - partition.Start + 1) { DicConsole.DebugWriteLine("FAT plugin", "Using DOS 3.3 BPB"); - useDOS33BPB = true; + useDos33Bpb = true; } - else if(dos33BPB.big_sectors == 0 && dos33BPB.hsectors <= partition.Start && dos33BPB.sectors > 0 && - dos33BPB.sectors <= partition.End - partition.Start + 1) - if(atariBPB.jump[0] == 0x60 || atariBPB.jump[0] == 0xE9 && atariBPB.jump[1] == 0x00 && - Encoding.ASCII.GetString(dos33BPB.oem_name) != "NEXT ") + else if(dos33Bpb.big_sectors == 0 && dos33Bpb.hsectors <= partition.Start && dos33Bpb.sectors > 0 && + dos33Bpb.sectors <= partition.End - partition.Start + 1) + if(atariBpb.jump[0] == 0x60 || atariBpb.jump[0] == 0xE9 && atariBpb.jump[1] == 0x00 && + Encoding.ASCII.GetString(dos33Bpb.oem_name) != "NEXT ") { DicConsole.DebugWriteLine("FAT plugin", "Using Atari BPB"); - useAtariBPB = true; + useAtariBpb = true; } else { DicConsole.DebugWriteLine("FAT plugin", "Using DOS 3.3 BPB"); - useDOS33BPB = true; + useDos33Bpb = true; } else { - if(dos32BPB.hsectors <= partition.Start && - dos32BPB.hsectors + dos32BPB.sectors == dos32BPB.total_sectors) + if(dos32Bpb.hsectors <= partition.Start && + dos32Bpb.hsectors + dos32Bpb.sectors == dos32Bpb.total_sectors) { DicConsole.DebugWriteLine("FAT plugin", "Using DOS 3.2 BPB"); - useDOS32BPB = true; + useDos32Bpb = true; } - else if(dos30BPB.sptrk > 0 && dos30BPB.sptrk < 64 && dos30BPB.heads > 0 && dos30BPB.heads < 256) - if(atariBPB.jump[0] == 0x60 || atariBPB.jump[0] == 0xE9 && atariBPB.jump[1] == 0x00 && - Encoding.ASCII.GetString(dos33BPB.oem_name) != "NEXT ") + else if(dos30Bpb.sptrk > 0 && dos30Bpb.sptrk < 64 && dos30Bpb.heads > 0 && dos30Bpb.heads < 256) + if(atariBpb.jump[0] == 0x60 || atariBpb.jump[0] == 0xE9 && atariBpb.jump[1] == 0x00 && + Encoding.ASCII.GetString(dos33Bpb.oem_name) != "NEXT ") { DicConsole.DebugWriteLine("FAT plugin", "Using Atari BPB"); - useAtariBPB = true; + useAtariBpb = true; } else { DicConsole.DebugWriteLine("FAT plugin", "Using DOS 3.0 BPB"); - useDOS3BPB = true; + useDos3Bpb = true; } else { - if(atariBPB.jump[0] == 0x60 || atariBPB.jump[0] == 0xE9 && atariBPB.jump[1] == 0x00 && - Encoding.ASCII.GetString(dos33BPB.oem_name) != "NEXT ") + if(atariBpb.jump[0] == 0x60 || atariBpb.jump[0] == 0xE9 && atariBpb.jump[1] == 0x00 && + Encoding.ASCII.GetString(dos33Bpb.oem_name) != "NEXT ") { DicConsole.DebugWriteLine("FAT plugin", "Using Atari BPB"); - useAtariBPB = true; + useAtariBpb = true; } else { DicConsole.DebugWriteLine("FAT plugin", "Using DOS 2.0 BPB"); - useDOS2BPB = true; + useDos2Bpb = true; } } } } - BIOSParameterBlockEBPB fakeBPB = new BIOSParameterBlockEBPB(); - byte[] fat_sector; - bool isFAT12 = false; - bool isFAT16 = false; - bool isFAT32 = false; - ulong root_directory_sector = 0; + BiosParameterBlockEbpb fakeBpb = new BiosParameterBlockEbpb(); + bool isFat12 = false; + bool isFat16 = false; + bool isFat32 = false; + ulong rootDirectorySector = 0; string extraInfo = null; string bootChk = null; Sha1Context sha1Ctx = new Sha1Context(); sha1Ctx.Init(); - byte[] chkTmp; // This is needed because for FAT16, GEMDOS increases bytes per sector count instead of using big_sectors field. - uint sectors_per_real_sector = 0; + uint sectorsPerRealSector; // This is needed because some OSes don't put volume label as first entry in the root directory - uint sectors_for_root_directory = 0; + uint sectorsForRootDirectory = 0; // DEC Rainbow, lacks a BPB but has a very concrete structure... - if(imagePlugin.GetSectors() == 800 && imagePlugin.GetSectorSize() == 512 && !useAtariBPB && !useMSXBPB && - !useDOS2BPB && !useDOS3BPB && !useDOS32BPB && !useDOS33BPB && !useShortEBPB && !useEBPB && - !useShortFAT32 && !useLongFAT32 && !useApricotBPB) + if(imagePlugin.GetSectors() == 800 && imagePlugin.GetSectorSize() == 512 && !useAtariBpb && !useMsxBpb && + !useDos2Bpb && !useDos3Bpb && !useDos32Bpb && !useDos33Bpb && !userShortExtendedBpb && !useExtendedBpb && + !useShortFat32 && !useLongFat32 && !useApricotBpb) { // DEC Rainbow boots up with a Z80, first byte should be DI (disable interrupts) - byte z80_di = bpb_sector[0]; + byte z80Di = bpbSector[0]; // First FAT1 sector resides at LBA 0x14 - byte[] fat1_sector0 = imagePlugin.ReadSector(0x14); + byte[] fat1Sector0 = imagePlugin.ReadSector(0x14); // First FAT2 sector resides at LBA 0x1A - byte[] fat2_sector0 = imagePlugin.ReadSector(0x1A); - bool equal_fat_ids = fat1_sector0[0] == fat2_sector0[0] && fat1_sector0[1] == fat2_sector0[1]; + byte[] fat2Sector0 = imagePlugin.ReadSector(0x1A); + bool equalFatIds = fat1Sector0[0] == fat2Sector0[0] && fat1Sector0[1] == fat2Sector0[1]; // Volume is software interleaved 2:1 MemoryStream rootMs = new MemoryStream(); foreach(byte[] tmp in from ulong rootSector in new[] {0x17, 0x19, 0x1B, 0x1D, 0x1E, 0x20} select imagePlugin.ReadSector(rootSector)) { rootMs.Write(tmp, 0, tmp.Length); } - byte[] root_dir = rootMs.ToArray(); - bool valid_root_dir = true; + byte[] rootDir = rootMs.ToArray(); + bool validRootDir = true; // Iterate all root directory for(int e = 0; e < 96 * 32; e += 32) { for(int c = 0; c < 11; c++) - if(root_dir[c + e] < 0x20 && root_dir[c + e] != 0x00 && root_dir[c + e] != 0x05 || - root_dir[c + e] == 0xFF || root_dir[c + e] == 0x2E) + if(rootDir[c + e] < 0x20 && rootDir[c + e] != 0x00 && rootDir[c + e] != 0x05 || + rootDir[c + e] == 0xFF || rootDir[c + e] == 0x2E) { - valid_root_dir = false; + validRootDir = false; break; } - if(!valid_root_dir) break; + if(!validRootDir) break; } - if(z80_di == 0xF3 && equal_fat_ids && (fat1_sector0[0] & 0xF0) == 0xF0 && fat1_sector0[1] == 0xFF && - valid_root_dir) + if(z80Di == 0xF3 && equalFatIds && (fat1Sector0[0] & 0xF0) == 0xF0 && fat1Sector0[1] == 0xFF && + validRootDir) { - useDecRainbowBPB = true; + useDecRainbowBpb = true; DicConsole.DebugWriteLine("FAT plugin", "Using DEC Rainbow hardcoded BPB."); - fakeBPB.bps = 512; - fakeBPB.spc = 1; - fakeBPB.rsectors = 20; - fakeBPB.fats_no = 2; - fakeBPB.root_ent = 96; - fakeBPB.sectors = 800; - fakeBPB.media = 0xFA; - fakeBPB.sptrk = 10; - fakeBPB.heads = 1; - fakeBPB.hsectors = 0; - fakeBPB.spfat = 3; - xmlFSType.Bootable = true; - fakeBPB.boot_code = bpb_sector; - isFAT12 = true; + fakeBpb.bps = 512; + fakeBpb.spc = 1; + fakeBpb.rsectors = 20; + fakeBpb.fats_no = 2; + fakeBpb.root_ent = 96; + fakeBpb.sectors = 800; + fakeBpb.media = 0xFA; + fakeBpb.sptrk = 10; + fakeBpb.heads = 1; + fakeBpb.hsectors = 0; + fakeBpb.spfat = 3; + XmlFsType.Bootable = true; + fakeBpb.boot_code = bpbSector; + isFat12 = true; } } - if(!useAtariBPB && !useMSXBPB && !useDOS2BPB && !useDOS3BPB && !useDOS32BPB && !useDOS33BPB && - !useShortEBPB && !useEBPB && !useShortFAT32 && !useLongFAT32 && !useApricotBPB && !useDecRainbowBPB) + if(!useAtariBpb && !useMsxBpb && !useDos2Bpb && !useDos3Bpb && !useDos32Bpb && !useDos33Bpb && + !userShortExtendedBpb && !useExtendedBpb && !useShortFat32 && !useLongFat32 && !useApricotBpb && !useDecRainbowBpb) { - isFAT12 = true; - fat_sector = imagePlugin.ReadSector(1 + partition.Start); - switch(fat_sector[0]) + isFat12 = true; + byte[] fatSector = imagePlugin.ReadSector(1 + partition.Start); + switch(fatSector[0]) { case 0xE5: if(imagePlugin.ImageInfo.Sectors == 2002 && imagePlugin.ImageInfo.SectorSize == 128) { DicConsole.DebugWriteLine("FAT plugin", "Using hardcoded BPB."); - fakeBPB.bps = 128; - fakeBPB.spc = 4; - fakeBPB.rsectors = 1; - fakeBPB.fats_no = 2; - fakeBPB.root_ent = 64; - fakeBPB.sectors = 2002; - fakeBPB.media = 0xE5; - fakeBPB.sptrk = 26; - fakeBPB.heads = 1; - fakeBPB.hsectors = 0; - fakeBPB.spfat = 1; + fakeBpb.bps = 128; + fakeBpb.spc = 4; + fakeBpb.rsectors = 1; + fakeBpb.fats_no = 2; + fakeBpb.root_ent = 64; + fakeBpb.sectors = 2002; + fakeBpb.media = 0xE5; + fakeBpb.sptrk = 26; + fakeBpb.heads = 1; + fakeBpb.hsectors = 0; + fakeBpb.spfat = 1; } break; case 0xFD: if(imagePlugin.ImageInfo.Sectors == 4004 && imagePlugin.ImageInfo.SectorSize == 128) { DicConsole.DebugWriteLine("FAT plugin", "Using hardcoded BPB."); - fakeBPB.bps = 128; - fakeBPB.spc = 4; - fakeBPB.rsectors = 4; - fakeBPB.fats_no = 2; - fakeBPB.root_ent = 68; - fakeBPB.sectors = 4004; - fakeBPB.media = 0xFD; - fakeBPB.sptrk = 26; - fakeBPB.heads = 2; - fakeBPB.hsectors = 0; - fakeBPB.spfat = 6; + fakeBpb.bps = 128; + fakeBpb.spc = 4; + fakeBpb.rsectors = 4; + fakeBpb.fats_no = 2; + fakeBpb.root_ent = 68; + fakeBpb.sectors = 4004; + fakeBpb.media = 0xFD; + fakeBpb.sptrk = 26; + fakeBpb.heads = 2; + fakeBpb.hsectors = 0; + fakeBpb.spfat = 6; } else if(imagePlugin.ImageInfo.Sectors == 2002 && imagePlugin.ImageInfo.SectorSize == 128) { DicConsole.DebugWriteLine("FAT plugin", "Using hardcoded BPB."); - fakeBPB.bps = 128; - fakeBPB.spc = 4; - fakeBPB.rsectors = 4; - fakeBPB.fats_no = 2; - fakeBPB.root_ent = 68; - fakeBPB.sectors = 2002; - fakeBPB.media = 0xFD; - fakeBPB.sptrk = 26; - fakeBPB.heads = 1; - fakeBPB.hsectors = 0; - fakeBPB.spfat = 6; + fakeBpb.bps = 128; + fakeBpb.spc = 4; + fakeBpb.rsectors = 4; + fakeBpb.fats_no = 2; + fakeBpb.root_ent = 68; + fakeBpb.sectors = 2002; + fakeBpb.media = 0xFD; + fakeBpb.sptrk = 26; + fakeBpb.heads = 1; + fakeBpb.hsectors = 0; + fakeBpb.spfat = 6; } break; case 0xFE: if(imagePlugin.ImageInfo.Sectors == 320 && imagePlugin.ImageInfo.SectorSize == 512) { DicConsole.DebugWriteLine("FAT plugin", "Using hardcoded BPB for 5.25\" SSDD."); - fakeBPB.bps = 512; - fakeBPB.spc = 1; - fakeBPB.rsectors = 1; - fakeBPB.fats_no = 2; - fakeBPB.root_ent = 64; - fakeBPB.sectors = 320; - fakeBPB.media = 0xFE; - fakeBPB.sptrk = 8; - fakeBPB.heads = 1; - fakeBPB.hsectors = 0; - fakeBPB.spfat = 1; + fakeBpb.bps = 512; + fakeBpb.spc = 1; + fakeBpb.rsectors = 1; + fakeBpb.fats_no = 2; + fakeBpb.root_ent = 64; + fakeBpb.sectors = 320; + fakeBpb.media = 0xFE; + fakeBpb.sptrk = 8; + fakeBpb.heads = 1; + fakeBpb.hsectors = 0; + fakeBpb.spfat = 1; } else if(imagePlugin.ImageInfo.Sectors == 2002 && imagePlugin.ImageInfo.SectorSize == 128) { DicConsole.DebugWriteLine("FAT plugin", "Using hardcoded BPB."); - fakeBPB.bps = 128; - fakeBPB.spc = 4; - fakeBPB.rsectors = 1; - fakeBPB.fats_no = 2; - fakeBPB.root_ent = 68; - fakeBPB.sectors = 2002; - fakeBPB.media = 0xFE; - fakeBPB.sptrk = 26; - fakeBPB.heads = 1; - fakeBPB.hsectors = 0; - fakeBPB.spfat = 6; + fakeBpb.bps = 128; + fakeBpb.spc = 4; + fakeBpb.rsectors = 1; + fakeBpb.fats_no = 2; + fakeBpb.root_ent = 68; + fakeBpb.sectors = 2002; + fakeBpb.media = 0xFE; + fakeBpb.sptrk = 26; + fakeBpb.heads = 1; + fakeBpb.hsectors = 0; + fakeBpb.spfat = 6; } else if(imagePlugin.ImageInfo.Sectors == 1232 && imagePlugin.ImageInfo.SectorSize == 1024) { DicConsole.DebugWriteLine("FAT plugin", "Using hardcoded BPB."); - fakeBPB.bps = 1024; - fakeBPB.spc = 1; - fakeBPB.rsectors = 1; - fakeBPB.fats_no = 2; - fakeBPB.root_ent = 192; - fakeBPB.sectors = 1232; - fakeBPB.media = 0xFE; - fakeBPB.sptrk = 8; - fakeBPB.heads = 2; - fakeBPB.hsectors = 0; - fakeBPB.spfat = 2; + fakeBpb.bps = 1024; + fakeBpb.spc = 1; + fakeBpb.rsectors = 1; + fakeBpb.fats_no = 2; + fakeBpb.root_ent = 192; + fakeBpb.sectors = 1232; + fakeBpb.media = 0xFE; + fakeBpb.sptrk = 8; + fakeBpb.heads = 2; + fakeBpb.hsectors = 0; + fakeBpb.spfat = 2; } else if(imagePlugin.ImageInfo.Sectors == 616 && imagePlugin.ImageInfo.SectorSize == 1024) { DicConsole.DebugWriteLine("FAT plugin", "Using hardcoded BPB."); - fakeBPB.bps = 1024; - fakeBPB.spc = 1; - fakeBPB.rsectors = 1; - fakeBPB.fats_no = 2; - fakeBPB.root_ent = 6192; - fakeBPB.sectors = 616; - fakeBPB.media = 0xFE; - fakeBPB.sptrk = 8; - fakeBPB.heads = 2; - fakeBPB.hsectors = 0; + fakeBpb.bps = 1024; + fakeBpb.spc = 1; + fakeBpb.rsectors = 1; + fakeBpb.fats_no = 2; + fakeBpb.root_ent = 6192; + fakeBpb.sectors = 616; + fakeBpb.media = 0xFE; + fakeBpb.sptrk = 8; + fakeBpb.heads = 2; + fakeBpb.hsectors = 0; } else if(imagePlugin.ImageInfo.Sectors == 720 && imagePlugin.ImageInfo.SectorSize == 128) { DicConsole.DebugWriteLine("FAT plugin", "Using hardcoded BPB."); - fakeBPB.bps = 128; - fakeBPB.spc = 2; - fakeBPB.rsectors = 54; - fakeBPB.fats_no = 2; - fakeBPB.root_ent = 64; - fakeBPB.sectors = 720; - fakeBPB.media = 0xFE; - fakeBPB.sptrk = 18; - fakeBPB.heads = 1; - fakeBPB.hsectors = 0; - fakeBPB.spfat = 4; + fakeBpb.bps = 128; + fakeBpb.spc = 2; + fakeBpb.rsectors = 54; + fakeBpb.fats_no = 2; + fakeBpb.root_ent = 64; + fakeBpb.sectors = 720; + fakeBpb.media = 0xFE; + fakeBpb.sptrk = 18; + fakeBpb.heads = 1; + fakeBpb.hsectors = 0; + fakeBpb.spfat = 4; } else if(imagePlugin.ImageInfo.Sectors == 640 && imagePlugin.ImageInfo.SectorSize == 512) { DicConsole.DebugWriteLine("FAT plugin", "Using hardcoded BPB for 5.25\" DSDD."); - fakeBPB.bps = 512; - fakeBPB.spc = 2; - fakeBPB.rsectors = 1; - fakeBPB.fats_no = 2; - fakeBPB.root_ent = 112; - fakeBPB.sectors = 640; - fakeBPB.media = 0xFF; - fakeBPB.sptrk = 8; - fakeBPB.heads = 2; - fakeBPB.hsectors = 0; - fakeBPB.spfat = 1; + fakeBpb.bps = 512; + fakeBpb.spc = 2; + fakeBpb.rsectors = 1; + fakeBpb.fats_no = 2; + fakeBpb.root_ent = 112; + fakeBpb.sectors = 640; + fakeBpb.media = 0xFF; + fakeBpb.sptrk = 8; + fakeBpb.heads = 2; + fakeBpb.hsectors = 0; + fakeBpb.spfat = 1; } break; case 0xFF: if(imagePlugin.ImageInfo.Sectors == 640 && imagePlugin.ImageInfo.SectorSize == 512) { DicConsole.DebugWriteLine("FAT plugin", "Using hardcoded BPB for 5.25\" DSDD."); - fakeBPB.bps = 512; - fakeBPB.spc = 2; - fakeBPB.rsectors = 1; - fakeBPB.fats_no = 2; - fakeBPB.root_ent = 112; - fakeBPB.sectors = 640; - fakeBPB.media = 0xFF; - fakeBPB.sptrk = 8; - fakeBPB.heads = 2; - fakeBPB.hsectors = 0; - fakeBPB.spfat = 1; + fakeBpb.bps = 512; + fakeBpb.spc = 2; + fakeBpb.rsectors = 1; + fakeBpb.fats_no = 2; + fakeBpb.root_ent = 112; + fakeBpb.sectors = 640; + fakeBpb.media = 0xFF; + fakeBpb.sptrk = 8; + fakeBpb.heads = 2; + fakeBpb.hsectors = 0; + fakeBpb.spfat = 1; } break; } // This assumes a bootable sector will jump somewhere or disable interrupts in x86 code - xmlFSType.Bootable |= bpb_sector[0] == 0xFA || bpb_sector[0] == 0xEB && bpb_sector[1] <= 0x7F; - fakeBPB.boot_code = bpb_sector; + XmlFsType.Bootable |= bpbSector[0] == 0xFA || bpbSector[0] == 0xEB && bpbSector[1] <= 0x7F; + fakeBpb.boot_code = bpbSector; } - else if(useShortFAT32 || useLongFAT32) + else if(useShortFat32 || useLongFat32) { - isFAT32 = true; + isFat32 = true; // This is to support FAT partitions on hybrid ISO/USB images if(imagePlugin.ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc) { - Fat32BPB.bps *= 4; - Fat32BPB.spc /= 4; - Fat32BPB.big_spfat /= 4; - Fat32BPB.hsectors /= 4; - Fat32BPB.sptrk /= 4; + fat32Bpb.bps *= 4; + fat32Bpb.spc /= 4; + fat32Bpb.big_spfat /= 4; + fat32Bpb.hsectors /= 4; + fat32Bpb.sptrk /= 4; } - if(Fat32BPB.version != 0) + if(fat32Bpb.version != 0) { sb.AppendLine("FAT+"); - xmlFSType.Type = "FAT+"; + XmlFsType.Type = "FAT+"; } else { sb.AppendLine("Microsoft FAT32"); - xmlFSType.Type = "FAT32"; + XmlFsType.Type = "FAT32"; } - if(Fat32BPB.oem_name != null) - if(Fat32BPB.oem_name[5] == 0x49 && Fat32BPB.oem_name[6] == 0x48 && Fat32BPB.oem_name[7] == 0x43) + if(fat32Bpb.oem_name != null) + if(fat32Bpb.oem_name[5] == 0x49 && fat32Bpb.oem_name[6] == 0x48 && fat32Bpb.oem_name[7] == 0x43) sb.AppendLine("Volume has been modified by Windows 9x/Me Volume Tracker."); - else xmlFSType.SystemIdentifier = StringHandlers.CToString(Fat32BPB.oem_name); + else XmlFsType.SystemIdentifier = StringHandlers.CToString(fat32Bpb.oem_name); - if(!string.IsNullOrEmpty(xmlFSType.SystemIdentifier)) - sb.AppendFormat("OEM Name: {0}", xmlFSType.SystemIdentifier.Trim()).AppendLine(); - sb.AppendFormat("{0} bytes per sector.", Fat32BPB.bps).AppendLine(); - sb.AppendFormat("{0} sectors per cluster.", Fat32BPB.spc).AppendLine(); - xmlFSType.ClusterSize = Fat32BPB.bps * Fat32BPB.spc; - sb.AppendFormat("{0} sectors reserved between BPB and FAT.", Fat32BPB.rsectors).AppendLine(); - if(Fat32BPB.big_sectors == 0 && Fat32BPB.signature == 0x28) + if(!string.IsNullOrEmpty(XmlFsType.SystemIdentifier)) + sb.AppendFormat("OEM Name: {0}", XmlFsType.SystemIdentifier.Trim()).AppendLine(); + sb.AppendFormat("{0} bytes per sector.", fat32Bpb.bps).AppendLine(); + sb.AppendFormat("{0} sectors per cluster.", fat32Bpb.spc).AppendLine(); + XmlFsType.ClusterSize = fat32Bpb.bps * fat32Bpb.spc; + sb.AppendFormat("{0} sectors reserved between BPB and FAT.", fat32Bpb.rsectors).AppendLine(); + if(fat32Bpb.big_sectors == 0 && fat32Bpb.signature == 0x28) { - sb.AppendFormat("{0} sectors on volume ({1} bytes).", shortFat32BPB.huge_sectors, - shortFat32BPB.huge_sectors * shortFat32BPB.bps).AppendLine(); - xmlFSType.Clusters = (long)(shortFat32BPB.huge_sectors / shortFat32BPB.spc); + sb.AppendFormat("{0} sectors on volume ({1} bytes).", shortFat32Bpb.huge_sectors, + shortFat32Bpb.huge_sectors * shortFat32Bpb.bps).AppendLine(); + XmlFsType.Clusters = (long)(shortFat32Bpb.huge_sectors / shortFat32Bpb.spc); } else { - sb.AppendFormat("{0} sectors on volume ({1} bytes).", Fat32BPB.big_sectors, - Fat32BPB.big_sectors * Fat32BPB.bps).AppendLine(); - xmlFSType.Clusters = Fat32BPB.big_sectors / Fat32BPB.spc; + sb.AppendFormat("{0} sectors on volume ({1} bytes).", fat32Bpb.big_sectors, + fat32Bpb.big_sectors * fat32Bpb.bps).AppendLine(); + XmlFsType.Clusters = fat32Bpb.big_sectors / fat32Bpb.spc; } - sb.AppendFormat("{0} clusters on volume.", xmlFSType.Clusters).AppendLine(); - sb.AppendFormat("Media descriptor: 0x{0:X2}", Fat32BPB.media).AppendLine(); - sb.AppendFormat("{0} sectors per FAT.", Fat32BPB.big_spfat).AppendLine(); - sb.AppendFormat("{0} sectors per track.", Fat32BPB.sptrk).AppendLine(); - sb.AppendFormat("{0} heads.", Fat32BPB.heads).AppendLine(); - sb.AppendFormat("{0} hidden sectors before BPB.", Fat32BPB.hsectors).AppendLine(); - sb.AppendFormat("Cluster of root directory: {0}", Fat32BPB.root_cluster).AppendLine(); - sb.AppendFormat("Sector of FSINFO structure: {0}", Fat32BPB.fsinfo_sector).AppendLine(); - sb.AppendFormat("Sector of backup FAT32 parameter block: {0}", Fat32BPB.backup_sector).AppendLine(); - sb.AppendFormat("Drive number: 0x{0:X2}", Fat32BPB.drive_no).AppendLine(); - sb.AppendFormat("Volume Serial Number: 0x{0:X8}", Fat32BPB.serial_no).AppendLine(); - xmlFSType.VolumeSerial = $"{Fat32BPB.serial_no:X8}"; + sb.AppendFormat("{0} clusters on volume.", XmlFsType.Clusters).AppendLine(); + sb.AppendFormat("Media descriptor: 0x{0:X2}", fat32Bpb.media).AppendLine(); + sb.AppendFormat("{0} sectors per FAT.", fat32Bpb.big_spfat).AppendLine(); + sb.AppendFormat("{0} sectors per track.", fat32Bpb.sptrk).AppendLine(); + sb.AppendFormat("{0} heads.", fat32Bpb.heads).AppendLine(); + sb.AppendFormat("{0} hidden sectors before BPB.", fat32Bpb.hsectors).AppendLine(); + sb.AppendFormat("Cluster of root directory: {0}", fat32Bpb.root_cluster).AppendLine(); + sb.AppendFormat("Sector of FSINFO structure: {0}", fat32Bpb.fsinfo_sector).AppendLine(); + sb.AppendFormat("Sector of backup FAT32 parameter block: {0}", fat32Bpb.backup_sector).AppendLine(); + sb.AppendFormat("Drive number: 0x{0:X2}", fat32Bpb.drive_no).AppendLine(); + sb.AppendFormat("Volume Serial Number: 0x{0:X8}", fat32Bpb.serial_no).AppendLine(); + XmlFsType.VolumeSerial = $"{fat32Bpb.serial_no:X8}"; - if((Fat32BPB.flags & 0xF8) == 0x00) + if((fat32Bpb.flags & 0xF8) == 0x00) { - if((Fat32BPB.flags & 0x01) == 0x01) + if((fat32Bpb.flags & 0x01) == 0x01) { sb.AppendLine("Volume should be checked on next mount."); - xmlFSType.Dirty = true; + XmlFsType.Dirty = true; } - if((Fat32BPB.flags & 0x02) == 0x02) sb.AppendLine("Disk surface should be on next mount."); + if((fat32Bpb.flags & 0x02) == 0x02) sb.AppendLine("Disk surface should be on next mount."); } - if((Fat32BPB.mirror_flags & 0x80) == 0x80) - sb.AppendFormat("FATs are out of sync. FAT #{0} is in use.", Fat32BPB.mirror_flags & 0xF) + if((fat32Bpb.mirror_flags & 0x80) == 0x80) + sb.AppendFormat("FATs are out of sync. FAT #{0} is in use.", fat32Bpb.mirror_flags & 0xF) .AppendLine(); else sb.AppendLine("All copies of FAT are the same."); - if((Fat32BPB.mirror_flags & 0x6F20) == 0x6F20) sb.AppendLine("DR-DOS will boot this FAT32 using CHS."); - else if((Fat32BPB.mirror_flags & 0x4F20) == 0x4F20) + if((fat32Bpb.mirror_flags & 0x6F20) == 0x6F20) sb.AppendLine("DR-DOS will boot this FAT32 using CHS."); + else if((fat32Bpb.mirror_flags & 0x4F20) == 0x4F20) sb.AppendLine("DR-DOS will boot this FAT32 using LBA."); - if(Fat32BPB.signature == 0x29) + if(fat32Bpb.signature == 0x29) { - xmlFSType.VolumeName = Encoding.ASCII.GetString(Fat32BPB.volume_label); - sb.AppendFormat("Filesystem type: {0}", Encoding.ASCII.GetString(Fat32BPB.fs_type)).AppendLine(); - bootChk = sha1Ctx.Data(Fat32BPB.boot_code, out chkTmp); + XmlFsType.VolumeName = Encoding.ASCII.GetString(fat32Bpb.volume_label); + sb.AppendFormat("Filesystem type: {0}", Encoding.ASCII.GetString(fat32Bpb.fs_type)).AppendLine(); + bootChk = sha1Ctx.Data(fat32Bpb.boot_code, out _); } - else bootChk = sha1Ctx.Data(shortFat32BPB.boot_code, out chkTmp); + else bootChk = sha1Ctx.Data(shortFat32Bpb.boot_code, out _); // Check that jumps to a correct boot code position and has boot signature set. // This will mean that the volume will boot, even if just to say "this is not bootable change disk"...... - xmlFSType.Bootable |= Fat32BPB.jump[0] == 0xEB && Fat32BPB.jump[1] > 0x58 && Fat32BPB.jump[1] < 0x80 && - Fat32BPB.boot_signature == 0xAA55; + XmlFsType.Bootable |= fat32Bpb.jump[0] == 0xEB && fat32Bpb.jump[1] > 0x58 && fat32Bpb.jump[1] < 0x80 && + fat32Bpb.boot_signature == 0xAA55; - sectors_per_real_sector = Fat32BPB.bps / imagePlugin.ImageInfo.SectorSize; + sectorsPerRealSector = fat32Bpb.bps / imagePlugin.ImageInfo.SectorSize; // First root directory sector - root_directory_sector = - (ulong)((Fat32BPB.root_cluster - 2) * Fat32BPB.spc + Fat32BPB.big_spfat * Fat32BPB.fats_no + - Fat32BPB.rsectors) * sectors_per_real_sector; - sectors_for_root_directory = 1; + rootDirectorySector = + (ulong)((fat32Bpb.root_cluster - 2) * fat32Bpb.spc + fat32Bpb.big_spfat * fat32Bpb.fats_no + + fat32Bpb.rsectors) * sectorsPerRealSector; + sectorsForRootDirectory = 1; - if(Fat32BPB.fsinfo_sector + partition.Start <= partition.End) + if(fat32Bpb.fsinfo_sector + partition.Start <= partition.End) { - byte[] fsinfo_sector = imagePlugin.ReadSector(Fat32BPB.fsinfo_sector + partition.Start); - IntPtr fsinfo_ptr = Marshal.AllocHGlobal(512); - Marshal.Copy(fsinfo_sector, 0, fsinfo_ptr, 512); - FSInfoSector fs_info = (FSInfoSector)Marshal.PtrToStructure(fsinfo_ptr, typeof(FSInfoSector)); - Marshal.FreeHGlobal(fsinfo_ptr); + byte[] fsinfoSector = imagePlugin.ReadSector(fat32Bpb.fsinfo_sector + partition.Start); + IntPtr fsinfoPtr = Marshal.AllocHGlobal(512); + Marshal.Copy(fsinfoSector, 0, fsinfoPtr, 512); + FsInfoSector fsInfo = (FsInfoSector)Marshal.PtrToStructure(fsinfoPtr, typeof(FsInfoSector)); + Marshal.FreeHGlobal(fsinfoPtr); - if(fs_info.signature1 == fsinfo_signature1 && fs_info.signature2 == fsinfo_signature2 && - fs_info.signature3 == fsinfo_signature3) + if(fsInfo.signature1 == FSINFO_SIGNATURE1 && fsInfo.signature2 == FSINFO_SIGNATURE2 && + fsInfo.signature3 == FSINFO_SIGNATURE3) { - if(fs_info.free_clusters < 0xFFFFFFFF) + if(fsInfo.free_clusters < 0xFFFFFFFF) { - sb.AppendFormat("{0} free clusters", fs_info.free_clusters).AppendLine(); - xmlFSType.FreeClusters = fs_info.free_clusters; - xmlFSType.FreeClustersSpecified = true; + sb.AppendFormat("{0} free clusters", fsInfo.free_clusters).AppendLine(); + XmlFsType.FreeClusters = fsInfo.free_clusters; + XmlFsType.FreeClustersSpecified = true; } - if(fs_info.last_cluster > 2 && fs_info.last_cluster < 0xFFFFFFFF) - sb.AppendFormat("Last allocated cluster {0}", fs_info.last_cluster).AppendLine(); + if(fsInfo.last_cluster > 2 && fsInfo.last_cluster < 0xFFFFFFFF) + sb.AppendFormat("Last allocated cluster {0}", fsInfo.last_cluster).AppendLine(); } } } - else if(useEBPB) fakeBPB = EBPB; - else if(useShortEBPB) + else if(useExtendedBpb) fakeBpb = ebpb; + else if(userShortExtendedBpb) { - fakeBPB.jump = shortEBPB.jump; - fakeBPB.oem_name = shortEBPB.oem_name; - fakeBPB.bps = shortEBPB.bps; - fakeBPB.spc = shortEBPB.spc; - fakeBPB.rsectors = shortEBPB.rsectors; - fakeBPB.fats_no = shortEBPB.fats_no; - fakeBPB.root_ent = shortEBPB.root_ent; - fakeBPB.sectors = shortEBPB.sectors; - fakeBPB.media = shortEBPB.media; - fakeBPB.spfat = shortEBPB.spfat; - fakeBPB.sptrk = shortEBPB.sptrk; - fakeBPB.heads = shortEBPB.heads; - fakeBPB.hsectors = shortEBPB.hsectors; - fakeBPB.big_sectors = shortEBPB.big_sectors; - fakeBPB.drive_no = shortEBPB.drive_no; - fakeBPB.flags = shortEBPB.flags; - fakeBPB.signature = shortEBPB.signature; - fakeBPB.serial_no = shortEBPB.serial_no; - fakeBPB.boot_code = shortEBPB.boot_code; - fakeBPB.boot_signature = shortEBPB.boot_signature; + fakeBpb.jump = shortEbpb.jump; + fakeBpb.oem_name = shortEbpb.oem_name; + fakeBpb.bps = shortEbpb.bps; + fakeBpb.spc = shortEbpb.spc; + fakeBpb.rsectors = shortEbpb.rsectors; + fakeBpb.fats_no = shortEbpb.fats_no; + fakeBpb.root_ent = shortEbpb.root_ent; + fakeBpb.sectors = shortEbpb.sectors; + fakeBpb.media = shortEbpb.media; + fakeBpb.spfat = shortEbpb.spfat; + fakeBpb.sptrk = shortEbpb.sptrk; + fakeBpb.heads = shortEbpb.heads; + fakeBpb.hsectors = shortEbpb.hsectors; + fakeBpb.big_sectors = shortEbpb.big_sectors; + fakeBpb.drive_no = shortEbpb.drive_no; + fakeBpb.flags = shortEbpb.flags; + fakeBpb.signature = shortEbpb.signature; + fakeBpb.serial_no = shortEbpb.serial_no; + fakeBpb.boot_code = shortEbpb.boot_code; + fakeBpb.boot_signature = shortEbpb.boot_signature; } - else if(useDOS33BPB) + else if(useDos33Bpb) { - fakeBPB.jump = dos33BPB.jump; - fakeBPB.oem_name = dos33BPB.oem_name; - fakeBPB.bps = dos33BPB.bps; - fakeBPB.spc = dos33BPB.spc; - fakeBPB.rsectors = dos33BPB.rsectors; - fakeBPB.fats_no = dos33BPB.fats_no; - fakeBPB.root_ent = dos33BPB.root_ent; - fakeBPB.sectors = dos33BPB.sectors; - fakeBPB.media = dos33BPB.media; - fakeBPB.spfat = dos33BPB.spfat; - fakeBPB.sptrk = dos33BPB.sptrk; - fakeBPB.heads = dos33BPB.heads; - fakeBPB.hsectors = dos33BPB.hsectors; - fakeBPB.big_sectors = dos33BPB.big_sectors; - fakeBPB.boot_code = dos33BPB.boot_code; - fakeBPB.boot_signature = dos33BPB.boot_signature; + fakeBpb.jump = dos33Bpb.jump; + fakeBpb.oem_name = dos33Bpb.oem_name; + fakeBpb.bps = dos33Bpb.bps; + fakeBpb.spc = dos33Bpb.spc; + fakeBpb.rsectors = dos33Bpb.rsectors; + fakeBpb.fats_no = dos33Bpb.fats_no; + fakeBpb.root_ent = dos33Bpb.root_ent; + fakeBpb.sectors = dos33Bpb.sectors; + fakeBpb.media = dos33Bpb.media; + fakeBpb.spfat = dos33Bpb.spfat; + fakeBpb.sptrk = dos33Bpb.sptrk; + fakeBpb.heads = dos33Bpb.heads; + fakeBpb.hsectors = dos33Bpb.hsectors; + fakeBpb.big_sectors = dos33Bpb.big_sectors; + fakeBpb.boot_code = dos33Bpb.boot_code; + fakeBpb.boot_signature = dos33Bpb.boot_signature; } - else if(useDOS32BPB) + else if(useDos32Bpb) { - fakeBPB.jump = dos32BPB.jump; - fakeBPB.oem_name = dos32BPB.oem_name; - fakeBPB.bps = dos32BPB.bps; - fakeBPB.spc = dos32BPB.spc; - fakeBPB.rsectors = dos32BPB.rsectors; - fakeBPB.fats_no = dos32BPB.fats_no; - fakeBPB.root_ent = dos32BPB.root_ent; - fakeBPB.sectors = dos32BPB.sectors; - fakeBPB.media = dos32BPB.media; - fakeBPB.spfat = dos32BPB.spfat; - fakeBPB.sptrk = dos32BPB.sptrk; - fakeBPB.heads = dos32BPB.heads; - fakeBPB.hsectors = dos32BPB.hsectors; - fakeBPB.boot_code = dos32BPB.boot_code; - fakeBPB.boot_signature = dos32BPB.boot_signature; + fakeBpb.jump = dos32Bpb.jump; + fakeBpb.oem_name = dos32Bpb.oem_name; + fakeBpb.bps = dos32Bpb.bps; + fakeBpb.spc = dos32Bpb.spc; + fakeBpb.rsectors = dos32Bpb.rsectors; + fakeBpb.fats_no = dos32Bpb.fats_no; + fakeBpb.root_ent = dos32Bpb.root_ent; + fakeBpb.sectors = dos32Bpb.sectors; + fakeBpb.media = dos32Bpb.media; + fakeBpb.spfat = dos32Bpb.spfat; + fakeBpb.sptrk = dos32Bpb.sptrk; + fakeBpb.heads = dos32Bpb.heads; + fakeBpb.hsectors = dos32Bpb.hsectors; + fakeBpb.boot_code = dos32Bpb.boot_code; + fakeBpb.boot_signature = dos32Bpb.boot_signature; } - else if(useDOS3BPB) + else if(useDos3Bpb) { - fakeBPB.jump = dos30BPB.jump; - fakeBPB.oem_name = dos30BPB.oem_name; - fakeBPB.bps = dos30BPB.bps; - fakeBPB.spc = dos30BPB.spc; - fakeBPB.rsectors = dos30BPB.rsectors; - fakeBPB.fats_no = dos30BPB.fats_no; - fakeBPB.root_ent = dos30BPB.root_ent; - fakeBPB.sectors = dos30BPB.sectors; - fakeBPB.media = dos30BPB.media; - fakeBPB.spfat = dos30BPB.spfat; - fakeBPB.sptrk = dos30BPB.sptrk; - fakeBPB.heads = dos30BPB.heads; - fakeBPB.hsectors = dos30BPB.hsectors; - fakeBPB.boot_code = dos30BPB.boot_code; - fakeBPB.boot_signature = dos30BPB.boot_signature; + fakeBpb.jump = dos30Bpb.jump; + fakeBpb.oem_name = dos30Bpb.oem_name; + fakeBpb.bps = dos30Bpb.bps; + fakeBpb.spc = dos30Bpb.spc; + fakeBpb.rsectors = dos30Bpb.rsectors; + fakeBpb.fats_no = dos30Bpb.fats_no; + fakeBpb.root_ent = dos30Bpb.root_ent; + fakeBpb.sectors = dos30Bpb.sectors; + fakeBpb.media = dos30Bpb.media; + fakeBpb.spfat = dos30Bpb.spfat; + fakeBpb.sptrk = dos30Bpb.sptrk; + fakeBpb.heads = dos30Bpb.heads; + fakeBpb.hsectors = dos30Bpb.hsectors; + fakeBpb.boot_code = dos30Bpb.boot_code; + fakeBpb.boot_signature = dos30Bpb.boot_signature; } - else if(useDOS2BPB) + else if(useDos2Bpb) { - fakeBPB.jump = dos2BPB.jump; - fakeBPB.oem_name = dos2BPB.oem_name; - fakeBPB.bps = dos2BPB.bps; - fakeBPB.spc = dos2BPB.spc; - fakeBPB.rsectors = dos2BPB.rsectors; - fakeBPB.fats_no = dos2BPB.fats_no; - fakeBPB.root_ent = dos2BPB.root_ent; - fakeBPB.sectors = dos2BPB.sectors; - fakeBPB.media = dos2BPB.media; - fakeBPB.spfat = dos2BPB.spfat; - fakeBPB.boot_code = dos2BPB.boot_code; - fakeBPB.boot_signature = dos2BPB.boot_signature; + fakeBpb.jump = dos2Bpb.jump; + fakeBpb.oem_name = dos2Bpb.oem_name; + fakeBpb.bps = dos2Bpb.bps; + fakeBpb.spc = dos2Bpb.spc; + fakeBpb.rsectors = dos2Bpb.rsectors; + fakeBpb.fats_no = dos2Bpb.fats_no; + fakeBpb.root_ent = dos2Bpb.root_ent; + fakeBpb.sectors = dos2Bpb.sectors; + fakeBpb.media = dos2Bpb.media; + fakeBpb.spfat = dos2Bpb.spfat; + fakeBpb.boot_code = dos2Bpb.boot_code; + fakeBpb.boot_signature = dos2Bpb.boot_signature; } - else if(useMSXBPB) + else if(useMsxBpb) { - isFAT12 = true; - fakeBPB.jump = msxBPB.jump; - fakeBPB.oem_name = msxBPB.oem_name; - fakeBPB.bps = msxBPB.bps; - fakeBPB.spc = msxBPB.spc; - fakeBPB.rsectors = msxBPB.rsectors; - fakeBPB.fats_no = msxBPB.fats_no; - fakeBPB.root_ent = msxBPB.root_ent; - fakeBPB.sectors = msxBPB.sectors; - fakeBPB.media = msxBPB.media; - fakeBPB.spfat = msxBPB.spfat; - fakeBPB.sptrk = msxBPB.sptrk; - fakeBPB.heads = msxBPB.heads; - fakeBPB.hsectors = msxBPB.hsectors; - fakeBPB.boot_code = msxBPB.boot_code; - fakeBPB.boot_signature = msxBPB.boot_signature; - fakeBPB.serial_no = msxBPB.serial_no; + isFat12 = true; + fakeBpb.jump = msxBpb.jump; + fakeBpb.oem_name = msxBpb.oem_name; + fakeBpb.bps = msxBpb.bps; + fakeBpb.spc = msxBpb.spc; + fakeBpb.rsectors = msxBpb.rsectors; + fakeBpb.fats_no = msxBpb.fats_no; + fakeBpb.root_ent = msxBpb.root_ent; + fakeBpb.sectors = msxBpb.sectors; + fakeBpb.media = msxBpb.media; + fakeBpb.spfat = msxBpb.spfat; + fakeBpb.sptrk = msxBpb.sptrk; + fakeBpb.heads = msxBpb.heads; + fakeBpb.hsectors = msxBpb.hsectors; + fakeBpb.boot_code = msxBpb.boot_code; + fakeBpb.boot_signature = msxBpb.boot_signature; + fakeBpb.serial_no = msxBpb.serial_no; // TODO: Is there any way to check this? - xmlFSType.Bootable = true; + XmlFsType.Bootable = true; } - else if(useAtariBPB) + else if(useAtariBpb) { - fakeBPB.jump = atariBPB.jump; - fakeBPB.oem_name = atariBPB.oem_name; - fakeBPB.bps = atariBPB.bps; - fakeBPB.spc = atariBPB.spc; - fakeBPB.rsectors = atariBPB.rsectors; - fakeBPB.fats_no = atariBPB.fats_no; - fakeBPB.root_ent = atariBPB.root_ent; - fakeBPB.sectors = atariBPB.sectors; - fakeBPB.media = atariBPB.media; - fakeBPB.spfat = atariBPB.spfat; - fakeBPB.sptrk = atariBPB.sptrk; - fakeBPB.heads = atariBPB.heads; - fakeBPB.boot_code = atariBPB.boot_code; + fakeBpb.jump = atariBpb.jump; + fakeBpb.oem_name = atariBpb.oem_name; + fakeBpb.bps = atariBpb.bps; + fakeBpb.spc = atariBpb.spc; + fakeBpb.rsectors = atariBpb.rsectors; + fakeBpb.fats_no = atariBpb.fats_no; + fakeBpb.root_ent = atariBpb.root_ent; + fakeBpb.sectors = atariBpb.sectors; + fakeBpb.media = atariBpb.media; + fakeBpb.spfat = atariBpb.spfat; + fakeBpb.sptrk = atariBpb.sptrk; + fakeBpb.heads = atariBpb.heads; + fakeBpb.boot_code = atariBpb.boot_code; ushort sum = 0; BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; - for(int i = 0; i < bpb_sector.Length; i += 2) sum += BigEndianBitConverter.ToUInt16(bpb_sector, i); + for(int i = 0; i < bpbSector.Length; i += 2) sum += BigEndianBitConverter.ToUInt16(bpbSector, i); // TODO: Check this if(sum == 0x1234) { - xmlFSType.Bootable = true; + XmlFsType.Bootable = true; StringBuilder atariSb = new StringBuilder(); atariSb.AppendFormat("cmdload will be loaded with value {0:X4}h", - BigEndianBitConverter.ToUInt16(bpb_sector, 0x01E)).AppendLine(); - atariSb.AppendFormat("Boot program will be loaded at address {0:X4}h", atariBPB.ldaaddr) + BigEndianBitConverter.ToUInt16(bpbSector, 0x01E)).AppendLine(); + atariSb.AppendFormat("Boot program will be loaded at address {0:X4}h", atariBpb.ldaaddr) .AppendLine(); - atariSb.AppendFormat("FAT and directory will be cached at address {0:X4}h", atariBPB.fatbuf) + atariSb.AppendFormat("FAT and directory will be cached at address {0:X4}h", atariBpb.fatbuf) .AppendLine(); - if(atariBPB.ldmode == 0) + if(atariBpb.ldmode == 0) { byte[] tmp = new byte[8]; - Array.Copy(atariBPB.fname, 0, tmp, 0, 8); + Array.Copy(atariBpb.fname, 0, tmp, 0, 8); string fname = Encoding.ASCII.GetString(tmp).Trim(); tmp = new byte[3]; - Array.Copy(atariBPB.fname, 8, tmp, 0, 3); + Array.Copy(atariBpb.fname, 8, tmp, 0, 3); string extension = Encoding.ASCII.GetString(tmp).Trim(); string filename; @@ -1106,250 +1102,248 @@ namespace DiscImageChef.Filesystems } else atariSb.AppendFormat("Boot program starts in sector {0} and is {1} sectors long ({2} bytes)", - atariBPB.ssect, atariBPB.sectcnt, atariBPB.sectcnt * atariBPB.bps) + atariBpb.ssect, atariBpb.sectcnt, atariBpb.sectcnt * atariBpb.bps) .AppendLine(); extraInfo = atariSb.ToString(); } } - else if(useApricotBPB) + else if(useApricotBpb) { - isFAT12 = true; - fakeBPB.bps = ApricotBPB.mainBPB.bps; - fakeBPB.spc = ApricotBPB.mainBPB.spc; - fakeBPB.rsectors = ApricotBPB.mainBPB.rsectors; - fakeBPB.fats_no = ApricotBPB.mainBPB.fats_no; - fakeBPB.root_ent = ApricotBPB.mainBPB.root_ent; - fakeBPB.sectors = ApricotBPB.mainBPB.sectors; - fakeBPB.media = ApricotBPB.mainBPB.media; - fakeBPB.spfat = ApricotBPB.mainBPB.spfat; - fakeBPB.sptrk = ApricotBPB.spt; - xmlFSType.Bootable = ApricotBPB.bootType > 0; + isFat12 = true; + fakeBpb.bps = apricotBpb.mainBPB.bps; + fakeBpb.spc = apricotBpb.mainBPB.spc; + fakeBpb.rsectors = apricotBpb.mainBPB.rsectors; + fakeBpb.fats_no = apricotBpb.mainBPB.fats_no; + fakeBpb.root_ent = apricotBpb.mainBPB.root_ent; + fakeBpb.sectors = apricotBpb.mainBPB.sectors; + fakeBpb.media = apricotBpb.mainBPB.media; + fakeBpb.spfat = apricotBpb.mainBPB.spfat; + fakeBpb.sptrk = apricotBpb.spt; + XmlFsType.Bootable = apricotBpb.bootType > 0; - if(ApricotBPB.bootLocation > 0 && - ApricotBPB.bootLocation + ApricotBPB.bootSize < imagePlugin.GetSectors()) - fakeBPB.boot_code = imagePlugin.ReadSectors(ApricotBPB.bootLocation, - (uint)(ApricotBPB.sectorSize * ApricotBPB.bootSize) / + if(apricotBpb.bootLocation > 0 && + apricotBpb.bootLocation + apricotBpb.bootSize < imagePlugin.GetSectors()) + fakeBpb.boot_code = imagePlugin.ReadSectors(apricotBpb.bootLocation, + (uint)(apricotBpb.sectorSize * apricotBpb.bootSize) / imagePlugin.GetSectorSize()); } - if(!isFAT32) + if(!isFat32) { // This is to support FAT partitions on hybrid ISO/USB images if(imagePlugin.ImageInfo.XmlMediaType == XmlMediaType.OpticalDisc) { - fakeBPB.bps *= 4; - fakeBPB.spc /= 4; - fakeBPB.spfat /= 4; - fakeBPB.hsectors /= 4; - fakeBPB.sptrk /= 4; - fakeBPB.rsectors /= 4; + fakeBpb.bps *= 4; + fakeBpb.spc /= 4; + fakeBpb.spfat /= 4; + fakeBpb.hsectors /= 4; + fakeBpb.sptrk /= 4; + fakeBpb.rsectors /= 4; - if(fakeBPB.spc == 0) fakeBPB.spc = 1; + if(fakeBpb.spc == 0) fakeBpb.spc = 1; } // This assumes no sane implementation will violate cluster size rules // However nothing prevents this to happen // If first file on disk uses only one cluster there is absolutely no way to differentiate between FAT12 and FAT16, // so let's hope implementations use common sense? - if(!isFAT12 && !isFAT16) + if(!isFat12 && !isFat16) { ulong clusters; - if(fakeBPB.sectors == 0) - clusters = fakeBPB.spc == 0 ? fakeBPB.big_sectors : fakeBPB.big_sectors / fakeBPB.spc; - else clusters = fakeBPB.spc == 0 ? fakeBPB.sectors : (ulong)fakeBPB.sectors / fakeBPB.spc; + if(fakeBpb.sectors == 0) + clusters = fakeBpb.spc == 0 ? fakeBpb.big_sectors : fakeBpb.big_sectors / fakeBpb.spc; + else clusters = fakeBpb.spc == 0 ? fakeBpb.sectors : (ulong)fakeBpb.sectors / fakeBpb.spc; - if(clusters < 4089) isFAT12 = true; - else isFAT16 = true; + if(clusters < 4089) isFat12 = true; + else isFat16 = true; } - if(isFAT12) + if(isFat12) { - if(useAtariBPB) sb.AppendLine("Atari FAT12"); - else if(useApricotBPB) sb.AppendLine("Apricot FAT12"); + if(useAtariBpb) sb.AppendLine("Atari FAT12"); + else if(useApricotBpb) sb.AppendLine("Apricot FAT12"); else sb.AppendLine("Microsoft FAT12"); - xmlFSType.Type = "FAT12"; + XmlFsType.Type = "FAT12"; } - else if(isFAT16) + else if(isFat16) { - if(useAtariBPB) sb.AppendLine("Atari FAT16"); - else sb.AppendLine("Microsoft FAT16"); - xmlFSType.Type = "FAT16"; + sb.AppendLine(useAtariBpb ? "Atari FAT16" : "Microsoft FAT16"); + XmlFsType.Type = "FAT16"; } - if(useAtariBPB) + if(useAtariBpb) { - if(atariBPB.serial_no[0] == 0x49 && atariBPB.serial_no[1] == 0x48 && atariBPB.serial_no[2] == 0x43) + if(atariBpb.serial_no[0] == 0x49 && atariBpb.serial_no[1] == 0x48 && atariBpb.serial_no[2] == 0x43) sb.AppendLine("Volume has been modified by Windows 9x/Me Volume Tracker."); else - xmlFSType.VolumeSerial = - $"{atariBPB.serial_no[0]:X2}{atariBPB.serial_no[1]:X2}{atariBPB.serial_no[2]:X2}"; + XmlFsType.VolumeSerial = + $"{atariBpb.serial_no[0]:X2}{atariBpb.serial_no[1]:X2}{atariBpb.serial_no[2]:X2}"; - xmlFSType.SystemIdentifier = StringHandlers.CToString(atariBPB.oem_name); - if(string.IsNullOrEmpty(xmlFSType.SystemIdentifier)) xmlFSType.SystemIdentifier = null; + XmlFsType.SystemIdentifier = StringHandlers.CToString(atariBpb.oem_name); + if(string.IsNullOrEmpty(XmlFsType.SystemIdentifier)) XmlFsType.SystemIdentifier = null; } - else if(fakeBPB.oem_name != null) + else if(fakeBpb.oem_name != null) { - if(fakeBPB.oem_name[5] == 0x49 && fakeBPB.oem_name[6] == 0x48 && fakeBPB.oem_name[7] == 0x43) + if(fakeBpb.oem_name[5] == 0x49 && fakeBpb.oem_name[6] == 0x48 && fakeBpb.oem_name[7] == 0x43) sb.AppendLine("Volume has been modified by Windows 9x/Me Volume Tracker."); else { // Later versions of Windows create a DOS 3 BPB without OEM name on 8 sectors/track floppies // OEM ID should be ASCII, otherwise ignore it - if(fakeBPB.oem_name[0] >= 0x20 && fakeBPB.oem_name[0] <= 0x7F && fakeBPB.oem_name[1] >= 0x20 && - fakeBPB.oem_name[1] <= 0x7F && fakeBPB.oem_name[2] >= 0x20 && fakeBPB.oem_name[2] <= 0x7F && - fakeBPB.oem_name[3] >= 0x20 && fakeBPB.oem_name[3] <= 0x7F && fakeBPB.oem_name[4] >= 0x20 && - fakeBPB.oem_name[4] <= 0x7F && fakeBPB.oem_name[5] >= 0x20 && fakeBPB.oem_name[5] <= 0x7F && - fakeBPB.oem_name[6] >= 0x20 && fakeBPB.oem_name[6] <= 0x7F && fakeBPB.oem_name[7] >= 0x20 && - fakeBPB.oem_name[7] <= 0x7F) - xmlFSType.SystemIdentifier = StringHandlers.CToString(fakeBPB.oem_name); - else if(fakeBPB.oem_name[0] < 0x20 && fakeBPB.oem_name[1] >= 0x20 && - fakeBPB.oem_name[1] <= 0x7F && fakeBPB.oem_name[2] >= 0x20 && - fakeBPB.oem_name[2] <= 0x7F && fakeBPB.oem_name[3] >= 0x20 && - fakeBPB.oem_name[3] <= 0x7F && fakeBPB.oem_name[4] >= 0x20 && - fakeBPB.oem_name[4] <= 0x7F && fakeBPB.oem_name[5] >= 0x20 && - fakeBPB.oem_name[5] <= 0x7F && fakeBPB.oem_name[6] >= 0x20 && - fakeBPB.oem_name[6] <= 0x7F && fakeBPB.oem_name[7] >= 0x20 && - fakeBPB.oem_name[7] <= 0x7F) - xmlFSType.SystemIdentifier = - StringHandlers.CToString(fakeBPB.oem_name, CurrentEncoding, start: 1); + if(fakeBpb.oem_name[0] >= 0x20 && fakeBpb.oem_name[0] <= 0x7F && fakeBpb.oem_name[1] >= 0x20 && + fakeBpb.oem_name[1] <= 0x7F && fakeBpb.oem_name[2] >= 0x20 && fakeBpb.oem_name[2] <= 0x7F && + fakeBpb.oem_name[3] >= 0x20 && fakeBpb.oem_name[3] <= 0x7F && fakeBpb.oem_name[4] >= 0x20 && + fakeBpb.oem_name[4] <= 0x7F && fakeBpb.oem_name[5] >= 0x20 && fakeBpb.oem_name[5] <= 0x7F && + fakeBpb.oem_name[6] >= 0x20 && fakeBpb.oem_name[6] <= 0x7F && fakeBpb.oem_name[7] >= 0x20 && + fakeBpb.oem_name[7] <= 0x7F) + XmlFsType.SystemIdentifier = StringHandlers.CToString(fakeBpb.oem_name); + else if(fakeBpb.oem_name[0] < 0x20 && fakeBpb.oem_name[1] >= 0x20 && + fakeBpb.oem_name[1] <= 0x7F && fakeBpb.oem_name[2] >= 0x20 && + fakeBpb.oem_name[2] <= 0x7F && fakeBpb.oem_name[3] >= 0x20 && + fakeBpb.oem_name[3] <= 0x7F && fakeBpb.oem_name[4] >= 0x20 && + fakeBpb.oem_name[4] <= 0x7F && fakeBpb.oem_name[5] >= 0x20 && + fakeBpb.oem_name[5] <= 0x7F && fakeBpb.oem_name[6] >= 0x20 && + fakeBpb.oem_name[6] <= 0x7F && fakeBpb.oem_name[7] >= 0x20 && + fakeBpb.oem_name[7] <= 0x7F) + XmlFsType.SystemIdentifier = + StringHandlers.CToString(fakeBpb.oem_name, CurrentEncoding, start: 1); } - if(fakeBPB.signature == 0x28 || fakeBPB.signature == 0x29) - xmlFSType.VolumeSerial = $"{fakeBPB.serial_no:X8}"; + if(fakeBpb.signature == 0x28 || fakeBpb.signature == 0x29) + XmlFsType.VolumeSerial = $"{fakeBpb.serial_no:X8}"; } - if(xmlFSType.SystemIdentifier != null) - sb.AppendFormat("OEM Name: {0}", xmlFSType.SystemIdentifier.Trim()).AppendLine(); + if(XmlFsType.SystemIdentifier != null) + sb.AppendFormat("OEM Name: {0}", XmlFsType.SystemIdentifier.Trim()).AppendLine(); - sb.AppendFormat("{0} bytes per sector.", fakeBPB.bps).AppendLine(); - if(fakeBPB.sectors == 0) + sb.AppendFormat("{0} bytes per sector.", fakeBpb.bps).AppendLine(); + if(fakeBpb.sectors == 0) { - sb.AppendFormat("{0} sectors on volume ({1} bytes).", fakeBPB.big_sectors, - fakeBPB.big_sectors * fakeBPB.bps).AppendLine(); - xmlFSType.Clusters = fakeBPB.spc == 0 ? fakeBPB.big_sectors : fakeBPB.big_sectors / fakeBPB.spc; + sb.AppendFormat("{0} sectors on volume ({1} bytes).", fakeBpb.big_sectors, + fakeBpb.big_sectors * fakeBpb.bps).AppendLine(); + XmlFsType.Clusters = fakeBpb.spc == 0 ? fakeBpb.big_sectors : fakeBpb.big_sectors / fakeBpb.spc; } else { - sb.AppendFormat("{0} sectors on volume ({1} bytes).", fakeBPB.sectors, - fakeBPB.sectors * fakeBPB.bps).AppendLine(); - xmlFSType.Clusters = fakeBPB.spc == 0 ? fakeBPB.sectors : fakeBPB.sectors / fakeBPB.spc; + sb.AppendFormat("{0} sectors on volume ({1} bytes).", fakeBpb.sectors, + fakeBpb.sectors * fakeBpb.bps).AppendLine(); + XmlFsType.Clusters = fakeBpb.spc == 0 ? fakeBpb.sectors : fakeBpb.sectors / fakeBpb.spc; } - sb.AppendFormat("{0} sectors per cluster.", fakeBPB.spc).AppendLine(); - sb.AppendFormat("{0} clusters on volume.", xmlFSType.Clusters).AppendLine(); - xmlFSType.ClusterSize = fakeBPB.bps * fakeBPB.spc; - sb.AppendFormat("{0} sectors reserved between BPB and FAT.", fakeBPB.rsectors).AppendLine(); - sb.AppendFormat("{0} FATs.", fakeBPB.fats_no).AppendLine(); - sb.AppendFormat("{0} entries on root directory.", fakeBPB.root_ent).AppendLine(); + sb.AppendFormat("{0} sectors per cluster.", fakeBpb.spc).AppendLine(); + sb.AppendFormat("{0} clusters on volume.", XmlFsType.Clusters).AppendLine(); + XmlFsType.ClusterSize = fakeBpb.bps * fakeBpb.spc; + sb.AppendFormat("{0} sectors reserved between BPB and FAT.", fakeBpb.rsectors).AppendLine(); + sb.AppendFormat("{0} FATs.", fakeBpb.fats_no).AppendLine(); + sb.AppendFormat("{0} entries on root directory.", fakeBpb.root_ent).AppendLine(); - if(fakeBPB.media > 0) sb.AppendFormat("Media descriptor: 0x{0:X2}", fakeBPB.media).AppendLine(); + if(fakeBpb.media > 0) sb.AppendFormat("Media descriptor: 0x{0:X2}", fakeBpb.media).AppendLine(); - sb.AppendFormat("{0} sectors per FAT.", fakeBPB.spfat).AppendLine(); + sb.AppendFormat("{0} sectors per FAT.", fakeBpb.spfat).AppendLine(); - if(fakeBPB.sptrk > 0 && fakeBPB.sptrk < 64 && fakeBPB.heads > 0 && fakeBPB.heads < 256) + if(fakeBpb.sptrk > 0 && fakeBpb.sptrk < 64 && fakeBpb.heads > 0 && fakeBpb.heads < 256) { - sb.AppendFormat("{0} sectors per track.", fakeBPB.sptrk).AppendLine(); - sb.AppendFormat("{0} heads.", fakeBPB.heads).AppendLine(); + sb.AppendFormat("{0} sectors per track.", fakeBpb.sptrk).AppendLine(); + sb.AppendFormat("{0} heads.", fakeBpb.heads).AppendLine(); } - if(fakeBPB.hsectors <= partition.Start) - sb.AppendFormat("{0} hidden sectors before BPB.", fakeBPB.hsectors).AppendLine(); + if(fakeBpb.hsectors <= partition.Start) + sb.AppendFormat("{0} hidden sectors before BPB.", fakeBpb.hsectors).AppendLine(); - if(fakeBPB.signature == 0x28 || fakeBPB.signature == 0x29 || andos_oem_correct) + if(fakeBpb.signature == 0x28 || fakeBpb.signature == 0x29 || andosOemCorrect) { - sb.AppendFormat("Drive number: 0x{0:X2}", fakeBPB.drive_no).AppendLine(); + sb.AppendFormat("Drive number: 0x{0:X2}", fakeBpb.drive_no).AppendLine(); - if(xmlFSType.VolumeSerial != null) - sb.AppendFormat("Volume Serial Number: {0}", xmlFSType.VolumeSerial).AppendLine(); + if(XmlFsType.VolumeSerial != null) + sb.AppendFormat("Volume Serial Number: {0}", XmlFsType.VolumeSerial).AppendLine(); - if((fakeBPB.flags & 0xF8) == 0x00) + if((fakeBpb.flags & 0xF8) == 0x00) { - if((fakeBPB.flags & 0x01) == 0x01) + if((fakeBpb.flags & 0x01) == 0x01) { sb.AppendLine("Volume should be checked on next mount."); - xmlFSType.Dirty = true; + XmlFsType.Dirty = true; } - if((fakeBPB.flags & 0x02) == 0x02) sb.AppendLine("Disk surface should be on next mount."); + if((fakeBpb.flags & 0x02) == 0x02) sb.AppendLine("Disk surface should be on next mount."); } - if(fakeBPB.signature == 0x29 || andos_oem_correct) + if(fakeBpb.signature == 0x29 || andosOemCorrect) { - xmlFSType.VolumeName = Encoding.ASCII.GetString(fakeBPB.volume_label); - sb.AppendFormat("Filesystem type: {0}", Encoding.ASCII.GetString(fakeBPB.fs_type)).AppendLine(); + XmlFsType.VolumeName = Encoding.ASCII.GetString(fakeBpb.volume_label); + sb.AppendFormat("Filesystem type: {0}", Encoding.ASCII.GetString(fakeBpb.fs_type)).AppendLine(); } } - else if(useAtariBPB && xmlFSType.VolumeSerial != null) - sb.AppendFormat("Volume Serial Number: {0}", xmlFSType.VolumeSerial).AppendLine(); + else if(useAtariBpb && XmlFsType.VolumeSerial != null) + sb.AppendFormat("Volume Serial Number: {0}", XmlFsType.VolumeSerial).AppendLine(); - bootChk = sha1Ctx.Data(fakeBPB.boot_code, out chkTmp); + bootChk = sha1Ctx.Data(fakeBpb.boot_code, out _); // Check that jumps to a correct boot code position and has boot signature set. // This will mean that the volume will boot, even if just to say "this is not bootable change disk"...... - if(xmlFSType.Bootable == false && fakeBPB.jump != null) - xmlFSType.Bootable |= fakeBPB.jump[0] == 0xEB && fakeBPB.jump[1] > 0x58 && - fakeBPB.jump[1] < 0x80 && fakeBPB.boot_signature == 0xAA55; + if(XmlFsType.Bootable == false && fakeBpb.jump != null) + XmlFsType.Bootable |= fakeBpb.jump[0] == 0xEB && fakeBpb.jump[1] > 0x58 && + fakeBpb.jump[1] < 0x80 && fakeBpb.boot_signature == 0xAA55; - sectors_per_real_sector = fakeBPB.bps / imagePlugin.ImageInfo.SectorSize; + sectorsPerRealSector = fakeBpb.bps / imagePlugin.ImageInfo.SectorSize; // First root directory sector - root_directory_sector = - (ulong)(fakeBPB.spfat * fakeBPB.fats_no + fakeBPB.rsectors) * sectors_per_real_sector; - sectors_for_root_directory = (uint)(fakeBPB.root_ent * 32 / imagePlugin.ImageInfo.SectorSize); + rootDirectorySector = + (ulong)(fakeBpb.spfat * fakeBpb.fats_no + fakeBpb.rsectors) * sectorsPerRealSector; + sectorsForRootDirectory = (uint)(fakeBpb.root_ent * 32 / imagePlugin.ImageInfo.SectorSize); } if(extraInfo != null) sb.Append(extraInfo); - if(root_directory_sector + partition.Start < partition.End && + if(rootDirectorySector + partition.Start < partition.End && imagePlugin.ImageInfo.XmlMediaType != XmlMediaType.OpticalDisc) { - byte[] root_directory = - imagePlugin.ReadSectors(root_directory_sector + partition.Start, sectors_for_root_directory); + byte[] rootDirectory = + imagePlugin.ReadSectors(rootDirectorySector + partition.Start, sectorsForRootDirectory); - if(useDecRainbowBPB) + if(useDecRainbowBpb) { MemoryStream rootMs = new MemoryStream(); foreach(byte[] tmp in from ulong rootSector in new[] {0x17, 0x19, 0x1B, 0x1D, 0x1E, 0x20} select imagePlugin.ReadSector(rootSector)) { rootMs.Write(tmp, 0, tmp.Length); } - root_directory = rootMs.ToArray(); + rootDirectory = rootMs.ToArray(); } - for(int i = 0; i < root_directory.Length; i += 32) + for(int i = 0; i < rootDirectory.Length; i += 32) { // Not a correct entry - if(root_directory[i] < 0x20 && root_directory[i] != 0x05) continue; + if(rootDirectory[i] < 0x20 && rootDirectory[i] != 0x05) continue; // Deleted or subdirectory entry - if(root_directory[i] == 0x2E || root_directory[i] == 0xE5) continue; + if(rootDirectory[i] == 0x2E || rootDirectory[i] == 0xE5) continue; // Not a volume label - if(root_directory[i + 0x0B] != 0x08 && root_directory[i + 0x0B] != 0x28) continue; + if(rootDirectory[i + 0x0B] != 0x08 && rootDirectory[i + 0x0B] != 0x28) continue; - IntPtr entry_ptr = Marshal.AllocHGlobal(32); - Marshal.Copy(root_directory, i, entry_ptr, 32); - DirectoryEntry entry = (DirectoryEntry)Marshal.PtrToStructure(entry_ptr, typeof(DirectoryEntry)); - Marshal.FreeHGlobal(entry_ptr); + IntPtr entryPtr = Marshal.AllocHGlobal(32); + Marshal.Copy(rootDirectory, i, entryPtr, 32); + DirectoryEntry entry = (DirectoryEntry)Marshal.PtrToStructure(entryPtr, typeof(DirectoryEntry)); + Marshal.FreeHGlobal(entryPtr); byte[] fullname = new byte[11]; Array.Copy(entry.filename, 0, fullname, 0, 8); Array.Copy(entry.extension, 0, fullname, 8, 3); string volname = CurrentEncoding.GetString(fullname).Trim(); if(!string.IsNullOrEmpty(volname)) - if((entry.caseinfo & 0x0C) > 0) xmlFSType.VolumeName = volname.ToLower(); - else xmlFSType.VolumeName = volname; + XmlFsType.VolumeName = (entry.caseinfo & 0x0C) > 0 ? volname.ToLower() : volname; if(entry.ctime > 0 && entry.cdate > 0) { - xmlFSType.CreationDate = DateHandlers.DOSToDateTime(entry.cdate, entry.ctime); - if(entry.ctime_ms > 0) xmlFSType.CreationDate = xmlFSType.CreationDate.AddMilliseconds(entry.ctime_ms * 10); - xmlFSType.CreationDateSpecified = true; - sb.AppendFormat("Volume created on {0}", xmlFSType.CreationDate).AppendLine(); + XmlFsType.CreationDate = DateHandlers.DOSToDateTime(entry.cdate, entry.ctime); + if(entry.ctime_ms > 0) XmlFsType.CreationDate = XmlFsType.CreationDate.AddMilliseconds(entry.ctime_ms * 10); + XmlFsType.CreationDateSpecified = true; + sb.AppendFormat("Volume created on {0}", XmlFsType.CreationDate).AppendLine(); } if(entry.mtime > 0 && entry.mdate > 0) { - xmlFSType.ModificationDate = DateHandlers.DOSToDateTime(entry.mdate, entry.mtime); - xmlFSType.ModificationDateSpecified = true; - sb.AppendFormat("Volume last modified on {0}", xmlFSType.ModificationDate).AppendLine(); + XmlFsType.ModificationDate = DateHandlers.DOSToDateTime(entry.mdate, entry.mtime); + XmlFsType.ModificationDateSpecified = true; + sb.AppendFormat("Volume last modified on {0}", XmlFsType.ModificationDate).AppendLine(); } if(entry.adate > 0) @@ -1360,9 +1354,9 @@ namespace DiscImageChef.Filesystems } } - if(!string.IsNullOrEmpty(xmlFSType.VolumeName)) - sb.AppendFormat("Volume label: {0}", xmlFSType.VolumeName).AppendLine(); - if(xmlFSType.Bootable) + if(!string.IsNullOrEmpty(XmlFsType.VolumeName)) + sb.AppendFormat("Volume label: {0}", XmlFsType.VolumeName).AppendLine(); + if(XmlFsType.Bootable) { sb.AppendLine("Volume is bootable"); sb.AppendFormat("Boot code's SHA1: {0}", bootChk).AppendLine(); @@ -1435,7 +1429,7 @@ namespace DiscImageChef.Filesystems /// BIOS Parameter Block as used by MSX-DOS 2. /// [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct MSXParameterBlock + struct MsxParameterBlock { /// x86 loop [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump; @@ -1483,7 +1477,7 @@ namespace DiscImageChef.Filesystems /// DOS 2.0 BIOS Parameter Block. [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct BIOSParameterBlock2 + struct BiosParameterBlock2 { /// x86 jump [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump; @@ -1513,7 +1507,7 @@ namespace DiscImageChef.Filesystems /// DOS 3.0 BIOS Parameter Block. [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct BIOSParameterBlock30 + struct BiosParameterBlock30 { /// x86 jump [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump; @@ -1549,7 +1543,7 @@ namespace DiscImageChef.Filesystems /// DOS 3.2 BIOS Parameter Block. [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct BIOSParameterBlock32 + struct BiosParameterBlock32 { /// x86 jump [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump; @@ -1587,7 +1581,7 @@ namespace DiscImageChef.Filesystems /// DOS 3.31 BIOS Parameter Block. [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct BIOSParameterBlock33 + struct BiosParameterBlock33 { /// x86 jump [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump; @@ -1625,7 +1619,7 @@ namespace DiscImageChef.Filesystems /// DOS 3.4 BIOS Parameter Block. [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct BIOSParameterBlockShortEBPB + struct BiosParameterBlockShortEbpb { /// x86 jump [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump; @@ -1671,7 +1665,7 @@ namespace DiscImageChef.Filesystems /// DOS 4.0 or higher BIOS Parameter Block. [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct BIOSParameterBlockEBPB + struct BiosParameterBlockEbpb { /// x86 jump [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump; @@ -1721,7 +1715,7 @@ namespace DiscImageChef.Filesystems /// FAT32 Parameter Block [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct FAT32ParameterBlockShort + struct Fat32ParameterBlockShort { /// x86 jump [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump; @@ -1785,7 +1779,7 @@ namespace DiscImageChef.Filesystems /// FAT32 Parameter Block [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct FAT32ParameterBlock + struct Fat32ParameterBlock { /// x86 jump [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] jump; @@ -2046,19 +2040,19 @@ namespace DiscImageChef.Filesystems public ushort startSector; } - const uint fsinfo_signature1 = 0x41615252; - const uint fsinfo_signature2 = 0x61417272; - const uint fsinfo_signature3 = 0xAA550000; + const uint FSINFO_SIGNATURE1 = 0x41615252; + const uint FSINFO_SIGNATURE2 = 0x61417272; + const uint FSINFO_SIGNATURE3 = 0xAA550000; /// FAT32 FS Information Sector [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct FSInfoSector + struct FsInfoSector { - /// Signature must be + /// Signature must be public uint signature1; /// Reserved [MarshalAs(UnmanagedType.ByValArray, SizeConst = 480)] public byte[] reserved1; - /// Signature must be + /// Signature must be public uint signature2; /// Free clusters public uint free_clusters; @@ -2066,7 +2060,7 @@ namespace DiscImageChef.Filesystems public uint last_cluster; /// Reserved [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] reserved2; - /// Signature must be + /// Signature must be public uint signature3; } diff --git a/DiscImageChef.Filesystems/FATX.cs b/DiscImageChef.Filesystems/FATX.cs index 5818e28b2..1462662a8 100644 --- a/DiscImageChef.Filesystems/FATX.cs +++ b/DiscImageChef.Filesystems/FATX.cs @@ -51,26 +51,26 @@ namespace DiscImageChef.Filesystems public uint rootDirectoryCluster; } - const uint FATX_Magic = 0x58544146; + const uint FATX_MAGIC = 0x58544146; public FATX() { Name = "FATX Filesystem Plugin"; - PluginUUID = new Guid("ED27A721-4A17-4649-89FD-33633B46E228"); + PluginUuid = new Guid("ED27A721-4A17-4649-89FD-33633B46E228"); CurrentEncoding = Encoding.UTF8; } public FATX(Encoding encoding) { Name = "FATX Filesystem Plugin"; - PluginUUID = new Guid("ED27A721-4A17-4649-89FD-33633B46E228"); + PluginUuid = new Guid("ED27A721-4A17-4649-89FD-33633B46E228"); CurrentEncoding = Encoding.UTF8; } public FATX(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "FATX Filesystem Plugin"; - PluginUUID = new Guid("ED27A721-4A17-4649-89FD-33633B46E228"); + PluginUuid = new Guid("ED27A721-4A17-4649-89FD-33633B46E228"); CurrentEncoding = Encoding.UTF8; } @@ -83,7 +83,7 @@ namespace DiscImageChef.Filesystems fatxSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); - return fatxSb.magic == FATX_Magic; + return fatxSb.magic == FATX_MAGIC; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -98,7 +98,7 @@ namespace DiscImageChef.Filesystems fatxSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); - if(fatxSb.magic != FATX_Magic) return; + if(fatxSb.magic != FATX_MAGIC) return; StringBuilder sb = new StringBuilder(); @@ -110,11 +110,13 @@ namespace DiscImageChef.Filesystems information = sb.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "FATX filesystem"; - xmlFSType.ClusterSize = (int)(fatxSb.sectorsPerCluster * imagePlugin.ImageInfo.SectorSize); - xmlFSType.Clusters = (long)((partition.End - partition.Start + 1) * imagePlugin.ImageInfo.SectorSize / - (ulong)xmlFSType.ClusterSize); + XmlFsType = new FileSystemType + { + Type = "FATX filesystem", + ClusterSize = (int)(fatxSb.sectorsPerCluster * imagePlugin.ImageInfo.SectorSize) + }; + XmlFsType.Clusters = (long)((partition.End - partition.Start + 1) * imagePlugin.ImageInfo.SectorSize / + (ulong)XmlFsType.ClusterSize); } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/FFS.cs b/DiscImageChef.Filesystems/FFS.cs index 17938492e..6bd72ffb3 100644 --- a/DiscImageChef.Filesystems/FFS.cs +++ b/DiscImageChef.Filesystems/FFS.cs @@ -32,6 +32,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Runtime.InteropServices; using System.Text; @@ -45,42 +46,39 @@ using ufs_daddr_t = System.Int32; namespace DiscImageChef.Filesystems { // Using information from Linux kernel headers + [SuppressMessage("ReSharper", "InconsistentNaming")] public class FFSPlugin : Filesystem { public FFSPlugin() { Name = "BSD Fast File System (aka UNIX File System, UFS)"; - PluginUUID = new Guid("CC90D342-05DB-48A8-988C-C1FE000034A3"); + PluginUuid = new Guid("CC90D342-05DB-48A8-988C-C1FE000034A3"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public FFSPlugin(Encoding encoding) { Name = "BSD Fast File System (aka UNIX File System, UFS)"; - PluginUUID = new Guid("CC90D342-05DB-48A8-988C-C1FE000034A3"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("CC90D342-05DB-48A8-988C-C1FE000034A3"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public FFSPlugin(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "BSD Fast File System (aka UNIX File System, UFS)"; - PluginUUID = new Guid("CC90D342-05DB-48A8-988C-C1FE000034A3"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("CC90D342-05DB-48A8-988C-C1FE000034A3"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { if(2 + partition.Start >= partition.End) return false; - uint magic; - uint sb_size_in_sectors; - byte[] ufs_sb_sectors; + uint sbSizeInSectors; if(imagePlugin.GetSectorSize() == 2336 || imagePlugin.GetSectorSize() == 2352 || - imagePlugin.GetSectorSize() == 2448) sb_size_in_sectors = block_size / 2048; - else sb_size_in_sectors = block_size / imagePlugin.GetSectorSize(); + imagePlugin.GetSectorSize() == 2448) sbSizeInSectors = block_size / 2048; + else sbSizeInSectors = block_size / imagePlugin.GetSectorSize(); ulong[] locations = { @@ -89,16 +87,7 @@ namespace DiscImageChef.Filesystems 262144 / imagePlugin.GetSectorSize() }; - foreach(ulong loc in locations.Where(loc => partition.End > partition.Start + loc + sb_size_in_sectors)) { - ufs_sb_sectors = imagePlugin.ReadSectors(partition.Start + loc, sb_size_in_sectors); - magic = BitConverter.ToUInt32(ufs_sb_sectors, 0x055C); - - if(magic == UFS_MAGIC || magic == UFS_CIGAM || magic == UFS_MAGIC_BW || magic == UFS_CIGAM_BW || - magic == UFS2_MAGIC || magic == UFS2_CIGAM || magic == UFS_BAD_MAGIC || - magic == UFS_BAD_CIGAM) return true; - } - - return false; + return locations.Where(loc => partition.End > partition.Start + loc + sbSizeInSectors).Select(loc => imagePlugin.ReadSectors(partition.Start + loc, sbSizeInSectors)).Select(ufsSbSectors => BitConverter.ToUInt32(ufsSbSectors, 0x055C)).Any(magic => magic == UFS_MAGIC || magic == UFS_CIGAM || magic == UFS_MAGIC_BW || magic == UFS_CIGAM_BW || magic == UFS2_MAGIC || magic == UFS2_CIGAM || magic == UFS_BAD_MAGIC || magic == UFS_BAD_CIGAM); } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -150,43 +139,43 @@ namespace DiscImageChef.Filesystems return; } - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); switch(magic) { case UFS_MAGIC: sbInformation.AppendLine("UFS filesystem"); - xmlFSType.Type = "UFS"; + XmlFsType.Type = "UFS"; break; case UFS_CIGAM: sbInformation.AppendLine("Big-endian UFS filesystem"); - xmlFSType.Type = "UFS"; + XmlFsType.Type = "UFS"; break; case UFS_MAGIC_BW: sbInformation.AppendLine("BorderWare UFS filesystem"); - xmlFSType.Type = "UFS"; + XmlFsType.Type = "UFS"; break; case UFS_CIGAM_BW: sbInformation.AppendLine("Big-endian BorderWare UFS filesystem"); - xmlFSType.Type = "UFS"; + XmlFsType.Type = "UFS"; break; case UFS2_MAGIC: sbInformation.AppendLine("UFS2 filesystem"); - xmlFSType.Type = "UFS2"; + XmlFsType.Type = "UFS2"; break; case UFS2_CIGAM: sbInformation.AppendLine("Big-endian UFS2 filesystem"); - xmlFSType.Type = "UFS2"; + XmlFsType.Type = "UFS2"; break; case UFS_BAD_MAGIC: sbInformation.AppendLine("Incompletely initialized UFS filesystem"); sbInformation.AppendLine("BEWARE!!! Following information may be completely wrong!"); - xmlFSType.Type = "UFS"; + XmlFsType.Type = "UFS"; break; case UFS_BAD_CIGAM: sbInformation.AppendLine("Incompletely initialized big-endian UFS filesystem"); sbInformation.AppendLine("BEWARE!!! Following information may be completely wrong!"); - xmlFSType.Type = "UFS"; + XmlFsType.Type = "UFS"; break; } @@ -332,12 +321,12 @@ namespace DiscImageChef.Filesystems sbInformation.AppendFormat("Cylinder group offset in cylinder: {0}", ufs_sb.fs_old_cgoffset).AppendLine(); sbInformation.AppendFormat("Volume last written on {0}", DateHandlers.UNIXToDateTime(ufs_sb.fs_old_time)) .AppendLine(); - xmlFSType.ModificationDate = DateHandlers.UNIXToDateTime(ufs_sb.fs_old_time); - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.UNIXToDateTime(ufs_sb.fs_old_time); + XmlFsType.ModificationDateSpecified = true; sbInformation.AppendFormat("{0} blocks in volume ({1} bytes)", ufs_sb.fs_old_size, (long)ufs_sb.fs_old_size * ufs_sb.fs_fsize).AppendLine(); - xmlFSType.Clusters = ufs_sb.fs_old_size; - xmlFSType.ClusterSize = ufs_sb.fs_fsize; + XmlFsType.Clusters = ufs_sb.fs_old_size; + XmlFsType.ClusterSize = ufs_sb.fs_fsize; sbInformation.AppendFormat("{0} data blocks in volume ({1} bytes)", ufs_sb.fs_old_dsize, (long)ufs_sb.fs_old_dsize * ufs_sb.fs_fsize).AppendLine(); sbInformation.AppendFormat("{0} cylinder groups in volume", ufs_sb.fs_ncg).AppendLine(); @@ -366,6 +355,7 @@ namespace DiscImageChef.Filesystems default: sbInformation.AppendFormat("Unknown optimization value: 0x{0:X8}", ufs_sb.fs_optim).AppendLine(); break; } + if(fs_type_sun) sbInformation.AppendFormat("{0} sectors/track", ufs_sb.fs_old_npsect).AppendLine(); else if(fs_type_sun86) sbInformation.AppendFormat("Volume state on {0}", DateHandlers.UNIXToDateTime(ufs_sb.fs_old_npsect)) @@ -391,14 +381,14 @@ namespace DiscImageChef.Filesystems sbInformation.AppendFormat("{0} directories", ufs_sb.fs_old_cstotal.cs_ndir).AppendLine(); sbInformation.AppendFormat("{0} free blocks ({1} bytes)", ufs_sb.fs_old_cstotal.cs_nbfree, (long)ufs_sb.fs_old_cstotal.cs_nbfree * ufs_sb.fs_fsize).AppendLine(); - xmlFSType.FreeClusters = ufs_sb.fs_old_cstotal.cs_nbfree; - xmlFSType.FreeClustersSpecified = true; + XmlFsType.FreeClusters = ufs_sb.fs_old_cstotal.cs_nbfree; + XmlFsType.FreeClustersSpecified = true; sbInformation.AppendFormat("{0} free inodes", ufs_sb.fs_old_cstotal.cs_nifree).AppendLine(); sbInformation.AppendFormat("{0} free frags", ufs_sb.fs_old_cstotal.cs_nffree).AppendLine(); if(ufs_sb.fs_fmod == 1) { sbInformation.AppendLine("Superblock is under modification"); - xmlFSType.Dirty = true; + XmlFsType.Dirty = true; } if(ufs_sb.fs_clean == 1) sbInformation.AppendLine("Volume is clean"); if(ufs_sb.fs_ronly == 1) sbInformation.AppendLine("Volume is read-only"); @@ -412,7 +402,7 @@ namespace DiscImageChef.Filesystems .AppendLine(); sbInformation.AppendFormat("Volume name: \"{0}\"", StringHandlers.CToString(ufs_sb.fs_volname)) .AppendLine(); - xmlFSType.VolumeName = StringHandlers.CToString(ufs_sb.fs_volname); + XmlFsType.VolumeName = StringHandlers.CToString(ufs_sb.fs_volname); sbInformation.AppendFormat("Volume ID: 0x{0:X16}", ufs_sb.fs_swuid).AppendLine(); //xmlFSType.VolumeSerial = string.Format("{0:X16}", ufs_sb.fs_swuid); sbInformation.AppendFormat("Last searched cylinder group: {0}", ufs_sb.fs_cgrotor).AppendLine(); @@ -421,18 +411,18 @@ namespace DiscImageChef.Filesystems sbInformation.AppendFormat("{0} directories", ufs_sb.fs_cstotal.cs_ndir).AppendLine(); sbInformation.AppendFormat("{0} free blocks ({1} bytes)", ufs_sb.fs_cstotal.cs_nbfree, ufs_sb.fs_cstotal.cs_nbfree * ufs_sb.fs_fsize).AppendLine(); - xmlFSType.FreeClusters = ufs_sb.fs_cstotal.cs_nbfree; - xmlFSType.FreeClustersSpecified = true; + XmlFsType.FreeClusters = ufs_sb.fs_cstotal.cs_nbfree; + XmlFsType.FreeClustersSpecified = true; sbInformation.AppendFormat("{0} free inodes", ufs_sb.fs_cstotal.cs_nifree).AppendLine(); sbInformation.AppendFormat("{0} free frags", ufs_sb.fs_cstotal.cs_nffree).AppendLine(); sbInformation.AppendFormat("{0} free clusters", ufs_sb.fs_cstotal.cs_numclusters).AppendLine(); sbInformation.AppendFormat("Volume last written on {0}", DateHandlers.UNIXToDateTime(ufs_sb.fs_time)) .AppendLine(); - xmlFSType.ModificationDate = DateHandlers.UNIXToDateTime(ufs_sb.fs_time); - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.UNIXToDateTime(ufs_sb.fs_time); + XmlFsType.ModificationDateSpecified = true; sbInformation.AppendFormat("{0} blocks ({1} bytes)", ufs_sb.fs_size, ufs_sb.fs_size * ufs_sb.fs_fsize) .AppendLine(); - xmlFSType.Clusters = ufs_sb.fs_size; + XmlFsType.Clusters = ufs_sb.fs_size; sbInformation .AppendFormat("{0} data blocks ({1} bytes)", ufs_sb.fs_dsize, ufs_sb.fs_dsize * ufs_sb.fs_fsize) .AppendLine(); diff --git a/DiscImageChef.Filesystems/Filesystem.cs b/DiscImageChef.Filesystems/Filesystem.cs index 0d91840ac..f9104c07d 100644 --- a/DiscImageChef.Filesystems/Filesystem.cs +++ b/DiscImageChef.Filesystems/Filesystem.cs @@ -47,18 +47,15 @@ namespace DiscImageChef.Filesystems /// Plugin name. public string Name; /// Plugin UUID. - public Guid PluginUUID; - internal FileSystemType xmlFSType; - public Encoding CurrentEncoding; + public Guid PluginUuid; + internal FileSystemType XmlFsType; + protected Encoding CurrentEncoding; /// /// Information about the filesystem as expected by CICM Metadata XML /// /// Information about the filesystem as expected by CICM Metadata XML - public FileSystemType XmlFSType - { - get { return xmlFSType; } - } + public FileSystemType XmlFSType => XmlFsType; protected Filesystem() { } diff --git a/DiscImageChef.Filesystems/Fossil.cs b/DiscImageChef.Filesystems/Fossil.cs index 0749b8a98..61ef22790 100644 --- a/DiscImageChef.Filesystems/Fossil.cs +++ b/DiscImageChef.Filesystems/Fossil.cs @@ -121,22 +121,22 @@ namespace DiscImageChef.Filesystems [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)] public byte[] name; } - const uint Fossil_HdrMagic = 0x3776AE89; - const uint Fossil_SbMagic = 0x2340A3B1; + const uint FOSSIL_HDR_MAGIC = 0x3776AE89; + const uint FOSSIL_SB_MAGIC = 0x2340A3B1; // Fossil header starts at 128KiB - const ulong HeaderPos = 128 * 1024; + const ulong HEADER_POS = 128 * 1024; public Fossil() { Name = "Fossil Filesystem Plugin"; - PluginUUID = new Guid("932BF104-43F6-494F-973C-45EF58A51DA9"); + PluginUuid = new Guid("932BF104-43F6-494F-973C-45EF58A51DA9"); CurrentEncoding = Encoding.UTF8; } public Fossil(Encoding encoding) { Name = "Fossil Filesystem Plugin"; - PluginUUID = new Guid("932BF104-43F6-494F-973C-45EF58A51DA9"); + PluginUuid = new Guid("932BF104-43F6-494F-973C-45EF58A51DA9"); // Technically everything on Plan 9 from Bell Labs is in UTF-8 CurrentEncoding = Encoding.UTF8; } @@ -144,14 +144,14 @@ namespace DiscImageChef.Filesystems public Fossil(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Fossil Filesystem Plugin"; - PluginUUID = new Guid("932BF104-43F6-494F-973C-45EF58A51DA9"); + PluginUuid = new Guid("932BF104-43F6-494F-973C-45EF58A51DA9"); // Technically everything on Plan 9 from Bell Labs is in UTF-8 CurrentEncoding = Encoding.UTF8; } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { - ulong hdrSector = HeaderPos / imagePlugin.GetSectorSize(); + ulong hdrSector = HEADER_POS / imagePlugin.GetSectorSize(); FossilHeader hdr; @@ -161,9 +161,9 @@ namespace DiscImageChef.Filesystems hdr = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); DicConsole.DebugWriteLine("Fossil plugin", "magic at 0x{0:X8} (expected 0x{1:X8})", hdr.magic, - Fossil_HdrMagic); + FOSSIL_HDR_MAGIC); - return hdr.magic == Fossil_HdrMagic; + return hdr.magic == FOSSIL_HDR_MAGIC; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -172,7 +172,7 @@ namespace DiscImageChef.Filesystems information = ""; if(imagePlugin.GetSectorSize() < 512) return; - ulong hdrSector = HeaderPos / imagePlugin.GetSectorSize(); + ulong hdrSector = HEADER_POS / imagePlugin.GetSectorSize(); FossilHeader hdr; @@ -180,7 +180,7 @@ namespace DiscImageChef.Filesystems hdr = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); DicConsole.DebugWriteLine("Fossil plugin", "magic at 0x{0:X8} (expected 0x{1:X8})", hdr.magic, - Fossil_HdrMagic); + FOSSIL_HDR_MAGIC); StringBuilder sb = new StringBuilder(); @@ -194,7 +194,7 @@ namespace DiscImageChef.Filesystems ulong sbLocation = hdr.super * (hdr.blockSize / imagePlugin.GetSectorSize()) + partition.Start; - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "Fossil filesystem", ClusterSize = hdr.blockSize, @@ -207,9 +207,9 @@ namespace DiscImageChef.Filesystems FossilSuperBlock fsb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); DicConsole.DebugWriteLine("Fossil plugin", "magic 0x{0:X8} (expected 0x{1:X8})", fsb.magic, - Fossil_SbMagic); + FOSSIL_SB_MAGIC); - if(fsb.magic == Fossil_SbMagic) + if(fsb.magic == FOSSIL_SB_MAGIC) { sb.AppendFormat("Epoch low {0}", fsb.epochLow).AppendLine(); sb.AppendFormat("Epoch high {0}", fsb.epochHigh).AppendLine(); @@ -219,7 +219,7 @@ namespace DiscImageChef.Filesystems sb.AppendFormat("Curren root block {0}", fsb.current).AppendLine(); sb.AppendFormat("Volume label: \"{0}\"", StringHandlers.CToString(fsb.name, CurrentEncoding)) .AppendLine(); - xmlFSType.VolumeName = StringHandlers.CToString(fsb.name, CurrentEncoding); + XmlFsType.VolumeName = StringHandlers.CToString(fsb.name, CurrentEncoding); } } diff --git a/DiscImageChef.Filesystems/HAMMER.cs b/DiscImageChef.Filesystems/HAMMER.cs index f59871983..ec033e961 100644 --- a/DiscImageChef.Filesystems/HAMMER.cs +++ b/DiscImageChef.Filesystems/HAMMER.cs @@ -32,6 +32,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; @@ -40,9 +41,12 @@ using Schemas; using hammer_crc_t = System.UInt32; using hammer_off_t = System.UInt64; using hammer_tid_t = System.UInt64; +#pragma warning disable 169 namespace DiscImageChef.Filesystems { + [SuppressMessage("ReSharper", "BuiltInTypeReferenceStyle")] + [SuppressMessage("ReSharper", "InconsistentNaming")] public class HAMMER : Filesystem { const ulong HAMMER_FSBUF_VOLUME = 0xC8414D4DC5523031; @@ -53,24 +57,22 @@ namespace DiscImageChef.Filesystems public HAMMER() { Name = "HAMMER Filesystem"; - PluginUUID = new Guid("91A188BF-5FD7-4677-BBD3-F59EBA9C864D"); + PluginUuid = new Guid("91A188BF-5FD7-4677-BBD3-F59EBA9C864D"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public HAMMER(Encoding encoding) { Name = "HAMMER Filesystem"; - PluginUUID = new Guid("91A188BF-5FD7-4677-BBD3-F59EBA9C864D"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("91A188BF-5FD7-4677-BBD3-F59EBA9C864D"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public HAMMER(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "HAMMER Filesystem"; - PluginUUID = new Guid("91A188BF-5FD7-4677-BBD3-F59EBA9C864D"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("91A188BF-5FD7-4677-BBD3-F59EBA9C864D"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -83,9 +85,9 @@ namespace DiscImageChef.Filesystems ulong magic; - byte[] sb_sector = imagePlugin.ReadSectors(partition.Start, run); + byte[] sbSector = imagePlugin.ReadSectors(partition.Start, run); - magic = BitConverter.ToUInt64(sb_sector, 0); + magic = BitConverter.ToUInt64(sbSector, 0); return magic == HAMMER_FSBUF_VOLUME || magic == HAMMER_FSBUF_VOLUME_REV; } @@ -97,7 +99,7 @@ namespace DiscImageChef.Filesystems StringBuilder sb = new StringBuilder(); - HammerSuperBlock hammer_sb; + HammerSuperBlock hammerSb; uint run = HAMMER_VOLHDR_SIZE / imagePlugin.GetSectorSize(); @@ -105,56 +107,56 @@ namespace DiscImageChef.Filesystems ulong magic; - byte[] sb_sector = imagePlugin.ReadSectors(partition.Start, run); + byte[] sbSector = imagePlugin.ReadSectors(partition.Start, run); - magic = BitConverter.ToUInt64(sb_sector, 0); + magic = BitConverter.ToUInt64(sbSector, 0); if(magic == HAMMER_FSBUF_VOLUME) { - GCHandle handle = GCHandle.Alloc(sb_sector, GCHandleType.Pinned); - hammer_sb = (HammerSuperBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), + GCHandle handle = GCHandle.Alloc(sbSector, GCHandleType.Pinned); + hammerSb = (HammerSuperBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(HammerSuperBlock)); handle.Free(); } - else hammer_sb = BigEndianMarshal.ByteArrayToStructureBigEndian(sb_sector); + else hammerSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sbSector); sb.AppendLine("HAMMER filesystem"); - sb.AppendFormat("Volume version: {0}", hammer_sb.vol_version).AppendLine(); - sb.AppendFormat("Volume {0} of {1} on this filesystem", hammer_sb.vol_no + 1, hammer_sb.vol_count) + sb.AppendFormat("Volume version: {0}", hammerSb.vol_version).AppendLine(); + sb.AppendFormat("Volume {0} of {1} on this filesystem", hammerSb.vol_no + 1, hammerSb.vol_count) .AppendLine(); - sb.AppendFormat("Volume name: {0}", StringHandlers.CToString(hammer_sb.vol_label, CurrentEncoding)) + sb.AppendFormat("Volume name: {0}", StringHandlers.CToString(hammerSb.vol_label, CurrentEncoding)) .AppendLine(); - sb.AppendFormat("Volume serial: {0}", hammer_sb.vol_fsid).AppendLine(); - sb.AppendFormat("Filesystem type: {0}", hammer_sb.vol_fstype).AppendLine(); - sb.AppendFormat("Boot area starts at {0}", hammer_sb.vol_bot_beg).AppendLine(); - sb.AppendFormat("Memory log starts at {0}", hammer_sb.vol_mem_beg).AppendLine(); - sb.AppendFormat("First volume buffer starts at {0}", hammer_sb.vol_buf_beg).AppendLine(); - sb.AppendFormat("Volume ends at {0}", hammer_sb.vol_buf_end).AppendLine(); + sb.AppendFormat("Volume serial: {0}", hammerSb.vol_fsid).AppendLine(); + sb.AppendFormat("Filesystem type: {0}", hammerSb.vol_fstype).AppendLine(); + sb.AppendFormat("Boot area starts at {0}", hammerSb.vol_bot_beg).AppendLine(); + sb.AppendFormat("Memory log starts at {0}", hammerSb.vol_mem_beg).AppendLine(); + sb.AppendFormat("First volume buffer starts at {0}", hammerSb.vol_buf_beg).AppendLine(); + sb.AppendFormat("Volume ends at {0}", hammerSb.vol_buf_end).AppendLine(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Clusters = (long)(partition.Size / HAMMER_BIGBLOCK_SIZE), ClusterSize = HAMMER_BIGBLOCK_SIZE, Dirty = false, Type = "HAMMER", - VolumeName = StringHandlers.CToString(hammer_sb.vol_label, CurrentEncoding), - VolumeSerial = hammer_sb.vol_fsid.ToString() + VolumeName = StringHandlers.CToString(hammerSb.vol_label, CurrentEncoding), + VolumeSerial = hammerSb.vol_fsid.ToString() }; - if(hammer_sb.vol_no == hammer_sb.vol_rootvol) + if(hammerSb.vol_no == hammerSb.vol_rootvol) { - sb.AppendFormat("Filesystem contains {0} \"big-blocks\" ({1} bytes)", hammer_sb.vol0_stat_bigblocks, - hammer_sb.vol0_stat_bigblocks * HAMMER_BIGBLOCK_SIZE).AppendLine(); - sb.AppendFormat("Filesystem has {0} \"big-blocks\" free ({1} bytes)", hammer_sb.vol0_stat_freebigblocks, - hammer_sb.vol0_stat_freebigblocks * HAMMER_BIGBLOCK_SIZE).AppendLine(); - sb.AppendFormat("Filesystem has {0} inode used", hammer_sb.vol0_stat_inodes).AppendLine(); + sb.AppendFormat("Filesystem contains {0} \"big-blocks\" ({1} bytes)", hammerSb.vol0_stat_bigblocks, + hammerSb.vol0_stat_bigblocks * HAMMER_BIGBLOCK_SIZE).AppendLine(); + sb.AppendFormat("Filesystem has {0} \"big-blocks\" free ({1} bytes)", hammerSb.vol0_stat_freebigblocks, + hammerSb.vol0_stat_freebigblocks * HAMMER_BIGBLOCK_SIZE).AppendLine(); + sb.AppendFormat("Filesystem has {0} inode used", hammerSb.vol0_stat_inodes).AppendLine(); - xmlFSType.Clusters = hammer_sb.vol0_stat_bigblocks; - xmlFSType.FreeClusters = hammer_sb.vol0_stat_freebigblocks; - xmlFSType.FreeClustersSpecified = true; - xmlFSType.Files = hammer_sb.vol0_stat_inodes; - xmlFSType.FilesSpecified = true; + XmlFsType.Clusters = hammerSb.vol0_stat_bigblocks; + XmlFsType.FreeClusters = hammerSb.vol0_stat_freebigblocks; + XmlFsType.FreeClustersSpecified = true; + XmlFsType.Files = hammerSb.vol0_stat_inodes; + XmlFsType.FilesSpecified = true; } // 0 ? //sb.AppendFormat("Volume header CRC: 0x{0:X8}", afs_sb.vol_crc).AppendLine(); diff --git a/DiscImageChef.Filesystems/HPFS.cs b/DiscImageChef.Filesystems/HPFS.cs index 9f355286d..f23c6143b 100644 --- a/DiscImageChef.Filesystems/HPFS.cs +++ b/DiscImageChef.Filesystems/HPFS.cs @@ -47,24 +47,22 @@ namespace DiscImageChef.Filesystems public HPFS() { Name = "OS/2 High Performance File System"; - PluginUUID = new Guid("33513B2C-f590-4acb-8bf2-0b1d5e19dec5"); + PluginUuid = new Guid("33513B2C-f590-4acb-8bf2-0b1d5e19dec5"); CurrentEncoding = Encoding.GetEncoding("ibm850"); } public HPFS(Encoding encoding) { Name = "OS/2 High Performance File System"; - PluginUUID = new Guid("33513B2C-f590-4acb-8bf2-0b1d5e19dec5"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("ibm850"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("33513B2C-f590-4acb-8bf2-0b1d5e19dec5"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("ibm850"); } public HPFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "OS/2 High Performance File System"; - PluginUUID = new Guid("33513B2C-f590-4acb-8bf2-0b1d5e19dec5"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("ibm850"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("33513B2C-f590-4acb-8bf2-0b1d5e19dec5"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("ibm850"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -73,14 +71,12 @@ namespace DiscImageChef.Filesystems uint magic1, magic2; - byte[] hpfs_sb_sector = + byte[] hpfsSbSector = imagePlugin.ReadSector(16 + partition.Start); // Seek to superblock, on logical sector 16 - magic1 = BitConverter.ToUInt32(hpfs_sb_sector, 0x000); - magic2 = BitConverter.ToUInt32(hpfs_sb_sector, 0x004); + magic1 = BitConverter.ToUInt32(hpfsSbSector, 0x000); + magic2 = BitConverter.ToUInt32(hpfsSbSector, 0x004); - if(magic1 == 0xF995E849 && magic2 == 0xFA53E9C5) return true; - - return false; + return magic1 == 0xF995E849 && magic2 == 0xFA53E9C5; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -90,135 +86,130 @@ namespace DiscImageChef.Filesystems StringBuilder sb = new StringBuilder(); - HPFS_BIOSParameterBlock hpfs_bpb; - HPFS_SuperBlock hpfs_sb; - HPFS_SpareBlock hpfs_sp; - - byte[] hpfs_bpb_sector = + byte[] hpfsBpbSector = imagePlugin.ReadSector(0 + partition.Start); // Seek to BIOS parameter block, on logical sector 0 - byte[] hpfs_sb_sector = + byte[] hpfsSbSector = imagePlugin.ReadSector(16 + partition.Start); // Seek to superblock, on logical sector 16 - byte[] hpfs_sp_sector = + byte[] hpfsSpSector = imagePlugin.ReadSector(17 + partition.Start); // Seek to spareblock, on logical sector 17 IntPtr bpbPtr = Marshal.AllocHGlobal(512); - Marshal.Copy(hpfs_bpb_sector, 0, bpbPtr, 512); - hpfs_bpb = (HPFS_BIOSParameterBlock)Marshal.PtrToStructure(bpbPtr, typeof(HPFS_BIOSParameterBlock)); + Marshal.Copy(hpfsBpbSector, 0, bpbPtr, 512); + HPFS_BIOSParameterBlock hpfsBpb = (HPFS_BIOSParameterBlock)Marshal.PtrToStructure(bpbPtr, typeof(HPFS_BIOSParameterBlock)); Marshal.FreeHGlobal(bpbPtr); IntPtr sbPtr = Marshal.AllocHGlobal(512); - Marshal.Copy(hpfs_sb_sector, 0, sbPtr, 512); - hpfs_sb = (HPFS_SuperBlock)Marshal.PtrToStructure(sbPtr, typeof(HPFS_SuperBlock)); + Marshal.Copy(hpfsSbSector, 0, sbPtr, 512); + HPFS_SuperBlock hpfsSb = (HPFS_SuperBlock)Marshal.PtrToStructure(sbPtr, typeof(HPFS_SuperBlock)); Marshal.FreeHGlobal(sbPtr); IntPtr spPtr = Marshal.AllocHGlobal(512); - Marshal.Copy(hpfs_sp_sector, 0, spPtr, 512); - hpfs_sp = (HPFS_SpareBlock)Marshal.PtrToStructure(spPtr, typeof(HPFS_SpareBlock)); + Marshal.Copy(hpfsSpSector, 0, spPtr, 512); + HPFS_SpareBlock hpfsSp = (HPFS_SpareBlock)Marshal.PtrToStructure(spPtr, typeof(HPFS_SpareBlock)); Marshal.FreeHGlobal(spPtr); - if(StringHandlers.CToString(hpfs_bpb.fs_type) != "HPFS " || hpfs_sb.magic1 != 0xF995E849 || - hpfs_sb.magic2 != 0xFA53E9C5 || hpfs_sp.magic1 != 0xF9911849 || hpfs_sp.magic2 != 0xFA5229C5) + if(StringHandlers.CToString(hpfsBpb.fs_type) != "HPFS " || hpfsSb.magic1 != 0xF995E849 || + hpfsSb.magic2 != 0xFA53E9C5 || hpfsSp.magic1 != 0xF9911849 || hpfsSp.magic2 != 0xFA5229C5) { sb.AppendLine("This may not be HPFS, following information may be not correct."); - sb.AppendFormat("File system type: \"{0}\" (Should be \"HPFS \")", hpfs_bpb.fs_type).AppendLine(); - sb.AppendFormat("Superblock magic1: 0x{0:X8} (Should be 0xF995E849)", hpfs_sb.magic1).AppendLine(); - sb.AppendFormat("Superblock magic2: 0x{0:X8} (Should be 0xFA53E9C5)", hpfs_sb.magic2).AppendLine(); - sb.AppendFormat("Spareblock magic1: 0x{0:X8} (Should be 0xF9911849)", hpfs_sp.magic1).AppendLine(); - sb.AppendFormat("Spareblock magic2: 0x{0:X8} (Should be 0xFA5229C5)", hpfs_sp.magic2).AppendLine(); + sb.AppendFormat("File system type: \"{0}\" (Should be \"HPFS \")", hpfsBpb.fs_type).AppendLine(); + sb.AppendFormat("Superblock magic1: 0x{0:X8} (Should be 0xF995E849)", hpfsSb.magic1).AppendLine(); + sb.AppendFormat("Superblock magic2: 0x{0:X8} (Should be 0xFA53E9C5)", hpfsSb.magic2).AppendLine(); + sb.AppendFormat("Spareblock magic1: 0x{0:X8} (Should be 0xF9911849)", hpfsSp.magic1).AppendLine(); + sb.AppendFormat("Spareblock magic2: 0x{0:X8} (Should be 0xFA5229C5)", hpfsSp.magic2).AppendLine(); } - sb.AppendFormat("OEM name: {0}", StringHandlers.CToString(hpfs_bpb.oem_name)).AppendLine(); - sb.AppendFormat("{0} bytes per sector", hpfs_bpb.bps).AppendLine(); + sb.AppendFormat("OEM name: {0}", StringHandlers.CToString(hpfsBpb.oem_name)).AppendLine(); + sb.AppendFormat("{0} bytes per sector", hpfsBpb.bps).AppendLine(); // sb.AppendFormat("{0} sectors per cluster", hpfs_bpb.spc).AppendLine(); - // sb.AppendFormat("{0} reserved sectors", hpfs_bpb.rsectors).AppendLine(); - // sb.AppendFormat("{0} FATs", hpfs_bpb.fats_no).AppendLine(); - // sb.AppendFormat("{0} entries on root directory", hpfs_bpb.root_ent).AppendLine(); - // sb.AppendFormat("{0} mini sectors on volume", hpfs_bpb.sectors).AppendLine(); - sb.AppendFormat("Media descriptor: 0x{0:X2}", hpfs_bpb.media).AppendLine(); - // sb.AppendFormat("{0} sectors per FAT", hpfs_bpb.spfat).AppendLine(); - // sb.AppendFormat("{0} sectors per track", hpfs_bpb.sptrk).AppendLine(); - // sb.AppendFormat("{0} heads", hpfs_bpb.heads).AppendLine(); - sb.AppendFormat("{0} sectors hidden before BPB", hpfs_bpb.hsectors).AppendLine(); - sb.AppendFormat("{0} sectors on volume ({1} bytes)", hpfs_sb.sectors, hpfs_sb.sectors * hpfs_bpb.bps) + // sb.AppendFormat("{0} reserved sectors", hpfs_bpb.rsectors).AppendLine(); + // sb.AppendFormat("{0} FATs", hpfs_bpb.fats_no).AppendLine(); + // sb.AppendFormat("{0} entries on root directory", hpfs_bpb.root_ent).AppendLine(); + // sb.AppendFormat("{0} mini sectors on volume", hpfs_bpb.sectors).AppendLine(); + sb.AppendFormat("Media descriptor: 0x{0:X2}", hpfsBpb.media).AppendLine(); + // sb.AppendFormat("{0} sectors per FAT", hpfs_bpb.spfat).AppendLine(); + // sb.AppendFormat("{0} sectors per track", hpfs_bpb.sptrk).AppendLine(); + // sb.AppendFormat("{0} heads", hpfs_bpb.heads).AppendLine(); + sb.AppendFormat("{0} sectors hidden before BPB", hpfsBpb.hsectors).AppendLine(); + sb.AppendFormat("{0} sectors on volume ({1} bytes)", hpfsSb.sectors, hpfsSb.sectors * hpfsBpb.bps) .AppendLine(); // sb.AppendFormat("{0} sectors on volume ({1} bytes)", hpfs_bpb.big_sectors, hpfs_bpb.big_sectors * hpfs_bpb.bps).AppendLine(); - sb.AppendFormat("BIOS Drive Number: 0x{0:X2}", hpfs_bpb.drive_no).AppendLine(); - sb.AppendFormat("NT Flags: 0x{0:X2}", hpfs_bpb.nt_flags).AppendLine(); - sb.AppendFormat("Signature: 0x{0:X2}", hpfs_bpb.signature).AppendLine(); - sb.AppendFormat("Serial number: 0x{0:X8}", hpfs_bpb.serial_no).AppendLine(); - sb.AppendFormat("Volume label: {0}", StringHandlers.CToString(hpfs_bpb.volume_label, CurrentEncoding)) + sb.AppendFormat("BIOS Drive Number: 0x{0:X2}", hpfsBpb.drive_no).AppendLine(); + sb.AppendFormat("NT Flags: 0x{0:X2}", hpfsBpb.nt_flags).AppendLine(); + sb.AppendFormat("Signature: 0x{0:X2}", hpfsBpb.signature).AppendLine(); + sb.AppendFormat("Serial number: 0x{0:X8}", hpfsBpb.serial_no).AppendLine(); + sb.AppendFormat("Volume label: {0}", StringHandlers.CToString(hpfsBpb.volume_label, CurrentEncoding)) .AppendLine(); - // sb.AppendFormat("Filesystem type: \"{0}\"", hpfs_bpb.fs_type).AppendLine(); + // sb.AppendFormat("Filesystem type: \"{0}\"", hpfs_bpb.fs_type).AppendLine(); - DateTime last_chk = DateHandlers.UNIXToDateTime(hpfs_sb.last_chkdsk); - DateTime last_optim = DateHandlers.UNIXToDateTime(hpfs_sb.last_optim); + DateTime lastChk = DateHandlers.UNIXToDateTime(hpfsSb.last_chkdsk); + DateTime lastOptim = DateHandlers.UNIXToDateTime(hpfsSb.last_optim); - sb.AppendFormat("HPFS version: {0}", hpfs_sb.version).AppendLine(); - sb.AppendFormat("Functional version: {0}", hpfs_sb.func_version).AppendLine(); - sb.AppendFormat("Sector of root directory FNode: {0}", hpfs_sb.root_fnode).AppendLine(); - sb.AppendFormat("{0} sectors are marked bad", hpfs_sb.badblocks).AppendLine(); - sb.AppendFormat("Sector of free space bitmaps: {0}", hpfs_sb.bitmap_lsn).AppendLine(); - sb.AppendFormat("Sector of bad blocks list: {0}", hpfs_sb.badblock_lsn).AppendLine(); - if(hpfs_sb.last_chkdsk > 0) sb.AppendFormat("Date of last integrity check: {0}", last_chk).AppendLine(); + sb.AppendFormat("HPFS version: {0}", hpfsSb.version).AppendLine(); + sb.AppendFormat("Functional version: {0}", hpfsSb.func_version).AppendLine(); + sb.AppendFormat("Sector of root directory FNode: {0}", hpfsSb.root_fnode).AppendLine(); + sb.AppendFormat("{0} sectors are marked bad", hpfsSb.badblocks).AppendLine(); + sb.AppendFormat("Sector of free space bitmaps: {0}", hpfsSb.bitmap_lsn).AppendLine(); + sb.AppendFormat("Sector of bad blocks list: {0}", hpfsSb.badblock_lsn).AppendLine(); + if(hpfsSb.last_chkdsk > 0) sb.AppendFormat("Date of last integrity check: {0}", lastChk).AppendLine(); else sb.AppendLine("Filesystem integrity has never been checked"); - if(hpfs_sb.last_optim > 0) sb.AppendFormat("Date of last optimization {0}", last_optim).AppendLine(); + if(hpfsSb.last_optim > 0) sb.AppendFormat("Date of last optimization {0}", lastOptim).AppendLine(); else sb.AppendLine("Filesystem has never been optimized"); - sb.AppendFormat("Directory band has {0} sectors", hpfs_sb.dband_sectors).AppendLine(); - sb.AppendFormat("Directory band starts at sector {0}", hpfs_sb.dband_start).AppendLine(); - sb.AppendFormat("Directory band ends at sector {0}", hpfs_sb.dband_last).AppendLine(); - sb.AppendFormat("Sector of directory band bitmap: {0}", hpfs_sb.dband_bitmap).AppendLine(); - sb.AppendFormat("Sector of ACL directory: {0}", hpfs_sb.acl_start).AppendLine(); + sb.AppendFormat("Directory band has {0} sectors", hpfsSb.dband_sectors).AppendLine(); + sb.AppendFormat("Directory band starts at sector {0}", hpfsSb.dband_start).AppendLine(); + sb.AppendFormat("Directory band ends at sector {0}", hpfsSb.dband_last).AppendLine(); + sb.AppendFormat("Sector of directory band bitmap: {0}", hpfsSb.dband_bitmap).AppendLine(); + sb.AppendFormat("Sector of ACL directory: {0}", hpfsSb.acl_start).AppendLine(); - sb.AppendFormat("Sector of Hotfix directory: {0}", hpfs_sp.hotfix_start).AppendLine(); - sb.AppendFormat("{0} used Hotfix entries", hpfs_sp.hotfix_used).AppendLine(); - sb.AppendFormat("{0} total Hotfix entries", hpfs_sp.hotfix_entries).AppendLine(); - sb.AppendFormat("{0} free spare DNodes", hpfs_sp.spare_dnodes_free).AppendLine(); - sb.AppendFormat("{0} total spare DNodes", hpfs_sp.spare_dnodes).AppendLine(); - sb.AppendFormat("Sector of codepage directory: {0}", hpfs_sp.codepage_lsn).AppendLine(); - sb.AppendFormat("{0} codepages used in the volume", hpfs_sp.codepages).AppendLine(); - sb.AppendFormat("SuperBlock CRC32: {0:X8}", hpfs_sp.sb_crc32).AppendLine(); - sb.AppendFormat("SpareBlock CRC32: {0:X8}", hpfs_sp.sp_crc32).AppendLine(); + sb.AppendFormat("Sector of Hotfix directory: {0}", hpfsSp.hotfix_start).AppendLine(); + sb.AppendFormat("{0} used Hotfix entries", hpfsSp.hotfix_used).AppendLine(); + sb.AppendFormat("{0} total Hotfix entries", hpfsSp.hotfix_entries).AppendLine(); + sb.AppendFormat("{0} free spare DNodes", hpfsSp.spare_dnodes_free).AppendLine(); + sb.AppendFormat("{0} total spare DNodes", hpfsSp.spare_dnodes).AppendLine(); + sb.AppendFormat("Sector of codepage directory: {0}", hpfsSp.codepage_lsn).AppendLine(); + sb.AppendFormat("{0} codepages used in the volume", hpfsSp.codepages).AppendLine(); + sb.AppendFormat("SuperBlock CRC32: {0:X8}", hpfsSp.sb_crc32).AppendLine(); + sb.AppendFormat("SpareBlock CRC32: {0:X8}", hpfsSp.sp_crc32).AppendLine(); sb.AppendLine("Flags:"); - if((hpfs_sp.flags1 & 0x01) == 0x01) sb.AppendLine("Filesystem is dirty."); - else sb.AppendLine("Filesystem is clean."); - if((hpfs_sp.flags1 & 0x02) == 0x02) sb.AppendLine("Spare directory blocks are in use"); - if((hpfs_sp.flags1 & 0x04) == 0x04) sb.AppendLine("Hotfixes are in use"); - if((hpfs_sp.flags1 & 0x08) == 0x08) sb.AppendLine("Disk contains bad sectors"); - if((hpfs_sp.flags1 & 0x10) == 0x10) sb.AppendLine("Disk has a bad bitmap"); - if((hpfs_sp.flags1 & 0x20) == 0x20) sb.AppendLine("Filesystem was formatted fast"); - if((hpfs_sp.flags1 & 0x40) == 0x40) sb.AppendLine("Unknown flag 0x40 on flags1 is active"); - if((hpfs_sp.flags1 & 0x80) == 0x80) sb.AppendLine("Filesystem has been mounted by an old IFS"); - if((hpfs_sp.flags2 & 0x01) == 0x01) sb.AppendLine("Install DASD limits"); - if((hpfs_sp.flags2 & 0x02) == 0x02) sb.AppendLine("Resync DASD limits"); - if((hpfs_sp.flags2 & 0x04) == 0x04) sb.AppendLine("DASD limits are operational"); - if((hpfs_sp.flags2 & 0x08) == 0x08) sb.AppendLine("Multimedia is active"); - if((hpfs_sp.flags2 & 0x10) == 0x10) sb.AppendLine("DCE ACLs are active"); - if((hpfs_sp.flags2 & 0x20) == 0x20) sb.AppendLine("DASD limits are dirty"); - if((hpfs_sp.flags2 & 0x40) == 0x40) sb.AppendLine("Unknown flag 0x40 on flags2 is active"); - if((hpfs_sp.flags2 & 0x80) == 0x80) sb.AppendLine("Unknown flag 0x80 on flags2 is active"); + sb.AppendLine((hpfsSp.flags1 & 0x01) == 0x01 ? "Filesystem is dirty." : "Filesystem is clean."); + if((hpfsSp.flags1 & 0x02) == 0x02) sb.AppendLine("Spare directory blocks are in use"); + if((hpfsSp.flags1 & 0x04) == 0x04) sb.AppendLine("Hotfixes are in use"); + if((hpfsSp.flags1 & 0x08) == 0x08) sb.AppendLine("Disk contains bad sectors"); + if((hpfsSp.flags1 & 0x10) == 0x10) sb.AppendLine("Disk has a bad bitmap"); + if((hpfsSp.flags1 & 0x20) == 0x20) sb.AppendLine("Filesystem was formatted fast"); + if((hpfsSp.flags1 & 0x40) == 0x40) sb.AppendLine("Unknown flag 0x40 on flags1 is active"); + if((hpfsSp.flags1 & 0x80) == 0x80) sb.AppendLine("Filesystem has been mounted by an old IFS"); + if((hpfsSp.flags2 & 0x01) == 0x01) sb.AppendLine("Install DASD limits"); + if((hpfsSp.flags2 & 0x02) == 0x02) sb.AppendLine("Resync DASD limits"); + if((hpfsSp.flags2 & 0x04) == 0x04) sb.AppendLine("DASD limits are operational"); + if((hpfsSp.flags2 & 0x08) == 0x08) sb.AppendLine("Multimedia is active"); + if((hpfsSp.flags2 & 0x10) == 0x10) sb.AppendLine("DCE ACLs are active"); + if((hpfsSp.flags2 & 0x20) == 0x20) sb.AppendLine("DASD limits are dirty"); + if((hpfsSp.flags2 & 0x40) == 0x40) sb.AppendLine("Unknown flag 0x40 on flags2 is active"); + if((hpfsSp.flags2 & 0x80) == 0x80) sb.AppendLine("Unknown flag 0x80 on flags2 is active"); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); // Theoretically everything from BPB to SB is boot code, should I hash everything or only the sector loaded by BIOS itself? - if(hpfs_bpb.jump[0] == 0xEB && hpfs_bpb.jump[1] > 0x3C && hpfs_bpb.jump[1] < 0x80 && - hpfs_bpb.signature2 == 0xAA55) + if(hpfsBpb.jump[0] == 0xEB && hpfsBpb.jump[1] > 0x3C && hpfsBpb.jump[1] < 0x80 && + hpfsBpb.signature2 == 0xAA55) { - xmlFSType.Bootable = true; + XmlFsType.Bootable = true; Sha1Context sha1Ctx = new Sha1Context(); sha1Ctx.Init(); - string bootChk = sha1Ctx.Data(hpfs_bpb.boot_code, out byte[] sha1_out); + string bootChk = sha1Ctx.Data(hpfsBpb.boot_code, out byte[] sha1_out); sb.AppendLine("Volume is bootable"); sb.AppendFormat("Boot code's SHA1: {0}", bootChk).AppendLine(); } - xmlFSType.Dirty |= (hpfs_sp.flags1 & 0x01) == 0x01; - xmlFSType.Clusters = hpfs_sb.sectors; - xmlFSType.ClusterSize = hpfs_bpb.bps; - xmlFSType.Type = "HPFS"; - xmlFSType.VolumeName = StringHandlers.CToString(hpfs_bpb.volume_label, CurrentEncoding); - xmlFSType.VolumeSerial = $"{hpfs_bpb.serial_no:X8}"; - xmlFSType.SystemIdentifier = StringHandlers.CToString(hpfs_bpb.oem_name); + XmlFsType.Dirty |= (hpfsSp.flags1 & 0x01) == 0x01; + XmlFsType.Clusters = hpfsSb.sectors; + XmlFsType.ClusterSize = hpfsBpb.bps; + XmlFsType.Type = "HPFS"; + XmlFsType.VolumeName = StringHandlers.CToString(hpfsBpb.volume_label, CurrentEncoding); + XmlFsType.VolumeSerial = $"{hpfsBpb.serial_no:X8}"; + XmlFsType.SystemIdentifier = StringHandlers.CToString(hpfsBpb.oem_name); information = sb.ToString(); } diff --git a/DiscImageChef.Filesystems/ISO9660/ISO9660.cs b/DiscImageChef.Filesystems/ISO9660/ISO9660.cs index 3d1c2d8e1..3c93ce645 100644 --- a/DiscImageChef.Filesystems/ISO9660/ISO9660.cs +++ b/DiscImageChef.Filesystems/ISO9660/ISO9660.cs @@ -43,21 +43,21 @@ namespace DiscImageChef.Filesystems.ISO9660 public ISO9660() { Name = "ISO9660 Filesystem"; - PluginUUID = new Guid("d812f4d3-c357-400d-90fd-3b22ef786aa8"); + PluginUuid = new Guid("d812f4d3-c357-400d-90fd-3b22ef786aa8"); CurrentEncoding = Encoding.ASCII; } public ISO9660(Encoding encoding) { Name = "ISO9660 Filesystem"; - PluginUUID = new Guid("d812f4d3-c357-400d-90fd-3b22ef786aa8"); + PluginUuid = new Guid("d812f4d3-c357-400d-90fd-3b22ef786aa8"); CurrentEncoding = encoding ?? Encoding.ASCII; } public ISO9660(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "ISO9660 Filesystem"; - PluginUUID = new Guid("d812f4d3-c357-400d-90fd-3b22ef786aa8"); + PluginUuid = new Guid("d812f4d3-c357-400d-90fd-3b22ef786aa8"); CurrentEncoding = encoding ?? Encoding.ASCII; } } diff --git a/DiscImageChef.Filesystems/ISO9660/Info.cs b/DiscImageChef.Filesystems/ISO9660/Info.cs index 61ad47899..3d06aa097 100644 --- a/DiscImageChef.Filesystems/ISO9660/Info.cs +++ b/DiscImageChef.Filesystems/ISO9660/Info.cs @@ -213,7 +213,7 @@ namespace DiscImageChef.Filesystems.ISO9660 DecodedVolumeDescriptor decodedVd; DecodedVolumeDescriptor decodedJolietVd = new DecodedVolumeDescriptor(); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); if(pvd == null && hsvd == null && fsvd == null) { @@ -716,85 +716,85 @@ namespace DiscImageChef.Filesystems.ISO9660 exit_torito: if(refareas.Count > 0) isoMetadata.Append(suspInformation); - xmlFSType.Type = fsFormat; + XmlFsType.Type = fsFormat; if(jolietvd != null) { - xmlFSType.VolumeName = decodedJolietVd.VolumeIdentifier; + XmlFsType.VolumeName = decodedJolietVd.VolumeIdentifier; if(decodedJolietVd.SystemIdentifier == null || decodedVd.SystemIdentifier.Length > decodedJolietVd.SystemIdentifier.Length) - xmlFSType.SystemIdentifier = decodedVd.SystemIdentifier; - else xmlFSType.SystemIdentifier = decodedJolietVd.SystemIdentifier; + XmlFsType.SystemIdentifier = decodedVd.SystemIdentifier; + else XmlFsType.SystemIdentifier = decodedJolietVd.SystemIdentifier; if(decodedJolietVd.VolumeSetIdentifier == null || decodedVd.VolumeSetIdentifier.Length > decodedJolietVd.VolumeSetIdentifier.Length) - xmlFSType.VolumeSetIdentifier = decodedVd.VolumeSetIdentifier; - else xmlFSType.VolumeSetIdentifier = decodedJolietVd.VolumeSetIdentifier; + XmlFsType.VolumeSetIdentifier = decodedVd.VolumeSetIdentifier; + else XmlFsType.VolumeSetIdentifier = decodedJolietVd.VolumeSetIdentifier; if(decodedJolietVd.PublisherIdentifier == null || decodedVd.PublisherIdentifier.Length > decodedJolietVd.PublisherIdentifier.Length) - xmlFSType.PublisherIdentifier = decodedVd.PublisherIdentifier; - else xmlFSType.PublisherIdentifier = decodedJolietVd.PublisherIdentifier; + XmlFsType.PublisherIdentifier = decodedVd.PublisherIdentifier; + else XmlFsType.PublisherIdentifier = decodedJolietVd.PublisherIdentifier; if(decodedJolietVd.DataPreparerIdentifier == null || decodedVd.DataPreparerIdentifier.Length > decodedJolietVd.DataPreparerIdentifier.Length) - xmlFSType.DataPreparerIdentifier = decodedVd.DataPreparerIdentifier; - else xmlFSType.DataPreparerIdentifier = decodedJolietVd.SystemIdentifier; + XmlFsType.DataPreparerIdentifier = decodedVd.DataPreparerIdentifier; + else XmlFsType.DataPreparerIdentifier = decodedJolietVd.SystemIdentifier; if(decodedJolietVd.ApplicationIdentifier == null || decodedVd.ApplicationIdentifier.Length > decodedJolietVd.ApplicationIdentifier.Length) - xmlFSType.ApplicationIdentifier = decodedVd.ApplicationIdentifier; - else xmlFSType.ApplicationIdentifier = decodedJolietVd.SystemIdentifier; + XmlFsType.ApplicationIdentifier = decodedVd.ApplicationIdentifier; + else XmlFsType.ApplicationIdentifier = decodedJolietVd.SystemIdentifier; - xmlFSType.CreationDate = decodedJolietVd.CreationTime; - xmlFSType.CreationDateSpecified = true; + XmlFsType.CreationDate = decodedJolietVd.CreationTime; + XmlFsType.CreationDateSpecified = true; if(decodedJolietVd.HasModificationTime) { - xmlFSType.ModificationDate = decodedJolietVd.ModificationTime; - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = decodedJolietVd.ModificationTime; + XmlFsType.ModificationDateSpecified = true; } if(decodedJolietVd.HasExpirationTime) { - xmlFSType.ExpirationDate = decodedJolietVd.ExpirationTime; - xmlFSType.ExpirationDateSpecified = true; + XmlFsType.ExpirationDate = decodedJolietVd.ExpirationTime; + XmlFsType.ExpirationDateSpecified = true; } if(decodedJolietVd.HasEffectiveTime) { - xmlFSType.EffectiveDate = decodedJolietVd.EffectiveTime; - xmlFSType.EffectiveDateSpecified = true; + XmlFsType.EffectiveDate = decodedJolietVd.EffectiveTime; + XmlFsType.EffectiveDateSpecified = true; } } else { - xmlFSType.SystemIdentifier = decodedVd.SystemIdentifier; - xmlFSType.VolumeName = decodedVd.VolumeIdentifier; - xmlFSType.VolumeSetIdentifier = decodedVd.VolumeSetIdentifier; - xmlFSType.PublisherIdentifier = decodedVd.PublisherIdentifier; - xmlFSType.DataPreparerIdentifier = decodedVd.DataPreparerIdentifier; - xmlFSType.ApplicationIdentifier = decodedVd.ApplicationIdentifier; - xmlFSType.CreationDate = decodedVd.CreationTime; - xmlFSType.CreationDateSpecified = true; + XmlFsType.SystemIdentifier = decodedVd.SystemIdentifier; + XmlFsType.VolumeName = decodedVd.VolumeIdentifier; + XmlFsType.VolumeSetIdentifier = decodedVd.VolumeSetIdentifier; + XmlFsType.PublisherIdentifier = decodedVd.PublisherIdentifier; + XmlFsType.DataPreparerIdentifier = decodedVd.DataPreparerIdentifier; + XmlFsType.ApplicationIdentifier = decodedVd.ApplicationIdentifier; + XmlFsType.CreationDate = decodedVd.CreationTime; + XmlFsType.CreationDateSpecified = true; if(decodedVd.HasModificationTime) { - xmlFSType.ModificationDate = decodedVd.ModificationTime; - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = decodedVd.ModificationTime; + XmlFsType.ModificationDateSpecified = true; } if(decodedVd.HasExpirationTime) { - xmlFSType.ExpirationDate = decodedVd.ExpirationTime; - xmlFSType.ExpirationDateSpecified = true; + XmlFsType.ExpirationDate = decodedVd.ExpirationTime; + XmlFsType.ExpirationDateSpecified = true; } if(decodedVd.HasEffectiveTime) { - xmlFSType.EffectiveDate = decodedVd.EffectiveTime; - xmlFSType.EffectiveDateSpecified = true; + XmlFsType.EffectiveDate = decodedVd.EffectiveTime; + XmlFsType.EffectiveDateSpecified = true; } } - xmlFSType.Bootable |= bvd != null || segaCd != null || saturn != null || dreamcast != null; - xmlFSType.Clusters = decodedVd.Blocks; - xmlFSType.ClusterSize = decodedVd.BlockSize; + XmlFsType.Bootable |= bvd != null || segaCd != null || saturn != null || dreamcast != null; + XmlFsType.Clusters = decodedVd.Blocks; + XmlFsType.ClusterSize = decodedVd.BlockSize; information = isoMetadata.ToString(); } diff --git a/DiscImageChef.Filesystems/JFS.cs b/DiscImageChef.Filesystems/JFS.cs index ce591630e..700576e84 100644 --- a/DiscImageChef.Filesystems/JFS.cs +++ b/DiscImageChef.Filesystems/JFS.cs @@ -131,35 +131,33 @@ namespace DiscImageChef.Filesystems public Guid s_loguuid; } - const uint JFS_BootBlocksSize = 0x8000; - const uint JFS_Magic = 0x3153464A; + const uint JFS_BOOT_BLOCKS_SIZE = 0x8000; + const uint JFS_MAGIC = 0x3153464A; public JFS() { Name = "JFS Plugin"; - PluginUUID = new Guid("D3BE2A41-8F28-4055-94DC-BB6C72A0E9C4"); + PluginUuid = new Guid("D3BE2A41-8F28-4055-94DC-BB6C72A0E9C4"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public JFS(Encoding encoding) { Name = "JFS Plugin"; - PluginUUID = new Guid("D3BE2A41-8F28-4055-94DC-BB6C72A0E9C4"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("D3BE2A41-8F28-4055-94DC-BB6C72A0E9C4"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public JFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "JFS Plugin"; - PluginUUID = new Guid("D3BE2A41-8F28-4055-94DC-BB6C72A0E9C4"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("D3BE2A41-8F28-4055-94DC-BB6C72A0E9C4"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { - uint bootSectors = JFS_BootBlocksSize / imagePlugin.GetSectorSize(); + uint bootSectors = JFS_BOOT_BLOCKS_SIZE / imagePlugin.GetSectorSize(); if(partition.Start + bootSectors >= partition.End) return false; byte[] sector = imagePlugin.ReadSector(partition.Start + bootSectors); @@ -171,7 +169,7 @@ namespace DiscImageChef.Filesystems jfsSb = (JFS_SuperBlock)Marshal.PtrToStructure(sbPtr, typeof(JFS_SuperBlock)); Marshal.FreeHGlobal(sbPtr); - return jfsSb.s_magic == JFS_Magic; + return jfsSb.s_magic == JFS_MAGIC; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -179,7 +177,7 @@ namespace DiscImageChef.Filesystems { information = ""; StringBuilder sb = new StringBuilder(); - uint bootSectors = JFS_BootBlocksSize / imagePlugin.GetSectorSize(); + uint bootSectors = JFS_BOOT_BLOCKS_SIZE / imagePlugin.GetSectorSize(); byte[] sector = imagePlugin.ReadSector(partition.Start + bootSectors); if(sector.Length < 512) return; @@ -228,17 +226,18 @@ namespace DiscImageChef.Filesystems else sb.AppendFormat("Volume name: {0}", CurrentEncoding.GetString(jfsSb.s_label)).AppendLine(); sb.AppendFormat("Volume UUID: {0}", jfsSb.s_uuid).AppendLine(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "JFS filesystem"; - xmlFSType.Clusters = (long)jfsSb.s_size; - xmlFSType.ClusterSize = (int)jfsSb.s_bsize; - xmlFSType.Bootable = true; - if(jfsSb.s_version == 1) xmlFSType.VolumeName = CurrentEncoding.GetString(jfsSb.s_fpack); - else xmlFSType.VolumeName = CurrentEncoding.GetString(jfsSb.s_label); - xmlFSType.VolumeSerial = $"{jfsSb.s_uuid}"; - xmlFSType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(jfsSb.s_time.tv_sec, jfsSb.s_time.tv_nsec); - xmlFSType.ModificationDateSpecified = true; - if(jfsSb.s_state != 0) xmlFSType.Dirty = true; + XmlFsType = new FileSystemType + { + Type = "JFS filesystem", + Clusters = (long)jfsSb.s_size, + ClusterSize = (int)jfsSb.s_bsize, + Bootable = true, + VolumeName = CurrentEncoding.GetString(jfsSb.s_version == 1 ? jfsSb.s_fpack : jfsSb.s_label), + VolumeSerial = $"{jfsSb.s_uuid}", + ModificationDate = DateHandlers.UNIXUnsignedToDateTime(jfsSb.s_time.tv_sec, jfsSb.s_time.tv_nsec), + ModificationDateSpecified = true + }; + if(jfsSb.s_state != 0) XmlFsType.Dirty = true; information = sb.ToString(); } diff --git a/DiscImageChef.Filesystems/LIF.cs b/DiscImageChef.Filesystems/LIF.cs index dd9431c15..7fc50ad26 100644 --- a/DiscImageChef.Filesystems/LIF.cs +++ b/DiscImageChef.Filesystems/LIF.cs @@ -61,42 +61,38 @@ namespace DiscImageChef.Filesystems [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public byte[] creationDate; } - const uint LIF_Magic = 0x8000; + const uint LIF_MAGIC = 0x8000; public LIF() { Name = "HP Logical Interchange Format Plugin"; - PluginUUID = new Guid("41535647-77A5-477B-9206-DA727ACDC704"); + PluginUuid = new Guid("41535647-77A5-477B-9206-DA727ACDC704"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public LIF(Encoding encoding) { Name = "HP Logical Interchange Format Plugin"; - PluginUUID = new Guid("41535647-77A5-477B-9206-DA727ACDC704"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("41535647-77A5-477B-9206-DA727ACDC704"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public LIF(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "HP Logical Interchange Format Plugin"; - PluginUUID = new Guid("41535647-77A5-477B-9206-DA727ACDC704"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("41535647-77A5-477B-9206-DA727ACDC704"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { if(imagePlugin.GetSectorSize() < 256) return false; - LIF_SystemBlock LIFSb; - byte[] sector = imagePlugin.ReadSector(partition.Start); - LIFSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); - DicConsole.DebugWriteLine("LIF plugin", "magic 0x{0:X8} (expected 0x{1:X8})", LIFSb.magic, LIF_Magic); + LIF_SystemBlock lifSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); + DicConsole.DebugWriteLine("LIF plugin", "magic 0x{0:X8} (expected 0x{1:X8})", lifSb.magic, LIF_MAGIC); - return LIFSb.magic == LIF_Magic; + return lifSb.magic == LIF_MAGIC; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -106,38 +102,36 @@ namespace DiscImageChef.Filesystems if(imagePlugin.GetSectorSize() < 256) return; - LIF_SystemBlock LIFSb; - byte[] sector = imagePlugin.ReadSector(partition.Start); - LIFSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); + LIF_SystemBlock lifSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); - if(LIFSb.magic != LIF_Magic) return; + if(lifSb.magic != LIF_MAGIC) return; StringBuilder sb = new StringBuilder(); sb.AppendLine("HP Logical Interchange Format"); - sb.AppendFormat("Directory starts at cluster {0}", LIFSb.directoryStart).AppendLine(); - sb.AppendFormat("LIF identifier: {0}", LIFSb.lifId).AppendLine(); - sb.AppendFormat("Directory size: {0} clusters", LIFSb.directorySize).AppendLine(); - sb.AppendFormat("LIF version: {0}", LIFSb.lifVersion).AppendLine(); + sb.AppendFormat("Directory starts at cluster {0}", lifSb.directoryStart).AppendLine(); + sb.AppendFormat("LIF identifier: {0}", lifSb.lifId).AppendLine(); + sb.AppendFormat("Directory size: {0} clusters", lifSb.directorySize).AppendLine(); + sb.AppendFormat("LIF version: {0}", lifSb.lifVersion).AppendLine(); // How is this related to volume size? I have only CDs to test and makes no sense there - sb.AppendFormat("{0} tracks", LIFSb.tracks).AppendLine(); - sb.AppendFormat("{0} heads", LIFSb.heads).AppendLine(); - sb.AppendFormat("{0} sectors", LIFSb.sectors).AppendLine(); - sb.AppendFormat("Volume name: {0}", StringHandlers.CToString(LIFSb.volumeLabel, CurrentEncoding)) + sb.AppendFormat("{0} tracks", lifSb.tracks).AppendLine(); + sb.AppendFormat("{0} heads", lifSb.heads).AppendLine(); + sb.AppendFormat("{0} sectors", lifSb.sectors).AppendLine(); + sb.AppendFormat("Volume name: {0}", StringHandlers.CToString(lifSb.volumeLabel, CurrentEncoding)) .AppendLine(); - sb.AppendFormat("Volume created on {0}", DateHandlers.LifToDateTime(LIFSb.creationDate)).AppendLine(); + sb.AppendFormat("Volume created on {0}", DateHandlers.LifToDateTime(lifSb.creationDate)).AppendLine(); information = sb.ToString(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "HP Logical Interchange Format", ClusterSize = 256, Clusters = (long)(partition.Size / 256), - CreationDate = DateHandlers.LifToDateTime(LIFSb.creationDate), + CreationDate = DateHandlers.LifToDateTime(lifSb.creationDate), CreationDateSpecified = true, - VolumeName = StringHandlers.CToString(LIFSb.volumeLabel, CurrentEncoding) + VolumeName = StringHandlers.CToString(lifSb.volumeLabel, CurrentEncoding) }; } diff --git a/DiscImageChef.Filesystems/LisaFS/Consts.cs b/DiscImageChef.Filesystems/LisaFS/Consts.cs index 9e204656c..7ffd87569 100644 --- a/DiscImageChef.Filesystems/LisaFS/Consts.cs +++ b/DiscImageChef.Filesystems/LisaFS/Consts.cs @@ -38,13 +38,13 @@ namespace DiscImageChef.Filesystems.LisaFS /// Lisa FS v1, from Lisa OS 1.0 (Workshop or Office) /// Never seen on Sony floppies. /// - const byte LisaFSv1 = 0x0E; + const byte LISA_V1 = 0x0E; /// /// Lisa FS v2, from Lisa OS 2.0 (Workshop or Office) /// Contrary to what most information online says the only difference with V1 /// is the Extents File size. Catalog format is the same /// - const byte LisaFSv2 = 0x0F; + const byte LISA_V2 = 0x0F; /// /// Lisa FS v3, from Lisa OS 3.0 (Workshop or Office) /// Adds support for user catalogs (aka subdirectories), @@ -52,7 +52,7 @@ namespace DiscImageChef.Filesystems.LisaFS /// Uses '-' as path separator (so people that created Lisa/FILE.TEXT just /// created a file named like that :p) /// - const byte LisaFSv3 = 0x11; + const byte LISA_V3 = 0x11; /// Maximum string size in LisaFS const uint E_NAME = 32; /// diff --git a/DiscImageChef.Filesystems/LisaFS/Dir.cs b/DiscImageChef.Filesystems/LisaFS/Dir.cs index 33568a0ac..af16a0729 100644 --- a/DiscImageChef.Filesystems/LisaFS/Dir.cs +++ b/DiscImageChef.Filesystems/LisaFS/Dir.cs @@ -58,9 +58,7 @@ namespace DiscImageChef.Filesystems.LisaFS /// Directory contents. public override Errno ReadDir(string path, ref List contents) { - short fileId; - bool isDir; - Errno error = LookupFileId(path, out fileId, out isDir); + Errno error = LookupFileId(path, out short fileId, out bool isDir); if(error != Errno.NoError) return error; if(!isDir) return Errno.NotDirectory; @@ -106,13 +104,10 @@ namespace DiscImageChef.Filesystems.LisaFS catalogCache = new List(); - Errno error; - // Do differently for V1 and V2 - if(mddf.fsversion == LisaFSv2 || mddf.fsversion == LisaFSv1) + if(mddf.fsversion == LISA_V2 || mddf.fsversion == LISA_V1) { - byte[] buf; - error = ReadFile((short)FILEID_CATALOG, out buf); + Errno error = ReadFile((short)FILEID_CATALOG, out byte[] buf); if(error != Errno.NoError) return error; int offset = 0; @@ -142,18 +137,19 @@ namespace DiscImageChef.Filesystems.LisaFS // Convert entries to V3 format foreach(CatalogEntryV2 entV2 in catalogV2) { - ExtentFile ext; - error = ReadExtentsFile(entV2.fileID, out ext); + error = ReadExtentsFile(entV2.fileID, out ExtentFile ext); if(error != Errno.NoError) continue; - CatalogEntry entV3 = new CatalogEntry(); - entV3.fileID = entV2.fileID; - entV3.filename = new byte[32]; + CatalogEntry entV3 = new CatalogEntry + { + fileID = entV2.fileID, + filename = new byte[32], + fileType = entV2.fileType, + length = (int)srecords[entV2.fileID].filesize, + dtc = ext.dtc, + dtm = ext.dtm + }; 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; catalogCache.Add(entV3); } @@ -168,8 +164,7 @@ namespace DiscImageChef.Filesystems.LisaFS // If root catalog is not pointed in MDDF (unchecked) maybe it's always following S-Records File? for(ulong i = 0; i < device.GetSectors(); i++) { - LisaTag.PriamTag catTag; - DecodeTag(device.ReadSectorTag(i, SectorTagType.AppleSectorTag), out catTag); + DecodeTag(device.ReadSectorTag(i, SectorTagType.AppleSectorTag), out LisaTag.PriamTag catTag); if(catTag.FileId != FILEID_CATALOG || catTag.RelPage != 0) continue; @@ -186,9 +181,8 @@ namespace DiscImageChef.Filesystems.LisaFS // Traverse double-linked list until first catalog block while(prevCatalogPointer != 0xFFFFFFFF) { - LisaTag.PriamTag prevTag; DecodeTag(device.ReadSectorTag(prevCatalogPointer + mddf.mddf_block + volumePrefix, SectorTagType.AppleSectorTag), - out prevTag); + out LisaTag.PriamTag prevTag); if(prevTag.FileId != FILEID_CATALOG) return Errno.InvalidArgument; @@ -199,15 +193,13 @@ namespace DiscImageChef.Filesystems.LisaFS ulong nextCatalogPointer; nextCatalogPointer = BigEndianBitConverter.ToUInt32(firstCatalogBlock, 0x7FA); - List catalogBlocks = new List(); - catalogBlocks.Add(firstCatalogBlock); + List catalogBlocks = new List {firstCatalogBlock}; // Traverse double-linked list to read full catalog while(nextCatalogPointer != 0xFFFFFFFF) { - LisaTag.PriamTag nextTag; DecodeTag(device.ReadSectorTag(nextCatalogPointer + mddf.mddf_block + volumePrefix, SectorTagType.AppleSectorTag), - out nextTag); + out LisaTag.PriamTag nextTag); if(nextTag.FileId != FILEID_CATALOG) return Errno.InvalidArgument; @@ -232,24 +224,25 @@ namespace DiscImageChef.Filesystems.LisaFS // Normal entry else if(buf[offset + 0x24] == 0x03 && buf[offset] == 0x24) { - CatalogEntry entry = new CatalogEntry(); - entry.marker = buf[offset]; - entry.parentID = BigEndianBitConverter.ToUInt16(buf, offset + 0x01); - entry.filename = new byte[E_NAME]; + CatalogEntry entry = new CatalogEntry + { + marker = buf[offset], + parentID = BigEndianBitConverter.ToUInt16(buf, offset + 0x01), + filename = new byte[E_NAME], + terminator = buf[offset + 0x23], + fileType = buf[offset + 0x24], + unknown = buf[offset + 0x25], + fileID = BigEndianBitConverter.ToInt16(buf, offset + 0x26), + dtc = BigEndianBitConverter.ToUInt32(buf, offset + 0x28), + dtm = BigEndianBitConverter.ToUInt32(buf, offset + 0x2C), + length = BigEndianBitConverter.ToInt32(buf, offset + 0x30), + wasted = BigEndianBitConverter.ToInt32(buf, offset + 0x34), + tail = new byte[8] + }; Array.Copy(buf, offset + 0x03, entry.filename, 0, E_NAME); - entry.terminator = buf[offset + 0x23]; - entry.fileType = buf[offset + 0x24]; - entry.unknown = buf[offset + 0x25]; - entry.fileID = BigEndianBitConverter.ToInt16(buf, offset + 0x26); - entry.dtc = BigEndianBitConverter.ToUInt32(buf, offset + 0x28); - entry.dtm = BigEndianBitConverter.ToUInt32(buf, offset + 0x2C); - entry.length = BigEndianBitConverter.ToInt32(buf, offset + 0x30); - entry.wasted = BigEndianBitConverter.ToInt32(buf, offset + 0x34); - entry.tail = new byte[8]; Array.Copy(buf, offset + 0x38, entry.tail, 0, 8); - ExtentFile ext; - if(ReadExtentsFile(entry.fileID, out ext) == Errno.NoError) + if(ReadExtentsFile(entry.fileID, out _) == Errno.NoError) if(!fileSizeCache.ContainsKey(entry.fileID)) { catalogCache.Add(entry); @@ -261,23 +254,25 @@ namespace DiscImageChef.Filesystems.LisaFS // Subdirectory entry else if(buf[offset + 0x24] == 0x01 && buf[offset] == 0x24) { - CatalogEntry entry = new CatalogEntry(); - entry.marker = buf[offset]; - entry.parentID = BigEndianBitConverter.ToUInt16(buf, offset + 0x01); - entry.filename = new byte[E_NAME]; + CatalogEntry entry = new CatalogEntry + { + marker = buf[offset], + parentID = BigEndianBitConverter.ToUInt16(buf, offset + 0x01), + filename = new byte[E_NAME], + terminator = buf[offset + 0x23], + fileType = buf[offset + 0x24], + unknown = buf[offset + 0x25], + fileID = BigEndianBitConverter.ToInt16(buf, offset + 0x26), + dtc = BigEndianBitConverter.ToUInt32(buf, offset + 0x28), + dtm = BigEndianBitConverter.ToUInt32(buf, offset + 0x2C), + length = 0, + wasted = 0, + tail = null + }; Array.Copy(buf, offset + 0x03, entry.filename, 0, E_NAME); - entry.terminator = buf[offset + 0x23]; - entry.fileType = buf[offset + 0x24]; - entry.unknown = buf[offset + 0x25]; - entry.fileID = BigEndianBitConverter.ToInt16(buf, offset + 0x26); - entry.dtc = BigEndianBitConverter.ToUInt32(buf, offset + 0x28); - entry.dtm = BigEndianBitConverter.ToUInt32(buf, offset + 0x2C); - entry.length = 0; - entry.wasted = 0; - entry.tail = null; - if(!directoryDTCCache.ContainsKey(entry.fileID)) - directoryDTCCache.Add(entry.fileID, DateHandlers.LisaToDateTime(entry.dtc)); + if(!directoryDtcCache.ContainsKey(entry.fileID)) + directoryDtcCache.Add(entry.fileID, DateHandlers.LisaToDateTime(entry.dtc)); catalogCache.Add(entry); @@ -295,21 +290,22 @@ namespace DiscImageChef.Filesystems.LisaFS if(!mounted) return Errno.AccessDenied; - stat = new FileEntryInfo(); - stat.Attributes = new FileAttributes(); - DateTime tmp; + stat = new FileEntryInfo + { + Attributes = new FileAttributes(), + Inode = FILEID_CATALOG, + Mode = 0x16D, + Links = 0, + UID = 0, + GID = 0, + DeviceNo = 0, + Length = 0, + BlockSize = mddf.datasize, + Blocks = 0 + }; - directoryDTCCache.TryGetValue(dirId, out tmp); + directoryDtcCache.TryGetValue(dirId, out DateTime tmp); stat.CreationTime = tmp; - stat.Inode = FILEID_CATALOG; - stat.Mode = 0x16D; - stat.Links = 0; - stat.UID = 0; - stat.GID = 0; - stat.DeviceNo = 0; - stat.Length = 0; - stat.BlockSize = mddf.datasize; - stat.Blocks = 0; return Errno.NoError; } diff --git a/DiscImageChef.Filesystems/LisaFS/Extent.cs b/DiscImageChef.Filesystems/LisaFS/Extent.cs index 2d41844fd..4c0fe0954 100644 --- a/DiscImageChef.Filesystems/LisaFS/Extent.cs +++ b/DiscImageChef.Filesystems/LisaFS/Extent.cs @@ -57,7 +57,7 @@ namespace DiscImageChef.Filesystems.LisaFS if(!mounted) return Errno.AccessDenied; - if(fileId < 4 || fileId == 4 && mddf.fsversion != LisaFSv2 && mddf.fsversion != LisaFSv1) + if(fileId < 4 || fileId == 4 && mddf.fsversion != LISA_V2 && mddf.fsversion != LISA_V1) return Errno.InvalidArgument; if(extentCache.TryGetValue(fileId, out file)) return Errno.NoError; @@ -100,10 +100,7 @@ namespace DiscImageChef.Filesystems.LisaFS if(extTag.FileId != (short)(-1 * fileId)) return Errno.NoSuchFile; - byte[] sector; - - if(mddf.fsversion == LisaFSv1) sector = device.ReadSectors(ptr, 2); - else sector = device.ReadSector(ptr); + byte[] sector = mddf.fsversion == LISA_V1 ? device.ReadSectors(ptr, 2) : device.ReadSector(ptr); if(sector[0] >= 32 || sector[0] == 0) return Errno.InvalidArgument; @@ -151,7 +148,7 @@ namespace DiscImageChef.Filesystems.LisaFS int extentsCount = 0; int extentsOffset; - if(mddf.fsversion == LisaFSv1) + if(mddf.fsversion == LISA_V1) { file.length = BigEndianBitConverter.ToInt32(sector, 0x200); file.unknown9 = BigEndianBitConverter.ToInt32(sector, 0x204); @@ -175,9 +172,11 @@ namespace DiscImageChef.Filesystems.LisaFS for(int j = 0; j < extentsCount; j++) { - file.extents[j] = new Extent(); - file.extents[j].start = BigEndianBitConverter.ToInt32(sector, extentsOffset + j * 6); - file.extents[j].length = BigEndianBitConverter.ToInt16(sector, extentsOffset + j * 6 + 4); + file.extents[j] = new Extent + { + start = BigEndianBitConverter.ToInt32(sector, extentsOffset + j * 6), + length = BigEndianBitConverter.ToInt16(sector, extentsOffset + j * 6 + 4) + }; } extentCache.Add(fileId, file); @@ -278,11 +277,13 @@ namespace DiscImageChef.Filesystems.LisaFS for(int s = 0; s < srecords.Length; s++) { - srecords[s] = new SRecord(); - srecords[s].extent_ptr = BigEndianBitConverter.ToUInt32(sectors, 0x00 + 14 * s); - srecords[s].unknown = BigEndianBitConverter.ToUInt32(sectors, 0x04 + 14 * s); - srecords[s].filesize = BigEndianBitConverter.ToUInt32(sectors, 0x08 + 14 * s); - srecords[s].flags = BigEndianBitConverter.ToUInt16(sectors, 0x0C + 14 * s); + srecords[s] = new SRecord + { + extent_ptr = BigEndianBitConverter.ToUInt32(sectors, 0x00 + 14 * s), + unknown = BigEndianBitConverter.ToUInt32(sectors, 0x04 + 14 * s), + filesize = BigEndianBitConverter.ToUInt32(sectors, 0x08 + 14 * s), + flags = BigEndianBitConverter.ToUInt16(sectors, 0x0C + 14 * s) + }; } return Errno.NoError; diff --git a/DiscImageChef.Filesystems/LisaFS/File.cs b/DiscImageChef.Filesystems/LisaFS/File.cs index d292b51d0..c6e63b678 100644 --- a/DiscImageChef.Filesystems/LisaFS/File.cs +++ b/DiscImageChef.Filesystems/LisaFS/File.cs @@ -41,9 +41,7 @@ namespace DiscImageChef.Filesystems.LisaFS { public override Errno GetAttributes(string path, ref FileAttributes attributes) { - short fileId; - bool isDir; - Errno error = LookupFileId(path, out fileId, out isDir); + Errno error = LookupFileId(path, out short fileId, out bool isDir); if(error != Errno.NoError) return error; if(!isDir) return GetAttributes(fileId, ref attributes); @@ -64,9 +62,7 @@ namespace DiscImageChef.Filesystems.LisaFS if(offset < 0) return Errno.InvalidArgument; - short fileId; - bool isDir; - Errno error = LookupFileId(path, out fileId, out isDir); + Errno error = LookupFileId(path, out short fileId, out _); if(error != Errno.NoError) return error; byte[] tmp; @@ -100,9 +96,7 @@ namespace DiscImageChef.Filesystems.LisaFS public override Errno Stat(string path, ref FileEntryInfo stat) { - short fileId; - bool isDir; - Errno error = LookupFileId(path, out fileId, out isDir); + Errno error = LookupFileId(path, out short fileId, out bool isDir); if(error != Errno.NoError) return error; return isDir ? StatDir(fileId, out stat) : Stat(fileId, out stat); @@ -125,8 +119,7 @@ namespace DiscImageChef.Filesystems.LisaFS return Errno.NoError; } - ExtentFile extFile; - Errno error = ReadExtentsFile(fileId, out extFile); + Errno error = ReadExtentsFile(fileId, out ExtentFile extFile); if(error != Errno.NoError) return error; @@ -200,8 +193,7 @@ namespace DiscImageChef.Filesystems.LisaFS if(count == 0) return Errno.NoSuchFile; - if(!tags) buf = new byte[count * device.GetSectorSize()]; - else buf = new byte[count * devTagSize]; + buf = !tags ? new byte[count * device.GetSectorSize()] : new byte[count * devTagSize]; // Should be enough to check 100 sectors? for(ulong i = 0; i < 100; i++) @@ -210,10 +202,7 @@ namespace DiscImageChef.Filesystems.LisaFS if(sysTag.FileId != fileId) continue; - byte[] sector; - - if(!tags) sector = device.ReadSector(i); - else sector = device.ReadSectorTag(i, SectorTagType.AppleSectorTag); + byte[] sector = !tags ? device.ReadSector(i) : device.ReadSectorTag(i, SectorTagType.AppleSectorTag); // Relative block for $Loader starts at $Boot block if(sysTag.FileId == FILEID_LOADER_SIGNED) sysTag.RelPage--; @@ -239,8 +228,7 @@ namespace DiscImageChef.Filesystems.LisaFS if(!debug || fileId == 0) return Errno.NoSuchFile; else { - stat = new FileEntryInfo(); - stat.Attributes = new FileAttributes(); + stat = new FileEntryInfo {Attributes = new FileAttributes()}; error = GetAttributes(fileId, ref stat.Attributes); if(error != Errno.NoError) return error; @@ -267,12 +255,10 @@ namespace DiscImageChef.Filesystems.LisaFS } else { - byte[] buf; - error = ReadSystemFile(fileId, out buf); + error = ReadSystemFile(fileId, out byte[] buf); if(error != Errno.NoError) return error; - if(fileId != 4) stat.CreationTime = mddf.dtvc; - else stat.CreationTime = mddf.dtcc; + stat.CreationTime = fileId != 4 ? mddf.dtvc : mddf.dtcc; stat.BackupTime = mddf.dtvb; @@ -290,8 +276,7 @@ namespace DiscImageChef.Filesystems.LisaFS return Errno.NoError; } - stat = new FileEntryInfo(); - stat.Attributes = new FileAttributes(); + stat = new FileEntryInfo {Attributes = new FileAttributes()}; error = GetAttributes(fileId, ref stat.Attributes); if(error != Errno.NoError) return error; @@ -309,8 +294,7 @@ namespace DiscImageChef.Filesystems.LisaFS stat.UID = 0; stat.GID = 0; stat.DeviceNo = 0; - int len; - if(!fileSizeCache.TryGetValue(fileId, out len)) stat.Length = srecords[fileId].filesize; + if(!fileSizeCache.TryGetValue(fileId, out int len)) stat.Length = srecords[fileId].filesize; else stat.Length = len; stat.BlockSize = mddf.datasize; stat.Blocks = file.length; @@ -330,15 +314,12 @@ namespace DiscImageChef.Filesystems.LisaFS tags &= debug; - if(fileId < 4 || fileId == 4 && mddf.fsversion != LisaFSv2 && mddf.fsversion != LisaFSv1) + if(fileId < 4 || fileId == 4 && mddf.fsversion != LISA_V2 && mddf.fsversion != LISA_V1) return Errno.InvalidArgument; if(!tags && fileCache.TryGetValue(fileId, out buf)) return Errno.NoError; - Errno error; - ExtentFile file; - - error = ReadExtentsFile(fileId, out file); + Errno error = ReadExtentsFile(fileId, out ExtentFile file); if(error != Errno.NoError) return error; int sectorSize; @@ -365,8 +346,7 @@ namespace DiscImageChef.Filesystems.LisaFS if(!tags) { - int realSize; - if(fileSizeCache.TryGetValue(fileId, out realSize)) if(realSize > temp.Length) DicConsole.ErrorWriteLine("File {0} gets truncated.", fileId); + if(fileSizeCache.TryGetValue(fileId, out int realSize)) if(realSize > temp.Length) DicConsole.ErrorWriteLine("File {0} gets truncated.", fileId); buf = temp; fileCache.Add(fileId, buf); @@ -393,7 +373,7 @@ namespace DiscImageChef.Filesystems.LisaFS } // Only V3 supports subdirectories - if(pathElements.Length > 1 && mddf.fsversion != LisaFSv3) return Errno.NotSupported; + if(pathElements.Length > 1 && mddf.fsversion != LISA_V3) return Errno.NotSupported; if(debug && pathElements.Length == 1) { diff --git a/DiscImageChef.Filesystems/LisaFS/Info.cs b/DiscImageChef.Filesystems/LisaFS/Info.cs index c4de61fc9..556589567 100644 --- a/DiscImageChef.Filesystems/LisaFS/Info.cs +++ b/DiscImageChef.Filesystems/LisaFS/Info.cs @@ -56,56 +56,54 @@ namespace DiscImageChef.Filesystems.LisaFS // Minimal LisaOS disk is 3.5" single sided double density, 800 sectors if(imagePlugin.GetSectors() < 800) return false; - int before_mddf = -1; + int beforeMddf = -1; // LisaOS searches sectors until tag tells MDDF resides there, so we'll search 100 sectors for(int i = 0; i < 100; i++) { - LisaTag.PriamTag searchTag; - DecodeTag(imagePlugin.ReadSectorTag((ulong)i, SectorTagType.AppleSectorTag), out searchTag); + DecodeTag(imagePlugin.ReadSectorTag((ulong)i, SectorTagType.AppleSectorTag), out LisaTag.PriamTag searchTag); DicConsole.DebugWriteLine("LisaFS plugin", "Sector {0}, file ID 0x{1:X4}", i, searchTag.FileId); - if(before_mddf == -1 && searchTag.FileId == FILEID_LOADER_SIGNED) before_mddf = i - 1; + if(beforeMddf == -1 && searchTag.FileId == FILEID_LOADER_SIGNED) beforeMddf = i - 1; if(searchTag.FileId != FILEID_MDDF) continue; byte[] sector = imagePlugin.ReadSector((ulong)i); - MDDF info_mddf = new MDDF(); - - info_mddf.mddf_block = BigEndianBitConverter.ToUInt32(sector, 0x6C); - info_mddf.volsize_minus_one = BigEndianBitConverter.ToUInt32(sector, 0x70); - info_mddf.volsize_minus_mddf_minus_one = BigEndianBitConverter.ToUInt32(sector, 0x74); - info_mddf.vol_size = BigEndianBitConverter.ToUInt32(sector, 0x78); - info_mddf.blocksize = BigEndianBitConverter.ToUInt16(sector, 0x7C); - info_mddf.datasize = BigEndianBitConverter.ToUInt16(sector, 0x7E); + MDDF infoMddf = new MDDF + { + mddf_block = BigEndianBitConverter.ToUInt32(sector, 0x6C), + volsize_minus_one = BigEndianBitConverter.ToUInt32(sector, 0x70), + volsize_minus_mddf_minus_one = BigEndianBitConverter.ToUInt32(sector, 0x74), + vol_size = BigEndianBitConverter.ToUInt32(sector, 0x78), + blocksize = BigEndianBitConverter.ToUInt16(sector, 0x7C), + datasize = BigEndianBitConverter.ToUInt16(sector, 0x7E) + }; DicConsole.DebugWriteLine("LisaFS plugin", "Current sector = {0}", i); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.mddf_block = {0}", info_mddf.mddf_block); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.mddf_block = {0}", infoMddf.mddf_block); DicConsole.DebugWriteLine("LisaFS plugin", "Disk size = {0} sectors", imagePlugin.GetSectors()); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.vol_size = {0} sectors", info_mddf.vol_size); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.vol_size - 1 = {0}", info_mddf.volsize_minus_one); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.vol_size = {0} sectors", infoMddf.vol_size); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.vol_size - 1 = {0}", infoMddf.volsize_minus_one); DicConsole.DebugWriteLine("LisaFS plugin", "mddf.vol_size - mddf.mddf_block -1 = {0}", - info_mddf.volsize_minus_mddf_minus_one); + infoMddf.volsize_minus_mddf_minus_one); DicConsole.DebugWriteLine("LisaFS plugin", "Disk sector = {0} bytes", imagePlugin.GetSectorSize()); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.blocksize = {0} bytes", info_mddf.blocksize); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.datasize = {0} bytes", info_mddf.datasize); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.blocksize = {0} bytes", infoMddf.blocksize); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.datasize = {0} bytes", infoMddf.datasize); - if(info_mddf.mddf_block != i - before_mddf) return false; + if(infoMddf.mddf_block != i - beforeMddf) return false; - if(info_mddf.vol_size > imagePlugin.GetSectors()) return false; + if(infoMddf.vol_size > imagePlugin.GetSectors()) return false; - if(info_mddf.vol_size - 1 != info_mddf.volsize_minus_one) return false; + if(infoMddf.vol_size - 1 != infoMddf.volsize_minus_one) return false; - if(info_mddf.vol_size - i - 1 != info_mddf.volsize_minus_mddf_minus_one - before_mddf) return false; + if(infoMddf.vol_size - i - 1 != infoMddf.volsize_minus_mddf_minus_one - beforeMddf) return false; - if(info_mddf.datasize > info_mddf.blocksize) return false; + if(infoMddf.datasize > infoMddf.blocksize) return false; - if(info_mddf.blocksize < imagePlugin.GetSectorSize()) return false; + if(infoMddf.blocksize < imagePlugin.GetSectorSize()) return false; - if(info_mddf.datasize != imagePlugin.GetSectorSize()) return false; - - return true; + return infoMddf.datasize == imagePlugin.GetSectorSize(); } return false; @@ -134,243 +132,241 @@ namespace DiscImageChef.Filesystems.LisaFS // Minimal LisaOS disk is 3.5" single sided double density, 800 sectors if(imagePlugin.GetSectors() < 800) return; - int before_mddf = -1; + int beforeMddf = -1; // LisaOS searches sectors until tag tells MDDF resides there, so we'll search 100 sectors for(int i = 0; i < 100; i++) { - LisaTag.PriamTag searchTag; - DecodeTag(imagePlugin.ReadSectorTag((ulong)i, SectorTagType.AppleSectorTag), out searchTag); + DecodeTag(imagePlugin.ReadSectorTag((ulong)i, SectorTagType.AppleSectorTag), out LisaTag.PriamTag searchTag); DicConsole.DebugWriteLine("LisaFS plugin", "Sector {0}, file ID 0x{1:X4}", i, searchTag.FileId); - if(before_mddf == -1 && searchTag.FileId == FILEID_LOADER_SIGNED) before_mddf = i - 1; + if(beforeMddf == -1 && searchTag.FileId == FILEID_LOADER_SIGNED) beforeMddf = i - 1; if(searchTag.FileId != FILEID_MDDF) continue; byte[] sector = imagePlugin.ReadSector((ulong)i); - MDDF info_mddf = new MDDF(); + MDDF infoMddf = new MDDF(); byte[] pString = new byte[33]; - uint lisa_time; + uint lisaTime; - info_mddf.fsversion = BigEndianBitConverter.ToUInt16(sector, 0x00); - info_mddf.volid = BigEndianBitConverter.ToUInt64(sector, 0x02); - info_mddf.volnum = BigEndianBitConverter.ToUInt16(sector, 0x0A); + infoMddf.fsversion = BigEndianBitConverter.ToUInt16(sector, 0x00); + infoMddf.volid = BigEndianBitConverter.ToUInt64(sector, 0x02); + infoMddf.volnum = BigEndianBitConverter.ToUInt16(sector, 0x0A); Array.Copy(sector, 0x0C, pString, 0, 33); - info_mddf.volname = StringHandlers.PascalToString(pString, CurrentEncoding); - info_mddf.unknown1 = sector[0x2D]; + infoMddf.volname = StringHandlers.PascalToString(pString, CurrentEncoding); + infoMddf.unknown1 = sector[0x2D]; Array.Copy(sector, 0x2E, pString, 0, 33); // Prevent garbage - if(pString[0] <= 32) info_mddf.password = StringHandlers.PascalToString(pString, CurrentEncoding); - else info_mddf.password = ""; - info_mddf.unknown2 = sector[0x4F]; - info_mddf.machine_id = BigEndianBitConverter.ToUInt32(sector, 0x50); - info_mddf.master_copy_id = BigEndianBitConverter.ToUInt32(sector, 0x54); - lisa_time = BigEndianBitConverter.ToUInt32(sector, 0x58); - info_mddf.dtvc = DateHandlers.LisaToDateTime(lisa_time); - lisa_time = BigEndianBitConverter.ToUInt32(sector, 0x5C); - info_mddf.dtcc = DateHandlers.LisaToDateTime(lisa_time); - lisa_time = BigEndianBitConverter.ToUInt32(sector, 0x60); - info_mddf.dtvb = DateHandlers.LisaToDateTime(lisa_time); - lisa_time = BigEndianBitConverter.ToUInt32(sector, 0x64); - info_mddf.dtvs = DateHandlers.LisaToDateTime(lisa_time); - info_mddf.unknown3 = BigEndianBitConverter.ToUInt32(sector, 0x68); - info_mddf.mddf_block = BigEndianBitConverter.ToUInt32(sector, 0x6C); - info_mddf.volsize_minus_one = BigEndianBitConverter.ToUInt32(sector, 0x70); - info_mddf.volsize_minus_mddf_minus_one = BigEndianBitConverter.ToUInt32(sector, 0x74); - info_mddf.vol_size = BigEndianBitConverter.ToUInt32(sector, 0x78); - info_mddf.blocksize = BigEndianBitConverter.ToUInt16(sector, 0x7C); - info_mddf.datasize = BigEndianBitConverter.ToUInt16(sector, 0x7E); - info_mddf.unknown4 = BigEndianBitConverter.ToUInt16(sector, 0x80); - info_mddf.unknown5 = BigEndianBitConverter.ToUInt32(sector, 0x82); - info_mddf.unknown6 = BigEndianBitConverter.ToUInt32(sector, 0x86); - info_mddf.clustersize = BigEndianBitConverter.ToUInt16(sector, 0x8A); - info_mddf.fs_size = BigEndianBitConverter.ToUInt32(sector, 0x8C); - info_mddf.unknown7 = BigEndianBitConverter.ToUInt32(sector, 0x90); - info_mddf.srec_ptr = BigEndianBitConverter.ToUInt32(sector, 0x94); - info_mddf.unknown9 = BigEndianBitConverter.ToUInt16(sector, 0x98); - info_mddf.srec_len = BigEndianBitConverter.ToUInt16(sector, 0x9A); - info_mddf.unknown10 = BigEndianBitConverter.ToUInt32(sector, 0x9C); - info_mddf.unknown11 = BigEndianBitConverter.ToUInt32(sector, 0xA0); - info_mddf.unknown12 = BigEndianBitConverter.ToUInt32(sector, 0xA4); - info_mddf.unknown13 = BigEndianBitConverter.ToUInt32(sector, 0xA8); - info_mddf.unknown14 = BigEndianBitConverter.ToUInt32(sector, 0xAC); - info_mddf.filecount = BigEndianBitConverter.ToUInt16(sector, 0xB0); - info_mddf.unknown15 = BigEndianBitConverter.ToUInt32(sector, 0xB2); - info_mddf.unknown16 = BigEndianBitConverter.ToUInt32(sector, 0xB6); - info_mddf.freecount = BigEndianBitConverter.ToUInt32(sector, 0xBA); - info_mddf.unknown17 = BigEndianBitConverter.ToUInt16(sector, 0xBE); - info_mddf.unknown18 = BigEndianBitConverter.ToUInt32(sector, 0xC0); - info_mddf.overmount_stamp = BigEndianBitConverter.ToUInt64(sector, 0xC4); - info_mddf.serialization = BigEndianBitConverter.ToUInt32(sector, 0xCC); - info_mddf.unknown19 = BigEndianBitConverter.ToUInt32(sector, 0xD0); - info_mddf.unknown_timestamp = BigEndianBitConverter.ToUInt32(sector, 0xD4); - info_mddf.unknown20 = BigEndianBitConverter.ToUInt32(sector, 0xD8); - info_mddf.unknown21 = BigEndianBitConverter.ToUInt32(sector, 0xDC); - info_mddf.unknown22 = BigEndianBitConverter.ToUInt32(sector, 0xE0); - info_mddf.unknown23 = BigEndianBitConverter.ToUInt32(sector, 0xE4); - info_mddf.unknown24 = BigEndianBitConverter.ToUInt32(sector, 0xE8); - info_mddf.unknown25 = BigEndianBitConverter.ToUInt32(sector, 0xEC); - info_mddf.unknown26 = BigEndianBitConverter.ToUInt32(sector, 0xF0); - info_mddf.unknown27 = BigEndianBitConverter.ToUInt32(sector, 0xF4); - info_mddf.unknown28 = BigEndianBitConverter.ToUInt32(sector, 0xF8); - info_mddf.unknown29 = BigEndianBitConverter.ToUInt32(sector, 0xFC); - info_mddf.unknown30 = BigEndianBitConverter.ToUInt32(sector, 0x100); - info_mddf.unknown31 = BigEndianBitConverter.ToUInt32(sector, 0x104); - info_mddf.unknown32 = BigEndianBitConverter.ToUInt32(sector, 0x108); - info_mddf.unknown33 = BigEndianBitConverter.ToUInt32(sector, 0x10C); - info_mddf.unknown34 = BigEndianBitConverter.ToUInt32(sector, 0x110); - info_mddf.unknown35 = BigEndianBitConverter.ToUInt32(sector, 0x114); - info_mddf.backup_volid = BigEndianBitConverter.ToUInt64(sector, 0x118); - info_mddf.label_size = BigEndianBitConverter.ToUInt16(sector, 0x120); - info_mddf.fs_overhead = BigEndianBitConverter.ToUInt16(sector, 0x122); - info_mddf.result_scavenge = BigEndianBitConverter.ToUInt16(sector, 0x124); - info_mddf.boot_code = BigEndianBitConverter.ToUInt16(sector, 0x126); - info_mddf.boot_environ = BigEndianBitConverter.ToUInt16(sector, 0x6C); - info_mddf.unknown36 = BigEndianBitConverter.ToUInt32(sector, 0x12A); - info_mddf.unknown37 = BigEndianBitConverter.ToUInt32(sector, 0x12E); - info_mddf.unknown38 = BigEndianBitConverter.ToUInt32(sector, 0x132); - info_mddf.vol_sequence = BigEndianBitConverter.ToUInt16(sector, 0x136); - info_mddf.vol_left_mounted = sector[0x138]; + infoMddf.password = pString[0] <= 32 ? StringHandlers.PascalToString(pString, CurrentEncoding) : ""; + infoMddf.unknown2 = sector[0x4F]; + infoMddf.machine_id = BigEndianBitConverter.ToUInt32(sector, 0x50); + infoMddf.master_copy_id = BigEndianBitConverter.ToUInt32(sector, 0x54); + lisaTime = BigEndianBitConverter.ToUInt32(sector, 0x58); + infoMddf.dtvc = DateHandlers.LisaToDateTime(lisaTime); + lisaTime = BigEndianBitConverter.ToUInt32(sector, 0x5C); + infoMddf.dtcc = DateHandlers.LisaToDateTime(lisaTime); + lisaTime = BigEndianBitConverter.ToUInt32(sector, 0x60); + infoMddf.dtvb = DateHandlers.LisaToDateTime(lisaTime); + lisaTime = BigEndianBitConverter.ToUInt32(sector, 0x64); + infoMddf.dtvs = DateHandlers.LisaToDateTime(lisaTime); + infoMddf.unknown3 = BigEndianBitConverter.ToUInt32(sector, 0x68); + infoMddf.mddf_block = BigEndianBitConverter.ToUInt32(sector, 0x6C); + infoMddf.volsize_minus_one = BigEndianBitConverter.ToUInt32(sector, 0x70); + infoMddf.volsize_minus_mddf_minus_one = BigEndianBitConverter.ToUInt32(sector, 0x74); + infoMddf.vol_size = BigEndianBitConverter.ToUInt32(sector, 0x78); + infoMddf.blocksize = BigEndianBitConverter.ToUInt16(sector, 0x7C); + infoMddf.datasize = BigEndianBitConverter.ToUInt16(sector, 0x7E); + infoMddf.unknown4 = BigEndianBitConverter.ToUInt16(sector, 0x80); + infoMddf.unknown5 = BigEndianBitConverter.ToUInt32(sector, 0x82); + infoMddf.unknown6 = BigEndianBitConverter.ToUInt32(sector, 0x86); + infoMddf.clustersize = BigEndianBitConverter.ToUInt16(sector, 0x8A); + infoMddf.fs_size = BigEndianBitConverter.ToUInt32(sector, 0x8C); + infoMddf.unknown7 = BigEndianBitConverter.ToUInt32(sector, 0x90); + infoMddf.srec_ptr = BigEndianBitConverter.ToUInt32(sector, 0x94); + infoMddf.unknown9 = BigEndianBitConverter.ToUInt16(sector, 0x98); + infoMddf.srec_len = BigEndianBitConverter.ToUInt16(sector, 0x9A); + infoMddf.unknown10 = BigEndianBitConverter.ToUInt32(sector, 0x9C); + infoMddf.unknown11 = BigEndianBitConverter.ToUInt32(sector, 0xA0); + infoMddf.unknown12 = BigEndianBitConverter.ToUInt32(sector, 0xA4); + infoMddf.unknown13 = BigEndianBitConverter.ToUInt32(sector, 0xA8); + infoMddf.unknown14 = BigEndianBitConverter.ToUInt32(sector, 0xAC); + infoMddf.filecount = BigEndianBitConverter.ToUInt16(sector, 0xB0); + infoMddf.unknown15 = BigEndianBitConverter.ToUInt32(sector, 0xB2); + infoMddf.unknown16 = BigEndianBitConverter.ToUInt32(sector, 0xB6); + infoMddf.freecount = BigEndianBitConverter.ToUInt32(sector, 0xBA); + infoMddf.unknown17 = BigEndianBitConverter.ToUInt16(sector, 0xBE); + infoMddf.unknown18 = BigEndianBitConverter.ToUInt32(sector, 0xC0); + infoMddf.overmount_stamp = BigEndianBitConverter.ToUInt64(sector, 0xC4); + infoMddf.serialization = BigEndianBitConverter.ToUInt32(sector, 0xCC); + infoMddf.unknown19 = BigEndianBitConverter.ToUInt32(sector, 0xD0); + infoMddf.unknown_timestamp = BigEndianBitConverter.ToUInt32(sector, 0xD4); + infoMddf.unknown20 = BigEndianBitConverter.ToUInt32(sector, 0xD8); + infoMddf.unknown21 = BigEndianBitConverter.ToUInt32(sector, 0xDC); + infoMddf.unknown22 = BigEndianBitConverter.ToUInt32(sector, 0xE0); + infoMddf.unknown23 = BigEndianBitConverter.ToUInt32(sector, 0xE4); + infoMddf.unknown24 = BigEndianBitConverter.ToUInt32(sector, 0xE8); + infoMddf.unknown25 = BigEndianBitConverter.ToUInt32(sector, 0xEC); + infoMddf.unknown26 = BigEndianBitConverter.ToUInt32(sector, 0xF0); + infoMddf.unknown27 = BigEndianBitConverter.ToUInt32(sector, 0xF4); + infoMddf.unknown28 = BigEndianBitConverter.ToUInt32(sector, 0xF8); + infoMddf.unknown29 = BigEndianBitConverter.ToUInt32(sector, 0xFC); + infoMddf.unknown30 = BigEndianBitConverter.ToUInt32(sector, 0x100); + infoMddf.unknown31 = BigEndianBitConverter.ToUInt32(sector, 0x104); + infoMddf.unknown32 = BigEndianBitConverter.ToUInt32(sector, 0x108); + infoMddf.unknown33 = BigEndianBitConverter.ToUInt32(sector, 0x10C); + infoMddf.unknown34 = BigEndianBitConverter.ToUInt32(sector, 0x110); + infoMddf.unknown35 = BigEndianBitConverter.ToUInt32(sector, 0x114); + infoMddf.backup_volid = BigEndianBitConverter.ToUInt64(sector, 0x118); + infoMddf.label_size = BigEndianBitConverter.ToUInt16(sector, 0x120); + infoMddf.fs_overhead = BigEndianBitConverter.ToUInt16(sector, 0x122); + infoMddf.result_scavenge = BigEndianBitConverter.ToUInt16(sector, 0x124); + infoMddf.boot_code = BigEndianBitConverter.ToUInt16(sector, 0x126); + infoMddf.boot_environ = BigEndianBitConverter.ToUInt16(sector, 0x6C); + infoMddf.unknown36 = BigEndianBitConverter.ToUInt32(sector, 0x12A); + infoMddf.unknown37 = BigEndianBitConverter.ToUInt32(sector, 0x12E); + infoMddf.unknown38 = BigEndianBitConverter.ToUInt32(sector, 0x132); + infoMddf.vol_sequence = BigEndianBitConverter.ToUInt16(sector, 0x136); + infoMddf.vol_left_mounted = sector[0x138]; - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown1 = 0x{0:X2} ({0})", info_mddf.unknown1); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown2 = 0x{0:X2} ({0})", info_mddf.unknown2); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown3 = 0x{0:X8} ({0})", info_mddf.unknown3); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown4 = 0x{0:X4} ({0})", info_mddf.unknown4); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown5 = 0x{0:X8} ({0})", info_mddf.unknown5); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown6 = 0x{0:X8} ({0})", info_mddf.unknown6); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown7 = 0x{0:X8} ({0})", info_mddf.unknown7); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown9 = 0x{0:X4} ({0})", info_mddf.unknown9); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown10 = 0x{0:X8} ({0})", info_mddf.unknown10); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown11 = 0x{0:X8} ({0})", info_mddf.unknown11); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown12 = 0x{0:X8} ({0})", info_mddf.unknown12); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown13 = 0x{0:X8} ({0})", info_mddf.unknown13); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown14 = 0x{0:X8} ({0})", info_mddf.unknown14); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown15 = 0x{0:X8} ({0})", info_mddf.unknown15); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown16 = 0x{0:X8} ({0})", info_mddf.unknown16); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown17 = 0x{0:X4} ({0})", info_mddf.unknown17); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown18 = 0x{0:X8} ({0})", info_mddf.unknown18); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown19 = 0x{0:X8} ({0})", info_mddf.unknown19); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown20 = 0x{0:X8} ({0})", info_mddf.unknown20); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown21 = 0x{0:X8} ({0})", info_mddf.unknown21); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown22 = 0x{0:X8} ({0})", info_mddf.unknown22); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown23 = 0x{0:X8} ({0})", info_mddf.unknown23); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown24 = 0x{0:X8} ({0})", info_mddf.unknown24); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown25 = 0x{0:X8} ({0})", info_mddf.unknown25); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown26 = 0x{0:X8} ({0})", info_mddf.unknown26); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown27 = 0x{0:X8} ({0})", info_mddf.unknown27); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown28 = 0x{0:X8} ({0})", info_mddf.unknown28); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown29 = 0x{0:X8} ({0})", info_mddf.unknown29); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown30 = 0x{0:X8} ({0})", info_mddf.unknown30); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown31 = 0x{0:X8} ({0})", info_mddf.unknown31); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown32 = 0x{0:X8} ({0})", info_mddf.unknown32); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown33 = 0x{0:X8} ({0})", info_mddf.unknown33); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown34 = 0x{0:X8} ({0})", info_mddf.unknown34); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown35 = 0x{0:X8} ({0})", info_mddf.unknown35); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown36 = 0x{0:X8} ({0})", info_mddf.unknown36); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown37 = 0x{0:X8} ({0})", info_mddf.unknown37); - DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown38 = 0x{0:X8} ({0})", info_mddf.unknown38); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown1 = 0x{0:X2} ({0})", infoMddf.unknown1); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown2 = 0x{0:X2} ({0})", infoMddf.unknown2); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown3 = 0x{0:X8} ({0})", infoMddf.unknown3); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown4 = 0x{0:X4} ({0})", infoMddf.unknown4); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown5 = 0x{0:X8} ({0})", infoMddf.unknown5); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown6 = 0x{0:X8} ({0})", infoMddf.unknown6); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown7 = 0x{0:X8} ({0})", infoMddf.unknown7); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown9 = 0x{0:X4} ({0})", infoMddf.unknown9); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown10 = 0x{0:X8} ({0})", infoMddf.unknown10); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown11 = 0x{0:X8} ({0})", infoMddf.unknown11); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown12 = 0x{0:X8} ({0})", infoMddf.unknown12); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown13 = 0x{0:X8} ({0})", infoMddf.unknown13); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown14 = 0x{0:X8} ({0})", infoMddf.unknown14); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown15 = 0x{0:X8} ({0})", infoMddf.unknown15); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown16 = 0x{0:X8} ({0})", infoMddf.unknown16); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown17 = 0x{0:X4} ({0})", infoMddf.unknown17); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown18 = 0x{0:X8} ({0})", infoMddf.unknown18); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown19 = 0x{0:X8} ({0})", infoMddf.unknown19); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown20 = 0x{0:X8} ({0})", infoMddf.unknown20); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown21 = 0x{0:X8} ({0})", infoMddf.unknown21); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown22 = 0x{0:X8} ({0})", infoMddf.unknown22); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown23 = 0x{0:X8} ({0})", infoMddf.unknown23); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown24 = 0x{0:X8} ({0})", infoMddf.unknown24); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown25 = 0x{0:X8} ({0})", infoMddf.unknown25); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown26 = 0x{0:X8} ({0})", infoMddf.unknown26); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown27 = 0x{0:X8} ({0})", infoMddf.unknown27); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown28 = 0x{0:X8} ({0})", infoMddf.unknown28); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown29 = 0x{0:X8} ({0})", infoMddf.unknown29); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown30 = 0x{0:X8} ({0})", infoMddf.unknown30); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown31 = 0x{0:X8} ({0})", infoMddf.unknown31); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown32 = 0x{0:X8} ({0})", infoMddf.unknown32); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown33 = 0x{0:X8} ({0})", infoMddf.unknown33); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown34 = 0x{0:X8} ({0})", infoMddf.unknown34); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown35 = 0x{0:X8} ({0})", infoMddf.unknown35); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown36 = 0x{0:X8} ({0})", infoMddf.unknown36); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown37 = 0x{0:X8} ({0})", infoMddf.unknown37); + DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown38 = 0x{0:X8} ({0})", infoMddf.unknown38); DicConsole.DebugWriteLine("LisaFS plugin", "mddf.unknown_timestamp = 0x{0:X8} ({0}, {1})", - info_mddf.unknown_timestamp, - DateHandlers.LisaToDateTime(info_mddf.unknown_timestamp)); + infoMddf.unknown_timestamp, + DateHandlers.LisaToDateTime(infoMddf.unknown_timestamp)); - if(info_mddf.mddf_block != i - before_mddf) return; + if(infoMddf.mddf_block != i - beforeMddf) return; - if(info_mddf.vol_size > imagePlugin.GetSectors()) return; + if(infoMddf.vol_size > imagePlugin.GetSectors()) return; - if(info_mddf.vol_size - 1 != info_mddf.volsize_minus_one) return; + if(infoMddf.vol_size - 1 != infoMddf.volsize_minus_one) return; - if(info_mddf.vol_size - i - 1 != info_mddf.volsize_minus_mddf_minus_one - before_mddf) return; + if(infoMddf.vol_size - i - 1 != infoMddf.volsize_minus_mddf_minus_one - beforeMddf) return; - if(info_mddf.datasize > info_mddf.blocksize) return; + if(infoMddf.datasize > infoMddf.blocksize) return; - if(info_mddf.blocksize < imagePlugin.GetSectorSize()) return; + if(infoMddf.blocksize < imagePlugin.GetSectorSize()) return; - if(info_mddf.datasize != imagePlugin.GetSectorSize()) return; + if(infoMddf.datasize != imagePlugin.GetSectorSize()) return; - switch(info_mddf.fsversion) + switch(infoMddf.fsversion) { - case LisaFSv1: + case LISA_V1: sb.AppendLine("LisaFS v1"); break; - case LisaFSv2: + case LISA_V2: sb.AppendLine("LisaFS v2"); break; - case LisaFSv3: + case LISA_V3: sb.AppendLine("LisaFS v3"); break; default: - sb.AppendFormat("Uknown LisaFS version {0}", info_mddf.fsversion).AppendLine(); + sb.AppendFormat("Uknown LisaFS version {0}", infoMddf.fsversion).AppendLine(); break; } - sb.AppendFormat("Volume name: \"{0}\"", info_mddf.volname).AppendLine(); - sb.AppendFormat("Volume password: \"{0}\"", info_mddf.password).AppendLine(); - sb.AppendFormat("Volume ID: 0x{0:X16}", info_mddf.volid).AppendLine(); - sb.AppendFormat("Backup volume ID: 0x{0:X16}", info_mddf.backup_volid).AppendLine(); + sb.AppendFormat("Volume name: \"{0}\"", infoMddf.volname).AppendLine(); + sb.AppendFormat("Volume password: \"{0}\"", infoMddf.password).AppendLine(); + sb.AppendFormat("Volume ID: 0x{0:X16}", infoMddf.volid).AppendLine(); + sb.AppendFormat("Backup volume ID: 0x{0:X16}", infoMddf.backup_volid).AppendLine(); - sb.AppendFormat("Master copy ID: 0x{0:X8}", info_mddf.master_copy_id).AppendLine(); + sb.AppendFormat("Master copy ID: 0x{0:X8}", infoMddf.master_copy_id).AppendLine(); - sb.AppendFormat("Volume is number {0} of {1}", info_mddf.volnum, info_mddf.vol_sequence) + sb.AppendFormat("Volume is number {0} of {1}", infoMddf.volnum, infoMddf.vol_sequence) .AppendLine(); sb.AppendFormat("Serial number of Lisa computer that created this volume: {0}", - info_mddf.machine_id).AppendLine(); + infoMddf.machine_id).AppendLine(); sb.AppendFormat("Serial number of Lisa computer that can use this volume's software {0}", - info_mddf.serialization).AppendLine(); + infoMddf.serialization).AppendLine(); - sb.AppendFormat("Volume created on {0}", info_mddf.dtvc).AppendLine(); - sb.AppendFormat("Some timestamp, says {0}", info_mddf.dtcc).AppendLine(); - sb.AppendFormat("Volume backed up on {0}", info_mddf.dtvb).AppendLine(); - sb.AppendFormat("Volume scavenged on {0}", info_mddf.dtvs).AppendLine(); - sb.AppendFormat("MDDF is in block {0}", info_mddf.mddf_block + before_mddf).AppendLine(); - sb.AppendFormat("There are {0} reserved blocks before volume", before_mddf).AppendLine(); - sb.AppendFormat("{0} blocks minus one", info_mddf.volsize_minus_one).AppendLine(); - sb.AppendFormat("{0} blocks minus one minus MDDF offset", info_mddf.volsize_minus_mddf_minus_one) + sb.AppendFormat("Volume created on {0}", infoMddf.dtvc).AppendLine(); + sb.AppendFormat("Some timestamp, says {0}", infoMddf.dtcc).AppendLine(); + sb.AppendFormat("Volume backed up on {0}", infoMddf.dtvb).AppendLine(); + sb.AppendFormat("Volume scavenged on {0}", infoMddf.dtvs).AppendLine(); + sb.AppendFormat("MDDF is in block {0}", infoMddf.mddf_block + beforeMddf).AppendLine(); + sb.AppendFormat("There are {0} reserved blocks before volume", beforeMddf).AppendLine(); + sb.AppendFormat("{0} blocks minus one", infoMddf.volsize_minus_one).AppendLine(); + sb.AppendFormat("{0} blocks minus one minus MDDF offset", infoMddf.volsize_minus_mddf_minus_one) .AppendLine(); - sb.AppendFormat("{0} blocks in volume", info_mddf.vol_size).AppendLine(); - sb.AppendFormat("{0} bytes per sector (uncooked)", info_mddf.blocksize).AppendLine(); - sb.AppendFormat("{0} bytes per sector", info_mddf.datasize).AppendLine(); - sb.AppendFormat("{0} blocks per cluster", info_mddf.clustersize).AppendLine(); - sb.AppendFormat("{0} blocks in filesystem", info_mddf.fs_size).AppendLine(); - sb.AppendFormat("{0} files in volume", info_mddf.filecount).AppendLine(); - sb.AppendFormat("{0} blocks free", info_mddf.freecount).AppendLine(); - sb.AppendFormat("{0} bytes in LisaInfo", info_mddf.label_size).AppendLine(); - sb.AppendFormat("Filesystem overhead: {0}", info_mddf.fs_overhead).AppendLine(); - sb.AppendFormat("Scanvenger result code: 0x{0:X8}", info_mddf.result_scavenge).AppendLine(); - sb.AppendFormat("Boot code: 0x{0:X8}", info_mddf.boot_code).AppendLine(); - sb.AppendFormat("Boot environment: 0x{0:X8}", info_mddf.boot_environ).AppendLine(); - sb.AppendFormat("Overmount stamp: 0x{0:X16}", info_mddf.overmount_stamp).AppendLine(); + sb.AppendFormat("{0} blocks in volume", infoMddf.vol_size).AppendLine(); + sb.AppendFormat("{0} bytes per sector (uncooked)", infoMddf.blocksize).AppendLine(); + sb.AppendFormat("{0} bytes per sector", infoMddf.datasize).AppendLine(); + sb.AppendFormat("{0} blocks per cluster", infoMddf.clustersize).AppendLine(); + sb.AppendFormat("{0} blocks in filesystem", infoMddf.fs_size).AppendLine(); + sb.AppendFormat("{0} files in volume", infoMddf.filecount).AppendLine(); + sb.AppendFormat("{0} blocks free", infoMddf.freecount).AppendLine(); + sb.AppendFormat("{0} bytes in LisaInfo", infoMddf.label_size).AppendLine(); + sb.AppendFormat("Filesystem overhead: {0}", infoMddf.fs_overhead).AppendLine(); + sb.AppendFormat("Scanvenger result code: 0x{0:X8}", infoMddf.result_scavenge).AppendLine(); + sb.AppendFormat("Boot code: 0x{0:X8}", infoMddf.boot_code).AppendLine(); + sb.AppendFormat("Boot environment: 0x{0:X8}", infoMddf.boot_environ).AppendLine(); + sb.AppendFormat("Overmount stamp: 0x{0:X16}", infoMddf.overmount_stamp).AppendLine(); sb.AppendFormat("S-Records start at {0} and spans for {1} blocks", - info_mddf.srec_ptr + info_mddf.mddf_block + before_mddf, info_mddf.srec_len) + infoMddf.srec_ptr + infoMddf.mddf_block + beforeMddf, infoMddf.srec_len) .AppendLine(); - if(info_mddf.vol_left_mounted == 0) sb.AppendLine("Volume is clean"); + if(infoMddf.vol_left_mounted == 0) sb.AppendLine("Volume is clean"); else sb.AppendLine("Volume is dirty"); information = sb.ToString(); - xmlFSType = new FileSystemType(); - if(DateTime.Compare(info_mddf.dtvb, DateHandlers.LisaToDateTime(0)) > 0) + XmlFsType = new FileSystemType(); + if(DateTime.Compare(infoMddf.dtvb, DateHandlers.LisaToDateTime(0)) > 0) { - xmlFSType.BackupDate = info_mddf.dtvb; - xmlFSType.BackupDateSpecified = true; + XmlFsType.BackupDate = infoMddf.dtvb; + XmlFsType.BackupDateSpecified = true; } - xmlFSType.Clusters = info_mddf.vol_size; - xmlFSType.ClusterSize = info_mddf.clustersize * info_mddf.datasize; - if(DateTime.Compare(info_mddf.dtvc, DateHandlers.LisaToDateTime(0)) > 0) + XmlFsType.Clusters = infoMddf.vol_size; + XmlFsType.ClusterSize = infoMddf.clustersize * infoMddf.datasize; + if(DateTime.Compare(infoMddf.dtvc, DateHandlers.LisaToDateTime(0)) > 0) { - xmlFSType.CreationDate = info_mddf.dtvc; - xmlFSType.CreationDateSpecified = true; + XmlFsType.CreationDate = infoMddf.dtvc; + XmlFsType.CreationDateSpecified = true; } - xmlFSType.Dirty = info_mddf.vol_left_mounted != 0; - xmlFSType.Files = info_mddf.filecount; - xmlFSType.FilesSpecified = true; - xmlFSType.FreeClusters = info_mddf.freecount; - xmlFSType.FreeClustersSpecified = true; - xmlFSType.Type = "LisaFS"; - xmlFSType.VolumeName = info_mddf.volname; - xmlFSType.VolumeSerial = $"{info_mddf.volid:X16}"; + XmlFsType.Dirty = infoMddf.vol_left_mounted != 0; + XmlFsType.Files = infoMddf.filecount; + XmlFsType.FilesSpecified = true; + XmlFsType.FreeClusters = infoMddf.freecount; + XmlFsType.FreeClustersSpecified = true; + XmlFsType.Type = "LisaFS"; + XmlFsType.VolumeName = infoMddf.volname; + XmlFsType.VolumeSerial = $"{infoMddf.volid:X16}"; return; } diff --git a/DiscImageChef.Filesystems/LisaFS/LisaFS.cs b/DiscImageChef.Filesystems/LisaFS/LisaFS.cs index c0b9af0d5..6ac5350f9 100644 --- a/DiscImageChef.Filesystems/LisaFS/LisaFS.cs +++ b/DiscImageChef.Filesystems/LisaFS/LisaFS.cs @@ -66,20 +66,20 @@ namespace DiscImageChef.Filesystems.LisaFS /// Lists Extents Files already printed in debug mode to not repeat them List printedExtents; /// Caches the creation times for subdirectories as to not have to traverse the Catalog File on each stat - Dictionary directoryDTCCache; + Dictionary directoryDtcCache; #endregion Caches public LisaFS() { Name = "Apple Lisa File System"; - PluginUUID = new Guid("7E6034D1-D823-4248-A54D-239742B28391"); + PluginUuid = new Guid("7E6034D1-D823-4248-A54D-239742B28391"); CurrentEncoding = new LisaRoman(); } public LisaFS(Encoding encoding) { Name = "Apple Lisa File System"; - PluginUUID = new Guid("7E6034D1-D823-4248-A54D-239742B28391"); + PluginUuid = new Guid("7E6034D1-D823-4248-A54D-239742B28391"); CurrentEncoding = new LisaRoman(); } @@ -87,7 +87,7 @@ namespace DiscImageChef.Filesystems.LisaFS { device = imagePlugin; Name = "Apple Lisa File System"; - PluginUUID = new Guid("7E6034D1-D823-4248-A54D-239742B28391"); + PluginUuid = new Guid("7E6034D1-D823-4248-A54D-239742B28391"); CurrentEncoding = new LisaRoman(); } } diff --git a/DiscImageChef.Filesystems/LisaFS/Super.cs b/DiscImageChef.Filesystems/LisaFS/Super.cs index b5608e281..0ecc70f97 100644 --- a/DiscImageChef.Filesystems/LisaFS/Super.cs +++ b/DiscImageChef.Filesystems/LisaFS/Super.cs @@ -82,8 +82,7 @@ namespace DiscImageChef.Filesystems.LisaFS // LisaOS searches sectors until tag tells MDDF resides there, so we'll search 100 sectors for(ulong i = 0; i < 100; i++) { - LisaTag.PriamTag searchTag; - DecodeTag(device.ReadSectorTag(i, SectorTagType.AppleSectorTag), out searchTag); + DecodeTag(device.ReadSectorTag(i, SectorTagType.AppleSectorTag), out LisaTag.PriamTag searchTag); DicConsole.DebugWriteLine("LisaFS plugin", "Sector {0}, file ID 0x{1:X4}", i, searchTag.FileId); @@ -97,7 +96,7 @@ namespace DiscImageChef.Filesystems.LisaFS byte[] sector = device.ReadSector(i); mddf = new MDDF(); byte[] pString = new byte[33]; - uint lisa_time; + uint lisaTime; mddf.fsversion = BigEndianBitConverter.ToUInt16(sector, 0x00); mddf.volid = BigEndianBitConverter.ToUInt64(sector, 0x02); @@ -107,19 +106,18 @@ namespace DiscImageChef.Filesystems.LisaFS mddf.unknown1 = sector[0x2D]; Array.Copy(sector, 0x2E, pString, 0, 33); // Prevent garbage - if(pString[0] <= 32) mddf.password = StringHandlers.PascalToString(pString, CurrentEncoding); - else mddf.password = ""; + mddf.password = pString[0] <= 32 ? StringHandlers.PascalToString(pString, CurrentEncoding) : ""; mddf.unknown2 = sector[0x4F]; mddf.machine_id = BigEndianBitConverter.ToUInt32(sector, 0x50); mddf.master_copy_id = BigEndianBitConverter.ToUInt32(sector, 0x54); - lisa_time = BigEndianBitConverter.ToUInt32(sector, 0x58); - mddf.dtvc = DateHandlers.LisaToDateTime(lisa_time); - lisa_time = BigEndianBitConverter.ToUInt32(sector, 0x5C); - mddf.dtcc = DateHandlers.LisaToDateTime(lisa_time); - lisa_time = BigEndianBitConverter.ToUInt32(sector, 0x60); - mddf.dtvb = DateHandlers.LisaToDateTime(lisa_time); - lisa_time = BigEndianBitConverter.ToUInt32(sector, 0x64); - mddf.dtvs = DateHandlers.LisaToDateTime(lisa_time); + lisaTime = BigEndianBitConverter.ToUInt32(sector, 0x58); + mddf.dtvc = DateHandlers.LisaToDateTime(lisaTime); + lisaTime = BigEndianBitConverter.ToUInt32(sector, 0x5C); + mddf.dtcc = DateHandlers.LisaToDateTime(lisaTime); + lisaTime = BigEndianBitConverter.ToUInt32(sector, 0x60); + mddf.dtvb = DateHandlers.LisaToDateTime(lisaTime); + lisaTime = BigEndianBitConverter.ToUInt32(sector, 0x64); + mddf.dtvs = DateHandlers.LisaToDateTime(lisaTime); mddf.unknown3 = BigEndianBitConverter.ToUInt32(sector, 0x68); mddf.mddf_block = BigEndianBitConverter.ToUInt32(sector, 0x6C); mddf.volsize_minus_one = BigEndianBitConverter.ToUInt32(sector, 0x70); @@ -193,13 +191,13 @@ namespace DiscImageChef.Filesystems.LisaFS // Check MDDF version switch(mddf.fsversion) { - case LisaFSv1: + case LISA_V1: DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v1"); break; - case LisaFSv2: + case LISA_V2: DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v2"); break; - case LisaFSv3: + case LISA_V3: DicConsole.DebugWriteLine("LisaFS plugin", "Mounting LisaFS v3"); break; default: @@ -214,23 +212,20 @@ namespace DiscImageChef.Filesystems.LisaFS //catalogCache = new Dictionary>(); fileSizeCache = new Dictionary(); - Errno error; - mounted = true; this.debug = debug; if(debug) printedExtents = new List(); // Read the S-Records file - error = ReadSRecords(); + Errno error = ReadSRecords(); if(error != Errno.NoError) { DicConsole.ErrorWriteLine("Error {0} reading S-Records file.", error); return error; } - directoryDTCCache = new Dictionary(); - directoryDTCCache.Add(DIRID_ROOT, mddf.dtcc); + directoryDtcCache = new Dictionary {{DIRID_ROOT, mddf.dtcc}}; // Read the Catalog File error = ReadCatalog(); @@ -246,9 +241,7 @@ namespace DiscImageChef.Filesystems.LisaFS // If debug, cache system files if(debug) { - byte[] temp; - - error = ReadSystemFile(FILEID_BOOT_SIGNED, out temp); + error = ReadSystemFile(FILEID_BOOT_SIGNED, out _); if(error != Errno.NoError) { DicConsole.DebugWriteLine("LisaFS plugin", "Unable to read boot blocks"); @@ -256,7 +249,7 @@ namespace DiscImageChef.Filesystems.LisaFS return error; } - error = ReadSystemFile(FILEID_LOADER_SIGNED, out temp); + error = ReadSystemFile(FILEID_LOADER_SIGNED, out _); if(error != Errno.NoError) { DicConsole.DebugWriteLine("LisaFS plugin", "Unable to read boot loader"); @@ -264,7 +257,7 @@ namespace DiscImageChef.Filesystems.LisaFS return error; } - error = ReadSystemFile((short)FILEID_MDDF, out temp); + error = ReadSystemFile((short)FILEID_MDDF, out _); if(error != Errno.NoError) { DicConsole.DebugWriteLine("LisaFS plugin", "Unable to read MDDF"); @@ -272,7 +265,7 @@ namespace DiscImageChef.Filesystems.LisaFS return error; } - error = ReadSystemFile((short)FILEID_BITMAP, out temp); + error = ReadSystemFile((short)FILEID_BITMAP, out _); if(error != Errno.NoError) { DicConsole.DebugWriteLine("LisaFS plugin", "Unable to read volume bitmap"); @@ -280,7 +273,7 @@ namespace DiscImageChef.Filesystems.LisaFS return error; } - error = ReadSystemFile((short)FILEID_SRECORD, out temp); + error = ReadSystemFile((short)FILEID_SRECORD, out _); if(error != Errno.NoError) { DicConsole.DebugWriteLine("LisaFS plugin", "Unable to read S-Records file"); @@ -290,27 +283,27 @@ namespace DiscImageChef.Filesystems.LisaFS } // Create XML metadata for mounted filesystem - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); if(DateTime.Compare(mddf.dtvb, DateHandlers.LisaToDateTime(0)) > 0) { - xmlFSType.BackupDate = mddf.dtvb; - xmlFSType.BackupDateSpecified = true; + XmlFsType.BackupDate = mddf.dtvb; + XmlFsType.BackupDateSpecified = true; } - xmlFSType.Clusters = mddf.vol_size; - xmlFSType.ClusterSize = mddf.clustersize * mddf.datasize; + XmlFsType.Clusters = mddf.vol_size; + XmlFsType.ClusterSize = mddf.clustersize * mddf.datasize; if(DateTime.Compare(mddf.dtvc, DateHandlers.LisaToDateTime(0)) > 0) { - xmlFSType.CreationDate = mddf.dtvc; - xmlFSType.CreationDateSpecified = true; + XmlFsType.CreationDate = mddf.dtvc; + XmlFsType.CreationDateSpecified = true; } - xmlFSType.Dirty = mddf.vol_left_mounted != 0; - xmlFSType.Files = mddf.filecount; - xmlFSType.FilesSpecified = true; - xmlFSType.FreeClusters = mddf.freecount; - xmlFSType.FreeClustersSpecified = true; - xmlFSType.Type = "LisaFS"; - xmlFSType.VolumeName = mddf.volname; - xmlFSType.VolumeSerial = $"{mddf.volid:X16}"; + XmlFsType.Dirty = mddf.vol_left_mounted != 0; + XmlFsType.Files = mddf.filecount; + XmlFsType.FilesSpecified = true; + XmlFsType.FreeClusters = mddf.freecount; + XmlFsType.FreeClustersSpecified = true; + XmlFsType.Type = "LisaFS"; + XmlFsType.VolumeName = mddf.volname; + XmlFsType.VolumeSerial = $"{mddf.volid:X16}"; return Errno.NoError; } @@ -353,24 +346,25 @@ namespace DiscImageChef.Filesystems.LisaFS { if(!mounted) return Errno.AccessDenied; - stat = new FileSystemInfo(); - stat.Blocks = mddf.vol_size; - stat.FilenameLength = (ushort)E_NAME; - stat.Files = mddf.filecount; - stat.FreeBlocks = mddf.freecount; + stat = new FileSystemInfo + { + Blocks = mddf.vol_size, + FilenameLength = (ushort)E_NAME, + Files = mddf.filecount, + FreeBlocks = mddf.freecount, + Id = {Serial64 = mddf.volid, IsLong = true}, + PluginId = PluginUuid + }; stat.FreeFiles = FILEID_MAX - stat.Files; - stat.Id.Serial64 = mddf.volid; - stat.Id.IsLong = true; - stat.PluginId = PluginUUID; switch(mddf.fsversion) { - case LisaFSv1: + case LISA_V1: stat.Type = "LisaFS v1"; break; - case LisaFSv2: + case LISA_V2: stat.Type = "LisaFS v2"; break; - case LisaFSv3: + case LISA_V3: stat.Type = "LisaFS v3"; break; } diff --git a/DiscImageChef.Filesystems/LisaFS/Xattr.cs b/DiscImageChef.Filesystems/LisaFS/Xattr.cs index b54792f61..553ed7dfb 100644 --- a/DiscImageChef.Filesystems/LisaFS/Xattr.cs +++ b/DiscImageChef.Filesystems/LisaFS/Xattr.cs @@ -48,9 +48,7 @@ namespace DiscImageChef.Filesystems.LisaFS /// List of extended attributes, alternate data streams and forks. public override Errno ListXAttr(string path, ref List xattrs) { - short fileId; - bool isDir; - Errno error = LookupFileId(path, out fileId, out isDir); + Errno error = LookupFileId(path, out short fileId, out bool isDir); if(error != Errno.NoError) return error; return isDir ? Errno.InvalidArgument : ListXAttr(fileId, ref xattrs); @@ -65,9 +63,7 @@ namespace DiscImageChef.Filesystems.LisaFS /// Buffer. public override Errno GetXattr(string path, string xattr, ref byte[] buf) { - short fileId; - bool isDir; - Errno error = LookupFileId(path, out fileId, out isDir); + Errno error = LookupFileId(path, out short fileId, out bool isDir); if(error != Errno.NoError) return error; return isDir ? Errno.InvalidArgument : GetXattr(fileId, xattr, out buf); @@ -104,8 +100,7 @@ namespace DiscImageChef.Filesystems.LisaFS else { // Search for the file - ExtentFile file; - Errno error = ReadExtentsFile(fileId, out file); + Errno error = ReadExtentsFile(fileId, out ExtentFile file); if(error != Errno.NoError) return error; @@ -162,8 +157,7 @@ namespace DiscImageChef.Filesystems.LisaFS } // Search for the file - ExtentFile file; - Errno error = ReadExtentsFile(fileId, out file); + Errno error = ReadExtentsFile(fileId, out ExtentFile file); if(error != Errno.NoError) return error; diff --git a/DiscImageChef.Filesystems/Locus.cs b/DiscImageChef.Filesystems/Locus.cs index 4b4edb900..5df1b3ef4 100644 --- a/DiscImageChef.Filesystems/Locus.cs +++ b/DiscImageChef.Filesystems/Locus.cs @@ -32,6 +32,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; @@ -55,6 +56,8 @@ using time_t = System.Int32; namespace DiscImageChef.Filesystems { + [SuppressMessage("ReSharper", "InconsistentNaming")] + [SuppressMessage("ReSharper", "BuiltInTypeReferenceStyle")] public class Locus : Filesystem { const int NICINOD = 325; @@ -195,24 +198,22 @@ namespace DiscImageChef.Filesystems public Locus() { Name = "Locus Filesystem Plugin"; - PluginUUID = new Guid("1A70B30A-437D-479A-88E1-D0C9C1797FF4"); + PluginUuid = new Guid("1A70B30A-437D-479A-88E1-D0C9C1797FF4"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public Locus(Encoding encoding) { Name = "Locus Filesystem Plugin"; - PluginUUID = new Guid("1A70B30A-437D-479A-88E1-D0C9C1797FF4"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("1A70B30A-437D-479A-88E1-D0C9C1797FF4"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public Locus(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Locus Filesystem Plugin"; - PluginUUID = new Guid("1A70B30A-437D-479A-88E1-D0C9C1797FF4"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("1A70B30A-437D-479A-88E1-D0C9C1797FF4"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -284,12 +285,9 @@ namespace DiscImageChef.Filesystems StringBuilder sb = new StringBuilder(); - if(LocusSb.s_magic == Locus_OldMagic) sb.AppendLine("Locus filesystem (old)"); - else sb.AppendLine("Locus filesystem"); + sb.AppendLine(LocusSb.s_magic == Locus_OldMagic ? "Locus filesystem (old)" : "Locus filesystem"); - int blockSize; - if(LocusSb.s_version == LocusVersion.SB_SB4096) blockSize = 4096; - else blockSize = 1024; + int blockSize = LocusSb.s_version == LocusVersion.SB_SB4096 ? 4096 : 1024; string s_fsmnt = StringHandlers.CToString(LocusSb.s_fsmnt, CurrentEncoding); string s_fpack = StringHandlers.CToString(LocusSb.s_fpack, CurrentEncoding); @@ -345,7 +343,7 @@ namespace DiscImageChef.Filesystems information = sb.ToString(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "Locus filesystem", ClusterSize = blockSize, diff --git a/DiscImageChef.Filesystems/MicroDOS.cs b/DiscImageChef.Filesystems/MicroDOS.cs index a39439522..3efd12d68 100644 --- a/DiscImageChef.Filesystems/MicroDOS.cs +++ b/DiscImageChef.Filesystems/MicroDOS.cs @@ -44,30 +44,28 @@ namespace DiscImageChef.Filesystems // Thanks to tarlabnor for translating it public class MicroDOS : Filesystem { - const ushort magic = 0xA72E; - const ushort magic2 = 0x530C; + const ushort MAGIC = 0xA72E; + const ushort MAGIC2 = 0x530C; public MicroDOS() { Name = "MicroDOS file system"; - PluginUUID = new Guid("9F9A364A-1A27-48A3-B730-7A7122000324"); + PluginUuid = new Guid("9F9A364A-1A27-48A3-B730-7A7122000324"); CurrentEncoding = Encoding.GetEncoding("koi8-r"); } public MicroDOS(Encoding encoding) { Name = "MicroDOS file system"; - PluginUUID = new Guid("9F9A364A-1A27-48A3-B730-7A7122000324"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("koi8-r"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("9F9A364A-1A27-48A3-B730-7A7122000324"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("koi8-r"); } public MicroDOS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "MicroDOS file system"; - PluginUUID = new Guid("9F9A364A-1A27-48A3-B730-7A7122000324"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("koi8-r"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("9F9A364A-1A27-48A3-B730-7A7122000324"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("koi8-r"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -76,15 +74,13 @@ namespace DiscImageChef.Filesystems if(imagePlugin.GetSectorSize() < 512) return false; - MicroDOSBlock0 block0; - byte[] bk0 = imagePlugin.ReadSector(0 + partition.Start); GCHandle handle = GCHandle.Alloc(bk0, GCHandleType.Pinned); - block0 = (MicroDOSBlock0)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(MicroDOSBlock0)); + MicroDOSBlock0 block0 = (MicroDOSBlock0)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(MicroDOSBlock0)); handle.Free(); - return block0.label == magic && block0.mklabel == magic2; + return block0.label == MAGIC && block0.mklabel == MAGIC2; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -93,12 +89,11 @@ namespace DiscImageChef.Filesystems information = ""; StringBuilder sb = new StringBuilder(); - MicroDOSBlock0 block0; byte[] bk0 = imagePlugin.ReadSector(0 + partition.Start); GCHandle handle = GCHandle.Alloc(bk0, GCHandleType.Pinned); - block0 = (MicroDOSBlock0)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(MicroDOSBlock0)); + MicroDOSBlock0 block0 = (MicroDOSBlock0)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(MicroDOSBlock0)); handle.Free(); sb.AppendLine("MicroDOS filesystem"); @@ -108,7 +103,7 @@ namespace DiscImageChef.Filesystems sb.AppendFormat("Volume contains {0} files", block0.files).AppendLine(); sb.AppendFormat("First used block is {0}", block0.firstUsedBlock).AppendLine(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "MicroDOS", ClusterSize = 512, diff --git a/DiscImageChef.Filesystems/MinixFS.cs b/DiscImageChef.Filesystems/MinixFS.cs index b8642e84b..a388b4b78 100644 --- a/DiscImageChef.Filesystems/MinixFS.cs +++ b/DiscImageChef.Filesystems/MinixFS.cs @@ -68,24 +68,22 @@ namespace DiscImageChef.Filesystems public MinixFS() { Name = "Minix Filesystem"; - PluginUUID = new Guid("FE248C3B-B727-4AE5-A39F-79EA9A07D4B3"); + PluginUuid = new Guid("FE248C3B-B727-4AE5-A39F-79EA9A07D4B3"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public MinixFS(Encoding encoding) { Name = "Minix Filesystem"; - PluginUUID = new Guid("FE248C3B-B727-4AE5-A39F-79EA9A07D4B3"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("FE248C3B-B727-4AE5-A39F-79EA9A07D4B3"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public MinixFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Minix Filesystem"; - PluginUUID = new Guid("FE248C3B-B727-4AE5-A39F-79EA9A07D4B3"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("FE248C3B-B727-4AE5-A39F-79EA9A07D4B3"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -102,23 +100,23 @@ namespace DiscImageChef.Filesystems if(sector + partition.Start >= partition.End) return false; ushort magic; - byte[] minix_sb_sector = imagePlugin.ReadSector(sector + partition.Start); + byte[] minixSbSector = imagePlugin.ReadSector(sector + partition.Start); // Optical media if(offset > 0) { byte[] tmp = new byte[0x200]; - Array.Copy(minix_sb_sector, offset, tmp, 0, 0x200); - minix_sb_sector = tmp; + Array.Copy(minixSbSector, offset, tmp, 0, 0x200); + minixSbSector = tmp; } - magic = BitConverter.ToUInt16(minix_sb_sector, 0x010); // Here should reside magic number on Minix v1 & V2 + magic = BitConverter.ToUInt16(minixSbSector, 0x010); // Here should reside magic number on Minix v1 & V2 if(magic == MINIX_MAGIC || magic == MINIX_MAGIC2 || magic == MINIX2_MAGIC || magic == MINIX2_MAGIC2 || magic == MINIX_CIGAM || magic == MINIX_CIGAM2 || magic == MINIX2_CIGAM || magic == MINIX2_CIGAM2) return true; - magic = BitConverter.ToUInt16(minix_sb_sector, 0x018); // Here should reside magic number on Minix v3 + magic = BitConverter.ToUInt16(minixSbSector, 0x018); // Here should reside magic number on Minix v3 if(magic == MINIX_MAGIC || magic == MINIX2_MAGIC || magic == MINIX3_MAGIC || magic == MINIX_CIGAM || magic == MINIX2_CIGAM || magic == MINIX3_CIGAM) return true; @@ -146,19 +144,19 @@ namespace DiscImageChef.Filesystems int filenamesize; string minixVersion; ushort magic; - byte[] minix_sb_sector = imagePlugin.ReadSector(sector + partition.Start); + byte[] minixSbSector = imagePlugin.ReadSector(sector + partition.Start); // Optical media if(offset > 0) { byte[] tmp = new byte[0x200]; - Array.Copy(minix_sb_sector, offset, tmp, 0, 0x200); - minix_sb_sector = tmp; + Array.Copy(minixSbSector, offset, tmp, 0, 0x200); + minixSbSector = tmp; } - magic = BitConverter.ToUInt16(minix_sb_sector, 0x018); + magic = BitConverter.ToUInt16(minixSbSector, 0x018); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); bool littleEndian; @@ -172,16 +170,16 @@ namespace DiscImageChef.Filesystems case MINIX3_MAGIC: case MINIX3_CIGAM: minixVersion = "Minix v3 filesystem"; - xmlFSType.Type = "Minix v3"; + XmlFsType.Type = "Minix v3"; break; case MINIX2_MAGIC: case MINIX2_CIGAM: minixVersion = "Minix 3 v2 filesystem"; - xmlFSType.Type = "Minix 3 v2"; + XmlFsType.Type = "Minix 3 v2"; break; default: minixVersion = "Minix 3 v1 filesystem"; - xmlFSType.Type = "Minix 3 v1"; + XmlFsType.Type = "Minix 3 v1"; break; } @@ -189,7 +187,7 @@ namespace DiscImageChef.Filesystems } else { - magic = BitConverter.ToUInt16(minix_sb_sector, 0x010); + magic = BitConverter.ToUInt16(minixSbSector, 0x010); switch(magic) { @@ -197,49 +195,49 @@ namespace DiscImageChef.Filesystems filenamesize = 14; minixVersion = "Minix v1 filesystem"; littleEndian = true; - xmlFSType.Type = "Minix v1"; + XmlFsType.Type = "Minix v1"; break; case MINIX_MAGIC2: filenamesize = 30; minixVersion = "Minix v1 filesystem"; littleEndian = true; - xmlFSType.Type = "Minix v1"; + XmlFsType.Type = "Minix v1"; break; case MINIX2_MAGIC: filenamesize = 14; minixVersion = "Minix v2 filesystem"; littleEndian = true; - xmlFSType.Type = "Minix v2"; + XmlFsType.Type = "Minix v2"; break; case MINIX2_MAGIC2: filenamesize = 30; minixVersion = "Minix v2 filesystem"; littleEndian = true; - xmlFSType.Type = "Minix v2"; + XmlFsType.Type = "Minix v2"; break; case MINIX_CIGAM: filenamesize = 14; minixVersion = "Minix v1 filesystem"; littleEndian = false; - xmlFSType.Type = "Minix v1"; + XmlFsType.Type = "Minix v1"; break; case MINIX_CIGAM2: filenamesize = 30; minixVersion = "Minix v1 filesystem"; littleEndian = false; - xmlFSType.Type = "Minix v1"; + XmlFsType.Type = "Minix v1"; break; case MINIX2_CIGAM: filenamesize = 14; minixVersion = "Minix v2 filesystem"; littleEndian = false; - xmlFSType.Type = "Minix v2"; + XmlFsType.Type = "Minix v2"; break; case MINIX2_CIGAM2: filenamesize = 30; minixVersion = "Minix v2 filesystem"; littleEndian = false; - xmlFSType.Type = "Minix v2"; + XmlFsType.Type = "Minix v2"; break; default: return; } @@ -247,75 +245,73 @@ namespace DiscImageChef.Filesystems if(minix3) { - Minix3SuperBlock mnx_sb; + Minix3SuperBlock mnxSb; if(littleEndian) { - GCHandle handle = GCHandle.Alloc(minix_sb_sector, GCHandleType.Pinned); - mnx_sb = (Minix3SuperBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), + GCHandle handle = GCHandle.Alloc(minixSbSector, GCHandleType.Pinned); + mnxSb = (Minix3SuperBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(Minix3SuperBlock)); handle.Free(); } - else mnx_sb = BigEndianMarshal.ByteArrayToStructureBigEndian(minix_sb_sector); + else mnxSb = BigEndianMarshal.ByteArrayToStructureBigEndian(minixSbSector); - if(magic != MINIX3_MAGIC && magic != MINIX3_CIGAM) mnx_sb.s_blocksize = 1024; + if(magic != MINIX3_MAGIC && magic != MINIX3_CIGAM) mnxSb.s_blocksize = 1024; sb.AppendLine(minixVersion); sb.AppendFormat("{0} chars in filename", filenamesize).AppendLine(); - if(mnx_sb.s_zones > 0) // On V2 - sb.AppendFormat("{0} zones on volume ({1} bytes)", mnx_sb.s_zones, mnx_sb.s_zones * 1024) + if(mnxSb.s_zones > 0) // On V2 + sb.AppendFormat("{0} zones on volume ({1} bytes)", mnxSb.s_zones, mnxSb.s_zones * 1024) .AppendLine(); else - sb.AppendFormat("{0} zones on volume ({1} bytes)", mnx_sb.s_nzones, mnx_sb.s_nzones * 1024) + sb.AppendFormat("{0} zones on volume ({1} bytes)", mnxSb.s_nzones, mnxSb.s_nzones * 1024) .AppendLine(); - sb.AppendFormat("{0} bytes/block", mnx_sb.s_blocksize).AppendLine(); - sb.AppendFormat("{0} inodes on volume", mnx_sb.s_ninodes).AppendLine(); - sb.AppendFormat("{0} blocks on inode map ({1} bytes)", mnx_sb.s_imap_blocks, - mnx_sb.s_imap_blocks * mnx_sb.s_blocksize).AppendLine(); - sb.AppendFormat("{0} blocks on zone map ({1} bytes)", mnx_sb.s_zmap_blocks, - mnx_sb.s_zmap_blocks * mnx_sb.s_blocksize).AppendLine(); - sb.AppendFormat("First data zone: {0}", mnx_sb.s_firstdatazone).AppendLine(); + sb.AppendFormat("{0} bytes/block", mnxSb.s_blocksize).AppendLine(); + sb.AppendFormat("{0} inodes on volume", mnxSb.s_ninodes).AppendLine(); + sb.AppendFormat("{0} blocks on inode map ({1} bytes)", mnxSb.s_imap_blocks, + mnxSb.s_imap_blocks * mnxSb.s_blocksize).AppendLine(); + sb.AppendFormat("{0} blocks on zone map ({1} bytes)", mnxSb.s_zmap_blocks, + mnxSb.s_zmap_blocks * mnxSb.s_blocksize).AppendLine(); + sb.AppendFormat("First data zone: {0}", mnxSb.s_firstdatazone).AppendLine(); //sb.AppendFormat("log2 of blocks/zone: {0}", mnx_sb.s_log_zone_size).AppendLine(); // Apparently 0 - sb.AppendFormat("{0} bytes maximum per file", mnx_sb.s_max_size).AppendLine(); - sb.AppendFormat("On-disk filesystem version: {0}", mnx_sb.s_disk_version).AppendLine(); + sb.AppendFormat("{0} bytes maximum per file", mnxSb.s_max_size).AppendLine(); + sb.AppendFormat("On-disk filesystem version: {0}", mnxSb.s_disk_version).AppendLine(); - xmlFSType.ClusterSize = mnx_sb.s_blocksize; - if(mnx_sb.s_zones > 0) xmlFSType.Clusters = mnx_sb.s_zones; - else xmlFSType.Clusters = mnx_sb.s_nzones; + XmlFsType.ClusterSize = mnxSb.s_blocksize; + XmlFsType.Clusters = mnxSb.s_zones > 0 ? mnxSb.s_zones : mnxSb.s_nzones; } else { - MinixSuperBlock mnx_sb; + MinixSuperBlock mnxSb; if(littleEndian) { - GCHandle handle = GCHandle.Alloc(minix_sb_sector, GCHandleType.Pinned); - mnx_sb = (MinixSuperBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), + GCHandle handle = GCHandle.Alloc(minixSbSector, GCHandleType.Pinned); + mnxSb = (MinixSuperBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(MinixSuperBlock)); handle.Free(); } - else mnx_sb = BigEndianMarshal.ByteArrayToStructureBigEndian(minix_sb_sector); + else mnxSb = BigEndianMarshal.ByteArrayToStructureBigEndian(minixSbSector); sb.AppendLine(minixVersion); sb.AppendFormat("{0} chars in filename", filenamesize).AppendLine(); - if(mnx_sb.s_zones > 0) // On V2 - sb.AppendFormat("{0} zones on volume ({1} bytes)", mnx_sb.s_zones, mnx_sb.s_zones * 1024) + if(mnxSb.s_zones > 0) // On V2 + sb.AppendFormat("{0} zones on volume ({1} bytes)", mnxSb.s_zones, mnxSb.s_zones * 1024) .AppendLine(); else - sb.AppendFormat("{0} zones on volume ({1} bytes)", mnx_sb.s_nzones, mnx_sb.s_nzones * 1024) + sb.AppendFormat("{0} zones on volume ({1} bytes)", mnxSb.s_nzones, mnxSb.s_nzones * 1024) .AppendLine(); - sb.AppendFormat("{0} inodes on volume", mnx_sb.s_ninodes).AppendLine(); - sb.AppendFormat("{0} blocks on inode map ({1} bytes)", mnx_sb.s_imap_blocks, - mnx_sb.s_imap_blocks * 1024).AppendLine(); - sb.AppendFormat("{0} blocks on zone map ({1} bytes)", mnx_sb.s_zmap_blocks, mnx_sb.s_zmap_blocks * 1024) + sb.AppendFormat("{0} inodes on volume", mnxSb.s_ninodes).AppendLine(); + sb.AppendFormat("{0} blocks on inode map ({1} bytes)", mnxSb.s_imap_blocks, + mnxSb.s_imap_blocks * 1024).AppendLine(); + sb.AppendFormat("{0} blocks on zone map ({1} bytes)", mnxSb.s_zmap_blocks, mnxSb.s_zmap_blocks * 1024) .AppendLine(); - sb.AppendFormat("First data zone: {0}", mnx_sb.s_firstdatazone).AppendLine(); + sb.AppendFormat("First data zone: {0}", mnxSb.s_firstdatazone).AppendLine(); //sb.AppendFormat("log2 of blocks/zone: {0}", mnx_sb.s_log_zone_size).AppendLine(); // Apparently 0 - sb.AppendFormat("{0} bytes maximum per file", mnx_sb.s_max_size).AppendLine(); - sb.AppendFormat("Filesystem state: {0:X4}", mnx_sb.s_state).AppendLine(); - xmlFSType.ClusterSize = 1024; - if(mnx_sb.s_zones > 0) xmlFSType.Clusters = mnx_sb.s_zones; - else xmlFSType.Clusters = mnx_sb.s_nzones; + sb.AppendFormat("{0} bytes maximum per file", mnxSb.s_max_size).AppendLine(); + sb.AppendFormat("Filesystem state: {0:X4}", mnxSb.s_state).AppendLine(); + XmlFsType.ClusterSize = 1024; + XmlFsType.Clusters = mnxSb.s_zones > 0 ? mnxSb.s_zones : mnxSb.s_nzones; } information = sb.ToString(); } diff --git a/DiscImageChef.Filesystems/NILFS2.cs b/DiscImageChef.Filesystems/NILFS2.cs index eb4b9e985..d0bcb7394 100644 --- a/DiscImageChef.Filesystems/NILFS2.cs +++ b/DiscImageChef.Filesystems/NILFS2.cs @@ -95,37 +95,35 @@ namespace DiscImageChef.Filesystems public ulong feature_incompat; } - const ushort NILFS2_Magic = 0x3434; - const uint NILFS2_SuperOffset = 1024; + const ushort NILFS2_MAGIC = 0x3434; + const uint NILFS2_SUPER_OFFSET = 1024; public NILFS2() { Name = "NILFS2 Plugin"; - PluginUUID = new Guid("35224226-C5CC-48B5-8FFD-3781E91E86B6"); + PluginUuid = new Guid("35224226-C5CC-48B5-8FFD-3781E91E86B6"); CurrentEncoding = Encoding.UTF8; } public NILFS2(Encoding encoding) { Name = "NILFS2 Plugin"; - PluginUUID = new Guid("35224226-C5CC-48B5-8FFD-3781E91E86B6"); - if(encoding == null) CurrentEncoding = Encoding.UTF8; - else CurrentEncoding = encoding; + PluginUuid = new Guid("35224226-C5CC-48B5-8FFD-3781E91E86B6"); + CurrentEncoding = encoding ?? Encoding.UTF8; } public NILFS2(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "NILFS2 Plugin"; - PluginUUID = new Guid("35224226-C5CC-48B5-8FFD-3781E91E86B6"); - if(encoding == null) CurrentEncoding = Encoding.UTF8; - else CurrentEncoding = encoding; + PluginUuid = new Guid("35224226-C5CC-48B5-8FFD-3781E91E86B6"); + CurrentEncoding = encoding ?? Encoding.UTF8; } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { if(imagePlugin.GetSectorSize() < 512) return false; - uint sbAddr = NILFS2_SuperOffset / imagePlugin.GetSectorSize(); + uint sbAddr = NILFS2_SUPER_OFFSET / imagePlugin.GetSectorSize(); if(sbAddr == 0) sbAddr = 1; NILFS2_Superblock nilfsSb = new NILFS2_Superblock(); @@ -143,7 +141,7 @@ namespace DiscImageChef.Filesystems nilfsSb = (NILFS2_Superblock)Marshal.PtrToStructure(sbPtr, typeof(NILFS2_Superblock)); Marshal.FreeHGlobal(sbPtr); - return nilfsSb.magic == NILFS2_Magic; + return nilfsSb.magic == NILFS2_MAGIC; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -152,7 +150,7 @@ namespace DiscImageChef.Filesystems information = ""; if(imagePlugin.GetSectorSize() < 512) return; - uint sbAddr = NILFS2_SuperOffset / imagePlugin.GetSectorSize(); + uint sbAddr = NILFS2_SUPER_OFFSET / imagePlugin.GetSectorSize(); if(sbAddr == 0) sbAddr = 1; NILFS2_Superblock nilfsSb = new NILFS2_Superblock(); @@ -168,7 +166,7 @@ namespace DiscImageChef.Filesystems nilfsSb = (NILFS2_Superblock)Marshal.PtrToStructure(sbPtr, typeof(NILFS2_Superblock)); Marshal.FreeHGlobal(sbPtr); - if(nilfsSb.magic != NILFS2_Magic) return; + if(nilfsSb.magic != NILFS2_MAGIC) return; StringBuilder sb = new StringBuilder(); @@ -192,17 +190,19 @@ namespace DiscImageChef.Filesystems information = sb.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "NILFS2 filesystem"; - if(nilfsSb.creator_os == 0) xmlFSType.SystemIdentifier = "Linux"; - xmlFSType.ClusterSize = 1 << (int)(nilfsSb.log_block_size + 10); - xmlFSType.Clusters = (long)nilfsSb.dev_size / xmlFSType.ClusterSize; - xmlFSType.VolumeName = StringHandlers.CToString(nilfsSb.volume_name, CurrentEncoding); - xmlFSType.VolumeSerial = nilfsSb.uuid.ToString(); - xmlFSType.CreationDate = DateHandlers.UNIXUnsignedToDateTime(nilfsSb.ctime); - xmlFSType.CreationDateSpecified = true; - xmlFSType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(nilfsSb.wtime); - xmlFSType.ModificationDateSpecified = true; + XmlFsType = new FileSystemType + { + Type = "NILFS2 filesystem", + ClusterSize = 1 << (int)(nilfsSb.log_block_size + 10), + VolumeName = StringHandlers.CToString(nilfsSb.volume_name, CurrentEncoding), + VolumeSerial = nilfsSb.uuid.ToString(), + CreationDate = DateHandlers.UNIXUnsignedToDateTime(nilfsSb.ctime), + CreationDateSpecified = true, + ModificationDate = DateHandlers.UNIXUnsignedToDateTime(nilfsSb.wtime), + ModificationDateSpecified = true + }; + if(nilfsSb.creator_os == 0) XmlFsType.SystemIdentifier = "Linux"; + XmlFsType.Clusters = (long)nilfsSb.dev_size / XmlFsType.ClusterSize; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/NTFS.cs b/DiscImageChef.Filesystems/NTFS.cs index 3cad39bab..69694169f 100644 --- a/DiscImageChef.Filesystems/NTFS.cs +++ b/DiscImageChef.Filesystems/NTFS.cs @@ -47,21 +47,21 @@ namespace DiscImageChef.Filesystems public NTFS() { Name = "New Technology File System (NTFS)"; - PluginUUID = new Guid("33513B2C-1e6d-4d21-a660-0bbc789c3871"); + PluginUuid = new Guid("33513B2C-1e6d-4d21-a660-0bbc789c3871"); CurrentEncoding = Encoding.Unicode; } public NTFS(Encoding encoding) { Name = "New Technology File System (NTFS)"; - PluginUUID = new Guid("33513B2C-1e6d-4d21-a660-0bbc789c3871"); + PluginUuid = new Guid("33513B2C-1e6d-4d21-a660-0bbc789c3871"); CurrentEncoding = Encoding.Unicode; } public NTFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "New Technology File System (NTFS)"; - PluginUUID = new Guid("33513B2C-1e6d-4d21-a660-0bbc789c3871"); + PluginUuid = new Guid("33513B2C-1e6d-4d21-a660-0bbc789c3871"); CurrentEncoding = Encoding.Unicode; } @@ -69,27 +69,26 @@ namespace DiscImageChef.Filesystems { if(2 + partition.Start >= partition.End) return false; - byte[] eigth_bytes = new byte[8]; - byte fats_no; - ushort spfat, signature; - string oem_name; + byte[] eigthBytes = new byte[8]; + byte fatsNo; + ushort spFat, signature; - byte[] ntfs_bpb = imagePlugin.ReadSector(0 + partition.Start); + byte[] ntfsBpb = imagePlugin.ReadSector(0 + partition.Start); - Array.Copy(ntfs_bpb, 0x003, eigth_bytes, 0, 8); - oem_name = StringHandlers.CToString(eigth_bytes); + Array.Copy(ntfsBpb, 0x003, eigthBytes, 0, 8); + string oemName = StringHandlers.CToString(eigthBytes); - if(oem_name != "NTFS ") return false; + if(oemName != "NTFS ") return false; - fats_no = ntfs_bpb[0x010]; + fatsNo = ntfsBpb[0x010]; - if(fats_no != 0) return false; + if(fatsNo != 0) return false; - spfat = BitConverter.ToUInt16(ntfs_bpb, 0x016); + spFat = BitConverter.ToUInt16(ntfsBpb, 0x016); - if(spfat != 0) return false; + if(spFat != 0) return false; - signature = BitConverter.ToUInt16(ntfs_bpb, 0x1FE); + signature = BitConverter.ToUInt16(ntfsBpb, 0x1FE); return signature == 0xAA55; } @@ -101,63 +100,62 @@ namespace DiscImageChef.Filesystems StringBuilder sb = new StringBuilder(); - byte[] ntfs_bpb = imagePlugin.ReadSector(0 + partition.Start); + byte[] ntfsBpb = imagePlugin.ReadSector(0 + partition.Start); - NTFS_BootBlock ntfs_bb; IntPtr bpbPtr = Marshal.AllocHGlobal(512); - Marshal.Copy(ntfs_bpb, 0, bpbPtr, 512); - ntfs_bb = (NTFS_BootBlock)Marshal.PtrToStructure(bpbPtr, typeof(NTFS_BootBlock)); + Marshal.Copy(ntfsBpb, 0, bpbPtr, 512); + NtfsBootBlock ntfsBb = (NtfsBootBlock)Marshal.PtrToStructure(bpbPtr, typeof(NtfsBootBlock)); Marshal.FreeHGlobal(bpbPtr); - sb.AppendFormat("{0} bytes per sector", ntfs_bb.bps).AppendLine(); - sb.AppendFormat("{0} sectors per cluster ({1} bytes)", ntfs_bb.spc, ntfs_bb.spc * ntfs_bb.bps).AppendLine(); + sb.AppendFormat("{0} bytes per sector", ntfsBb.bps).AppendLine(); + sb.AppendFormat("{0} sectors per cluster ({1} bytes)", ntfsBb.spc, ntfsBb.spc * ntfsBb.bps).AppendLine(); // sb.AppendFormat("{0} reserved sectors", ntfs_bb.rsectors).AppendLine(); // sb.AppendFormat("{0} FATs", ntfs_bb.fats_no).AppendLine(); // sb.AppendFormat("{0} entries in the root folder", ntfs_bb.root_ent).AppendLine(); // sb.AppendFormat("{0} sectors on volume (small)", ntfs_bb.sml_sectors).AppendLine(); - sb.AppendFormat("Media descriptor: 0x{0:X2}", ntfs_bb.media).AppendLine(); + sb.AppendFormat("Media descriptor: 0x{0:X2}", ntfsBb.media).AppendLine(); // sb.AppendFormat("{0} sectors per FAT", ntfs_bb.spfat).AppendLine(); - sb.AppendFormat("{0} sectors per track", ntfs_bb.sptrk).AppendLine(); - sb.AppendFormat("{0} heads", ntfs_bb.heads).AppendLine(); - sb.AppendFormat("{0} hidden sectors before filesystem", ntfs_bb.hsectors).AppendLine(); + sb.AppendFormat("{0} sectors per track", ntfsBb.sptrk).AppendLine(); + sb.AppendFormat("{0} heads", ntfsBb.heads).AppendLine(); + sb.AppendFormat("{0} hidden sectors before filesystem", ntfsBb.hsectors).AppendLine(); // sb.AppendFormat("{0} sectors on volume (big)", ntfs_bb.big_sectors).AppendLine(); - sb.AppendFormat("BIOS drive number: 0x{0:X2}", ntfs_bb.drive_no).AppendLine(); + sb.AppendFormat("BIOS drive number: 0x{0:X2}", ntfsBb.drive_no).AppendLine(); // sb.AppendFormat("NT flags: 0x{0:X2}", ntfs_bb.nt_flags).AppendLine(); // sb.AppendFormat("Signature 1: 0x{0:X2}", ntfs_bb.signature1).AppendLine(); - sb.AppendFormat("{0} sectors on volume ({1} bytes)", ntfs_bb.sectors, ntfs_bb.sectors * ntfs_bb.bps) + sb.AppendFormat("{0} sectors on volume ({1} bytes)", ntfsBb.sectors, ntfsBb.sectors * ntfsBb.bps) .AppendLine(); - sb.AppendFormat("Cluster where $MFT starts: {0}", ntfs_bb.mft_lsn).AppendLine(); - sb.AppendFormat("Cluster where $MFTMirr starts: {0}", ntfs_bb.mftmirror_lsn).AppendLine(); + sb.AppendFormat("Cluster where $MFT starts: {0}", ntfsBb.mft_lsn).AppendLine(); + sb.AppendFormat("Cluster where $MFTMirr starts: {0}", ntfsBb.mftmirror_lsn).AppendLine(); - if(ntfs_bb.mft_rc_clusters > 0) - sb.AppendFormat("{0} clusters per MFT record ({1} bytes)", ntfs_bb.mft_rc_clusters, - ntfs_bb.mft_rc_clusters * ntfs_bb.bps * ntfs_bb.spc).AppendLine(); - else sb.AppendFormat("{0} bytes per MFT record", 1 << -ntfs_bb.mft_rc_clusters).AppendLine(); - if(ntfs_bb.index_blk_cts > 0) - sb.AppendFormat("{0} clusters per Index block ({1} bytes)", ntfs_bb.index_blk_cts, - ntfs_bb.index_blk_cts * ntfs_bb.bps * ntfs_bb.spc).AppendLine(); - else sb.AppendFormat("{0} bytes per Index block", 1 << -ntfs_bb.index_blk_cts).AppendLine(); + if(ntfsBb.mft_rc_clusters > 0) + sb.AppendFormat("{0} clusters per MFT record ({1} bytes)", ntfsBb.mft_rc_clusters, + ntfsBb.mft_rc_clusters * ntfsBb.bps * ntfsBb.spc).AppendLine(); + else sb.AppendFormat("{0} bytes per MFT record", 1 << -ntfsBb.mft_rc_clusters).AppendLine(); + if(ntfsBb.index_blk_cts > 0) + sb.AppendFormat("{0} clusters per Index block ({1} bytes)", ntfsBb.index_blk_cts, + ntfsBb.index_blk_cts * ntfsBb.bps * ntfsBb.spc).AppendLine(); + else sb.AppendFormat("{0} bytes per Index block", 1 << -ntfsBb.index_blk_cts).AppendLine(); - sb.AppendFormat("Volume serial number: {0:X16}", ntfs_bb.serial_no).AppendLine(); + sb.AppendFormat("Volume serial number: {0:X16}", ntfsBb.serial_no).AppendLine(); // sb.AppendFormat("Signature 2: 0x{0:X4}", ntfs_bb.signature2).AppendLine(); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); - if(ntfs_bb.jump[0] == 0xEB && ntfs_bb.jump[1] > 0x4E && ntfs_bb.jump[1] < 0x80 && - ntfs_bb.signature2 == 0xAA55) + if(ntfsBb.jump[0] == 0xEB && ntfsBb.jump[1] > 0x4E && ntfsBb.jump[1] < 0x80 && + ntfsBb.signature2 == 0xAA55) { - xmlFSType.Bootable = true; + XmlFsType.Bootable = true; Sha1Context sha1Ctx = new Sha1Context(); sha1Ctx.Init(); - string bootChk = sha1Ctx.Data(ntfs_bb.boot_code, out byte[] sha1_out); + string bootChk = sha1Ctx.Data(ntfsBb.boot_code, out _); sb.AppendLine("Volume is bootable"); sb.AppendFormat("Boot code's SHA1: {0}", bootChk).AppendLine(); } - xmlFSType.ClusterSize = ntfs_bb.spc * ntfs_bb.bps; - xmlFSType.Clusters = ntfs_bb.sectors / ntfs_bb.spc; - xmlFSType.VolumeSerial = $"{ntfs_bb.serial_no:X16}"; - xmlFSType.Type = "NTFS"; + XmlFsType.ClusterSize = ntfsBb.spc * ntfsBb.bps; + XmlFsType.Clusters = ntfsBb.sectors / ntfsBb.spc; + XmlFsType.VolumeSerial = $"{ntfsBb.serial_no:X16}"; + XmlFsType.Type = "NTFS"; information = sb.ToString(); } @@ -166,7 +164,7 @@ namespace DiscImageChef.Filesystems /// NTFS $BOOT /// [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct NTFS_BootBlock + struct NtfsBootBlock { // Start of BIOS Parameter Block /// 0x000, Jump to boot code diff --git a/DiscImageChef.Filesystems/Nintendo.cs b/DiscImageChef.Filesystems/Nintendo.cs index fd680241b..ba013802c 100644 --- a/DiscImageChef.Filesystems/Nintendo.cs +++ b/DiscImageChef.Filesystems/Nintendo.cs @@ -45,24 +45,22 @@ namespace DiscImageChef.Filesystems public NintendoPlugin() { Name = "Nintendo optical filesystems"; - PluginUUID = new Guid("4675fcb4-4418-4288-9e4a-33d6a4ac1126"); + PluginUuid = new Guid("4675fcb4-4418-4288-9e4a-33d6a4ac1126"); CurrentEncoding = Encoding.GetEncoding("shift_jis"); } public NintendoPlugin(Encoding encoding) { Name = "Nintendo optical filesystems"; - PluginUUID = new Guid("4675fcb4-4418-4288-9e4a-33d6a4ac1126"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("shift_jis"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("4675fcb4-4418-4288-9e4a-33d6a4ac1126"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("shift_jis"); } public NintendoPlugin(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Nintendo optical filesystems"; - PluginUUID = new Guid("4675fcb4-4418-4288-9e4a-33d6a4ac1126"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("shift_jis"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("4675fcb4-4418-4288-9e4a-33d6a4ac1126"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("shift_jis"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -75,12 +73,10 @@ namespace DiscImageChef.Filesystems byte[] header = imagePlugin.ReadSectors(0, 0x50000 / imagePlugin.GetSectorSize()); - uint magicGC = BigEndianBitConverter.ToUInt32(header, 0x1C); + uint magicGc = BigEndianBitConverter.ToUInt32(header, 0x1C); uint magicWii = BigEndianBitConverter.ToUInt32(header, 0x18); - if(magicGC == 0xC2339F3D || magicWii == 0x5D1C9EA3) return true; - - return false; + return magicGc == 0xC2339F3D || magicWii == 0x5D1C9EA3; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -88,7 +84,7 @@ namespace DiscImageChef.Filesystems { StringBuilder sbInformation = new StringBuilder(); information = ""; - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); NintendoFields fields = new NintendoFields(); BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; @@ -97,35 +93,35 @@ namespace DiscImageChef.Filesystems bool wii = false; - uint magicGC = BigEndianBitConverter.ToUInt32(header, 0x1C); + uint magicGc = BigEndianBitConverter.ToUInt32(header, 0x1C); uint magicWii = BigEndianBitConverter.ToUInt32(header, 0x18); if(magicWii == 0x5D1C9EA3) wii = true; - else if(magicGC != 0xC2339F3D) + else if(magicGc != 0xC2339F3D) return; - fields.discType = Encoding.ASCII.GetString(header, 0, 1); - fields.gameCode = Encoding.ASCII.GetString(header, 1, 2); - fields.regionCode = Encoding.ASCII.GetString(header, 3, 1); - fields.publisherCode = Encoding.ASCII.GetString(header, 4, 2); - fields.discID = Encoding.ASCII.GetString(header, 0, 6); - fields.discNumber = header[6]; - fields.discVersion = header[7]; - fields.streaming |= header[8] > 0; - fields.streamBufferSize = header[9]; + fields.DiscType = Encoding.ASCII.GetString(header, 0, 1); + fields.GameCode = Encoding.ASCII.GetString(header, 1, 2); + fields.RegionCode = Encoding.ASCII.GetString(header, 3, 1); + fields.PublisherCode = Encoding.ASCII.GetString(header, 4, 2); + fields.DiscId = Encoding.ASCII.GetString(header, 0, 6); + fields.DiscNumber = header[6]; + fields.DiscVersion = header[7]; + fields.Streaming |= header[8] > 0; + fields.StreamBufferSize = header[9]; byte[] temp = new byte[64]; Array.Copy(header, 0x20, temp, 0, 64); - fields.title = StringHandlers.CToString(temp, CurrentEncoding); + fields.Title = StringHandlers.CToString(temp, CurrentEncoding); if(!wii) { - fields.debugOff = BigEndianBitConverter.ToUInt32(header, 0x0400); - fields.debugAddr = BigEndianBitConverter.ToUInt32(header, 0x0404); - fields.dolOff = BigEndianBitConverter.ToUInt32(header, 0x0420); - fields.fstOff = BigEndianBitConverter.ToUInt32(header, 0x0424); - fields.fstSize = BigEndianBitConverter.ToUInt32(header, 0x0428); - fields.fstMax = BigEndianBitConverter.ToUInt32(header, 0x042C); + fields.DebugOff = BigEndianBitConverter.ToUInt32(header, 0x0400); + fields.DebugAddr = BigEndianBitConverter.ToUInt32(header, 0x0404); + fields.DolOff = BigEndianBitConverter.ToUInt32(header, 0x0420); + fields.FstOff = BigEndianBitConverter.ToUInt32(header, 0x0424); + fields.FstSize = BigEndianBitConverter.ToUInt32(header, 0x0428); + fields.FstMax = BigEndianBitConverter.ToUInt32(header, 0x042C); } if(wii) @@ -136,231 +132,229 @@ namespace DiscImageChef.Filesystems offset3 = BigEndianBitConverter.ToUInt32(header, 0x40014) << 2; offset4 = BigEndianBitConverter.ToUInt32(header, 0x4001C) << 2; - fields.firstPartitions = new NintendoPartition[BigEndianBitConverter.ToUInt32(header, 0x40000)]; - fields.secondPartitions = new NintendoPartition[BigEndianBitConverter.ToUInt32(header, 0x40008)]; - fields.thirdPartitions = new NintendoPartition[BigEndianBitConverter.ToUInt32(header, 0x40010)]; - fields.fourthPartitions = new NintendoPartition[BigEndianBitConverter.ToUInt32(header, 0x40018)]; + fields.FirstPartitions = new NintendoPartition[BigEndianBitConverter.ToUInt32(header, 0x40000)]; + fields.SecondPartitions = new NintendoPartition[BigEndianBitConverter.ToUInt32(header, 0x40008)]; + fields.ThirdPartitions = new NintendoPartition[BigEndianBitConverter.ToUInt32(header, 0x40010)]; + fields.FourthPartitions = new NintendoPartition[BigEndianBitConverter.ToUInt32(header, 0x40018)]; - for(int i = 0; i < fields.firstPartitions.Length; i++) + for(int i = 0; i < fields.FirstPartitions.Length; i++) if(offset1 + i * 8 + 8 < 0x50000) { - fields.firstPartitions[i].offset = + fields.FirstPartitions[i].Offset = BigEndianBitConverter.ToUInt32(header, (int)(offset1 + i * 8 + 0)) << 2; - fields.firstPartitions[i].type = + fields.FirstPartitions[i].Type = BigEndianBitConverter.ToUInt32(header, (int)(offset1 + i * 8 + 4)); } - for(int i = 0; i < fields.secondPartitions.Length; i++) + for(int i = 0; i < fields.SecondPartitions.Length; i++) if(offset1 + i * 8 + 8 < 0x50000) { - fields.firstPartitions[i].offset = + fields.FirstPartitions[i].Offset = BigEndianBitConverter.ToUInt32(header, (int)(offset2 + i * 8 + 0)) << 2; - fields.firstPartitions[i].type = + fields.FirstPartitions[i].Type = BigEndianBitConverter.ToUInt32(header, (int)(offset2 + i * 8 + 4)); } - for(int i = 0; i < fields.thirdPartitions.Length; i++) + for(int i = 0; i < fields.ThirdPartitions.Length; i++) if(offset1 + i * 8 + 8 < 0x50000) { - fields.firstPartitions[i].offset = + fields.FirstPartitions[i].Offset = BigEndianBitConverter.ToUInt32(header, (int)(offset3 + i * 8 + 0)) << 2; - fields.firstPartitions[i].type = + fields.FirstPartitions[i].Type = BigEndianBitConverter.ToUInt32(header, (int)(offset3 + i * 8 + 4)); } - for(int i = 0; i < fields.fourthPartitions.Length; i++) + for(int i = 0; i < fields.FourthPartitions.Length; i++) if(offset1 + i * 8 + 8 < 0x50000) { - fields.firstPartitions[i].offset = + fields.FirstPartitions[i].Offset = BigEndianBitConverter.ToUInt32(header, (int)(offset4 + i * 8 + 0)) << 2; - fields.firstPartitions[i].type = + fields.FirstPartitions[i].Type = BigEndianBitConverter.ToUInt32(header, (int)(offset4 + i * 8 + 4)); } - fields.region = header[0x4E000]; - fields.japanAge = header[0x4E010]; - fields.usaAge = header[0x4E011]; - fields.germanAge = header[0x4E013]; - fields.pegiAge = header[0x4E014]; - fields.finlandAge = header[0x4E015]; - fields.portugalAge = header[0x4E016]; - fields.ukAge = header[0x4E017]; - fields.australiaAge = header[0x4E018]; - fields.koreaAge = header[0x4E019]; + fields.Region = header[0x4E000]; + fields.JapanAge = header[0x4E010]; + fields.UsaAge = header[0x4E011]; + fields.GermanAge = header[0x4E013]; + fields.PegiAge = header[0x4E014]; + fields.FinlandAge = header[0x4E015]; + fields.PortugalAge = header[0x4E016]; + fields.UkAge = header[0x4E017]; + fields.AustraliaAge = header[0x4E018]; + fields.KoreaAge = header[0x4E019]; } else { - fields.firstPartitions = new NintendoPartition[0]; - fields.secondPartitions = new NintendoPartition[0]; - fields.thirdPartitions = new NintendoPartition[0]; - fields.fourthPartitions = new NintendoPartition[0]; + fields.FirstPartitions = new NintendoPartition[0]; + fields.SecondPartitions = new NintendoPartition[0]; + fields.ThirdPartitions = new NintendoPartition[0]; + fields.FourthPartitions = new NintendoPartition[0]; } - DicConsole.DebugWriteLine("Nintendo plugin", "discType = {0}", fields.discType); - DicConsole.DebugWriteLine("Nintendo plugin", "gameCode = {0}", fields.gameCode); - DicConsole.DebugWriteLine("Nintendo plugin", "regionCode = {0}", fields.regionCode); - DicConsole.DebugWriteLine("Nintendo plugin", "publisherCode = {0}", fields.publisherCode); - DicConsole.DebugWriteLine("Nintendo plugin", "discID = {0}", fields.discID); - DicConsole.DebugWriteLine("Nintendo plugin", "discNumber = {0}", fields.discNumber); - DicConsole.DebugWriteLine("Nintendo plugin", "discVersion = {0}", fields.discVersion); - DicConsole.DebugWriteLine("Nintendo plugin", "streaming = {0}", fields.streaming); - DicConsole.DebugWriteLine("Nintendo plugin", "streamBufferSize = {0}", fields.streamBufferSize); - DicConsole.DebugWriteLine("Nintendo plugin", "title = \"{0}\"", fields.title); - DicConsole.DebugWriteLine("Nintendo plugin", "debugOff = 0x{0:X8}", fields.debugOff); - DicConsole.DebugWriteLine("Nintendo plugin", "debugAddr = 0x{0:X8}", fields.debugAddr); - DicConsole.DebugWriteLine("Nintendo plugin", "dolOff = 0x{0:X8}", fields.dolOff); - DicConsole.DebugWriteLine("Nintendo plugin", "fstOff = 0x{0:X8}", fields.fstOff); - DicConsole.DebugWriteLine("Nintendo plugin", "fstSize = {0}", fields.fstSize); - DicConsole.DebugWriteLine("Nintendo plugin", "fstMax = {0}", fields.fstMax); - for(int i = 0; i < fields.firstPartitions.Length; i++) + DicConsole.DebugWriteLine("Nintendo plugin", "discType = {0}", fields.DiscType); + DicConsole.DebugWriteLine("Nintendo plugin", "gameCode = {0}", fields.GameCode); + DicConsole.DebugWriteLine("Nintendo plugin", "regionCode = {0}", fields.RegionCode); + DicConsole.DebugWriteLine("Nintendo plugin", "publisherCode = {0}", fields.PublisherCode); + DicConsole.DebugWriteLine("Nintendo plugin", "discID = {0}", fields.DiscId); + DicConsole.DebugWriteLine("Nintendo plugin", "discNumber = {0}", fields.DiscNumber); + DicConsole.DebugWriteLine("Nintendo plugin", "discVersion = {0}", fields.DiscVersion); + DicConsole.DebugWriteLine("Nintendo plugin", "streaming = {0}", fields.Streaming); + DicConsole.DebugWriteLine("Nintendo plugin", "streamBufferSize = {0}", fields.StreamBufferSize); + DicConsole.DebugWriteLine("Nintendo plugin", "title = \"{0}\"", fields.Title); + DicConsole.DebugWriteLine("Nintendo plugin", "debugOff = 0x{0:X8}", fields.DebugOff); + DicConsole.DebugWriteLine("Nintendo plugin", "debugAddr = 0x{0:X8}", fields.DebugAddr); + DicConsole.DebugWriteLine("Nintendo plugin", "dolOff = 0x{0:X8}", fields.DolOff); + DicConsole.DebugWriteLine("Nintendo plugin", "fstOff = 0x{0:X8}", fields.FstOff); + DicConsole.DebugWriteLine("Nintendo plugin", "fstSize = {0}", fields.FstSize); + DicConsole.DebugWriteLine("Nintendo plugin", "fstMax = {0}", fields.FstMax); + for(int i = 0; i < fields.FirstPartitions.Length; i++) { DicConsole.DebugWriteLine("Nintendo plugin", "firstPartitions[{1}].offset = {0}", - fields.firstPartitions[i].offset, i); + fields.FirstPartitions[i].Offset, i); DicConsole.DebugWriteLine("Nintendo plugin", "firstPartitions[{1}].type = {0}", - fields.firstPartitions[i].type, i); + fields.FirstPartitions[i].Type, i); } - for(int i = 0; i < fields.secondPartitions.Length; i++) + for(int i = 0; i < fields.SecondPartitions.Length; i++) { DicConsole.DebugWriteLine("Nintendo plugin", "secondPartitions[{1}].offset = {0}", - fields.secondPartitions[i].offset, i); + fields.SecondPartitions[i].Offset, i); DicConsole.DebugWriteLine("Nintendo plugin", "secondPartitions[{1}].type = {0}", - fields.secondPartitions[i].type, i); + fields.SecondPartitions[i].Type, i); } - for(int i = 0; i < fields.thirdPartitions.Length; i++) + for(int i = 0; i < fields.ThirdPartitions.Length; i++) { DicConsole.DebugWriteLine("Nintendo plugin", "thirdPartitions[{1}].offset = {0}", - fields.thirdPartitions[i].offset, i); + fields.ThirdPartitions[i].Offset, i); DicConsole.DebugWriteLine("Nintendo plugin", "thirdPartitions[{1}].type = {0}", - fields.thirdPartitions[i].type, i); + fields.ThirdPartitions[i].Type, i); } - for(int i = 0; i < fields.fourthPartitions.Length; i++) + for(int i = 0; i < fields.FourthPartitions.Length; i++) { DicConsole.DebugWriteLine("Nintendo plugin", "fourthPartitions[{1}].offset = {0}", - fields.fourthPartitions[i].offset, i); + fields.FourthPartitions[i].Offset, i); DicConsole.DebugWriteLine("Nintendo plugin", "fourthPartitions[{1}].type = {0}", - fields.fourthPartitions[i].type, i); + fields.FourthPartitions[i].Type, i); } - DicConsole.DebugWriteLine("Nintendo plugin", "region = {0}", fields.region); - DicConsole.DebugWriteLine("Nintendo plugin", "japanAge = {0}", fields.japanAge); - DicConsole.DebugWriteLine("Nintendo plugin", "usaAge = {0}", fields.usaAge); - DicConsole.DebugWriteLine("Nintendo plugin", "germanAge = {0}", fields.germanAge); - DicConsole.DebugWriteLine("Nintendo plugin", "pegiAge = {0}", fields.pegiAge); - DicConsole.DebugWriteLine("Nintendo plugin", "finlandAge = {0}", fields.finlandAge); - DicConsole.DebugWriteLine("Nintendo plugin", "portugalAge = {0}", fields.portugalAge); - DicConsole.DebugWriteLine("Nintendo plugin", "ukAge = {0}", fields.ukAge); - DicConsole.DebugWriteLine("Nintendo plugin", "australiaAge = {0}", fields.australiaAge); - DicConsole.DebugWriteLine("Nintendo plugin", "koreaAge = {0}", fields.koreaAge); + DicConsole.DebugWriteLine("Nintendo plugin", "region = {0}", fields.Region); + DicConsole.DebugWriteLine("Nintendo plugin", "japanAge = {0}", fields.JapanAge); + DicConsole.DebugWriteLine("Nintendo plugin", "usaAge = {0}", fields.UsaAge); + DicConsole.DebugWriteLine("Nintendo plugin", "germanAge = {0}", fields.GermanAge); + DicConsole.DebugWriteLine("Nintendo plugin", "pegiAge = {0}", fields.PegiAge); + DicConsole.DebugWriteLine("Nintendo plugin", "finlandAge = {0}", fields.FinlandAge); + DicConsole.DebugWriteLine("Nintendo plugin", "portugalAge = {0}", fields.PortugalAge); + DicConsole.DebugWriteLine("Nintendo plugin", "ukAge = {0}", fields.UkAge); + DicConsole.DebugWriteLine("Nintendo plugin", "australiaAge = {0}", fields.AustraliaAge); + DicConsole.DebugWriteLine("Nintendo plugin", "koreaAge = {0}", fields.KoreaAge); sbInformation.AppendLine("Nintendo optical filesystem"); - if(wii) sbInformation.AppendLine("Nintendo Wii Optical Disc"); - else sbInformation.AppendLine("Nintendo GameCube Optical Disc"); - sbInformation.AppendFormat("Disc ID is {0}", fields.discID).AppendLine(); - sbInformation.AppendFormat("Disc is a {0} disc", DiscTypeToString(fields.discType)).AppendLine(); - sbInformation.AppendFormat("Disc region is {0}", RegionCodeToString(fields.regionCode)).AppendLine(); - sbInformation.AppendFormat("Published by {0}", PublisherCodeToString(fields.publisherCode)).AppendLine(); - if(fields.discNumber > 0) - sbInformation.AppendFormat("Disc number {0} of a multi-disc set", fields.discNumber + 1).AppendLine(); - if(fields.streaming) sbInformation.AppendLine("Disc is prepared for audio streaming"); - if(fields.streamBufferSize > 0) - sbInformation.AppendFormat("Audio streaming buffer size is {0} bytes", fields.streamBufferSize) + sbInformation.AppendLine(wii ? "Nintendo Wii Optical Disc" : "Nintendo GameCube Optical Disc"); + sbInformation.AppendFormat("Disc ID is {0}", fields.DiscId).AppendLine(); + sbInformation.AppendFormat("Disc is a {0} disc", DiscTypeToString(fields.DiscType)).AppendLine(); + sbInformation.AppendFormat("Disc region is {0}", RegionCodeToString(fields.RegionCode)).AppendLine(); + sbInformation.AppendFormat("Published by {0}", PublisherCodeToString(fields.PublisherCode)).AppendLine(); + if(fields.DiscNumber > 0) + sbInformation.AppendFormat("Disc number {0} of a multi-disc set", fields.DiscNumber + 1).AppendLine(); + if(fields.Streaming) sbInformation.AppendLine("Disc is prepared for audio streaming"); + if(fields.StreamBufferSize > 0) + sbInformation.AppendFormat("Audio streaming buffer size is {0} bytes", fields.StreamBufferSize) .AppendLine(); - sbInformation.AppendFormat("Title: {0}", fields.title).AppendLine(); + sbInformation.AppendFormat("Title: {0}", fields.Title).AppendLine(); if(wii) { - for(int i = 0; i < fields.firstPartitions.Length; i++) + for(int i = 0; i < fields.FirstPartitions.Length; i++) sbInformation.AppendFormat("First {0} partition starts at sector {1}", - PartitionTypeToString(fields.firstPartitions[i].type), - fields.firstPartitions[i].offset / 2048).AppendLine(); - for(int i = 0; i < fields.secondPartitions.Length; i++) + PartitionTypeToString(fields.FirstPartitions[i].Type), + fields.FirstPartitions[i].Offset / 2048).AppendLine(); + for(int i = 0; i < fields.SecondPartitions.Length; i++) sbInformation.AppendFormat("Second {0} partition starts at sector {1}", - PartitionTypeToString(fields.secondPartitions[i].type), - fields.secondPartitions[i].offset / 2048).AppendLine(); - for(int i = 0; i < fields.thirdPartitions.Length; i++) + PartitionTypeToString(fields.SecondPartitions[i].Type), + fields.SecondPartitions[i].Offset / 2048).AppendLine(); + for(int i = 0; i < fields.ThirdPartitions.Length; i++) sbInformation.AppendFormat("Third {0} partition starts at sector {1}", - PartitionTypeToString(fields.thirdPartitions[i].type), - fields.thirdPartitions[i].offset / 2048).AppendLine(); - for(int i = 0; i < fields.fourthPartitions.Length; i++) + PartitionTypeToString(fields.ThirdPartitions[i].Type), + fields.ThirdPartitions[i].Offset / 2048).AppendLine(); + for(int i = 0; i < fields.FourthPartitions.Length; i++) sbInformation.AppendFormat("Fourth {0} partition starts at sector {1}", - PartitionTypeToString(fields.fourthPartitions[i].type), - fields.fourthPartitions[i].offset / 2048).AppendLine(); + PartitionTypeToString(fields.FourthPartitions[i].Type), + fields.FourthPartitions[i].Offset / 2048).AppendLine(); // sbInformation.AppendFormat("Region byte is {0}", fields.region).AppendLine(); - if((fields.japanAge & 0x80) != 0x80) - sbInformation.AppendFormat("Japan age rating is {0}", fields.japanAge).AppendLine(); - if((fields.usaAge & 0x80) != 0x80) - sbInformation.AppendFormat("ESRB age rating is {0}", fields.usaAge).AppendLine(); - if((fields.germanAge & 0x80) != 0x80) - sbInformation.AppendFormat("German age rating is {0}", fields.germanAge).AppendLine(); - if((fields.pegiAge & 0x80) != 0x80) - sbInformation.AppendFormat("PEGI age rating is {0}", fields.pegiAge).AppendLine(); - if((fields.finlandAge & 0x80) != 0x80) - sbInformation.AppendFormat("Finland age rating is {0}", fields.finlandAge).AppendLine(); - if((fields.portugalAge & 0x80) != 0x80) - sbInformation.AppendFormat("Portugal age rating is {0}", fields.portugalAge).AppendLine(); - if((fields.ukAge & 0x80) != 0x80) - sbInformation.AppendFormat("UK age rating is {0}", fields.ukAge).AppendLine(); - if((fields.australiaAge & 0x80) != 0x80) - sbInformation.AppendFormat("Australia age rating is {0}", fields.australiaAge).AppendLine(); - if((fields.koreaAge & 0x80) != 0x80) - sbInformation.AppendFormat("Korea age rating is {0}", fields.koreaAge).AppendLine(); + if((fields.JapanAge & 0x80) != 0x80) + sbInformation.AppendFormat("Japan age rating is {0}", fields.JapanAge).AppendLine(); + if((fields.UsaAge & 0x80) != 0x80) + sbInformation.AppendFormat("ESRB age rating is {0}", fields.UsaAge).AppendLine(); + if((fields.GermanAge & 0x80) != 0x80) + sbInformation.AppendFormat("German age rating is {0}", fields.GermanAge).AppendLine(); + if((fields.PegiAge & 0x80) != 0x80) + sbInformation.AppendFormat("PEGI age rating is {0}", fields.PegiAge).AppendLine(); + if((fields.FinlandAge & 0x80) != 0x80) + sbInformation.AppendFormat("Finland age rating is {0}", fields.FinlandAge).AppendLine(); + if((fields.PortugalAge & 0x80) != 0x80) + sbInformation.AppendFormat("Portugal age rating is {0}", fields.PortugalAge).AppendLine(); + if((fields.UkAge & 0x80) != 0x80) + sbInformation.AppendFormat("UK age rating is {0}", fields.UkAge).AppendLine(); + if((fields.AustraliaAge & 0x80) != 0x80) + sbInformation.AppendFormat("Australia age rating is {0}", fields.AustraliaAge).AppendLine(); + if((fields.KoreaAge & 0x80) != 0x80) + sbInformation.AppendFormat("Korea age rating is {0}", fields.KoreaAge).AppendLine(); } else - sbInformation.AppendFormat("FST starts at {0} and has {1} bytes", fields.fstOff, fields.fstSize) + sbInformation.AppendFormat("FST starts at {0} and has {1} bytes", fields.FstOff, fields.FstSize) .AppendLine(); information = sbInformation.ToString(); - xmlFSType.Bootable = true; - xmlFSType.Clusters = (long)(imagePlugin.GetSectors() * imagePlugin.GetSectorSize() / 2048); - xmlFSType.ClusterSize = 2048; - if(wii) xmlFSType.Type = "Nintendo Wii filesystem"; - else xmlFSType.Type = "Nintendo Gamecube filesystem"; - xmlFSType.VolumeName = fields.title; - xmlFSType.VolumeSerial = fields.discID; + XmlFsType.Bootable = true; + XmlFsType.Clusters = (long)(imagePlugin.GetSectors() * imagePlugin.GetSectorSize() / 2048); + XmlFsType.ClusterSize = 2048; + XmlFsType.Type = wii ? "Nintendo Wii filesystem" : "Nintendo Gamecube filesystem"; + XmlFsType.VolumeName = fields.Title; + XmlFsType.VolumeSerial = fields.DiscId; } struct NintendoFields { - public string discType; - public string gameCode; - public string regionCode; - public string publisherCode; - public string discID; - public byte discNumber; - public byte discVersion; - public bool streaming; - public byte streamBufferSize; - public string title; - public uint debugOff; - public uint debugAddr; - public uint dolOff; - public uint fstOff; - public uint fstSize; - public uint fstMax; - public NintendoPartition[] firstPartitions; - public NintendoPartition[] secondPartitions; - public NintendoPartition[] thirdPartitions; - public NintendoPartition[] fourthPartitions; - public byte region; - public byte japanAge; - public byte usaAge; - public byte germanAge; - public byte pegiAge; - public byte finlandAge; - public byte portugalAge; - public byte ukAge; - public byte australiaAge; - public byte koreaAge; + public string DiscType; + public string GameCode; + public string RegionCode; + public string PublisherCode; + public string DiscId; + public byte DiscNumber; + public byte DiscVersion; + public bool Streaming; + public byte StreamBufferSize; + public string Title; + public uint DebugOff; + public uint DebugAddr; + public uint DolOff; + public uint FstOff; + public uint FstSize; + public uint FstMax; + public NintendoPartition[] FirstPartitions; + public NintendoPartition[] SecondPartitions; + public NintendoPartition[] ThirdPartitions; + public NintendoPartition[] FourthPartitions; + public byte Region; + public byte JapanAge; + public byte UsaAge; + public byte GermanAge; + public byte PegiAge; + public byte FinlandAge; + public byte PortugalAge; + public byte UkAge; + public byte AustraliaAge; + public byte KoreaAge; } struct NintendoPartition { - public uint offset; - public uint type; + public uint Offset; + public uint Type; } - string DiscTypeToString(string discType) + static string DiscTypeToString(string discType) { switch(discType) { @@ -390,7 +384,7 @@ namespace DiscImageChef.Filesystems return $"unknown type '{discType}'"; } - string RegionCodeToString(string regionCode) + static string RegionCodeToString(string regionCode) { switch(regionCode) { @@ -415,7 +409,7 @@ namespace DiscImageChef.Filesystems return $"unknown code '{regionCode}'"; } - string PublisherCodeToString(string publisherCode) + static string PublisherCodeToString(string publisherCode) { switch(publisherCode) { @@ -445,7 +439,7 @@ namespace DiscImageChef.Filesystems return $"Unknown publisher '{publisherCode}'"; } - string PartitionTypeToString(uint type) + static string PartitionTypeToString(uint type) { switch(type) { diff --git a/DiscImageChef.Filesystems/ODS.cs b/DiscImageChef.Filesystems/ODS.cs index 1bf66bafe..e25ff939d 100644 --- a/DiscImageChef.Filesystems/ODS.cs +++ b/DiscImageChef.Filesystems/ODS.cs @@ -55,24 +55,22 @@ namespace DiscImageChef.Filesystems public ODS() { Name = "Files-11 On-Disk Structure"; - PluginUUID = new Guid("de20633c-8021-4384-aeb0-83b0df14491f"); + PluginUuid = new Guid("de20633c-8021-4384-aeb0-83b0df14491f"); CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); } public ODS(Encoding encoding) { Name = "Files-11 On-Disk Structure"; - PluginUUID = new Guid("de20633c-8021-4384-aeb0-83b0df14491f"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("de20633c-8021-4384-aeb0-83b0df14491f"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } public ODS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Files-11 On-Disk Structure"; - PluginUUID = new Guid("de20633c-8021-4384-aeb0-83b0df14491f"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("de20633c-8021-4384-aeb0-83b0df14491f"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -81,12 +79,11 @@ namespace DiscImageChef.Filesystems if(imagePlugin.GetSectorSize() < 512) return false; - byte[] magic_b = new byte[12]; - string magic; - byte[] hb_sector = imagePlugin.ReadSector(1 + partition.Start); + byte[] magicB = new byte[12]; + byte[] hbSector = imagePlugin.ReadSector(1 + partition.Start); - Array.Copy(hb_sector, 0x1F0, magic_b, 0, 12); - magic = Encoding.ASCII.GetString(magic_b); + Array.Copy(hbSector, 0x1F0, magicB, 0, 12); + string magic = Encoding.ASCII.GetString(magicB); DicConsole.DebugWriteLine("Files-11 plugin", "magic: \"{0}\"", magic); @@ -95,18 +92,16 @@ namespace DiscImageChef.Filesystems // Optical disc if(imagePlugin.ImageInfo.XmlMediaType != XmlMediaType.OpticalDisc) return false; - if(hb_sector.Length < 0x400) return false; + if(hbSector.Length < 0x400) return false; - hb_sector = imagePlugin.ReadSector(partition.Start); + hbSector = imagePlugin.ReadSector(partition.Start); - Array.Copy(hb_sector, 0x3F0, magic_b, 0, 12); - magic = Encoding.ASCII.GetString(magic_b); + Array.Copy(hbSector, 0x3F0, magicB, 0, 12); + magic = Encoding.ASCII.GetString(magicB); DicConsole.DebugWriteLine("Files-11 plugin", "unaligned magic: \"{0}\"", magic); - if(magic == "DECFILE11A " || magic == "DECFILE11B ") return true; - - return false; + return magic == "DECFILE11A " || magic == "DECFILE11B "; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -115,14 +110,11 @@ namespace DiscImageChef.Filesystems information = ""; StringBuilder sb = new StringBuilder(); - ODSHomeBlock homeblock; - homeblock.min_class = new byte[20]; - homeblock.max_class = new byte[20]; - byte[] hb_sector = imagePlugin.ReadSector(1 + partition.Start); + byte[] hbSector = imagePlugin.ReadSector(1 + partition.Start); - GCHandle handle = GCHandle.Alloc(hb_sector, GCHandleType.Pinned); - homeblock = (ODSHomeBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(ODSHomeBlock)); + GCHandle handle = GCHandle.Alloc(hbSector, GCHandleType.Pinned); + OdsHomeBlock homeblock = (OdsHomeBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(OdsHomeBlock)); handle.Free(); // Optical disc @@ -130,14 +122,14 @@ namespace DiscImageChef.Filesystems StringHandlers.CToString(homeblock.format) != "DECFILE11A " && StringHandlers.CToString(homeblock.format) != "DECFILE11B ") { - if(hb_sector.Length < 0x400) return; + if(hbSector.Length < 0x400) return; byte[] tmp = imagePlugin.ReadSector(partition.Start); - hb_sector = new byte[0x200]; - Array.Copy(tmp, 0x200, hb_sector, 0, 0x200); + hbSector = new byte[0x200]; + Array.Copy(tmp, 0x200, hbSector, 0, 0x200); - handle = GCHandle.Alloc(hb_sector, GCHandleType.Pinned); - homeblock = (ODSHomeBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(ODSHomeBlock)); + handle = GCHandle.Alloc(hbSector, GCHandleType.Pinned); + homeblock = (OdsHomeBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(OdsHomeBlock)); handle.Free(); if(StringHandlers.CToString(homeblock.format) != "DECFILE11A " && @@ -200,41 +192,25 @@ namespace DiscImageChef.Filesystems sb.AppendLine("Volume permissions (r = read, w = write, c = create, d = delete)"); sb.AppendLine("System, owner, group, world"); // System - if((homeblock.protect & 0x1000) == 0x1000) sb.Append("-"); - else sb.Append("r"); - if((homeblock.protect & 0x2000) == 0x2000) sb.Append("-"); - else sb.Append("w"); - if((homeblock.protect & 0x4000) == 0x4000) sb.Append("-"); - else sb.Append("c"); - if((homeblock.protect & 0x8000) == 0x8000) sb.Append("-"); - else sb.Append("d"); + sb.Append((homeblock.protect & 0x1000) == 0x1000 ? "-" : "r"); + sb.Append((homeblock.protect & 0x2000) == 0x2000 ? "-" : "w"); + sb.Append((homeblock.protect & 0x4000) == 0x4000 ? "-" : "c"); + sb.Append((homeblock.protect & 0x8000) == 0x8000 ? "-" : "d"); // Owner - if((homeblock.protect & 0x100) == 0x100) sb.Append("-"); - else sb.Append("r"); - if((homeblock.protect & 0x200) == 0x200) sb.Append("-"); - else sb.Append("w"); - if((homeblock.protect & 0x400) == 0x400) sb.Append("-"); - else sb.Append("c"); - if((homeblock.protect & 0x800) == 0x800) sb.Append("-"); - else sb.Append("d"); + sb.Append((homeblock.protect & 0x100) == 0x100 ? "-" : "r"); + sb.Append((homeblock.protect & 0x200) == 0x200 ? "-" : "w"); + sb.Append((homeblock.protect & 0x400) == 0x400 ? "-" : "c"); + sb.Append((homeblock.protect & 0x800) == 0x800 ? "-" : "d"); // Group - if((homeblock.protect & 0x10) == 0x10) sb.Append("-"); - else sb.Append("r"); - if((homeblock.protect & 0x20) == 0x20) sb.Append("-"); - else sb.Append("w"); - if((homeblock.protect & 0x40) == 0x40) sb.Append("-"); - else sb.Append("c"); - if((homeblock.protect & 0x80) == 0x80) sb.Append("-"); - else sb.Append("d"); + sb.Append((homeblock.protect & 0x10) == 0x10 ? "-" : "r"); + sb.Append((homeblock.protect & 0x20) == 0x20 ? "-" : "w"); + sb.Append((homeblock.protect & 0x40) == 0x40 ? "-" : "c"); + sb.Append((homeblock.protect & 0x80) == 0x80 ? "-" : "d"); // World (other) - if((homeblock.protect & 0x1) == 0x1) sb.Append("-"); - else sb.Append("r"); - if((homeblock.protect & 0x2) == 0x2) sb.Append("-"); - else sb.Append("w"); - if((homeblock.protect & 0x4) == 0x4) sb.Append("-"); - else sb.Append("c"); - if((homeblock.protect & 0x8) == 0x8) sb.Append("-"); - else sb.Append("d"); + sb.Append((homeblock.protect & 0x1) == 0x1 ? "-" : "r"); + sb.Append((homeblock.protect & 0x2) == 0x2 ? "-" : "w"); + sb.Append((homeblock.protect & 0x4) == 0x4 ? "-" : "c"); + sb.Append((homeblock.protect & 0x8) == 0x8 ? "-" : "d"); sb.AppendLine(); @@ -243,7 +219,7 @@ namespace DiscImageChef.Filesystems sb.AppendFormat("File protection: 0x{0:X4}", homeblock.fileprot).AppendLine(); sb.AppendFormat("Record protection: 0x{0:X4}", homeblock.recprot).AppendLine(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "FILES-11", ClusterSize = homeblock.cluster * 512, @@ -253,20 +229,20 @@ namespace DiscImageChef.Filesystems }; if(homeblock.credate > 0) { - xmlFSType.CreationDate = DateHandlers.VMSToDateTime(homeblock.credate); - xmlFSType.CreationDateSpecified = true; + XmlFsType.CreationDate = DateHandlers.VMSToDateTime(homeblock.credate); + XmlFsType.CreationDateSpecified = true; } if(homeblock.revdate > 0) { - xmlFSType.ModificationDate = DateHandlers.VMSToDateTime(homeblock.revdate); - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.VMSToDateTime(homeblock.revdate); + XmlFsType.ModificationDateSpecified = true; } information = sb.ToString(); } [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ODSHomeBlock + struct OdsHomeBlock { /// 0x000, LBN of THIS home block public uint homelbn; diff --git a/DiscImageChef.Filesystems/Opera.cs b/DiscImageChef.Filesystems/Opera.cs index bc5e78057..cd0a18dc6 100644 --- a/DiscImageChef.Filesystems/Opera.cs +++ b/DiscImageChef.Filesystems/Opera.cs @@ -45,14 +45,14 @@ namespace DiscImageChef.Filesystems public OperaFS() { Name = "Opera Filesystem Plugin"; - PluginUUID = new Guid("0ec84ec7-eae6-4196-83fe-943b3fe46dbd"); + PluginUuid = new Guid("0ec84ec7-eae6-4196-83fe-943b3fe46dbd"); CurrentEncoding = Encoding.ASCII; } public OperaFS(Encoding encoding) { Name = "Opera Filesystem Plugin"; - PluginUUID = new Guid("0ec84ec7-eae6-4196-83fe-943b3fe46dbd"); + PluginUuid = new Guid("0ec84ec7-eae6-4196-83fe-943b3fe46dbd"); // TODO: Find correct default encoding CurrentEncoding = Encoding.ASCII; } @@ -60,7 +60,7 @@ namespace DiscImageChef.Filesystems public OperaFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Opera Filesystem Plugin"; - PluginUUID = new Guid("0ec84ec7-eae6-4196-83fe-943b3fe46dbd"); + PluginUuid = new Guid("0ec84ec7-eae6-4196-83fe-943b3fe46dbd"); // TODO: Find correct default encoding CurrentEncoding = Encoding.ASCII; } @@ -69,75 +69,72 @@ namespace DiscImageChef.Filesystems { if(2 + partition.Start >= partition.End) return false; - byte[] sb_sector = imagePlugin.ReadSector(0 + partition.Start); + byte[] sbSector = imagePlugin.ReadSector(0 + partition.Start); - byte record_type; - byte[] sync_bytes = new byte[5]; - byte record_version; + byte[] syncBytes = new byte[5]; - record_type = sb_sector[0x000]; - Array.Copy(sb_sector, 0x001, sync_bytes, 0, 5); - record_version = sb_sector[0x006]; + byte recordType = sbSector[0x000]; + Array.Copy(sbSector, 0x001, syncBytes, 0, 5); + byte recordVersion = sbSector[0x006]; - if(record_type != 1 || record_version != 1) return false; + if(recordType != 1 || recordVersion != 1) return false; - return Encoding.ASCII.GetString(sync_bytes) == "ZZZZZ"; + return Encoding.ASCII.GetString(syncBytes) == "ZZZZZ"; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, out string information) { information = ""; - StringBuilder SuperBlockMetadata = new StringBuilder(); + StringBuilder superBlockMetadata = new StringBuilder(); - byte[] sb_sector = imagePlugin.ReadSector(0 + partition.Start); + byte[] sbSector = imagePlugin.ReadSector(0 + partition.Start); - OperaSuperBlock sb = BigEndianMarshal.ByteArrayToStructureBigEndian(sb_sector); - byte[] cString = new byte[32]; + OperaSuperBlock sb = BigEndianMarshal.ByteArrayToStructureBigEndian(sbSector); sb.sync_bytes = new byte[5]; if(sb.record_type != 1 || sb.record_version != 1) return; if(Encoding.ASCII.GetString(sb.sync_bytes) != "ZZZZZ") return; - SuperBlockMetadata.AppendFormat("Opera filesystem disc.").AppendLine(); + superBlockMetadata.AppendFormat("Opera filesystem disc.").AppendLine(); if(!string.IsNullOrEmpty(StringHandlers.CToString(sb.volume_label, CurrentEncoding))) - SuperBlockMetadata + superBlockMetadata .AppendFormat("Volume label: {0}", StringHandlers.CToString(sb.volume_label, CurrentEncoding)) .AppendLine(); if(!string.IsNullOrEmpty(StringHandlers.CToString(sb.volume_comment, CurrentEncoding))) - SuperBlockMetadata.AppendFormat("Volume comment: {0}", + superBlockMetadata.AppendFormat("Volume comment: {0}", StringHandlers.CToString(sb.volume_comment, CurrentEncoding)) .AppendLine(); - SuperBlockMetadata.AppendFormat("Volume identifier: 0x{0:X8}", sb.volume_id).AppendLine(); - SuperBlockMetadata.AppendFormat("Block size: {0} bytes", sb.block_size).AppendLine(); + superBlockMetadata.AppendFormat("Volume identifier: 0x{0:X8}", sb.volume_id).AppendLine(); + superBlockMetadata.AppendFormat("Block size: {0} bytes", sb.block_size).AppendLine(); if(imagePlugin.GetSectorSize() == 2336 || imagePlugin.GetSectorSize() == 2352 || imagePlugin.GetSectorSize() == 2448) { if(sb.block_size != 2048) - SuperBlockMetadata + superBlockMetadata .AppendFormat("WARNING: Filesystem indicates {0} bytes/block while device indicates {1} bytes/block", sb.block_size, 2048); } else if(imagePlugin.GetSectorSize() != sb.block_size) - SuperBlockMetadata + superBlockMetadata .AppendFormat("WARNING: Filesystem indicates {0} bytes/block while device indicates {1} bytes/block", sb.block_size, imagePlugin.GetSectorSize()); - SuperBlockMetadata + superBlockMetadata .AppendFormat("Volume size: {0} blocks, {1} bytes", sb.block_count, sb.block_size * sb.block_count) .AppendLine(); if((ulong)sb.block_count > imagePlugin.GetSectors()) - SuperBlockMetadata + superBlockMetadata .AppendFormat("WARNING: Filesystem indicates {0} blocks while device indicates {1} blocks", sb.block_count, imagePlugin.GetSectors()); - SuperBlockMetadata.AppendFormat("Root directory identifier: 0x{0:X8}", sb.root_dirid).AppendLine(); - SuperBlockMetadata.AppendFormat("Root directory block size: {0} bytes", sb.rootdir_bsize).AppendLine(); - SuperBlockMetadata.AppendFormat("Root directory size: {0} blocks, {1} bytes", sb.rootdir_blocks, + superBlockMetadata.AppendFormat("Root directory identifier: 0x{0:X8}", sb.root_dirid).AppendLine(); + superBlockMetadata.AppendFormat("Root directory block size: {0} bytes", sb.rootdir_bsize).AppendLine(); + superBlockMetadata.AppendFormat("Root directory size: {0} blocks, {1} bytes", sb.rootdir_blocks, sb.rootdir_bsize * sb.rootdir_blocks).AppendLine(); - SuperBlockMetadata.AppendFormat("Last root directory copy: {0}", sb.last_root_copy).AppendLine(); + superBlockMetadata.AppendFormat("Last root directory copy: {0}", sb.last_root_copy).AppendLine(); - information = SuperBlockMetadata.ToString(); + information = superBlockMetadata.ToString(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "Opera", VolumeName = StringHandlers.CToString(sb.volume_label, CurrentEncoding), diff --git a/DiscImageChef.Filesystems/PCEngine.cs b/DiscImageChef.Filesystems/PCEngine.cs index 66b134062..e7743bd66 100644 --- a/DiscImageChef.Filesystems/PCEngine.cs +++ b/DiscImageChef.Filesystems/PCEngine.cs @@ -44,46 +44,46 @@ namespace DiscImageChef.Filesystems public PCEnginePlugin() { Name = "PC Engine CD Plugin"; - PluginUUID = new Guid("e5ee6d7c-90fa-49bd-ac89-14ef750b8af3"); + PluginUuid = new Guid("e5ee6d7c-90fa-49bd-ac89-14ef750b8af3"); CurrentEncoding = Encoding.GetEncoding("shift_jis"); } public PCEnginePlugin(Encoding encoding) { Name = "PC Engine CD Plugin"; - PluginUUID = new Guid("e5ee6d7c-90fa-49bd-ac89-14ef750b8af3"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("shift_jis"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("e5ee6d7c-90fa-49bd-ac89-14ef750b8af3"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("shift_jis"); } public PCEnginePlugin(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "PC Engine CD Plugin"; - PluginUUID = new Guid("e5ee6d7c-90fa-49bd-ac89-14ef750b8af3"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("shift_jis"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("e5ee6d7c-90fa-49bd-ac89-14ef750b8af3"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("shift_jis"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { if(2 + partition.Start >= partition.End) return false; - byte[] system_descriptor = new byte[23]; + byte[] systemDescriptor = new byte[23]; byte[] sector = imagePlugin.ReadSector(1 + partition.Start); - Array.Copy(sector, 0x20, system_descriptor, 0, 23); + Array.Copy(sector, 0x20, systemDescriptor, 0, 23); - return Encoding.ASCII.GetString(system_descriptor) == "PC Engine CD-ROM SYSTEM"; + return Encoding.ASCII.GetString(systemDescriptor) == "PC Engine CD-ROM SYSTEM"; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, out string information) { information = ""; - xmlFSType = new FileSystemType(); - xmlFSType.Type = "PC Engine filesystem"; - xmlFSType.Clusters = (long)((partition.End - partition.Start + 1) / imagePlugin.GetSectorSize() * 2048); - xmlFSType.ClusterSize = 2048; + XmlFsType = new FileSystemType + { + Type = "PC Engine filesystem", + Clusters = (long)((partition.End - partition.Start + 1) / imagePlugin.GetSectorSize() * 2048), + ClusterSize = 2048 + }; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/PFS.cs b/DiscImageChef.Filesystems/PFS.cs index 1fc67f163..b0b7e4fc8 100644 --- a/DiscImageChef.Filesystems/PFS.cs +++ b/DiscImageChef.Filesystems/PFS.cs @@ -45,24 +45,22 @@ namespace DiscImageChef.Filesystems public PFS() { Name = "Professional File System"; - PluginUUID = new Guid("68DE769E-D957-406A-8AE4-3781CA8CDA77"); + PluginUuid = new Guid("68DE769E-D957-406A-8AE4-3781CA8CDA77"); CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); } public PFS(Encoding encoding) { Name = "Professional File System"; - PluginUUID = new Guid("68DE769E-D957-406A-8AE4-3781CA8CDA77"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("68DE769E-D957-406A-8AE4-3781CA8CDA77"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } public PFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Professional File System"; - PluginUUID = new Guid("68DE769E-D957-406A-8AE4-3781CA8CDA77"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("68DE769E-D957-406A-8AE4-3781CA8CDA77"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } /// @@ -204,28 +202,27 @@ namespace DiscImageChef.Filesystems public override void GetInformation(ImagePlugin imagePlugin, Partition partition, out string information) { - byte[] RootBlockSector = imagePlugin.ReadSector(2 + partition.Start); - RootBlock rootBlock; - rootBlock = BigEndianMarshal.ByteArrayToStructureBigEndian(RootBlockSector); + byte[] rootBlockSector = imagePlugin.ReadSector(2 + partition.Start); + RootBlock rootBlock = BigEndianMarshal.ByteArrayToStructureBigEndian(rootBlockSector); StringBuilder sbInformation = new StringBuilder(); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); switch(rootBlock.diskType) { case AFS_DISK: case MUAF_DISK: sbInformation.Append("Professional File System v1"); - xmlFSType.Type = "PFS v1"; + XmlFsType.Type = "PFS v1"; break; case PFS2_DISK: sbInformation.Append("Professional File System v2"); - xmlFSType.Type = "PFS v2"; + XmlFsType.Type = "PFS v2"; break; case PFS_DISK: case MUPFS_DISK: sbInformation.Append("Professional File System v3"); - xmlFSType.Type = "PFS v3"; + XmlFsType.Type = "PFS v3"; break; } @@ -248,14 +245,14 @@ namespace DiscImageChef.Filesystems information = sbInformation.ToString(); - xmlFSType.CreationDate = + XmlFsType.CreationDate = DateHandlers.AmigaToDateTime(rootBlock.creationday, rootBlock.creationminute, rootBlock.creationtick); - xmlFSType.CreationDateSpecified = true; - xmlFSType.FreeClusters = rootBlock.blocksfree; - xmlFSType.FreeClustersSpecified = true; - xmlFSType.Clusters = rootBlock.diskSize; - xmlFSType.ClusterSize = (int)imagePlugin.GetSectorSize(); - xmlFSType.VolumeName = StringHandlers.PascalToString(rootBlock.diskname, CurrentEncoding); + XmlFsType.CreationDateSpecified = true; + XmlFsType.FreeClusters = rootBlock.blocksfree; + XmlFsType.FreeClustersSpecified = true; + XmlFsType.Clusters = rootBlock.diskSize; + XmlFsType.ClusterSize = (int)imagePlugin.GetSectorSize(); + XmlFsType.VolumeName = StringHandlers.PascalToString(rootBlock.diskname, CurrentEncoding); } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/ProDOS.cs b/DiscImageChef.Filesystems/ProDOS.cs index 599dff5c2..efa0861d2 100644 --- a/DiscImageChef.Filesystems/ProDOS.cs +++ b/DiscImageChef.Filesystems/ProDOS.cs @@ -46,55 +46,55 @@ namespace DiscImageChef.Filesystems // Information from Apple ProDOS 8 Technical Reference public class ProDOSPlugin : Filesystem { - const byte EmptyStorageType = 0x00; + const byte EMPTY_STORAGE_TYPE = 0x00; /// /// A file that occupies one block or less /// - const byte SeedlingFileType = 0x01; + const byte SEEDLING_FILE_TYPE = 0x01; /// /// A file that occupies between 2 and 256 blocks /// - const byte SaplingFileType = 0x02; + const byte SAPLING_FILE_TYPE = 0x02; /// /// A file that occupies between 257 and 32768 blocks /// - const byte TreeFileType = 0x03; - const byte PascalAreaType = 0x04; - const byte SubDirectoryType = 0x0D; - const byte SubDirectoryHeaderType = 0x0E; - const byte RootDirectoryType = 0x0F; + const byte TREE_FILE_TYPE = 0x03; + const byte PASCAL_AREA_TYPE = 0x04; + const byte SUBDIRECTORY_TYPE = 0x0D; + const byte SUBDIRECTORY_HEADER_TYPE = 0x0E; + const byte ROOT_DIRECTORY_TYPE = 0x0F; - const byte ProDOSVersion1 = 0x00; + const byte VERSION1 = 0x00; - const uint ProDOSYearMask = 0xFE000000; - const uint ProDOSMonthMask = 0x1E00000; - const uint ProDOSDayMask = 0x1F0000; - const uint ProDOSHourMask = 0x1F00; - const uint ProDOSMinuteMask = 0x3F; + const uint YEAR_MASK = 0xFE000000; + const uint MONTH_MASK = 0x1E00000; + const uint DAY_MASK = 0x1F0000; + const uint HOUR_MASK = 0x1F00; + const uint MINUTE_MASK = 0x3F; - const byte ProDOSDestroyAttribute = 0x80; - const byte ProDOSRenameAttribute = 0x40; - const byte ProDOSBackupAttribute = 0x20; - const byte ProDOSWriteAttribute = 0x02; - const byte ProDOSReadAttribute = 0x01; - const byte ProDOSReservedAttributeMask = 0x1C; + const byte DESTROY_ATTRIBUTE = 0x80; + const byte RENAME_ATTRIBUTE = 0x40; + const byte BACKUP_ATTRIBUTE = 0x20; + const byte WRITE_ATTRIBUTE = 0x02; + const byte READ_ATTRIBUTE = 0x01; + const byte RESERVED_ATTRIBUTE_MASK = 0x1C; - const byte ProDOSStorageTypeMask = 0xF0; - const byte ProDOSNameLengthMask = 0x0F; - const byte ProDOSEntryLength = 0x27; - const byte ProDOSEntriesPerBlock = 0x0D; + const byte STORAGE_TYPE_MASK = 0xF0; + const byte NAME_LENGTH_MASK = 0x0F; + const byte ENTRY_LENGTH = 0x27; + const byte ENTRIES_PER_BLOCK = 0x0D; public ProDOSPlugin() { Name = "Apple ProDOS filesystem"; - PluginUUID = new Guid("43874265-7B8A-4739-BCF7-07F80D5932BF"); + PluginUuid = new Guid("43874265-7B8A-4739-BCF7-07F80D5932BF"); CurrentEncoding = new LisaRoman(); } public ProDOSPlugin(Encoding encoding) { Name = "Apple ProDOS filesystem"; - PluginUUID = new Guid("43874265-7B8A-4739-BCF7-07F80D5932BF"); + PluginUuid = new Guid("43874265-7B8A-4739-BCF7-07F80D5932BF"); // TODO: Until Apple ][ encoding is implemented CurrentEncoding = new LisaRoman(); } @@ -102,7 +102,7 @@ namespace DiscImageChef.Filesystems public ProDOSPlugin(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Apple ProDOS filesystem"; - PluginUUID = new Guid("43874265-7B8A-4739-BCF7-07F80D5932BF"); + PluginUuid = new Guid("43874265-7B8A-4739-BCF7-07F80D5932BF"); // TODO: Until Apple ][ encoding is implemented CurrentEncoding = new LisaRoman(); } @@ -121,8 +121,8 @@ namespace DiscImageChef.Filesystems byte[] tmp = imagePlugin.ReadSectors(partition.Start, 2); foreach(int offset in new[] {0, 0x200, 0x400, 0x600, 0x800, 0xA00}.Where(offset => BitConverter.ToUInt16(tmp, offset) == 0 && - (byte)((tmp[offset + 0x04] & ProDOSStorageTypeMask) >> 4) == RootDirectoryType && - tmp[offset + 0x23] == ProDOSEntryLength && tmp[offset + 0x24] == ProDOSEntriesPerBlock)) { + (byte)((tmp[offset + 0x04] & STORAGE_TYPE_MASK) >> 4) == ROOT_DIRECTORY_TYPE && + tmp[offset + 0x23] == ENTRY_LENGTH && tmp[offset + 0x24] == ENTRIES_PER_BLOCK)) { Array.Copy(tmp, offset, rootDirectoryKeyBlock, 0, 0x200); APMFromHDDOnCD = true; break; @@ -133,28 +133,28 @@ namespace DiscImageChef.Filesystems DicConsole.DebugWriteLine("ProDOS plugin", "prePointer = {0}", prePointer); if(prePointer != 0) return false; - byte storage_type = (byte)((rootDirectoryKeyBlock[0x04] & ProDOSStorageTypeMask) >> 4); - DicConsole.DebugWriteLine("ProDOS plugin", "storage_type = {0}", storage_type); - if(storage_type != RootDirectoryType) return false; + byte storageType = (byte)((rootDirectoryKeyBlock[0x04] & STORAGE_TYPE_MASK) >> 4); + DicConsole.DebugWriteLine("ProDOS plugin", "storage_type = {0}", storageType); + if(storageType != ROOT_DIRECTORY_TYPE) return false; - byte entry_length = rootDirectoryKeyBlock[0x23]; - DicConsole.DebugWriteLine("ProDOS plugin", "entry_length = {0}", entry_length); - if(entry_length != ProDOSEntryLength) return false; + byte entryLength = rootDirectoryKeyBlock[0x23]; + DicConsole.DebugWriteLine("ProDOS plugin", "entry_length = {0}", entryLength); + if(entryLength != ENTRY_LENGTH) return false; - byte entries_per_block = rootDirectoryKeyBlock[0x24]; - DicConsole.DebugWriteLine("ProDOS plugin", "entries_per_block = {0}", entries_per_block); - if(entries_per_block != ProDOSEntriesPerBlock) return false; + byte entriesPerBlock = rootDirectoryKeyBlock[0x24]; + DicConsole.DebugWriteLine("ProDOS plugin", "entries_per_block = {0}", entriesPerBlock); + if(entriesPerBlock != ENTRIES_PER_BLOCK) return false; - ushort bit_map_pointer = BitConverter.ToUInt16(rootDirectoryKeyBlock, 0x27); - DicConsole.DebugWriteLine("ProDOS plugin", "bit_map_pointer = {0}", bit_map_pointer); - if(bit_map_pointer > partition.End) return false; + ushort bitMapPointer = BitConverter.ToUInt16(rootDirectoryKeyBlock, 0x27); + DicConsole.DebugWriteLine("ProDOS plugin", "bit_map_pointer = {0}", bitMapPointer); + if(bitMapPointer > partition.End) return false; - ushort total_blocks = BitConverter.ToUInt16(rootDirectoryKeyBlock, 0x29); - if(APMFromHDDOnCD) total_blocks /= 4; + ushort totalBlocks = BitConverter.ToUInt16(rootDirectoryKeyBlock, 0x29); + if(APMFromHDDOnCD) totalBlocks /= 4; - DicConsole.DebugWriteLine("ProDOS plugin", "{0} <= ({1} - {2} + 1)? {3}", total_blocks, partition.End, - partition.Start, total_blocks <= partition.End - partition.Start + 1); - return total_blocks <= partition.End - partition.Start + 1; + DicConsole.DebugWriteLine("ProDOS plugin", "{0} <= ({1} - {2} + 1)? {3}", totalBlocks, partition.End, + partition.Start, totalBlocks <= partition.End - partition.Start + 1); + return totalBlocks <= partition.End - partition.Start + 1; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -173,50 +173,45 @@ namespace DiscImageChef.Filesystems byte[] tmp = imagePlugin.ReadSectors(partition.Start, 2); foreach(int offset in new[] {0, 0x200, 0x400, 0x600, 0x800, 0xA00}.Where(offset => BitConverter.ToUInt16(tmp, offset) == 0 && - (byte)((tmp[offset + 0x04] & ProDOSStorageTypeMask) >> 4) == RootDirectoryType && - tmp[offset + 0x23] == ProDOSEntryLength && tmp[offset + 0x24] == ProDOSEntriesPerBlock)) { + (byte)((tmp[offset + 0x04] & STORAGE_TYPE_MASK) >> 4) == ROOT_DIRECTORY_TYPE && + tmp[offset + 0x23] == ENTRY_LENGTH && tmp[offset + 0x24] == ENTRIES_PER_BLOCK)) { Array.Copy(tmp, offset, rootDirectoryKeyBlockBytes, 0, 0x200); APMFromHDDOnCD = true; break; } } - ProDOSRootDirectoryKeyBlock rootDirectoryKeyBlock = new ProDOSRootDirectoryKeyBlock(); - rootDirectoryKeyBlock.header = new ProDOSRootDirectoryHeader(); - - byte[] temporal; - int year, month, day, hour, minute; - ushort temp_timestamp_left, temp_timestamp_right; - uint temp_timestamp; + ProDOSRootDirectoryKeyBlock rootDirectoryKeyBlock = + new ProDOSRootDirectoryKeyBlock {header = new ProDOSRootDirectoryHeader()}; rootDirectoryKeyBlock.zero = BitConverter.ToUInt16(rootDirectoryKeyBlockBytes, 0x00); rootDirectoryKeyBlock.next_pointer = BitConverter.ToUInt16(rootDirectoryKeyBlockBytes, 0x02); rootDirectoryKeyBlock.header.storage_type = - (byte)((rootDirectoryKeyBlockBytes[0x04] & ProDOSStorageTypeMask) >> 4); - rootDirectoryKeyBlock.header.name_length = (byte)(rootDirectoryKeyBlockBytes[0x04] & ProDOSNameLengthMask); - temporal = new byte[rootDirectoryKeyBlock.header.name_length]; + (byte)((rootDirectoryKeyBlockBytes[0x04] & STORAGE_TYPE_MASK) >> 4); + rootDirectoryKeyBlock.header.name_length = (byte)(rootDirectoryKeyBlockBytes[0x04] & NAME_LENGTH_MASK); + byte[] temporal = new byte[rootDirectoryKeyBlock.header.name_length]; Array.Copy(rootDirectoryKeyBlockBytes, 0x05, temporal, 0, rootDirectoryKeyBlock.header.name_length); rootDirectoryKeyBlock.header.volume_name = CurrentEncoding.GetString(temporal); rootDirectoryKeyBlock.header.reserved = BitConverter.ToUInt64(rootDirectoryKeyBlockBytes, 0x14); - temp_timestamp_left = BitConverter.ToUInt16(rootDirectoryKeyBlockBytes, 0x1C); - temp_timestamp_right = BitConverter.ToUInt16(rootDirectoryKeyBlockBytes, 0x1E); + ushort tempTimestampLeft = BitConverter.ToUInt16(rootDirectoryKeyBlockBytes, 0x1C); + ushort tempTimestampRight = BitConverter.ToUInt16(rootDirectoryKeyBlockBytes, 0x1E); bool dateCorrect; try { - temp_timestamp = (uint)((temp_timestamp_left << 16) + temp_timestamp_right); - year = (int)((temp_timestamp & ProDOSYearMask) >> 25); - month = (int)((temp_timestamp & ProDOSMonthMask) >> 21); - day = (int)((temp_timestamp & ProDOSDayMask) >> 16); - hour = (int)((temp_timestamp & ProDOSHourMask) >> 8); - minute = (int)(temp_timestamp & ProDOSMinuteMask); + uint tempTimestamp = (uint)((tempTimestampLeft << 16) + tempTimestampRight); + int year = (int)((tempTimestamp & YEAR_MASK) >> 25); + int month = (int)((tempTimestamp & MONTH_MASK) >> 21); + int day = (int)((tempTimestamp & DAY_MASK) >> 16); + int hour = (int)((tempTimestamp & HOUR_MASK) >> 8); + int minute = (int)(tempTimestamp & MINUTE_MASK); year += 1900; if(year < 1940) year += 100; - DicConsole.DebugWriteLine("ProDOS plugin", "temp_timestamp_left = 0x{0:X4}", temp_timestamp_left); - DicConsole.DebugWriteLine("ProDOS plugin", "temp_timestamp_right = 0x{0:X4}", temp_timestamp_right); - DicConsole.DebugWriteLine("ProDOS plugin", "temp_timestamp = 0x{0:X8}", temp_timestamp); + DicConsole.DebugWriteLine("ProDOS plugin", "temp_timestamp_left = 0x{0:X4}", tempTimestampLeft); + DicConsole.DebugWriteLine("ProDOS plugin", "temp_timestamp_right = 0x{0:X4}", tempTimestampRight); + DicConsole.DebugWriteLine("ProDOS plugin", "temp_timestamp = 0x{0:X8}", tempTimestamp); DicConsole.DebugWriteLine("ProDOS plugin", "Datetime field year {0}, month {1}, day {2}, hour {3}, minute {4}.", year, month, day, hour, minute); @@ -240,20 +235,20 @@ namespace DiscImageChef.Filesystems sbInformation.AppendLine("ProDOS uses 512 bytes/sector while devices uses 2048 bytes/sector.") .AppendLine(); - if(rootDirectoryKeyBlock.header.version != ProDOSVersion1 || - rootDirectoryKeyBlock.header.min_version != ProDOSVersion1) + if(rootDirectoryKeyBlock.header.version != VERSION1 || + rootDirectoryKeyBlock.header.min_version != VERSION1) { sbInformation.AppendLine("Warning! Detected unknown ProDOS version ProDOS filesystem."); sbInformation.AppendLine("All of the following information may be incorrect"); } - if(rootDirectoryKeyBlock.header.version == ProDOSVersion1) + if(rootDirectoryKeyBlock.header.version == VERSION1) sbInformation.AppendLine("ProDOS version 1 used to create this volume."); else sbInformation.AppendFormat("Unknown ProDOS version with field {0} used to create this volume.", rootDirectoryKeyBlock.header.version).AppendLine(); - if(rootDirectoryKeyBlock.header.min_version == ProDOSVersion1) + if(rootDirectoryKeyBlock.header.min_version == VERSION1) sbInformation.AppendLine("ProDOS version 1 at least required for reading this volume."); else sbInformation @@ -275,36 +270,36 @@ namespace DiscImageChef.Filesystems sbInformation.AppendFormat("Bitmap starts at block {0}", rootDirectoryKeyBlock.header.bit_map_pointer) .AppendLine(); - if((rootDirectoryKeyBlock.header.access & ProDOSReadAttribute) == ProDOSReadAttribute) + if((rootDirectoryKeyBlock.header.access & READ_ATTRIBUTE) == READ_ATTRIBUTE) sbInformation.AppendLine("Volume can be read"); - if((rootDirectoryKeyBlock.header.access & ProDOSWriteAttribute) == ProDOSWriteAttribute) + if((rootDirectoryKeyBlock.header.access & WRITE_ATTRIBUTE) == WRITE_ATTRIBUTE) sbInformation.AppendLine("Volume can be written"); - if((rootDirectoryKeyBlock.header.access & ProDOSRenameAttribute) == ProDOSRenameAttribute) + if((rootDirectoryKeyBlock.header.access & RENAME_ATTRIBUTE) == RENAME_ATTRIBUTE) sbInformation.AppendLine("Volume can be renamed"); - if((rootDirectoryKeyBlock.header.access & ProDOSDestroyAttribute) == ProDOSDestroyAttribute) + if((rootDirectoryKeyBlock.header.access & DESTROY_ATTRIBUTE) == DESTROY_ATTRIBUTE) sbInformation.AppendLine("Volume can be destroyed"); - if((rootDirectoryKeyBlock.header.access & ProDOSBackupAttribute) == ProDOSBackupAttribute) + if((rootDirectoryKeyBlock.header.access & BACKUP_ATTRIBUTE) == BACKUP_ATTRIBUTE) sbInformation.AppendLine("Volume must be backed up"); - if((rootDirectoryKeyBlock.header.access & ProDOSReservedAttributeMask) != 0) + if((rootDirectoryKeyBlock.header.access & RESERVED_ATTRIBUTE_MASK) != 0) DicConsole.DebugWriteLine("ProDOS plugin", "Reserved attributes are set: {0:X2}", rootDirectoryKeyBlock.header.access); information = sbInformation.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.VolumeName = rootDirectoryKeyBlock.header.volume_name; + XmlFsType = new FileSystemType(); + XmlFsType.VolumeName = rootDirectoryKeyBlock.header.volume_name; if(dateCorrect) { - xmlFSType.CreationDate = rootDirectoryKeyBlock.header.creation_time; - xmlFSType.CreationDateSpecified = true; + XmlFsType.CreationDate = rootDirectoryKeyBlock.header.creation_time; + XmlFsType.CreationDateSpecified = true; } - xmlFSType.Files = rootDirectoryKeyBlock.header.file_count; - xmlFSType.FilesSpecified = true; - xmlFSType.Clusters = rootDirectoryKeyBlock.header.total_blocks; - xmlFSType.ClusterSize = (int)((partition.End - partition.Start + 1) * imagePlugin.ImageInfo.SectorSize / - (ulong)xmlFSType.Clusters); - xmlFSType.Type = "ProDOS"; + XmlFsType.Files = rootDirectoryKeyBlock.header.file_count; + XmlFsType.FilesSpecified = true; + XmlFsType.Clusters = rootDirectoryKeyBlock.header.total_blocks; + XmlFsType.ClusterSize = (int)((partition.End - partition.Start + 1) * imagePlugin.ImageInfo.SectorSize / + (ulong)XmlFsType.Clusters); + XmlFsType.Type = "ProDOS"; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/QNX4.cs b/DiscImageChef.Filesystems/QNX4.cs index 3a476268e..d2f453749 100644 --- a/DiscImageChef.Filesystems/QNX4.cs +++ b/DiscImageChef.Filesystems/QNX4.cs @@ -108,24 +108,22 @@ namespace DiscImageChef.Filesystems public QNX4() { Name = "QNX4 Plugin"; - PluginUUID = new Guid("E73A63FA-B5B0-48BF-BF82-DA5F0A8170D2"); + PluginUuid = new Guid("E73A63FA-B5B0-48BF-BF82-DA5F0A8170D2"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public QNX4(Encoding encoding) { Name = "QNX4 Plugin"; - PluginUUID = new Guid("E73A63FA-B5B0-48BF-BF82-DA5F0A8170D2"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("E73A63FA-B5B0-48BF-BF82-DA5F0A8170D2"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public QNX4(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "QNX4 Plugin"; - PluginUUID = new Guid("E73A63FA-B5B0-48BF-BF82-DA5F0A8170D2"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("E73A63FA-B5B0-48BF-BF82-DA5F0A8170D2"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -135,10 +133,9 @@ namespace DiscImageChef.Filesystems byte[] sector = imagePlugin.ReadSector(partition.Start + 1); if(sector.Length < 512) return false; - QNX4_Superblock qnxSb; IntPtr sbPtr = Marshal.AllocHGlobal(512); Marshal.Copy(sector, 0, sbPtr, 512); - qnxSb = (QNX4_Superblock)Marshal.PtrToStructure(sbPtr, typeof(QNX4_Superblock)); + QNX4_Superblock qnxSb = (QNX4_Superblock)Marshal.PtrToStructure(sbPtr, typeof(QNX4_Superblock)); Marshal.FreeHGlobal(sbPtr); // Check root directory name @@ -169,10 +166,9 @@ namespace DiscImageChef.Filesystems byte[] sector = imagePlugin.ReadSector(partition.Start + 1); if(sector.Length < 512) return; - QNX4_Superblock qnxSb; IntPtr sbPtr = Marshal.AllocHGlobal(512); Marshal.Copy(sector, 0, sbPtr, 512); - qnxSb = (QNX4_Superblock)Marshal.PtrToStructure(sbPtr, typeof(QNX4_Superblock)); + QNX4_Superblock qnxSb = (QNX4_Superblock)Marshal.PtrToStructure(sbPtr, typeof(QNX4_Superblock)); Marshal.FreeHGlobal(sbPtr); // Too much useless information @@ -253,7 +249,7 @@ namespace DiscImageChef.Filesystems information = $"QNX4 filesystem\nCreated on {DateHandlers.UNIXUnsignedToDateTime(qnxSb.rootDir.di_ftime)}\n"; - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "QNX4 filesystem", Clusters = (long)partition.Length, @@ -263,7 +259,7 @@ namespace DiscImageChef.Filesystems ModificationDate = DateHandlers.UNIXUnsignedToDateTime(qnxSb.rootDir.di_mtime), ModificationDateSpecified = true }; - xmlFSType.Bootable |= qnxSb.boot.di_size != 0 || qnxSb.altBoot.di_size != 0; + XmlFsType.Bootable |= qnxSb.boot.di_size != 0 || qnxSb.altBoot.di_size != 0; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/QNX6.cs b/DiscImageChef.Filesystems/QNX6.cs index eb83af6df..60c84f781 100644 --- a/DiscImageChef.Filesystems/QNX6.cs +++ b/DiscImageChef.Filesystems/QNX6.cs @@ -96,43 +96,41 @@ namespace DiscImageChef.Filesystems public QNX6_RootNode unknown; } - const uint QNX6_SuperBlockSize = 0x1000; - const uint QNX6_BootBlocksSize = 0x2000; - const uint QNX6_Magic = 0x68191122; + const uint QNX6_SUPER_BLOCK_SIZE = 0x1000; + const uint QNX6_BOOT_BLOCKS_SIZE = 0x2000; + const uint QNX6_MAGIC = 0x68191122; public QNX6() { Name = "QNX6 Plugin"; - PluginUUID = new Guid("3E610EA2-4D08-4D70-8947-830CD4C74FC0"); + PluginUuid = new Guid("3E610EA2-4D08-4D70-8947-830CD4C74FC0"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public QNX6(Encoding encoding) { Name = "QNX6 Plugin"; - PluginUUID = new Guid("3E610EA2-4D08-4D70-8947-830CD4C74FC0"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("3E610EA2-4D08-4D70-8947-830CD4C74FC0"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public QNX6(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "QNX6 Plugin"; - PluginUUID = new Guid("3E610EA2-4D08-4D70-8947-830CD4C74FC0"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("3E610EA2-4D08-4D70-8947-830CD4C74FC0"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { - uint sectors = QNX6_SuperBlockSize / imagePlugin.GetSectorSize(); - uint bootSectors = QNX6_BootBlocksSize / imagePlugin.GetSectorSize(); + uint sectors = QNX6_SUPER_BLOCK_SIZE / imagePlugin.GetSectorSize(); + uint bootSectors = QNX6_BOOT_BLOCKS_SIZE / imagePlugin.GetSectorSize(); if(partition.Start + bootSectors + sectors >= partition.End) return false; byte[] audiSector = imagePlugin.ReadSectors(partition.Start, sectors); byte[] sector = imagePlugin.ReadSectors(partition.Start + bootSectors, sectors); - if(sector.Length < QNX6_SuperBlockSize) return false; + if(sector.Length < QNX6_SUPER_BLOCK_SIZE) return false; QNX6_AudiSuperBlock audiSb = new QNX6_AudiSuperBlock(); IntPtr audiPtr = Marshal.AllocHGlobal(Marshal.SizeOf(audiSb)); @@ -146,7 +144,7 @@ namespace DiscImageChef.Filesystems qnxSb = (QNX6_SuperBlock)Marshal.PtrToStructure(sbPtr, typeof(QNX6_SuperBlock)); Marshal.FreeHGlobal(sbPtr); - return qnxSb.magic == QNX6_Magic || audiSb.magic == QNX6_Magic; + return qnxSb.magic == QNX6_MAGIC || audiSb.magic == QNX6_MAGIC; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -154,12 +152,12 @@ namespace DiscImageChef.Filesystems { information = ""; StringBuilder sb = new StringBuilder(); - uint sectors = QNX6_SuperBlockSize / imagePlugin.GetSectorSize(); - uint bootSectors = QNX6_BootBlocksSize / imagePlugin.GetSectorSize(); + uint sectors = QNX6_SUPER_BLOCK_SIZE / imagePlugin.GetSectorSize(); + uint bootSectors = QNX6_BOOT_BLOCKS_SIZE / imagePlugin.GetSectorSize(); byte[] audiSector = imagePlugin.ReadSectors(partition.Start, sectors); byte[] sector = imagePlugin.ReadSectors(partition.Start + bootSectors, sectors); - if(sector.Length < QNX6_SuperBlockSize) return; + if(sector.Length < QNX6_SUPER_BLOCK_SIZE) return; QNX6_AudiSuperBlock audiSb = new QNX6_AudiSuperBlock(); IntPtr audiPtr = Marshal.AllocHGlobal(Marshal.SizeOf(audiSb)); @@ -173,7 +171,7 @@ namespace DiscImageChef.Filesystems qnxSb = (QNX6_SuperBlock)Marshal.PtrToStructure(sbPtr, typeof(QNX6_SuperBlock)); Marshal.FreeHGlobal(sbPtr); - bool audi = false || audiSb.magic == QNX6_Magic; + bool audi = audiSb.magic == QNX6_MAGIC; if(audi) { @@ -186,17 +184,19 @@ namespace DiscImageChef.Filesystems audiSb.freeBlocks * audiSb.blockSize, audiSb.numBlocks, audiSb.numBlocks * audiSb.blockSize).AppendLine(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "QNX6 (Audi) filesystem"; - xmlFSType.Clusters = audiSb.numBlocks; - xmlFSType.ClusterSize = (int)audiSb.blockSize; - xmlFSType.Bootable = true; - xmlFSType.Files = audiSb.numInodes - audiSb.freeInodes; - xmlFSType.FilesSpecified = true; - xmlFSType.FreeClusters = audiSb.freeBlocks; - xmlFSType.FreeClustersSpecified = true; + XmlFsType = new FileSystemType + { + Type = "QNX6 (Audi) filesystem", + Clusters = audiSb.numBlocks, + ClusterSize = (int)audiSb.blockSize, + Bootable = true, + Files = audiSb.numInodes - audiSb.freeInodes, + FilesSpecified = true, + FreeClusters = audiSb.freeBlocks, + FreeClustersSpecified = true, + VolumeSerial = $"{audiSb.serial:X16}" + }; //xmlFSType.VolumeName = CurrentEncoding.GetString(audiSb.id); - xmlFSType.VolumeSerial = $"{audiSb.serial:X16}"; information = sb.ToString(); return; @@ -217,21 +217,23 @@ namespace DiscImageChef.Filesystems qnxSb.freeBlocks * qnxSb.blockSize, qnxSb.numBlocks, qnxSb.numBlocks * qnxSb.blockSize) .AppendLine(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "QNX6 filesystem"; - xmlFSType.Clusters = qnxSb.numBlocks; - xmlFSType.ClusterSize = (int)qnxSb.blockSize; - xmlFSType.Bootable = true; - xmlFSType.Files = qnxSb.numInodes - qnxSb.freeInodes; - xmlFSType.FilesSpecified = true; - xmlFSType.FreeClusters = qnxSb.freeBlocks; - xmlFSType.FreeClustersSpecified = true; + XmlFsType = new FileSystemType + { + Type = "QNX6 filesystem", + Clusters = qnxSb.numBlocks, + ClusterSize = (int)qnxSb.blockSize, + Bootable = true, + Files = qnxSb.numInodes - qnxSb.freeInodes, + FilesSpecified = true, + FreeClusters = qnxSb.freeBlocks, + FreeClustersSpecified = true, + VolumeSerial = $"{qnxSb.serial:X16}", + CreationDate = DateHandlers.UNIXUnsignedToDateTime(qnxSb.ctime), + CreationDateSpecified = true, + ModificationDate = DateHandlers.UNIXUnsignedToDateTime(qnxSb.atime), + ModificationDateSpecified = true + }; //xmlFSType.VolumeName = CurrentEncoding.GetString(qnxSb.volumeid); - xmlFSType.VolumeSerial = $"{qnxSb.serial:X16}"; - xmlFSType.CreationDate = DateHandlers.UNIXUnsignedToDateTime(qnxSb.ctime); - xmlFSType.CreationDateSpecified = true; - xmlFSType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(qnxSb.atime); - xmlFSType.ModificationDateSpecified = true; information = sb.ToString(); } diff --git a/DiscImageChef.Filesystems/RBF.cs b/DiscImageChef.Filesystems/RBF.cs index b0ad47979..0eae4ebe7 100644 --- a/DiscImageChef.Filesystems/RBF.cs +++ b/DiscImageChef.Filesystems/RBF.cs @@ -149,30 +149,28 @@ namespace DiscImageChef.Filesystems } /// Magic number for OS-9. Same for OS-9000? - const uint RBF_Sync = 0x4372757A; - const uint RBF_Cnys = 0x7A757243; + const uint RBF_SYNC = 0x4372757A; + const uint RBF_CNYS = 0x7A757243; public RBF() { Name = "OS-9 Random Block File Plugin"; - PluginUUID = new Guid("E864E45B-0B52-4D29-A858-7BDFA9199FB2"); + PluginUuid = new Guid("E864E45B-0B52-4D29-A858-7BDFA9199FB2"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public RBF(Encoding encoding) { Name = "OS-9 Random Block File Plugin"; - PluginUUID = new Guid("E864E45B-0B52-4D29-A858-7BDFA9199FB2"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("E864E45B-0B52-4D29-A858-7BDFA9199FB2"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public RBF(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "OS-9 Random Block File Plugin"; - PluginUUID = new Guid("E864E45B-0B52-4D29-A858-7BDFA9199FB2"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("E864E45B-0B52-4D29-A858-7BDFA9199FB2"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -184,24 +182,24 @@ namespace DiscImageChef.Filesystems // I've read OS-9/Apple2 has it on sector 15 foreach(ulong location in new[] {0, 4, 15}) { - RBF_IdSector RBFSb = new RBF_IdSector(); + RBF_IdSector rbfSb = new RBF_IdSector(); - uint sbSize = (uint)(Marshal.SizeOf(RBFSb) / imagePlugin.GetSectorSize()); - if(Marshal.SizeOf(RBFSb) % imagePlugin.GetSectorSize() != 0) sbSize++; + uint sbSize = (uint)(Marshal.SizeOf(rbfSb) / imagePlugin.GetSectorSize()); + if(Marshal.SizeOf(rbfSb) % imagePlugin.GetSectorSize() != 0) sbSize++; if(partition.Start + location + sbSize >= imagePlugin.GetSectors()) break; byte[] sector = imagePlugin.ReadSectors(partition.Start + location, sbSize); - if(sector.Length < Marshal.SizeOf(RBFSb)) return false; + if(sector.Length < Marshal.SizeOf(rbfSb)) return false; - RBFSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); - RBF_NewIdSector RBF9000Sb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); + rbfSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); + RBF_NewIdSector rbf9000Sb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); DicConsole.DebugWriteLine("RBF plugin", "magic at {0} = 0x{1:X8} or 0x{2:X8} (expected 0x{3:X8} or 0x{4:X8})", - location, RBFSb.dd_sync, RBF9000Sb.rid_sync, RBF_Sync, RBF_Cnys); + location, rbfSb.dd_sync, rbf9000Sb.rid_sync, RBF_SYNC, RBF_CNYS); - if(RBFSb.dd_sync == RBF_Sync || RBF9000Sb.rid_sync == RBF_Sync || RBF9000Sb.rid_sync == RBF_Cnys) + if(rbfSb.dd_sync == RBF_SYNC || rbf9000Sb.rid_sync == RBF_SYNC || rbf9000Sb.rid_sync == RBF_CNYS) return true; } @@ -214,134 +212,132 @@ namespace DiscImageChef.Filesystems information = ""; if(imagePlugin.GetSectorSize() < 256) return; - RBF_IdSector RBFSb = new RBF_IdSector(); - RBF_NewIdSector RBF9000Sb = new RBF_NewIdSector(); + RBF_IdSector rbfSb = new RBF_IdSector(); + RBF_NewIdSector rbf9000Sb = new RBF_NewIdSector(); foreach(ulong location in new[] {0, 4, 15}) { - uint sbSize = (uint)(Marshal.SizeOf(RBFSb) / imagePlugin.GetSectorSize()); - if(Marshal.SizeOf(RBFSb) % imagePlugin.GetSectorSize() != 0) sbSize++; + uint sbSize = (uint)(Marshal.SizeOf(rbfSb) / imagePlugin.GetSectorSize()); + if(Marshal.SizeOf(rbfSb) % imagePlugin.GetSectorSize() != 0) sbSize++; byte[] sector = imagePlugin.ReadSectors(partition.Start + location, sbSize); - if(sector.Length < Marshal.SizeOf(RBFSb)) return; + if(sector.Length < Marshal.SizeOf(rbfSb)) return; - RBFSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); - RBF9000Sb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); + rbfSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); + rbf9000Sb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); DicConsole.DebugWriteLine("RBF plugin", "magic at {0} = 0x{1:X8} or 0x{2:X8} (expected 0x{3:X8} or 0x{4:X8})", - location, RBFSb.dd_sync, RBF9000Sb.rid_sync, RBF_Sync, RBF_Cnys); + location, rbfSb.dd_sync, rbf9000Sb.rid_sync, RBF_SYNC, RBF_CNYS); - if(RBFSb.dd_sync == RBF_Sync || RBF9000Sb.rid_sync == RBF_Sync || RBF9000Sb.rid_sync == RBF_Cnys) break; + if(rbfSb.dd_sync == RBF_SYNC || rbf9000Sb.rid_sync == RBF_SYNC || rbf9000Sb.rid_sync == RBF_CNYS) break; } - if(RBFSb.dd_sync != RBF_Sync && RBF9000Sb.rid_sync != RBF_Sync && RBF9000Sb.rid_sync != RBF_Cnys) return; + if(rbfSb.dd_sync != RBF_SYNC && rbf9000Sb.rid_sync != RBF_SYNC && rbf9000Sb.rid_sync != RBF_CNYS) return; - if(RBF9000Sb.rid_sync == RBF_Cnys) RBF9000Sb = BigEndianMarshal.SwapStructureMembersEndian(RBF9000Sb); + if(rbf9000Sb.rid_sync == RBF_CNYS) rbf9000Sb = BigEndianMarshal.SwapStructureMembersEndian(rbf9000Sb); StringBuilder sb = new StringBuilder(); sb.AppendLine("OS-9 Random Block File"); - if(RBF9000Sb.rid_sync == RBF_Sync) + if(rbf9000Sb.rid_sync == RBF_SYNC) { - sb.AppendFormat("Volume ID: {0:X8}", RBF9000Sb.rid_diskid).AppendLine(); - sb.AppendFormat("{0} blocks in volume", RBF9000Sb.rid_totblocks).AppendLine(); - sb.AppendFormat("{0} cylinders", RBF9000Sb.rid_cylinders).AppendLine(); - sb.AppendFormat("{0} blocks in cylinder 0", RBF9000Sb.rid_cyl0size).AppendLine(); - sb.AppendFormat("{0} blocks per cylinder", RBF9000Sb.rid_cylsize).AppendLine(); - sb.AppendFormat("{0} heads", RBF9000Sb.rid_heads).AppendLine(); - sb.AppendFormat("{0} bytes per block", RBF9000Sb.rid_blocksize).AppendLine(); + sb.AppendFormat("Volume ID: {0:X8}", rbf9000Sb.rid_diskid).AppendLine(); + sb.AppendFormat("{0} blocks in volume", rbf9000Sb.rid_totblocks).AppendLine(); + sb.AppendFormat("{0} cylinders", rbf9000Sb.rid_cylinders).AppendLine(); + sb.AppendFormat("{0} blocks in cylinder 0", rbf9000Sb.rid_cyl0size).AppendLine(); + sb.AppendFormat("{0} blocks per cylinder", rbf9000Sb.rid_cylsize).AppendLine(); + sb.AppendFormat("{0} heads", rbf9000Sb.rid_heads).AppendLine(); + sb.AppendFormat("{0} bytes per block", rbf9000Sb.rid_blocksize).AppendLine(); // TODO: Convert to flags? - if((RBF9000Sb.rid_format & 0x01) == 0x01) sb.AppendLine("Disk is double sided"); - else sb.AppendLine("Disk is single sided"); - if((RBF9000Sb.rid_format & 0x02) == 0x02) sb.AppendLine("Disk is double density"); - else sb.AppendLine("Disk is single density"); - if((RBF9000Sb.rid_format & 0x10) == 0x10) sb.AppendLine("Disk is 384 TPI"); - else if((RBF9000Sb.rid_format & 0x08) == 0x08) sb.AppendLine("Disk is 192 TPI"); - else if((RBF9000Sb.rid_format & 0x04) == 0x04) sb.AppendLine("Disk is 96 TPI or 135 TPI"); + sb.AppendLine((rbf9000Sb.rid_format & 0x01) == 0x01 ? "Disk is double sided" : "Disk is single sided"); + sb.AppendLine((rbf9000Sb.rid_format & 0x02) == 0x02 + ? "Disk is double density" + : "Disk is single density"); + if((rbf9000Sb.rid_format & 0x10) == 0x10) sb.AppendLine("Disk is 384 TPI"); + else if((rbf9000Sb.rid_format & 0x08) == 0x08) sb.AppendLine("Disk is 192 TPI"); + else if((rbf9000Sb.rid_format & 0x04) == 0x04) sb.AppendLine("Disk is 96 TPI or 135 TPI"); else sb.AppendLine("Disk is 48 TPI"); sb.AppendFormat("Allocation bitmap descriptor starts at block {0}", - RBF9000Sb.rid_bitmap == 0 ? 1 : RBF9000Sb.rid_bitmap).AppendLine(); - if(RBF9000Sb.rid_firstboot > 0) - sb.AppendFormat("Debugger descriptor starts at block {0}", RBF9000Sb.rid_firstboot).AppendLine(); - if(RBF9000Sb.rid_bootfile > 0) - sb.AppendFormat("Boot file descriptor starts at block {0}", RBF9000Sb.rid_bootfile).AppendLine(); - sb.AppendFormat("Root directory descriptor starts at block {0}", RBF9000Sb.rid_rootdir).AppendLine(); - sb.AppendFormat("Disk is owned by group {0} user {1}", RBF9000Sb.rid_group, RBF9000Sb.rid_owner) + rbf9000Sb.rid_bitmap == 0 ? 1 : rbf9000Sb.rid_bitmap).AppendLine(); + if(rbf9000Sb.rid_firstboot > 0) + sb.AppendFormat("Debugger descriptor starts at block {0}", rbf9000Sb.rid_firstboot).AppendLine(); + if(rbf9000Sb.rid_bootfile > 0) + sb.AppendFormat("Boot file descriptor starts at block {0}", rbf9000Sb.rid_bootfile).AppendLine(); + sb.AppendFormat("Root directory descriptor starts at block {0}", rbf9000Sb.rid_rootdir).AppendLine(); + sb.AppendFormat("Disk is owned by group {0} user {1}", rbf9000Sb.rid_group, rbf9000Sb.rid_owner) .AppendLine(); - sb.AppendFormat("Volume was created on {0}", DateHandlers.UNIXToDateTime(RBF9000Sb.rid_ctime)) + sb.AppendFormat("Volume was created on {0}", DateHandlers.UNIXToDateTime(rbf9000Sb.rid_ctime)) .AppendLine(); sb.AppendFormat("Volume's identification block was last written on {0}", - DateHandlers.UNIXToDateTime(RBF9000Sb.rid_mtime)).AppendLine(); - sb.AppendFormat("Volume name: {0}", StringHandlers.CToString(RBF9000Sb.rid_name, CurrentEncoding)) + DateHandlers.UNIXToDateTime(rbf9000Sb.rid_mtime)).AppendLine(); + sb.AppendFormat("Volume name: {0}", StringHandlers.CToString(rbf9000Sb.rid_name, CurrentEncoding)) .AppendLine(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "OS-9 Random Block File", - Bootable = RBF9000Sb.rid_bootfile > 0, - ClusterSize = RBF9000Sb.rid_blocksize, - Clusters = RBF9000Sb.rid_totblocks, - CreationDate = DateHandlers.UNIXToDateTime(RBF9000Sb.rid_ctime), + Bootable = rbf9000Sb.rid_bootfile > 0, + ClusterSize = rbf9000Sb.rid_blocksize, + Clusters = rbf9000Sb.rid_totblocks, + CreationDate = DateHandlers.UNIXToDateTime(rbf9000Sb.rid_ctime), CreationDateSpecified = true, - ModificationDate = DateHandlers.UNIXToDateTime(RBF9000Sb.rid_mtime), + ModificationDate = DateHandlers.UNIXToDateTime(rbf9000Sb.rid_mtime), ModificationDateSpecified = true, - VolumeName = StringHandlers.CToString(RBF9000Sb.rid_name, CurrentEncoding), - VolumeSerial = $"{RBF9000Sb.rid_diskid:X8}" + VolumeName = StringHandlers.CToString(rbf9000Sb.rid_name, CurrentEncoding), + VolumeSerial = $"{rbf9000Sb.rid_diskid:X8}" }; } else { - sb.AppendFormat("Volume ID: {0:X4}", RBFSb.dd_dsk).AppendLine(); - sb.AppendFormat("{0} blocks in volume", LSNToUInt32(RBFSb.dd_tot)).AppendLine(); - sb.AppendFormat("{0} tracks", RBFSb.dd_tks).AppendLine(); - sb.AppendFormat("{0} sectors per track", RBFSb.dd_spt).AppendLine(); - sb.AppendFormat("{0} bytes per sector", 256 << RBFSb.dd_lsnsize).AppendLine(); - sb.AppendFormat("{0} sectors per cluster ({1} bytes)", RBFSb.dd_bit, - RBFSb.dd_bit * (256 << RBFSb.dd_lsnsize)).AppendLine(); + sb.AppendFormat("Volume ID: {0:X4}", rbfSb.dd_dsk).AppendLine(); + sb.AppendFormat("{0} blocks in volume", LSNToUInt32(rbfSb.dd_tot)).AppendLine(); + sb.AppendFormat("{0} tracks", rbfSb.dd_tks).AppendLine(); + sb.AppendFormat("{0} sectors per track", rbfSb.dd_spt).AppendLine(); + sb.AppendFormat("{0} bytes per sector", 256 << rbfSb.dd_lsnsize).AppendLine(); + sb.AppendFormat("{0} sectors per cluster ({1} bytes)", rbfSb.dd_bit, + rbfSb.dd_bit * (256 << rbfSb.dd_lsnsize)).AppendLine(); // TODO: Convert to flags? - if((RBFSb.dd_fmt & 0x01) == 0x01) sb.AppendLine("Disk is double sided"); - else sb.AppendLine("Disk is single sided"); - if((RBFSb.dd_fmt & 0x02) == 0x02) sb.AppendLine("Disk is double density"); - else sb.AppendLine("Disk is single density"); - if((RBFSb.dd_fmt & 0x10) == 0x10) sb.AppendLine("Disk is 384 TPI"); - else if((RBFSb.dd_fmt & 0x08) == 0x08) sb.AppendLine("Disk is 192 TPI"); - else if((RBFSb.dd_fmt & 0x04) == 0x04) sb.AppendLine("Disk is 96 TPI or 135 TPI"); + sb.AppendLine((rbfSb.dd_fmt & 0x01) == 0x01 ? "Disk is double sided" : "Disk is single sided"); + sb.AppendLine((rbfSb.dd_fmt & 0x02) == 0x02 ? "Disk is double density" : "Disk is single density"); + if((rbfSb.dd_fmt & 0x10) == 0x10) sb.AppendLine("Disk is 384 TPI"); + else if((rbfSb.dd_fmt & 0x08) == 0x08) sb.AppendLine("Disk is 192 TPI"); + else if((rbfSb.dd_fmt & 0x04) == 0x04) sb.AppendLine("Disk is 96 TPI or 135 TPI"); else sb.AppendLine("Disk is 48 TPI"); sb.AppendFormat("Allocation bitmap descriptor starts at block {0}", - RBFSb.dd_maplsn == 0 ? 1 : RBFSb.dd_maplsn).AppendLine(); - sb.AppendFormat("{0} bytes in allocation bitmap", RBFSb.dd_map).AppendLine(); - if(LSNToUInt32(RBFSb.dd_bt) > 0 && RBFSb.dd_bsz > 0) - sb.AppendFormat("Boot file starts at block {0} and has {1} bytes", LSNToUInt32(RBFSb.dd_bt), - RBFSb.dd_bsz).AppendLine(); - sb.AppendFormat("Root directory descriptor starts at block {0}", LSNToUInt32(RBFSb.dd_dir)) + rbfSb.dd_maplsn == 0 ? 1 : rbfSb.dd_maplsn).AppendLine(); + sb.AppendFormat("{0} bytes in allocation bitmap", rbfSb.dd_map).AppendLine(); + if(LSNToUInt32(rbfSb.dd_bt) > 0 && rbfSb.dd_bsz > 0) + sb.AppendFormat("Boot file starts at block {0} and has {1} bytes", LSNToUInt32(rbfSb.dd_bt), + rbfSb.dd_bsz).AppendLine(); + sb.AppendFormat("Root directory descriptor starts at block {0}", LSNToUInt32(rbfSb.dd_dir)) .AppendLine(); - sb.AppendFormat("Disk is owned by user {0}", RBFSb.dd_own).AppendLine(); - sb.AppendFormat("Volume was created on {0}", DateHandlers.OS9ToDateTime(RBFSb.dd_dat)).AppendLine(); - sb.AppendFormat("Volume attributes: {0:X2}", RBFSb.dd_att).AppendLine(); - sb.AppendFormat("Volume name: {0}", StringHandlers.CToString(RBFSb.dd_nam, CurrentEncoding)) + sb.AppendFormat("Disk is owned by user {0}", rbfSb.dd_own).AppendLine(); + sb.AppendFormat("Volume was created on {0}", DateHandlers.OS9ToDateTime(rbfSb.dd_dat)).AppendLine(); + sb.AppendFormat("Volume attributes: {0:X2}", rbfSb.dd_att).AppendLine(); + sb.AppendFormat("Volume name: {0}", StringHandlers.CToString(rbfSb.dd_nam, CurrentEncoding)) .AppendLine(); - sb.AppendFormat("Path descriptor options: {0}", StringHandlers.CToString(RBFSb.dd_opt, CurrentEncoding)) + sb.AppendFormat("Path descriptor options: {0}", StringHandlers.CToString(rbfSb.dd_opt, CurrentEncoding)) .AppendLine(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "OS-9 Random Block File", - Bootable = LSNToUInt32(RBFSb.dd_bt) > 0 && RBFSb.dd_bsz > 0, - ClusterSize = RBFSb.dd_bit * (256 << RBFSb.dd_lsnsize), - Clusters = LSNToUInt32(RBFSb.dd_tot), - CreationDate = DateHandlers.OS9ToDateTime(RBFSb.dd_dat), + Bootable = LSNToUInt32(rbfSb.dd_bt) > 0 && rbfSb.dd_bsz > 0, + ClusterSize = rbfSb.dd_bit * (256 << rbfSb.dd_lsnsize), + Clusters = LSNToUInt32(rbfSb.dd_tot), + CreationDate = DateHandlers.OS9ToDateTime(rbfSb.dd_dat), CreationDateSpecified = true, - VolumeName = StringHandlers.CToString(RBFSb.dd_nam, CurrentEncoding), - VolumeSerial = $"{RBFSb.dd_dsk:X4}" + VolumeName = StringHandlers.CToString(rbfSb.dd_nam, CurrentEncoding), + VolumeSerial = $"{rbfSb.dd_dsk:X4}" }; } information = sb.ToString(); } - public static uint LSNToUInt32(byte[] lsn) + static uint LSNToUInt32(byte[] lsn) { if(lsn == null || lsn.Length != 3) return 0; diff --git a/DiscImageChef.Filesystems/RT11.cs b/DiscImageChef.Filesystems/RT11.cs index 2fd374d66..6369770aa 100644 --- a/DiscImageChef.Filesystems/RT11.cs +++ b/DiscImageChef.Filesystems/RT11.cs @@ -47,24 +47,22 @@ namespace DiscImageChef.Filesystems public RT11() { Name = "RT-11 file system"; - PluginUUID = new Guid("DB3E2F98-8F98-463C-8126-E937843DA024"); + PluginUuid = new Guid("DB3E2F98-8F98-463C-8126-E937843DA024"); CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); } public RT11(Encoding encoding) { Name = "RT-11 file system"; - PluginUUID = new Guid("DB3E2F98-8F98-463C-8126-E937843DA024"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("DB3E2F98-8F98-463C-8126-E937843DA024"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } public RT11(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "RT-11 file system"; - PluginUUID = new Guid("DB3E2F98-8F98-463C-8126-E937843DA024"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("DB3E2F98-8F98-463C-8126-E937843DA024"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -73,12 +71,11 @@ namespace DiscImageChef.Filesystems if(imagePlugin.GetSectorSize() < 512) return false; - byte[] magic_b = new byte[12]; - string magic; - byte[] hb_sector = imagePlugin.ReadSector(1 + partition.Start); + byte[] magicB = new byte[12]; + byte[] hbSector = imagePlugin.ReadSector(1 + partition.Start); - Array.Copy(hb_sector, 0x1F0, magic_b, 0, 12); - magic = Encoding.ASCII.GetString(magic_b); + Array.Copy(hbSector, 0x1F0, magicB, 0, 12); + string magic = Encoding.ASCII.GetString(magicB); return magic == "DECRT11A "; } @@ -89,12 +86,11 @@ namespace DiscImageChef.Filesystems information = ""; StringBuilder sb = new StringBuilder(); - RT11HomeBlock homeblock; - byte[] hb_sector = imagePlugin.ReadSector(1 + partition.Start); + byte[] hbSector = imagePlugin.ReadSector(1 + partition.Start); - GCHandle handle = GCHandle.Alloc(hb_sector, GCHandleType.Pinned); - homeblock = (RT11HomeBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(RT11HomeBlock)); + GCHandle handle = GCHandle.Alloc(hbSector, GCHandleType.Pinned); + RT11HomeBlock homeblock = (RT11HomeBlock)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(RT11HomeBlock)); handle.Free(); /* TODO: Is this correct? @@ -107,7 +103,7 @@ namespace DiscImageChef.Filesystems * MOV 1,@R0 */ ushort check = 0; - for(int i = 0; i < 512; i += 2) check += BitConverter.ToUInt16(hb_sector, i); + for(int i = 0; i < 512; i += 2) check += BitConverter.ToUInt16(hbSector, i); sb.AppendFormat("Volume format is {0}", StringHandlers.SpacePaddedToString(homeblock.format, CurrentEncoding)).AppendLine(); @@ -122,7 +118,7 @@ namespace DiscImageChef.Filesystems byte[] bootBlock = imagePlugin.ReadSector(0); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "RT-11", ClusterSize = homeblock.cluster * 512, diff --git a/DiscImageChef.Filesystems/Reiser.cs b/DiscImageChef.Filesystems/Reiser.cs index fad312ada..6126ac974 100644 --- a/DiscImageChef.Filesystems/Reiser.cs +++ b/DiscImageChef.Filesystems/Reiser.cs @@ -88,36 +88,34 @@ namespace DiscImageChef.Filesystems readonly byte[] Reiser35_Magic = {0x52, 0x65, 0x49, 0x73, 0x45, 0x72, 0x46, 0x73, 0x00, 0x00}; readonly byte[] Reiser36_Magic = {0x52, 0x65, 0x49, 0x73, 0x45, 0x72, 0x32, 0x46, 0x73, 0x00}; readonly byte[] ReiserJr_Magic = {0x52, 0x65, 0x49, 0x73, 0x45, 0x72, 0x33, 0x46, 0x73, 0x00}; - const uint Reiser_SuperOffset = 0x10000; + const uint REISER_SUPER_OFFSET = 0x10000; public Reiser() { Name = "Reiser Filesystem Plugin"; - PluginUUID = new Guid("1D8CD8B8-27E6-410F-9973-D16409225FBA"); + PluginUuid = new Guid("1D8CD8B8-27E6-410F-9973-D16409225FBA"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public Reiser(Encoding encoding) { Name = "Reiser Filesystem Plugin"; - PluginUUID = new Guid("1D8CD8B8-27E6-410F-9973-D16409225FBA"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("1D8CD8B8-27E6-410F-9973-D16409225FBA"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public Reiser(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Reiser Filesystem Plugin"; - PluginUUID = new Guid("1D8CD8B8-27E6-410F-9973-D16409225FBA"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("1D8CD8B8-27E6-410F-9973-D16409225FBA"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { if(imagePlugin.GetSectorSize() < 512) return false; - uint sbAddr = Reiser_SuperOffset / imagePlugin.GetSectorSize(); + uint sbAddr = REISER_SUPER_OFFSET / imagePlugin.GetSectorSize(); if(sbAddr == 0) sbAddr = 1; Reiser_Superblock reiserSb = new Reiser_Superblock(); @@ -145,7 +143,7 @@ namespace DiscImageChef.Filesystems information = ""; if(imagePlugin.GetSectorSize() < 512) return; - uint sbAddr = Reiser_SuperOffset / imagePlugin.GetSectorSize(); + uint sbAddr = REISER_SUPER_OFFSET / imagePlugin.GetSectorSize(); if(sbAddr == 0) sbAddr = 1; Reiser_Superblock reiserSb = new Reiser_Superblock(); @@ -184,19 +182,19 @@ namespace DiscImageChef.Filesystems information = sb.ToString(); - xmlFSType = new FileSystemType(); - if(Reiser35_Magic.SequenceEqual(reiserSb.magic)) xmlFSType.Type = "Reiser 3.5 filesystem"; - else if(Reiser36_Magic.SequenceEqual(reiserSb.magic)) xmlFSType.Type = "Reiser 3.6 filesystem"; - else if(ReiserJr_Magic.SequenceEqual(reiserSb.magic)) xmlFSType.Type = "Reiser Jr. filesystem"; - xmlFSType.ClusterSize = reiserSb.blocksize; - xmlFSType.Clusters = reiserSb.block_count; - xmlFSType.FreeClusters = reiserSb.free_blocks; - xmlFSType.FreeClustersSpecified = true; - xmlFSType.Dirty = reiserSb.umount_state == 2; + XmlFsType = new FileSystemType(); + if(Reiser35_Magic.SequenceEqual(reiserSb.magic)) XmlFsType.Type = "Reiser 3.5 filesystem"; + else if(Reiser36_Magic.SequenceEqual(reiserSb.magic)) XmlFsType.Type = "Reiser 3.6 filesystem"; + else if(ReiserJr_Magic.SequenceEqual(reiserSb.magic)) XmlFsType.Type = "Reiser Jr. filesystem"; + XmlFsType.ClusterSize = reiserSb.blocksize; + XmlFsType.Clusters = reiserSb.block_count; + XmlFsType.FreeClusters = reiserSb.free_blocks; + XmlFsType.FreeClustersSpecified = true; + XmlFsType.Dirty = reiserSb.umount_state == 2; if(reiserSb.version < 2) return; - xmlFSType.VolumeName = CurrentEncoding.GetString(reiserSb.label); - xmlFSType.VolumeSerial = reiserSb.uuid.ToString(); + XmlFsType.VolumeName = CurrentEncoding.GetString(reiserSb.label); + XmlFsType.VolumeSerial = reiserSb.uuid.ToString(); } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/Reiser4.cs b/DiscImageChef.Filesystems/Reiser4.cs index 889ade93e..4c8f483d1 100644 --- a/DiscImageChef.Filesystems/Reiser4.cs +++ b/DiscImageChef.Filesystems/Reiser4.cs @@ -55,36 +55,34 @@ namespace DiscImageChef.Filesystems readonly byte[] Reiser4_Magic = {0x52, 0x65, 0x49, 0x73, 0x45, 0x72, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - const uint Reiser4_SuperOffset = 0x10000; + const uint REISER4_SUPER_OFFSET = 0x10000; public Reiser4() { Name = "Reiser4 Filesystem Plugin"; - PluginUUID = new Guid("301F2D00-E8D5-4F04-934E-81DFB21D15BA"); + PluginUuid = new Guid("301F2D00-E8D5-4F04-934E-81DFB21D15BA"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public Reiser4(Encoding encoding) { Name = "Reiser4 Filesystem Plugin"; - PluginUUID = new Guid("301F2D00-E8D5-4F04-934E-81DFB21D15BA"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("301F2D00-E8D5-4F04-934E-81DFB21D15BA"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public Reiser4(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Reiser4 Filesystem Plugin"; - PluginUUID = new Guid("301F2D00-E8D5-4F04-934E-81DFB21D15BA"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("301F2D00-E8D5-4F04-934E-81DFB21D15BA"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { if(imagePlugin.GetSectorSize() < 512) return false; - uint sbAddr = Reiser4_SuperOffset / imagePlugin.GetSectorSize(); + uint sbAddr = REISER4_SUPER_OFFSET / imagePlugin.GetSectorSize(); if(sbAddr == 0) sbAddr = 1; Reiser4_Superblock reiserSb = new Reiser4_Superblock(); @@ -111,7 +109,7 @@ namespace DiscImageChef.Filesystems information = ""; if(imagePlugin.GetSectorSize() < 512) return; - uint sbAddr = Reiser4_SuperOffset / imagePlugin.GetSectorSize(); + uint sbAddr = REISER4_SUPER_OFFSET / imagePlugin.GetSectorSize(); if(sbAddr == 0) sbAddr = 1; Reiser4_Superblock reiserSb = new Reiser4_Superblock(); @@ -139,13 +137,14 @@ namespace DiscImageChef.Filesystems information = sb.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "Reiser 4 filesystem"; - xmlFSType.ClusterSize = reiserSb.blocksize; - xmlFSType.Clusters = - (long)((partition.End - partition.Start) * imagePlugin.GetSectorSize() / reiserSb.blocksize); - xmlFSType.VolumeName = StringHandlers.CToString(reiserSb.label, CurrentEncoding); - xmlFSType.VolumeSerial = reiserSb.uuid.ToString(); + XmlFsType = new FileSystemType + { + Type = "Reiser 4 filesystem", + ClusterSize = reiserSb.blocksize, + Clusters = (long)((partition.End - partition.Start) * imagePlugin.GetSectorSize() / reiserSb.blocksize), + VolumeName = StringHandlers.CToString(reiserSb.label, CurrentEncoding), + VolumeSerial = reiserSb.uuid.ToString() + }; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/SFS.cs b/DiscImageChef.Filesystems/SFS.cs index e9bdfe793..726a7b5ec 100644 --- a/DiscImageChef.Filesystems/SFS.cs +++ b/DiscImageChef.Filesystems/SFS.cs @@ -45,24 +45,22 @@ namespace DiscImageChef.Filesystems public SFS() { Name = "SmartFileSystem"; - PluginUUID = new Guid("26550C19-3671-4A2D-BC2F-F20CEB7F48DC"); + PluginUuid = new Guid("26550C19-3671-4A2D-BC2F-F20CEB7F48DC"); CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); } public SFS(Encoding encoding) { Name = "SmartFileSystem"; - PluginUUID = new Guid("26550C19-3671-4A2D-BC2F-F20CEB7F48DC"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("26550C19-3671-4A2D-BC2F-F20CEB7F48DC"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } public SFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "SmartFileSystem"; - PluginUUID = new Guid("26550C19-3671-4A2D-BC2F-F20CEB7F48DC"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-1"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("26550C19-3671-4A2D-BC2F-F20CEB7F48DC"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-1"); } [Flags] @@ -120,9 +118,8 @@ namespace DiscImageChef.Filesystems public override void GetInformation(ImagePlugin imagePlugin, Partition partition, out string information) { - byte[] RootBlockSector = imagePlugin.ReadSector(partition.Start); - RootBlock rootBlock; - rootBlock = BigEndianMarshal.ByteArrayToStructureBigEndian(RootBlockSector); + byte[] rootBlockSector = imagePlugin.ReadSector(partition.Start); + RootBlock rootBlock = BigEndianMarshal.ByteArrayToStructureBigEndian(rootBlockSector); StringBuilder sbInformation = new StringBuilder(); @@ -151,7 +148,7 @@ namespace DiscImageChef.Filesystems sbInformation.AppendLine("Volume moves deleted files to a recycled folder"); information = sbInformation.ToString(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { CreationDate = DateHandlers.UNIXUnsignedToDateTime(rootBlock.datecreated).AddYears(8), CreationDateSpecified = true, diff --git a/DiscImageChef.Filesystems/SolarFS.cs b/DiscImageChef.Filesystems/SolarFS.cs index ad2715376..53014318f 100644 --- a/DiscImageChef.Filesystems/SolarFS.cs +++ b/DiscImageChef.Filesystems/SolarFS.cs @@ -46,24 +46,22 @@ namespace DiscImageChef.Filesystems public SolarFS() { Name = "Solar_OS filesystem"; - PluginUUID = new Guid("EA3101C1-E777-4B4F-B5A3-8C57F50F6E65"); + PluginUuid = new Guid("EA3101C1-E777-4B4F-B5A3-8C57F50F6E65"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public SolarFS(Encoding encoding) { Name = "Solar_OS filesystem"; - PluginUUID = new Guid("EA3101C1-E777-4B4F-B5A3-8C57F50F6E65"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("EA3101C1-E777-4B4F-B5A3-8C57F50F6E65"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public SolarFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Solar_OS filesystem"; - PluginUUID = new Guid("EA3101C1-E777-4B4F-B5A3-8C57F50F6E65"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("EA3101C1-E777-4B4F-B5A3-8C57F50F6E65"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -71,19 +69,16 @@ namespace DiscImageChef.Filesystems if(2 + partition.Start >= partition.End) return false; byte signature; // 0x29 - string fs_type; // "SOL_FS " byte[] bpb = imagePlugin.ReadSector(0 + partition.Start); - byte[] fs_type_b = new byte[8]; + byte[] fsTypeB = new byte[8]; signature = bpb[0x25]; - Array.Copy(bpb, 0x35, fs_type_b, 0, 8); - fs_type = StringHandlers.CToString(fs_type_b); + Array.Copy(bpb, 0x35, fsTypeB, 0, 8); + string fsType = StringHandlers.CToString(fsTypeB); - if(signature == 0x29 && fs_type == "SOL_FS ") return true; - - return false; + return signature == 0x29 && fsType == "SOL_FS "; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -92,86 +87,89 @@ namespace DiscImageChef.Filesystems information = ""; StringBuilder sb = new StringBuilder(); - byte[] bpb_sector = imagePlugin.ReadSector(0 + partition.Start); - byte[] bpb_strings; + byte[] bpbSector = imagePlugin.ReadSector(0 + partition.Start); - SolarOSParameterBlock BPB = new SolarOSParameterBlock(); - 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); - BPB.vol_name = StringHandlers.CToString(bpb_strings, CurrentEncoding); - bpb_strings = new byte[8]; - Array.Copy(bpb_sector, 0x35, bpb_strings, 0, 8); - BPB.fs_type = StringHandlers.CToString(bpb_strings, CurrentEncoding); + SolarOSParameterBlock bpb = new SolarOSParameterBlock + { + bps = BitConverter.ToUInt16(bpbSector, 0x0B), + root_ent = BitConverter.ToUInt16(bpbSector, 0x10), + sectors = BitConverter.ToUInt16(bpbSector, 0x12), + media = bpbSector[0x14], + spfat = BitConverter.ToUInt16(bpbSector, 0x15), + sptrk = BitConverter.ToUInt16(bpbSector, 0x17), + heads = BitConverter.ToUInt16(bpbSector, 0x19), + signature = bpbSector[0x25] + }; + byte[] bpbStrings = new byte[8]; + Array.Copy(bpbSector, 0x03, bpbStrings, 0, 8); + bpb.OEMName = StringHandlers.CToString(bpbStrings); + bpbStrings = new byte[8]; + Array.Copy(bpbSector, 0x2A, bpbStrings, 0, 11); + bpb.vol_name = StringHandlers.CToString(bpbStrings, CurrentEncoding); + bpbStrings = new byte[8]; + Array.Copy(bpbSector, 0x35, bpbStrings, 0, 8); + bpb.fs_type = StringHandlers.CToString(bpbStrings, CurrentEncoding); - 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); + bpb.x86_jump = new byte[3]; + Array.Copy(bpbSector, 0x00, bpb.x86_jump, 0, 3); + bpb.unk1 = bpbSector[0x0D]; + bpb.unk2 = BitConverter.ToUInt16(bpbSector, 0x0E); + bpb.unk3 = new byte[10]; + Array.Copy(bpbSector, 0x1B, bpb.unk3, 0, 10); + bpb.unk4 = BitConverter.ToUInt32(bpbSector, 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.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); + 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); sb.AppendLine("Solar_OS filesystem"); - sb.AppendFormat("Media descriptor: 0x{0:X2}", BPB.media).AppendLine(); - sb.AppendFormat("{0} bytes per sector", BPB.bps).AppendLine(); + sb.AppendFormat("Media descriptor: 0x{0:X2}", bpb.media).AppendLine(); + sb.AppendFormat("{0} bytes per sector", bpb.bps).AppendLine(); if(imagePlugin.GetSectorSize() == 2336 || imagePlugin.GetSectorSize() == 2352 || imagePlugin.GetSectorSize() == 2448) { - if(BPB.bps != imagePlugin.GetSectorSize()) + if(bpb.bps != imagePlugin.GetSectorSize()) sb .AppendFormat("WARNING: Filesystem describes a {0} bytes/sector, while device describes a {1} bytes/sector", - BPB.bps, 2048).AppendLine(); + bpb.bps, 2048).AppendLine(); } - else if(BPB.bps != imagePlugin.GetSectorSize()) + else if(bpb.bps != imagePlugin.GetSectorSize()) 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(); - if(BPB.sectors > imagePlugin.GetSectors()) + bpb.bps, imagePlugin.GetSectorSize()).AppendLine(); + sb.AppendFormat("{0} sectors on volume ({1} bytes)", bpb.sectors, bpb.sectors * bpb.bps).AppendLine(); + if(bpb.sectors > imagePlugin.GetSectors()) sb.AppendFormat("WARNING: Filesystem describes a {0} sectors volume, bigger than device ({1} sectors)", - BPB.sectors, imagePlugin.GetSectors()); - 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(); + bpb.sectors, imagePlugin.GetSectors()); + 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(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "SolarFS"; - xmlFSType.Clusters = BPB.sectors; - xmlFSType.ClusterSize = BPB.bps; - xmlFSType.VolumeName = BPB.vol_name; + XmlFsType = new FileSystemType + { + Type = "SolarFS", + Clusters = bpb.sectors, + ClusterSize = bpb.bps, + VolumeName = bpb.vol_name + }; information = sb.ToString(); } diff --git a/DiscImageChef.Filesystems/Squash.cs b/DiscImageChef.Filesystems/Squash.cs index ed1725204..5b3c1bcfe 100644 --- a/DiscImageChef.Filesystems/Squash.cs +++ b/DiscImageChef.Filesystems/Squash.cs @@ -45,24 +45,22 @@ namespace DiscImageChef.Filesystems public Squash() { Name = "Squash filesystem"; - PluginUUID = new Guid("F8F6E46F-7A2A-48E3-9C0A-46AF4DC29E09"); + PluginUuid = new Guid("F8F6E46F-7A2A-48E3-9C0A-46AF4DC29E09"); CurrentEncoding = Encoding.UTF8; } public Squash(Encoding encoding) { Name = "Squash filesystem"; - PluginUUID = new Guid("F8F6E46F-7A2A-48E3-9C0A-46AF4DC29E09"); - if(encoding == null) CurrentEncoding = Encoding.UTF8; - else CurrentEncoding = encoding; + PluginUuid = new Guid("F8F6E46F-7A2A-48E3-9C0A-46AF4DC29E09"); + CurrentEncoding = encoding ?? Encoding.UTF8; } public Squash(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Squash filesystem"; - PluginUUID = new Guid("F8F6E46F-7A2A-48E3-9C0A-46AF4DC29E09"); - if(encoding == null) CurrentEncoding = Encoding.UTF8; - else CurrentEncoding = encoding; + PluginUuid = new Guid("F8F6E46F-7A2A-48E3-9C0A-46AF4DC29E09"); + CurrentEncoding = encoding ?? Encoding.UTF8; } enum SquashCompression : ushort @@ -102,8 +100,8 @@ namespace DiscImageChef.Filesystems /// /// Identifier for Squash /// - const uint Squash_MAGIC = 0x73717368; - const uint Squash_CIGAM = 0x68737173; + const uint SQUASH_MAGIC = 0x73717368; + const uint SQUASH_CIGAM = 0x68737173; public override bool Identify(ImagePlugin imagePlugin, Partition partition) { @@ -113,7 +111,7 @@ namespace DiscImageChef.Filesystems uint magic = BitConverter.ToUInt32(sector, 0x00); - return magic == Squash_MAGIC || magic == Squash_CIGAM; + return magic == SQUASH_MAGIC || magic == SQUASH_CIGAM; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -126,13 +124,13 @@ namespace DiscImageChef.Filesystems bool littleEndian = true; switch(magic) { - case Squash_MAGIC: + case SQUASH_MAGIC: IntPtr sqSbPtr = Marshal.AllocHGlobal(Marshal.SizeOf(sqSb)); Marshal.Copy(sector, 0, sqSbPtr, Marshal.SizeOf(sqSb)); sqSb = (SquashSuperBlock)Marshal.PtrToStructure(sqSbPtr, typeof(SquashSuperBlock)); Marshal.FreeHGlobal(sqSbPtr); break; - case Squash_CIGAM: + case SQUASH_CIGAM: sqSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); littleEndian = false; break; @@ -141,8 +139,7 @@ namespace DiscImageChef.Filesystems StringBuilder sbInformation = new StringBuilder(); sbInformation.AppendLine("Squash file system"); - if(littleEndian) sbInformation.AppendLine("Little-endian"); - else sbInformation.AppendLine("Big-endian"); + sbInformation.AppendLine(littleEndian ? "Little-endian" : "Big-endian"); sbInformation.AppendFormat("Volume version {0}.{1}", sqSb.s_major, sqSb.s_minor).AppendLine(); sbInformation.AppendFormat("Volume has {0} bytes", sqSb.bytes_used).AppendLine(); sbInformation.AppendFormat("Volume has {0} bytes per block", sqSb.block_size).AppendLine(); @@ -177,17 +174,19 @@ namespace DiscImageChef.Filesystems information = sbInformation.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "Squash file system"; - xmlFSType.CreationDate = DateHandlers.UNIXUnsignedToDateTime(sqSb.mkfs_time); - xmlFSType.CreationDateSpecified = true; - xmlFSType.Clusters = (long)((partition.End - partition.Start + 1) * imagePlugin.ImageInfo.SectorSize / - sqSb.block_size); - xmlFSType.ClusterSize = (int)sqSb.block_size; - xmlFSType.Files = sqSb.inodes; - xmlFSType.FilesSpecified = true; - xmlFSType.FreeClusters = 0; - xmlFSType.FreeClustersSpecified = true; + XmlFsType = new FileSystemType + { + Type = "Squash file system", + CreationDate = DateHandlers.UNIXUnsignedToDateTime(sqSb.mkfs_time), + CreationDateSpecified = true, + Clusters = + (long)((partition.End - partition.Start + 1) * imagePlugin.ImageInfo.SectorSize / sqSb.block_size), + ClusterSize = (int)sqSb.block_size, + Files = sqSb.inodes, + FilesSpecified = true, + FreeClusters = 0, + FreeClustersSpecified = true + }; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/SysV.cs b/DiscImageChef.Filesystems/SysV.cs index 64af6e147..a72921ca1 100644 --- a/DiscImageChef.Filesystems/SysV.cs +++ b/DiscImageChef.Filesystems/SysV.cs @@ -32,6 +32,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; using DiscImageChef.CommonTypes; @@ -41,6 +42,7 @@ using Schemas; namespace DiscImageChef.Filesystems { // Information from the Linux kernel + [SuppressMessage("ReSharper", "InconsistentNaming")] public class SysVfs : Filesystem { const uint XENIX_MAGIC = 0x002B5544; @@ -64,55 +66,28 @@ namespace DiscImageChef.Filesystems public SysVfs() { Name = "UNIX System V filesystem"; - PluginUUID = new Guid("9B8D016A-8561-400E-A12A-A198283C211D"); + PluginUuid = new Guid("9B8D016A-8561-400E-A12A-A198283C211D"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public SysVfs(Encoding encoding) { Name = "UNIX System V filesystem"; - PluginUUID = new Guid("9B8D016A-8561-400E-A12A-A198283C211D"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("9B8D016A-8561-400E-A12A-A198283C211D"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public SysVfs(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "UNIX System V filesystem"; - PluginUUID = new Guid("9B8D016A-8561-400E-A12A-A198283C211D"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("9B8D016A-8561-400E-A12A-A198283C211D"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { if(2 + partition.Start >= partition.End) return false; - uint magic; - string s_fname, s_fpack; - ushort s_nfree, s_ninode; - uint s_fsize; - - /*for(int j = 0; j<=(br.BaseStream.Length/0x200); j++) - { - br.BaseStream.Seek(offset + j*0x200 + 0x1F8, SeekOrigin.Begin); // System V magic location - magic = br.Readuint(); - - if(magic == SYSV_MAGIC || magic == SYSV_CIGAM) - Console.WriteLine("0x{0:X8}: 0x{1:X8} FOUND", br.BaseStream.Position-4, magic); - else - Console.WriteLine("0x{0:X8}: 0x{1:X8}", br.BaseStream.Position-4, magic); - }*/ - - /*uint number; - br.BaseStream.Seek(offset+0x3A00, SeekOrigin.Begin); - while((br.BaseStream.Position) <= (offset+0x3C00)) - { - number = br.Readuint(); - - Console.WriteLine("@{0:X8}: 0x{1:X8} ({1})", br.BaseStream.Position-offset-4, number); - }*/ - byte sb_size_in_sectors; if(imagePlugin.GetSectorSize() <= 0x400 @@ -136,7 +111,7 @@ namespace DiscImageChef.Filesystems }; foreach(byte[] sb_sector in locations.TakeWhile(i => i + sb_size_in_sectors < (int)imagePlugin.ImageInfo.Sectors).Select(i => imagePlugin.ReadSectors((ulong)i + partition.Start, sb_size_in_sectors))) { - magic = BitConverter.ToUInt32(sb_sector, 0x3F8); // XENIX magic location + uint magic = BitConverter.ToUInt32(sb_sector, 0x3F8); if(magic == XENIX_MAGIC || magic == XENIX_CIGAM || magic == SYSV_MAGIC || magic == SYSV_CIGAM) return true; @@ -151,17 +126,17 @@ namespace DiscImageChef.Filesystems byte[] coherent_string = new byte[6]; Array.Copy(sb_sector, 0x1E4, coherent_string, 0, 6); // Coherent UNIX s_fname location - s_fname = StringHandlers.CToString(coherent_string, CurrentEncoding); + string s_fname = StringHandlers.CToString(coherent_string, CurrentEncoding); Array.Copy(sb_sector, 0x1EA, coherent_string, 0, 6); // Coherent UNIX s_fpack location - s_fpack = StringHandlers.CToString(coherent_string, CurrentEncoding); + string s_fpack = StringHandlers.CToString(coherent_string, CurrentEncoding); if(s_fname == COH_FNAME && s_fpack == COH_FPACK || s_fname == COH_XXXXX && s_fpack == COH_XXXXX || s_fname == COH_XXXXS && s_fpack == COH_XXXXN) return true; // Now try to identify 7th edition - s_fsize = BitConverter.ToUInt32(sb_sector, 0x002); // 7th edition's s_fsize - s_nfree = BitConverter.ToUInt16(sb_sector, 0x006); // 7th edition's s_nfree - s_ninode = BitConverter.ToUInt16(sb_sector, 0x0D0); // 7th edition's s_ninode + uint s_fsize = BitConverter.ToUInt32(sb_sector, 0x002); + ushort s_nfree = BitConverter.ToUInt16(sb_sector, 0x006); + ushort s_ninode = BitConverter.ToUInt16(sb_sector, 0x0D0); if(s_fsize <= 0 || s_fsize >= 0xFFFFFFFF || s_nfree <= 0 || s_nfree >= 0xFFFF || s_ninode <= 0 || s_ninode >= 0xFFFF) continue; @@ -197,13 +172,8 @@ namespace DiscImageChef.Filesystems BigEndianBitConverter.IsLittleEndian = true; // Start in little endian until we know what are we handling here int start = 0; - uint magic; - string s_fname, s_fpack; - ushort s_nfree, s_ninode; - uint s_fsize; bool xenix = false; bool sysv = false; - bool sysvr4; bool sys7th = false; bool coherent = false; bool xenix3 = false; @@ -229,7 +199,7 @@ namespace DiscImageChef.Filesystems foreach(int i in locations) { sb_sector = imagePlugin.ReadSectors((ulong)i + partition.Start, sb_size_in_sectors); - magic = BigEndianBitConverter.ToUInt32(sb_sector, 0x3F8); // XENIX magic location + uint magic = BigEndianBitConverter.ToUInt32(sb_sector, 0x3F8); if(magic == XENIX_MAGIC || magic == SYSV_MAGIC) { @@ -295,9 +265,9 @@ namespace DiscImageChef.Filesystems byte[] coherent_string = new byte[6]; Array.Copy(sb_sector, 0x1E4, coherent_string, 0, 6); // Coherent UNIX s_fname location - s_fname = StringHandlers.CToString(coherent_string, CurrentEncoding); + string s_fname = StringHandlers.CToString(coherent_string, CurrentEncoding); Array.Copy(sb_sector, 0x1EA, coherent_string, 0, 6); // Coherent UNIX s_fpack location - s_fpack = StringHandlers.CToString(coherent_string, CurrentEncoding); + string s_fpack = StringHandlers.CToString(coherent_string, CurrentEncoding); if(s_fname == COH_FNAME && s_fpack == COH_FPACK || s_fname == COH_XXXXX && s_fpack == COH_XXXXX || s_fname == COH_XXXXS && s_fpack == COH_XXXXN) @@ -309,9 +279,9 @@ namespace DiscImageChef.Filesystems } // Now try to identify 7th edition - s_fsize = BitConverter.ToUInt32(sb_sector, 0x002); // 7th edition's s_fsize - s_nfree = BitConverter.ToUInt16(sb_sector, 0x006); // 7th edition's s_nfree - s_ninode = BitConverter.ToUInt16(sb_sector, 0x0D0); // 7th edition's s_ninode + uint s_fsize = BitConverter.ToUInt32(sb_sector, 0x002); + ushort s_nfree = BitConverter.ToUInt16(sb_sector, 0x006); + ushort s_ninode = BitConverter.ToUInt16(sb_sector, 0x0D0); if(s_fsize <= 0 || s_fsize >= 0xFFFFFFFF || s_nfree <= 0 || s_nfree >= 0xFFFF || s_ninode <= 0 || s_ninode >= 0xFFFF) continue; @@ -341,7 +311,7 @@ namespace DiscImageChef.Filesystems if(!sys7th && !sysv && !coherent && !xenix && !xenix3) return; - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); if(xenix || xenix3) { @@ -402,22 +372,22 @@ namespace DiscImageChef.Filesystems uint bs = 512; sb.AppendLine("XENIX filesystem"); - xmlFSType.Type = "XENIX fs"; + XmlFsType.Type = "XENIX fs"; switch(xnx_sb.s_type) { case 1: sb.AppendLine("512 bytes per block"); - xmlFSType.ClusterSize = 512; + XmlFsType.ClusterSize = 512; break; case 2: sb.AppendLine("1024 bytes per block"); bs = 1024; - xmlFSType.ClusterSize = 1024; + XmlFsType.ClusterSize = 1024; break; case 3: sb.AppendLine("2048 bytes per block"); bs = 2048; - xmlFSType.ClusterSize = 2048; + XmlFsType.ClusterSize = 2048; break; default: sb.AppendFormat("Unknown s_type value: 0x{0:X8}", xnx_sb.s_type).AppendLine(); @@ -458,17 +428,17 @@ namespace DiscImageChef.Filesystems .AppendLine(); if(xnx_sb.s_time != 0) { - xmlFSType.ModificationDate = DateHandlers.UNIXToDateTime(xnx_sb.s_time); - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.UNIXToDateTime(xnx_sb.s_time); + XmlFsType.ModificationDateSpecified = true; } sb.AppendFormat("Volume name: {0}", xnx_sb.s_fname).AppendLine(); - xmlFSType.VolumeName = xnx_sb.s_fname; + XmlFsType.VolumeName = xnx_sb.s_fname; sb.AppendFormat("Pack name: {0}", xnx_sb.s_fpack).AppendLine(); if(xnx_sb.s_clean == 0x46) sb.AppendLine("Volume is clean"); else { sb.AppendLine("Volume is dirty"); - xmlFSType.Dirty = true; + XmlFsType.Dirty = true; } } @@ -477,21 +447,23 @@ namespace DiscImageChef.Filesystems sb_sector = imagePlugin.ReadSectors((ulong)start + partition.Start, sb_size_in_sectors); byte[] sysv_strings = new byte[6]; - SystemVRelease4SuperBlock sysv_sb = new SystemVRelease4SuperBlock(); - sysv_sb.s_type = BigEndianBitConverter.ToUInt32(sb_sector, 0x1FC + offset); + SystemVRelease4SuperBlock sysv_sb = new SystemVRelease4SuperBlock + { + s_type = BigEndianBitConverter.ToUInt32(sb_sector, 0x1FC + offset) + }; uint bs = 512; switch(sysv_sb.s_type) { case 1: - xmlFSType.ClusterSize = 512; + XmlFsType.ClusterSize = 512; break; case 2: bs = 1024; - xmlFSType.ClusterSize = 1024; + XmlFsType.ClusterSize = 1024; break; case 3: bs = 2048; - xmlFSType.ClusterSize = 2048; + XmlFsType.ClusterSize = 2048; break; default: sb.AppendFormat("Unknown s_type value: 0x{0:X8}", sysv_sb.s_type).AppendLine(); @@ -500,7 +472,7 @@ namespace DiscImageChef.Filesystems sysv_sb.s_fsize = BigEndianBitConverter.ToUInt32(sb_sector, 0x002 + offset); - sysvr4 = sysv_sb.s_fsize * bs <= 0 || sysv_sb.s_fsize * bs != partition.Size; + bool sysvr4 = sysv_sb.s_fsize * bs <= 0 || sysv_sb.s_fsize * bs != partition.Size; if(sysvr4) { @@ -526,7 +498,7 @@ namespace DiscImageChef.Filesystems Array.Copy(sb_sector, 0x1BC + offset, sysv_strings, 0, 6); sysv_sb.s_fpack = StringHandlers.CToString(sysv_strings, CurrentEncoding); sb.AppendLine("System V Release 4 filesystem"); - xmlFSType.Type = "SVR4 fs"; + XmlFsType.Type = "SVR4 fs"; } else { @@ -552,11 +524,11 @@ namespace DiscImageChef.Filesystems Array.Copy(sb_sector, 0x1B6 + offset, sysv_strings, 0, 6); sysv_sb.s_fpack = StringHandlers.CToString(sysv_strings, CurrentEncoding); sb.AppendLine("System V Release 2 filesystem"); - xmlFSType.Type = "SVR2 fs"; + XmlFsType.Type = "SVR2 fs"; } sb.AppendFormat("{0} bytes per block", bs).AppendLine(); - xmlFSType.Clusters = sysv_sb.s_fsize; + XmlFsType.Clusters = sysv_sb.s_fsize; sb.AppendFormat("{0} zones on volume ({1} bytes)", sysv_sb.s_fsize, sysv_sb.s_fsize * bs).AppendLine(); sb.AppendFormat("{0} free zones on volume ({1} bytes)", sysv_sb.s_tfree, sysv_sb.s_tfree * bs) .AppendLine(); @@ -577,17 +549,17 @@ namespace DiscImageChef.Filesystems .AppendLine(); if(sysv_sb.s_time != 0) { - xmlFSType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(sysv_sb.s_time); - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(sysv_sb.s_time); + XmlFsType.ModificationDateSpecified = true; } sb.AppendFormat("Volume name: {0}", sysv_sb.s_fname).AppendLine(); - xmlFSType.VolumeName = sysv_sb.s_fname; + XmlFsType.VolumeName = sysv_sb.s_fname; sb.AppendFormat("Pack name: {0}", sysv_sb.s_fpack).AppendLine(); if(sysv_sb.s_state == 0x7C269D38 - sysv_sb.s_time) sb.AppendLine("Volume is clean"); else { sb.AppendLine("Volume is dirty"); - xmlFSType.Dirty = true; + XmlFsType.Dirty = true; } } @@ -615,9 +587,9 @@ namespace DiscImageChef.Filesystems Array.Copy(sb_sector, 0x1EA, coh_strings, 0, 6); coh_sb.s_fpack = StringHandlers.CToString(coh_strings, CurrentEncoding); - xmlFSType.Type = "Coherent fs"; - xmlFSType.ClusterSize = 512; - xmlFSType.Clusters = coh_sb.s_fsize; + XmlFsType.Type = "Coherent fs"; + XmlFsType.ClusterSize = 512; + XmlFsType.Clusters = coh_sb.s_fsize; sb.AppendLine("Coherent UNIX filesystem"); if(imagePlugin.GetSectorSize() != 512) @@ -640,11 +612,11 @@ namespace DiscImageChef.Filesystems .AppendLine(); if(coh_sb.s_time != 0) { - xmlFSType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(coh_sb.s_time); - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(coh_sb.s_time); + XmlFsType.ModificationDateSpecified = true; } sb.AppendFormat("Volume name: {0}", coh_sb.s_fname).AppendLine(); - xmlFSType.VolumeName = coh_sb.s_fname; + XmlFsType.VolumeName = coh_sb.s_fname; sb.AppendFormat("Pack name: {0}", coh_sb.s_fpack).AppendLine(); } @@ -672,9 +644,9 @@ namespace DiscImageChef.Filesystems Array.Copy(sb_sector, 0x1B2, sys7_strings, 0, 6); v7_sb.s_fpack = StringHandlers.CToString(sys7_strings, CurrentEncoding); - xmlFSType.Type = "UNIX 7th Edition fs"; - xmlFSType.ClusterSize = 512; - xmlFSType.Clusters = v7_sb.s_fsize; + XmlFsType.Type = "UNIX 7th Edition fs"; + XmlFsType.ClusterSize = 512; + XmlFsType.Clusters = v7_sb.s_fsize; sb.AppendLine("UNIX 7th Edition filesystem"); if(imagePlugin.GetSectorSize() != 512) sb @@ -695,11 +667,11 @@ namespace DiscImageChef.Filesystems .AppendLine(); if(v7_sb.s_time != 0) { - xmlFSType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(v7_sb.s_time); - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(v7_sb.s_time); + XmlFsType.ModificationDateSpecified = true; } sb.AppendFormat("Volume name: {0}", v7_sb.s_fname).AppendLine(); - xmlFSType.VolumeName = v7_sb.s_fname; + XmlFsType.VolumeName = v7_sb.s_fname; sb.AppendFormat("Pack name: {0}", v7_sb.s_fpack).AppendLine(); } diff --git a/DiscImageChef.Filesystems/UCSDPascal/File.cs b/DiscImageChef.Filesystems/UCSDPascal/File.cs index 9b9f36d79..159983013 100644 --- a/DiscImageChef.Filesystems/UCSDPascal/File.cs +++ b/DiscImageChef.Filesystems/UCSDPascal/File.cs @@ -40,9 +40,7 @@ namespace DiscImageChef.Filesystems.UCSDPascal { public override Errno MapBlock(string path, long fileBlock, ref long deviceBlock) { - if(!mounted) return Errno.AccessDenied; - - return Errno.NotImplemented; + return !mounted ? Errno.AccessDenied : Errno.NotImplemented; } public override Errno GetAttributes(string path, ref FileAttributes attributes) @@ -52,8 +50,7 @@ namespace DiscImageChef.Filesystems.UCSDPascal string[] pathElements = path.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries); if(pathElements.Length != 1) return Errno.NotSupported; - PascalFileEntry entry; - Errno error = GetFileEntry(path, out entry); + Errno error = GetFileEntry(path, out _); if(error != Errno.NoError) return error; @@ -71,16 +68,13 @@ namespace DiscImageChef.Filesystems.UCSDPascal if(pathElements.Length != 1) return Errno.NotSupported; byte[] file; - Errno error; if(debug && (string.Compare(path, "$", StringComparison.InvariantCulture) == 0 || string.Compare(path, "$Boot", StringComparison.InvariantCulture) == 0)) - if(string.Compare(path, "$", StringComparison.InvariantCulture) == 0) file = catalogBlocks; - else file = bootBlocks; + file = string.Compare(path, "$", StringComparison.InvariantCulture) == 0 ? catalogBlocks : bootBlocks; else { - PascalFileEntry entry; - error = GetFileEntry(path, out entry); + Errno error = GetFileEntry(path, out PascalFileEntry entry); if(error != Errno.NoError) return error; @@ -113,16 +107,17 @@ namespace DiscImageChef.Filesystems.UCSDPascal if(string.Compare(path, "$", StringComparison.InvariantCulture) == 0 || string.Compare(path, "$Boot", StringComparison.InvariantCulture) == 0) { - stat = new FileEntryInfo(); - stat.Attributes = new FileAttributes(); - stat.Attributes = FileAttributes.System; - stat.BlockSize = device.GetSectorSize(); - stat.DeviceNo = 0; - stat.GID = 0; - stat.Inode = 0; - stat.Links = 1; - stat.Mode = 0x124; - stat.UID = 0; + stat = new FileEntryInfo + { + Attributes = FileAttributes.System, + BlockSize = device.GetSectorSize(), + DeviceNo = 0, + GID = 0, + Inode = 0, + Links = 1, + Mode = 0x124, + UID = 0 + }; if(string.Compare(path, "$", StringComparison.InvariantCulture) == 0) { @@ -138,24 +133,24 @@ namespace DiscImageChef.Filesystems.UCSDPascal return Errno.NoError; } - PascalFileEntry entry; - Errno error = GetFileEntry(path, out entry); + Errno error = GetFileEntry(path, out PascalFileEntry entry); if(error != Errno.NoError) return error; - stat = new FileEntryInfo(); - stat.Attributes = new FileAttributes(); - stat.Attributes = FileAttributes.File; - stat.Blocks = entry.lastBlock - entry.firstBlock; - stat.BlockSize = device.GetSectorSize(); - stat.DeviceNo = 0; - stat.GID = 0; - stat.Inode = 0; - stat.LastWriteTimeUtc = DateHandlers.UCSDPascalToDateTime(entry.mtime); - stat.Length = (entry.lastBlock - entry.firstBlock) * device.GetSectorSize() + entry.lastBytes; - stat.Links = 1; - stat.Mode = 0x124; - stat.UID = 0; + stat = new FileEntryInfo + { + Attributes = FileAttributes.File, + Blocks = entry.lastBlock - entry.firstBlock, + BlockSize = device.GetSectorSize(), + DeviceNo = 0, + GID = 0, + Inode = 0, + LastWriteTimeUtc = DateHandlers.UCSDPascalToDateTime(entry.mtime), + Length = (entry.lastBlock - entry.firstBlock) * device.GetSectorSize() + entry.lastBytes, + Links = 1, + Mode = 0x124, + UID = 0 + }; return Errno.NoError; } diff --git a/DiscImageChef.Filesystems/UCSDPascal/Info.cs b/DiscImageChef.Filesystems/UCSDPascal/Info.cs index fb6112674..2150cef55 100644 --- a/DiscImageChef.Filesystems/UCSDPascal/Info.cs +++ b/DiscImageChef.Filesystems/UCSDPascal/Info.cs @@ -143,14 +143,16 @@ namespace DiscImageChef.Filesystems.UCSDPascal information = sbInformation.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.Bootable = !ArrayHelpers.ArrayIsNullOrEmpty(imagePlugin.ReadSectors(partition.Start, 2)); - xmlFSType.Clusters = volEntry.blocks; - xmlFSType.ClusterSize = (int)imagePlugin.GetSectorSize(); - xmlFSType.Files = volEntry.files; - xmlFSType.FilesSpecified = true; - xmlFSType.Type = "UCSD Pascal"; - xmlFSType.VolumeName = StringHandlers.PascalToString(volEntry.volumeName, CurrentEncoding); + XmlFsType = new FileSystemType + { + Bootable = !ArrayHelpers.ArrayIsNullOrEmpty(imagePlugin.ReadSectors(partition.Start, 2)), + Clusters = volEntry.blocks, + ClusterSize = (int)imagePlugin.GetSectorSize(), + Files = volEntry.files, + FilesSpecified = true, + Type = "UCSD Pascal", + VolumeName = StringHandlers.PascalToString(volEntry.volumeName, CurrentEncoding) + }; } } } \ No newline at end of file diff --git a/DiscImageChef.Filesystems/UCSDPascal/Super.cs b/DiscImageChef.Filesystems/UCSDPascal/Super.cs index 707f40ad1..fa58c6935 100644 --- a/DiscImageChef.Filesystems/UCSDPascal/Super.cs +++ b/DiscImageChef.Filesystems/UCSDPascal/Super.cs @@ -78,14 +78,16 @@ namespace DiscImageChef.Filesystems.UCSDPascal fileEntries = new List(); while(offset + 26 < catalogBlocks.Length) { - PascalFileEntry entry = new PascalFileEntry(); - entry.filename = new byte[16]; - entry.firstBlock = BigEndianBitConverter.ToInt16(catalogBlocks, offset + 0x00); - entry.lastBlock = BigEndianBitConverter.ToInt16(catalogBlocks, offset + 0x02); - entry.entryType = (PascalFileKind)BigEndianBitConverter.ToInt16(catalogBlocks, offset + 0x04); + PascalFileEntry entry = new PascalFileEntry + { + filename = new byte[16], + firstBlock = BigEndianBitConverter.ToInt16(catalogBlocks, offset + 0x00), + lastBlock = BigEndianBitConverter.ToInt16(catalogBlocks, offset + 0x02), + entryType = (PascalFileKind)BigEndianBitConverter.ToInt16(catalogBlocks, offset + 0x04), + lastBytes = BigEndianBitConverter.ToInt16(catalogBlocks, offset + 0x16), + mtime = BigEndianBitConverter.ToInt16(catalogBlocks, offset + 0x18) + }; Array.Copy(catalogBlocks, offset + 0x06, entry.filename, 0, 16); - entry.lastBytes = BigEndianBitConverter.ToInt16(catalogBlocks, offset + 0x16); - entry.mtime = BigEndianBitConverter.ToInt16(catalogBlocks, offset + 0x18); if(entry.filename[0] <= 15 && entry.filename[0] > 0) fileEntries.Add(entry); @@ -94,14 +96,16 @@ namespace DiscImageChef.Filesystems.UCSDPascal bootBlocks = device.ReadSectors(0, 2); - xmlFSType = new FileSystemType(); - xmlFSType.Bootable = !ArrayHelpers.ArrayIsNullOrEmpty(bootBlocks); - xmlFSType.Clusters = mountedVolEntry.blocks; - xmlFSType.ClusterSize = (int)device.GetSectorSize(); - xmlFSType.Files = mountedVolEntry.files; - xmlFSType.FilesSpecified = true; - xmlFSType.Type = "UCSD Pascal"; - xmlFSType.VolumeName = StringHandlers.PascalToString(mountedVolEntry.volumeName, CurrentEncoding); + XmlFsType = new FileSystemType + { + Bootable = !ArrayHelpers.ArrayIsNullOrEmpty(bootBlocks), + Clusters = mountedVolEntry.blocks, + ClusterSize = (int)device.GetSectorSize(), + Files = mountedVolEntry.files, + FilesSpecified = true, + Type = "UCSD Pascal", + VolumeName = StringHandlers.PascalToString(mountedVolEntry.volumeName, CurrentEncoding) + }; mounted = true; @@ -122,7 +126,7 @@ namespace DiscImageChef.Filesystems.UCSDPascal stat.FilenameLength = 16; stat.Files = (ulong)mountedVolEntry.files; stat.FreeBlocks = 0; - stat.PluginId = PluginUUID; + stat.PluginId = PluginUuid; stat.Type = "UCSD Pascal"; stat.FreeBlocks = mountedVolEntry.blocks - (mountedVolEntry.lastBlock - mountedVolEntry.firstBlock); diff --git a/DiscImageChef.Filesystems/UCSDPascal/UCSDPascal.cs b/DiscImageChef.Filesystems/UCSDPascal/UCSDPascal.cs index b5046b6a6..f715d0627 100644 --- a/DiscImageChef.Filesystems/UCSDPascal/UCSDPascal.cs +++ b/DiscImageChef.Filesystems/UCSDPascal/UCSDPascal.cs @@ -54,14 +54,14 @@ namespace DiscImageChef.Filesystems.UCSDPascal public PascalPlugin() { Name = "U.C.S.D. Pascal filesystem"; - PluginUUID = new Guid("B0AC2CB5-72AA-473A-9200-270B5A2C2D53"); + PluginUuid = new Guid("B0AC2CB5-72AA-473A-9200-270B5A2C2D53"); CurrentEncoding = new LisaRoman(); } public PascalPlugin(Encoding encoding) { Name = "U.C.S.D. Pascal filesystem"; - PluginUUID = new Guid("B0AC2CB5-72AA-473A-9200-270B5A2C2D53"); + PluginUuid = new Guid("B0AC2CB5-72AA-473A-9200-270B5A2C2D53"); // TODO: Until Apple ][ encoding is implemented CurrentEncoding = new LisaRoman(); } @@ -70,7 +70,7 @@ namespace DiscImageChef.Filesystems.UCSDPascal { device = imagePlugin; Name = "U.C.S.D. Pascal filesystem"; - PluginUUID = new Guid("B0AC2CB5-72AA-473A-9200-270B5A2C2D53"); + PluginUuid = new Guid("B0AC2CB5-72AA-473A-9200-270B5A2C2D53"); // TODO: Until Apple ][ encoding is implemented CurrentEncoding = new LisaRoman(); } diff --git a/DiscImageChef.Filesystems/UDF.cs b/DiscImageChef.Filesystems/UDF.cs index 29581c9e9..e848678f1 100644 --- a/DiscImageChef.Filesystems/UDF.cs +++ b/DiscImageChef.Filesystems/UDF.cs @@ -48,14 +48,14 @@ namespace DiscImageChef.Filesystems public UDF() { Name = "Universal Disk Format"; - PluginUUID = new Guid("83976FEC-A91B-464B-9293-56C719461BAB"); + PluginUuid = new Guid("83976FEC-A91B-464B-9293-56C719461BAB"); CurrentEncoding = Encoding.UTF8; } public UDF(Encoding encoding) { Name = "Universal Disk Format"; - PluginUUID = new Guid("83976FEC-A91B-464B-9293-56C719461BAB"); + PluginUuid = new Guid("83976FEC-A91B-464B-9293-56C719461BAB"); // UDF is always UTF-8 CurrentEncoding = Encoding.UTF8; } @@ -63,7 +63,7 @@ namespace DiscImageChef.Filesystems public UDF(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Universal Disk Format"; - PluginUUID = new Guid("83976FEC-A91B-464B-9293-56C719461BAB"); + PluginUuid = new Guid("83976FEC-A91B-464B-9293-56C719461BAB"); // UDF is always UTF-8 CurrentEncoding = Encoding.UTF8; } @@ -416,7 +416,7 @@ namespace DiscImageChef.Filesystems .AppendFormat("Volume name: {0}", StringHandlers.DecompressUnicode(lvd.logicalVolumeIdentifier)) .AppendLine(); sbInformation.AppendFormat("Volume uses {0} bytes per block", lvd.logicalBlockSize).AppendLine(); - sbInformation.AppendFormat("Volume was las written in {0}", ECMAToDateTime(lvid.recordingDateTime)) + sbInformation.AppendFormat("Volume was las written in {0}", EcmaToDateTime(lvid.recordingDateTime)) .AppendLine(); sbInformation.AppendFormat("Volume contains {0} partitions", lvid.numberOfPartitions).AppendLine(); sbInformation @@ -445,27 +445,28 @@ namespace DiscImageChef.Filesystems Convert.ToInt32($"{lvidiu.maximumWriteUDF & 0xFF}", 10)) .AppendLine(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = - $"UDF v{Convert.ToInt32($"{(lvidiu.maximumWriteUDF & 0xFF00) >> 8}", 10)}.{Convert.ToInt32($"{lvidiu.maximumWriteUDF & 0xFF}", 10):X2}"; - xmlFSType.ApplicationIdentifier = CurrentEncoding - .GetString(pvd.implementationIdentifier.identifier).TrimEnd('\u0000'); - xmlFSType.ClusterSize = (int)lvd.logicalBlockSize; - xmlFSType.Clusters = (long)((partition.End - partition.Start + 1) * imagePlugin.ImageInfo.SectorSize / - (ulong)xmlFSType.ClusterSize); - xmlFSType.ModificationDate = ECMAToDateTime(lvid.recordingDateTime); - xmlFSType.ModificationDateSpecified = true; - xmlFSType.Files = lvidiu.files; - xmlFSType.FilesSpecified = true; - xmlFSType.VolumeName = StringHandlers.DecompressUnicode(lvd.logicalVolumeIdentifier); - xmlFSType.VolumeSetIdentifier = StringHandlers.DecompressUnicode(pvd.volumeSetIdentifier); - xmlFSType.SystemIdentifier = CurrentEncoding - .GetString(pvd.implementationIdentifier.identifier).TrimEnd('\u0000'); + XmlFsType = new FileSystemType + { + Type = + $"UDF v{Convert.ToInt32($"{(lvidiu.maximumWriteUDF & 0xFF00) >> 8}", 10)}.{Convert.ToInt32($"{lvidiu.maximumWriteUDF & 0xFF}", 10):X2}", + ApplicationIdentifier = + CurrentEncoding.GetString(pvd.implementationIdentifier.identifier).TrimEnd('\u0000'), + ClusterSize = (int)lvd.logicalBlockSize, + ModificationDate = EcmaToDateTime(lvid.recordingDateTime), + ModificationDateSpecified = true, + Files = lvidiu.files, + FilesSpecified = true, + VolumeName = StringHandlers.DecompressUnicode(lvd.logicalVolumeIdentifier), + VolumeSetIdentifier = StringHandlers.DecompressUnicode(pvd.volumeSetIdentifier), + SystemIdentifier = CurrentEncoding.GetString(pvd.implementationIdentifier.identifier).TrimEnd('\u0000') + }; + XmlFsType.Clusters = (long)((partition.End - partition.Start + 1) * imagePlugin.ImageInfo.SectorSize / + (ulong)XmlFsType.ClusterSize); information = sbInformation.ToString(); } - static DateTime ECMAToDateTime(Timestamp timestamp) + static DateTime EcmaToDateTime(Timestamp timestamp) { return DateHandlers.ECMAToDateTime(timestamp.typeAndZone, timestamp.year, timestamp.month, timestamp.day, timestamp.hour, timestamp.minute, timestamp.second, diff --git a/DiscImageChef.Filesystems/UNICOS.cs b/DiscImageChef.Filesystems/UNICOS.cs index c48d071c6..887ed6aff 100644 --- a/DiscImageChef.Filesystems/UNICOS.cs +++ b/DiscImageChef.Filesystems/UNICOS.cs @@ -32,6 +32,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; @@ -48,6 +49,8 @@ using time_t = System.Int64; namespace DiscImageChef.Filesystems { + [SuppressMessage("ReSharper", "InconsistentNaming")] + [SuppressMessage("ReSharper", "BuiltInTypeReferenceStyle")] public class UNICOS : Filesystem { const int NC1MAXPART = 64; @@ -137,24 +140,22 @@ namespace DiscImageChef.Filesystems public UNICOS() { Name = "UNICOS Filesystem Plugin"; - PluginUUID = new Guid("61712F04-066C-44D5-A2A0-1E44C66B33F0"); + PluginUuid = new Guid("61712F04-066C-44D5-A2A0-1E44C66B33F0"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public UNICOS(Encoding encoding) { Name = "UNICOS Filesystem Plugin"; - PluginUUID = new Guid("61712F04-066C-44D5-A2A0-1E44C66B33F0"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("61712F04-066C-44D5-A2A0-1E44C66B33F0"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public UNICOS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "UNICOS Filesystem Plugin"; - PluginUUID = new Guid("61712F04-066C-44D5-A2A0-1E44C66B33F0"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("61712F04-066C-44D5-A2A0-1E44C66B33F0"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -213,7 +214,7 @@ namespace DiscImageChef.Filesystems information = sb.ToString(); - xmlFSType = new FileSystemType + XmlFsType = new FileSystemType { Type = "UNICOS filesystem", ClusterSize = 4096, @@ -222,7 +223,7 @@ namespace DiscImageChef.Filesystems ModificationDate = DateHandlers.UNIXToDateTime(unicosSb.s_time), ModificationDateSpecified = true }; - xmlFSType.Dirty |= unicosSb.s_error > 0; + XmlFsType.Dirty |= unicosSb.s_error > 0; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/UNIXBFS.cs b/DiscImageChef.Filesystems/UNIXBFS.cs index 2cb78ade2..a1ac9759d 100644 --- a/DiscImageChef.Filesystems/UNIXBFS.cs +++ b/DiscImageChef.Filesystems/UNIXBFS.cs @@ -48,24 +48,22 @@ namespace DiscImageChef.Filesystems public BFS() { Name = "UNIX Boot filesystem"; - PluginUUID = new Guid("1E6E0DA6-F7E4-494C-80C6-CB5929E96155"); + PluginUuid = new Guid("1E6E0DA6-F7E4-494C-80C6-CB5929E96155"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public BFS(Encoding encoding) { Name = "UNIX Boot filesystem"; - PluginUUID = new Guid("1E6E0DA6-F7E4-494C-80C6-CB5929E96155"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("1E6E0DA6-F7E4-494C-80C6-CB5929E96155"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public BFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "UNIX Boot filesystem"; - PluginUUID = new Guid("1E6E0DA6-F7E4-494C-80C6-CB5929E96155"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("1E6E0DA6-F7E4-494C-80C6-CB5929E96155"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -85,44 +83,46 @@ namespace DiscImageChef.Filesystems information = ""; StringBuilder sb = new StringBuilder(); - byte[] bfs_sb_sector = imagePlugin.ReadSector(0 + partition.Start); - byte[] sb_strings = new byte[6]; + byte[] bfsSbSector = imagePlugin.ReadSector(0 + partition.Start); + byte[] sbStrings = new byte[6]; - BFSSuperBlock bfs_sb = new BFSSuperBlock(); + BFSSuperBlock bfsSb = new BFSSuperBlock + { + s_magic = BitConverter.ToUInt32(bfsSbSector, 0x00), + s_start = BitConverter.ToUInt32(bfsSbSector, 0x04), + s_end = BitConverter.ToUInt32(bfsSbSector, 0x08), + s_from = BitConverter.ToUInt32(bfsSbSector, 0x0C), + s_to = BitConverter.ToUInt32(bfsSbSector, 0x10), + s_bfrom = BitConverter.ToInt32(bfsSbSector, 0x14), + s_bto = BitConverter.ToInt32(bfsSbSector, 0x18) + }; - bfs_sb.s_magic = BitConverter.ToUInt32(bfs_sb_sector, 0x00); - bfs_sb.s_start = BitConverter.ToUInt32(bfs_sb_sector, 0x04); - bfs_sb.s_end = BitConverter.ToUInt32(bfs_sb_sector, 0x08); - bfs_sb.s_from = BitConverter.ToUInt32(bfs_sb_sector, 0x0C); - bfs_sb.s_to = BitConverter.ToUInt32(bfs_sb_sector, 0x10); - bfs_sb.s_bfrom = BitConverter.ToInt32(bfs_sb_sector, 0x14); - bfs_sb.s_bto = BitConverter.ToInt32(bfs_sb_sector, 0x18); - Array.Copy(bfs_sb_sector, 0x1C, sb_strings, 0, 6); - bfs_sb.s_fsname = StringHandlers.CToString(sb_strings, CurrentEncoding); - Array.Copy(bfs_sb_sector, 0x22, sb_strings, 0, 6); - bfs_sb.s_volume = StringHandlers.CToString(sb_strings, CurrentEncoding); + Array.Copy(bfsSbSector, 0x1C, sbStrings, 0, 6); + bfsSb.s_fsname = StringHandlers.CToString(sbStrings, CurrentEncoding); + Array.Copy(bfsSbSector, 0x22, sbStrings, 0, 6); + bfsSb.s_volume = StringHandlers.CToString(sbStrings, CurrentEncoding); - DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_magic: 0x{0:X8}", bfs_sb.s_magic); - DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_start: 0x{0:X8}", bfs_sb.s_start); - DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_end: 0x{0:X8}", bfs_sb.s_end); - DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_from: 0x{0:X8}", bfs_sb.s_from); - DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_to: 0x{0:X8}", bfs_sb.s_to); - DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_bfrom: 0x{0:X8}", bfs_sb.s_bfrom); - DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_bto: 0x{0:X8}", bfs_sb.s_bto); - DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_fsname: 0x{0}", bfs_sb.s_fsname); - DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_volume: 0x{0}", bfs_sb.s_volume); + DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_magic: 0x{0:X8}", bfsSb.s_magic); + DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_start: 0x{0:X8}", bfsSb.s_start); + DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_end: 0x{0:X8}", bfsSb.s_end); + DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_from: 0x{0:X8}", bfsSb.s_from); + DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_to: 0x{0:X8}", bfsSb.s_to); + DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_bfrom: 0x{0:X8}", bfsSb.s_bfrom); + DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_bto: 0x{0:X8}", bfsSb.s_bto); + DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_fsname: 0x{0}", bfsSb.s_fsname); + DicConsole.DebugWriteLine("BFS plugin", "bfs_sb.s_volume: 0x{0}", bfsSb.s_volume); sb.AppendLine("UNIX Boot filesystem"); - sb.AppendFormat("Volume goes from byte {0} to byte {1}, for {2} bytes", bfs_sb.s_start, bfs_sb.s_end, - bfs_sb.s_end - bfs_sb.s_start).AppendLine(); - sb.AppendFormat("Filesystem name: {0}", bfs_sb.s_fsname).AppendLine(); - sb.AppendFormat("Volume name: {0}", bfs_sb.s_volume).AppendLine(); + sb.AppendFormat("Volume goes from byte {0} to byte {1}, for {2} bytes", bfsSb.s_start, bfsSb.s_end, + bfsSb.s_end - bfsSb.s_start).AppendLine(); + sb.AppendFormat("Filesystem name: {0}", bfsSb.s_fsname).AppendLine(); + sb.AppendFormat("Volume name: {0}", bfsSb.s_volume).AppendLine(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "BFS"; - xmlFSType.VolumeName = bfs_sb.s_volume; - xmlFSType.ClusterSize = (int)imagePlugin.GetSectorSize(); - xmlFSType.Clusters = (long)(partition.End - partition.Start + 1); + XmlFsType = new FileSystemType(); + XmlFsType.Type = "BFS"; + XmlFsType.VolumeName = bfsSb.s_volume; + XmlFsType.ClusterSize = (int)imagePlugin.GetSectorSize(); + XmlFsType.Clusters = (long)(partition.End - partition.Start + 1); information = sb.ToString(); } diff --git a/DiscImageChef.Filesystems/VMfs.cs b/DiscImageChef.Filesystems/VMfs.cs index 9e992f3fe..0f0b3f19d 100644 --- a/DiscImageChef.Filesystems/VMfs.cs +++ b/DiscImageChef.Filesystems/VMfs.cs @@ -45,24 +45,22 @@ namespace DiscImageChef.Filesystems public VMfs() { Name = "VMware filesystem"; - PluginUUID = new Guid("EE52BDB8-B49C-4122-A3DA-AD21CBE79843"); + PluginUuid = new Guid("EE52BDB8-B49C-4122-A3DA-AD21CBE79843"); CurrentEncoding = Encoding.UTF8; } public VMfs(Encoding encoding) { Name = "VMware filesystem"; - PluginUUID = new Guid("EE52BDB8-B49C-4122-A3DA-AD21CBE79843"); - if(encoding == null) CurrentEncoding = Encoding.UTF8; - else CurrentEncoding = encoding; + PluginUuid = new Guid("EE52BDB8-B49C-4122-A3DA-AD21CBE79843"); + CurrentEncoding = encoding ?? Encoding.UTF8; } public VMfs(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "VMware filesystem"; - PluginUUID = new Guid("EE52BDB8-B49C-4122-A3DA-AD21CBE79843"); - if(encoding == null) CurrentEncoding = Encoding.UTF8; - else CurrentEncoding = encoding; + PluginUuid = new Guid("EE52BDB8-B49C-4122-A3DA-AD21CBE79843"); + CurrentEncoding = encoding ?? Encoding.UTF8; } [Flags] @@ -92,14 +90,14 @@ namespace DiscImageChef.Filesystems /// /// Identifier for VMfs /// - const uint VMfs_MAGIC = 0xC001D00D; - const uint VMfs_Base = 0x00100000; + const uint VMFS_MAGIC = 0xC001D00D; + const uint VMFS_BASE = 0x00100000; public override bool Identify(ImagePlugin imagePlugin, Partition partition) { if(partition.Start >= partition.End) return false; - ulong vmfsSuperOff = VMfs_Base / imagePlugin.ImageInfo.SectorSize; + ulong vmfsSuperOff = VMFS_BASE / imagePlugin.ImageInfo.SectorSize; if(partition.Start + vmfsSuperOff > partition.End) return false; @@ -107,13 +105,13 @@ namespace DiscImageChef.Filesystems uint magic = BitConverter.ToUInt32(sector, 0x00); - return magic == VMfs_MAGIC; + return magic == VMFS_MAGIC; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, out string information) { - ulong vmfsSuperOff = VMfs_Base / imagePlugin.ImageInfo.SectorSize; + ulong vmfsSuperOff = VMFS_BASE / imagePlugin.ImageInfo.SectorSize; byte[] sector = imagePlugin.ReadSector(partition.Start + vmfsSuperOff); VolumeInfo volInfo = new VolumeInfo(); @@ -144,15 +142,17 @@ namespace DiscImageChef.Filesystems information = sbInformation.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "VMware file system"; - xmlFSType.CreationDate = DateHandlers.UNIXUnsignedToDateTime(ctimeSecs, ctimeNanoSecs); - xmlFSType.CreationDateSpecified = true; - xmlFSType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(mtimeSecs, mtimeNanoSecs); - xmlFSType.ModificationDateSpecified = true; - xmlFSType.Clusters = volInfo.size * 256 / imagePlugin.ImageInfo.SectorSize; - xmlFSType.ClusterSize = (int)imagePlugin.ImageInfo.SectorSize; - xmlFSType.VolumeSerial = volInfo.uuid.ToString(); + XmlFsType = new FileSystemType + { + Type = "VMware file system", + CreationDate = DateHandlers.UNIXUnsignedToDateTime(ctimeSecs, ctimeNanoSecs), + CreationDateSpecified = true, + ModificationDate = DateHandlers.UNIXUnsignedToDateTime(mtimeSecs, mtimeNanoSecs), + ModificationDateSpecified = true, + Clusters = volInfo.size * 256 / imagePlugin.ImageInfo.SectorSize, + ClusterSize = (int)imagePlugin.ImageInfo.SectorSize, + VolumeSerial = volInfo.uuid.ToString() + }; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/VxFS.cs b/DiscImageChef.Filesystems/VxFS.cs index 63ec7f054..b675859c4 100644 --- a/DiscImageChef.Filesystems/VxFS.cs +++ b/DiscImageChef.Filesystems/VxFS.cs @@ -45,24 +45,22 @@ namespace DiscImageChef.Filesystems public VxFS() { Name = "Veritas filesystem"; - PluginUUID = new Guid("EC372605-7687-453C-8BEA-7E0DFF79CB03"); + PluginUuid = new Guid("EC372605-7687-453C-8BEA-7E0DFF79CB03"); CurrentEncoding = Encoding.UTF8; } public VxFS(Encoding encoding) { Name = "Veritas filesystem"; - PluginUUID = new Guid("EC372605-7687-453C-8BEA-7E0DFF79CB03"); - if(encoding == null) CurrentEncoding = Encoding.UTF8; - else CurrentEncoding = encoding; + PluginUuid = new Guid("EC372605-7687-453C-8BEA-7E0DFF79CB03"); + CurrentEncoding = encoding ?? Encoding.UTF8; } public VxFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Veritas filesystem"; - PluginUUID = new Guid("EC372605-7687-453C-8BEA-7E0DFF79CB03"); - if(encoding == null) CurrentEncoding = Encoding.UTF8; - else CurrentEncoding = encoding; + PluginUuid = new Guid("EC372605-7687-453C-8BEA-7E0DFF79CB03"); + CurrentEncoding = encoding ?? Encoding.UTF8; } [StructLayout(LayoutKind.Sequential, Pack = 1)] @@ -211,12 +209,12 @@ namespace DiscImageChef.Filesystems /// /// Identifier for VxFS /// - const uint VxFS_MAGIC = 0xA501FCF5; - const uint VxFS_Base = 0x400; + const uint VXFS_MAGIC = 0xA501FCF5; + const uint VXFS_Base = 0x400; public override bool Identify(ImagePlugin imagePlugin, Partition partition) { - ulong vmfsSuperOff = VxFS_Base / imagePlugin.ImageInfo.SectorSize; + ulong vmfsSuperOff = VXFS_Base / imagePlugin.ImageInfo.SectorSize; if(partition.Start + vmfsSuperOff >= partition.End) return false; @@ -224,13 +222,13 @@ namespace DiscImageChef.Filesystems uint magic = BitConverter.ToUInt32(sector, 0x00); - return magic == VxFS_MAGIC; + return magic == VXFS_MAGIC; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, out string information) { - ulong vmfsSuperOff = VxFS_Base / imagePlugin.ImageInfo.SectorSize; + ulong vmfsSuperOff = VXFS_Base / imagePlugin.ImageInfo.SectorSize; byte[] sector = imagePlugin.ReadSector(partition.Start + vmfsSuperOff); VxSuperBlock vxSb = new VxSuperBlock(); @@ -259,17 +257,19 @@ namespace DiscImageChef.Filesystems information = sbInformation.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "Veritas file system"; - xmlFSType.CreationDate = DateHandlers.UNIXUnsignedToDateTime(vxSb.vs_ctime, vxSb.vs_cutime); - xmlFSType.CreationDateSpecified = true; - xmlFSType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(vxSb.vs_wtime, vxSb.vs_wutime); - xmlFSType.ModificationDateSpecified = true; - xmlFSType.Clusters = vxSb.vs_size; - xmlFSType.ClusterSize = vxSb.vs_bsize; - xmlFSType.Dirty = vxSb.vs_clean != 0; - xmlFSType.FreeClusters = vxSb.vs_free; - xmlFSType.FreeClustersSpecified = true; + XmlFsType = new FileSystemType + { + Type = "Veritas file system", + CreationDate = DateHandlers.UNIXUnsignedToDateTime(vxSb.vs_ctime, vxSb.vs_cutime), + CreationDateSpecified = true, + ModificationDate = DateHandlers.UNIXUnsignedToDateTime(vxSb.vs_wtime, vxSb.vs_wutime), + ModificationDateSpecified = true, + Clusters = vxSb.vs_size, + ClusterSize = vxSb.vs_bsize, + Dirty = vxSb.vs_clean != 0, + FreeClusters = vxSb.vs_free, + FreeClustersSpecified = true + }; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/XFS.cs b/DiscImageChef.Filesystems/XFS.cs index bee48f034..293546556 100644 --- a/DiscImageChef.Filesystems/XFS.cs +++ b/DiscImageChef.Filesystems/XFS.cs @@ -104,29 +104,27 @@ namespace DiscImageChef.Filesystems public Guid meta_uuid; } - const uint XFS_Magic = 0x58465342; + const uint XFS_MAGIC = 0x58465342; public XFS() { Name = "XFS Filesystem Plugin"; - PluginUUID = new Guid("1D8CD8B8-27E6-410F-9973-D16409225FBA"); + PluginUuid = new Guid("1D8CD8B8-27E6-410F-9973-D16409225FBA"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public XFS(Encoding encoding) { Name = "XFS Filesystem Plugin"; - PluginUUID = new Guid("1D8CD8B8-27E6-410F-9973-D16409225FBA"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("1D8CD8B8-27E6-410F-9973-D16409225FBA"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public XFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "XFS Filesystem Plugin"; - PluginUUID = new Guid("1D8CD8B8-27E6-410F-9973-D16409225FBA"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("1D8CD8B8-27E6-410F-9973-D16409225FBA"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -153,9 +151,9 @@ namespace DiscImageChef.Filesystems xfsSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sbpiece); DicConsole.DebugWriteLine("XFS plugin", "magic at 0x{0:X3} = 0x{1:X8} (expected 0x{2:X8})", - location, xfsSb.magicnum, XFS_Magic); + location, xfsSb.magicnum, XFS_MAGIC); - if(xfsSb.magicnum == XFS_Magic) return true; + if(xfsSb.magicnum == XFS_MAGIC) return true; } } else @@ -172,9 +170,9 @@ namespace DiscImageChef.Filesystems xfsSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); DicConsole.DebugWriteLine("XFS plugin", "magic at {0} = 0x{1:X8} (expected 0x{2:X8})", location, - xfsSb.magicnum, XFS_Magic); + xfsSb.magicnum, XFS_MAGIC); - if(xfsSb.magicnum == XFS_Magic) return true; + if(xfsSb.magicnum == XFS_MAGIC) return true; } return false; @@ -206,9 +204,9 @@ namespace DiscImageChef.Filesystems xfsSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sbpiece); DicConsole.DebugWriteLine("XFS plugin", "magic at 0x{0:X3} = 0x{1:X8} (expected 0x{2:X8})", - location, xfsSb.magicnum, XFS_Magic); + location, xfsSb.magicnum, XFS_MAGIC); - if(xfsSb.magicnum == XFS_Magic) break; + if(xfsSb.magicnum == XFS_MAGIC) break; } } else @@ -223,12 +221,12 @@ namespace DiscImageChef.Filesystems xfsSb = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); DicConsole.DebugWriteLine("XFS plugin", "magic at {0} = 0x{1:X8} (expected 0x{2:X8})", location, - xfsSb.magicnum, XFS_Magic); + xfsSb.magicnum, XFS_MAGIC); - if(xfsSb.magicnum == XFS_Magic) break; + if(xfsSb.magicnum == XFS_MAGIC) break; } - if(xfsSb.magicnum != XFS_Magic) return; + if(xfsSb.magicnum != XFS_MAGIC) return; StringBuilder sb = new StringBuilder(); @@ -247,17 +245,19 @@ namespace DiscImageChef.Filesystems information = sb.ToString(); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "XFS filesystem"; - xmlFSType.ClusterSize = (int)xfsSb.blocksize; - xmlFSType.Clusters = (long)xfsSb.dblocks; - xmlFSType.FreeClusters = (long)xfsSb.fdblocks; - xmlFSType.FreeClustersSpecified = true; - xmlFSType.Files = (long)(xfsSb.icount - xfsSb.ifree); - xmlFSType.FilesSpecified = true; - xmlFSType.Dirty |= xfsSb.inprogress > 0; - xmlFSType.VolumeName = StringHandlers.CToString(xfsSb.fname, CurrentEncoding); - xmlFSType.VolumeSerial = xfsSb.uuid.ToString(); + XmlFsType = new FileSystemType + { + Type = "XFS filesystem", + ClusterSize = (int)xfsSb.blocksize, + Clusters = (long)xfsSb.dblocks, + FreeClusters = (long)xfsSb.fdblocks, + FreeClustersSpecified = true, + Files = (long)(xfsSb.icount - xfsSb.ifree), + FilesSpecified = true, + Dirty = xfsSb.inprogress > 0, + VolumeName = StringHandlers.CToString(xfsSb.fname, CurrentEncoding), + VolumeSerial = xfsSb.uuid.ToString() + }; } public override Errno Mount() diff --git a/DiscImageChef.Filesystems/ZFS.cs b/DiscImageChef.Filesystems/ZFS.cs index a97771fc6..3fa2f54ca 100644 --- a/DiscImageChef.Filesystems/ZFS.cs +++ b/DiscImageChef.Filesystems/ZFS.cs @@ -32,6 +32,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; @@ -59,10 +60,11 @@ namespace DiscImageChef.Filesystems * It can also be encoded little or big endian. * Because of this variations, ZFS stored a header indicating the used encoding and endianess before the encoded nvlist. */ + [SuppressMessage("ReSharper", "InconsistentNaming")] public class ZFS : Filesystem { - const ulong ZEC_Magic = 0x0210DA7AB10C7A11; - const ulong ZEC_Cigam = 0x117A0CB17ADA1002; + const ulong ZEC_MAGIC = 0x0210DA7AB10C7A11; + const ulong ZEC_CIGAM = 0x117A0CB17ADA1002; struct ZIO_Checksum { @@ -81,9 +83,9 @@ namespace DiscImageChef.Filesystems } // These parameters define how the nvlist is stored - const byte NVS_LittleEndian = 1; - const byte NVS_BigEndian = 0; - const byte NVS_Native = 0; + const byte NVS_LITTLE_ENDIAN = 1; + const byte NVS_BIG_ENDIAN = 0; + const byte NVS_NATIVE = 0; const byte NVS_XDR = 1; /// @@ -173,7 +175,7 @@ namespace DiscImageChef.Filesystems } [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct DVA + struct DVA { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public ulong[] word; } @@ -208,7 +210,7 @@ namespace DiscImageChef.Filesystems public ZIO_Checksum checksum; } - const ulong Uberblock_Magic = 0x00BAB10C; + const ulong UBERBLOCK_MAGIC = 0x00BAB10C; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ZFS_Uberblock @@ -222,19 +224,19 @@ namespace DiscImageChef.Filesystems public ulong softwareVersion; } - const uint ZFS_Magic = 0x58465342; + const uint ZFS_MAGIC = 0x58465342; public ZFS() { Name = "ZFS Filesystem Plugin"; - PluginUUID = new Guid("0750014F-A714-4692-A369-E23F6EC3659C"); + PluginUuid = new Guid("0750014F-A714-4692-A369-E23F6EC3659C"); CurrentEncoding = Encoding.UTF8; } public ZFS(Encoding encoding) { Name = "ZFS Filesystem Plugin"; - PluginUUID = new Guid("0750014F-A714-4692-A369-E23F6EC3659C"); + PluginUuid = new Guid("0750014F-A714-4692-A369-E23F6EC3659C"); // ZFS is always UTF-8 CurrentEncoding = Encoding.UTF8; } @@ -242,7 +244,7 @@ namespace DiscImageChef.Filesystems public ZFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "ZFS Filesystem Plugin"; - PluginUUID = new Guid("0750014F-A714-4692-A369-E23F6EC3659C"); + PluginUuid = new Guid("0750014F-A714-4692-A369-E23F6EC3659C"); // ZFS is always UTF-8 CurrentEncoding = Encoding.UTF8; } @@ -258,16 +260,14 @@ namespace DiscImageChef.Filesystems { sector = imagePlugin.ReadSector(partition.Start + 31); magic = BitConverter.ToUInt64(sector, 0x1D8); - if(magic == ZEC_Magic || magic == ZEC_Cigam) return true; + if(magic == ZEC_MAGIC || magic == ZEC_CIGAM) return true; } if(partition.Start + 16 >= partition.End) return false; sector = imagePlugin.ReadSector(partition.Start + 16); magic = BitConverter.ToUInt64(sector, 0x1D8); - if(magic == ZEC_Magic || magic == ZEC_Cigam) return true; - - return false; + return magic == ZEC_MAGIC || magic == ZEC_CIGAM; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -281,42 +281,38 @@ namespace DiscImageChef.Filesystems ulong nvlistOff = 32; uint nvlistLen = 114688 / imagePlugin.ImageInfo.SectorSize; - byte[] nvlist; if(partition.Start + 31 < partition.End) { sector = imagePlugin.ReadSector(partition.Start + 31); magic = BitConverter.ToUInt64(sector, 0x1D8); - if(magic == ZEC_Magic || magic == ZEC_Cigam) nvlistOff = 32; + if(magic == ZEC_MAGIC || magic == ZEC_CIGAM) nvlistOff = 32; } if(partition.Start + 16 < partition.End) { sector = imagePlugin.ReadSector(partition.Start + 16); magic = BitConverter.ToUInt64(sector, 0x1D8); - if(magic == ZEC_Magic || magic == ZEC_Cigam) nvlistOff = 17; + if(magic == ZEC_MAGIC || magic == ZEC_CIGAM) nvlistOff = 17; } StringBuilder sb = new StringBuilder(); sb.AppendLine("ZFS filesystem"); - nvlist = imagePlugin.ReadSectors(partition.Start + nvlistOff, nvlistLen); - Dictionary decodedNvList; + byte[] nvlist = imagePlugin.ReadSectors(partition.Start + nvlistOff, nvlistLen); - if(!DecodeNvList(nvlist, out decodedNvList)) sb.AppendLine("Could not decode nvlist"); - else sb.AppendLine(PrintNvList(decodedNvList)); + sb.AppendLine(!DecodeNvList(nvlist, out Dictionary decodedNvList) + ? "Could not decode nvlist" + : PrintNvList(decodedNvList)); information = sb.ToString(); - NVS_Item tmpObj; - - xmlFSType = new FileSystemType(); - xmlFSType.Type = "ZFS filesystem"; - if(decodedNvList.TryGetValue("name", out tmpObj)) xmlFSType.VolumeName = (string)tmpObj.value; + XmlFsType = new FileSystemType {Type = "ZFS filesystem"}; + if(decodedNvList.TryGetValue("name", out NVS_Item tmpObj)) XmlFsType.VolumeName = (string)tmpObj.value; if(decodedNvList.TryGetValue("guid", out tmpObj)) - xmlFSType.VolumeSerial = $"{(ulong)tmpObj.value}"; + XmlFsType.VolumeSerial = $"{(ulong)tmpObj.value}"; if(decodedNvList.TryGetValue("pool_guid", out tmpObj)) - xmlFSType.VolumeSetIdentifier = $"{(ulong)tmpObj.value}"; + XmlFsType.VolumeSetIdentifier = $"{(ulong)tmpObj.value}"; } static bool DecodeNvList(byte[] nvlist, out Dictionary decodedNvList) @@ -346,7 +342,6 @@ namespace DiscImageChef.Filesystems while(offset < nvlist.Length) { uint nameLength; - byte[] nameBytes; NVS_Item item = new NVS_Item(); int currOff = offset; @@ -361,7 +356,7 @@ namespace DiscImageChef.Filesystems nameLength = BigEndianBitConverter.ToUInt32(nvlist, offset); offset += 4; if(nameLength % 4 > 0) nameLength += 4 - nameLength % 4; - nameBytes = new byte[nameLength]; + byte[] nameBytes = new byte[nameLength]; Array.Copy(nvlist, offset, nameBytes, 0, nameLength); item.name = StringHandlers.CToString(nameBytes); offset += (int)nameLength; @@ -644,8 +639,7 @@ namespace DiscImageChef.Filesystems byte[] subListBytes = new byte[item.encodedSize - (offset - currOff)]; Array.Copy(nvlist, offset, subListBytes, 0, subListBytes.Length); - Dictionary subList; - if(DecodeNvList(subListBytes, out subList, true, littleEndian)) item.value = subList; + if(DecodeNvList(subListBytes, out Dictionary subList, true, littleEndian)) item.value = subList; else goto default; offset = (int)(currOff + item.encodedSize); break; diff --git a/DiscImageChef.Filesystems/dump.cs b/DiscImageChef.Filesystems/dump.cs index d406acac3..067be97ff 100644 --- a/DiscImageChef.Filesystems/dump.cs +++ b/DiscImageChef.Filesystems/dump.cs @@ -32,6 +32,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; @@ -42,6 +43,7 @@ using ufs_daddr_t = System.Int32; namespace DiscImageChef.Filesystems { + [SuppressMessage("ReSharper", "InconsistentNaming")] public class dump : Filesystem { /// Magic number for old dump @@ -211,24 +213,22 @@ namespace DiscImageChef.Filesystems public dump() { Name = "dump(8) Plugin"; - PluginUUID = new Guid("E53B4D28-C858-4800-B092-DDAE80D361B9"); + PluginUuid = new Guid("E53B4D28-C858-4800-B092-DDAE80D361B9"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public dump(Encoding encoding) { Name = "dump(8) Plugin"; - PluginUUID = new Guid("E53B4D28-C858-4800-B092-DDAE80D361B9"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("E53B4D28-C858-4800-B092-DDAE80D361B9"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public dump(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "dump(8) Plugin"; - PluginUUID = new Guid("E53B4D28-C858-4800-B092-DDAE80D361B9"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("E53B4D28-C858-4800-B092-DDAE80D361B9"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -307,13 +307,10 @@ namespace DiscImageChef.Filesystems bool useOld = false; bool useAix = false; - bool useNew = false; if(newHdr.c_magic == OFS_MAGIC || newHdr.c_magic == NFS_MAGIC || newHdr.c_magic == OFS_CIGAM || newHdr.c_magic == NFS_CIGAM || newHdr.c_magic == UFS2_MAGIC || newHdr.c_magic == UFS2_CIGAM) { - useNew = true; - if(newHdr.c_magic == OFS_CIGAM || newHdr.c_magic == NFS_CIGAM || newHdr.c_magic == UFS2_CIGAM) newHdr = BigEndianMarshal.ByteArrayToStructureBigEndian(sector); } @@ -340,71 +337,71 @@ namespace DiscImageChef.Filesystems StringBuilder sb = new StringBuilder(); - xmlFSType = new FileSystemType {ClusterSize = 1024, Clusters = (long)(partition.Size / 1024)}; + XmlFsType = new FileSystemType {ClusterSize = 1024, Clusters = (long)(partition.Size / 1024)}; if(useOld) { - xmlFSType.Type = "Old 16-bit dump(8)"; - sb.AppendLine(xmlFSType.Type); + XmlFsType.Type = "Old 16-bit dump(8)"; + sb.AppendLine(XmlFsType.Type); if(oldHdr.c_date > 0) { - xmlFSType.CreationDate = DateHandlers.UNIXToDateTime(oldHdr.c_date); - xmlFSType.CreationDateSpecified = true; - sb.AppendFormat("Dump created on {0}", xmlFSType.CreationDate).AppendLine(); + XmlFsType.CreationDate = DateHandlers.UNIXToDateTime(oldHdr.c_date); + XmlFsType.CreationDateSpecified = true; + sb.AppendFormat("Dump created on {0}", XmlFsType.CreationDate).AppendLine(); } if(oldHdr.c_ddate > 0) { - xmlFSType.BackupDate = DateHandlers.UNIXToDateTime(oldHdr.c_ddate); - xmlFSType.BackupDateSpecified = true; - sb.AppendFormat("Previous dump created on {0}", xmlFSType.BackupDate).AppendLine(); + XmlFsType.BackupDate = DateHandlers.UNIXToDateTime(oldHdr.c_ddate); + XmlFsType.BackupDateSpecified = true; + sb.AppendFormat("Previous dump created on {0}", XmlFsType.BackupDate).AppendLine(); } sb.AppendFormat("Dump volume number: {0}", oldHdr.c_volume).AppendLine(); } else if(useAix) { - xmlFSType.Type = "AIX dump(8)"; - sb.AppendLine(xmlFSType.Type); + XmlFsType.Type = "AIX dump(8)"; + sb.AppendLine(XmlFsType.Type); if(aixHdr.c_date > 0) { - xmlFSType.CreationDate = DateHandlers.UNIXToDateTime(aixHdr.c_date); - xmlFSType.CreationDateSpecified = true; - sb.AppendFormat("Dump created on {0}", xmlFSType.CreationDate).AppendLine(); + XmlFsType.CreationDate = DateHandlers.UNIXToDateTime(aixHdr.c_date); + XmlFsType.CreationDateSpecified = true; + sb.AppendFormat("Dump created on {0}", XmlFsType.CreationDate).AppendLine(); } if(aixHdr.c_ddate > 0) { - xmlFSType.BackupDate = DateHandlers.UNIXToDateTime(aixHdr.c_ddate); - xmlFSType.BackupDateSpecified = true; - sb.AppendFormat("Previous dump created on {0}", xmlFSType.BackupDate).AppendLine(); + XmlFsType.BackupDate = DateHandlers.UNIXToDateTime(aixHdr.c_ddate); + XmlFsType.BackupDateSpecified = true; + sb.AppendFormat("Previous dump created on {0}", XmlFsType.BackupDate).AppendLine(); } sb.AppendFormat("Dump volume number: {0}", aixHdr.c_volume).AppendLine(); } else { - xmlFSType.Type = "dump(8)"; - sb.AppendLine(xmlFSType.Type); + XmlFsType.Type = "dump(8)"; + sb.AppendLine(XmlFsType.Type); if(newHdr.c_ndate > 0) { - xmlFSType.CreationDate = DateHandlers.UNIXToDateTime(newHdr.c_ndate); - xmlFSType.CreationDateSpecified = true; - sb.AppendFormat("Dump created on {0}", xmlFSType.CreationDate).AppendLine(); + XmlFsType.CreationDate = DateHandlers.UNIXToDateTime(newHdr.c_ndate); + XmlFsType.CreationDateSpecified = true; + sb.AppendFormat("Dump created on {0}", XmlFsType.CreationDate).AppendLine(); } else if(newHdr.c_date > 0) { - xmlFSType.CreationDate = DateHandlers.UNIXToDateTime(newHdr.c_date); - xmlFSType.CreationDateSpecified = true; - sb.AppendFormat("Dump created on {0}", xmlFSType.CreationDate).AppendLine(); + XmlFsType.CreationDate = DateHandlers.UNIXToDateTime(newHdr.c_date); + XmlFsType.CreationDateSpecified = true; + sb.AppendFormat("Dump created on {0}", XmlFsType.CreationDate).AppendLine(); } if(newHdr.c_nddate > 0) { - xmlFSType.BackupDate = DateHandlers.UNIXToDateTime(newHdr.c_nddate); - xmlFSType.BackupDateSpecified = true; - sb.AppendFormat("Previous dump created on {0}", xmlFSType.BackupDate).AppendLine(); + XmlFsType.BackupDate = DateHandlers.UNIXToDateTime(newHdr.c_nddate); + XmlFsType.BackupDateSpecified = true; + sb.AppendFormat("Previous dump created on {0}", XmlFsType.BackupDate).AppendLine(); } else if(newHdr.c_ddate > 0) { - xmlFSType.BackupDate = DateHandlers.UNIXToDateTime(newHdr.c_ddate); - xmlFSType.BackupDateSpecified = true; - sb.AppendFormat("Previous dump created on {0}", xmlFSType.BackupDate).AppendLine(); + XmlFsType.BackupDate = DateHandlers.UNIXToDateTime(newHdr.c_ddate); + XmlFsType.BackupDateSpecified = true; + sb.AppendFormat("Previous dump created on {0}", XmlFsType.BackupDate).AppendLine(); } sb.AppendFormat("Dump volume number: {0}", newHdr.c_volume).AppendLine(); sb.AppendFormat("Dump level: {0}", newHdr.c_level).AppendLine(); diff --git a/DiscImageChef.Filesystems/exFAT.cs b/DiscImageChef.Filesystems/exFAT.cs index 3716e59a4..a27c25776 100644 --- a/DiscImageChef.Filesystems/exFAT.cs +++ b/DiscImageChef.Filesystems/exFAT.cs @@ -47,24 +47,22 @@ namespace DiscImageChef.Filesystems public exFAT() { Name = "Microsoft Extended File Allocation Table"; - PluginUUID = new Guid("8271D088-1533-4CB3-AC28-D802B68BB95C"); + PluginUuid = new Guid("8271D088-1533-4CB3-AC28-D802B68BB95C"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public exFAT(Encoding encoding) { Name = "Microsoft Extended File Allocation Table"; - PluginUUID = new Guid("8271D088-1533-4CB3-AC28-D802B68BB95C"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("8271D088-1533-4CB3-AC28-D802B68BB95C"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public exFAT(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Microsoft Extended File Allocation Table"; - PluginUUID = new Guid("8271D088-1533-4CB3-AC28-D802B68BB95C"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("8271D088-1533-4CB3-AC28-D802B68BB95C"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) @@ -74,10 +72,9 @@ namespace DiscImageChef.Filesystems byte[] vbrSector = imagePlugin.ReadSector(0 + partition.Start); if(vbrSector.Length < 512) return false; - VolumeBootRecord vbr; IntPtr vbrPtr = Marshal.AllocHGlobal(512); Marshal.Copy(vbrSector, 0, vbrPtr, 512); - vbr = (VolumeBootRecord)Marshal.PtrToStructure(vbrPtr, typeof(VolumeBootRecord)); + VolumeBootRecord vbr = (VolumeBootRecord)Marshal.PtrToStructure(vbrPtr, typeof(VolumeBootRecord)); Marshal.FreeHGlobal(vbrPtr); return Signature.SequenceEqual(vbr.signature); @@ -88,27 +85,24 @@ namespace DiscImageChef.Filesystems information = ""; StringBuilder sb = new StringBuilder(); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); byte[] vbrSector = imagePlugin.ReadSector(0 + partition.Start); - VolumeBootRecord vbr; IntPtr vbrPtr = Marshal.AllocHGlobal(512); Marshal.Copy(vbrSector, 0, vbrPtr, 512); - vbr = (VolumeBootRecord)Marshal.PtrToStructure(vbrPtr, typeof(VolumeBootRecord)); + VolumeBootRecord vbr = (VolumeBootRecord)Marshal.PtrToStructure(vbrPtr, typeof(VolumeBootRecord)); Marshal.FreeHGlobal(vbrPtr); byte[] parametersSector = imagePlugin.ReadSector(9 + partition.Start); - OemParameterTable parametersTable; IntPtr parametersPtr = Marshal.AllocHGlobal(512); Marshal.Copy(parametersSector, 0, parametersPtr, 512); - parametersTable = (OemParameterTable)Marshal.PtrToStructure(parametersPtr, typeof(OemParameterTable)); + OemParameterTable parametersTable = (OemParameterTable)Marshal.PtrToStructure(parametersPtr, typeof(OemParameterTable)); Marshal.FreeHGlobal(parametersPtr); byte[] chkSector = imagePlugin.ReadSector(11 + partition.Start); - ChecksumSector chksector; IntPtr chkPtr = Marshal.AllocHGlobal(512); Marshal.Copy(chkSector, 0, chkPtr, 512); - chksector = (ChecksumSector)Marshal.PtrToStructure(chkPtr, typeof(ChecksumSector)); + ChecksumSector chksector = (ChecksumSector)Marshal.PtrToStructure(chkPtr, typeof(ChecksumSector)); Marshal.FreeHGlobal(chkPtr); sb.AppendLine("Microsoft exFAT"); @@ -152,11 +146,11 @@ namespace DiscImageChef.Filesystems sb.AppendFormat("Checksum 0x{0:X8}", chksector.checksum[0]).AppendLine(); - xmlFSType.ClusterSize = (1 << vbr.sectorShift) * (1 << vbr.clusterShift); - xmlFSType.Clusters = vbr.clusterHeapLength; - xmlFSType.Dirty = vbr.flags.HasFlag(VolumeFlags.VolumeDirty); - xmlFSType.Type = "exFAT"; - xmlFSType.VolumeSerial = $"{vbr.volumeSerial:X8}"; + XmlFsType.ClusterSize = (1 << vbr.sectorShift) * (1 << vbr.clusterShift); + XmlFsType.Clusters = vbr.clusterHeapLength; + XmlFsType.Dirty = vbr.flags.HasFlag(VolumeFlags.VolumeDirty); + XmlFsType.Type = "exFAT"; + XmlFsType.VolumeSerial = $"{vbr.volumeSerial:X8}"; information = sb.ToString(); } diff --git a/DiscImageChef.Filesystems/ext2FS.cs b/DiscImageChef.Filesystems/ext2FS.cs index 35b8ea27a..9eaf7526d 100644 --- a/DiscImageChef.Filesystems/ext2FS.cs +++ b/DiscImageChef.Filesystems/ext2FS.cs @@ -32,6 +32,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices; using System.Text; using DiscImageChef.CommonTypes; @@ -43,51 +44,47 @@ namespace DiscImageChef.Filesystems // Information from the Linux kernel public class ext2FS : Filesystem { - const int sbPos = 0x400; + const int SB_POS = 0x400; public ext2FS() { Name = "Linux extended Filesystem 2, 3 and 4"; - PluginUUID = new Guid("6AA91B88-150B-4A7B-AD56-F84FB2DF4184"); + PluginUuid = new Guid("6AA91B88-150B-4A7B-AD56-F84FB2DF4184"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public ext2FS(Encoding encoding) { Name = "Linux extended Filesystem 2, 3 and 4"; - PluginUUID = new Guid("6AA91B88-150B-4A7B-AD56-F84FB2DF4184"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("6AA91B88-150B-4A7B-AD56-F84FB2DF4184"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public ext2FS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Linux extended Filesystem 2, 3 and 4"; - PluginUUID = new Guid("6AA91B88-150B-4A7B-AD56-F84FB2DF4184"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("6AA91B88-150B-4A7B-AD56-F84FB2DF4184"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { - ulong sbSector = sbPos / imagePlugin.GetSectorSize(); - uint sbOff = sbPos % imagePlugin.GetSectorSize(); + ulong sbSectorOff = SB_POS / imagePlugin.GetSectorSize(); + uint sbOff = SB_POS % imagePlugin.GetSectorSize(); - if(sbSector + partition.Start >= partition.End) return false; + if(sbSectorOff + partition.Start >= partition.End) return false; - int sb_size_in_bytes = Marshal.SizeOf(typeof(ext2FSSuperBlock)); - uint sb_size_in_sectors = (uint)(sb_size_in_bytes / imagePlugin.GetSectorSize()); - if(sb_size_in_bytes % imagePlugin.GetSectorSize() > 0) sb_size_in_sectors++; + int sbSizeInBytes = Marshal.SizeOf(typeof(ext2FSSuperBlock)); + uint sbSizeInSectors = (uint)(sbSizeInBytes / imagePlugin.GetSectorSize()); + if(sbSizeInBytes % imagePlugin.GetSectorSize() > 0) sbSizeInSectors++; - byte[] sb_sector = imagePlugin.ReadSectors(sbSector + partition.Start, sb_size_in_sectors); - byte[] sb = new byte[sb_size_in_bytes]; - Array.Copy(sb_sector, sbOff, sb, 0, sb_size_in_bytes); + byte[] sbSector = imagePlugin.ReadSectors(sbSectorOff + partition.Start, sbSizeInSectors); + byte[] sb = new byte[sbSizeInBytes]; + Array.Copy(sbSector, sbOff, sb, 0, sbSizeInBytes); ushort magic = BitConverter.ToUInt16(sb, 0x038); - if(magic == ext2FSMagic || magic == ext2OldFSMagic) return true; - - return false; + return magic == EXT2_MAGIC || magic == EXT2_MAGIC_OLD; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -97,34 +94,33 @@ namespace DiscImageChef.Filesystems StringBuilder sb = new StringBuilder(); - ext2FSSuperBlock supblk = new ext2FSSuperBlock(); - bool new_ext2 = false; + bool newExt2 = false; bool ext3 = false; bool ext4 = false; - int sb_size_in_bytes = Marshal.SizeOf(typeof(ext2FSSuperBlock)); - uint sb_size_in_sectors = (uint)(sb_size_in_bytes / imagePlugin.GetSectorSize()); - if(sb_size_in_bytes % imagePlugin.GetSectorSize() > 0) sb_size_in_sectors++; + int sbSizeInBytes = Marshal.SizeOf(typeof(ext2FSSuperBlock)); + uint sbSizeInSectors = (uint)(sbSizeInBytes / imagePlugin.GetSectorSize()); + if(sbSizeInBytes % imagePlugin.GetSectorSize() > 0) sbSizeInSectors++; - ulong sbSector = sbPos / imagePlugin.GetSectorSize(); - uint sbOff = sbPos % imagePlugin.GetSectorSize(); + ulong sbSectorOff = SB_POS / imagePlugin.GetSectorSize(); + uint sbOff = SB_POS % imagePlugin.GetSectorSize(); - byte[] sb_sector = imagePlugin.ReadSectors(sbSector + partition.Start, sb_size_in_sectors); - byte[] sblock = new byte[sb_size_in_bytes]; - Array.Copy(sb_sector, sbOff, sblock, 0, sb_size_in_bytes); - IntPtr sbPtr = Marshal.AllocHGlobal(sb_size_in_bytes); - Marshal.Copy(sblock, 0, sbPtr, sb_size_in_bytes); - supblk = (ext2FSSuperBlock)Marshal.PtrToStructure(sbPtr, typeof(ext2FSSuperBlock)); + byte[] sbSector = imagePlugin.ReadSectors(sbSectorOff + partition.Start, sbSizeInSectors); + byte[] sblock = new byte[sbSizeInBytes]; + Array.Copy(sbSector, sbOff, sblock, 0, sbSizeInBytes); + IntPtr sbPtr = Marshal.AllocHGlobal(sbSizeInBytes); + Marshal.Copy(sblock, 0, sbPtr, sbSizeInBytes); + ext2FSSuperBlock supblk = (ext2FSSuperBlock)Marshal.PtrToStructure(sbPtr, typeof(ext2FSSuperBlock)); Marshal.FreeHGlobal(sbPtr); - xmlFSType = new FileSystemType(); + XmlFsType = new FileSystemType(); switch(supblk.magic) { - case ext2OldFSMagic: + case EXT2_MAGIC_OLD: sb.AppendLine("ext2 (old) filesystem"); - xmlFSType.Type = "ext2"; + XmlFsType.Type = "ext2"; break; - case ext2FSMagic: + case EXT2_MAGIC: ext3 |= (supblk.ftr_compat & EXT3_FEATURE_COMPAT_HAS_JOURNAL) == EXT3_FEATURE_COMPAT_HAS_JOURNAL || (supblk.ftr_incompat & EXT3_FEATURE_INCOMPAT_RECOVER) == EXT3_FEATURE_INCOMPAT_RECOVER || (supblk.ftr_incompat & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) == EXT3_FEATURE_INCOMPAT_JOURNAL_DEV; @@ -143,22 +139,22 @@ namespace DiscImageChef.Filesystems ext4 = true; } - new_ext2 |= !ext3 && !ext4; + newExt2 |= !ext3 && !ext4; - if(new_ext2) + if(newExt2) { sb.AppendLine("ext2 filesystem"); - xmlFSType.Type = "ext2"; + XmlFsType.Type = "ext2"; } if(ext3) { sb.AppendLine("ext3 filesystem"); - xmlFSType.Type = "ext3"; + XmlFsType.Type = "ext3"; } if(ext4) { sb.AppendLine("ext4 filesystem"); - xmlFSType.Type = "ext4"; + XmlFsType.Type = "ext4"; } break; default: @@ -166,81 +162,80 @@ namespace DiscImageChef.Filesystems return; } - string ext_os; + string extOs; switch(supblk.creator_os) { case EXT2_OS_FREEBSD: - ext_os = "FreeBSD"; + extOs = "FreeBSD"; break; case EXT2_OS_HURD: - ext_os = "Hurd"; + extOs = "Hurd"; break; case EXT2_OS_LINUX: - ext_os = "Linux"; + extOs = "Linux"; break; case EXT2_OS_LITES: - ext_os = "Lites"; + extOs = "Lites"; break; case EXT2_OS_MASIX: - ext_os = "MasIX"; + extOs = "MasIX"; break; default: - ext_os = $"Unknown OS ({supblk.creator_os})"; + extOs = $"Unknown OS ({supblk.creator_os})"; break; } - xmlFSType.SystemIdentifier = ext_os; + XmlFsType.SystemIdentifier = extOs; if(supblk.mkfs_t > 0) { sb.AppendFormat("Volume was created on {0} for {1}", DateHandlers.UNIXUnsignedToDateTime(supblk.mkfs_t), - ext_os).AppendLine(); - xmlFSType.CreationDate = DateHandlers.UNIXUnsignedToDateTime(supblk.mkfs_t); - xmlFSType.CreationDateSpecified = true; + extOs).AppendLine(); + XmlFsType.CreationDate = DateHandlers.UNIXUnsignedToDateTime(supblk.mkfs_t); + XmlFsType.CreationDateSpecified = true; } - else sb.AppendFormat("Volume was created for {0}", ext_os).AppendLine(); + else sb.AppendFormat("Volume was created for {0}", extOs).AppendLine(); - byte[] temp_lo, temp_hi; - byte[] temp_bytes = new byte[8]; + byte[] tempBytes = new byte[8]; ulong blocks, reserved, free; if((supblk.ftr_incompat & EXT4_FEATURE_INCOMPAT_64BIT) == EXT4_FEATURE_INCOMPAT_64BIT) { - temp_lo = BitConverter.GetBytes(supblk.blocks); - temp_hi = BitConverter.GetBytes(supblk.blocks_hi); - temp_bytes[0] = temp_lo[0]; - temp_bytes[1] = temp_lo[1]; - temp_bytes[2] = temp_lo[2]; - temp_bytes[3] = temp_lo[3]; - temp_bytes[4] = temp_hi[0]; - temp_bytes[5] = temp_hi[1]; - temp_bytes[6] = temp_hi[2]; - temp_bytes[7] = temp_hi[3]; - blocks = BitConverter.ToUInt64(temp_bytes, 0); + byte[] tempLo = BitConverter.GetBytes(supblk.blocks); + byte[] tempHi = BitConverter.GetBytes(supblk.blocks_hi); + tempBytes[0] = tempLo[0]; + tempBytes[1] = tempLo[1]; + tempBytes[2] = tempLo[2]; + tempBytes[3] = tempLo[3]; + tempBytes[4] = tempHi[0]; + tempBytes[5] = tempHi[1]; + tempBytes[6] = tempHi[2]; + tempBytes[7] = tempHi[3]; + blocks = BitConverter.ToUInt64(tempBytes, 0); - temp_lo = BitConverter.GetBytes(supblk.reserved_blocks); - temp_hi = BitConverter.GetBytes(supblk.reserved_blocks_hi); - temp_bytes[0] = temp_lo[0]; - temp_bytes[1] = temp_lo[1]; - temp_bytes[2] = temp_lo[2]; - temp_bytes[3] = temp_lo[3]; - temp_bytes[4] = temp_hi[0]; - temp_bytes[5] = temp_hi[1]; - temp_bytes[6] = temp_hi[2]; - temp_bytes[7] = temp_hi[3]; - reserved = BitConverter.ToUInt64(temp_bytes, 0); + tempLo = BitConverter.GetBytes(supblk.reserved_blocks); + tempHi = BitConverter.GetBytes(supblk.reserved_blocks_hi); + tempBytes[0] = tempLo[0]; + tempBytes[1] = tempLo[1]; + tempBytes[2] = tempLo[2]; + tempBytes[3] = tempLo[3]; + tempBytes[4] = tempHi[0]; + tempBytes[5] = tempHi[1]; + tempBytes[6] = tempHi[2]; + tempBytes[7] = tempHi[3]; + reserved = BitConverter.ToUInt64(tempBytes, 0); - temp_lo = BitConverter.GetBytes(supblk.free_blocks); - temp_hi = BitConverter.GetBytes(supblk.free_blocks_hi); - temp_bytes[0] = temp_lo[0]; - temp_bytes[1] = temp_lo[1]; - temp_bytes[2] = temp_lo[2]; - temp_bytes[3] = temp_lo[3]; - temp_bytes[4] = temp_hi[0]; - temp_bytes[5] = temp_hi[1]; - temp_bytes[6] = temp_hi[2]; - temp_bytes[7] = temp_hi[3]; - free = BitConverter.ToUInt64(temp_bytes, 0); + tempLo = BitConverter.GetBytes(supblk.free_blocks); + tempHi = BitConverter.GetBytes(supblk.free_blocks_hi); + tempBytes[0] = tempLo[0]; + tempBytes[1] = tempLo[1]; + tempBytes[2] = tempLo[2]; + tempBytes[3] = tempLo[3]; + tempBytes[4] = tempHi[0]; + tempBytes[5] = tempHi[1]; + tempBytes[6] = tempHi[2]; + tempBytes[7] = tempHi[3]; + free = BitConverter.ToUInt64(tempBytes, 0); } else { @@ -255,8 +250,8 @@ namespace DiscImageChef.Filesystems sb.AppendFormat("Volume has {0} blocks of {1} bytes, for a total of {2} bytes", blocks, 1024 << (int)supblk.block_size, blocks * (ulong)(1024 << (int)supblk.block_size)) .AppendLine(); - xmlFSType.Clusters = (long)blocks; - xmlFSType.ClusterSize = 1024 << (int)supblk.block_size; + XmlFsType.Clusters = (long)blocks; + XmlFsType.ClusterSize = 1024 << (int)supblk.block_size; if(supblk.mount_t > 0 || supblk.mount_c > 0) { if(supblk.mount_t > 0) @@ -302,17 +297,17 @@ namespace DiscImageChef.Filesystems { sb.AppendFormat("Last written on {0}", DateHandlers.UNIXUnsignedToDateTime(supblk.write_t)) .AppendLine(); - xmlFSType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(supblk.write_t); - xmlFSType.ModificationDateSpecified = true; + XmlFsType.ModificationDate = DateHandlers.UNIXUnsignedToDateTime(supblk.write_t); + XmlFsType.ModificationDateSpecified = true; } else sb.AppendLine("Volume has never been written"); - xmlFSType.Dirty = true; + XmlFsType.Dirty = true; switch(supblk.state) { case EXT2_VALID_FS: sb.AppendLine("Volume is clean"); - xmlFSType.Dirty = false; + XmlFsType.Dirty = false; break; case EXT2_ERROR_FS: sb.AppendLine("Volume is dirty"); @@ -329,7 +324,7 @@ namespace DiscImageChef.Filesystems { sb.AppendFormat("Volume name: \"{0}\"", StringHandlers.CToString(supblk.volume_name, CurrentEncoding)) .AppendLine(); - xmlFSType.VolumeName = StringHandlers.CToString(supblk.volume_name, CurrentEncoding); + XmlFsType.VolumeName = StringHandlers.CToString(supblk.volume_name, CurrentEncoding); } switch(supblk.err_behaviour) @@ -355,15 +350,15 @@ namespace DiscImageChef.Filesystems if(supblk.uuid != Guid.Empty) { sb.AppendFormat("Volume UUID: {0}", supblk.uuid).AppendLine(); - xmlFSType.VolumeSerial = supblk.uuid.ToString(); + XmlFsType.VolumeSerial = supblk.uuid.ToString(); } if(supblk.kbytes_written > 0) sb.AppendFormat("{0} KiB has been written on volume", supblk.kbytes_written).AppendLine(); sb.AppendFormat("{0} reserved and {1} free blocks", reserved, free).AppendLine(); - xmlFSType.FreeClusters = (long)free; - xmlFSType.FreeClustersSpecified = true; + XmlFsType.FreeClusters = (long)free; + XmlFsType.FreeClustersSpecified = true; sb.AppendFormat("{0} inodes with {1} free inodes ({2}%)", supblk.inodes, supblk.free_inodes, supblk.free_inodes * 100 / supblk.inodes).AppendLine(); if(supblk.first_inode > 0) sb.AppendFormat("First inode is {0}", supblk.first_inode).AppendLine(); @@ -533,14 +528,15 @@ namespace DiscImageChef.Filesystems /// /// Same magic for ext2, ext3 and ext4 /// - const ushort ext2FSMagic = 0xEF53; + const ushort EXT2_MAGIC = 0xEF53; - const ushort ext2OldFSMagic = 0xEF51; + const ushort EXT2_MAGIC_OLD = 0xEF51; /// /// ext2/3/4 superblock /// [StructLayout(LayoutKind.Sequential, Pack = 1)] + [SuppressMessage("ReSharper", "InconsistentNaming")] struct ext2FSSuperBlock { /// 0x000, inodes on volume diff --git a/DiscImageChef.Filesystems/extFS.cs b/DiscImageChef.Filesystems/extFS.cs index 178b3eb20..2e23ce5c2 100644 --- a/DiscImageChef.Filesystems/extFS.cs +++ b/DiscImageChef.Filesystems/extFS.cs @@ -32,6 +32,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Text; using DiscImageChef.CommonTypes; using DiscImageChef.DiscImages; @@ -42,47 +43,45 @@ namespace DiscImageChef.Filesystems // Information from the Linux kernel public class extFS : Filesystem { - const int sbPos = 0x400; + const int SB_POS = 0x400; public extFS() { Name = "Linux extended Filesystem"; - PluginUUID = new Guid("076CB3A2-08C2-4D69-BC8A-FCAA2E502BE2"); + PluginUuid = new Guid("076CB3A2-08C2-4D69-BC8A-FCAA2E502BE2"); CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); } public extFS(Encoding encoding) { Name = "Linux extended Filesystem"; - PluginUUID = new Guid("076CB3A2-08C2-4D69-BC8A-FCAA2E502BE2"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("076CB3A2-08C2-4D69-BC8A-FCAA2E502BE2"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public extFS(ImagePlugin imagePlugin, Partition partition, Encoding encoding) { Name = "Linux extended Filesystem"; - PluginUUID = new Guid("076CB3A2-08C2-4D69-BC8A-FCAA2E502BE2"); - if(encoding == null) CurrentEncoding = Encoding.GetEncoding("iso-8859-15"); - else CurrentEncoding = encoding; + PluginUuid = new Guid("076CB3A2-08C2-4D69-BC8A-FCAA2E502BE2"); + CurrentEncoding = encoding ?? Encoding.GetEncoding("iso-8859-15"); } public override bool Identify(ImagePlugin imagePlugin, Partition partition) { if(imagePlugin.GetSectorSize() < 512) return false; - ulong sbSector = sbPos / imagePlugin.GetSectorSize(); - uint sbOff = sbPos % imagePlugin.GetSectorSize(); + ulong sbSectorOff = SB_POS / imagePlugin.GetSectorSize(); + uint sbOff = SB_POS % imagePlugin.GetSectorSize(); - if(sbSector + partition.Start >= partition.End) return false; + if(sbSectorOff + partition.Start >= partition.End) return false; - byte[] sb_sector = imagePlugin.ReadSector(sbSector + partition.Start); + byte[] sbSector = imagePlugin.ReadSector(sbSectorOff + partition.Start); byte[] sb = new byte[512]; - Array.Copy(sb_sector, sbOff, sb, 0, 512); + Array.Copy(sbSector, sbOff, sb, 0, 512); ushort magic = BitConverter.ToUInt16(sb, 0x038); - return magic == extFSMagic; + return magic == EXT_MAGIC; } public override void GetInformation(ImagePlugin imagePlugin, Partition partition, @@ -94,44 +93,48 @@ namespace DiscImageChef.Filesystems if(imagePlugin.GetSectorSize() < 512) return; - ulong sbSector = sbPos / imagePlugin.GetSectorSize(); - uint sbOff = sbPos % imagePlugin.GetSectorSize(); + ulong sbSectorOff = SB_POS / imagePlugin.GetSectorSize(); + uint sbOff = SB_POS % imagePlugin.GetSectorSize(); - if(sbSector + partition.Start >= partition.End) return; + if(sbSectorOff + partition.Start >= partition.End) return; - byte[] sblock = imagePlugin.ReadSector(sbSector + partition.Start); - byte[] sb_sector = new byte[512]; - Array.Copy(sblock, sbOff, sb_sector, 0, 512); + byte[] sblock = imagePlugin.ReadSector(sbSectorOff + partition.Start); + byte[] sbSector = new byte[512]; + Array.Copy(sblock, sbOff, sbSector, 0, 512); - extFSSuperBlock ext_sb = new extFSSuperBlock(); + extFSSuperBlock extSb = new extFSSuperBlock + { + inodes = BitConverter.ToUInt32(sbSector, 0x000), + zones = BitConverter.ToUInt32(sbSector, 0x004), + firstfreeblk = BitConverter.ToUInt32(sbSector, 0x008), + freecountblk = BitConverter.ToUInt32(sbSector, 0x00C), + firstfreeind = BitConverter.ToUInt32(sbSector, 0x010), + freecountind = BitConverter.ToUInt32(sbSector, 0x014), + firstdatazone = BitConverter.ToUInt32(sbSector, 0x018), + logzonesize = BitConverter.ToUInt32(sbSector, 0x01C), + maxsize = BitConverter.ToUInt32(sbSector, 0x020) + }; - ext_sb.inodes = BitConverter.ToUInt32(sb_sector, 0x000); - ext_sb.zones = BitConverter.ToUInt32(sb_sector, 0x004); - ext_sb.firstfreeblk = BitConverter.ToUInt32(sb_sector, 0x008); - ext_sb.freecountblk = BitConverter.ToUInt32(sb_sector, 0x00C); - ext_sb.firstfreeind = BitConverter.ToUInt32(sb_sector, 0x010); - ext_sb.freecountind = BitConverter.ToUInt32(sb_sector, 0x014); - ext_sb.firstdatazone = BitConverter.ToUInt32(sb_sector, 0x018); - ext_sb.logzonesize = BitConverter.ToUInt32(sb_sector, 0x01C); - ext_sb.maxsize = BitConverter.ToUInt32(sb_sector, 0x020); sb.AppendLine("ext filesystem"); - sb.AppendFormat("{0} zones on volume", ext_sb.zones); - sb.AppendFormat("{0} free blocks ({1} bytes)", ext_sb.freecountblk, ext_sb.freecountblk * 1024); - sb.AppendFormat("{0} inodes on volume, {1} free ({2}%)", ext_sb.inodes, ext_sb.freecountind, - ext_sb.freecountind * 100 / ext_sb.inodes); - sb.AppendFormat("First free inode is {0}", ext_sb.firstfreeind); - sb.AppendFormat("First free block is {0}", ext_sb.firstfreeblk); - sb.AppendFormat("First data zone is {0}", ext_sb.firstdatazone); - sb.AppendFormat("Log zone size: {0}", ext_sb.logzonesize); - sb.AppendFormat("Max zone size: {0}", ext_sb.maxsize); + sb.AppendFormat("{0} zones on volume", extSb.zones); + sb.AppendFormat("{0} free blocks ({1} bytes)", extSb.freecountblk, extSb.freecountblk * 1024); + sb.AppendFormat("{0} inodes on volume, {1} free ({2}%)", extSb.inodes, extSb.freecountind, + extSb.freecountind * 100 / extSb.inodes); + sb.AppendFormat("First free inode is {0}", extSb.firstfreeind); + sb.AppendFormat("First free block is {0}", extSb.firstfreeblk); + sb.AppendFormat("First data zone is {0}", extSb.firstdatazone); + sb.AppendFormat("Log zone size: {0}", extSb.logzonesize); + sb.AppendFormat("Max zone size: {0}", extSb.maxsize); - xmlFSType = new FileSystemType(); - xmlFSType.Type = "ext"; - xmlFSType.FreeClusters = ext_sb.freecountblk; - xmlFSType.FreeClustersSpecified = true; - xmlFSType.ClusterSize = 1024; - xmlFSType.Clusters = (long)((partition.End - partition.Start + 1) * imagePlugin.GetSectorSize() / 1024); + XmlFsType = new FileSystemType + { + Type = "ext", + FreeClusters = extSb.freecountblk, + FreeClustersSpecified = true, + ClusterSize = 1024, + Clusters = (long)((partition.End - partition.Start + 1) * imagePlugin.GetSectorSize() / 1024) + }; information = sb.ToString(); } @@ -139,11 +142,12 @@ namespace DiscImageChef.Filesystems /// /// ext superblock magic /// - const ushort extFSMagic = 0x137D; + const ushort EXT_MAGIC = 0x137D; /// /// ext superblock /// + [SuppressMessage("ReSharper", "InconsistentNaming")] struct extFSSuperBlock { /// 0x000, inodes on volume diff --git a/DiscImageChef/Commands/Formats.cs b/DiscImageChef/Commands/Formats.cs index e6258f3ae..e723b16b7 100644 --- a/DiscImageChef/Commands/Formats.cs +++ b/DiscImageChef/Commands/Formats.cs @@ -67,7 +67,7 @@ namespace DiscImageChef.Commands if(formatsOptions.Verbose) DicConsole.VerboseWriteLine("GUID\t\t\t\t\tPlugin"); foreach(KeyValuePair kvp in plugins.PluginsList) if(formatsOptions.Verbose) - DicConsole.VerboseWriteLine("{0}\t{1}", kvp.Value.PluginUUID, kvp.Value.Name); + DicConsole.VerboseWriteLine("{0}\t{1}", kvp.Value.PluginUuid, kvp.Value.Name); else DicConsole.WriteLine(kvp.Value.Name); DicConsole.WriteLine();