diff --git a/ChangeLog b/ChangeLog index f25578e..01cbf2d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2016-02-03 Natalia Portillo + + * SCSI/Inquiry.cs: + Corrected bug on inquiry decoding. + + * SCSI/Modes.cs: + Corrected bug on decoding mode page 2Ah without write + performance descriptors. + Corrected bug when there is a vendor page 0 in mode sense + decoding. + 2016-01-15 Natalia Portillo * SCSI/Modes.cs: diff --git a/SCSI/Inquiry.cs b/SCSI/Inquiry.cs index baf0ec4..096c777 100644 --- a/SCSI/Inquiry.cs +++ b/SCSI/Inquiry.cs @@ -189,7 +189,7 @@ namespace DiscImageChef.Decoders.SCSI if (SCSIInquiryResponse.Length > 96) { decoded.VendorSpecific2 = new byte[SCSIInquiryResponse.Length - 96]; - Array.Copy(SCSIInquiryResponse, 96, decoded.Reserved5, 0, SCSIInquiryResponse.Length - 96); + Array.Copy(SCSIInquiryResponse, 96, decoded.VendorSpecific2, 0, SCSIInquiryResponse.Length - 96); } return decoded; diff --git a/SCSI/Modes.cs b/SCSI/Modes.cs index bfe1448..2f3c7cd 100644 --- a/SCSI/Modes.cs +++ b/SCSI/Modes.cs @@ -5173,14 +5173,17 @@ namespace DiscImageChef.Decoders.SCSI sb.AppendFormat("\tDrive's current writing speed is {0} Kbyte/sec.", page.CurrentWriteSpeed).AppendLine(); } - foreach (ModePage_2A_WriteDescriptor descriptor in page.WriteSpeedPerformanceDescriptors) + if(page.WriteSpeedPerformanceDescriptors != null) { - if (descriptor.WriteSpeed > 0) + foreach (ModePage_2A_WriteDescriptor descriptor in page.WriteSpeedPerformanceDescriptors) { - if (descriptor.RotationControl == 0) - sb.AppendFormat("\tDrive supports writing at {0} Kbyte/sec. in CLV mode", descriptor.WriteSpeed).AppendLine(); - else if (descriptor.RotationControl == 1) - sb.AppendFormat("\tDrive supports writing at is {0} Kbyte/sec. in pure CAV mode", descriptor.WriteSpeed).AppendLine(); + if (descriptor.WriteSpeed > 0) + { + if (descriptor.RotationControl == 0) + sb.AppendFormat("\tDrive supports writing at {0} Kbyte/sec. in CLV mode", descriptor.WriteSpeed).AppendLine(); + else if (descriptor.RotationControl == 1) + sb.AppendFormat("\tDrive supports writing at is {0} Kbyte/sec. in pure CAV mode", descriptor.WriteSpeed).AppendLine(); + } } } @@ -6530,22 +6533,38 @@ namespace DiscImageChef.Decoders.SCSI { bool isSubpage = (modeResponse[offset] & 0x40) == 0x40; ModePage pg = new ModePage(); + byte pageNo = (byte)(modeResponse[offset] & 0x3F); - if (isSubpage) - { - pg.PageResponse = new byte[(modeResponse[offset + 2] << 8) + modeResponse[offset + 3] + 4]; + if (pageNo == 0) + { + pg.PageResponse = new byte[modeResponse.Length - offset]; Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); - pg.Page = (byte)(modeResponse[offset] & 0x3F); - pg.Subpage = modeResponse[offset + 1]; + pg.Page = 0; + pg.Subpage = 0; offset += pg.PageResponse.Length; } else { - pg.PageResponse = new byte[modeResponse[offset + 1] + 2]; - Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); - pg.Page = (byte)(modeResponse[offset] & 0x3F); - pg.Subpage = 0; - offset += pg.PageResponse.Length; + if (isSubpage) + { + pg.PageResponse = new byte[(modeResponse[offset + 2] << 8) + modeResponse[offset + 3] + 4]; + if ((pg.PageResponse.Length + offset) > modeResponse.Length) + return decoded; + Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); + pg.Page = (byte)(modeResponse[offset] & 0x3F); + pg.Subpage = modeResponse[offset + 1]; + offset += pg.PageResponse.Length; + } + else + { + pg.PageResponse = new byte[modeResponse[offset + 1] + 2]; + if ((pg.PageResponse.Length + offset) > modeResponse.Length) + return decoded; + Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); + pg.Page = (byte)(modeResponse[offset] & 0x3F); + pg.Subpage = 0; + offset += pg.PageResponse.Length; + } } listpages.Add(pg); @@ -6587,30 +6606,42 @@ namespace DiscImageChef.Decoders.SCSI { bool isSubpage = (modeResponse[offset] & 0x40) == 0x40; ModePage pg = new ModePage(); + byte pageNo = (byte)(modeResponse[offset] & 0x3F); - if (isSubpage) + if (pageNo == 0) { - pg.PageResponse = new byte[(modeResponse[offset + 2] << 8) + modeResponse[offset + 3] + 4]; - - if ((pg.PageResponse.Length + offset) > modeResponse.Length) - return decoded; - + pg.PageResponse = new byte[modeResponse.Length - offset]; Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); - pg.Page = (byte)(modeResponse[offset] & 0x3F); - pg.Subpage = modeResponse[offset + 1]; + pg.Page = 0; + pg.Subpage = 0; offset += pg.PageResponse.Length; } else { - pg.PageResponse = new byte[modeResponse[offset + 1] + 2]; + if (isSubpage) + { + pg.PageResponse = new byte[(modeResponse[offset + 2] << 8) + modeResponse[offset + 3] + 4]; - if ((pg.PageResponse.Length + offset) > modeResponse.Length) - return decoded; + if ((pg.PageResponse.Length + offset) > modeResponse.Length) + return decoded; - Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); - pg.Page = (byte)(modeResponse[offset] & 0x3F); - pg.Subpage = 0; - offset += pg.PageResponse.Length; + Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); + pg.Page = (byte)(modeResponse[offset] & 0x3F); + pg.Subpage = modeResponse[offset + 1]; + offset += pg.PageResponse.Length; + } + else + { + pg.PageResponse = new byte[modeResponse[offset + 1] + 2]; + + if ((pg.PageResponse.Length + offset) > modeResponse.Length) + return decoded; + + Array.Copy(modeResponse, offset, pg.PageResponse, 0, pg.PageResponse.Length); + pg.Page = (byte)(modeResponse[offset] & 0x3F); + pg.Subpage = 0; + offset += pg.PageResponse.Length; + } } listpages.Add(pg);