// // Created by claunia on 11/12/17. // #ifndef DISCIMAGECHEF_DEVICE_REPORT_SCSI_H #define DISCIMAGECHEF_DEVICE_REPORT_SCSI_H #include int SendScsiCommand(int fd, void *cdb, unsigned char cdb_len, unsigned char *buffer, unsigned int buffer_len, unsigned char **senseBuffer, int direction); int Inquiry(int fd, unsigned char **buffer, unsigned char **senseBuffer); int PreventMediumRemoval(int fd, unsigned char **senseBuffer); int AllowMediumRemoval(int fd, unsigned char **senseBuffer); int PreventAllowMediumRemoval(int fd, unsigned char **senseBuffer, int persistent, int prevent); int LoadTray(int fd, unsigned char **senseBuffer); int EjectTray(int fd, unsigned char **senseBuffer); int StartUnit(int fd, unsigned char **senseBuffer); int StopUnit(int fd, unsigned char **senseBuffer); int StartStopUnit(int fd, unsigned char **senseBuffer, int immediate, uint8_t formatLayer, uint8_t powerConditions, int changeFormatLayer, int loadEject, int start); int SpcPreventMediumRemoval(int fd, unsigned char **senseBuffer); int SpcAllowMediumRemoval(int fd, unsigned char **senseBuffer); int SpcPreventAllowMediumRemoval(int fd, unsigned char **senseBuffer, uint8_t preventMode); int Load(int fd, unsigned char **senseBuffer); int Unload(int fd, unsigned char **senseBuffer); int LoadUnload(int fd, unsigned char **senseBuffer, int immediate, int load, int retense, int endOfTape, int hold); int ModeSense6(int fd, unsigned char **buffer, unsigned char **senseBuffer, int DBD, uint8_t pageControl, uint8_t pageCode, uint8_t subPageCode); int ModeSense10(int fd, unsigned char **buffer, unsigned char **senseBuffer, int LLBAA, int DBD, uint8_t pageContorl, uint8_t pageCode, uint8_t subPageCode); int ReadCapacity(int fd, unsigned char **buffer, unsigned char **senseBuffer, int RelAddr, uint32_t address, int PMI); int ReadCapacity16(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint64_t address, int PMI); int Read6(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint32_t lba, uint32_t blockSize, uint8_t transferLength); int Read10(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint8_t rdprotect, int dpo, int fua, int fuaNv, int relAddr, uint32_t lba, uint32_t blockSize, uint8_t groupNumber, uint16_t transferLength); int Read12(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint8_t rdprotect, int dpo, int fua, int fuaNv, int relAddr, uint32_t lba, uint32_t blockSize, uint8_t groupNumber, uint32_t transferLength, int streaming); int Read16(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint8_t rdprotect, int dpo, int fua, int fuaNv, uint64_t lba, uint32_t blockSize, uint8_t groupNumber, uint32_t transferLength, int streaming); int ReadLong10(int fd, unsigned char **buffer, unsigned char **senseBuffer, int correct, int relAddr, uint32_t lba, uint16_t transferBytes); int ReadLong16(int fd, unsigned char **buffer, unsigned char **senseBuffer, int correct, uint64_t lba, uint32_t transferBytes); int Seek6(int fd, unsigned char **senseBuffer, uint32_t lba); int Seek10(int fd, unsigned char **senseBuffer, uint32_t lba); int TestUnitReady(int fd, unsigned char **senseBuffer); int GetConfiguration(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint16_t startingFeatureNumber, uint8_t RT); int ReadTocPmaAtip(int fd, unsigned char **buffer, unsigned char **senseBuffer, int MSF, uint8_t format, uint8_t trackSessionNumber); int ReadDiscStructure(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint8_t mediaType, uint32_t address, uint8_t layerNumber, uint8_t format, uint8_t AGID); int ReadCd(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint32_t lba, uint32_t blockSize, uint32_t transferLength, uint8_t expectedSectorType, int DAP, int relAddr, int sync, uint8_t headerCodes, int userData, int edcEcc, uint8_t C2Error, uint8_t subchannel); int ReadCdMsf(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint32_t startMsf, uint32_t endMsf, uint32_t blockSize, uint8_t expectedSectorType, int DAP, int sync, uint8_t headerCodes, int userData, int edcEcc, uint8_t C2Error, uint8_t subchannel); int PlextorReadCdDa(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint32_t lba, uint32_t blockSize, uint32_t transferLength, uint8_t subchannel); int PlextorReadRawDvd(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint32_t lba, uint32_t transferLength); int PioneerReadCdDa(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint32_t lba, uint32_t blockSize, uint32_t transferLength, uint8_t subchannel); int PioneerReadCdDaMsf(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint32_t startMsf, uint32_t endMsf, uint32_t blockSize, uint8_t subchannel); int NecReadCdDa(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint32_t lba, uint32_t transferLength); int HlDtStReadRawDvd(int fd, unsigned char **buffer, unsigned char **senseBuffer, uint32_t lba, uint32_t transferLength); typedef enum { SCSI_TEST_UNIT_READY = 0x00, SCSI_READ = 0x08, SCSI_SEEK = 0x0B, SCSI_INQUIRY = 0x12, SCSI_START_STOP_UNIT = 0x1B, SCSI_LOAD_UNLOAD = SCSI_START_STOP_UNIT, SCSI_MODE_SENSE = 0x1A, SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL = 0x1E, SCSI_READ_CAPACITY = 0x25, SCSI_READ_10 = 0x28, SCSI_READ_LONG = 0x3E, SCSI_SEEK_10 = 0x2B, SCSI_READ_BUFFER = 0x3C, MMC_READ_TOC_PMA_ATIP = 0x43, MMC_GET_CONFIGURATION = 0x46, SCSI_MODE_SENSE_10 = 0x5A, SCSI_ATA_PASSTHROUGH_16 = 0x85, SCSI_READ_16 = 0x88, SCSI_SERVICE_ACTION_IN = 0x9E, SCSI_READ_12 = 0xA8, MMC_READ_DISC_STRUCTURE = 0xAD, MMC_READ_CD_MSF = 0xB9, MMC_READ_CD = 0xBE, NEC_READ_CDDA = 0xD4, PIONEER_READ_CDDA = 0xD8, PIONEER_READ_CDDA_MSF = 0xD9, HLDTST_VENDOR = 0xE7, } ScsiCommands; typedef enum { MODE_PAGE_CURRENT = 0x00, MODE_PAGE_CHANGEABLE = 0x40, MODE_PAGE_DEFAULT = 0x80, MODE_PAGE_SAVED = 0xC0 } ScsiModeSensePageControl; typedef enum { SCSI_READ_CAPACITY_16 = 0x10, SCSI_READ_LONG_16 = 0x11, } ScsiServiceActionIn; typedef enum { DISC_STRUCTURE_DVD = 0x00, DISC_STRUCTURE_BD = 0x01, } MmcDiscStructureMediaType; // TODO: Stylize this typedef enum { // Generic Format Codes /// /// AACS Volume Identifier /// DISC_STRUCTURE_AACSVolId = 0x80, /// /// AACS Pre-recorded Media Serial Number /// DISC_STRUCTURE_AACSMediaSerial = 0x81, /// /// AACS Media Identifier /// DISC_STRUCTURE_AACSMediaId = 0x82, /// /// AACS Lead-in Media Key Block /// DISC_STRUCTURE_AACSMKB = 0x83, /// /// AACS Data Keys /// DISC_STRUCTURE_AACSDataKeys = 0x84, /// /// AACS LBA extents /// DISC_STRUCTURE_AACSLBAExtents = 0x85, /// /// CPRM Media Key Block specified by AACS /// DISC_STRUCTURE_AACSMKBCPRM = 0x86, /// /// Recognized format layers /// DISC_STRUCTURE_RecognizedFormatLayers = 0x90, /// /// Write protection status /// DISC_STRUCTURE_WriteProtectionStatus = 0xC0, /// /// READ/SEND DISC STRUCTURE capability list /// DISC_STRUCTURE_CapabilityList = 0xFF, // DVD Disc Structures /// /// DVD Lead-in Physical Information /// DISC_STRUCTURE_PhysicalInformation = 0x00, /// /// DVD Lead-in Copyright Information /// DISC_STRUCTURE_CopyrightInformation = 0x01, /// /// CSS/CPPM Disc key /// DISC_STRUCTURE_DiscKey = 0x02, /// /// DVD Burst Cutting Area /// DISC_STRUCTURE_BurstCuttingArea = 0x03, /// /// DVD Lead-in Disc Manufacturing Information /// DISC_STRUCTURE_DiscManufacturingInformation = 0x04, /// /// DVD Copyright Information from specified sector /// DISC_STRUCTURE_SectorCopyrightInformation = 0x05, /// /// CSS/CPPM Media Identifier /// DISC_STRUCTURE_MediaIdentifier = 0x06, /// /// CSS/CPPM Media Key Block /// DISC_STRUCTURE_MediaKeyBlock = 0x07, /// /// DDS from DVD-RAM /// DISC_STRUCTURE_DVDRAM_DDS = 0x08, /// /// DVD-RAM Medium Status /// DISC_STRUCTURE_DVDRAM_MediumStatus = 0x09, /// /// DVD-RAM Spare Area Information /// DISC_STRUCTURE_DVDRAM_SpareAreaInformation = 0x0A, /// /// DVD-RAM Recording Type Information /// DISC_STRUCTURE_DVDRAM_RecordingType = 0x0B, /// /// DVD-R/-RW RMD in last Border-out /// DISC_STRUCTURE_LastBorderOutRMD = 0x0C, /// /// Specified RMD from last recorded Border-out /// DISC_STRUCTURE_SpecifiedRMD = 0x0D, /// /// DVD-R/-RW Lead-in pre-recorded information /// DISC_STRUCTURE_PreRecordedInfo = 0x0E, /// /// DVD-R/-RW Media Identifier /// DISC_STRUCTURE_DVDR_MediaIdentifier = 0x0F, /// /// DVD-R/-RW Physical Format Information /// DISC_STRUCTURE_DVDR_PhysicalInformation = 0x10, /// /// ADIP /// DISC_STRUCTURE_ADIP = 0x11, /// /// HD DVD Lead-in Copyright Protection Information /// DISC_STRUCTURE_HDDVD_CopyrightInformation = 0x12, /// /// AACS Lead-in Copyright Data Section /// DISC_STRUCTURE_DVD_AACS = 0x15, /// /// HD DVD-R Medium Status /// DISC_STRUCTURE_HDDVDR_MediumStatus = 0x19, /// /// HD DVD-R Last recorded RMD in the latest RMZ /// DISC_STRUCTURE_HDDVDR_LastRMD = 0x1A, /// /// DVD+/-R DL and DVD-Download DL layer capacity /// DISC_STRUCTURE_DVDR_LayerCapacity = 0x20, /// /// DVD-R DL Middle Zone start address /// DISC_STRUCTURE_MiddleZoneStart = 0x21, /// /// DVD-R DL Jump Interval Size /// DISC_STRUCTURE_JumpIntervalSize = 0x22, /// /// DVD-R DL Start LBA of the manual layer jump /// DISC_STRUCTURE_ManualLayerJumpStartLBA = 0x23, /// /// DVD-R DL Remapping information of the specified Anchor Point /// DISC_STRUCTURE_RemapAnchorPoint = 0x24, /// /// Disc Control Block /// DISC_STRUCTURE_DCB = 0x30, // BD Disc Structures /// /// Blu-ray Disc Information /// DISC_STRUCTURE_DiscInformation = 0x00, /// /// Blu-ray Burst Cutting Area /// DISC_STRUCTURE_BD_BurstCuttingArea = 0x03, /// /// Blu-ray DDS /// DISC_STRUCTURE_BD_DDS = 0x08, /// /// Blu-ray Cartridge Status /// DISC_STRUCTURE_CartridgeStatus = 0x09, /// /// Blu-ray Spare Area Information /// DISC_STRUCTURE_BD_SpareAreaInformation = 0x0A, /// /// Unmodified DFL /// DISC_STRUCTURE_RawDFL = 0x12, /// /// Physical Access Control /// DISC_STRUCTURE_PAC = 0x30 } MmcDiscStructureFormat; typedef enum { MMC_SECTOR_ALL = 0, MMC_SECTOR_CDDA = 1, MMC_SECTOR_MODE1 = 2, MMC_SECTOR_MODE2 = 3, MMC_SECTOR_MODE2F1 = 4, MMC_SECTOR_MODE2F2 = 5 } MmcSectorTypes; typedef enum { MMC_HEADER_NONE = 0, MMC_HEADER_ONLY = 1, MMC_SUBHEADER_ONLY = 2, MMC_HEADER_ALL = 3 } MmcHeaderCodes; typedef enum { MMC_ERROR_NONE = 0, MMC_ERROR_C2 = 1, MMC_ERROR_C2_AND_BLOCK = 2 } MmcErrorField; typedef enum { MMC_SUBCHANNEL_NONE = 0, MMC_SUBCHANNEL_RAW = 1, MMC_SUBCHANNEL_Q16 = 2, MMC_SUBCHANNEL_RW = 4 } MmcSubchannel; typedef enum { PIONEER_SUBCHANNEL_NONE = 0, PIONEER_SUBCHANNEL_Q16 = 1, PIONEER_SUBCHANNEL_ALL = 2, PIONEER_SUBCHANNEL_ONLY = 3 } PioneerSubchannel; typedef enum { PLEXTOR_SUBCHANNEL_NONE = 0, PLEXTOR_SUBCHANNEL_Q16 = 1, PLEXTOR_SUBCHANNEL_PACK = 2, PLEXTOR_SUBCHANNEL_ALL = 3, PLEXTOR_SUBCHANNEL_RAW_C2 = 8 } PlextorSubchannel; // SCSI INQUIRY command response #pragma pack(push, 1) typedef struct { /// /// Peripheral device type /// Byte 0, bits 4 to 0 /// uint8_t PeripheralDeviceType : 5; /// /// Peripheral qualifier /// Byte 0, bits 7 to 5 /// uint8_t PeripheralQualifier : 3; /// /// SCSI-1 vendor-specific qualification codes /// Byte 1, bits 6 to 0 /// uint8_t DeviceTypeModifier : 7; /// /// Removable device /// Byte 1, bit 7 /// uint8_t RMB : 1; /// /// ANSI SCSI Standard Version /// Byte 2, bits 2 to 0, mask = 0x07 /// uint8_t ANSIVersion : 3; /// /// ECMA SCSI Standard Version /// Byte 2, bits 5 to 3, mask = 0x38, >> 3 /// uint8_t ECMAVersion : 3; /// /// ISO/IEC SCSI Standard Version /// Byte 2, bits 7 to 6, mask = 0xC0, >> 6 /// uint8_t ISOVersion : 2; /// /// Responde data format /// Byte 3, bit 3 to 0 /// uint8_t ResponseDataFormat : 4; /// /// Supports LUN hierarchical addressing /// Byte 3, bit 4 /// uint8_t HiSup : 1; /// /// Supports setting Normal ACA /// Byte 3, bit 5 /// uint8_t NormACA : 1; /// /// Device supports TERMINATE TASK command /// Byte 3, bit 6 /// uint8_t TrmTsk : 1; /// /// Asynchronous Event Reporting Capability supported /// Byte 3, bit 7 /// uint8_t AERC : 1; /// /// Lenght of total INQUIRY response minus 4 /// Byte 4 /// uint8_t AdditionalLength; /// /// Supports protection information /// Byte 5, bit 0 /// uint8_t Protect : 1; /// /// Reserved /// Byte 5, bits 2 to 1 /// uint8_t Reserved2 : 2; /// /// Supports third-party copy commands /// Byte 5, bit 3 /// uint8_t ThreePC : 1; /// /// Supports asymetrical logical unit access /// Byte 5, bits 5 to 4 /// uint8_t TPGS : 2; /// /// Device contains an Access Control Coordinator /// Byte 5, bit 6 /// uint8_t ACC : 1; /// /// Device contains an embedded storage array controller /// Byte 5, bit 7 /// uint8_t SCCS : 1; /// /// Supports 16-bit wide SCSI addresses /// Byte 6, bit 0 /// uint8_t Addr16 : 1; /// /// Supports 32-bit wide SCSI addresses /// Byte 6, bit 1 /// uint8_t Addr32 : 1; /// /// Device supports request and acknowledge handshakes /// Byte 6, bit 2 /// uint8_t ACKREQQ : 1; /// /// Device contains or is attached to a medium changer /// Byte 6, bit 3 /// uint8_t MChngr : 1; /// /// Multi-port device /// Byte 6, bit 4 /// uint8_t MultiP : 1; /// /// Vendor-specific /// Byte 6, bit 5 /// uint8_t VS1 : 1; /// /// Device contains an embedded enclosure services component /// Byte 6, bit 6 /// uint8_t EncServ : 1; /// /// Supports basic queueing /// Byte 6, bit 7 /// uint8_t BQue : 1; /// /// Indicates that the devices responds to RESET with soft reset /// Byte 7, bit 0 /// uint8_t SftRe : 1; /// /// Supports TCQ queue /// Byte 7, bit 1 /// uint8_t CmdQue : 1; /// /// Supports CONTINUE TASK and TARGET TRANSFER DISABLE commands /// Byte 7, bit 2 /// uint8_t TranDis : 1; /// /// Supports linked commands /// Byte 7, bit 3 /// uint8_t Linked : 1; /// /// Supports synchronous data transfer /// Byte 7, bit 4 /// uint8_t Sync : 1; /// /// Supports 16-bit wide data transfers /// Byte 7, bit 5 /// uint8_t WBus16 : 1; /// /// Supports 32-bit wide data transfers /// Byte 7, bit 6 /// uint8_t WBus32 : 1; /// /// Device supports relative addressing /// Byte 7, bit 7 /// uint8_t RelAddr : 1; /// /// Vendor identification /// Bytes 8 to 15 /// uint8_t VendorIdentification[8]; /// /// Product identification /// Bytes 16 to 31 /// uint8_t ProductIdentification[16]; /// /// Product revision level /// Bytes 32 to 35 /// uint8_t ProductRevisionLevel[4]; /// /// Vendor-specific data /// Bytes 36 to 55 /// uint8_t VendorSpecific[20]; /// /// Supports information unit transfers /// Byte 56, bit 0 /// uint8_t IUS : 1; /// /// Device supports Quick Arbitration and Selection /// Byte 56, bit 1 /// uint8_t QAS : 1; /// /// Supported SPI clocking /// Byte 56, bits 3 to 2 /// uint8_t Clocking : 2; /// /// Byte 56, bits 7 to 4 /// uint8_t Reserved3 : 4; /// /// Reserved /// Byte 57 /// uint8_t Reserved4; /// /// Array of version descriptors /// Bytes 58 to 73 /// uint16_t VersionDescriptors[8]; /// /// Reserved /// Bytes 74 to 95 /// uint8_t Reserved5[22]; /// /// Reserved /// Bytes 96 to end /// uint8_t VendorSpecific2; } ScsiInquiry; #pragma pack(pop) #endif //DISCIMAGECHEF_DEVICE_REPORT_SCSI_H