Ejemplo n.º 1
0
 /// <summary>
 ///     Sends the SPC MODE SENSE(10) command to the device as introduced in SCSI-2
 /// </summary>
 /// <returns><c>true</c> if the command failed and <paramref name="senseBuffer" /> contains the sense buffer.</returns>
 /// <param name="buffer">Buffer where the SCSI MODE SENSE(10) response will be stored</param>
 /// <param name="senseBuffer">Sense buffer.</param>
 /// <param name="timeout">Timeout in seconds.</param>
 /// <param name="duration">Duration in milliseconds it took for the device to execute the command.</param>
 /// <param name="dbd">If set to <c>true</c> device MUST not return any block descriptor.</param>
 /// <param name="pageControl">Page control.</param>
 /// <param name="pageCode">Page code.</param>
 public bool ModeSense10(out byte[]               buffer, out byte[] senseBuffer, bool dbd,
                         ScsiModeSensePageControl pageControl, byte pageCode, uint timeout,
                         out double duration)
 {
     return(ModeSense10(out buffer, out senseBuffer, false, dbd, pageControl, pageCode, 0, timeout,
                        out duration));
 }
Ejemplo n.º 2
0
        /// <summary>Sends the SPC MODE SENSE(10) command to the device as introduced in SCSI-3 SPC-3</summary>
        /// <returns><c>true</c> if the command failed and <paramref name="senseBuffer" /> contains the sense buffer.</returns>
        /// <param name="buffer">Buffer where the SCSI MODE SENSE(10) response will be stored</param>
        /// <param name="senseBuffer">Sense buffer.</param>
        /// <param name="timeout">Timeout in seconds.</param>
        /// <param name="duration">Duration in milliseconds it took for the device to execute the command.</param>
        /// <param name="dbd">If set to <c>true</c> device MUST not return any block descriptor.</param>
        /// <param name="pageControl">Page control.</param>
        /// <param name="pageCode">Page code.</param>
        /// <param name="subPageCode">Sub-page code.</param>
        /// <param name="llbaa">If set means 64-bit LBAs are accepted by the caller.</param>
        public bool ModeSense10(out byte[] buffer, out byte[] senseBuffer, bool llbaa, bool dbd,
                                ScsiModeSensePageControl pageControl, byte pageCode, byte subPageCode, uint timeout,
                                out double duration)
        {
            senseBuffer = new byte[32];
            byte[] cdb = new byte[10];
            buffer = new byte[4096];

            cdb[0] = (byte)ScsiCommands.ModeSense10;

            if (llbaa)
            {
                cdb[1] |= 0x10;
            }

            if (dbd)
            {
                cdb[1] |= 0x08;
            }

            cdb[2] |= (byte)pageControl;
            cdb[2] |= (byte)(pageCode & 0x3F);
            cdb[3]  = subPageCode;
            cdb[7]  = (byte)((buffer.Length & 0xFF00) >> 8);
            cdb[8]  = (byte)(buffer.Length & 0xFF);
            cdb[9]  = 0;

            LastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration,
                                        out bool sense);

            Error = LastError != 0;

            if (sense)
            {
                return(true);
            }

            ushort modeLength = (ushort)((buffer[0] << 8) + buffer[1] + 2);

            buffer      = new byte[modeLength];
            cdb[7]      = (byte)((buffer.Length & 0xFF00) >> 8);
            cdb[8]      = (byte)(buffer.Length & 0xFF);
            senseBuffer = new byte[32];

            LastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration,
                                        out sense);

            Error = LastError != 0;

            AaruConsole.DebugWriteLine("SCSI Device", "MODE SENSE(10) took {0} ms.", duration);

            return(sense);
        }
Ejemplo n.º 3
0
        /// <summary>Sends the SPC MODE SENSE(6) command to the device as introduced in SCSI-3 SPC-3</summary>
        /// <returns><c>true</c> if the command failed and <paramref name="senseBuffer" /> contains the sense buffer.</returns>
        /// <param name="buffer">Buffer where the SCSI MODE SENSE(6) response will be stored</param>
        /// <param name="senseBuffer">Sense buffer.</param>
        /// <param name="timeout">Timeout in seconds.</param>
        /// <param name="duration">Duration in milliseconds it took for the device to execute the command.</param>
        /// <param name="dbd">If set to <c>true</c> device MUST not return any block descriptor.</param>
        /// <param name="pageControl">Page control.</param>
        /// <param name="pageCode">Page code.</param>
        /// <param name="subPageCode">Sub-page code.</param>
        public bool ModeSense6(out byte[] buffer, out byte[] senseBuffer, bool dbd,
                               ScsiModeSensePageControl pageControl, byte pageCode, byte subPageCode, uint timeout,
                               out double duration)
        {
            senseBuffer = new byte[32];
            byte[] cdb = new byte[6];
            buffer = new byte[255];

            cdb[0] = (byte)ScsiCommands.ModeSense;

            if (dbd)
            {
                cdb[1] = 0x08;
            }

            cdb[2] |= (byte)pageControl;
            cdb[2] |= (byte)(pageCode & 0x3F);
            cdb[3]  = subPageCode;
            cdb[4]  = (byte)buffer.Length;
            cdb[5]  = 0;

            LastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration,
                                        out bool sense);

            Error = LastError != 0;

            if (sense)
            {
                return(true);
            }

            byte modeLength = (byte)(buffer[0] + 1);

            buffer      = new byte[modeLength];
            cdb[4]      = (byte)buffer.Length;
            senseBuffer = new byte[32];

            LastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, ScsiDirection.In, out duration,
                                        out sense);

            Error = LastError != 0;

            AaruConsole.DebugWriteLine("SCSI Device", "MODE SENSE(6) took {0} ms.", duration);

            return(sense);
        }
Ejemplo n.º 4
0
 /// <summary>Sends the SPC MODE SENSE(10) command to the device as introduced in SCSI-3 SPC-2</summary>
 /// <returns><c>true</c> if the command failed and <paramref name="senseBuffer" /> contains the sense buffer.</returns>
 /// <param name="buffer">Buffer where the SCSI MODE SENSE(10) response will be stored</param>
 /// <param name="senseBuffer">Sense buffer.</param>
 /// <param name="timeout">Timeout in seconds.</param>
 /// <param name="duration">Duration in milliseconds it took for the device to execute the command.</param>
 /// <param name="dbd">If set to <c>true</c> device MUST not return any block descriptor.</param>
 /// <param name="pageControl">Page control.</param>
 /// <param name="pageCode">Page code.</param>
 /// <param name="llbaa">If set means 64-bit LBAs are accepted by the caller.</param>
 public bool ModeSense10(out byte[] buffer, out byte[] senseBuffer, bool llbaa, bool dbd,
                         ScsiModeSensePageControl pageControl, byte pageCode, uint timeout,
                         out double duration) => ModeSense10(out buffer, out senseBuffer, llbaa, dbd,
                                                             pageControl, pageCode, 0, timeout, out duration);