Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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;
            }
        }