1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
4 ////////////////////////////////////////////////////////////////////
13 Here are the structures and defines used for device low level control.
20 #ifndef __CDRW_DEVICE_H__
21 #define __CDRW_DEVICE_H__
25 // Command Descriptor Block. Passed by SCSI controller chip over the SCSI bus
33 UCHAR CommandUniqueBits
: 4;
35 UCHAR CommandUniqueBytes
[3];
39 UCHAR VendorUnique
: 2;
42 struct _REQUEST_SENSE
{
47 UCHAR AllocationLength
;
51 } REQUEST_SENSE
, *PREQUEST_SENSE
;
53 // Standard 6-byte CDB
54 struct _CDB6READWRITE
{
61 } CDB6READWRITE
, *PCDB6READWRITE
;
70 UCHAR AllocationLength
;
72 } CDB6INQUIRY
, *PCDB6INQUIRY
;
86 #define FormatUnit_Code_Mask 0x07
87 #define FormatUnit_Cmp 0x08
88 #define FormatUnit_Fmt 0x10
90 #define FormatUnit_Code_oldCDRW 0x07
91 #define FormatUnit_Code_CD_DVD 0x01
107 } CDB6FORMAT
, *PCDB6FORMAT
;
109 // Standard 10-byte CDB
112 UCHAR RelativeAddress
: 1;
114 UCHAR ForceUnitAccess
: 1;
115 UCHAR DisablePageOut
: 1;
119 UCHAR TransferBlocks
[2];
125 #define PauseResume_Pause 0x00
126 #define PauseResume_Resume 0x01
128 struct _PAUSE_RESUME
{
135 } PAUSE_RESUME
, *PPAUSE_RESUME
;
137 // Read Table of Contents (TOC)
139 #define ReadTOC_Format_Mask 0x0f
140 #define ReadTOC_Format_TOC 0x00
141 #define ReadTOC_Format_SesInfo 0x01
142 #define ReadTOC_Format_FullTOC 0x02
143 #define ReadTOC_Format_PMA 0x03
144 #define ReadTOC_Format_ATIP 0x04
145 #define ReadTOC_Format_CdText 0x05
150 UCHAR Msf
: 1; // HMSF MMC-3
163 UCHAR Start_TrackSes
;
164 UCHAR AllocationLength
[2];
167 } READ_TOC
, *PREAD_TOC
;
170 struct _READ_HEADER
{
173 UCHAR Msf
: 1; // HMSF MMC-3
179 UCHAR AllocationLength
[2];
181 } READ_HEADER
, *PREAD_HEADER
;
184 struct _PLAY_AUDIO_MSF
{
189 UCHAR StartingMSF
[3];
192 } PLAY_AUDIO_MSF
, *PPLAY_AUDIO_MSF
;
194 // Read SubChannel Data
196 #define SubChannel_SubQ_Header 0x00
197 #define SubChannel_SubQ_Block 0x01
211 UCHAR AllocationLength
[2];
213 } SUBCHANNEL
, *PSUBCHANNEL
;
215 #define SetStreaming_Type_Performance 0x00
216 #define SetStreaming_Type_DBICacheZone 0x05
218 struct _SET_STREAMING
{
223 UCHAR AllocationLength
[2];
226 } SET_STREAMING
, *PSET_STREAMING
;
228 // Read CD (by LBA/MSF). Used by Atapi for raw sector reads.
230 #define ReadCD_SecType_Mask 0x1c
231 #define ReadCD_SecType_Any 0x00
232 #define ReadCD_SecType_CDDA 0x04
233 #define ReadCD_SecType_M1 0x08
234 #define ReadCD_SecType_M2 0x0c
235 #define ReadCD_SecType_M2F1 0x10
236 #define ReadCD_SecType_M2F2 0x14
238 struct _READ_CD_MSF
{
243 UCHAR ExpectedSectorType
: 3;
247 UCHAR Starting_MSF
[3];
251 UCHAR ErrorFlags
: 2;
252 UCHAR IncludeEDC
: 1;
253 UCHAR IncludeUserData
: 1;
254 UCHAR HeaderCode
: 2;
255 UCHAR IncludeSyncData
: 1;
257 UCHAR SubChannelSelection
: 3;
261 } READ_CD_MSF
, *PREAD_CD_MSF
;
266 UCHAR RelAdr
: 1; // must be 0
267 UCHAR DAP
: 1; // Digital Audio Play - enable mute & interpolate when reading CDDA
268 UCHAR ExpectedSectorType
: 3;
272 UCHAR NumOfBlocks
[3];
275 UCHAR ErrorFlags
: 2;
276 UCHAR IncludeEDC
: 1;
277 UCHAR IncludeUserData
: 1;
278 UCHAR HeaderCode
: 2;
279 UCHAR IncludeSyncData
: 1;
281 UCHAR SubChannelSelection
: 3;
285 } READ_CD
, *PREAD_CD
;
287 #define WriteCd_RELADR 0x01
288 #define WriteCd_FUA 0x08
289 #define WriteCd_DPO 0x10
305 UCHAR NumOfBlocks
[2];
307 } WRITE_CD
, *PWRITE_CD
;
319 UCHAR AllocationLength
;
321 } MODE_SENSE
, *PMODE_SENSE
;
324 struct _MODE_SENSE10
{
333 UCHAR AllocationLength
[2];
335 } MODE_SENSE10
, *PMODE_SENSE10
;
338 struct _MODE_SELECT
{
345 UCHAR ParameterListLength
;
347 } MODE_SELECT
, *PMODE_SELECT
;
349 struct _MODE_SELECT10
{
356 UCHAR ParameterListLength
[2];
358 } MODE_SELECT10
, *PMODE_SELECT10
;
370 UCHAR ParameterPointer
[2]; // [0]=MSB, [1]=LSB
371 UCHAR AllocationLength
[2]; // [0]=MSB, [1]=LSB
373 } LOGSENSE
, *PLOGSENSE
;
384 #define StartStop_Start 0x01
385 #define StartStop_Load 0x02
397 } START_STOP
, *PSTART_STOP
;
399 struct _MEDIA_REMOVAL
{
406 } MEDIA_REMOVAL
, *PMEDIA_REMOVAL
;
408 //#ifndef WITHOUT_FORMATTER
410 struct _READ_FORMAT_CAPACITIES
{
420 UCHAR AllocationLength
[2];
422 } READ_FORMAT_CAPACITIES
, *PREAD_FORMAT_CAPACITIES
;
423 //#endif //WITHOUT_FORMATTER
425 // Atapi 2.5 Changer 12-byte CDBs
426 #define LoadUnload_Start 0x01
427 #define LoadUnload_Load 0x02
429 struct _LOAD_UNLOAD
{
440 } LOAD_UNLOAD
, *PLOAD_UNLOAD
;
442 struct _MECH_STATUS
{
445 UCHAR AllocationLength
[2];
447 } MECH_STATUS
, *PMECH_STATUS
;
452 } LOCK_DOOR
, *PLOCK_DOOR
;
454 #define EventStat_Immed 0x01
456 #define EventStat_Class_OpChange 0x02
457 #define EventStat_Class_PM 0x04
458 #define EventStat_Class_ExternalReq 0x08
459 #define EventStat_Class_Media 0x10
460 #define EventStat_Class_MultiInit 0x20
461 #define EventStat_Class_DevBusy 0x40
463 struct _GET_EVENT_STATUS
{
473 UCHAR NotificationClass
;
475 UCHAR AllocationLength
[2];
477 } GET_EVENT_STATUS
, *PGET_EVENT_STATUS
;
479 #define ReadDiscInfo_Type_Mask 0x07
480 #define ReadDiscInfo_Type_Std 0x00
481 #define ReadDiscInfo_Type_TrkRes 0x01 // MMC-6
482 #define ReadDiscInfo_Type_POWRes 0x02 // MMC-6
484 struct _READ_DISC_INFO
{
487 UCHAR DataType
: 3; // MMC-6
491 UCHAR AllocationLength
[2];
493 } READ_DISC_INFO
, *PREAD_DISC_INFO
;
495 #define ReadTrackInfo_Type_Mask 0x01
496 #define ReadTrackInfo_Type_LBA 0x00
497 #define ReadTrackInfo_Type_Track 0x01
498 #define ReadTrackInfo_Type_POW 0x02
500 #define ReadTrackInfo_LastTrk 0xff
502 struct _READ_TRACK_INFO
{
506 UCHAR LBA_TrkNum
[4];
508 UCHAR AllocationLength
[2];
510 } READ_TRACK_INFO
, *PREAD_TRACK_INFO
;
512 #define ReadTrackInfo3_Type_Mask 0x03
513 #define ReadTrackInfo3_Type_LBA ReadTrackInfo_Type_LBA
514 #define ReadTrackInfo3_Type_Track ReadTrackInfo_Type_Track
515 #define ReadTrackInfo3_Type_Ses 0x02
517 #define ReadTrackInfo3_LastTrk ReadTrackInfo_LastTrk
518 #define ReadTrackInfo3_DiscLeadIn 0x00 // for Track type
520 struct _READ_TRACK_INFO_3
{
524 UCHAR LBA_TrkNum
[4];
526 UCHAR AllocationLength
[2];
528 } READ_TRACK_INFO_3
, *PREAD_TRACK_INFO_3
;
530 struct _RESERVE_TRACK
{
533 UCHAR ARSV
:1; // 0 - size format, 1 - start LBA
534 UCHAR RMZ
:1; // 0 - logical track, 1 - U-RMZ (HD-DVD)
548 } RESERVE_TRACK
, *PRESERVE_TRACK
;
550 #define CloseTrkSes_Immed 0x01
552 #define CloseTrkSes_BGF 0x00 // DVD+RW only
553 #define CloseTrkSes_Trk 0x01 // also stops BGF on MRW disks
554 #define CloseTrkSes_BGF_QCompat 0x02 // ensures 30mm radius of recorded area
555 #define CloseTrkSes_Ses 0x02
556 #define CloseTrkSes_BGF_Compat 0x03
557 #define CloseTrkSes_SesSpec 0x03
558 #define CloseTrkSes_FinSpec 0x05 // MMC-5, DVD+R only
559 #define CloseTrkSes_Fin 0x06 // MMC-5, DVD+R only
561 #define CloseTrkSes_LastTrkSes 0xff
563 #define CloseTrkSes_Delay 3100000000I64 // 310 s
565 struct _CLOSE_TRACK_SESSION
{
586 } CLOSE_TRACK_SESSION
, *PCLOSE_TRACK_SESSION
;
588 struct _SET_CD_SPEED
{
592 #define CdSpeed_RotCtrl_CLV 0x00
593 #define CdSpeed_RotCtrl_CAV 0x01
596 UCHAR ReadSpeed
[2]; // Kbyte/sec
597 UCHAR WriteSpeed
[2]; // Kbyte/sec
599 } SET_CD_SPEED
, *PSET_CD_SPEED
;
601 #define SyncCache_RELADR 0x01
602 #define SyncCache_Immed 0x02
604 struct _SYNCHRONIZE_CACHE
{
611 UCHAR Reserved0
: 6; // All these are unused by drive
616 UCHAR NumOfBlocks
[2];
620 } SYNCHRONIZE_CACHE
, *PSYNCHRONIZE_CACHE
;
622 #define BlankMedia_Mask 0x07
623 #define BlankMedia_Complete 0x00
624 #define BlankMedia_Minimal 0x01
625 #define BlankMedia_Track 0x02
626 #define BlankMedia_UnreserveTrack 0x03
627 #define BlankMedia_TrackTail 0x04
628 #define BlankMedia_UncloseLastSes 0x05
629 #define BlankMedia_EraseSes 0x06
630 #define BlankMedia_Immed 0x10
632 struct _BLANK_MEDIA
{
643 UCHAR StartAddr_TrkNum
[4];
645 } BLANK_MEDIA
, *PBLANK_MEDIA
;
647 #define SendKey_ReportAGID 0x00
648 #define SendKey_ChallengeKey 0x01
649 #define SendKey_Key1 0x02
650 #define SendKey_Key2 0x03
651 #define SendKey_TitleKey 0x04
652 #define SendKey_ReportASF 0x05
653 #define SendKey_InvalidateAGID 0x3F
660 UCHAR ParameterListLength
[2];
664 } SEND_KEY
, *PSEND_KEY
;
667 UCHAR OperationCode
; // 0xA4
670 UCHAR LBA
[4]; // for title key
672 UCHAR AllocationLength
[2];
676 } REPORT_KEY
, *PREPORT_KEY
;
678 #define ReadDvdStruc_Fmt_PhInfo 0x00
679 #define ReadDvdStruc_Fmt_Copyright_LeadIn 0x01
680 #define ReadDvdStruc_Fmt_DiscKey 0x02
681 #define ReadDvdStruc_Fmt_BurstCuttingArea 0x03
682 #define ReadDvdStruc_Fmt_Manufacturer_LeadIn 0x04
683 #define ReadDvdStruc_Fmt_Copyright_Sector 0x05
684 #define ReadDvdStruc_Fmt_MediaId_BusKey 0x06
685 #define ReadDvdStruc_Fmt_MediaKeyBlock_BusKey 0x07
686 #define ReadDvdStruc_Fmt_DDS_RAM 0x08
687 #define ReadDvdStruc_Fmt_MediumStatus_RAM 0x09
688 #define ReadDvdStruc_Fmt_SpareArea_RAM 0x0a
690 #define ReadDvdStruc_Fmt_LastRMD 0x0c
691 #define ReadDvdStruc_Fmt_RMD 0x0d
692 #define ReadDvdStruc_Fmt_PreRec_LeadIn 0x0e
693 #define ReadDvdStruc_Fmt_MediaId_R_RW 0x0f
694 #define ReadDvdStruc_Fmt_PhFmtInfo_R_RW 0x10
696 #define ReadDvdStruc_Fmt_DCB 0x30 //Disc Control Block
697 #define ReadDvdStruc_Fmt_MTA_ECC_pMRW 0x31
699 #define ReadDvdStruc_Fmt_WriteProtection 0xc0
700 #define ReadDvdStruc_Fmt_ReadSend_DvdStruc_cap 0xff
702 struct _READ_DVD_STRUCTURE
{
703 UCHAR OperationCode
; // 0xAD
704 UCHAR MediaType
: 4; // =1 For BlueRay (BD)
706 UCHAR RMDBlockNumber
[4];
709 UCHAR AllocationLength
[2]; // [0]=MSB, [1]=LSB
713 } READ_DVD_STRUCTURE
, *PREAD_DVD_STRUCTURE
;
715 struct _READ_BUFFER_CAPACITY
{
718 UCHAR AllocationLength
[2];
720 } READ_BUFFER_CAPACITY
, *PREAD_BUFFER_CAPACITY
;
722 struct _GET_CONFIGURATION
{
731 UCHAR StartFeatureNum
[2];
733 UCHAR AllocationLength
[2];
735 } GET_CONFIGURATION
, *PGET_CONFIGURATION
;
737 struct _SET_READ_AHEAD
{
741 UCHAR ReadAheadLBA
[4];
744 } SET_READ_AHEAD
, *PSET_READ_AHEAD
;
746 #define SendOpc_DoOpc 0x01
748 struct _SEND_OPC_INFO
{
761 UCHAR Exclude0
: 1; // exclude layer 0
762 UCHAR Exclude1
: 1; // exclude layer 0
767 UCHAR AllocationLength
[2];
769 } SEND_OPC_INFO
, *PSEND_OPC_INFO
;
771 struct _SEND_CUE_SHEET
{
774 UCHAR AllocationLength
[3];
776 } SEND_CUE_SHEET
, *PSEND_CUE_SHEET
;
783 struct _CDB12READWRITE
{
796 UCHAR NumOfBlocks
[4];
802 } CDB12READWRITE
, *PCDB12READWRITE
;
804 // Plextor Read CD-DA
805 struct _PLXTR_READ_CDDA
{
810 UCHAR TransferBlock
[4];
813 } PLXTR_READ_CDDA
, *PPLXTR_READ_CDDA
;
816 struct _NEC_READ_CDDA
{
821 UCHAR TransferBlock
[2];
823 } NEC_READ_CDDA
, *PNEC_READ_CDDA
;
827 // Command Descriptor Block constants.
829 #define CDB6GENERIC_LENGTH 6
830 #define CDB10GENERIC_LENGTH 10
831 #define CDB12GENERIC_LENGTH 12
833 #define MAXIMUM_NUMBER_OF_TRACKS 100
834 #define MAXIMUM_NUMBER_OF_SESSIONS 1024 //maximal number of entries in Read Full TOC
839 // Mode Sense/Select page constants.
841 #define MODE_PAGE_ERROR_RECOVERY 0x01
842 #define MODE_PAGE_MRW2 0x03 // fuck, standard commitee claimed new standard
843 #define MODE_PAGE_WRITE_PARAMS 0x05
844 #define MODE_PAGE_VERIFY_ERROR 0x07 // shall not be used
845 #define MODE_PAGE_CACHING 0x08 // undocumented, but used by DirectCd
846 #define MODE_PAGE_MEDIUM_TYPES 0x0B // shall not be used
847 #define MODE_PAGE_CD_DEVICE_PARAMS 0x0D
848 #define MODE_PAGE_CD_AUDIO_CONTROL 0x0E
849 #define MODE_PAGE_POWER_CONDITION 0x1A
850 #define MODE_PAGE_FAIL_REPORT 0x1C
851 #define MODE_PAGE_TIMEOUT_AND_PROTECT 0x1D
852 #define MODE_PAGE_PHILIPS_SECTOR_TYPE 0x21
853 #define MODE_PAGE_CAPABILITIES 0x2A
854 #define MODE_PAGE_MRW 0x2C
856 #define MODE_SENSE_RETURN_ALL 0x3f
858 #define MODE_SENSE_CURRENT_VALUES 0x00
859 #define MODE_SENSE_CHANGEABLE_VALUES 0x40
860 #define MODE_SENSE_DEFAULT_VAULES 0x80
861 #define MODE_SENSE_SAVED_VALUES 0xc0
863 // SCSI CDB operation codes
865 #define SCSIOP_TEST_UNIT_READY 0x00
866 #define SCSIOP_REZERO_UNIT 0x01
867 #define SCSIOP_REWIND 0x01
868 #define SCSIOP_REQUEST_BLOCK_ADDR 0x02
869 #define SCSIOP_REQUEST_SENSE 0x03
870 #define SCSIOP_FORMAT_UNIT 0x04
871 #define SCSIOP_READ_BLOCK_LIMITS 0x05
872 #define SCSIOP_REASSIGN_BLOCKS 0x07
873 #define SCSIOP_READ6 0x08
874 #define SCSIOP_RECEIVE 0x08
875 #define SCSIOP_WRITE6 0x0A
876 #define SCSIOP_PRINT 0x0A
877 #define SCSIOP_SEND 0x0A
878 #define SCSIOP_SEEK6 0x0B
879 #define SCSIOP_TRACK_SELECT 0x0B
880 #define SCSIOP_SLEW_PRINT 0x0B
881 #define SCSIOP_SEEK_BLOCK 0x0C
882 #define SCSIOP_PARTITION 0x0D
883 #define SCSIOP_READ_REVERSE 0x0F
884 #define SCSIOP_WRITE_FILEMARKS 0x10
885 #define SCSIOP_FLUSH_BUFFER 0x10
886 #define SCSIOP_SPACE 0x11
887 #define SCSIOP_INQUIRY 0x12
888 #define SCSIOP_VERIFY6 0x13
889 #define SCSIOP_RECOVER_BUF_DATA 0x14
890 #define SCSIOP_MODE_SELECT 0x15
891 #define SCSIOP_RESERVE_UNIT 0x16
892 #define SCSIOP_RELEASE_UNIT 0x17
893 #define SCSIOP_COPY 0x18
894 #define SCSIOP_ERASE 0x19
895 #define SCSIOP_MODE_SENSE 0x1A
896 #define SCSIOP_START_STOP_UNIT 0x1B
897 #define SCSIOP_STOP_PRINT 0x1B
898 #define SCSIOP_LOAD_UNLOAD 0x1B
899 #define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C
900 #define SCSIOP_SEND_DIAGNOSTIC 0x1D
901 #define SCSIOP_MEDIUM_REMOVAL 0x1E
902 #define SCSIOP_READ_FORMAT_CAPACITY 0x23
903 #define SCSIOP_READ_CAPACITY 0x25
904 #define SCSIOP_READ 0x28
905 #define SCSIOP_WRITE 0x2A
906 #define SCSIOP_WRITE_CD 0x2A
907 #define SCSIOP_SEEK 0x2B
908 #define SCSIOP_LOCATE 0x2B
909 #define SCSIOP_ERASE10 0x2C
910 #define SCSIOP_WRITE_VERIFY 0x2E
911 #define SCSIOP_VERIFY 0x2F
912 #define SCSIOP_SEARCH_DATA_HIGH 0x30
913 #define SCSIOP_SEARCH_DATA_EQUAL 0x31
914 #define SCSIOP_SEARCH_DATA_LOW 0x32
915 #define SCSIOP_SET_LIMITS 0x33
916 #define SCSIOP_READ_POSITION 0x34
917 #define SCSIOP_SYNCHRONIZE_CACHE 0x35
918 #define SCSIOP_COMPARE 0x39
919 #define SCSIOP_COPY_COMPARE 0x3A
920 #define SCSIOP_COPY_VERIFY 0x3A
921 #define SCSIOP_WRITE_DATA_BUFF 0x3B
922 #define SCSIOP_READ_DATA_BUFF 0x3C
923 #define SCSIOP_CHANGE_DEFINITION 0x40
924 #define SCSIOP_PLAY_AUDIO10 0x41
925 #define SCSIOP_READ_SUB_CHANNEL 0x42
926 #define SCSIOP_READ_TOC 0x43
927 #define SCSIOP_READ_HEADER 0x44
928 #define SCSIOP_PLAY_AUDIO 0x45
929 #define SCSIOP_GET_CONFIGURATION 0x46
930 #define SCSIOP_PLAY_AUDIO_MSF 0x47
931 #define SCSIOP_PLAY_TRACK_INDEX 0x48
932 #define SCSIOP_PLAY_TRACK_RELATIVE 0x49
933 #define SCSIOP_GET_EVENT_STATUS 0x4A
934 #define SCSIOP_PAUSE_RESUME 0x4B
935 #define SCSIOP_LOG_SELECT 0x4C
936 #define SCSIOP_LOG_SENSE 0x4D
937 #define SCSIOP_STOP_PLAY_SCAN 0x4E
938 #define SCSIOP_READ_DISC_INFO 0x51
939 #define SCSIOP_READ_TRACK_INFO 0x52
940 #define SCSIOP_RESERVE_TRACK 0x53
941 #define SCSIOP_SEND_OPC_INFO 0x54
942 #define SCSIOP_MODE_SELECT10 0x55
943 #define SCSIOP_REPAIR_TRACK 0x58 // obsolete
944 #define SCSIOP_READ_MASTER_CUE 0x59
945 #define SCSIOP_MODE_SENSE10 0x5A
946 #define SCSIOP_CLOSE_TRACK_SESSION 0x5B
947 #define SCSIOP_READ_BUFFER_CAPACITY 0x5C
948 #define SCSIOP_SEND_CUE_SHEET 0x5D
949 #define SCSIOP_BLANK 0xA1
950 #define SCSIOP_SEND_KEY 0xA3
951 #define SCSIOP_REPORT_KEY 0xA4
952 #define SCSIOP_PLAY_AUDIO12 0xA5
953 #define SCSIOP_LOAD_UNLOAD_SLOT 0xA6
954 #define SCSIOP_SET_READ_AHEAD 0xA7
955 #define SCSIOP_READ12 0xA8
956 #define SCSIOP_WRITE12 0xAA
957 #define SCSIOP_SEEK12 0xAB
958 #define SCSIOP_GET_PERFORMANCE 0xAC
959 #define SCSIOP_READ_DVD_STRUCTURE 0xAD
960 #define SCSIOP_WRITE_VERIFY12 0xAE
961 #define SCSIOP_VERIFY12 0xAF
962 #define SCSIOP_SET_STREAMING 0xB6
963 #define SCSIOP_READ_CD_MSF 0xB9
964 #define SCSIOP_SET_CD_SPEED 0xBB
965 #define SCSIOP_MECHANISM_STATUS 0xBD
966 #define SCSIOP_READ_CD 0xBE
967 #define SCSIOP_SEND_DISK_STRUCTURE 0xBF
968 #define SCSIOP_SEND_DVD_STRUCTURE 0xBF // see sub-command field
969 #define SCSIOP_SEND_BD_STRUCTURE 0xBF // see sub-command field
970 #define SCSIOP_DOORLOCK 0xDE // lock door on removable drives
971 #define SCSIOP_DOORUNLOCK 0xDF // unlock door on removable drives
973 // If the IMMED bit is 1, status is returned as soon
974 // as the operation is initiated. If the IMMED bit
975 // is 0, status is not returned until the operation
978 #define CDB_RETURN_ON_COMPLETION 0
979 #define CDB_RETURN_IMMEDIATE 1
983 // CDB Force media access used in extended read and write commands.
985 #define CDB_FORCE_MEDIA_ACCESS 0x08
987 // Denon CD ROM operation codes
989 #define SCSIOP_DENON_EJECT_DISC 0xE6
990 #define SCSIOP_DENON_STOP_AUDIO 0xE7
991 #define SCSIOP_DENON_PLAY_AUDIO 0xE8
992 #define SCSIOP_DENON_READ_TOC 0xE9
993 #define SCSIOP_DENON_READ_SUBCODE 0xEB
995 // Philips/Matshushita CD-R(W) operation codes
997 #define SCSIOP_PHILIPS_GET_NWA 0xE2
998 #define SCSIOP_PHILIPS_RESERVE_TRACK 0xE4
999 #define SCSIOP_PHILIPS_WRITE_TRACK 0xE6
1000 #define SCSIOP_PHILIPS_LOAD_UNLOAD 0xE7
1001 #define SCSIOP_PHILIPS_CLOSE_TRACK_SESSION 0xE9
1002 #define SCSIOP_PHILIPS_RECOVER_BUF_DATA 0xEC
1003 #define SCSIOP_PHILIPS_READ_SESSION_INFO 0xEE
1005 // Plextor operation codes
1007 #define SCSIOP_PLEXTOR_READ_CDDA 0xD8
1009 // NEC operation codes
1011 #define SCSIOP_NEC_READ_CDDA 0xD4
1013 // SCSI Bus Messages
1015 #define SCSIMESS_ABORT 0x06
1016 #define SCSIMESS_ABORT_WITH_TAG 0x0D
1017 #define SCSIMESS_BUS_DEVICE_RESET 0X0C
1018 #define SCSIMESS_CLEAR_QUEUE 0X0E
1019 #define SCSIMESS_COMMAND_COMPLETE 0X00
1020 #define SCSIMESS_DISCONNECT 0X04
1021 #define SCSIMESS_EXTENDED_MESSAGE 0X01
1022 #define SCSIMESS_IDENTIFY 0X80
1023 #define SCSIMESS_IDENTIFY_WITH_DISCON 0XC0
1024 #define SCSIMESS_IGNORE_WIDE_RESIDUE 0X23
1025 #define SCSIMESS_INITIATE_RECOVERY 0X0F
1026 #define SCSIMESS_INIT_DETECTED_ERROR 0X05
1027 #define SCSIMESS_LINK_CMD_COMP 0X0A
1028 #define SCSIMESS_LINK_CMD_COMP_W_FLAG 0X0B
1029 #define SCSIMESS_MESS_PARITY_ERROR 0X09
1030 #define SCSIMESS_MESSAGE_REJECT 0X07
1031 #define SCSIMESS_NO_OPERATION 0X08
1032 #define SCSIMESS_HEAD_OF_QUEUE_TAG 0X21
1033 #define SCSIMESS_ORDERED_QUEUE_TAG 0X22
1034 #define SCSIMESS_SIMPLE_QUEUE_TAG 0X20
1035 #define SCSIMESS_RELEASE_RECOVERY 0X10
1036 #define SCSIMESS_RESTORE_POINTERS 0X03
1037 #define SCSIMESS_SAVE_DATA_POINTER 0X02
1038 #define SCSIMESS_TERMINATE_IO_PROCESS 0X11
1040 // SCSI Extended Message operation codes
1042 #define SCSIMESS_MODIFY_DATA_POINTER 0X00
1043 #define SCSIMESS_SYNCHRONOUS_DATA_REQ 0X01
1044 #define SCSIMESS_WIDE_DATA_REQUEST 0X03
1046 // SCSI Extended Message Lengths
1048 #define SCSIMESS_MODIFY_DATA_LENGTH 5
1049 #define SCSIMESS_SYNCH_DATA_LENGTH 3
1050 #define SCSIMESS_WIDE_DATA_LENGTH 2
1052 // SCSI extended message structure
1054 typedef struct _SCSI_EXTENDED_MESSAGE
{
1055 UCHAR InitialMessageCode
;
1056 UCHAR MessageLength
;
1058 union _EXTENDED_ARGUMENTS
{
1065 UCHAR TransferPeriod
;
1073 }SCSI_EXTENDED_MESSAGE
, *PSCSI_EXTENDED_MESSAGE
;
1075 // SCSI bus status codes.
1077 #define SCSISTAT_GOOD 0x00
1078 #define SCSISTAT_CHECK_CONDITION 0x02
1079 #define SCSISTAT_CONDITION_MET 0x04
1080 #define SCSISTAT_BUSY 0x08
1081 #define SCSISTAT_INTERMEDIATE 0x10
1082 #define SCSISTAT_INTERMEDIATE_COND_MET 0x14
1083 #define SCSISTAT_RESERVATION_CONFLICT 0x18
1084 #define SCSISTAT_COMMAND_TERMINATED 0x22
1085 #define SCSISTAT_QUEUE_FULL 0x28
1087 // Enable Vital Product Data Flag (EVPD)
1088 // used with INQUIRY command.
1090 #define CDB_INQUIRY_EVPD 0x01
1092 // retry time (in deci-seconds)
1093 #define NOT_READY_RETRY_INTERVAL 20
1095 // Defines for format CDB
1096 #define LUN0_FORMAT_SAVING_DEFECT_LIST 0
1097 #define USE_DEFAULTMSB 0
1098 #define USE_DEFAULTLSB 0
1100 #define START_UNIT_CODE 0x01
1101 #define STOP_UNIT_CODE 0x00
1103 // Inquiry buffer structure. This is the data returned from the target
1104 // after it receives an inquiry.
1106 // This structure may be extended by the number of bytes specified
1107 // in the field AdditionalLength. The defined size constant only
1108 // includes fields through ProductRevisionLevel.
1110 // The NT SCSI drivers are only interested in the first 36 bytes of data.
1112 #define INQUIRYDATABUFFERSIZE 36
1114 typedef struct _INQUIRYDATA
{
1115 UCHAR DeviceType
: 5;
1116 UCHAR DeviceTypeQualifier
: 3;
1117 UCHAR DeviceTypeModifier
: 7;
1118 UCHAR RemovableMedia
: 1;
1120 UCHAR ResponseDataFormat
;
1121 UCHAR AdditionalLength
;
1123 UCHAR SoftReset
: 1;
1124 UCHAR CommandQueue
: 1;
1125 UCHAR Reserved2
: 1;
1126 UCHAR LinkedCommands
: 1;
1127 UCHAR Synchronous
: 1;
1128 UCHAR Wide16Bit
: 1;
1129 UCHAR Wide32Bit
: 1;
1130 UCHAR RelativeAddressing
: 1;
1132 UCHAR ProductId
[16];
1133 UCHAR ProductRevisionLevel
[4];
1134 UCHAR VendorSpecific
[20];
1135 UCHAR Reserved3
[40];
1136 } INQUIRYDATA
, *PINQUIRYDATA
;
1138 // Inquiry defines. Used to interpret data returned from target as result
1139 // of inquiry command.
1143 #define DIRECT_ACCESS_DEVICE 0x00 // disks
1144 #define SEQUENTIAL_ACCESS_DEVICE 0x01 // tapes
1145 #define PRINTER_DEVICE 0x02 // printers
1146 #define PROCESSOR_DEVICE 0x03 // scanners, printers, etc
1147 #define WRITE_ONCE_READ_MULTIPLE_DEVICE 0x04 // worms
1148 #define READ_ONLY_DIRECT_ACCESS_DEVICE 0x05 // cdroms
1149 #define SCANNER_DEVICE 0x06 // scanners
1150 #define OPTICAL_DEVICE 0x07 // optical disks
1151 #define MEDIUM_CHANGER 0x08 // jukebox
1152 #define COMMUNICATION_DEVICE 0x09 // network
1153 #define LOGICAL_UNIT_NOT_PRESENT_DEVICE 0x7F
1154 #define DEVICE_QUALIFIER_NOT_SUPPORTED 0x03
1156 // DeviceTypeQualifier field
1158 #define DEVICE_CONNECTED 0x00
1160 // Sense Data Format
1162 typedef struct _SENSE_DATA
{
1165 UCHAR SegmentNumber
;
1168 UCHAR IncorrectLength
:1;
1171 UCHAR Information
[4];
1172 UCHAR AdditionalSenseLength
;
1173 UCHAR CommandSpecificInformation
[4];
1174 UCHAR AdditionalSenseCode
;
1175 UCHAR AdditionalSenseCodeQualifier
;
1176 UCHAR FieldReplaceableUnitCode
;
1177 UCHAR SenseKeySpecific
[3];
1178 } SENSE_DATA
, *PSENSE_DATA
;
1180 // Default request sense buffer size
1182 #define SENSE_BUFFER_SIZE (sizeof(SENSE_DATA))
1186 #define SCSI_SENSE_NO_SENSE 0x00
1187 #define SCSI_SENSE_RECOVERED_ERROR 0x01
1188 #define SCSI_SENSE_NOT_READY 0x02
1189 #define SCSI_SENSE_MEDIUM_ERROR 0x03
1190 #define SCSI_SENSE_HARDWARE_ERROR 0x04
1191 #define SCSI_SENSE_ILLEGAL_REQUEST 0x05
1192 #define SCSI_SENSE_UNIT_ATTENTION 0x06
1193 #define SCSI_SENSE_DATA_PROTECT 0x07
1194 #define SCSI_SENSE_BLANK_CHECK 0x08
1195 #define SCSI_SENSE_UNIQUE 0x09
1196 #define SCSI_SENSE_COPY_ABORTED 0x0A
1197 #define SCSI_SENSE_ABORTED_COMMAND 0x0B
1198 #define SCSI_SENSE_EQUAL 0x0C
1199 #define SCSI_SENSE_VOL_OVERFLOW 0x0D
1200 #define SCSI_SENSE_MISCOMPARE 0x0E
1201 #define SCSI_SENSE_RESERVED 0x0F
1203 // Additional Sense codes
1206 #define SCSI_ADSENSE_NO_SENSE 0x00
1209 #define SCSI_ADSENSE_WARNING 0x0B
1210 #define SCSI_ADSENSE_REC_DATA_NOECC 0x17
1211 #define SCSI_ADSENSE_REC_DATA_ECC 0x18
1212 #define SCSI_ADSENSE_ROUNDED_PARAM 0x37
1213 #define SCSI_ADSENSE_FAILURE_PREDICTED 0x5D
1214 #define SCSI_ADSENSE_CD_CONTROL_ERR 0x73
1217 #define SCSI_ADSENSE_LUN_NOT_READY 0x04
1218 #define SCSI_ADSENSE_INCOMPATIBLE_MEDIA 0x30
1219 #define SCSI_ADSENSE_INVALID_MEDIA SCSI_ADSENSE_INCOMPATIBLE_MEDIA // for w2k
1220 #define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE 0x3A
1221 #define SCSI_ADSENSE_POSITION_ERROR 0x3B
1222 #define SCSI_ADSENSE_NOT_SELF_CONFIGURED 0x3E
1226 #define SCSI_ADSENSE_NO_SEEK 0x02
1227 #define SCSI_ADSENSE_NO_REFERENCE 0x06
1228 #define SCSI_ADSENSE_CD_WRITE_ERROR 0x0C
1229 #define SCSI_ADSENSE_CD_READ_ERROR 0x11
1230 #define SCSI_ADSENSE_TRACK_ERROR 0x14
1231 #define SCSI_ADSENSE_SEEK_ERROR 0x15
1232 #define SCSI_ADSENSE_FORMAT_CORRUPTED 0x31
1233 #define SCSI_ADSENSE_ENCLOSURE_FAILURE 0x34
1234 #define SCSI_ADSENSE_ENCLOSURE_SERVICE 0x35
1235 #define SCSI_ADSENSE_ERASE_ERROR 0x51
1236 #define SCSI_ADSENSE_UNRECOVERED_TOC 0x57
1237 #define SCSI_ADSENSE_SESSION_FIXATION 0x71
1238 //#define SCSI_ADSENSE_CD_CONTROL_ERR 0x73 // redefinition
1241 #define SCSI_ADSENSE_CLEAN_REQUEST 0x00
1242 #define SCSI_ADSENSE_SELECT 0x04
1243 #define SCSI_ADSENSE_COMMUNICATION 0x08
1244 #define SCSI_ADSENSE_LOST_STREAMING 0x09
1245 #define SCSI_ADSENSE_SYNC_ERROR 0x1B
1246 #define SCSI_ADSENSE_MECH_ERROR 0x3B
1247 #define SCSI_ADSENSE_LUN_ERROR 0x3E
1248 #define SCSI_ADSENSE_DIAGNOSTIC 0x40
1249 #define SCSI_ADSENSE_INTERNAL 0x44
1250 #define SCSI_ADSENSE_SOFT_RESET 0x46
1251 #define SCSI_ADSENSE_SCSI_PARITY 0x47
1252 #define SCSI_ADSENSE_CMD_PHASE 0x4A
1253 #define SCSI_ADSENSE_DATA_PHASE 0x4B
1254 #define SCSI_ADSENSE_SELF_CONFIG 0x4C
1255 #define SCSI_ADSENSE_MEDIUM_REMOVAL 0x53
1256 #define SCSI_ADSENSE_VOLTAGE 0x65
1259 #define SCSI_ADSENSE_AUDIO_PLAY 0x00
1260 #define SCSI_ADSENSE_MULTISELECT 0x07
1261 #define SCSI_ADSENSE_INVALID_PARAM_LENGTH 0x1A
1262 #define SCSI_ADSENSE_ILLEGAL_COMMAND 0x20
1263 #define SCSI_ADSENSE_ILLEGAL_BLOCK 0x21
1264 #define SCSI_ADSENSE_INVALID_CDB 0x24
1265 #define SCSI_ADSENSE_INVALID_LUN 0x25
1266 #define SCSI_ADSENSE_INVALID_VALUE 0x26
1267 #define SCSI_ADSENSE_WRITE_PROTECT 0x27
1268 #define SCSI_ADSENSE_CANT_DISCONNECT 0x2B
1269 #define SCSI_ADSENSE_INVALID_CMD_SEQUENCE 0x2C
1270 #define SCSI_ADSENSE_INVALID_SESSION_MODE 0x30
1271 #define SCSI_ADSENSE_SAVE_NOT_SUPPORTED 0x35
1272 #define SCSI_ADSENSE_INVALID_BITS_IN_IDENT_MSG 0x3D
1273 #define SCSI_ADSENSE_MSG_ERROR 0x43
1274 //#define SCSI_ADSENSE_MEDIUM_REMOVAL 0x53 // redefinition
1275 #define SCSI_ADSENSE_SYS_RESOURCE_FAILURE 0x55
1276 #define SCSI_ADSENSE_OUT_OF_SPACE 0x63
1277 #define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK 0x64
1278 #define SCSI_ADSENSE_CD_COPY_ERROR 0x6F
1279 #define SCSI_ADSENSE_INCOMPLETE_DATA 0x72
1280 #define SCSI_ADSENSE_VENDOR_UNIQUE 0x80
1281 #define SCSI_ADSENSE_MUSIC_AREA 0xA0
1282 #define SCSI_ADSENSE_DATA_AREA 0xA1
1283 #define SCSI_ADSENSE_VOLUME_OVERFLOW 0xA7
1286 #define SCSI_ADSENSE_LOG_OVERFLOW 0x0A
1287 #define SCSI_ADSENSE_MEDIUM_CHANGED 0x28
1288 #define SCSI_ADSENSE_BUS_RESET 0x29
1289 #define SCSI_ADSENSE_PARAM_CHANGE 0x2A
1290 #define SCSI_ADSENSE_CMD_CLEARED_BY_ANOTHER 0x2F
1291 #define SCSI_ADSENSE_MEDIA_STATE 0x3B
1292 #define SCSI_ADSENSE_FUNCTIONALTY_CHANGE 0x3F
1293 #define SCSI_ADSENSE_OPERATOR 0x5A
1294 #define SCSI_ADSENSE_MAX_LOG 0x5B
1295 #define SCSI_ADSENSE_POWER 0x5E
1298 #define SCSI_ADSENSE_READ_LOST_STREAMING 0x11
1299 #define SCSI_ADSENSE_RESELECT_FAILURE 0x45
1300 #define SCSI_ADSENSE_ERR_MSG_DETECTED 0x48
1301 #define SCSI_ADSENSE_INVALID_ERR_MSG 0x49
1302 #define SCSI_ADSENSE_TEGGED_OVERLAPPED 0x4D
1303 #define SCSI_ADSENSE_OVERLAPPED_ATTEMPT 0x4E
1305 // Additional sense code qualifier
1307 #define SCSI_SENSEQ_NO_SENSE 0x00
1310 //#define SCSI_SENSEQ_NO_SENSE 0x00
1311 #define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE 0x00
1312 #define SCSI_SENSEQ_BECOMING_READY 0x01
1313 #define SCSI_SENSEQ_INIT_COMMAND_REQUIRED 0x02
1314 #define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED 0x03
1315 #define SCSI_SENSEQ_FORMAT_IN_PROGRESS 0x04
1316 #define SCSI_SENSEQ_OPERATION_IN_PROGRESS 0x07
1317 #define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS 0x08
1320 #define SCSI_SENSEQ_INCOMPATIBLE_MEDIA_INSTALLED 0x00
1321 #define SCSI_SENSEQ_UNKNOWN_FORMAT 0x01
1322 #define SCSI_SENSEQ_INCOMPATIBLE_FORMAT 0x02
1323 #define SCSI_SENSEQ_CLEANING_CARTRIDGE_INSTALLED 0x03
1324 #define SCSI_SENSEQ_WRITE_UNKNOWN_FORMAT 0x04
1325 #define SCSI_SENSEQ_WRITE_INCOMPATIBLE_FORMAT 0x05
1326 #define SCSI_SENSEQ_FORMAT_INCOMPATIBLE_MEDIUM 0x06
1327 #define SCSI_SENSEQ_CLEANING_FAILURE 0x07
1330 #define SCSI_SENSEQ_TRAY_CLOSED 0x01
1331 #define SCSI_SENSEQ_TRAY_OPEN 0x02
1334 #define SENSEQ_W_RECOVERY_NEEDED 0x07
1335 #define SENSEQ_W_RECOVERY_FAILED 0x08
1336 #define SENSEQ_LOST_STREAMING 0x09
1337 #define SENSEQ_PADDING_BLOCKS_ADDED 0x0A
1339 // SK:ASC = 03:72, 05:72
1340 //#define SCSI_SENSEQ_NO_SENSE 0x00
1341 #define SCSI_SENSEQ_LEAD_IN_ERROR 0x01
1342 #define SCSI_SENSEQ_LEAD_OUT_ERRROR 0x02
1343 #define SCSI_SENSEQ_INCOMPLETE_TRACK 0x03
1344 #define SCSI_SENSEQ_INCOMPLETE_RESERVED_TRACK 0x04
1345 #define SCSI_SENSEQ_NO_MORE_RESERVATION 0x05
1348 #define SCSI_SENSEQ_LUN_FAILURE 0x01
1349 #define SCSI_SENSEQ_LUN_TIMEOUT 0x02
1352 #define SCSI_SENSEQ_ADDR_OUT_OF_RANGE 0x00
1353 #define SCSI_SENSEQ_INVALID_ELEMENT_ADDR 0x01
1354 #define SCSI_SENSEQ_INVALID_WRITE_ADDR 0x02
1355 #define SCSI_SENSEQ_INVALID_WRITE_CROSS_LAYER_JUMP 0x03
1358 #define SCSI_SENSEQ_PARAM_NOT_SUPPORTED 0x01
1359 #define SCSI_SENSEQ_PARAM_INVALID_VALUE 0x02
1360 #define SCSI_SENSEQ_THRESHOLD_PARAM_NOT_SUPPORTED 0x03
1361 #define SCSI_SENSEQ_INVALID_RELEASE_OF_PERSISTENT_RESERVATION 0x04
1364 #define SCSI_SENSEQ_HW_PROTECTION 0x01
1365 #define SCSI_SENSEQ_LUN_SOFT_PROTECTION 0x02
1366 #define SCSI_SENSEQ_ASSOCIATED_PROTECTION 0x03
1367 #define SCSI_SENSEQ_PERSIST_PROTECTION 0x04
1368 #define SCSI_SENSEQ_PERMANENT_PROTECTION 0x05
1371 #define SCSI_SENSEQ_PROGRAMM_AREA_NOT_EMPTY 0x03
1372 #define SCSI_SENSEQ_PROGRAMM_AREA_EMPTY 0x04
1375 //#define SCSI_SENSEQ_INCOMPATIBLE_MEDIA_INSTALLED 0x00
1376 //#define SCSI_SENSEQ_UNKNOWN_FORMAT 0x01
1377 //#define SCSI_SENSEQ_INCOMPATIBLE_FORMAT 0x02
1378 //#define SCSI_SENSEQ_CLEANING_CARTRIDGE_INSTALLED 0x03
1379 //#define SCSI_SENSEQ_WRITE_UNKNOWN_FORMAT 0x04
1380 //#define SCSI_SENSEQ_WRITE_INCOMPATIBLE_FORMAT 0x05
1381 //#define SCSI_SENSEQ_FORMAT_INCOMPATIBLE_MEDIUM 0x06
1382 //#define SCSI_SENSEQ_CLEANING_FAILURE 0x07
1383 #define SCSI_SENSEQ_APP_CODE_MISSMATCH 0x08
1384 #define SCSI_SENSEQ_NOT_FIXED_FOR_APPEND 0x09
1385 #define SCSI_SENSEQ_NOT_FORMATTED 0x10
1386 #define SCSI_SENSEQ_UNSUPPORTED_MEDIA_VERSION 0x11
1389 #define SCSI_SENSEQ_AUTHENTICATION_FAILURE 0x00
1390 #define SCSI_SENSEQ_KEY_NOT_PRESENT 0x01
1391 #define SCSI_SENSEQ_KEY_NOT_ESTABLISHED 0x02
1392 #define SCSI_SENSEQ_READ_OF_SCRAMBLED_SECTOR_WITHOUT_AUTHENTICATION 0x03
1393 #define SCSI_SENSEQ_MEDIA_CODE_MISMATCHED_TO_LOGICAL_UNIT 0x04
1394 #define SCSI_SENSEQ_LOGICAL_UNIT_RESET_COUNT_ERROR 0x05
1397 #define SCSI_SENSEQ_IMPORT_OR_EXPERT_ELEMENT_ACCESS 0x01
1400 #define SCSI_SENSEQ_POWER_ON 0x01
1401 #define SCSI_SENSEQ_SCSI_BUS 0x02
1402 #define SCSI_SENSEQ_BUS_DEVICE_FUNCTION 0x03
1403 #define SCSI_SENSEQ_DEVICE_INTERNAL 0x04
1406 #define SCSI_SENSEQ_MODE_PARAMETERS 0x01
1407 #define SCSI_SENSEQ_LOG_PARAMETERS 0x02
1408 #define SCSI_SENSEQ_RESERVATIONS_PREEMPTED 0x03
1411 #define SCSI_SENSEQ_DESTINATION_ELEMENT_FULL 0x0D
1412 #define SCSI_SENSEQ_SOURCE_ELEMENT_EMPTY 0x0E
1413 #define SCSI_SENSEQ_END_OF_MEDIUM 0x0F
1414 #define SCSI_SENSEQ_MAGAZINE_NOT_ACCESSIBLE 0x11
1415 #define SCSI_SENSEQ_MAGAZINE_REMOVED 0x12
1416 #define SCSI_SENSEQ_MAGAZINE_INSERTED 0x13
1417 #define SCSI_SENSEQ_MAGAZINE_LOCKED 0x14
1418 #define SCSI_SENSEQ_MAGAZINE_UNLOCKED 0x15
1421 #define SCSI_SENSEQ_MICROCODE 0x01
1422 #define SCSI_SENSEQ_OPERATION_DEFINITION 0x02
1423 #define SCSI_SENSEQ_INQUIRY_DATA 0x03
1426 #define SCSI_SENSEQ_MEDIUM_CHANGE_REQ 0x01
1427 #define SCSI_SENSEQ_W_PROTECT_SELECTED 0x02
1428 #define SCSI_SENSEQ_W_PROTECT_PERMITED 0x03
1431 #define SCSI_SENSEQ_LOW_POWER_COND 0x00
1432 #define SCSI_SENSEQ_IDLE_BY_TIMER 0x01
1433 #define SCSI_SENSEQ_STANDBY_BY_TIMER 0x02
1434 #define SCSI_SENSEQ_IDLE_BY_CMD 0x03
1435 #define SCSI_SENSEQ_STANDBY_BY_CMD 0x04
1437 #define SCSI_SENSEQ_FILEMARK_DETECTED 0x01
1438 #define SCSI_SENSEQ_SETMARK_DETECTED 0x03
1439 #define SCSI_SENSEQ_END_OF_MEDIA_DETECTED 0x02
1440 #define SCSI_SENSEQ_BEGINNING_OF_MEDIA_DETECTED 0x04
1443 #define SCSI_SENSEQ_IO_TERMINATED 0x06
1446 // SCSI IO Device Control Codes
1448 #define FILE_DEVICE_SCSI 0x0000001b
1450 #define IOCTL_SCSI_EXECUTE_IN ((FILE_DEVICE_SCSI << 16) + 0x0011)
1451 #define IOCTL_SCSI_EXECUTE_OUT ((FILE_DEVICE_SCSI << 16) + 0x0012)
1452 #define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013)
1454 // SMART support in atapi
1456 #define IOCTL_SCSI_MINIPORT_SMART_VERSION ((FILE_DEVICE_SCSI << 16) + 0x0500)
1457 #define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501)
1458 #define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS ((FILE_DEVICE_SCSI << 16) + 0x0502)
1459 #define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS ((FILE_DEVICE_SCSI << 16) + 0x0503)
1460 #define IOCTL_SCSI_MINIPORT_ENABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0504)
1461 #define IOCTL_SCSI_MINIPORT_DISABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0505)
1462 #define IOCTL_SCSI_MINIPORT_RETURN_STATUS ((FILE_DEVICE_SCSI << 16) + 0x0506)
1463 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE ((FILE_DEVICE_SCSI << 16) + 0x0507)
1464 #define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES ((FILE_DEVICE_SCSI << 16) + 0x0508)
1465 #define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS ((FILE_DEVICE_SCSI << 16) + 0x0509)
1467 // Read Capacity Data - returned in Big Endian format
1469 typedef struct _READ_CAPACITY_DATA
{
1470 ULONG LogicalBlockAddress
;
1471 ULONG BytesPerBlock
;
1472 } READ_CAPACITY_DATA
, *PREAD_CAPACITY_DATA
;
1474 typedef struct _CD_SECTOR_HEADER
{
1477 // See WParam_SubHdr_xxx
1480 #define WParam_SubHdr_Mode_Mask 0x03
1481 #define WParam_SubHdr_Mode0 0x00
1482 #define WParam_SubHdr_Mode1 0x01
1483 #define WParam_SubHdr_Mode2 0x02
1484 #define WParam_SubHdr_Format_Mask 0xe0
1485 #define WParam_SubHdr_Format_UserData 0x00
1486 #define WParam_SubHdr_Format_RunIn4 0x20
1487 #define WParam_SubHdr_Format_RunIn3 0x40
1488 #define WParam_SubHdr_Format_RunIn2 0x60
1489 #define WParam_SubHdr_Format_RunIn1 0x80
1490 #define WParam_SubHdr_Format_Link 0xa0
1491 #define WParam_SubHdr_Format_RunOut2 0xc0
1492 #define WParam_SubHdr_Format_RunOut1 0xe0
1502 } CD_SECTOR_HEADER
, *PCD_SECTOR_HEADER
;
1504 // CD ROM Read Table Of Contents (TOC) structures
1505 // Format 0 - Get table of contents
1507 #define TocControl_TrkMode_Mask WParam_TrkMode_Mask
1508 #define TocControl_TrkMode_Audio WParam_TrkMode_Audio
1509 #define TocControl_TrkMode_Audio_PreEmph WParam_TrkMode_Audio_PreEmph
1510 #define TocControl_TrkMode_Data WParam_TrkMode_Data
1511 #define TocControl_TrkMode_IncrData WParam_TrkMode_IncrData
1512 #define TocControl_TrkMode_QAudio_PreEmph WParam_TrkMode_QAudio_PreEmph
1513 #define TocControl_TrkMode_AllowCpy WParam_TrkMode_AllowCpy
1515 typedef struct _TOC_TRACK_INFO
{
1522 } TOC_TRACK_INFO
, *PTOC_TRACK_INFO
;
1524 typedef struct _READ_TOC_HEADER
{
1526 UCHAR First_TrackSes
;
1527 UCHAR Last_TrackSes
;
1528 } READ_TOC_HEADER
, *PREAD_TOC_HEADER
;
1530 #define TOC_LastTrack_ID 0xAA
1532 typedef struct _READ_TOC_TOC
{
1533 READ_TOC_HEADER Tracks
;
1534 TOC_TRACK_INFO TrackData
[MAXIMUM_NUMBER_OF_TRACKS
+1];
1535 } READ_TOC_TOC
, *PREAD_TOC_TOC
;
1537 // Format 1 - Session Info
1539 typedef struct _READ_TOC_SES
{
1540 READ_TOC_HEADER Sessions
;
1541 TOC_TRACK_INFO LastSes_1stTrack
; // First Track Number In Last Complete Session
1542 } READ_TOC_SES
, *PREAD_TOC_SES
;
1544 // Format 2,3 - Full TOC, PMA
1546 #define TOC_CTL_Normal 0x00
1547 //#define TOC_CTL_MRW 0x01
1548 #define TOC_CTL_MRWTrackInfo 0x06
1549 #define TOC_CTL_MRWLastSes 0x07
1552 #define TOC_ADR_TrackInfo 0x01
1553 #define TOC_ADR_Internal 0x05
1557 #define POINT_StartPositionOfTrack_Min 0x01
1558 #define POINT_StartPositionOfTrack_Max 0x63
1559 #define POINT_FirstTrackNum 0xA0
1560 #define POINT_LastTrackNum 0xA1
1561 #define POINT_StartPositionOfLeadOut 0xA2
1563 #define POINT_SkipInterval_Min 0x01
1564 #define POINT_SkipInterval_Max 0x40
1565 #define POINT_StartPositionOfNextProgramArea 0xB0
1566 #define POINT_NumOfSkips 0xB1
1567 #define POINT_SkipTrackAssignmet_Min 0xB2
1568 #define POINT_SkipTrackAssignmet_Max 0xB4
1569 #define POINT_StartPositionOfFirstLeadIn 0xC0
1570 #define POINT_CopyOfAdditionalAreaInATIP 0xC1
1571 // ADR = 6, Control = 1
1572 // POINT 0x01 - 0x63, 0xA0 - 0xA2 are treated like for ADR = 1
1573 // rest - like for ADR = 5
1575 // ADR = 7, Control = 1
1576 // POINT 0x01 - 0x63 are treated as FirstTrackInLastSession
1578 typedef struct _TOC_SES_INFO
{
1595 // ADR = 6, Control = 1
1597 // ADR = 7, Control = 1:
1604 } StartPositionOfTrack
;
1608 // ADR = 6, Control = 1:
1611 #define FullTOC_DiscType_CDDA_or_M1 WParam_SesFmt_CdRom // 0x00
1612 #define FullTOC_DiscType_CDI WParam_SesFmt_CdI // 0x10
1613 #define FullTOC_DiscType_CDXA_M2 WParam_SesFmt_CdRomXa // 0x20
1618 UCHAR FirstTrackNum
;
1636 } StartPositionOfLeadOut
;
1649 // ADR = 6, Control = 1:
1653 UCHAR Program_MSF
[3];
1654 UCHAR NumOfPointers_M5
;
1655 UCHAR MaxLeadOut_MSF
[3];
1656 } StartPositionOfNextProgramArea
;
1669 } SkipTrackAsignment
;
1673 UCHAR OptimumRecordingPower
;
1674 UCHAR SpecInfoATIP
[3];
1675 UCHAR LeadIn_MSF
[3];
1676 } StartPositionOfFirstLeadIn
;
1681 } AdditionalAreaInATIP
;
1684 } TOC_SES_INFO
, *PTOC_SES_INFO
;
1686 typedef struct _READ_TOC_FULL_TOC
{
1687 READ_TOC_HEADER Sessions
;
1688 TOC_SES_INFO SessionData
[MAXIMUM_NUMBER_OF_SESSIONS
];
1689 } READ_TOC_FULL_TOC
, *PREAD_TOC_FULL_TOC
;
1691 typedef READ_TOC_FULL_TOC READ_TOC_PMA
;
1692 typedef PREAD_TOC_FULL_TOC PREAD_TOC_PMA
;
1696 typedef struct _READ_TOC_ATIP
{
1700 #define ATIP_SpeedRef_Mask 0x07
1701 #define ATIP_SpeedRef_2X 0x01
1702 #define ATIP_WritingPower_Mask 0x07
1709 UCHAR WritingPower
: 3;
1714 #define ATIP_URU 0x40
1725 #define ATIP_A1 0x01 // 16-18 are valid
1726 #define ATIP_A2 0x02 // 20-22 are valid
1727 #define ATIP_A3 0x04 // 24-26 are valid
1728 #define ATIP_SubType_Mask 0x38 // shall be set to zero
1729 #define ATIP_Type_Mask 0x40
1730 #define ATIP_Type_CDR 0x00
1731 #define ATIP_Type_CDRW 0x40
1746 UCHAR LeadIn_MSF
[3];
1748 UCHAR LeadOut_MSF
[3];
1751 #define ATIP_MinSpeedCVL_Mask 0x70
1752 #define ATIP_MinSpeedCVL_2X 0x10
1753 #define ATIP_MaxSpeedCVL_Mask 0x0f
1754 #define ATIP_MaxSpeedCVL_2X 0x01
1755 #define ATIP_MaxSpeedCVL_4X 0x02
1756 #define ATIP_MaxSpeedCVL_6X 0x03
1757 #define ATIP_MaxSpeedCVL_8X 0x04
1762 UCHAR MaxSpeedCVL
: 4;
1763 UCHAR MinSpeedCVL
: 3;
1768 #define ATIP_Power_Y_Mask 0x0e
1769 #define ATIP_Power_P_Mask 0x70
1781 #define ATIP_PW_ratio_Mask 0x70
1799 } READ_TOC_ATIP
, *PREAD_TOC_ATIP
;
1801 // Format 5 - CD-TEXT
1803 typedef struct _CD_TEXT_PACK_DATA
{
1805 #define CdText_ID1_Title 0x80 // ID2 = 0 - Album, ID2 = 1-63 - Track
1806 #define CdText_ID1_Performer 0x81
1807 #define CdText_ID1_Songwriter 0x82
1808 #define CdText_ID1_Composer 0x83
1809 #define CdText_ID1_Arranger 0x84
1810 #define CdText_ID1_Message 0x85
1811 #define CdText_ID1_DiscID 0x86
1812 #define CdText_ID1_GenreInfo 0x87
1813 #define CdText_ID1_TOC 0x88
1814 #define CdText_ID1_TOC2 0x89
1815 #define CdText_ID1_Special 0x8D
1816 #define CdText_ID1_UPC_EAN_ISRC 0x8E
1817 #define CdText_ID1_BlockSizeInfo 0x8F
1823 #define CdText_CharPos_Mask 0x0f
1824 #define CdText_BlkNum_Mask 0x70
1831 UCHAR DBCC
: 1; // used to indicate Double Byte text encoding (Unicode ?)
1837 } CD_TEXT_PACK_DATA
, *PCD_TEXT_PACK_DATA
;
1839 typedef struct _READ_TOC_CD_TEXT
{
1842 CD_TEXT_PACK_DATA Chunk0
;
1843 } READ_TOC_CD_TEXT
, *PREAD_TOC_CD_TEXT
;
1847 #define ReadHeader_CdMode_Audio 0x00
1848 #define ReadHeader_CdMode_Mode1 0x01
1849 #define ReadHeader_CdMode_Mode2 0x02
1851 typedef struct _READ_HEADER_LBA
{
1855 } READ_HEADER_LBA
, *PREAD_HEADER_LBA
;
1857 typedef struct _READ_HEADER_MSF
{
1861 } READ_HEADER_MSF
, *PREAD_HEADER_MSF
;
1866 typedef struct _OPC_INFO_BLOCK
{
1869 } OPC_INFO_BLOCK
, *POPC_INFO_BLOCK
;
1871 // Buffer Capacity format
1873 typedef struct _BUFFER_CAPACITY_BLOCK
{
1874 UCHAR DataLength
[2];
1876 UCHAR BufferLength
[4];
1877 UCHAR BlankBufferLength
[4];
1878 } BUFFER_CAPACITY_BLOCK
, *PBUFFER_CAPACITY_BLOCK
;
1880 //#ifndef WITHOUT_FORMATTER
1881 // Format Unit structures
1883 typedef struct _FORMAT_LIST_HEADER
{
1886 #define FormatHeader_VS 0x01
1887 #define FormatHeader_Immed 0x02
1888 #define FormatHeader_DSP 0x04
1889 #define FormatHeader_IP 0x08
1890 #define FormatHeader_STPF 0x10
1891 #define FormatHeader_DCRT 0x20
1892 #define FormatHeader_DPRY 0x40
1893 #define FormatHeader_FOV 0x80
1908 UCHAR FormatDescriptorLength
[2]; // =0x0008
1909 } FORMAT_LIST_HEADER
, *PFORMAT_LIST_HEADER
;
1911 typedef struct _CDRW_FORMAT_DESCRIPTOR
{
1913 #define FormatDesc_Grow 0x40
1914 #define FormatDesc_Ses 0x80
1925 UCHAR FormatSize
[4];
1926 } CDRW_FORMAT_DESCRIPTOR
, *PCDRW_FORMAT_DESCRIPTOR
;
1928 typedef struct _DVD_FORMAT_DESCRIPTOR
{
1930 UCHAR NumOfBlocks
[4];
1932 #define DvdFormatType_Full 0x00
1933 #define DvdFormatType_SpareExpansion 0x01
1934 #define DvdFormatType_ZoneReformat 0x04
1935 #define DvdFormatType_ZoneFormat 0x05
1936 #define DvdFormatType_CD_DVD_RW_Full 0x10
1937 #define DvdFormatType_CD_DVD_RW_GrowSes 0x11
1938 #define DvdFormatType_CD_DVD_RW_AddSes 0x12
1939 #define DvdFormatType_DVD_RW_QuickGrowSes 0x13
1940 #define DvdFormatType_DVD_RW_QuickAddSes 0x14
1941 #define DvdFormatType_DVD_RW_Quick 0x15
1942 #define DvdFormatType_DVD_pRW_Full_3Gb 0x20 // obsolete
1943 #define DvdFormatType_CD_MRW_Full 0x24
1944 #define DvdFormatType_DVD_pRW_basic 0x26
1945 #define DvdFormatType_DDCD_RW_Quick 0x28
1946 #define DvdFormatType_BDRE_Full_Spare 0x30
1947 #define DvdFormatType_BDRE_Full 0x31
1948 #define DvdFormatType_BDR_Full_Spare 0x32
1950 #define DvdFormatSubType_BDRE_QuickReformat 0x00
1951 #define DvdFormatSubType_BDRE_NoCert 0x01
1952 #define DvdFormatSubType_BDRE_FullCert 0x02
1953 #define DvdFormatSubType_BDRE_QuickCert 0x03
1955 #define DvdFormatSubType_BDR_SRMpPOW 0x00
1956 #define DvdFormatSubType_BDR_SRM_POW 0x01
1957 #define DvdFormatSubType_BDR_RRM 0x02
1962 UCHAR FormatSubType
: 2;
1963 UCHAR FormatType
: 6;
1968 #define FormatUnit_MRW_SetNew(desc) { desc->TypeDependent[0] = 0; \
1969 desc->TypeDependent[1] = 0; \
1970 desc->TypeDependent[2] = 0; }
1972 #define FormatUnit_MRW_SetRestart(desc) { desc->TypeDependent[0] = 0; \
1973 desc->TypeDependent[1] = 0; \
1974 desc->TypeDependent[2] = 1; }
1977 UCHAR BlockSize
[3];
1978 UCHAR TypeDependent
[3];
1980 UCHAR Reserved1
[2];
1982 UCHAR QuickStart
: 1; // MMC-5
1983 UCHAR Reserved2
: 6;
1988 } DVD_FORMAT_DESCRIPTOR
, *PDVD_FORMAT_DESCRIPTOR
;
1990 typedef struct _FORMAT_UNIT_PARAMETER_LIST
{
1991 FORMAT_LIST_HEADER Header
;
1994 UCHAR InitPatternDescr
[4];
1995 CDRW_FORMAT_DESCRIPTOR CdFormatDescr
;
1997 DVD_FORMAT_DESCRIPTOR DvdFormatDescr
;
1999 } FORMAT_UNIT_PARAMETER_LIST
, *PFORMAT_UNIT_PARAMETER_LIST
;
2001 // define Read Format Capacities info blocks
2003 typedef struct _CAPACITY_LIST_HEADER
{
2006 } CAPACITY_LIST_HEADER
, *PCAPACITY_LIST_HEADER
;
2008 typedef struct _FORMATTABLE_CAPACITY_DESCRIPTOR
{
2009 UCHAR NumOfBlocks
[4];
2014 #define FormatCapcity_Descr_Reserved 0x00
2015 #define FormatCapcity_Descr_Unformatted 0x01
2016 #define FormatCapcity_Descr_Formatted 0x02
2017 #define FormatCapcity_Descr_NoMedia 0x03
2019 // valid for the 1st descriptor only
2022 // valid for all descriptors except the 1st one
2023 UCHAR FormatType
: 6;
2028 UCHAR BlockSize
[3];
2029 UCHAR TypeDependent
[3];
2031 } FORMATTABLE_CAPACITY_DESCRIPTOR
, *PFORMATTABLE_CAPACITY_DESCRIPTOR
;
2033 typedef struct _FORMAT_CAPACITIES_DATA
{
2034 CAPACITY_LIST_HEADER Header
;
2036 #define FormatCap_CurMaxDescrOffset 0x00
2037 #define FormatCap_FormatDescrOffset(i) (i+1)
2039 FORMATTABLE_CAPACITY_DESCRIPTOR Descriptors
[1];
2040 } FORMAT_CAPACITIES_DATA
, *PFORMAT_CAPACITIES_DATA
;
2042 //#endif //WITHOUT_FORMATTER
2044 // Define Event Status info blocks
2046 typedef struct _EVENT_STAT_HEADER
{
2047 UCHAR DataLength
[2];
2049 #define EventRetStat_Class_Mask 0x07
2050 #define EventRetStat_Class_OpChange 0x01
2051 #define EventRetStat_Class_PM 0x02
2052 #define EventRetStat_Class_ExternReq 0x03
2053 #define EventRetStat_Class_Media 0x04
2054 #define EventRetStat_Class_MultInitiators 0x05
2055 #define EventRetStat_Class_DevBusy 0x06
2056 #define EventRetStat_NEA 0x80
2067 UCHAR SupportedClasses
; // see command format
2069 } EVENT_STAT_HEADER
, *PEVENT_STAT_HEADER
;
2071 typedef struct _EVENT_STAT_OPERATIONAL_BLOCK
{
2073 EVENT_STAT_HEADER Header
;
2075 #define EventStat_OpEvent_Mask 0x0f
2085 #define EventStat_OpStat_Mask 0x0f
2086 #define EventStat_OpStat_Ready 0x00
2087 #define EventStat_OpStat_TempBusy 0x01
2088 #define EventStat_OpStat_Busy 0x02
2094 UCHAR Reserved0
: 3;
2095 UCHAR PersistentPrevent
: 1;
2099 #define EventStat_OpReport_NoChg 0x00
2100 #define EventStat_OpReport_Change 0x01
2101 #define EventStat_OpReport_AddChg 0x02
2102 #define EventStat_OpReport_Reset 0x03
2103 #define EventStat_OpReport_FirmwareChg 0x04 // microcode change
2104 #define EventStat_OpReport_InquiryChg 0x05
2105 #define EventStat_OpReport_CtrlReq 0x06
2106 #define EventStat_OpReport_CtrlRelease 0x07
2110 } EVENT_STAT_OPERATIONAL_BLOCK
, *PEVENT_STAT_OPERATIONAL_BLOCK
;
2112 typedef struct _EVENT_STAT_PM_BLOCK
{
2114 EVENT_STAT_HEADER Header
;
2116 #define EventStat_PowerEvent_Mask 0x0f
2117 #define EventStat_PowerEvent_NoChg 0x00
2118 #define EventStat_PowerEvent_ChgOK 0x01
2119 #define EventStat_PowerEvent_ChgFail 0x02
2124 UCHAR PowerEvent
: 4;
2125 UCHAR Reserved0
: 4;
2129 #define EventStat_PowerStat_Mask 0x0f
2130 #define EventStat_PowerStat_Active 0x01
2131 #define EventStat_PowerStat_Idle 0x02
2132 #define EventStat_PowerStat_Standby 0x03
2133 #define EventStat_PowerStat_Sleep 0x04
2138 UCHAR PowerStatus
: 4;
2139 UCHAR Reserved0
: 4;
2145 } EVENT_STAT_PM_BLOCK
, *PEVENT_STAT_PM_BLOCK
;
2147 typedef struct _EVENT_STAT_EXT_REQ_BLOCK
{
2149 EVENT_STAT_HEADER Header
;
2151 #define EventStat_ExtrnReqEvent_Mask 0x0f
2152 #define EventStat_ExtrnReqEvent_None 0x00
2153 #define EventStat_ExtrnReqEvent_KeyDown 0x01
2154 #define EventStat_ExtrnReqEvent_KeyUp 0x02
2155 #define EventStat_ExtrnReqEvent_ExtrnReq 0x03
2160 UCHAR ExtrnReqEvent
: 4;
2161 UCHAR Reserved0
: 4;
2165 #define EventStat_ExtrnReqStatus_Mask 0x0f
2166 #define EventStat_ExtrnReqStatus_Ready 0x00
2167 #define EventStat_ExtrnReqStatus_OtherPrevent 0x01
2172 UCHAR ExtrnReqStatus
: 4;
2173 UCHAR Reserved0
: 3;
2174 UCHAR PersistentPrevent
: 1;
2178 #define EventStat_ExtrnReq_None 0x000
2179 #define EventStat_ExtrnReq_Overrun 0x001
2180 #define EventStat_ExtrnReq_Play 0x101
2181 #define EventStat_ExtrnReq_Rewind 0x102
2182 #define EventStat_ExtrnReq_FastFwd 0x103
2183 #define EventStat_ExtrnReq_Pause 0x104
2184 #define EventStat_ExtrnReq_Stop 0x106
2185 #define EventStat_ExtrnReq_MinASCII 0x200
2186 #define EventStat_ExtrnReq_MaxASCII 0x2ff
2188 UCHAR ExternalReq
[2];
2190 } EVENT_STAT_EXT_REQ_BLOCK
, *PEVENT_STAT_EXT_REQ_BLOCK
;
2192 typedef struct _EVENT_STAT_MEDIA_BLOCK
{
2194 EVENT_STAT_HEADER Header
;
2196 #define EventStat_MediaEvent_Mask 0x0f
2197 #define EventStat_MediaEvent_None 0x00
2198 #define EventStat_MediaEvent_EjectReq 0x01
2199 #define EventStat_MediaEvent_New 0x02
2200 #define EventStat_MediaEvent_Removal 0x03
2201 #define EventStat_MediaEvent_Chg 0x04
2202 #define EventStat_MediaEvent_BGFormatOk 0x05
2203 #define EventStat_MediaEvent_BGFormatRst 0x06
2208 UCHAR MediaEvent
: 4;
2209 UCHAR Reserved0
: 4;
2213 #define EventStat_MediaStat_DoorOpen 0x01
2214 #define EventStat_MediaStat_Present 0x02
2221 UCHAR Reserved0
: 6;
2228 } EVENT_STAT_MEDIA_BLOCK
, *PEVENT_STAT_MEDIA_BLOCK
;
2230 typedef struct _EVENT_STAT_DEV_BUSY_BLOCK
{
2232 EVENT_STAT_HEADER Header
;
2234 #define EventStat_BusyEvent_Mask 0x0f
2235 #define EventStat_BusyEvent_None 0x00
2236 #define EventStat_BusyEvent_Busy 0x01
2241 UCHAR BusyEvent
: 4;
2242 UCHAR Reserved0
: 4;
2246 #define EventStat_BusyStat_Mask 0x0f
2247 #define EventStat_BusyStat_NoEvent 0x00
2248 #define EventStat_BusyStat_Power 0x01
2249 #define EventStat_BusyStat_Immed 0x02
2250 #define EventStat_BusyStat_Deferred 0x03
2255 UCHAR BusyStatus
: 4;
2256 UCHAR Reserved0
: 4;
2262 } EVENT_STAT_DEV_BUSY_BLOCK
, *PEVENT_STAT_DEV_BUSY_BLOCK
;
2264 // Define mode disc info block.
2266 typedef struct _DISC_INFO_BLOCK
{ //
2267 UCHAR DataLength
[2];
2269 #define DiscInfo_Disk_Mask 0x03
2270 #define DiscInfo_Disk_Empty 0x00
2271 #define DiscInfo_Disk_Appendable 0x01
2272 #define DiscInfo_Disk_Complete 0x02
2273 #define DiscInfo_Disk_OtherRW 0x03
2275 #define DiscInfo_Ses_Mask 0x0C
2276 #define DiscInfo_Ses_Empty 0x00
2277 #define DiscInfo_Ses_Incomplete 0x04
2278 #define DiscInfo_Ses_Complete 0x0C
2280 #define DiscInfo_Disk_Erasable 0x10
2286 UCHAR LastSesStat
: 2;
2288 UCHAR DiscInfoType
: 3;
2292 UCHAR FirstTrackNum
;
2294 UCHAR FirstTrackNumLastSes
;
2295 UCHAR LastTrackNumLastSes
;
2297 #define DiscInfo_BGF_Mask 0x03
2298 #define DiscInfo_BGF_None 0x00
2299 #define DiscInfo_BGF_Interrupted 0x01 // \ indicates that disk is MRW or Basic-formatted
2300 #define DiscInfo_BGF_InProgress 0x02 // } note, you should issue READ_TOC
2301 #define DiscInfo_BGF_Complete 0x03 // / to check MRW state on old drives
2303 #define DiscInfo_DBit 0x04 // MRW structures may be not current (dirty)
2304 #define DiscInfo_DAC_V 0x10 // Disk Appclication Code valid
2305 #define DiscInfo_URU 0x20 // unrestricted use (1 for CD/DVD, 0 for DB)
2306 #define DiscInfo_DBC_V 0x40 // Disk Bar Code valid
2307 #define DiscInfo_DID_V 0x80 // DiskID valid
2312 UCHAR BGFmtStatus
: 2;
2317 UCHAR DBC_V
: 1; // 0
2322 #define DiscInfo_Type_cdrom 0x00 // CD-DA / CD-ROM
2323 #define DiscInfo_Type_cdi 0x10 // CD-I
2324 #define DiscInfo_Type_cdromxa 0x20 // CD-ROM XA
2325 #define DiscInfo_Type_unknown 0xFF // HZ ;)
2328 UCHAR NumOfSes2
; // MSB MMC-3
2329 UCHAR FirstTrackNumLastSes2
; // MSB MMC-3
2330 UCHAR LastTrackNumLastSes2
; // MSB MMC-3
2332 UCHAR LastSesLeadInTime
[4]; // MSF
2333 UCHAR LastSesLeadOutTime
[4]; // MSF
2334 UCHAR DiskBarCode
[8];
2338 } DISC_INFO_BLOCK
, *PDISC_INFO_BLOCK
;
2340 typedef struct _DISC_INFO_TRACK_BLOCK
{ //
2341 UCHAR DataLength
[2];
2347 UCHAR MaxLastTrackNum
[2];
2348 UCHAR NumOfTracks
[2];
2349 UCHAR MaxNumOfAppendableTracks
[2];
2350 UCHAR NumOfAppendableTracks
[2];
2352 } DISC_INFO_TRACK_BLOCK
, *PDISC_INFO_TRACK_BLOCK
;
2354 typedef struct _DISC_INFO_POW_BLOCK
{ //
2355 UCHAR DataLength
[2];
2361 UCHAR RemainingPOWReplacements
[4];
2362 UCHAR RemainingPOWMapEntries
[4];
2363 UCHAR RemainingPOWUpdates
[4];
2365 } DISC_INFO_POW_BLOCK
, *PDISC_INFO_POW_BLOCK
;
2367 // Define track info block.
2369 #define Trk_QSubChan_Type_Mask 0x0d
2370 #define Trk_QSubChan_Type_None 0x00
2371 #define Trk_QSubChan_Type_Audio 0x00
2372 #define Trk_QSubChan_Type_Audio_PreEmph 0x01
2373 #define Trk_QSubChan_Type_Data 0x04
2374 #define Trk_QSubChan_Type_IncrData 0x05
2375 #define Trk_QSubChan_Type_QAudio_PreEmph 0x08
2376 #define Trk_QSubChan_Type_AllowCpy 0x02
2378 typedef struct _TRACK_INFO_BLOCK
{
2379 UCHAR DataLength
[2];
2384 #define TrkInfo_Trk_Mask Trk_QSubChan_Type_Mask
2385 #define TrkInfo_Trk_None Trk_QSubChan_Type_None
2386 #define TrkInfo_Trk_Mode1 Trk_QSubChan_Type_Audio_PreEmph
2387 #define TrkInfo_Trk_Mode2 (Trk_QSubChan_Type_Audio | Trk_QSubChan_Type_AllowCpy)
2388 #define TrkInfo_Trk_XA (Trk_QSubChan_Type_Audio | Trk_QSubChan_Type_AllowCpy)
2389 #define TrkInfo_Trk_DDCD Trk_QSubChan_Type_Data // MMC-3
2390 #define TrkInfo_Trk_NonCD Trk_QSubChan_Type_Data // MMC-3
2391 #define TrkInfo_Trk_Inc Trk_QSubChan_Type_IncrData // MMC-3
2392 #define TrkInfo_Trk_unknown 0x0F
2394 #define TrkInfo_Copy 0x10
2395 #define TrkInfo_Damage 0x20
2396 /* Layer Jump state */
2397 #define TrkInfo_LJ_Mask 0xc0
2398 #define TrkInfo_LJ_None 0x00
2399 #define TrkInfo_LJ_Ready 0x40
2400 #define TrkInfo_LJ_Manual 0x80
2401 #define TrkInfo_LJ_Regular 0xc0
2404 /* UCHAR TrackMode : 4;
2409 #define TrkInfo_Dat_Mask 0x0F
2410 #define TrkInfo_Dat_Mode1 0x01
2411 #define TrkInfo_Dat_Mode2 0x02
2412 #define TrkInfo_Dat_XA 0x02
2413 #define TrkInfo_Dat_DDCD 0x02
2414 #define TrkInfo_Dat_unknown 0x0F
2415 #define TrkInfo_Dat_Unknown TrkInfo_Dat_unknown
2416 #define TrkInfo_FP 0x10
2417 #define TrkInfo_Packet 0x20
2418 #define TrkInfo_Blank 0x40
2419 #define TrkInfo_RT 0x80
2422 /* UCHAR DataMode : 4;
2428 #define TrkInfo_NWA_V 0x01
2429 #define TrkInfo_LRA_V 0x02 // MMC-3
2434 UCHAR Reserved : 6; */
2436 UCHAR TrackStartAddr
[4];
2437 UCHAR NextWriteAddr
[4];
2438 UCHAR FreeBlocks
[4];
2439 UCHAR FixPacketSize
[4];
2440 UCHAR TrackLength
[4];
2444 UCHAR LastRecordedAddr
[4];
2445 UCHAR TrackNum2
; // MSB
2446 UCHAR SesNum2
; // MSB
2451 UCHAR ReadCompatLBA
[4];
2455 UCHAR NextLJ_LBA
[4];
2456 UCHAR LastLJ_LBA
[4];
2458 } TRACK_INFO_BLOCK
, *PTRACK_INFO_BLOCK
;
2460 // Mode data structures.
2462 // Define Mode parameter header.
2464 #define MediaType_Unknown 0x00
2465 #define MediaType_120mm_CDROM_DataOnly 0x01
2466 #define MediaType_120mm_CDROM_AudioOnly 0x02 //CDDA
2467 #define MediaType_120mm_CDROM_DataAudioCombined 0x03
2468 #define MediaType_120mm_CDROM_Hybrid_PhotoCD 0x04
2469 #define MediaType_80mm_CDROM_DataOnly 0x05
2470 #define MediaType_80mm_CDROM_AudioOnly 0x06 //CDDA
2471 #define MediaType_80mm_CDROM_DataAudioCombined 0x07
2472 #define MediaType_80mm_CDROM_Hybrid_PhotoCD 0x08
2474 #define MediaType_UnknownSize_CDR 0x10
2475 #define MediaType_120mm_CDR_DataOnly 0x11
2476 #define MediaType_120mm_CDR_AudioOnly 0x12 //CDDA
2477 #define MediaType_120mm_CDR_DataAudioCombined 0x13
2478 #define MediaType_120mm_CDR_Hybrid_PhotoCD 0x14
2479 #define MediaType_80mm_CDR_DataOnly 0x15
2480 #define MediaType_80mm_CDR_AudioOnly 0x16 //CDDA
2481 #define MediaType_80mm_CDR_DataAudioCombined 0x17
2482 #define MediaType_80mm_CDR_Hybrid_Photo_CD 0x18
2484 #define MediaType_UnknownSize_CDRW 0x20
2485 #define MediaType_120mm_CDRW_DataOnly 0x21
2486 #define MediaType_120mm_CDRW_AudioOnly 0x22 //CDDA
2487 #define MediaType_120mm_CDRW_DataAudioCombined 0x23
2488 #define MediaType_120mm_CDRW_Hybrid 0x24
2489 #define MediaType_80mm_CDRW_DataOnly 0x25
2490 #define MediaType_80mm_CDRW_AudioOnly 0x26 //CDDA
2491 #define MediaType_80mm_CDRW_DataAudioCombined 0x27
2492 #define MediaType_80mm_CDRW_Hybrid 0x28
2494 #define MediaType_UnknownSize_Unknown 0x30
2496 #define MediaType_120mm_DVDRW_DataOnly 0x41
2498 #define MediaType_NoDiscPresent 0x70
2499 #define MediaType_DoorOpen 0x71
2501 //*********************************************************************************************
2503 typedef struct _MODE_PARAMETER_HEADER
{
2504 UCHAR ModeDataLength
;
2506 UCHAR DeviceSpecificParameter
;
2507 UCHAR BlockDescriptorLength
;
2508 } MODE_PARAMETER_HEADER
, *PMODE_PARAMETER_HEADER
;
2510 typedef struct _MODE_PARAMETER_HEADER10
{
2511 UCHAR ModeDataLength
[2];
2513 UCHAR DeviceSpecificParameter
;
2515 UCHAR BlockDescriptorLength
[2];
2516 } MODE_PARAMETER_HEADER10
, *PMODE_PARAMETER_HEADER10
;
2518 #define MODE_FD_SINGLE_SIDE 0x01
2519 #define MODE_FD_DOUBLE_SIDE 0x02
2520 #define MODE_FD_MAXIMUM_TYPE 0x1E
2521 #define MODE_DSP_FUA_SUPPORTED 0x10
2522 #define MODE_DSP_WRITE_PROTECT 0x80
2524 // Define the mode parameter block.
2526 typedef struct _MODE_PARAMETER_BLOCK
{
2528 UCHAR NumberOfBlocks
[3];
2530 UCHAR BlockLength
[3];
2531 } MODE_PARAMETER_BLOCK
, *PMODE_PARAMETER_BLOCK
;
2533 typedef struct _MODE_PARM_READ_WRITE
{
2535 MODE_PARAMETER_HEADER ParameterListHeader
; // List Header Format
2536 MODE_PARAMETER_BLOCK ParameterListBlock
; // List Block Descriptor
2538 } MODE_PARM_READ_WRITE_DATA
, *PMODE_PARM_READ_WRITE_DATA
;
2540 //*********************************************************************************************
2541 // Define read write recovery page
2543 typedef struct _MODE_READ_WRITE_RECOVERY_PAGE
{ // 0x01
2546 UCHAR Reserved1
: 1;
2547 UCHAR PageSavable
: 1;
2563 } ErrorRecoveryParam
;
2564 UCHAR ReadRetryCount
;
2565 UCHAR CorrectionSpan
; //SCSI CBS only
2566 UCHAR HeadOffsetCount
; //SCSI CBS only
2567 UCHAR DataStrobOffsetCount
; //SCSI CBS only
2574 } ErrorRecoveryParam2
;
2575 UCHAR WriteRetryCount
;
2579 UCHAR RecoveryTimeLimit
[2]; // 0
2581 UCHAR ErrorReportingWindowSize
[3];
2584 } MODE_READ_WRITE_RECOVERY_PAGE
, *PMODE_READ_WRITE_RECOVERY_PAGE
;
2586 // Define Read Recovery page - cdrom
2588 typedef struct _MODE_READ_RECOVERY_PAGE
{ // 0x01
2591 UCHAR Reserved1
: 1;
2592 UCHAR PageSavable
: 1;
2599 UCHAR Reserved2
: 1;
2602 UCHAR Reserved3
: 2;
2604 UCHAR ReadRetryCount
;
2607 } MODE_READ_RECOVERY_PAGE
, *PMODE_READ_RECOVERY_PAGE
;
2609 //*********************************************************************************************
2610 // Define mode write parameters page.
2612 typedef struct _MODE_WRITE_PARAMS_PAGE
{ // 0x05
2615 UCHAR PageSavable
: 1;
2617 UCHAR PageLength
; // 0x32
2619 #define WParam_WType_Mask 0x0f
2620 #define WParam_WType_Packet 0x00
2621 #define WParam_WType_TAO 0x01
2622 #define WParam_WType_Ses 0x02
2623 #define WParam_WType_Raw 0x03
2624 #define WParam_TestWrite 0x10
2625 #define WParam_LS_V 0x20
2626 #define WParam_BUFF 0x40 // buffer underrun protection
2631 UCHAR WriteType
: 4; // 1
2639 #define WParam_TrkMode_Mask Trk_QSubChan_Type_Mask //0x0d // xx0x
2640 #define WParam_TrkMode_None Trk_QSubChan_Type_None //0x00
2641 #define WParam_TrkMode_Audio Trk_QSubChan_Type_Audio //0x00
2642 #define WParam_TrkMode_Audio_PreEmph Trk_QSubChan_Type_Audio_PreEmph //0x01
2643 #define WParam_TrkMode_Data Trk_QSubChan_Type_Data //0x04
2644 #define WParam_TrkMode_IncrData Trk_QSubChan_Type_IncrData //0x05
2645 #define WParam_TrkMode_QAudio_PreEmph Trk_QSubChan_Type_QAudio_PreEmph //0x08
2646 #define WParam_TrkMode_AllowCpy Trk_QSubChan_Type_AllowCpy //0x02
2647 #define WParam_Copy 0x10
2648 #define WParam_FP 0x20
2649 #define WParam_MultiSes_Mask 0xc0
2650 #define WParam_Multises_None 0x00
2651 #define WParam_Multises_Final 0x80
2652 #define WParam_Multises_Multi 0xc0
2657 UCHAR TrackMode
: 4; // 4
2658 UCHAR Copy
: 1; // 0
2660 UCHAR Multisession
: 2; // 11
2664 #define WParam_BlkType_Mask 0x0f
2665 #define WParam_BlkType_Raw_2352 0x00
2666 #define WParam_BlkType_RawPQ_2368 0x01
2667 #define WParam_BlkType_RawPW_2448 0x02
2668 #define WParam_BlkType_RawPW_R_2448 0x03
2669 #define WParam_BlkType_VendorSpec1 0x07
2670 #define WParam_BlkType_M1_2048 0x08
2671 #define WParam_BlkType_M2_2336 0x09
2672 #define WParam_BlkType_M2XAF1_2048 0x0a
2673 #define WParam_BlkType_M2XAF1SH_2056 0x0b
2674 #define WParam_BlkType_M2XAF2_2324 0x0c
2675 #define WParam_BlkType_M2XAFXSH_2332 0x0d
2676 #define WParam_BlkType_VendorSpec2 0x0f
2681 UCHAR DataBlockType
: 4; // 8
2692 UCHAR HostAppCode
: 6; // 0
2693 UCHAR Reserved4
: 2;
2697 #define WParam_SesFmt_CdRom 0x00
2698 #define WParam_SesFmt_CdI 0x10
2699 #define WParam_SesFmt_CdRomXa 0x20
2703 UCHAR PacketSize
[4]; // 0
2704 UCHAR AudioPause
[2]; // 150
2724 struct _SubHdrParams1
{
2728 #define WParam_SubHdr_SubMode0 0x00
2729 #define WParam_SubHdr_SubMode1 0x08
2735 #define WParam_SubHdr_Mode_Mask 0x03
2736 #define WParam_SubHdr_Mode0 0x00
2737 #define WParam_SubHdr_Mode1 0x01
2738 #define WParam_SubHdr_Mode2 0x02
2739 #define WParam_SubHdr_Format_Mask 0xe0
2740 #define WParam_SubHdr_Format_UserData 0x00
2741 #define WParam_SubHdr_Format_RunIn4 0x20
2742 #define WParam_SubHdr_Format_RunIn3 0x40
2743 #define WParam_SubHdr_Format_RunIn2 0x60
2744 #define WParam_SubHdr_Format_RunIn1 0x80
2745 #define WParam_SubHdr_Format_Link 0xa0
2746 #define WParam_SubHdr_Format_RunOut2 0xc0
2747 #define WParam_SubHdr_Format_RunOut1 0xe0
2759 } MODE_WRITE_PARAMS_PAGE
, *PMODE_WRITE_PARAMS_PAGE
;
2761 typedef struct _MODE_WRITE_PARAMS_PAGE_3
{
2762 MODE_WRITE_PARAMS_PAGE Standard
;
2763 UCHAR VendorSpec
[4];
2764 } MODE_WRITE_PARAMS_PAGE_3
, *PMODE_WRITE_PARAMS_PAGE_3
;
2766 //*********************************************************************************************
2767 // Define Caching page.
2769 typedef struct _MODE_CACHING_PAGE
{ // 0x08
2772 UCHAR PageSavable
: 1;
2776 UCHAR ReadDisableCache
: 1;
2777 UCHAR MultiplicationFactor
: 1;
2778 UCHAR WriteCacheEnable
: 1;
2779 UCHAR Reserved2
: 5;
2781 UCHAR WriteRetensionPriority
: 4;
2782 UCHAR ReadRetensionPriority
: 4;
2784 UCHAR DisablePrefetchTransfer
[2];
2785 UCHAR MinimumPrefetch
[2];
2786 UCHAR MaximumPrefetch
[2];
2787 UCHAR MaximumPrefetchCeiling
[2];
2788 } MODE_CACHING_PAGE
, *PMODE_CACHING_PAGE
;
2790 //*********************************************************************************************
2791 // Define CD Parameters page.
2793 typedef struct _MODE_CD_PARAMS_PAGE
{ // 0x0D
2796 UCHAR PageSavable
: 1;
2798 UCHAR PageLength
; // 0x06
2801 #define CdParams_InactvityTime_Mask 0x0f
2806 UCHAR InactivityTime
: 4; // 1 - 125ms, 2 - 250ms... 9 - 32s, A - 1min...
2807 UCHAR Reserved0
: 4;
2811 UCHAR SUnits_per_MUnit
[2];
2812 UCHAR FUnits_per_SUnit
[2];
2813 } MODE_CD_PARAMS_PAGE
, *PMODE_CD_PARAMS_PAGE
;
2815 //*********************************************************************************************
2816 // Define CD Audio Control Mode page.
2818 typedef struct _CDDA_PORT_CONTROL
{
2820 #define CddaPort_Channel_Mask 0x0f
2821 #define CddaPort_Channel_Mute 0x00
2822 #define CddaPort_Channel_0 0x01
2823 #define CddaPort_Channel_1 0x02
2824 #define CddaPort_Channel_0_1 0x03
2825 #define CddaPort_Channel_2 0x04
2826 #define CddaPort_Channel_3 0x08
2828 UCHAR ChannelSelection
;
2830 } CDDA_PORT_CONTROL
, *PCDDA_PORT_CONTROL
;
2832 typedef struct _MODE_CD_AUDIO_CONTROL_PAGE
{ // 0x0E
2835 UCHAR PageSavable
: 1;
2837 UCHAR PageLength
; // 0x0E
2839 #define CdAudio_SOTC 0x02
2840 #define CdAudio_Immed 0x04
2845 UCHAR Reserved0
: 1;
2848 UCHAR Reserved1
: 5;
2854 UCHAR LogicalBlocksPerSecond
[2];
2855 CDDA_PORT_CONTROL Port
[4];
2856 } MODE_CD_AUDIO_CONTROL_PAGE
, *PMODE_CD_AUDIO_CONTROL_PAGE
;
2858 //*********************************************************************************************
2859 // Define Power Condition Mode page.
2861 typedef struct _MODE_POWER_CONDITION_PAGE
{ // 0x1A
2864 UCHAR PageSavable
: 1;
2866 UCHAR PageLength
; // 0x0A
2869 #define PowerCond_Standby 0x01
2870 #define PowerCond_Idle 0x02
2877 UCHAR Reserved1
: 6;
2881 UCHAR IdleTimer
[4]; // 1unit = 100ms
2882 UCHAR StandbyTimer
[4]; // 1unit = 100ms
2883 } MODE_POWER_CONDITION_PAGE
, *PMODE_POWER_CONDITION_PAGE
;
2885 //*********************************************************************************************
2886 // Define Fault/Failure Reporting Control page.
2888 typedef struct _MODE_FAIL_REPORT_PAGE
{ // 0x1C
2891 UCHAR PageSavable
: 1;
2893 UCHAR PageLength
; // 0x0A
2895 #define FailReport_LogErr 0x01
2896 #define FailReport_Test 0x04
2897 #define FailReport_DExcept 0x08
2898 #define FailReport_Perf 0x80
2904 UCHAR Reserved1
: 1;
2907 UCHAR Reserved2
: 3;
2916 UCHAR Reserved1
: 4;
2920 UCHAR IntervalTimer
[4]; // 1unit = 100ms
2921 UCHAR ReportCount
[4];
2922 } MODE_FAIL_REPORT_PAGE
, *PMODE_FAIL_REPORT_PAGE
;
2924 //*********************************************************************************************
2925 // Define Time-out and Protect page.
2927 typedef struct _MODE_TIMEOUT_AND_PROTECT_PAGE
{ // 0x1D
2930 UCHAR PageSavable
: 1;
2932 UCHAR PageLength
; // 0x08
2936 #define Timeout_SW 0x01
2937 #define Timeout_DISP 0x02
2938 #define Timeout_TMOE 0x04
2952 UCHAR Group1_Timeout
[2]; // 1unit = 1s
2953 UCHAR Group2_Timeout
[2]; // 1unit = 1s
2954 } MODE_TIMEOUT_AND_PROTECT_PAGE
, *PMODE_TIMEOUT_AND_PROTECT_PAGE
;
2956 //*********************************************************************************************
2957 // Define Philips CD-R(W) Sector Mode page.
2959 typedef struct _MODE_PHILIPS_SECTOR_TYPE_PAGE
{ // 0x21
2961 UCHAR Reserved1
: 1;
2971 UCHAR DataBlockType
: 4; // 8
2976 #define WParams_Philips_CreateNewTrack 0
2982 } MODE_PHILIPS_SECTOR_TYPE_PAGE
, *PMODE_PHILIPS_SECTOR_TYPE_PAGE
;
2984 //*********************************************************************************************
2985 // Define CD-X Capabilities and Mechanical Status page.
2987 typedef struct _MODE_CAPABILITIES_PAGE2
{ // 0x2A
2989 UCHAR Reserved1
: 1;
2994 #define DevCap_read_cd_r 0x01 // reserved in 1.2
2995 #define DevCap_read_cd_rw 0x02 // reserved in 1.2
2996 #define DevCap_method2 0x04
2997 #define DevCap_read_dvd_rom 0x08
2998 #define DevCap_read_dvd_r 0x10
2999 #define DevCap_read_dvd_ram 0x20
3001 #define DevCap_read_dvd (DevCap_read_dvd_rom | DevCap_read_dvd_r | DevCap_read_dvd_ram)
3003 UCHAR ReadCap
; // DevCap_*_read // 0x02
3004 /* UCHAR cd_r_read : 1; // reserved in 1.2
3005 UCHAR cd_rw_read : 1; // reserved in 1.2
3008 UCHAR dvd_r_read : 1;
3009 UCHAR dvd_ram_read : 1;
3010 UCHAR Reserved2 : 2;*/
3012 #define DevCap_write_cd_r 0x01 // reserved in 1.2
3013 #define DevCap_write_cd_rw 0x02 // reserved in 1.2
3014 #define DevCap_test_write 0x04
3015 #define DevCap_write_dvd_r 0x10
3016 #define DevCap_write_dvd_ram 0x20
3018 UCHAR WriteCap
; // DevCap_*_write // 0x03
3019 /* UCHAR cd_r_write : 1; // reserved in 1.2
3020 UCHAR cd_rw_write : 1; // reserved in 1.2
3021 UCHAR test_write : 1;
3022 UCHAR reserved3a : 1;
3023 UCHAR dvd_r_write : 1;
3024 UCHAR dvd_ram_write : 1;
3025 UCHAR Reserved3 : 2;*/
3027 #define DevCap_audio_play 0x01
3028 #define DevCap_composite 0x02
3029 #define DevCap_digport1 0x04
3030 #define DevCap_digport2 0x08
3031 #define DevCap_mode2_form1 0x10
3032 #define DevCap_mode2_form2 0x20
3033 #define DevCap_multisession 0x40
3035 UCHAR Capabilities0
; // 0x04
3036 /* UCHAR audio_play : 1;
3037 UCHAR composite : 1;
3040 UCHAR mode2_form1 : 1;
3041 UCHAR mode2_form2 : 1;
3042 UCHAR multisession : 1;
3043 UCHAR Reserved4 : 1;*/
3045 #define DevCap_cdda 0x01
3046 #define DevCap_cdda_accurate 0x02
3047 #define DevCap_rw_supported 0x04
3048 #define DevCap_rw_corr 0x08
3049 #define DevCap_c2_pointers 0x10
3050 #define DevCap_isrc 0x20
3051 #define DevCap_upc 0x40
3052 #define DevCap_read_bar_code 0x80
3054 UCHAR Capabilities1
; // 0x05
3056 UCHAR cdda_accurate : 1;
3057 UCHAR rw_supported : 1;
3059 UCHAR c2_pointers : 1;
3062 UCHAR Reserved5 : 1;*/
3064 #define DevCap_lock 0x01
3065 #define DevCap_lock_state 0x02
3066 #define DevCap_prevent_jumper 0x04
3067 #define DevCap_eject 0x08
3068 #define DevCap_mechtype_mask 0xE0
3069 #define DevCap_mechtype_caddy 0x00
3070 #define DevCap_mechtype_tray (0x01<<5)
3071 #define DevCap_mechtype_popup (0x02<<5)
3072 #define DevCap_mechtype_individual_changer (0x04<<5)
3073 #define DevCap_mechtype_cartridge_changer (0x05<<5)
3075 UCHAR Capabilities2
; // 0x06
3077 UCHAR lock_state : 1;
3078 UCHAR prevent_jumper : 1;
3080 UCHAR Reserved6 : 1;
3081 UCHAR mechtype : 3;*/
3083 #define DevCap_separate_volume 0x01
3084 #define DevCap_separate_mute 0x02
3085 #define DevCap_disc_present 0x04 // reserved in 1.2
3086 #define DevCap_sw_slot_select 0x08 // reserved in 1.2
3087 #define DevCap_change_side_cap 0x10
3088 #define DevCap_rw_leadin_read 0x20
3090 UCHAR Capabilities3
; // 0x07
3091 /* UCHAR separate_volume : 1;
3092 UCHAR separate_mute : 1;
3093 UCHAR disc_present : 1; // reserved in 1.2
3094 UCHAR sss : 1; // reserved in 1.2
3095 UCHAR Reserved7 : 4;*/
3097 UCHAR MaximumSpeedSupported
[2]; // 0x08
3098 UCHAR NumberVolumeLevels
[2]; // 0x0a
3099 UCHAR BufferSize
[2]; // 0x0c
3100 UCHAR CurrentSpeed
[2]; // obsolete in MMC3 // 0x0e
3102 UCHAR Reserved8
; // 0x10
3104 UCHAR SpecialParameters0
; // 0x11
3105 /* UCHAR Reserved9 : 1;
3110 UCHAR Reserved10 : 2;*/
3112 UCHAR MaximumWriteSpeedSupported
[2]; // obsolete in MMC3
3113 UCHAR CurrentWriteSpeed
[2]; // obsolete in MMC3
3114 UCHAR CopyManagementRevision
[2]; // 0x16
3115 UCHAR Reserved11
[2]; // 0x18
3119 UCHAR Reserved12
; // 0x1a
3121 UCHAR SpecialParameters1
; // 0x1b
3122 /* UCHAR RCS : 2; // rotation control selected
3123 UCHAR Reserved13 : 6; */
3125 UCHAR CurrentWriteSpeed3
[2]; // 0x1c
3126 UCHAR LunWPerfDescriptorCount
[2]; // 0x1e
3128 // LUN_WRITE_PERF_DESC LunWPerfDescriptor[0];
3129 } MODE_CAPABILITIES_PAGE2
, *PMODE_CAPABILITIES_PAGE2
;
3131 /*typedef struct _MODE_CAPABILITIES_PAGE3 { // 0x2A
3132 struct MODE_CAPABILITIES_PAGE2;
3134 } MODE_CAPABILITIES_PAGE3, *PMODE_CAPABILITIES_PAGE3;*/
3136 typedef struct _LUN_WRITE_PERF_DESC
{
3139 #define LunWPerf_RotCtrl_Mask 0x07
3140 #define LunWPerf_RotCtrl_CLV 0x00
3141 #define LunWPerf_RotCtrl_CAV 0x01
3143 UCHAR RotationControl
;
3144 UCHAR WriteSpeedSupported
[2]; // kbps
3146 } LUN_WRITE_PERF_DESC
, *PLUN_WRITE_PERF_DESC
;
3148 // Mode parameter list block descriptor -
3149 // set the block length for reading/writing
3151 #define MODE_BLOCK_DESC_LENGTH 8
3152 #define MODE_HEADER_LENGTH 4
3153 #define MODE_HEADER_LENGTH10 8
3155 #define CDB_USE_MSF 0x01
3157 // Atapi 2.5 changer
3158 typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER
{
3159 UCHAR CurrentSlot
: 5;
3160 UCHAR ChangerState
: 2;
3163 UCHAR MechanismState
: 3;
3164 UCHAR CurrentLogicalBlockAddress
[3];
3165 UCHAR NumberAvailableSlots
;
3166 UCHAR SlotTableLength
[2];
3167 } MECHANICAL_STATUS_INFORMATION_HEADER
, *PMECHANICAL_STATUS_INFORMATION_HEADER
;
3169 typedef struct _SLOT_TABLE_INFORMATION
{
3170 UCHAR DiscChanged
: 1;
3172 UCHAR DiscPresent
: 1;
3174 } SLOT_TABLE_INFORMATION
, *PSLOT_TABLE_INFORMATION
;
3176 typedef struct _MECHANICAL_STATUS
{
3177 MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader
;
3178 SLOT_TABLE_INFORMATION SlotTableInfo
[1];
3179 } MECHANICAL_STATUS
, *PMECHANICAL_STATUS
;
3181 typedef struct _MODE_MRW_PAGE
{ // 0x2C
3183 UCHAR Reserved1
: 1;
3190 #define MrwPage_use_DMA 0x00
3191 #define MrwPage_use_GAA 0x01
3196 } MODE_MRW_PAGE
, *PMODE_MRW_PAGE
;
3198 #define MRW_DMA_OFFSET 0x500
3199 #define MRW_DA_SIZE (136*32)
3200 #define MRW_SA_SIZE (8*32)
3201 #define MRW_DMA_SEGMENT_SIZE (MRW_DA_SIZE+MRW_SA_SIZE)
3204 // SET STREAMING descriptors
3207 typedef struct _SET_STREAMING_PERFORMANCE_DESCRIPTOR
{
3208 UCHAR RA
: 1; // Random Access
3210 UCHAR RDD
: 1; // Restore Defaults
3212 UCHAR Reserved0
: 3;
3219 UCHAR ReadSize
[4]; // KBytes
3220 UCHAR ReadTime
[4]; // ms
3222 UCHAR WriteSize
[4]; // KBytes
3223 UCHAR WriteTime
[4]; // ms
3225 } SET_STREAMING_PERFORMANCE_DESCRIPTOR
, *PSET_STREAMING_PERFORMANCE_DESCRIPTOR
;
3228 // GET CONFIGURATION response format
3231 // Feature Request types
3233 #define RT_CURRENT 0x01
3235 #define RT_RESERVED 0x03
3238 #define FC_PROFILE_LIST 0x0000
3239 #define FC_CORE 0x0001
3240 #define FC_MORPHING 0x0002
3241 #define FC_REMOVALE_MEDIUM 0x0003
3242 #define FC_WRITE_PROTECT_CTL 0x0004
3243 #define FC_RANDOM_READABLE 0x0010
3244 #define FC_MULTIREAD 0x001d
3245 #define FC_CDREAD 0x001e
3246 #define FC_DVDREAD 0x001f
3247 #define FC_RANDOM_WRITEABLE 0x0020
3248 #define FC_INCREMENTAL_STREAMING_WRITEABLE 0x0021
3249 #define FC_SECTOR_ERASABLE 0x0022
3250 #define FC_FORMATTABLE 0x0023
3251 #define FC_DEFECT_MANAGMENT 0x0024
3252 #define FC_WRITE_ONCE 0x0025
3253 #define FC_RESTRICTED_OWERWRITE 0x0026
3254 #define FC_CDRW_CAV_WRITE 0x0027
3255 #define FC_MRW 0x0028
3256 #define FC_ENHANCED_DEFECT_REPORTING 0x0029
3257 #define FC_DVDpRW 0x002a
3258 #define FC_DVDpR 0x002b // MMC-6
3259 #define FC_RIGID_RESTRICTED_OWERWRITE 0x002c
3260 #define FC_CD_TAO 0x002d
3261 #define FC_CD_MASTERING 0x002e
3262 #define FC_DVD_R_RW_WRITE 0x002f
3263 #define FC_DDCD_READ 0x0030 // removed from MMC-5
3264 #define FC_DDCDR_WRITE 0x0031 // removed from MMC-5
3265 #define FC_DDCDRW_WRITE 0x0032 // removed from MMC-5
3266 #define FC_LAYER_JUMP_RECORDING 0x0033 // MMC-6
3267 #define FC_CDRW_WRITE 0x0037 // MMC-5
3268 #define FC_BDR_POW 0x0038 // MMC-6
3269 #define FC_DVDpR_DL 0x003a // MMC-6
3270 #define FC_DVDpRW_DL 0x003b // MMC-5
3271 #define FC_BD_READ 0x0040 // MMC-5, BlueRay
3272 #define FC_BD_WRITE 0x0041 // MMC-6, BlueRay
3273 #define FC_TSR 0x0042 // MMC-6
3274 #define FC_HD_DVD_READ 0x0050 // MMC-6
3275 #define FC_HD_DVD_WRITE 0x0051 // MMC-6
3276 #define FC_HYBRID_DISC 0x0080 // MMC-6
3277 #define FC_POWER_MANAGMENT 0x0100
3278 #define FC_SMART 0x0101
3279 #define FC_EMBEDED_CHANGER 0x0102
3280 #define FC_CD_AUDIO_ANALOG_PLAY 0x0103
3281 #define FC_MICROCODE_UPGRADE 0x0104
3282 #define FC_TIMEOUT 0x0105
3283 #define FC_DVD_CSS 0x0106
3284 #define FC_REAL_TIME_STREAMING 0x0107
3285 #define FC_LU_SERIAL_NUMBER 0x0108
3286 #define FC_MEDIA_SERIAL_NUMBER 0x0109
3287 #define FC_DISK_CONTROL_BLOCK 0x010a
3288 #define FC_DVD_CPRM 0x010b
3289 #define FC_FIRMWARE_INFO 0x010c
3290 #define FC_AACS 0x010d
3293 typedef struct _FEATURE_LIST_HEADER
{
3294 UCHAR DataLength
[4];
3296 UCHAR CurrentProfile
[2];
3297 } FEATURE_LIST_HEADER
, *PFEATURE_LIST_HEADER
;
3299 // Profile List Feature
3302 // Profile list descriptor format
3303 typedef struct _PROFILE_LIST_DESCRIPTOR
{
3304 UCHAR FC
[2]; // Feature code
3306 UCHAR Persistent
: 1;
3310 } PROFILE_LIST_DESCRIPTOR
, *PPROFILE_LIST_DESCRIPTOR
;
3312 // Profile descriptor format
3313 typedef struct _PROFILE_DESCRIPTOR
{
3314 UCHAR ProfileNum
[2]; // Profile Number
3315 UCHAR CurrentProfile
: 1; // indicate that this Profile curently active
3316 UCHAR Reserved1
: 7;
3318 } PROFILE_DESCRIPTOR
, *PPROFILE_DESCRIPTOR
;
3320 #define PFNUM_Min 0x0001
3321 #define PFNUM_NonRemovableDisk 0x0001
3322 #define PFNUM_RemovableDisk 0x0002
3323 #define PFNUM_MO_Erasable 0x0003
3324 #define PFNUM_MO_WORM 0x0004
3325 #define PFNUM_AS_MO 0x0005
3326 #define PFNUM_CDROM 0x0008
3327 #define PFNUM_CDR 0x0009
3328 #define PFNUM_CDRW 0x000a
3329 #define PFNUM_DVDROM 0x0010
3330 #define PFNUM_DVDR 0x0011
3331 #define PFNUM_DVDRAM 0x0012
3332 #define PFNUM_DVDRW_RESTRICTED_OVERWRITE 0x0013
3333 #define PFNUM_DVDRW_SEQUENTIAL 0x0014
3334 #define PFNUM_DVDR_DL_SEQUENTIAL 0x0015 // MMC-6
3335 #define PFNUM_DVDR_DL_JUMP_RECORDING 0x0016 // MMC-6
3336 #define PFNUM_DVDRW_DL 0x0017 // MMC-6
3337 #define PFNUM_DVDpRW 0x001a
3338 #define PFNUM_DVDpR 0x001b
3339 #define PFNUM_DDCDROM 0x0020
3340 #define PFNUM_DDCDR 0x0021
3341 #define PFNUM_DDCDRW 0x0022
3342 #define PFNUM_DVDpRW_DL 0x002a
3343 #define PFNUM_DVDpR_DL 0x002b
3344 #define PFNUM_BDROM 0x0040 // BlueRay
3345 #define PFNUM_BDR_SEQUENTIAL 0x0041
3346 #define PFNUM_BDR_RANDOM 0x0042
3347 #define PFNUM_BDRE 0x0043 // BlueRay
3348 #define PFNUM_HD_DVDROM 0x0050
3349 #define PFNUM_HD_DVDR 0x0051
3350 #define PFNUM_HD_DVDRAM 0x0052
3351 #define PFNUM_HD_DVDRW 0x0053
3352 #define PFNUM_HD_DVDR_DL 0x0058
3353 #define PFNUM_HD_DVDRW_DL 0x005a
3354 #define PFNUM_Max PFNUM_HD_DVDRW_DL
3357 // ** FC_REMOVALE_MEDIUM **
3358 // Removable Media descriptor format 0x03
3359 typedef struct _REMOVABLE_MEDIA_DESCRIPTOR
{
3360 PROFILE_LIST_DESCRIPTOR header
;
3363 UCHAR Reserved0
: 1; // read current state from header.Current
3364 UCHAR prevent_jumper
: 1;
3366 UCHAR Reserved1
: 1;
3367 UCHAR mechtype
: 3; // see Capabilities2 in MODE_CAPABILITIES_PAGE2
3369 } REMOVABLE_MEDIA_DESCRIPTOR
, *PREMOVABLE_MEDIA_DESCRIPTOR
;
3371 // ** FC_MULTIREAD **
3372 // MultiRead descriptor format 0x1d
3373 typedef struct _MULTIREAD_DESCRIPTOR
{
3374 PROFILE_LIST_DESCRIPTOR header
;
3375 } MULTIREAD_DESCRIPTOR
, *PMULTIREAD_DESCRIPTOR
;
3378 // CD-Read descriptor format 0x1e
3379 typedef struct _CD_READ_DESCRIPTOR
{
3380 PROFILE_LIST_DESCRIPTOR header
;
3383 UCHAR c2_pointers
: 1;
3384 UCHAR Reserved2
: 5;
3385 UCHAR DAP
: 1; // DAP bit support in READ_CD/READ_CD_MFS
3388 } CD_READ_DESCRIPTOR
, *PCD_READ_DESCRIPTOR
;
3390 // ** FC_FORMATTABLE **
3391 // Formattable descriptor format 0x23
3392 typedef struct _FORMATTABLE_DESCRIPTOR
{
3393 PROFILE_LIST_DESCRIPTOR header
;
3397 UCHAR Expand
: 1; // Format Type 0x01 (Expand Spare)
3398 UCHAR RENoSA
: 1; // Format Type 0x31 (NoSpare)
3403 UCHAR Reserved3
: 7;
3405 } FORMATTABLE_DESCRIPTOR
, *PFORMATTABLE_DESCRIPTOR
;
3407 // ** FC_CDRW_CAV_WRITE **
3408 // CD-RW CAV descriptor format 0x27
3409 typedef struct _CDRW_CAV_DESCRIPTOR
{
3410 PROFILE_LIST_DESCRIPTOR header
;
3413 } CDRW_CAV_DESCRIPTOR
, *PCDRW_CAV_DESCRIPTOR
;
3416 // MRW descriptor format 0x28
3417 typedef struct _MRW_DESCRIPTOR
{
3418 PROFILE_LIST_DESCRIPTOR header
;
3421 UCHAR Reserved2
: 7;
3423 } MRW_DESCRIPTOR
, *PMRW_DESCRIPTOR
;
3426 // DVD+RW descriptor format
3427 typedef struct _DVDpRW_DESCRIPTOR
{
3428 PROFILE_LIST_DESCRIPTOR header
;
3431 UCHAR Reserved1
: 7;
3433 UCHAR CloseOnly
: 1;
3434 UCHAR QuickStart
: 1;
3435 UCHAR Reserved2
: 6;
3438 } DVDpRW_DESCRIPTOR
, *PDVDpRW_DESCRIPTOR
;
3441 // DVD+R descriptor format
3442 typedef struct _DVDpR_DESCRIPTOR
{
3443 PROFILE_LIST_DESCRIPTOR header
;
3446 UCHAR Reserved2
: 7;
3448 } DVDpR_DESCRIPTOR
, *PDVDpR_DESCRIPTOR
;
3450 // ** FC_DVD_R_RW_WRITE **
3451 // DVD+R/RW writable descriptor format
3452 typedef struct _DVD_R_RW_WRITE_DESCRIPTOR
{
3453 PROFILE_LIST_DESCRIPTOR header
;
3455 UCHAR Reserved1
: 1;
3457 UCHAR TestWrite
: 1;
3458 UCHAR Reserved2
: 3;
3460 UCHAR Reserved3
: 1;
3463 } DVD_R_RW_WRITE_DESCRIPTOR
, *PDVD_R_RW_WRITE_DESCRIPTOR
;
3465 // ** FC_DVDpR_DL **
3466 // DVD+R DL descriptor format
3467 typedef struct _DVDpR_DL_DESCRIPTOR
{
3468 PROFILE_LIST_DESCRIPTOR header
;
3471 UCHAR Reserved2
: 7;
3473 } DVDpR_DL_DESCRIPTOR
, *PDVDpR_DL_DESCRIPTOR
;
3475 // ** FC_REAL_TIME_STREAMING **
3476 // Real-time streaming descriptor format
3477 typedef struct _REAL_TIME_STREAMING_DESCRIPTOR
{
3478 PROFILE_LIST_DESCRIPTOR header
;
3480 UCHAR SW
: 1; // Stream Writing
3481 UCHAR WSPD
: 1; // Write Speed (0x03) in GET_PREFORMANCE supported
3482 UCHAR MP2A
: 1; // Mode page 2a (capabilities) supported
3483 UCHAR SCS
: 1; // Set CD Speed supported
3484 UCHAR RBCB
: 1; // Read Buffer Capacity supported
3488 } REAL_TIME_STREAMING_DESCRIPTOR
, *PREAL_TIME_STREAMING_DESCRIPTOR
;
3491 // BlueRay Read descriptor format 0x40
3492 typedef struct _BD_READ_DESCRIPTOR
{
3493 PROFILE_LIST_DESCRIPTOR header
;
3515 } BD_READ_DESCRIPTOR
, *PBD_READ_DESCRIPTOR
;
3517 // ** FC_BD_WRITE **
3518 // BlueRay Write descriptor format 0x41
3519 typedef struct _BD_WRITE_DESCRIPTOR
{
3520 PROFILE_LIST_DESCRIPTOR header
;
3538 } BD_WRITE_DESCRIPTOR
, *PBD_WRITE_DESCRIPTOR
;
3540 // DVD structure blocks
3542 typedef struct _DVD_DESCRIPTOR_HEADER
{
3545 } DVD_DESCRIPTOR_HEADER
, *PDVD_DESCRIPTOR_HEADER
;
3547 typedef struct _DVD_LAYER_DESCRIPTOR
{
3548 DVD_DESCRIPTOR_HEADER Header
;
3550 UCHAR BookVersion
: 4; // Part Version
3551 UCHAR BookType
: 4; // Disk Category
3553 UCHAR MinimumRate
: 4;
3556 UCHAR LayerType
: 4;
3557 UCHAR TrackPath
: 1;
3558 UCHAR NumberOfLayers
: 2;
3559 UCHAR Reserved1
: 1;
3561 UCHAR TrackDensity
: 4;
3562 UCHAR LinearDensity
: 4;
3564 UCHAR StartingDataSector
[4];
3565 UCHAR EndDataSector
[4];
3566 UCHAR EndLayerZeroSector
[4];
3567 UCHAR Reserved5
: 7;
3570 } DVD_LAYER_DESCRIPTOR
, *PDVD_LAYER_DESCRIPTOR
;
3572 #define DvdBookType_ROM 0
3573 #define DvdBookType_RAM 1
3574 #define DvdBookType_R 2
3575 #define DvdBookType_RW 3
3576 #define DvdBookType_HD_ROM 4
3577 #define DvdBookType_HD_RAM 5
3578 #define DvdBookType_HD_R 6
3579 #define DvdBookType_pRold 8 // old spec ??
3580 #define DvdBookType_pRW 9
3581 #define DvdBookType_pR 0x0a
3582 #define DvdBookType_pRW_DL 0x0d
3583 #define DvdBookType_pR_DL 0x0e
3585 #define DvdDiskSize_120mm 0
3586 #define DvdDiskSize_80mm 1
3588 #define DvdLayerType_ROM 0x01
3589 #define DvdLayerType_R 0x02
3590 #define DvdLayerType_RW 0x04
3592 #define DvdMinimumRate_2_52 0x00
3593 #define DvdMinimumRate_5_04 0x01
3594 #define DvdMinimumRate_10_08 0x02
3595 #define DvdMinimumRate_20_16 0x03
3596 #define DvdMinimumRate_30_24 0x04
3597 #define DvdMinimumRate_NotSpecified 0x0f
3599 typedef struct _DVD_COPYRIGHT_INFORMATION
{
3600 UCHAR CopyrightProtectionSystemType
;
3601 UCHAR RegionManagementInformation
;
3603 } DVD_COPYRIGHT_INFORMATION
, *PDVD_COPYRIGHT_INFORMATION
;
3605 typedef struct _DVD_DISK_KEY_STRUCTURES
{
3606 UCHAR DiskKeyData
[2048];
3607 } DVD_DISK_KEY_STRUCTURES
, *PDVD_DISK_KEY_STRUCTURES
;
3609 typedef struct _CDVD_KEY_HEADER
{
3610 UCHAR DataLength
[2];
3612 } CDVD_KEY_HEADER
, *PCDVD_KEY_HEADER
;
3614 typedef struct _CDVD_REPORT_AGID_DATA
{
3615 CDVD_KEY_HEADER Header
;
3617 UCHAR Reserved2
: 6;
3619 } CDVD_REPORT_AGID_DATA
, *PCDVD_REPORT_AGID_DATA
;
3621 typedef struct _CDVD_CHALLENGE_KEY_DATA
{
3622 CDVD_KEY_HEADER Header
;
3623 UCHAR ChallengeKeyValue
[10];
3625 } CDVD_CHALLENGE_KEY_DATA
, *PCDVD_CHALLENGE_KEY_DATA
;
3627 typedef struct _CDVD_KEY_DATA
{
3628 CDVD_KEY_HEADER Header
;
3631 } CDVD_KEY_DATA
, *PCDVD_KEY_DATA
;
3633 typedef struct _CDVD_REPORT_ASF_DATA
{
3634 CDVD_KEY_HEADER Header
;
3637 UCHAR Reserved2
: 7;
3638 } CDVD_REPORT_ASF_DATA
, *PCDVD_REPORT_ASF_DATA
;
3640 typedef struct _CDVD_TITLE_KEY_HEADER
{
3641 CDVD_KEY_HEADER Header
;
3643 UCHAR Reserved2
: 3;
3648 CDVD_KEY_DATA TitleKey
;
3649 } CDVD_TITLE_KEY_HEADER
, *PCDVD_TITLE_KEY_HEADER
;
3651 typedef struct _DVD_COPYRIGHT_DESCRIPTOR
{
3652 UCHAR CopyrightProtectionType
;
3653 UCHAR RegionManagementInformation
;
3655 } DVD_COPYRIGHT_DESCRIPTOR
, *PDVD_COPYRIGHT_DESCRIPTOR
;
3657 typedef struct _DVD_RPC_KEY
{
3658 UCHAR UserResetsAvailable
:3;
3659 UCHAR ManufacturerResetsAvailable
:3;
3664 } DVD_RPC_KEY
, * PDVD_RPC_KEY
;
3668 #endif //__CDRW_DEVICE_H__