From 55b038daaf52e78a9850687d5546b5807186d119 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 13 Oct 2016 21:31:30 +0100 Subject: [PATCH] Added MODE PAGE 1Dh --- DiscImageChef.Decoders/ChangeLog | 4 ++ DiscImageChef.Decoders/SCSI/Modes.cs | 93 ++++++++++++++++++++++++++++ DiscImageChef/ChangeLog | 5 ++ DiscImageChef/Commands/DeviceInfo.cs | 9 +++ 4 files changed, 111 insertions(+) diff --git a/DiscImageChef.Decoders/ChangeLog b/DiscImageChef.Decoders/ChangeLog index 1a84aaf51..4cf443887 100644 --- a/DiscImageChef.Decoders/ChangeLog +++ b/DiscImageChef.Decoders/ChangeLog @@ -1,3 +1,7 @@ +2016-10-13 Natalia Portillo + + * Modes.cs: Added MODE PAGE 1Dh + 2016-10-13 Natalia Portillo * EVPD.cs: diff --git a/DiscImageChef.Decoders/SCSI/Modes.cs b/DiscImageChef.Decoders/SCSI/Modes.cs index 7c0ac62e6..455998fca 100644 --- a/DiscImageChef.Decoders/SCSI/Modes.cs +++ b/DiscImageChef.Decoders/SCSI/Modes.cs @@ -7396,6 +7396,99 @@ namespace DiscImageChef.Decoders.SCSI #endregion Certance Mode Page 0x22: Interface Control Mode Page + #region Mode Page 0x1D: Medium Configuration Mode Page + public struct ModePage_1D + { + /// + /// Parameters can be saved + /// + public bool PS; + public bool WORMM; + public byte WormModeLabelRestrictions; + public byte WormModeFilemarkRestrictions; + } + + public static ModePage_1D? DecodeModePage_1D(byte[] pageResponse) + { + if(pageResponse == null) + return null; + + if((pageResponse[0] & 0x40) == 0x40) + return null; + + if((pageResponse[0] & 0x3F) != 0x1D) + return null; + + if(pageResponse[1] + 2 != pageResponse.Length) + return null; + + if(pageResponse.Length < 32) + return null; + + ModePage_1D decoded = new ModePage_1D(); + + decoded.PS |= (pageResponse[0] & 0x80) == 0x80; + decoded.WORMM |= (pageResponse[2] & 0x01) == 0x01; + decoded.WormModeLabelRestrictions = pageResponse[4]; + decoded.WormModeFilemarkRestrictions = pageResponse[5]; + + return decoded; + } + + public static string PrettifyModePage_1D(byte[] pageResponse) + { + return PrettifyModePage_1D(DecodeModePage_1D(pageResponse)); + } + + public static string PrettifyModePage_1D(ModePage_1D? modePage) + { + if(!modePage.HasValue) + return null; + + ModePage_1D page = modePage.Value; + StringBuilder sb = new StringBuilder(); + + sb.AppendLine("SCSI Medium Configuration Mode Page:"); + + if(page.PS) + sb.AppendLine("\tParameters can be saved"); + + if(page.WORMM) + sb.AppendLine("\tDrive is operating in WORM mode"); + + switch(page.WormModeLabelRestrictions) + { + case 0: + sb.AppendLine("\tDrive does not allow any logical blocks to be overwritten"); + break; + case 1: + sb.AppendLine("\tDrive allows a tape header to be overwritten"); + break; + case 2: + sb.AppendLine("\tDrive allows all format labels to be overwritten"); + break; + default: + sb.AppendFormat("\tUnknown WORM mode label restrictions code {0}", page.WormModeLabelRestrictions).AppendLine(); + break; + } + + switch(page.WormModeFilemarkRestrictions) + { + case 2: + sb.AppendLine("\tDrive allows any number of filemarks immediately preceding EOD to be overwritten except filemark closes to BOP"); + break; + case 3: + sb.AppendLine("\tDrive allows any number of filemarks immediately preceding EOD to be overwritten"); + break; + default: + sb.AppendFormat("\tUnknown WORM mode filemark restrictions code {0}", page.WormModeLabelRestrictions).AppendLine(); + break; + } + + return sb.ToString(); + } + + #endregion Mode Page 0x1D: Medium Configuration Mode Page } } diff --git a/DiscImageChef/ChangeLog b/DiscImageChef/ChangeLog index bc83c942d..6185b807f 100644 --- a/DiscImageChef/ChangeLog +++ b/DiscImageChef/ChangeLog @@ -1,3 +1,8 @@ +2016-10-13 Natalia Portillo + + * Commands/DeviceInfo.cs: + Added MODE PAGE 1Dh + 2016-10-13 Natalia Portillo * Commands/DeviceInfo.cs: diff --git a/DiscImageChef/Commands/DeviceInfo.cs b/DiscImageChef/Commands/DeviceInfo.cs index 09f40f5be..421e86c60 100644 --- a/DiscImageChef/Commands/DeviceInfo.cs +++ b/DiscImageChef/Commands/DeviceInfo.cs @@ -603,6 +603,15 @@ namespace DiscImageChef.Commands else goto default; + break; + } + case 0x1D: + { + if(page.Subpage == 0) + DicConsole.WriteLine(Decoders.SCSI.Modes.PrettifyModePage_1D(page.PageResponse)); + else + goto default; + break; } case 0x21: