2017-05-19 20:28:49 +01:00
|
|
|
// /***************************************************************************
|
2015-11-01 02:16:29 +00:00
|
|
|
// The Disc Image Chef
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
//
|
|
|
|
|
// Filename : Features.cs
|
2016-07-28 18:13:49 +01:00
|
|
|
// Author(s) : Natalia Portillo <claunia@claunia.com>
|
2015-11-01 02:16:29 +00:00
|
|
|
//
|
2016-07-28 18:13:49 +01:00
|
|
|
// Component : Device structures decoders.
|
2015-11-01 02:16:29 +00:00
|
|
|
//
|
|
|
|
|
// --[ Description ] ----------------------------------------------------------
|
|
|
|
|
//
|
2018-12-29 15:26:00 +00:00
|
|
|
// Decodes SCSI MMC feature structures.
|
2015-11-01 02:16:29 +00:00
|
|
|
//
|
|
|
|
|
// --[ License ] --------------------------------------------------------------
|
|
|
|
|
//
|
2016-07-28 18:13:49 +01:00
|
|
|
// This library is free software; you can redistribute it and/or modify
|
|
|
|
|
// it under the terms of the GNU Lesser General Public License as
|
|
|
|
|
// published by the Free Software Foundation; either version 2.1 of the
|
2015-11-01 02:16:29 +00:00
|
|
|
// License, or (at your option) any later version.
|
|
|
|
|
//
|
2016-07-28 18:13:49 +01:00
|
|
|
// This library 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
|
|
|
|
|
// Lesser General Public License for more details.
|
2015-11-01 02:16:29 +00:00
|
|
|
//
|
2016-07-28 18:13:49 +01:00
|
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
// License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
2015-11-01 02:16:29 +00:00
|
|
|
//
|
|
|
|
|
// ----------------------------------------------------------------------------
|
2018-12-29 17:34:38 +00:00
|
|
|
// Copyright © 2011-2019 Natalia Portillo
|
2015-11-01 02:16:29 +00:00
|
|
|
// ****************************************************************************/
|
2016-07-28 18:13:49 +01:00
|
|
|
|
2015-11-01 02:16:29 +00:00
|
|
|
using System;
|
2015-11-01 06:49:18 +00:00
|
|
|
using System.Collections.Generic;
|
2017-12-22 02:04:18 +00:00
|
|
|
using System.Diagnostics.CodeAnalysis;
|
2015-11-01 19:36:24 +00:00
|
|
|
using System.Text;
|
2015-11-01 02:16:29 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
// ReSharper disable MemberCanBePrivate.Global
|
|
|
|
|
|
2015-11-01 02:16:29 +00:00
|
|
|
namespace DiscImageChef.Decoders.SCSI.MMC
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// MMC Feature enumeration
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public enum FeatureNumber : ushort
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Lists all profiles
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
ProfileList = 0x0000,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Mandatory behaviour
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
Core = 0x0001,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Operational changes
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
Morphing = 0x0002,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Removable medium
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
Removable = 0x0003,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to control write protection status
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
WriteProtect = 0x0004,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to read sectors with random addressing
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
RandomRead = 0x0010,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Reads on OSTA Multi-Read
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
MultiRead = 0x001D,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Able to read CD structures
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
CDRead = 0x001E,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Able to read DVD structures
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRead = 0x001F,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to write sectors with random addressing
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
RandomWrite = 0x0020,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to sequentially write
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
IncrementalWrite = 0x0021,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Support for media that requires erase before write
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
SectorErasable = 0x0022,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports formatting media
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
Formattable = 0x0023,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to provide defect-free space
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
HardwareDefectMgmt = 0x0024,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports for write-once media in random order
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
WriteOnce = 0x0025,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports for media that shall be written from blocking boundaries
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
RestrictedOverwrite = 0x0026,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports high speed CD-RW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
CDRWCAV = 0x0027,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Read and optionally write MRW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
MRW = 0x0028,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to control RECOVERED ERROR reporting
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
EnDefectReport = 0x0029,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to recognize, read and optionally write DVD+RW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRWPlus = 0x002A,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to read DVD+R
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRPlus = 0x002B,
|
2015-11-01 19:36:24 +00:00
|
|
|
RigidOverWrite = 0x002C,
|
2015-11-01 02:16:29 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to write CD in Track-at-Once
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
CDTAO = 0x002D,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to write CD in Session-at-Once or RAW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
CDMastering = 0x002E,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to write DVD structures
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRWrite = 0x002F,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to read DDCD
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DDCD = 0x0030,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to write DDCD-R
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DDCDR = 0x0031,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to write DDCD-RW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DDCDRW = 0x0032,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to record in layer jump mode
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
LayerJump = 0x0033,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to perform Layer Jump recording on Rigid Restricted Overwrite
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
LJRigid = 0x0034,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to stop the long immediate operation
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
StopLong = 0x0035,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to report CD-RW media sub-types supported for write
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
CDRWMediaWrite = 0x0037,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Logical block overwrite service on BD-R formatted as SRM+POW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
BDRPOW = 0x0038,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to read DVD+RW DL
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRWDLPlus = 0x003A,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to read DVD+R DL
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRDLPlus = 0x003B,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to read BD discs
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
BDRead = 0x0040,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to write BD discs
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
BDWrite = 0x0041,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Timely, Safe Recording
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
TSR = 0x0042,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to read HD DVD
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
HDDVDRead = 0x0050,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to write HD DVD
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
HDDVDWrite = 0x0051,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to write HD DVD-RW fragmented
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
HDDVDRWFragment = 0x0052,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports some Hybrid Discs
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
Hybrid = 0x0080,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Host and device directed power management
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
PowerMgmt = 0x0100,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports S.M.A.R.T.
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
SMART = 0x0101,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Single machanism multiple disc changer
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
Changer = 0x0102,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to play CD audio to an analogue output
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
CDAudioExt = 0x0103,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to accept new microcode
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
MicrocodeUpgrade = 0x0104,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to respond to all commands within a specific time
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
Timeout = 0x0105,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports DVD CSS/CPPM
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
CSS = 0x0106,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to read and write using host requested performance parameters
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
RTS = 0x0107,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive has a unique identifier
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DriveSerial = 0x0108,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to return unique Media Serial Number
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
MediaSerial = 0x0109,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to read and/or write DCBs
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DCBs = 0x010A,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports DVD CPRM
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
CPRM = 0x010B,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Firmware creation date report
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
FirmwareInfo = 0x010C,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to decode and optionally encode AACS
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
AACS = 0x010D,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to perform DVD CSS managed recording
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
CSSManagedRec = 0x010E,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Ability to decode and optionally encode VCPS
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
VCPS = 0x0110,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports SecurDisc
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
SecurDisc = 0x0113,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// TCG Optical Security Subsystem Class
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
OSSC = 0x0142
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// MMC Profile enumeration
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public enum ProfileNumber : ushort
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Not to use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
Reserved = 0x0000,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Non-removable disk profile
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
NonRemovable = 0x0001,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Rewritable with removable media
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
Removable = 0x0002,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Magneto-Optical with sector erase
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
MOErasable = 0x0003,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Optical write once
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
OpticalWORM = 0x0004,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Advance Storage - Magneto-Optical
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
ASMO = 0x0005,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Read-only Compact Disc
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
CDROM = 0x0008,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Write-once Compact Disc
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
CDR = 0x0009,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Re-writable Compact Disc
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
CDRW = 0x000A,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Read-only DVD
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDROM = 0x0010,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Write-once sequentially recorded DVD-R
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRSeq = 0x0011,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD-RAM
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRAM = 0x0012,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Restricted overwrite DVD-RW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRWRes = 0x0013,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Sequential recording DVD-RW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRWSeq = 0x0014,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Sequential recording DVD-R DL
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRDLSeq = 0x0015,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Layer jump recording DVD-R DL
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRDLJump = 0x0016,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD-RW DL
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRWDL = 0x0017,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD-Download
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDDownload = 0x0018,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD+RW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRWPlus = 0x001A,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD+R
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRPlus = 0x001B,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DDCD-ROM
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DDCDROM = 0x0020,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DDCD-R
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DDCDR = 0x0021,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DDCD-RW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DDCDRW = 0x0022,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD+RW DL
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRWDLPlus = 0x002A,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD+R DL
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
DVDRDLPlus = 0x002B,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// BD-ROM
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
BDROM = 0x0040,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// BD-R SRM
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
BDRSeq = 0x0041,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// BD-R RRM
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
BDRRdm = 0x0042,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// BD-RE
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
BDRE = 0x0043,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// HD DVD-ROM
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
HDDVDROM = 0x0050,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// HD DVD-R
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
HDDVDR = 0x0051,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// HD DVD-RAM
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
HDDVDRAM = 0x0052,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// HD DVD-RW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
HDDVDRW = 0x0053,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// HD DVD-R DL
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
HDDVDRDL = 0x0058,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// HD DVD-RW DL
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
HDDVDRWDL = 0x005A,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// HDBurn CD-ROM
|
2016-08-18 00:05:24 +01:00
|
|
|
/// </summary>
|
|
|
|
|
HDBURNROM = 0x0080,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// HDBurn CD-R
|
2016-08-18 00:05:24 +01:00
|
|
|
/// </summary>
|
|
|
|
|
HDBURNR = 0x0081,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// HDBurn CD-RW
|
2016-08-18 00:05:24 +01:00
|
|
|
/// </summary>
|
|
|
|
|
HDBURNRW = 0x0082,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive does not conform to any profiles
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
Unconforming = 0xFFFF
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public enum PhysicalInterfaces : uint
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Unspecified physical interface
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
Unspecified = 0,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// SCSI
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
SCSI = 1,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// ATAPI
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
ATAPI = 2,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// IEEE-1394/1995
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
IEEE1394 = 3,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// IEEE-1394A
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
IEEE1394A = 4,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Fibre Channel
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
FC = 5,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// IEEE-1394B
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
IEEE1394B = 6,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Serial ATAPI
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
SerialATAPI = 7,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// USB
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
USB = 8,
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Vendor unique
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
Vendor = 0xFFFF
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Profile
|
|
|
|
|
{
|
|
|
|
|
public ProfileNumber Number;
|
2018-06-22 08:08:38 +01:00
|
|
|
public bool Current;
|
2015-11-01 02:16:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Profile List Feature (0000h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0000
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// All supported profiles
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public Profile[] Profiles;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Core Feature (0001h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0001
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Currently in-use physical interface standard
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public PhysicalInterfaces PhysicalInterfaceStandard;
|
2015-11-01 03:30:53 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports EVPD, Page Code and 16-bit Allocation Length as defined in SPC-3
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool INQ2;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports Device Busy Event
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool DBE;
|
2015-11-01 02:16:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Morphing Feature (0002h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0002
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports Operational Change Request/Nofitication Class Events
|
|
|
|
|
/// of GET EVENT/STATUS NOTIFICATION
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool OCEvent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports asynchronous GET EVENT/STATUS NOTIFICATION
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Async;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Removable Medium Feature (0003h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0003
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Mechanism type
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte LoadingMechanismType;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive is able to load the medium
|
2015-11-01 06:49:18 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Load;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Device can eject medium
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Eject;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Device starts in medium ejection/insertion allow
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool PreventJumper;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Reports Device Busy Class events during medium loading/unloading
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool DBML;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Medium is currently locked
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Lock;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 03:07:13 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Write Protect Feature (0004h)
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:07:13 +00:00
|
|
|
public struct Feature_0004
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive can read/write Disc Write Protect PAC on BD-R/-RE media
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool DWP;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports reading/writing Write Inhibit DCB on DVD+RW media.
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool WDCB;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports PWP status
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool SPWP;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports SWPP bit of mode page 1Dh
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool SSWPP;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 02:16:29 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Random Readable Feature (0010h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0010
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Bytes per logical block
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public uint LogicalBlockSize;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Number of logical blocks per device readable unit
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public ushort Blocking;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Read/Write Error Recovery page is present
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool PP;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Multi-Read Feature (001Dh)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_001D
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// CD Read Feature (001Eh)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_001E
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports DAP bit in READ CD and READ CD MSF
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool DAP;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports C2 Error Pointers
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool C2;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can read CD-Text with READ TOC/PMA/ATIP
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool CDText;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD Read Feature (001Fh)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_001F
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
2015-11-01 04:02:09 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Compliant with DVD Multi Drive Read-only specifications
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool MULTI110;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports reading all DVD-RW DL
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool DualRW;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports reading all DVD-R DL including remapping
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool DualR;
|
2015-11-01 02:16:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Random Writable Feature (0020h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0020
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Last logical block address
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public uint LastLBA;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Bytes per logical block
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public uint LogicalBlockSize;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Number of logical blocks per device readable unit
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public ushort Blocking;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Read/Write Error Recovery page is present
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool PP;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Incremental Streaming Writable Feature (0021h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0021
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Bitmask of supported data types
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public ushort DataTypeSupported;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can report Track Resources Information of READ DISC INFORMATION
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool TRIO;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports Address Mode in RESERVE TRACK
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool ARSV;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Zero loss linking
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool BUF;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Logical blocks per link
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte[] LinkSizes;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Sector Erasable Feature (0022h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0022
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Formattable Feature (0023h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0023
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
2015-11-01 04:02:09 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports formatting BD-RE without spare area
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RENoSA;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports expansion of the spare area on BD-RE
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Expand;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports FORMAT type 30h sub-type 11b
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool QCert;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports FORMAT type 30h sub-type 10b
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Cert;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports FORMAT type 18h
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool FRF;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports FORMAT type 00h/32h sub-type 10b on BD-R
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RRM;
|
2015-11-01 02:16:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Hardware Defect Management Feature (0024h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0024
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
2015-11-01 03:07:13 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports READ DISC STRUCTURE with Format Code 0Ah (Spare Area Information)
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool SSA;
|
2015-11-01 02:16:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Write Once Feature (0025h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0025
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Bytes per logical block
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2015-11-01 06:49:18 +00:00
|
|
|
public uint LogicalBlockSize;
|
2015-11-01 02:16:29 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Number of logical blocks per device readable unit
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public ushort Blocking;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Read/Write Error Recovery page is present
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool PP;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Restricted Overwrite Feature (0026h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0026
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 03:07:13 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// CD-RW CAV Write Feature (0027h)
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:07:13 +00:00
|
|
|
public struct Feature_0027
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// MRW Feature (0028h)
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:07:13 +00:00
|
|
|
public struct Feature_0028
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can read DVD+MRW discs
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool DVDPRead;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can write DVD+MRW discs
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool DVDPWrite;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can format and write to CD-MRW discs
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Write;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 03:30:53 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Enhanced Defect Reporting Feature (0029h)
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:30:53 +00:00
|
|
|
public struct Feature_0029
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports DRT-DM
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool DRTDM;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Maximum number of DBI cache zones device can handle separately
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte DBICacheZones;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Number of entries in worst case to case DBI overflow
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public ushort Entries;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 03:07:13 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD+RW Feature (002Ah)
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:07:13 +00:00
|
|
|
public struct Feature_002A
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can format DVD+RW discs
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Write;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// FORMAT UNIT supports quick start formatting
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool QuickStart;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive only supports read compatibility stop
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool CloseOnly;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 03:30:53 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD+R Feature (002Bh)
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:30:53 +00:00
|
|
|
public struct Feature_002B
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can write DVD+R
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Write;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 03:07:13 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Rigid Restricted Overwrite Feature (002Ch)
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:07:13 +00:00
|
|
|
public struct Feature_002C
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can generate Defect Status Data during formatting
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool DSDG;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can read Defect Status Data recorded on medium
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool DSDR;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports writing on an intermediate state Session and quick formatting
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Intermediate;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports BLANK command types 00h and 01h
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Blank;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 02:16:29 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// CD Track at Once Feature (002Dh)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_002D
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports zero loss linking
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool BUF;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports writing R-W subchannels in raw mode
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RWRaw;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports writing R-W subchannels in packed mode
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RWPack;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can perform test writes
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool TestWrite;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports overwriting a TAO track with another
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool CDRW;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can write R-W subchannels with user provided data
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RWSubchannel;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Bitmask of supported data types
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public ushort DataTypeSupported;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// CD Mastering (Session at Once) Feature (002Eh)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_002E
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports zero loss linking
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool BUF;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can write in Session at Once
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool SAO;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can write multi-session in RAW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RAWMS;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can write in RAW
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RAW;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can perform test writes
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool TestWrite;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can overwrite previously recorded data
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool CDRW;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can write R-W subchannels with user provided data
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RW;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Maximum length of a Cue Sheet for Session at Once
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public uint MaxCueSheet;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD-R/-RW Write Feature (002Fh)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_002F
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Buffer Under-run protection
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool BUF;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports writing DVD-R DL
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RDL;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Test write
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool TestWrite;
|
2015-11-01 03:07:13 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can write and erase DVD-RW
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool DVDRW;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Double Density CD Read Feature (0030h)
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:07:13 +00:00
|
|
|
public struct Feature_0030
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Double Density CD-R Write Feature (0031h)
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:07:13 +00:00
|
|
|
public struct Feature_0031
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Test write
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool TestWrite;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Double Density CD-RW Write Feature (0032h)
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:07:13 +00:00
|
|
|
public struct Feature_0032
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports quick formatting
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Intermediate;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports BLANK command
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Blank;
|
2015-11-01 02:16:29 +00:00
|
|
|
}
|
|
|
|
|
|
2015-11-01 04:02:09 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Layer Jump Recording Feature (0033h)
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:02:09 +00:00
|
|
|
public struct Feature_0033
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
public byte[] LinkSizes;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 04:20:45 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Stop Long Operation Feature (0035h)
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:20:45 +00:00
|
|
|
public struct Feature_0035
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 03:30:53 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// CD-RW Media Write Support Feature (0037h)
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:30:53 +00:00
|
|
|
public struct Feature_0037
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Bitmask of supported CD-RW media sub-types
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte SubtypeSupport;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 04:02:09 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// BD-R Pseudo-Overwrite (POW) Feature (0038h)
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:02:09 +00:00
|
|
|
public struct Feature_0038
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD+RW Dual Layer Feature (003Ah)
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:02:09 +00:00
|
|
|
public struct Feature_003A
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can format DVD+RW DL discs
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Write;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// FORMAT UNIT supports quick start formatting
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool QuickStart;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive only supports read compatibility stop
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool CloseOnly;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD+R Dual Layer Feature (003Bh)
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:02:09 +00:00
|
|
|
public struct Feature_003B
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can format DVD+R DL discs
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Write;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// FORMAT UNIT supports quick start formatting
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool QuickStart;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive only supports read compatibility stop
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool CloseOnly;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// BD Read Feature (0040h)
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:02:09 +00:00
|
|
|
public struct Feature_0040
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
2015-11-01 04:20:45 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can read BCA
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool BCA;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports reading BD-RE Ver.2
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RE2;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports reading BD-RE Ver.1
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RE1;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Obsolete
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool OldRE;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports reading BD-R Ver.1
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool R;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Obsolete
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool OldR;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports reading BD-ROM Ver.1
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool ROM;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Obsolete
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool OldROM;
|
2015-11-01 04:02:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// BD Write Feature (0041h)
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:02:09 +00:00
|
|
|
public struct Feature_0041
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports verify not required
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool SVNR;
|
2015-11-01 04:20:45 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports writing BD-RE Ver.2
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RE2;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports writing BD-RE Ver.1
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RE1;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Obsolete
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool OldRE;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports writing BD-R Ver.1
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool R;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Obsolete
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool OldR;
|
2015-11-01 04:02:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// TSR Feature (0042h)
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:02:09 +00:00
|
|
|
public struct Feature_0042
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// HD DVD Read Feature (0050h)
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:02:09 +00:00
|
|
|
public struct Feature_0050
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can read HD DVD-R
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool HDDVDR;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can read HD DVD-RAM
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool HDDVDRAM;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// HD DVD Write Feature (0051h)
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:02:09 +00:00
|
|
|
public struct Feature_0051
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can write HD DVD-R
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool HDDVDR;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Can write HD DVD-RAM
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool HDDVDRAM;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Hybrid Disc Feature (0080h)
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:02:09 +00:00
|
|
|
public struct Feature_0080
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Reset immunity
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RI;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 02:16:29 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Power Management Feature (0100h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0100
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 03:07:13 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// S.M.A.R.T. Feature (0101h)
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:07:13 +00:00
|
|
|
public struct Feature_0101
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Mode Page 1Ch is present
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool PP;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 02:16:29 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Embedded Changer Feature (0102h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0102
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Side change capable
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool SCC;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports Disc Present
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool SDP;
|
2015-11-01 03:07:13 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Number of slots - 1
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte HighestSlotNumber;
|
2015-11-01 02:16:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// CD Audio External Play Feature (0103h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0103
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports SCAN command
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Scan;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Separate Channel Mute
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool SCM;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Separate Volume
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool SV;
|
2015-11-01 03:30:53 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Number of volume levels
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public ushort VolumeLevels;
|
2015-11-01 02:16:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Microcode Upgrade Feature (0104h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0104
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
2015-11-01 04:02:09 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports validating 5-bit mode field of READ BUFFER and WRITE BUFFER commands.
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool M5;
|
2015-11-01 02:16:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Time-Out Feature (0105h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0105
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
2015-11-01 03:30:53 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports G3Enable bit and Group3 Timeout field in Mode Page 1Dh
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Group3;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Indicates a unit of block length, in sectors, corresponding to increase a unit of Group 3 time unit
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public ushort UnitLength;
|
2015-11-01 02:16:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD-CSS Feature (0106h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0106
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// CSS version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte CSSVersion;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Real Time Streaming Feature (0107h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0107
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
2015-11-01 03:07:13 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports Set Minimum Performance bit in SET STREAMING
|
2015-11-01 19:36:24 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool SMP;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports READ BUFFER CAPACITY with block bit set
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RBCB;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports SET CD SPEED
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool SCS;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Has Mode Page 2Ah with Speed Performance Descriptors
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool MP2A;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports type 03h of GET PERFORMANCE
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool WSPD;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports stream recording
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool SW;
|
2015-11-01 02:16:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive serial number (0108h)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_0108
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive serial number
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public string Serial;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 03:30:53 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Media Serial Number Feature (0109h)
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:30:53 +00:00
|
|
|
public struct Feature_0109
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 02:16:29 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Disc Control Blocks Feature (010Ah)
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 02:16:29 +00:00
|
|
|
public struct Feature_010A
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 02:16:29 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
public uint[] DCBs;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 03:07:13 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD CPRM Feature (010Bh)
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:07:13 +00:00
|
|
|
public struct Feature_010B
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// CPRM version
|
2015-11-01 03:07:13 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte CPRMVersion;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 03:30:53 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Firmware Information Feature (010Ch)
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 03:30:53 +00:00
|
|
|
public struct Feature_010C
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 03:30:53 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
public ushort Century;
|
|
|
|
|
public ushort Year;
|
|
|
|
|
public ushort Month;
|
|
|
|
|
public ushort Day;
|
|
|
|
|
public ushort Hour;
|
|
|
|
|
public ushort Minute;
|
|
|
|
|
public ushort Second;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 04:02:09 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// AACS Feature (010Dh)
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:02:09 +00:00
|
|
|
public struct Feature_010D
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive supports reading drive certificate
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RDC;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive can read media key block of CPRM
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool RMC;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive can write bus encrypted blocks
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool WBE;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive supports bus encryption
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
2015-11-01 06:49:18 +00:00
|
|
|
public bool BEC;
|
2015-11-01 04:20:45 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Drive supports generating the binding nonce
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool BNG;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Blocks required to store the binding nonce for the media
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2015-11-01 06:49:18 +00:00
|
|
|
public byte BindNonceBlocks;
|
2015-11-01 04:02:09 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Maximum number of AGIDs supported concurrently
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte AGIDs;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// AACS version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte AACSVersion;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 04:20:45 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// DVD CSS Managed Recording Feature (010Eh)
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:20:45 +00:00
|
|
|
public struct Feature_010E
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Maximum number of Scramble Extent information entries in a single SEND DISC STRUCTURE
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte MaxScrambleExtent;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// SecurDisc Feature (0113h)
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:20:45 +00:00
|
|
|
public struct Feature_0113
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// OSSC Feature (0142h)
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:20:45 +00:00
|
|
|
public struct Feature_0142
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports PSA updates on write-once media
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool PSAU;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Supports linked OSPBs
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool LOSPB;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Restricted to recording only OSSC disc format
|
2015-11-01 04:20:45 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool ME;
|
|
|
|
|
public ushort[] Profiles;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 04:02:09 +00:00
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// VCPS Feature (0110h)
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
2017-12-22 02:04:18 +00:00
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
2015-11-01 04:02:09 +00:00
|
|
|
public struct Feature_0110
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature version
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public byte Version;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is persistent
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Persistent;
|
|
|
|
|
/// <summary>
|
2017-12-23 18:31:38 +00:00
|
|
|
/// Feature is currently in use
|
2015-11-01 04:02:09 +00:00
|
|
|
/// </summary>
|
|
|
|
|
public bool Current;
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 02:16:29 +00:00
|
|
|
public static class Features
|
|
|
|
|
{
|
2015-11-01 06:49:18 +00:00
|
|
|
public static Feature_0000? Decode_0000(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0000) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0000 decoded = new Feature_0000();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
int offset = 4;
|
2015-11-01 06:49:18 +00:00
|
|
|
List<Profile> listProfiles = new List<Profile>();
|
2016-04-19 02:11:47 +01:00
|
|
|
while(offset < feature.Length)
|
2015-11-01 06:49:18 +00:00
|
|
|
{
|
2017-12-22 02:04:18 +00:00
|
|
|
Profile prof = new Profile {Number = (ProfileNumber)((feature[offset] << 8) + feature[offset + 1])};
|
2015-11-01 06:49:18 +00:00
|
|
|
prof.Current |= (feature[offset + 2] & 0x01) == 0x01;
|
|
|
|
|
listProfiles.Add(prof);
|
|
|
|
|
offset += 4;
|
|
|
|
|
}
|
2017-12-19 20:33:03 +00:00
|
|
|
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Profiles = listProfiles.ToArray();
|
|
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0001? Decode_0001(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0001) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0001 decoded = new Feature_0001();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.PhysicalInterfaceStandard =
|
|
|
|
|
(PhysicalInterfaces)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 1 && feature.Length >= 12) decoded.DBE |= (feature[8] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 2 && feature.Length >= 12) decoded.INQ2 |= (feature[8] & 0x02) == 0x02;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0002? Decode_0002(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0002) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0002 decoded = new Feature_0002();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.Async |= (feature[4] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 1) decoded.OCEvent |= (feature[4] & 0x02) == 0x02;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0003? Decode_0003(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0003) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0003 decoded = new Feature_0003();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.LoadingMechanismType = (byte)((feature[4] & 0xE0) >> 5);
|
|
|
|
|
decoded.Eject |= (feature[4] & 0x08) == 0x08;
|
|
|
|
|
decoded.PreventJumper |= (feature[4] & 0x04) == 0x04;
|
|
|
|
|
decoded.Lock |= (feature[4] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(decoded.Version < 2) return decoded;
|
|
|
|
|
|
|
|
|
|
decoded.Load |= (feature[4] & 0x10) == 0x10;
|
|
|
|
|
decoded.DBML |= (feature[4] & 0x02) == 0x02;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0004? Decode_0004(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0004) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0004 decoded = new Feature_0004();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.SPWP |= (feature[4] & 0x02) == 0x02;
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.SSWPP |= (feature[4] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 1) decoded.WDCB |= (feature[4] & 0x04) == 0x04;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 2) decoded.DWP |= (feature[4] & 0x08) == 0x08;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0010? Decode_0010(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 12) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0010) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0010 decoded = new Feature_0010();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.LogicalBlockSize =
|
|
|
|
|
(uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]);
|
|
|
|
|
decoded.Blocking =
|
|
|
|
|
(ushort)((feature[8] << 8) + feature[9]);
|
2017-12-21 06:06:19 +00:00
|
|
|
decoded.PP |= (feature[10] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_001D? Decode_001D(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x001D) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_001D decoded = new Feature_001D();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_001E? Decode_001E(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x001E) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_001E decoded = new Feature_001E();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(decoded.Version >= 1)
|
2015-11-01 06:49:18 +00:00
|
|
|
{
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.C2 |= (feature[4] & 0x02) == 0x02;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.CDText |= (feature[4] & 0x01) == 0x01;
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 2) decoded.DAP |= (feature[4] & 0x80) == 0x80;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_001F? Decode_001F(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x001F) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_001F decoded = new Feature_001F();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(decoded.Version >= 2 && feature.Length >= 8)
|
2015-11-01 06:49:18 +00:00
|
|
|
{
|
|
|
|
|
decoded.MULTI110 |= (feature[4] & 0x01) == 0x01;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.DualR |= (feature[6] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
}
|
|
|
|
|
|
2017-12-18 17:53:04 +00:00
|
|
|
// TODO: Check this
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 2 && feature.Length >= 8) decoded.DualRW |= (feature[6] & 0x02) == 0x02;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0020? Decode_0020(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 16) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0020) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0020 decoded = new Feature_0020();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(decoded.Version < 1) return decoded;
|
|
|
|
|
|
|
|
|
|
decoded.LastLBA = (uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]);
|
|
|
|
|
decoded.LogicalBlockSize =
|
|
|
|
|
(uint)((feature[8] << 24) + (feature[9] << 16) + (feature[10] << 8) + feature[11]);
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Blocking = (ushort)((feature[12] << 8) + feature[13]);
|
|
|
|
|
decoded.PP |= (feature[14] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0021? Decode_0021(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0021) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0021 decoded = new Feature_0021();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(decoded.Version >= 1)
|
2015-11-01 06:49:18 +00:00
|
|
|
{
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.DataTypeSupported = (ushort)((feature[4] << 8) + feature[5]);
|
|
|
|
|
decoded.BUF |= (feature[6] & 0x01) == 0x01;
|
|
|
|
|
decoded.LinkSizes = new byte[feature[7]];
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature.Length > feature[7] + 8) Array.Copy(feature, 8, decoded.LinkSizes, 0, feature[7]);
|
2015-11-01 06:49:18 +00:00
|
|
|
}
|
|
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(decoded.Version < 3) return decoded;
|
|
|
|
|
|
|
|
|
|
decoded.TRIO |= (feature[6] & 0x04) == 0x04;
|
|
|
|
|
decoded.ARSV |= (feature[6] & 0x02) == 0x02;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0022? Decode_0022(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0022) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0022 decoded = new Feature_0022();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0023? Decode_0023(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0023) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0023 decoded = new Feature_0023();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(decoded.Version >= 1 && feature.Length >= 12)
|
2015-11-01 06:49:18 +00:00
|
|
|
{
|
|
|
|
|
decoded.RENoSA |= (feature[4] & 0x08) == 0x08;
|
|
|
|
|
decoded.Expand |= (feature[4] & 0x04) == 0x04;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.QCert |= (feature[4] & 0x02) == 0x02;
|
|
|
|
|
decoded.Cert |= (feature[4] & 0x01) == 0x01;
|
|
|
|
|
decoded.RRM |= (feature[8] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
}
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 2 && feature.Length >= 12) decoded.FRF |= (feature[4] & 0x80) == 0x80;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0024? Decode_0024(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0024) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0024 decoded = new Feature_0024();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 1 && feature.Length >= 8) decoded.SSA |= (feature[4] & 0x80) == 0x80;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0025? Decode_0025(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 12) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0025) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0025 decoded = new Feature_0025();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.LogicalBlockSize =
|
|
|
|
|
(uint)((feature[4] << 24) + (feature[5] << 16) + (feature[6] << 8) + feature[7]);
|
|
|
|
|
decoded.Blocking =
|
|
|
|
|
(ushort)((feature[8] << 8) + feature[9]);
|
2017-12-21 06:06:19 +00:00
|
|
|
decoded.PP |= (feature[10] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0026? Decode_0026(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0026) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0026 decoded = new Feature_0026();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0027? Decode_0027(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0027) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0027 decoded = new Feature_0027();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0028? Decode_0028(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0028) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0028 decoded = new Feature_0028();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.Write |= (feature[4] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(decoded.Version < 1) return decoded;
|
|
|
|
|
|
|
|
|
|
decoded.DVDPWrite |= (feature[4] & 0x04) == 0x04;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.DVDPRead |= (feature[4] & 0x02) == 0x02;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0029? Decode_0029(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0029) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0029 decoded = new Feature_0029();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.DRTDM |= (feature[4] & 0x01) == 0x01;
|
|
|
|
|
decoded.DBICacheZones = feature[5];
|
|
|
|
|
decoded.Entries = (ushort)((feature[6] << 8) + feature[7]);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_002A? Decode_002A(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x002A) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_002A decoded = new Feature_002A();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Write |= (feature[4] & 0x01) == 0x01;
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.CloseOnly |= (feature[5] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 1) decoded.QuickStart |= (feature[5] & 0x02) == 0x02;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_002B? Decode_002B(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x002B) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_002B decoded = new Feature_002B();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.Write |= (feature[4] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_002C? Decode_002C(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x002C) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_002C decoded = new Feature_002C();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.DSDG |= (feature[4] & 0x08) == 0x08;
|
|
|
|
|
decoded.DSDR |= (feature[4] & 0x04) == 0x04;
|
2017-12-21 06:06:19 +00:00
|
|
|
decoded.Intermediate |= (feature[4] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Blank |= (feature[4] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_002D? Decode_002D(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x002D) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_002D decoded = new Feature_002D();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.TestWrite |= (feature[4] & 0x04) == 0x04;
|
|
|
|
|
decoded.CDRW |= (feature[4] & 0x02) == 0x02;
|
|
|
|
|
decoded.RWSubchannel |= (feature[4] & 0x01) == 0x01;
|
|
|
|
|
decoded.DataTypeSupported = (ushort)((feature[6] << 8) + feature[7]);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(decoded.Version < 2) return decoded;
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.BUF |= (feature[4] & 0x40) == 0x40;
|
|
|
|
|
decoded.RWRaw |= (feature[4] & 0x10) == 0x10;
|
2017-12-21 06:06:19 +00:00
|
|
|
decoded.RWPack |= (feature[4] & 0x08) == 0x08;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_002E? Decode_002E(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x002E) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_002E decoded = new Feature_002E();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.SAO |= (feature[4] & 0x20) == 0x20;
|
|
|
|
|
decoded.RAWMS |= (feature[4] & 0x10) == 0x10;
|
|
|
|
|
decoded.RAW |= (feature[4] & 0x08) == 0x08;
|
|
|
|
|
decoded.TestWrite |= (feature[4] & 0x04) == 0x04;
|
|
|
|
|
decoded.CDRW |= (feature[4] & 0x02) == 0x02;
|
|
|
|
|
decoded.RW |= (feature[4] & 0x01) == 0x01;
|
|
|
|
|
decoded.MaxCueSheet = (uint)((feature[5] << 16) + (feature[6] << 8) + feature[7]);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 1) decoded.BUF |= (feature[4] & 0x40) == 0x40;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_002F? Decode_002F(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x002F) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_002F decoded = new Feature_002F();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.BUF |= (feature[4] & 0x40) == 0x40;
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.TestWrite |= (feature[4] & 0x04) == 0x04;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 1) decoded.DVDRW |= (feature[4] & 0x02) == 0x02;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 2) decoded.RDL |= (feature[4] & 0x08) == 0x08;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0030? Decode_0030(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0030) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0030 decoded = new Feature_0030();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0031? Decode_0031(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0031) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0031 decoded = new Feature_0031();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.TestWrite |= (feature[4] & 0x04) == 0x04;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0032? Decode_0032(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0032) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0032 decoded = new Feature_0032();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
decoded.Intermediate |= (feature[4] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Blank |= (feature[4] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0033? Decode_0033(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0033) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0033 decoded = new Feature_0033();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(feature[7] <= 0 || feature.Length <= feature[7] + 8) return decoded;
|
|
|
|
|
|
|
|
|
|
decoded.LinkSizes = new byte[feature[7]];
|
|
|
|
|
Array.Copy(feature, 8, decoded.LinkSizes, 0, feature[7]);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0035? Decode_0035(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0035) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0035 decoded = new Feature_0035();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0037? Decode_0037(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0037) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0037 decoded = new Feature_0037();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.SubtypeSupport = feature[5];
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0038? Decode_0038(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0038) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0038 decoded = new Feature_0038();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_003A? Decode_003A(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x003A) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_003A decoded = new Feature_003A();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Write |= (feature[4] & 0x01) == 0x01;
|
2017-12-21 06:06:19 +00:00
|
|
|
decoded.QuickStart |= (feature[5] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.CloseOnly |= (feature[5] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_003B? Decode_003B(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x003B) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_003B decoded = new Feature_003B();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.Write |= (feature[4] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0040? Decode_0040(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 32) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0040) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0040 decoded = new Feature_0040();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.OldRE |= (feature[9] & 0x01) == 0x01;
|
|
|
|
|
decoded.OldR |= (feature[17] & 0x01) == 0x01;
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.OldROM |= (feature[25] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(decoded.Version < 1) return decoded;
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.BCA |= (feature[4] & 0x01) == 0x01;
|
|
|
|
|
decoded.RE2 |= (feature[9] & 0x04) == 0x04;
|
|
|
|
|
decoded.RE1 |= (feature[9] & 0x02) == 0x02;
|
|
|
|
|
decoded.R |= (feature[17] & 0x02) == 0x02;
|
2017-12-21 06:06:19 +00:00
|
|
|
decoded.ROM |= (feature[25] & 0x02) == 0x02;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0041? Decode_0041(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 24) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0041) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0041 decoded = new Feature_0041();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.SVNR |= (feature[4] & 0x01) == 0x01;
|
|
|
|
|
decoded.OldRE |= (feature[9] & 0x01) == 0x01;
|
|
|
|
|
decoded.OldR |= (feature[17] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(decoded.Version < 1) return decoded;
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.RE2 |= (feature[9] & 0x04) == 0x04;
|
|
|
|
|
decoded.RE1 |= (feature[9] & 0x02) == 0x02;
|
|
|
|
|
decoded.R |= (feature[17] & 0x02) == 0x02;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0042? Decode_0042(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0042) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0042 decoded = new Feature_0042();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0050? Decode_0050(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0050) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0050 decoded = new Feature_0050();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.HDDVDR |= (feature[4] & 0x01) == 0x01;
|
2017-12-21 06:06:19 +00:00
|
|
|
decoded.HDDVDRAM |= (feature[6] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0051? Decode_0051(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0051) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0051 decoded = new Feature_0051();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.HDDVDR |= (feature[4] & 0x01) == 0x01;
|
2017-12-21 06:06:19 +00:00
|
|
|
decoded.HDDVDRAM |= (feature[6] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0080? Decode_0080(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0080) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0080 decoded = new Feature_0080();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.RI |= (feature[4] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0100? Decode_0100(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0100) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0100 decoded = new Feature_0100();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0101? Decode_0101(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0101) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0101 decoded = new Feature_0101();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.PP |= (feature[4] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0102? Decode_0102(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0102) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0102 decoded = new Feature_0102();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.SCC |= (feature[4] & 0x10) == 0x10;
|
|
|
|
|
decoded.SDP |= (feature[4] & 0x04) == 0x04;
|
|
|
|
|
decoded.HighestSlotNumber = (byte)(feature[7] & 0x1F);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0103? Decode_0103(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0103) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0103 decoded = new Feature_0103();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Scan |= (feature[4] & 0x04) == 0x04;
|
|
|
|
|
decoded.SCM |= (feature[4] & 0x02) == 0x02;
|
|
|
|
|
decoded.SV |= (feature[4] & 0x01) == 0x01;
|
|
|
|
|
decoded.VolumeLevels = (ushort)((feature[6] << 8) + feature[7]);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0104? Decode_0104(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0104) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0104 decoded = new Feature_0104();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(decoded.Version >= 1 && feature.Length >= 8) decoded.M5 |= (feature[4] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0105? Decode_0105(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0105) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0105 decoded = new Feature_0105();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(decoded.Version < 1 || feature.Length < 8) return decoded;
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Group3 |= (feature[4] & 0x01) == 0x01;
|
|
|
|
|
decoded.UnitLength = (ushort)((feature[6] << 8) + feature[7]);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0106? Decode_0106(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0106) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0106 decoded = new Feature_0106();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.CSSVersion = feature[7];
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0107? Decode_0107(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0107) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0107 decoded = new Feature_0107();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(decoded.Version >= 3 && feature.Length >= 8)
|
2015-11-01 06:49:18 +00:00
|
|
|
{
|
|
|
|
|
decoded.RBCB |= (feature[4] & 0x10) == 0x10;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.SCS |= (feature[4] & 0x08) == 0x08;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.MP2A |= (feature[4] & 0x04) == 0x04;
|
|
|
|
|
decoded.WSPD |= (feature[4] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.SW |= (feature[4] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
}
|
|
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(decoded.Version < 5 || feature.Length < 8) return decoded;
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.SMP |= (feature[4] & 0x20) == 0x20;
|
2017-12-21 06:06:19 +00:00
|
|
|
decoded.RBCB |= (feature[4] & 0x10) == 0x10;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0108? Decode_0108(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0108) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0108 decoded = new Feature_0108();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
byte[] serial = new byte[feature.Length];
|
|
|
|
|
Array.Copy(feature, 4, serial, 0, feature.Length - 4);
|
|
|
|
|
decoded.Serial = StringHandlers.CToString(serial).Trim();
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0109? Decode_0109(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0109) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0109 decoded = new Feature_0109();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_010A? Decode_010A(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x010A) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_010A decoded = new Feature_010A();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
decoded.DCBs = new uint[feature[3] / 4];
|
|
|
|
|
for(int i = 0; i < decoded.DCBs.Length; i++)
|
|
|
|
|
decoded.DCBs[i] = (uint)((feature[0 + 4 + i * 4] << 24) + (feature[1 + 4 + i * 4] << 16) +
|
2018-06-22 08:08:38 +01:00
|
|
|
(feature[2 + 4 + i * 4] << 8) + feature[3 + 4 + i * 4]);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_010B? Decode_010B(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x010B) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_010B decoded = new Feature_010B();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.CPRMVersion = feature[7];
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_010C? Decode_010C(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 20) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x010C) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_010C decoded = new Feature_010C();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Century = (ushort)((feature[4] << 8) + feature[5]);
|
|
|
|
|
decoded.Year = (ushort)((feature[6] << 8) + feature[7]);
|
|
|
|
|
decoded.Month = (ushort)((feature[8] << 8) + feature[9]);
|
|
|
|
|
decoded.Day = (ushort)((feature[10] << 8) + feature[11]);
|
|
|
|
|
decoded.Hour = (ushort)((feature[12] << 8) + feature[13]);
|
|
|
|
|
decoded.Minute = (ushort)((feature[14] << 8) + feature[15]);
|
|
|
|
|
decoded.Second = (ushort)((feature[16] << 8) + feature[17]);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_010D? Decode_010D(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x010D) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_010D decoded = new Feature_010D();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.BNG |= (feature[4] & 0x01) == 0x01;
|
|
|
|
|
decoded.BindNonceBlocks = feature[5];
|
|
|
|
|
decoded.AGIDs = (byte)(feature[6] & 0x0F);
|
|
|
|
|
decoded.AACSVersion = feature[7];
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(decoded.Version < 2) return decoded;
|
|
|
|
|
|
|
|
|
|
decoded.RDC |= (feature[4] & 0x10) == 0x10;
|
|
|
|
|
decoded.RMC |= (feature[4] & 0x08) == 0x08;
|
|
|
|
|
decoded.WBE |= (feature[4] & 0x04) == 0x04;
|
|
|
|
|
decoded.BEC |= (feature[4] & 0x02) == 0x02;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_010E? Decode_010E(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x010E) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_010E decoded = new Feature_010E();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-21 17:34:47 +00:00
|
|
|
decoded.MaxScrambleExtent = feature[4];
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0110? Decode_0110(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 8) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0110) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0110 decoded = new Feature_0110();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0113? Decode_0113(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 4) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0113) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0113 decoded = new Feature_0113();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static Feature_0142? Decode_0142(byte[] feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature == null) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(feature.Length < 6) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
ushort number = (ushort)((feature[0] << 8) + feature[1]);
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(number != 0x0142) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
if(feature[3] + 4 != feature.Length) return null;
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
Feature_0142 decoded = new Feature_0142();
|
|
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Current |= (feature[2] & 0x01) == 0x01;
|
2015-11-01 06:49:18 +00:00
|
|
|
decoded.Persistent |= (feature[2] & 0x02) == 0x02;
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.Version = (byte)((feature[2] & 0x3C) >> 2);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
decoded.PSAU |= (feature[4] & 0x80) == 0x80;
|
|
|
|
|
decoded.LOSPB |= (feature[4] & 0x40) == 0x40;
|
|
|
|
|
decoded.ME |= (feature[4] & 0x01) == 0x01;
|
|
|
|
|
decoded.Profiles = new ushort[feature[5]];
|
2017-12-21 06:06:19 +00:00
|
|
|
if(feature[5] * 2 + 6 != feature.Length) return decoded;
|
|
|
|
|
|
|
|
|
|
for(int i = 0; i < feature[5]; i++)
|
|
|
|
|
decoded.Profiles[i] = (ushort)((feature[0 + 6 + 2 * i] << 8) + feature[1 + 6 + 2 * i]);
|
2015-11-01 06:49:18 +00:00
|
|
|
|
|
|
|
|
return decoded;
|
|
|
|
|
}
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
public static string Prettify_0000(Feature_0000? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0000 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("MMC Supported Profiles:");
|
2017-12-21 06:06:19 +00:00
|
|
|
if(ftr.Profiles == null) return sb.ToString();
|
|
|
|
|
|
|
|
|
|
foreach(Profile prof in ftr.Profiles)
|
|
|
|
|
{
|
|
|
|
|
switch(prof.Number)
|
2015-11-01 19:36:24 +00:00
|
|
|
{
|
2017-12-21 06:06:19 +00:00
|
|
|
case ProfileNumber.Reserved:
|
|
|
|
|
sb.Append("\tDrive reported a reserved profile number");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.NonRemovable:
|
|
|
|
|
sb.Append("\tDrive supports non-removable changeable media");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.Removable:
|
|
|
|
|
sb.Append("\tDrive supports rewritable and removable media");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.MOErasable:
|
|
|
|
|
sb.Append("\tDrive supports Magnet-Optical media");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.OpticalWORM:
|
|
|
|
|
sb.Append("\tDrive supports optical write-once media");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.ASMO:
|
|
|
|
|
sb.Append("\tDrive supports Advanced Storage - Magneto-Optical");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.CDROM:
|
|
|
|
|
sb.Append("\tDrive supports CD-ROM");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.CDR:
|
|
|
|
|
sb.Append("\tDrive supports CD-R");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.CDRW:
|
|
|
|
|
sb.Append("\tDrive supports CD-RW");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDROM:
|
|
|
|
|
sb.Append("\tDrive supports DVD-ROM");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDRSeq:
|
|
|
|
|
sb.Append("\tDrive supports DVD-R");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDRAM:
|
|
|
|
|
sb.Append("\tDrive supports DVD-RAM");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDRWRes:
|
|
|
|
|
sb.Append("\tDrive supports restricted overwrite DVD-RW");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDRWSeq:
|
|
|
|
|
sb.Append("\tDrive supports sequentially recorded DVD-RW");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDRDLSeq:
|
|
|
|
|
sb.Append("\tDrive supports sequentially recorded DVD-R DL");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDRDLJump:
|
|
|
|
|
sb.Append("\tDrive supports layer jump recorded DVD-R DL");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDRWDL:
|
|
|
|
|
sb.Append("\tDrive supports DVD-RW DL");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDDownload:
|
|
|
|
|
sb.Append("\tDrive supports DVD-Download");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDRWPlus:
|
|
|
|
|
sb.Append("\tDrive supports DVD+RW");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDRPlus:
|
|
|
|
|
sb.Append("\tDrive supports DVD+R");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DDCDROM:
|
|
|
|
|
sb.Append("\tDrive supports DDCD-ROM");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DDCDR:
|
|
|
|
|
sb.Append("\tDrive supports DDCD-R");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DDCDRW:
|
|
|
|
|
sb.Append("\tDrive supports DDCD-RW");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDRWDLPlus:
|
|
|
|
|
sb.Append("\tDrive supports DVD+RW DL");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.DVDRDLPlus:
|
|
|
|
|
sb.Append("\tDrive supports DVD+R DL");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.BDROM:
|
|
|
|
|
sb.Append("\tDrive supports BD-ROM");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.BDRSeq:
|
|
|
|
|
sb.Append("\tDrive supports BD-R SRM");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.BDRRdm:
|
|
|
|
|
sb.Append("\tDrive supports BD-R RRM");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.BDRE:
|
|
|
|
|
sb.Append("\tDrive supports BD-RE");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.HDDVDROM:
|
|
|
|
|
sb.Append("\tDrive supports HD DVD-ROM");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.HDDVDR:
|
|
|
|
|
sb.Append("\tDrive supports HD DVD-R");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.HDDVDRAM:
|
|
|
|
|
sb.Append("\tDrive supports HD DVD-RAM");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.HDDVDRW:
|
|
|
|
|
sb.Append("\tDrive supports HD DVD-RW");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.HDDVDRDL:
|
|
|
|
|
sb.Append("\tDrive supports HD DVD-R DL");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.HDDVDRWDL:
|
|
|
|
|
sb.Append("\tDrive supports HD DVD-RW DL");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.HDBURNROM:
|
|
|
|
|
sb.Append("\tDrive supports HDBurn CD-ROM");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.HDBURNR:
|
|
|
|
|
sb.Append("\tDrive supports HDBurn CD-R");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.HDBURNRW:
|
|
|
|
|
sb.Append("\tDrive supports HDBurn CD-RW");
|
|
|
|
|
break;
|
|
|
|
|
case ProfileNumber.Unconforming:
|
|
|
|
|
sb.Append("\tDrive is not conforming to any profile");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
sb.AppendFormat("\tDrive informs of unknown profile 0x{0:X4}", (ushort)prof.Number);
|
|
|
|
|
break;
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(prof.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-01 19:36:24 +00:00
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0001(Feature_0001? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0001 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("MMC Core Feature:");
|
|
|
|
|
sb.Append("\tDrive uses ");
|
2016-04-19 02:11:47 +01:00
|
|
|
switch(ftr.PhysicalInterfaceStandard)
|
2015-11-01 19:36:24 +00:00
|
|
|
{
|
|
|
|
|
case PhysicalInterfaces.Unspecified:
|
|
|
|
|
sb.AppendLine("an unspecified physical interface");
|
|
|
|
|
break;
|
|
|
|
|
case PhysicalInterfaces.SCSI:
|
|
|
|
|
sb.AppendLine("SCSI interface");
|
|
|
|
|
break;
|
|
|
|
|
case PhysicalInterfaces.ATAPI:
|
|
|
|
|
sb.AppendLine("ATAPI interface");
|
|
|
|
|
break;
|
|
|
|
|
case PhysicalInterfaces.IEEE1394:
|
|
|
|
|
sb.AppendLine("IEEE-1394 interface");
|
|
|
|
|
break;
|
|
|
|
|
case PhysicalInterfaces.IEEE1394A:
|
|
|
|
|
sb.AppendLine("IEEE-1394A interface");
|
|
|
|
|
break;
|
|
|
|
|
case PhysicalInterfaces.FC:
|
|
|
|
|
sb.AppendLine("Fibre Channel interface");
|
|
|
|
|
break;
|
|
|
|
|
case PhysicalInterfaces.IEEE1394B:
|
|
|
|
|
sb.AppendLine("IEEE-1394B interface");
|
|
|
|
|
break;
|
|
|
|
|
case PhysicalInterfaces.SerialATAPI:
|
|
|
|
|
sb.AppendLine("Serial ATAPI interface");
|
|
|
|
|
break;
|
|
|
|
|
case PhysicalInterfaces.USB:
|
|
|
|
|
sb.AppendLine("USB interface");
|
|
|
|
|
break;
|
|
|
|
|
case PhysicalInterfaces.Vendor:
|
|
|
|
|
sb.AppendLine("a vendor unique interface");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
2017-12-19 20:33:03 +00:00
|
|
|
sb.AppendFormat("an unknown interface with code {0}", (uint)ftr.PhysicalInterfaceStandard)
|
|
|
|
|
.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.DBE) sb.AppendLine("\tDrive supports Device Busy events");
|
2015-11-01 19:36:24 +00:00
|
|
|
if(ftr.INQ2)
|
|
|
|
|
sb.AppendLine("\tDrive supports EVPD, Page Code and 16-bit Allocation Length as described in SPC-3");
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0002(Feature_0002? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0002 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("MMC Morphing:");
|
|
|
|
|
|
2017-12-22 02:04:18 +00:00
|
|
|
sb.AppendLine(ftr.Async
|
|
|
|
|
? "\tDrive supports polling and asynchronous GET EVENT STATUS NOTIFICATION"
|
|
|
|
|
: "\tDrive supports only polling GET EVENT STATUS NOTIFICATION");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.OCEvent) sb.AppendLine("\tDrive supports operational change request / notification class events");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0003(Feature_0003? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0003 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("MMC Removable Medium:");
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
switch(ftr.LoadingMechanismType)
|
2015-11-01 19:36:24 +00:00
|
|
|
{
|
|
|
|
|
case 0:
|
|
|
|
|
sb.AppendLine("\tDrive uses media caddy");
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
sb.AppendLine("\tDrive uses a tray");
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
sb.AppendLine("\tDrive is pop-up");
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
sb.AppendLine("\tDrive is a changer with individually changeable discs");
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
sb.AppendLine("\tDrive is a changer using cartridges");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
2017-12-19 20:33:03 +00:00
|
|
|
sb.AppendFormat("\tDrive uses unknown loading mechanism type {0}", ftr.LoadingMechanismType)
|
|
|
|
|
.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Lock) sb.AppendLine("\tDrive can lock media");
|
|
|
|
|
if(ftr.PreventJumper) sb.AppendLine("\tDrive power ups locked");
|
|
|
|
|
if(ftr.Eject) sb.AppendLine("\tDrive can eject media");
|
|
|
|
|
if(ftr.Load) sb.AppendLine("\tDrive can load media");
|
|
|
|
|
if(ftr.DBML) sb.AppendLine("\tDrive reports Device Busy Class events during medium loading/unloading");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0004(Feature_0004? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0004 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("MMC Write Protect:");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.DWP) sb.AppendLine("\tDrive supports reading/writing the Disc Write Protect PAC on BD-R/-RE media");
|
|
|
|
|
if(ftr.WDCB) sb.AppendLine("\tDrive supports writing the Write Inhibit DCB on DVD+RW media");
|
|
|
|
|
if(ftr.SPWP) sb.AppendLine("\tDrive supports set/release of PWP status");
|
|
|
|
|
if(ftr.SSWPP) sb.AppendLine("\tDrive supports the SWPP bit of the Timeout and Protect mode page");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0010(Feature_0010? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0010 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.Append("MMC Random Readable");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.Append(" (current)");
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendLine(":");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.PP) sb.AppendLine("\tDrive shall report Read/Write Error Recovery mode page");
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.LogicalBlockSize > 0)
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendFormat("\t{0} bytes per logical block", ftr.LogicalBlockSize).AppendLine();
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.Blocking > 1)
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendFormat("\t{0} logical blocks per media readable unit", ftr.Blocking).AppendLine();
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_001D(Feature_001D? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
return !feature.HasValue
|
|
|
|
|
? null
|
|
|
|
|
: "Drive claims capability to read all CD formats according to OSTA Multi-Read Specification\n";
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_001E(Feature_001E? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_001E ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.Append("MMC CD Read");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.Append(" (current)");
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendLine(":");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.DAP) sb.AppendLine("\tDrive supports the DAP bit in the READ CD and READ CD MSF commands");
|
|
|
|
|
if(ftr.C2) sb.AppendLine("\tDrive supports C2 Error Pointers");
|
|
|
|
|
if(ftr.CDText) sb.AppendLine("\tDrive can return CD-Text from Lead-In");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_001F(Feature_001F? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_001F ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.Append("MMC DVD Read");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.Append(" (current)");
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendLine(":");
|
|
|
|
|
sb.AppendLine("\tDrive can read DVD media");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.DualR) sb.AppendLine("\tDrive can read DVD-R DL from all recording modes");
|
|
|
|
|
if(ftr.DualRW) sb.AppendLine("\tDrive can read DVD-RW DL from all recording modes");
|
|
|
|
|
if(ftr.MULTI110) sb.AppendLine("\tDrive conforms to DVD Multi Drive Read-only Specifications");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0020(Feature_0020? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0020 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.Append("MMC Random Writable:");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.Append(" (current)");
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendLine(":");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.PP) sb.AppendLine("\tDrive shall report Read/Write Error Recovery mode page");
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.LogicalBlockSize > 0)
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendFormat("\t{0} bytes per logical block", ftr.LogicalBlockSize).AppendLine();
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.Blocking > 1)
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendFormat("\t{0} logical blocks per media writable unit", ftr.Blocking).AppendLine();
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.LastLBA > 0) sb.AppendFormat("\tLast adressable logical block is {0}", ftr.LastLBA).AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0021(Feature_0021? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0021 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("MMC Incremental Streaming Writable:");
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.DataTypeSupported > 0)
|
2015-11-01 19:36:24 +00:00
|
|
|
{
|
|
|
|
|
sb.Append("\tDrive supports data block types:");
|
2017-12-19 20:33:03 +00:00
|
|
|
if((ftr.DataTypeSupported & 0x0001) == 0x0001) sb.Append(" 0");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0002) == 0x0002) sb.Append(" 1");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0004) == 0x0004) sb.Append(" 2");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0008) == 0x0008) sb.Append(" 3");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0010) == 0x0010) sb.Append(" 4");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0020) == 0x0020) sb.Append(" 5");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0040) == 0x0040) sb.Append(" 6");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0080) == 0x0080) sb.Append(" 7");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0100) == 0x0100) sb.Append(" 8");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0200) == 0x0200) sb.Append(" 9");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0400) == 0x0400) sb.Append(" 10");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0800) == 0x0800) sb.Append(" 11");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x1000) == 0x1000) sb.Append(" 12");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x2000) == 0x2000) sb.Append(" 13");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x4000) == 0x4000) sb.Append(" 14");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x8000) == 0x8000) sb.Append(" 15");
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendLine();
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.TRIO) sb.AppendLine("\tDrive claims support to report Track Resources Information");
|
|
|
|
|
if(ftr.ARSV) sb.AppendLine("\tDrive supports address mode reservation on the RESERVE TRACK command");
|
|
|
|
|
if(ftr.BUF) sb.AppendLine("\tDrive is capable of zero loss linking");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0022(Feature_0022? feature)
|
|
|
|
|
{
|
|
|
|
|
return !feature.HasValue ? null : "Drive supports media that require erasing before writing\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0023(Feature_0023? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0023 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("MMC Formattable:");
|
|
|
|
|
sb.AppendLine("\tDrive can format media into logical blocks");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.RENoSA) sb.AppendLine("\tDrive can format BD-RE with no spares allocated");
|
|
|
|
|
if(ftr.Expand) sb.AppendLine("\tDrive can expand the spare area on a formatted BD-RE disc");
|
|
|
|
|
if(ftr.QCert) sb.AppendLine("\tDrive can format BD-RE discs with quick certification");
|
|
|
|
|
if(ftr.Cert) sb.AppendLine("\tDrive can format BD-RE discs with full certification");
|
|
|
|
|
if(ftr.FRF) sb.AppendLine("\tDrive can fast re-format BD-RE discs");
|
|
|
|
|
if(ftr.RRM) sb.AppendLine("\tDrive can format BD-R discs with RRM format");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0024(Feature_0024? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0024 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("MMC Hardware Defect Management:");
|
|
|
|
|
sb.AppendLine("\tDrive shall be able to provide a defect-free contiguous address space");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.SSA) sb.AppendLine("\tDrive can return Spare Area Information");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0025(Feature_0025? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0025 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.Append("MMC Write Once");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.Append(" (current)");
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendLine(":");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.PP) sb.AppendLine("\tDrive shall report Read/Write Error Recovery mode page");
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.LogicalBlockSize > 0)
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendFormat("\t{0} bytes per logical block", ftr.LogicalBlockSize).AppendLine();
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.Blocking > 1)
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendFormat("\t{0} logical blocks per media writable unit", ftr.Blocking).AppendLine();
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0026(Feature_0026? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
return !feature.HasValue
|
|
|
|
|
? null
|
|
|
|
|
: "Drive shall have the ability to overwrite logical blocks only in fixed sets at a time\n";
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0027(Feature_0027? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0027 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.Append("Drive can write High-Speed CD-RW");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0028(Feature_0028? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0028 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Write && ftr.DVDPRead && ftr.DVDPWrite) sb.Append("Drive can read and write CD-MRW and DVD+MRW");
|
2018-06-22 08:08:38 +01:00
|
|
|
else if(ftr.DVDPRead && ftr.DVDPWrite) sb.Append("Drive can read and write DVD+MRW");
|
|
|
|
|
else if(ftr.Write && ftr.DVDPRead) sb.Append("Drive and read DVD+MRW and read and write CD-MRW");
|
2017-12-19 20:33:03 +00:00
|
|
|
else if(ftr.Write) sb.Append("Drive can read and write CD-MRW");
|
|
|
|
|
else if(ftr.DVDPRead) sb.Append("Drive can read CD-MRW and DVD+MRW");
|
|
|
|
|
else sb.Append("Drive can read CD-MRW");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0029(Feature_0029? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0029 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("MMC Enhanced Defect Reporting Feature:");
|
|
|
|
|
|
2017-12-22 02:04:18 +00:00
|
|
|
sb.AppendLine(ftr.DRTDM ? "\tDrive supports DRT-DM mode" : "\tDrive supports Persistent-DM mode");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.DBICacheZones > 0)
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendFormat("\tDrive has {0} DBI cache zones", ftr.DBICacheZones).AppendLine();
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Entries > 0) sb.AppendFormat("\tDrive has {0} DBI entries", ftr.Entries).AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_002A(Feature_002A? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_002A ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.Write)
|
2015-11-01 19:36:24 +00:00
|
|
|
{
|
|
|
|
|
sb.Append("Drive can read and write DVD+RW");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2017-12-22 02:04:18 +00:00
|
|
|
sb.AppendLine(ftr.CloseOnly
|
|
|
|
|
? "\tDrive supports only the read compatibility stop"
|
|
|
|
|
: "\tDrive supports both forms of background format stopping");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.QuickStart) sb.AppendLine("\tDrive can do a quick start formatting");
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
sb.Append("Drive can read DVD+RW");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_002B(Feature_002B? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_002B ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.Write)
|
2015-11-01 19:36:24 +00:00
|
|
|
{
|
|
|
|
|
sb.Append("Drive can read and write DVD+R");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
sb.Append("Drive can read DVD+R");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_002C(Feature_002C? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_002C ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.Append("MMC Rigid Restricted Overwrite");
|
2017-12-22 02:04:18 +00:00
|
|
|
sb.AppendLine(ftr.Current ? " (current):" : ":");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Blank) sb.AppendLine("\tDrive supports the BLANK command");
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.Intermediate)
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendLine("\tDrive supports writing on an intermediate state session and quick formatting");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.DSDR) sb.AppendLine("\tDrive can read Defect Status data recorded on the medium");
|
|
|
|
|
if(ftr.DSDG) sb.AppendLine("\tDrive can generate Defect Status data during formatting");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_002D(Feature_002D? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_002D ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("Drive can write CDs in Track at Once Mode:");
|
|
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.RWSubchannel)
|
2015-11-01 19:36:24 +00:00
|
|
|
{
|
|
|
|
|
sb.AppendLine("\tDrive can write user provided data in the R-W subchannels");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.RWRaw) sb.AppendLine("\tDrive accepts RAW R-W subchannel data");
|
|
|
|
|
if(ftr.RWPack) sb.AppendLine("\tDrive accepts Packed R-W subchannel data");
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.CDRW) sb.AppendLine("\tDrive can overwrite a TAO track with another in CD-RWs");
|
|
|
|
|
if(ftr.TestWrite) sb.AppendLine("\tDrive can do a test writing");
|
|
|
|
|
if(ftr.BUF) sb.AppendLine("\tDrive supports zero loss linking");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(ftr.DataTypeSupported <= 0) return sb.ToString();
|
|
|
|
|
|
|
|
|
|
sb.Append("\tDrive supports data block types:");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0001) == 0x0001) sb.Append(" 0");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0002) == 0x0002) sb.Append(" 1");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0004) == 0x0004) sb.Append(" 2");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0008) == 0x0008) sb.Append(" 3");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0010) == 0x0010) sb.Append(" 4");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0020) == 0x0020) sb.Append(" 5");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0040) == 0x0040) sb.Append(" 6");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0080) == 0x0080) sb.Append(" 7");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0100) == 0x0100) sb.Append(" 8");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0200) == 0x0200) sb.Append(" 9");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0400) == 0x0400) sb.Append(" 10");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x0800) == 0x0800) sb.Append(" 11");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x1000) == 0x1000) sb.Append(" 12");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x2000) == 0x2000) sb.Append(" 13");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x4000) == 0x4000) sb.Append(" 14");
|
|
|
|
|
if((ftr.DataTypeSupported & 0x8000) == 0x8000) sb.Append(" 15");
|
|
|
|
|
sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_002E(Feature_002E? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_002E ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
if(ftr.SAO && !ftr.RAW) sb.AppendLine("Drive can write CDs in Session at Once Mode:");
|
2017-12-19 20:33:03 +00:00
|
|
|
else if(!ftr.SAO && ftr.RAW) sb.AppendLine("Drive can write CDs in raw Mode:");
|
|
|
|
|
else sb.AppendLine("Drive can write CDs in Session at Once and in Raw Modes:");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.RAW && ftr.RAWMS) sb.AppendLine("\tDrive can write multi-session CDs in raw mode");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.RW) sb.AppendLine("\tDrive can write user provided data in the R-W subchannels");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.CDRW) sb.AppendLine("\tDrive can write CD-RWs");
|
|
|
|
|
if(ftr.TestWrite) sb.AppendLine("\tDrive can do a test writing");
|
|
|
|
|
if(ftr.BUF) sb.AppendLine("\tDrive supports zero loss linking");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.MaxCueSheet > 0)
|
2017-12-19 20:33:03 +00:00
|
|
|
sb.AppendFormat("\tDrive supports a maximum of {0} bytes in a single cue sheet", ftr.MaxCueSheet)
|
|
|
|
|
.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_002F(Feature_002F? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_002F ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.DVDRW && ftr.RDL) sb.AppendLine("Drive supports writing DVD-R, DVD-RW and DVD-R DL");
|
|
|
|
|
else if(ftr.RDL) sb.AppendLine("Drive supports writing DVD-R and DVD-R DL");
|
|
|
|
|
else if(ftr.DVDRW) sb.AppendLine("Drive supports writing DVD-R and DVD-RW");
|
|
|
|
|
else sb.AppendLine("Drive supports writing DVD-R");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.TestWrite) sb.AppendLine("\tDrive can do a test writing");
|
|
|
|
|
if(ftr.BUF) sb.AppendLine("\tDrive supports zero loss linking");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0030(Feature_0030? feature)
|
|
|
|
|
{
|
|
|
|
|
return !feature.HasValue ? null : "Drive can read DDCDs\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0031(Feature_0031? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0031 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("Drive supports writing DDCD-R");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.TestWrite) sb.AppendLine("\tDrive can do a test writing");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0032(Feature_0032? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0032 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("Drive supports writing DDCD-RW");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Blank) sb.AppendLine("\tDrive supports the BLANK command");
|
|
|
|
|
if(ftr.Intermediate) sb.AppendLine("\tDrive supports quick formatting");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0033(Feature_0033? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0033 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("MMC Layer Jump Recording:");
|
|
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(ftr.LinkSizes == null) return sb.ToString();
|
|
|
|
|
|
|
|
|
|
foreach(byte link in ftr.LinkSizes)
|
|
|
|
|
sb.AppendFormat("\tCurrent media has a {0} bytes link available", link).AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0035(Feature_0035? feature)
|
|
|
|
|
{
|
|
|
|
|
return !feature.HasValue ? null : "Drive can stop a long immediate operation\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0037(Feature_0037? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0037 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("Drive can write CD-RW");
|
2017-12-21 06:06:19 +00:00
|
|
|
if(ftr.SubtypeSupport <= 0) return sb.ToString();
|
|
|
|
|
|
|
|
|
|
sb.Append("\tDrive supports CD-RW subtypes");
|
|
|
|
|
if((ftr.SubtypeSupport & 0x01) == 0x01) sb.Append(" 0");
|
|
|
|
|
if((ftr.SubtypeSupport & 0x02) == 0x02) sb.Append(" 1");
|
|
|
|
|
if((ftr.SubtypeSupport & 0x04) == 0x04) sb.Append(" 2");
|
|
|
|
|
if((ftr.SubtypeSupport & 0x08) == 0x08) sb.Append(" 3");
|
|
|
|
|
if((ftr.SubtypeSupport & 0x10) == 0x10) sb.Append(" 4");
|
|
|
|
|
if((ftr.SubtypeSupport & 0x20) == 0x20) sb.Append(" 5");
|
|
|
|
|
if((ftr.SubtypeSupport & 0x40) == 0x40) sb.Append(" 6");
|
|
|
|
|
if((ftr.SubtypeSupport & 0x80) == 0x80) sb.Append(" 7");
|
|
|
|
|
sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0038(Feature_0038? feature)
|
|
|
|
|
{
|
|
|
|
|
return !feature.HasValue ? null : "Drive can write BD-R on Pseudo-OVerwrite SRM mode\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_003A(Feature_003A? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_003A ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.Write)
|
2015-11-01 19:36:24 +00:00
|
|
|
{
|
|
|
|
|
sb.Append("Drive can read and write DVD+RW DL");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2017-12-22 02:04:18 +00:00
|
|
|
sb.AppendLine(ftr.CloseOnly
|
|
|
|
|
? "\tDrive supports only the read compatibility stop"
|
|
|
|
|
: "\tDrive supports both forms of background format stopping");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.QuickStart) sb.AppendLine("\tDrive can do a quick start formatting");
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
sb.Append("Drive can read DVD+RW DL");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_003B(Feature_003B? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_003B ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.Write)
|
2015-11-01 19:36:24 +00:00
|
|
|
{
|
|
|
|
|
sb.Append("Drive can read and write DVD+R DL");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
sb.Append("Drive can read DVD+R DL");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0040(Feature_0040? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0040 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.Append("MMC BD Read");
|
2017-12-22 02:04:18 +00:00
|
|
|
sb.AppendLine(ftr.Current ? " (current):" : ":");
|
2017-12-19 20:33:03 +00:00
|
|
|
|
|
|
|
|
if(ftr.OldROM) sb.AppendLine("\tDrive can read BD-ROM pre-1.0");
|
|
|
|
|
if(ftr.ROM) sb.AppendLine("\tDrive can read BD-ROM Ver.1");
|
|
|
|
|
if(ftr.OldR) sb.AppendLine("\tDrive can read BD-R pre-1.0");
|
|
|
|
|
if(ftr.R) sb.AppendLine("\tDrive can read BD-R Ver.1");
|
|
|
|
|
if(ftr.OldRE) sb.AppendLine("\tDrive can read BD-RE pre-1.0");
|
|
|
|
|
if(ftr.RE1) sb.AppendLine("\tDrive can read BD-RE Ver.1");
|
|
|
|
|
if(ftr.RE2) sb.AppendLine("\tDrive can read BD-RE Ver.2");
|
|
|
|
|
|
|
|
|
|
if(ftr.BCA) sb.AppendLine("\tDrive can read BD's Burst Cutting Area");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0041(Feature_0041? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0041 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.Append("MMC BD Write");
|
2017-12-22 02:04:18 +00:00
|
|
|
sb.AppendLine(ftr.Current ? " (current):" : ":");
|
2017-12-19 20:33:03 +00:00
|
|
|
|
|
|
|
|
if(ftr.OldR) sb.AppendLine("\tDrive can write BD-R pre-1.0");
|
|
|
|
|
if(ftr.R) sb.AppendLine("\tDrive can write BD-R Ver.1");
|
|
|
|
|
if(ftr.OldRE) sb.AppendLine("\tDrive can write BD-RE pre-1.0");
|
|
|
|
|
if(ftr.RE1) sb.AppendLine("\tDrive can write BD-RE Ver.1");
|
|
|
|
|
if(ftr.RE2) sb.AppendLine("\tDrive can write BD-RE Ver.2");
|
|
|
|
|
|
|
|
|
|
if(ftr.SVNR) sb.AppendLine("\tDrive supports write without verify requirement");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0042(Feature_0042? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
return !feature.HasValue
|
|
|
|
|
? null
|
|
|
|
|
: "Drive is able to detect and report defective writable unit and behave accordinly\n";
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0050(Feature_0050? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0050 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.HDDVDR && ftr.HDDVDRAM) sb.Append("Drive can read HD DVD-ROM, HD DVD-RW, HD DVD-R and HD DVD-RAM");
|
|
|
|
|
else if(ftr.HDDVDR) sb.Append("Drive can read HD DVD-ROM, HD DVD-RW and HD DVD-R");
|
|
|
|
|
else if(ftr.HDDVDRAM) sb.Append("Drive can read HD DVD-ROM, HD DVD-RW and HD DVD-RAM");
|
|
|
|
|
else sb.Append("Drive can read HD DVD-ROM and HD DVD-RW");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0051(Feature_0051? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0051 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.HDDVDR && ftr.HDDVDRAM) sb.Append("Drive can write HD DVD-RW, HD DVD-R and HD DVD-RAM");
|
|
|
|
|
else if(ftr.HDDVDR) sb.Append("Drive can write HD DVD-RW and HD DVD-R");
|
|
|
|
|
else if(ftr.HDDVDRAM) sb.Append("Drive can write HD DVD-RW and HD DVD-RAM");
|
|
|
|
|
else sb.Append("Drive can write HD DVD-RW");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0080(Feature_0080? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0080 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.Append("Drive is able to access Hybrid discs");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.RI)
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendLine("\tDrive is able to maintain the online format layer through reset and power cycling");
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0100(Feature_0100? feature)
|
|
|
|
|
{
|
|
|
|
|
return !feature.HasValue ? null : "Drive is able to perform host and drive directed power management\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0101(Feature_0101? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0101 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("Drive supports S.M.A.R.T.");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.PP) sb.AppendLine("\tDrive supports the Informational Exceptions Control mode page 1Ch");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0102(Feature_0102? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0102 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("MMC Embedded Changer:");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.SCC) sb.AppendLine("\tDrive can change disc side");
|
|
|
|
|
if(ftr.SDP) sb.AppendLine("\tDrive is able to report slots contents after a reset or change");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendFormat("\tDrive has {0} slots", ftr.HighestSlotNumber + 1).AppendLine();
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0103(Feature_0103? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0103 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("Drive has an analogue audio output");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Scan) sb.AppendLine("\tDrive supports the SCAN command");
|
|
|
|
|
if(ftr.SCM) sb.AppendLine("\tDrive is able to mute channels separately");
|
|
|
|
|
if(ftr.SV) sb.AppendLine("\tDrive supports separate volume per channel");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendFormat("\tDrive has {0} volume levels", ftr.VolumeLevels + 1).AppendLine();
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0104(Feature_0104? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0104 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("Drive supports Microcode Upgrade");
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.M5)
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendLine("Drive supports validating the 5-bit Mode of the READ BUFFER and WRITE BUFFER commands");
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0105(Feature_0105? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0105 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2015-11-01 22:38:25 +00:00
|
|
|
sb.AppendLine("Drive supports Timeout & Protect mode page 1Dh");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(!ftr.Group3) return sb.ToString();
|
|
|
|
|
|
|
|
|
|
sb.AppendLine("\tDrive supports the Group3 in Timeout & Protect mode page 1Dh");
|
|
|
|
|
if(ftr.UnitLength > 0)
|
|
|
|
|
sb.AppendFormat("\tDrive has {0} increase of Group 3 time unit", ftr.UnitLength).AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0106(Feature_0106? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0106 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendFormat("Drive supports DVD CSS/CPPM version {0}", ftr.CSSVersion);
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" and current disc is encrypted");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0107(Feature_0107? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0107 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("MMC Real Time Streaming:");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.SMP) sb.AppendLine("\tDrive supports Set Minimum Performance with the SET STREAMING command");
|
|
|
|
|
if(ftr.RBCB) sb.AppendLine("\tDrive supports the block bit in the READ BUFFER CAPACITY command");
|
|
|
|
|
if(ftr.SCS) sb.AppendLine("\tDrive supports the SET CD SPEED command");
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.MP2A)
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendLine("\tDrive supports the Write Speed Performance Descriptor Blocks in the MMC mode page 2Ah");
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.WSPD)
|
2015-11-01 19:36:24 +00:00
|
|
|
sb.AppendLine("\tDrive supports the Write Speed data of GET PERFORMANCE and the WRC field of SET STREAMING");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.SW) sb.AppendLine("\tDrive supports stream recording");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0108(Feature_0108? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0108 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendFormat("Drive serial number: {0}", ftr.Serial).AppendLine();
|
|
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0109(Feature_0109? feature)
|
|
|
|
|
{
|
2017-06-03 01:11:25 +01:00
|
|
|
return !feature.HasValue ? null : "Drive is able to read media serial number\n";
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_010A(Feature_010A? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_010A ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(ftr.DCBs == null) return sb.ToString();
|
|
|
|
|
|
2017-12-22 02:04:18 +00:00
|
|
|
foreach(uint dcb in ftr.DCBs) sb.AppendFormat("Drive supports DCB {0:X8}h", dcb).AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_010B(Feature_010B? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_010B ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendFormat("Drive supports DVD CPRM version {0}", ftr.CPRMVersion);
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" and current disc is or can be encrypted");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_010C(Feature_010C? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_010C ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-22 02:04:18 +00:00
|
|
|
byte[] temp = new byte[4];
|
2015-11-01 19:36:24 +00:00
|
|
|
temp[0] = (byte)((ftr.Century & 0xFF00) >> 8);
|
|
|
|
|
temp[1] = (byte)(ftr.Century & 0xFF);
|
|
|
|
|
temp[2] = (byte)((ftr.Year & 0xFF00) >> 8);
|
|
|
|
|
temp[3] = (byte)(ftr.Year & 0xFF);
|
2017-12-22 02:04:18 +00:00
|
|
|
string syear = Encoding.ASCII.GetString(temp);
|
2018-06-22 08:08:38 +01:00
|
|
|
temp = new byte[2];
|
2015-11-01 19:36:24 +00:00
|
|
|
temp[0] = (byte)((ftr.Month & 0xFF00) >> 8);
|
|
|
|
|
temp[1] = (byte)(ftr.Month & 0xFF);
|
2017-12-22 02:04:18 +00:00
|
|
|
string smonth = Encoding.ASCII.GetString(temp);
|
2018-06-22 08:08:38 +01:00
|
|
|
temp = new byte[2];
|
2015-11-01 19:36:24 +00:00
|
|
|
temp[0] = (byte)((ftr.Day & 0xFF00) >> 8);
|
|
|
|
|
temp[1] = (byte)(ftr.Day & 0xFF);
|
2017-12-22 02:04:18 +00:00
|
|
|
string sday = Encoding.ASCII.GetString(temp);
|
2018-06-22 08:08:38 +01:00
|
|
|
temp = new byte[2];
|
2015-11-01 19:36:24 +00:00
|
|
|
temp[0] = (byte)((ftr.Hour & 0xFF00) >> 8);
|
|
|
|
|
temp[1] = (byte)(ftr.Hour & 0xFF);
|
2017-12-22 02:04:18 +00:00
|
|
|
string shour = Encoding.ASCII.GetString(temp);
|
2018-06-22 08:08:38 +01:00
|
|
|
temp = new byte[2];
|
2015-11-01 19:36:24 +00:00
|
|
|
temp[0] = (byte)((ftr.Minute & 0xFF00) >> 8);
|
|
|
|
|
temp[1] = (byte)(ftr.Minute & 0xFF);
|
2017-12-22 02:04:18 +00:00
|
|
|
string sminute = Encoding.ASCII.GetString(temp);
|
2018-06-22 08:08:38 +01:00
|
|
|
temp = new byte[2];
|
2015-11-01 19:36:24 +00:00
|
|
|
temp[0] = (byte)((ftr.Second & 0xFF00) >> 8);
|
|
|
|
|
temp[1] = (byte)(ftr.Second & 0xFF);
|
2017-12-22 02:04:18 +00:00
|
|
|
string ssecond = Encoding.ASCII.GetString(temp);
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
DateTime fwDate = new DateTime(int.Parse(syear), int.Parse(smonth), int.Parse(sday), int.Parse(shour),
|
|
|
|
|
int.Parse(sminute), int.Parse(ssecond), DateTimeKind.Utc);
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2015-11-01 22:38:25 +00:00
|
|
|
sb.AppendFormat("Drive firmware is dated {0}", fwDate).AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
2018-06-22 08:08:38 +01:00
|
|
|
#pragma warning disable RECS0022 // A catch clause that catches System.Exception and has an empty body
|
2017-12-22 02:04:18 +00:00
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
// ignored
|
|
|
|
|
}
|
2018-06-22 08:08:38 +01:00
|
|
|
#pragma warning restore RECS0022 // A catch clause that catches System.Exception and has an empty body
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_010D(Feature_010D? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_010D ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendFormat("Drive supports AACS version {0}", ftr.AACSVersion);
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" and current disc is encrypted");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.RDC) sb.AppendLine("\tDrive supports reading the Drive Certificate");
|
|
|
|
|
if(ftr.RMC) sb.AppendLine("\tDrive supports reading Media Key Block of CPRM");
|
|
|
|
|
if(ftr.WBE) sb.AppendLine("\tDrive supports writing with bus encryption");
|
|
|
|
|
if(ftr.BEC) sb.AppendLine("\tDrive supports bus encryption");
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.BNG)
|
2015-11-01 19:36:24 +00:00
|
|
|
{
|
|
|
|
|
sb.AppendLine("\tDrive supports generating the binding nonce");
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.BindNonceBlocks > 0)
|
2017-12-19 20:33:03 +00:00
|
|
|
sb.AppendFormat("\t{0} media blocks are required for the binding nonce", ftr.BindNonceBlocks)
|
|
|
|
|
.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
}
|
2018-06-22 08:08:38 +01:00
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.AGIDs > 0) sb.AppendFormat("\tDrive supports {0} AGIDs concurrently", ftr.AGIDs).AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_010E(Feature_010E? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_010E ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.Append("Drive supports DVD-Download");
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine(" (current)");
|
|
|
|
|
else sb.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2016-04-19 02:11:47 +01:00
|
|
|
if(ftr.MaxScrambleExtent > 0)
|
2017-12-19 20:33:03 +00:00
|
|
|
sb.AppendFormat("\tMaximum {0} scranble extent information entries", ftr.MaxScrambleExtent)
|
|
|
|
|
.AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0110(Feature_0110? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0110 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-22 02:04:18 +00:00
|
|
|
sb.AppendLine(ftr.Current ? "Drive and currently inserted media support VCPS" : "Drive supports VCPS");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0113(Feature_0113? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0113 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-22 02:04:18 +00:00
|
|
|
sb.AppendLine(ftr.Current
|
|
|
|
|
? "Drive and currently inserted media support SecurDisc"
|
|
|
|
|
: "Drive supports SecurDisc");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0142(Feature_0142? feature)
|
|
|
|
|
{
|
2017-12-19 20:33:03 +00:00
|
|
|
if(!feature.HasValue) return null;
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2018-06-22 08:08:38 +01:00
|
|
|
Feature_0142 ftr = feature.Value;
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
sb.AppendLine("Drive supports the Trusted Computing Group Optical Security Subsystem Class");
|
|
|
|
|
|
2017-12-19 20:33:03 +00:00
|
|
|
if(ftr.Current) sb.AppendLine("\tCurrent media is initialized with TCG OSSC");
|
|
|
|
|
if(ftr.PSAU) sb.AppendLine("\tDrive supports PSA updates on write-once media");
|
|
|
|
|
if(ftr.LOSPB) sb.AppendLine("\tDrive supports linked OSPBs");
|
|
|
|
|
if(ftr.ME) sb.AppendLine("\tDrive will only record on the OSSC Disc Format");
|
2015-11-01 19:36:24 +00:00
|
|
|
|
2017-12-21 06:06:19 +00:00
|
|
|
if(ftr.Profiles == null) return sb.ToString();
|
|
|
|
|
|
|
|
|
|
for(int i = 0; i < ftr.Profiles.Length; i++)
|
|
|
|
|
sb.AppendFormat("\tProfile {0}: {1}", i, ftr.Profiles[i]).AppendLine();
|
2015-11-01 19:36:24 +00:00
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0000(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0000(Decode_0000(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0001(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0001(Decode_0001(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0002(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0002(Decode_0002(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0003(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0003(Decode_0003(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0004(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0004(Decode_0004(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0010(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0010(Decode_0010(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_001D(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_001D(Decode_001D(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_001E(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_001E(Decode_001E(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_001F(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_001F(Decode_001F(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0020(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0020(Decode_0020(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0021(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0021(Decode_0021(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0022(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0022(Decode_0022(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0023(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0023(Decode_0023(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0024(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0024(Decode_0024(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0025(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0025(Decode_0025(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0026(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0026(Decode_0026(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0027(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0027(Decode_0027(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0028(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0028(Decode_0028(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0029(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0029(Decode_0029(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_002A(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_002A(Decode_002A(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_002B(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_002B(Decode_002B(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_002C(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_002C(Decode_002C(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_002D(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_002D(Decode_002D(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_002E(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_002E(Decode_002E(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_002F(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_002F(Decode_002F(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0030(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0030(Decode_0030(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0031(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0031(Decode_0031(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0032(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0032(Decode_0032(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0033(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0033(Decode_0033(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0035(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0035(Decode_0035(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0037(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0037(Decode_0037(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0038(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0038(Decode_0038(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_003A(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_003A(Decode_003A(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_003B(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_003B(Decode_003B(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0040(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0040(Decode_0040(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0041(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0041(Decode_0041(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0042(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0042(Decode_0042(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0050(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0050(Decode_0050(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0051(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0051(Decode_0051(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0080(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0080(Decode_0080(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0100(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0100(Decode_0100(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0101(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0101(Decode_0101(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0102(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0102(Decode_0102(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0103(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0103(Decode_0103(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0104(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0104(Decode_0104(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0105(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0105(Decode_0105(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0106(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0106(Decode_0106(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0107(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0107(Decode_0107(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0108(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0108(Decode_0108(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0109(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0109(Decode_0109(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_010A(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_010A(Decode_010A(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_010B(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_010B(Decode_010B(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_010C(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_010C(Decode_010C(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_010D(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_010D(Decode_010D(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_010E(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_010E(Decode_010E(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0110(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0110(Decode_0110(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0113(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0113(Decode_0113(feature));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static string Prettify_0142(byte[] feature)
|
|
|
|
|
{
|
|
|
|
|
return Prettify_0142(Decode_0142(feature));
|
|
|
|
|
}
|
2015-11-01 20:06:24 +00:00
|
|
|
|
|
|
|
|
public static SeparatedFeatures Separate(byte[] response)
|
|
|
|
|
{
|
2017-12-22 02:04:18 +00:00
|
|
|
SeparatedFeatures dec = new SeparatedFeatures
|
|
|
|
|
{
|
2018-06-22 08:08:38 +01:00
|
|
|
DataLength = (uint)((response[0] << 24) + (response[1] << 16) + (response[2] << 8) + response[4]),
|
|
|
|
|
CurrentProfile = (ushort)((response[6] << 8) + response[7])
|
2017-12-22 02:04:18 +00:00
|
|
|
};
|
2018-06-22 08:08:38 +01:00
|
|
|
uint offset = 8;
|
2015-11-01 20:06:24 +00:00
|
|
|
List<FeatureDescriptor> descLst = new List<FeatureDescriptor>();
|
|
|
|
|
|
2017-12-20 17:26:28 +00:00
|
|
|
while(offset + 4 < response.Length)
|
2015-11-01 20:06:24 +00:00
|
|
|
{
|
2017-12-22 02:04:18 +00:00
|
|
|
FeatureDescriptor desc = new FeatureDescriptor
|
|
|
|
|
{
|
|
|
|
|
Code = (ushort)((response[offset + 0] << 8) + response[offset + 1]),
|
|
|
|
|
Data = new byte[response[offset + 3] + 4]
|
|
|
|
|
};
|
2017-12-19 20:33:03 +00:00
|
|
|
if(desc.Data.Length + offset > response.Length) desc.Data = new byte[response.Length - offset];
|
2015-11-01 22:09:10 +00:00
|
|
|
Array.Copy(response, offset, desc.Data, 0, desc.Data.Length);
|
2017-12-20 17:26:28 +00:00
|
|
|
offset += (uint)desc.Data.Length;
|
2015-11-01 20:06:24 +00:00
|
|
|
|
|
|
|
|
descLst.Add(desc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dec.Descriptors = descLst.ToArray();
|
|
|
|
|
|
|
|
|
|
return dec;
|
|
|
|
|
}
|
2017-12-23 18:31:38 +00:00
|
|
|
|
|
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
|
|
|
|
public struct FeatureDescriptor
|
|
|
|
|
{
|
|
|
|
|
public ushort Code;
|
|
|
|
|
public byte[] Data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[SuppressMessage("ReSharper", "InconsistentNaming")]
|
|
|
|
|
[SuppressMessage("ReSharper", "MemberCanBeInternal")]
|
|
|
|
|
[SuppressMessage("ReSharper", "NotAccessedField.Global")]
|
|
|
|
|
public struct SeparatedFeatures
|
|
|
|
|
{
|
2018-06-22 08:08:38 +01:00
|
|
|
public uint DataLength;
|
|
|
|
|
public ushort CurrentProfile;
|
2017-12-23 18:31:38 +00:00
|
|
|
public FeatureDescriptor[] Descriptors;
|
|
|
|
|
}
|
2015-11-01 02:16:29 +00:00
|
|
|
}
|
2017-12-19 20:33:03 +00:00
|
|
|
}
|