public void ReportScsiModes(ref DeviceReportV2 report, out byte[] cdromMode, out MediumTypes mediumType) { Modes.DecodedMode? decMode = null; PeripheralDeviceTypes devType = _dev.ScsiType; byte[] mode10Buffer; byte[] mode6Buffer; bool sense; mediumType = 0; AaruConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (10)..."); foreach (ScsiModeSensePageControl pageControl in new[] { ScsiModeSensePageControl.Default, ScsiModeSensePageControl.Current, ScsiModeSensePageControl.Changeable }) { bool saveBuffer = false; sense = _dev.ModeSense10(out mode10Buffer, out _, false, true, pageControl, 0x3F, 0xFF, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense10(out mode10Buffer, out _, false, false, pageControl, 0x3F, 0xFF, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense10(out mode10Buffer, out _, false, true, pageControl, 0x3F, 0x00, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense10(out mode10Buffer, out _, false, false, pageControl, 0x3F, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.SupportsModeSense10 = true; decMode ??= Modes.DecodeMode10(mode10Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense10 = true; decMode ??= Modes.DecodeMode10(mode10Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense10 = true; report.SCSI.SupportsModeSubpages = true; decMode ??= Modes.DecodeMode10(mode10Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense10 = true; report.SCSI.SupportsModeSubpages = true; decMode ??= Modes.DecodeMode10(mode10Buffer, devType); saveBuffer = true; } if (!saveBuffer) { continue; } switch (pageControl) { case ScsiModeSensePageControl.Default: report.SCSI.ModeSense10Data = mode10Buffer; break; case ScsiModeSensePageControl.Changeable: report.SCSI.ModeSense10ChangeableData = mode10Buffer; break; case ScsiModeSensePageControl.Current: report.SCSI.ModeSense10CurrentData = mode10Buffer; break; } } AaruConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (6)..."); foreach (ScsiModeSensePageControl pageControl in new[] { ScsiModeSensePageControl.Default, ScsiModeSensePageControl.Current, ScsiModeSensePageControl.Changeable }) { bool saveBuffer = false; sense = _dev.ModeSense6(out mode6Buffer, out _, true, pageControl, 0x3F, 0xFF, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense6(out mode6Buffer, out _, false, pageControl, 0x3F, 0xFF, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense6(out mode6Buffer, out _, true, pageControl, 0x3F, 0x00, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense6(out mode6Buffer, out _, false, pageControl, 0x3F, 0x00, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense6(out mode6Buffer, out _, true, pageControl, 0x00, 0x00, _dev.Timeout, out _); if (sense || _dev.Error) { sense = _dev.ModeSense6(out mode6Buffer, out _, false, pageControl, 0x00, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.SupportsModeSense6 = true; decMode ??= Modes.DecodeMode6(mode6Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense6 = true; decMode ??= Modes.DecodeMode6(mode6Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense6 = true; decMode ??= Modes.DecodeMode6(mode6Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense6 = true; decMode ??= Modes.DecodeMode6(mode6Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense10 = true; report.SCSI.SupportsModeSubpages = true; decMode ??= Modes.DecodeMode6(mode6Buffer, devType); saveBuffer = true; } } else { report.SCSI.SupportsModeSense6 = true; report.SCSI.SupportsModeSubpages = true; decMode ??= Modes.DecodeMode6(mode6Buffer, devType); saveBuffer = true; } if (!saveBuffer) { continue; } switch (pageControl) { case ScsiModeSensePageControl.Default: report.SCSI.ModeSense6Data = mode6Buffer; break; case ScsiModeSensePageControl.Changeable: report.SCSI.ModeSense6ChangeableData = mode6Buffer; break; case ScsiModeSensePageControl.Current: report.SCSI.ModeSense6CurrentData = mode6Buffer; break; } } cdromMode = null; if (!decMode.HasValue) { return; } mediumType = decMode.Value.Header.MediumType; report.SCSI.ModeSense = new ScsiMode { BlankCheckEnabled = decMode.Value.Header.EBC, DPOandFUA = decMode.Value.Header.DPOFUA, WriteProtected = decMode.Value.Header.WriteProtected }; if (decMode.Value.Header.BufferedMode > 0) { report.SCSI.ModeSense.BufferedMode = decMode.Value.Header.BufferedMode; } if (decMode.Value.Header.Speed > 0) { report.SCSI.ModeSense.Speed = decMode.Value.Header.Speed; } if (decMode.Value.Pages == null) { return; } List <ScsiPage> modePages = new List <ScsiPage>(); foreach (Modes.ModePage page in decMode.Value.Pages) { var modePage = new ScsiPage { page = page.Page, subpage = page.Subpage, value = page.PageResponse }; modePages.Add(modePage); if (modePage.page == 0x2A && modePage.subpage == 0x00) { cdromMode = page.PageResponse; } } if (modePages.Count > 0) { report.SCSI.ModeSense.ModePages = modePages; } }
public List <ScsiPage> ReportEvpdPages(string vendor) { AaruConsole.WriteLine("Querying list of SCSI EVPDs..."); bool sense = _dev.ScsiInquiry(out byte[] buffer, out _, 0x00); if (sense) { return(null); } byte[] evpdPages = EVPD.DecodePage00(buffer); if (evpdPages == null || evpdPages.Length <= 0) { return(null); } List <ScsiPage> evpds = new List <ScsiPage>(); foreach (byte page in evpdPages.Where(page => page != 0x80)) { AaruConsole.WriteLine("Querying SCSI EVPD {0:X2}h...", page); sense = _dev.ScsiInquiry(out buffer, out _, page); if (sense) { continue; } byte[] empty; switch (page) { case 0x83: buffer = ClearPage83(buffer); break; case 0x80: byte[] identify = new byte[512]; Array.Copy(buffer, 60, identify, 0, 512); identify = ClearIdentify(identify); Array.Copy(identify, 0, buffer, 60, 512); break; case 0xB1: case 0xB3: empty = new byte[buffer.Length - 4]; Array.Copy(empty, 0, buffer, 4, buffer.Length - 4); break; case 0xC1 when vendor == "ibm": empty = new byte[12]; Array.Copy(empty, 0, buffer, 4, 12); Array.Copy(empty, 0, buffer, 16, 12); break; case 0xC2 when vendor == "certance": case 0xC3 when vendor == "certance": case 0xC4 when vendor == "certance": case 0xC5 when vendor == "certance": case 0xC6 when vendor == "certance": Array.Copy(new byte[12], 0, buffer, 4, 12); break; } var evpd = new ScsiPage { page = page, value = buffer }; evpds.Add(evpd); } return(evpds.Count > 0 ? evpds : null); }
public void ReportScsiModes(ref DeviceReportV2 report, out byte[] cdromMode) { Modes.DecodedMode? decMode = null; PeripheralDeviceTypes devType = _dev.ScsiType; byte[] mode10CurrentBuffer; byte[] mode10ChangeableBuffer; byte[] mode6CurrentBuffer; byte[] mode6ChangeableBuffer; DicConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (10)..."); bool sense = _dev.ModeSense10(out byte[] mode10Buffer, out _, false, true, ScsiModeSensePageControl.Default, 0x3F, 0xFF, _dev.Timeout, out _); if (sense || _dev.Error) { DicConsole.WriteLine("Querying all mode pages using SCSI MODE SENSE (10)..."); sense = _dev.ModeSense10(out mode10Buffer, out _, false, true, ScsiModeSensePageControl.Default, 0x3F, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.SupportsModeSense10 = true; report.SCSI.SupportsModeSubpages = false; decMode = Modes.DecodeMode10(mode10Buffer, devType); { sense = _dev.ModeSense10(out mode10CurrentBuffer, out _, false, true, ScsiModeSensePageControl.Current, 0x3F, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense10CurrentData = mode10CurrentBuffer; } sense = _dev.ModeSense10(out mode10ChangeableBuffer, out _, false, true, ScsiModeSensePageControl.Changeable, 0x3F, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense10ChangeableData = mode10ChangeableBuffer; } } } } else { report.SCSI.SupportsModeSense10 = true; report.SCSI.SupportsModeSubpages = true; decMode = Modes.DecodeMode10(mode10Buffer, devType); { sense = _dev.ModeSense10(out mode10CurrentBuffer, out _, false, true, ScsiModeSensePageControl.Current, 0x3F, 0xFF, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense10CurrentData = mode10CurrentBuffer; } sense = _dev.ModeSense10(out mode10ChangeableBuffer, out _, false, true, ScsiModeSensePageControl.Changeable, 0x3F, 0xFF, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense10ChangeableData = mode10ChangeableBuffer; } } } DicConsole.WriteLine("Querying all mode pages and subpages using SCSI MODE SENSE (6)..."); sense = _dev.ModeSense6(out byte[] mode6Buffer, out _, false, ScsiModeSensePageControl.Default, 0x3F, 0xFF, _dev.Timeout, out _); if (sense || _dev.Error) { DicConsole.WriteLine("Querying all mode pages using SCSI MODE SENSE (6)..."); sense = _dev.ModeSense6(out mode6Buffer, out _, false, ScsiModeSensePageControl.Default, 0x3F, 0x00, _dev.Timeout, out _); if (sense || _dev.Error) { DicConsole.WriteLine("Querying SCSI MODE SENSE (6)..."); sense = _dev.ModeSense(out mode6Buffer, out _, _dev.Timeout, out _); } else { sense = _dev.ModeSense6(out mode6CurrentBuffer, out _, false, ScsiModeSensePageControl.Current, 0x3F, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense6CurrentData = mode6CurrentBuffer; } sense = _dev.ModeSense6(out mode6ChangeableBuffer, out _, false, ScsiModeSensePageControl.Changeable, 0x3F, 0x00, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense6ChangeableData = mode6ChangeableBuffer; } } } else { report.SCSI.SupportsModeSubpages = true; { sense = _dev.ModeSense6(out mode6CurrentBuffer, out _, false, ScsiModeSensePageControl.Current, 0x3F, 0xFF, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense6CurrentData = mode6CurrentBuffer; } sense = _dev.ModeSense6(out mode6ChangeableBuffer, out _, false, ScsiModeSensePageControl.Changeable, 0x3F, 0xFF, _dev.Timeout, out _); if (!sense && !_dev.Error) { report.SCSI.ModeSense6ChangeableData = mode6ChangeableBuffer; } } } if (!sense && !_dev.Error && !decMode.HasValue) { decMode = Modes.DecodeMode6(mode6Buffer, devType); } report.SCSI.SupportsModeSense6 |= !sense && !_dev.Error; cdromMode = null; if (report.SCSI.SupportsModeSense6) { report.SCSI.ModeSense6Data = mode6Buffer; } if (report.SCSI.SupportsModeSense10) { report.SCSI.ModeSense10Data = mode10Buffer; } if (!decMode.HasValue) { return; } report.SCSI.ModeSense = new ScsiMode { BlankCheckEnabled = decMode.Value.Header.EBC, DPOandFUA = decMode.Value.Header.DPOFUA, WriteProtected = decMode.Value.Header.WriteProtected }; if (decMode.Value.Header.BufferedMode > 0) { report.SCSI.ModeSense.BufferedMode = decMode.Value.Header.BufferedMode; } if (decMode.Value.Header.Speed > 0) { report.SCSI.ModeSense.Speed = decMode.Value.Header.Speed; } if (decMode.Value.Pages == null) { return; } List <ScsiPage> modePages = new List <ScsiPage>(); foreach (Modes.ModePage page in decMode.Value.Pages) { var modePage = new ScsiPage { page = page.Page, subpage = page.Subpage, value = page.PageResponse }; modePages.Add(modePage); if (modePage.page == 0x2A && modePage.subpage == 0x00) { cdromMode = page.PageResponse; } } if (modePages.Count > 0) { report.SCSI.ModeSense.ModePages = modePages; } }