2015-11-01 02:16:29 +00:00
|
|
|
|
// /***************************************************************************
|
|
|
|
|
|
// The Disc Image Chef
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
//
|
|
|
|
|
|
// Filename : Features.cs
|
|
|
|
|
|
// Version : 1.0
|
|
|
|
|
|
// Author(s) : Natalia Portillo
|
|
|
|
|
|
//
|
|
|
|
|
|
// Component : Component
|
|
|
|
|
|
//
|
|
|
|
|
|
// Revision : $Revision$
|
|
|
|
|
|
// Last change by : $Author$
|
|
|
|
|
|
// Date : $Date$
|
|
|
|
|
|
//
|
|
|
|
|
|
// --[ Description ] ----------------------------------------------------------
|
|
|
|
|
|
//
|
|
|
|
|
|
// Description
|
|
|
|
|
|
//
|
|
|
|
|
|
// --[ License ] --------------------------------------------------------------
|
|
|
|
|
|
//
|
|
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
|
|
// it under the terms of the GNU General Public License as
|
|
|
|
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
|
|
//
|
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
//
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
//
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
// Copyright (C) 2011-2015 Claunia.com
|
|
|
|
|
|
// ****************************************************************************/
|
|
|
|
|
|
// //$Id$
|
|
|
|
|
|
using System;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace DiscImageChef.Decoders.SCSI.MMC
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// MMC Feature enumeration
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public enum FeatureNumber : ushort
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Lists all profiles
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
ProfileList = 0x0000,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Mandatory behaviour
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
Core = 0x0001,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Operational changes
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
Morphing = 0x0002,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Removable medium
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
Removable = 0x0003,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to control write protection status
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
WriteProtect = 0x0004,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to read sectors with random addressing
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
RandomRead = 0x0010,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Reads on OSTA Multi-Read
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
MultiRead = 0x001D,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Able to read CD structures
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
CDRead = 0x001E,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Able to read DVD structures
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRead = 0x001F,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to write sectors with random addressing
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
RandomWrite = 0x0020,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to sequentially write
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
IncrementalWrite = 0x0021,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Support for media that requires erase before write
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
SectorErasable = 0x0022,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports formatting media
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
Formattable = 0x0023,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to provide defect-free space
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
HardwareDefectMgmt = 0x0024,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports for write-once media in random order
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
WriteOnce = 0x0025,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports for media that shall be written from blocking boundaries
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
RestrictedOverwrite = 0x0026,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports high speed CD-RW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
CDRWCAV = 0x0027,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Read and optionally write MRW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
MRW = 0x0028,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to control RECOVERED ERROR reporting
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
EnDefectReport = 0x0029,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to recognize, read and optionally write DVD+RW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRWPlus = 0x002A,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to read DVD+R
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRPlus = 0x002B,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to write CD in Track-at-Once
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
CDTAO = 0x002D,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to write CD in Session-at-Once or RAW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
CDMastering = 0x002E,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to write DVD structures
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRWrite = 0x002F,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to read DDCD
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DDCD = 0x0030,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to write DDCD-R
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DDCDR = 0x0031,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to write DDCD-RW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DDCDRW = 0x0032,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to record in layer jump mode
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
LayerJump = 0x0033,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to perform Layer Jump recording on Rigid Restricted Overwrite
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
LJRigid = 0x0034,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to stop the long immediate operation
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
StopLong = 0x0035,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to report CD-RW media sub-types supported for write
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
CDRWMediaWrite = 0x0037,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Logical block overwrite service on BD-R formatted as SRM+POW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
BDRPOW = 0x0038,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to read DVD+RW DL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRWDLPlus = 0x003A,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to read DVD+R DL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRDLPlus = 0x003B,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to read BD discs
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
BDRead = 0x0040,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to write BD discs
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
BDWrite = 0x0041,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Timely, Safe Recording
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
TSR = 0x0042,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to read HD DVD
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
HDDVDRead = 0x0050,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to write HD DVD
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
HDDVDWrite = 0x0051,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to write HD DVD-RW fragmented
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
HDDVDRWFragment = 0x0052,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports some Hybrid Discs
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
Hybrid = 0x0080,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Host and device directed power management
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
PowerMgmt = 0x0100,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports S.M.A.R.T.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
SMART = 0x0101,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Single machanism multiple disc changer
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
Changer = 0x0102,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to play CD audio to an analogue output
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
CDAudioExt = 0x0103,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to accept new microcode
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
MicrocodeUpgrade = 0x0104,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to respond to all commands within a specific time
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
Timeout = 0x0105,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports DVD CSS/CPPM
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
CSS = 0x0106,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to read and write using host requested performance parameters
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
RTS = 0x0107,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Drive has a unique identifier
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DriveSerial = 0x0108,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to return unique Media Serial Number
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
MediaSerial = 0x0109,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to read and/or write DCBs
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DCBs = 0x010A,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports DVD CPRM
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
CPRM = 0x010B,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Firmware creation date report
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
FirmwareInfo = 0x010C,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to decode and optionally encode AACS
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
AACS = 0x010D,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to perform DVD CSS managed recording
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
CSSManagedRec = 0x010E,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Ability to decode and optionally encode VCPS
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
VCPS = 0x0110,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports SecurDisc
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
SecurDisc = 0x0113,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// TCG Optical Security Subsystem Class
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
OSSC = 0x0142
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// MMC Profile enumeration
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public enum ProfileNumber : ushort
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Not to use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
Reserved = 0x0000,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Non-removable disk profile
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
NonRemovable = 0x0001,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Rewritable with removable media
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
Removable = 0x0002,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Magneto-Optical with sector erase
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
MOErasable = 0x0003,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Optical write once
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
OpticalWORM = 0x0004,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Advance Storage - Magneto-Optical
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
ASMO = 0x0005,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Read-only Compact Disc
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
CDROM = 0x0008,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Write-once Compact Disc
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
CDR = 0x0009,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Re-writable Compact Disc
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
CDRW = 0x000A,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Read-only DVD
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDROM = 0x0010,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Write-once sequentially recorded DVD-R
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRSeq = 0x0011,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DVD-RAM
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRAM = 0x0012,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Restricted overwrite DVD-RW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRWRes = 0x0013,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Sequential recording DVD-RW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRWSeq = 0x0014,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Sequential recording DVD-R DL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRDLSeq = 0x0015,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Layer jump recording DVD-R DL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRDLJump = 0x0016,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DVD+RW DL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRWDL = 0x0017,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DVD-Download
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDDownload = 0x0018,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DVD+RW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRWPlus = 0x001A,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DVD+R
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRPlus = 0x001B,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DDCD-ROM
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DDCDROM = 0x0020,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DDCD-R
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DDCDR = 0x0021,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DDCD-RW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DDCDRW = 0x0022,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DVD+RW DL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRWDLPlus = 0x002A,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DVD+R DL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
DVDRDLPlus = 0x002B,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// BD-ROM
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
BDROM = 0x0040,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// BD-R SRM
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
BDRSeq = 0x0041,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// BD-R RRM
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
BDRRdm = 0x0042,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// BD-RE
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
BDRE = 0x0043,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// HD DVD-ROM
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
HDDVDROM = 0x0050,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// HD DVD-R
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
HDDVDR = 0x0051,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// HD DVD-RAM
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
HDDVDRAM = 0x0052,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// HD DVD-RW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
HDDVDRW = 0x0053,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// HD DVD-R DL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
HDDVDRDL = 0x0058,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// HD DVD-RW DL
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
HDDVDRWDL = 0x005A,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Drive does not conform to any profiles
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
Unconforming = 0xFFFF
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public enum PhysicalInterfaces : uint
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Unspecified physical interface
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
Unspecified = 0,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// SCSI
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
SCSI = 1,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// ATAPI
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
ATAPI = 2,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// IEEE-1394/1995
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
IEEE1394 = 3,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// IEEE-1394A
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
IEEE1394A = 4,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Fibre Channel
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
FC = 5,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// IEEE-1394B
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
IEEE1394B = 6,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Serial ATAPI
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
SerialATAPI = 7,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// USB
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
USB = 8,
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Vendor unique
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
Vendor = 0xFFFF
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public struct Profile
|
|
|
|
|
|
{
|
|
|
|
|
|
public ProfileNumber Number;
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Profile List Feature (0000h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0000
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// All supported profiles
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public Profile[] Profiles;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Core Feature (0001h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0001
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Currently in-use physical interface standard
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public PhysicalInterfaces PhysicalInterfaceStandard;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Morphing Feature (0002h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0002
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports asynchronous GET EVENT/STATUS NOTIFICATION
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Async;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Removable Medium Feature (0003h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0003
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Mechanism type
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte LoadingMechanismType;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Device can eject medium
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Eject;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Device starts in medium ejection/insertion allow
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool PreventJumper;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Medium is currently locked
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Lock;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Write Protect Feature (0004h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0004
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports PWP status
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool SPWP;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports SWPP bit of mode page 1Dh
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool SSWPP;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-01 02:16:29 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Random Readable Feature (0010h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0010
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Bytes per logical block
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public uint LogicalBlockSize;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Number of logical blocks per device readable unit
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public ushort Blocking;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Read/Write Error Recovery page is present
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool PP;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Multi-Read Feature (001Dh)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_001D
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// CD Read Feature (001Eh)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_001E
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports C2 Error Pointers
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool C2;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Can read CD-Text with READ TOC/PMA/ATIP
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool CDText;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// DVD Read Feature (001Fh)
|
2015-11-01 02:16:29 +00:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_001F
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Random Writable Feature (0020h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0020
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Last logical block address
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public uint LastLBA;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Bytes per logical block
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public uint LogicalBlockSize;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Number of logical blocks per device readable unit
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public ushort Blocking;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Read/Write Error Recovery page is present
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool PP;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Incremental Streaming Writable Feature (0021h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0021
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Bitmask of supported data types
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public ushort DataTypeSupported;
|
|
|
|
|
|
/// <summary>
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// Zero loss linking
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool BUF;
|
|
|
|
|
|
/// <summary>
|
2015-11-01 02:16:29 +00:00
|
|
|
|
/// Logical blocks per link
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte[] LinkSizes;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Sector Erasable Feature (0022h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0022
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Formattable Feature (0023h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0023
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Defect Management Feature (0024h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0024
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports READ DISC STRUCTURE with Format Code 0Ah (Spare Area Information)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool SSA;
|
2015-11-01 02:16:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Write Once Feature (0025h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0025
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Last logical block address
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public uint LastLBA;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Number of logical blocks per device readable unit
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public ushort Blocking;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Read/Write Error Recovery page is present
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool PP;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Restricted Overwrite Feature (0026h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0026
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// CD-RW CAV Write Feature (0027h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0027
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// MRW Feature (0028h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0028
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Can format and write to MRW discs
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Write;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DVD+RW Feature (002Ah)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_002A
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Can format DVD+RW discs
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Write;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Drive only supports read compatibility stop
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool CloseOnly;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Rigid Restricted Overwrite Feature (002Ch)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_002C
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Can generate Defect Status Data during formatting
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool DSDG;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Can read Defect Status Data recorded on medium
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool DSDR;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports writing on an intermediate state Session and quick formatting
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Intermediate;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports BLANK command types 00h and 01h
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Blank;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-01 02:16:29 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// CD Track at Once Feature (002Dh)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_002D
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// Supports zero loss linking
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool BUF;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports writing R-W subchannels in raw mode
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool RWRaw;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports writing R-W subchannels in packed mode
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool RWPack;
|
|
|
|
|
|
/// <summary>
|
2015-11-01 02:16:29 +00:00
|
|
|
|
/// Can perform test writes
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool TestWrite;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports overwriting a TAO track with another
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool CDRW;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Can write R-W subchannels with user provided data
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool RWSubchannel;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Bitmask of supported data types
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public ushort DataTypeSupported;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// CD Mastering (Session at Once) Feature (002Eh)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_002E
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// Supports zero loss linking
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool BUF;
|
|
|
|
|
|
/// <summary>
|
2015-11-01 02:16:29 +00:00
|
|
|
|
/// Can write in Session at Once
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool SAO;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Can write multi-session in RAW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool RAWMS;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Can write in RAW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool RAW;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Can perform test writes
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool TestWrite;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Can overwrite previously recorded data
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool CDRW;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Can write R-W subchannels with user provided data
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool RW;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Maximum length of a Cue Sheet for Session at Once
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public uint MaxCueSheet;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// DVD-R/-RW Write Feature (002Fh)
|
2015-11-01 02:16:29 +00:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_002F
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Buffer Under-run protection
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool BUF;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Test write
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool TestWrite;
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Can write and erase DVD-RW
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool DVDRW;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Double Density CD Read Feature (0030h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0030
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Double Density CD-R Write Feature (0031h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0031
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Test write
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool TestWrite;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Double Density CD-RW Write Feature (0032h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0032
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports quick formatting
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Intermediate;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports BLANK command
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Blank;
|
2015-11-01 02:16:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Power Management Feature (0100h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0100
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// S.M.A.R.T. Feature (0101h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0101
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Mode Page 1Ch is present
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool PP;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-01 02:16:29 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Embedded Changer Feature (0102h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0102
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Side change capable
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool SCC;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports Disc Present
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool SDP;
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Number of slots - 1
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte HighestSlotNumber;
|
2015-11-01 02:16:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// CD Audio External Play Feature (0103h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0103
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports SCAN command
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Scan;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Separate Channel Mute
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool SCM;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Separate Volume
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool SV;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Microcode Upgrade Feature (0104h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0104
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Time-Out Feature (0105h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0105
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DVD-CSS Feature (0106h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0106
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// CSS version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte CSSVersion;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Real Time Streaming Feature (0107h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0107
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports READ BUFFER CAPACITY with block bit set
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool RBCB;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports SET CD SPEED
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool SCS;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Has Mode Page 2Ah with Speed Performance Descriptors
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool MP2A;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports type 03h of GET PERFORMANCE
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool WSPD;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Supports stream recording
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool SW;
|
2015-11-01 02:16:29 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Logical Unit serial number (0108h)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_0108
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// LUN serial number
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string Serial;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Disc Control Blocks Feature (010Ah)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_010A
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
public uint[] DCBs;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-01 03:07:13 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DVD CPRM Feature (010Bh)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public struct Feature_010B
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte Version;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is persistent
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Feature is currently in use
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool Current;
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// CPRM version
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public byte CPRMVersion;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-11-01 02:16:29 +00:00
|
|
|
|
public static class Features
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|