4 * SCSI port and class interface.
6 * This file is part of the w32api package.
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
11 * THIS SOFTWARE IS NOT COPYRIGHTED
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
25 #pragma GCC system_header
37 UCHAR CommandUniqueBits : 4;
38 UCHAR LogicalUnitNumber : 3;
39 UCHAR CommandUniqueBytes[3];
43 UCHAR VendorUnique : 2;
44 } CDB6GENERIC, *PCDB6GENERIC;
46 struct _CDB6READWRITE {
48 UCHAR LogicalBlockMsb1 : 5;
49 UCHAR LogicalUnitNumber : 3;
50 UCHAR LogicalBlockMsb0;
51 UCHAR LogicalBlockLsb;
54 } CDB6READWRITE, *PCDB6READWRITE;
59 UCHAR LogicalUnitNumber : 3;
62 UCHAR AllocationLength;
64 } CDB6INQUIRY, *PCDB6INQUIRY;
66 struct _CDB6INQUIRY3 {
68 UCHAR EnableVitalProductData : 1;
69 UCHAR CommandSupportData : 1;
73 UCHAR AllocationLength;
75 } CDB6INQUIRY3, *PCDB6INQUIRY3;
80 UCHAR ByteCompare : 1;
83 UCHAR LogicalUnitNumber : 3;
84 UCHAR VerificationLength[3];
86 } CDB6VERIFY, *PCDB6VERIFY;
90 UCHAR FormatControl : 5;
91 UCHAR LogicalUnitNumber : 3;
96 } CDB6FORMAT, *PCDB6FORMAT;
100 UCHAR RelativeAddress : 1;
102 UCHAR ForceUnitAccess : 1;
103 UCHAR DisablePageOut : 1;
104 UCHAR LogicalUnitNumber : 3;
105 UCHAR LogicalBlockByte0;
106 UCHAR LogicalBlockByte1;
107 UCHAR LogicalBlockByte2;
108 UCHAR LogicalBlockByte3;
110 UCHAR TransferBlocksMsb;
111 UCHAR TransferBlocksLsb;
117 UCHAR RelativeAddress : 1;
119 UCHAR ForceUnitAccess : 1;
120 UCHAR DisablePageOut : 1;
121 UCHAR LogicalUnitNumber : 3;
122 UCHAR LogicalBlock[4];
123 UCHAR TransferLength[4];
128 struct _PAUSE_RESUME {
131 UCHAR LogicalUnitNumber : 3;
135 } PAUSE_RESUME, *PPAUSE_RESUME;
142 UCHAR LogicalUnitNumber : 3;
147 UCHAR AllocationLength[2];
150 } READ_TOC, *PREAD_TOC;
152 struct _READ_DISK_INFORMATION {
157 UCHAR AllocationLength[2];
159 } READ_DISK_INFORMATION, *PREAD_DISK_INFORMATION;
161 struct _READ_TRACK_INFORMATION {
167 UCHAR BlockAddress[4];
169 UCHAR AllocationLength[2];
171 } READ_TRACK_INFORMATION, *PREAD_TRACK_INFORMATION;
173 struct _RESERVE_TRACK_RZONE {
176 UCHAR ReservationSize[4];
178 } RESERVE_TRACK_RZONE, *PRESERVE_TRACK_RZONE;
180 struct _SEND_OPC_INFORMATION {
185 UCHAR ParameterListLength[2];
187 } SEND_OPC_INFORMATION, *PSEND_OPC_INFORMATION;
189 struct _CLOSE_TRACK {
197 UCHAR TrackNumber[2];
200 } CLOSE_TRACK, *PCLOSE_TRACK;
202 struct _SEND_CUE_SHEET {
205 UCHAR CueSheetSize[3];
207 } SEND_CUE_SHEET, *PSEND_CUE_SHEET;
209 struct _READ_HEADER {
215 UCHAR LogicalBlockAddress[4];
217 UCHAR AllocationLength[2];
219 } READ_HEADER, *PREAD_HEADER;
224 UCHAR LogicalUnitNumber : 3;
225 UCHAR StartingBlockAddress[4];
229 } PLAY_AUDIO, *PPLAY_AUDIO;
231 struct _PLAY_AUDIO_MSF {
234 UCHAR LogicalUnitNumber : 3;
243 } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF;
245 /* FIXME: Should the union be anonymous in C++ too? If so,
246 can't define named types _LBA and _MSF within anonymous union
252 UCHAR ExpectedSectorType : 3;
259 UCHAR StartingBlockAddress[4];
286 } PLAY_CD, *PPLAY_CD;
290 UCHAR RelativeAddress : 1;
294 UCHAR StartingAddress[4];
300 } SCAN_CD, *PSCAN_CD;
302 struct _STOP_PLAY_SCAN {
308 } STOP_PLAY_SCAN, *PSTOP_PLAY_SCAN;
315 UCHAR LogicalUnitNumber : 3;
322 UCHAR AllocationLength[2];
324 } SUBCHANNEL, *PSUBCHANNEL;
328 UCHAR RelativeAddress : 1;
330 UCHAR ExpectedSectorType : 3;
332 UCHAR StartingLBA[4];
333 UCHAR TransferBlocks[3];
335 UCHAR ErrorFlags : 2;
336 UCHAR IncludeEDC : 1;
337 UCHAR IncludeUserData : 1;
338 UCHAR HeaderCode : 2;
339 UCHAR IncludeSyncData : 1;
340 UCHAR SubChannelSelection : 3;
343 } READ_CD, *PREAD_CD;
345 struct _READ_CD_MSF {
347 UCHAR RelativeAddress : 1;
349 UCHAR ExpectedSectorType : 3;
360 UCHAR ErrorFlags : 2;
361 UCHAR IncludeEDC : 1;
362 UCHAR IncludeUserData : 1;
363 UCHAR HeaderCode : 2;
364 UCHAR IncludeSyncData : 1;
365 UCHAR SubChannelSelection : 3;
368 } READ_CD_MSF, *PREAD_CD_MSF;
370 struct _PLXTR_READ_CDDA {
373 UCHAR LogicalUnitNumber : 3;
374 UCHAR LogicalBlockByte0;
375 UCHAR LogicalBlockByte1;
376 UCHAR LogicalBlockByte2;
377 UCHAR LogicalBlockByte3;
378 UCHAR TransferBlockByte0;
379 UCHAR TransferBlockByte1;
380 UCHAR TransferBlockByte2;
381 UCHAR TransferBlockByte3;
384 } PLXTR_READ_CDDA, *PPLXTR_READ_CDDA;
386 struct _NEC_READ_CDDA {
389 UCHAR LogicalBlockByte0;
390 UCHAR LogicalBlockByte1;
391 UCHAR LogicalBlockByte2;
392 UCHAR LogicalBlockByte3;
394 UCHAR TransferBlockByte0;
395 UCHAR TransferBlockByte1;
397 } NEC_READ_CDDA, *PNEC_READ_CDDA;
404 UCHAR LogicalUnitNumber : 3;
408 UCHAR AllocationLength;
410 } MODE_SENSE, *PMODE_SENSE;
412 struct _MODE_SENSE10 {
417 UCHAR LogicalUnitNumber : 3;
421 UCHAR AllocationLength[2];
423 } MODE_SENSE10, *PMODE_SENSE10;
425 struct _MODE_SELECT {
430 UCHAR LogicalUnitNumber : 3;
432 UCHAR ParameterListLength;
434 } MODE_SELECT, *PMODE_SELECT;
436 struct _MODE_SELECT10 {
441 UCHAR LogicalUnitNumber : 3;
443 UCHAR ParameterListLength[2];
445 } MODE_SELECT10, *PMODE_SELECT10;
453 UCHAR LogicalUnitNumber : 3;
455 UCHAR LogicalBlockAddress[4];
466 UCHAR LogicalUnitNumber : 3;
471 UCHAR ParameterPointer[2];
472 UCHAR AllocationLength[2];
474 } LOGSENSE, *PLOGSENSE;
481 UCHAR LogicalUnitNumber : 3;
485 UCHAR ParameterListLength[2];
487 } LOGSELECT, *PLOGSELECT;
492 UCHAR LogicalUnitNumber : 3;
493 UCHAR TransferLength[3];
500 UCHAR LogicalUnitNumber : 3;
501 UCHAR LogicalBlockAddress[4];
511 UCHAR LogicalUnitNumber : 3;
520 UCHAR LogicalUnitNumber : 3;
526 } START_STOP, *PSTART_STOP;
528 struct _MEDIA_REMOVAL {
531 UCHAR LogicalUnitNumber : 3;
535 UCHAR Persistant : 1;
539 } MEDIA_REMOVAL, *PMEDIA_REMOVAL;
545 UCHAR BlockAddress[3];
549 UCHAR VendorUnique : 2;
550 } SEEK_BLOCK, *PSEEK_BLOCK;
552 struct _REQUEST_BLOCK_ADDRESS {
555 UCHAR AllocationLength;
559 UCHAR VendorUnique : 2;
560 } REQUEST_BLOCK_ADDRESS, *PREQUEST_BLOCK_ADDRESS;
566 UCHAR PartitionSelect : 6;
569 } PARTITION, *PPARTITION;
571 struct _WRITE_TAPE_MARKS {
574 UCHAR WriteSetMarks: 1;
576 UCHAR LogicalUnitNumber : 3;
577 UCHAR TransferLength[3];
579 } WRITE_TAPE_MARKS, *PWRITE_TAPE_MARKS;
581 struct _SPACE_TAPE_MARKS {
585 UCHAR LogicalUnitNumber : 3;
595 UCHAR VendorUnique : 2;
598 } SPACE_TAPE_MARKS, *PSPACE_TAPE_MARKS;
600 struct _READ_POSITION {
607 } READ_POSITION, *PREAD_POSITION;
609 struct _CDB6READWRITETAPE {
611 UCHAR VendorSpecific : 5;
613 UCHAR TransferLenMSB;
615 UCHAR TransferLenLSB;
619 UCHAR VendorUnique : 2;
620 } CDB6READWRITETAPE, *PCDB6READWRITETAPE;
622 struct _INIT_ELEMENT_STATUS {
625 UCHAR LogicalUnitNubmer : 3;
629 } INIT_ELEMENT_STATUS, *PINIT_ELEMENT_STATUS;
631 struct _INITIALIZE_ELEMENT_RANGE {
635 UCHAR LogicalUnitNubmer : 3;
636 UCHAR FirstElementAddress[2];
638 UCHAR NumberOfElements[2];
642 } INITIALIZE_ELEMENT_RANGE, *PINITIALIZE_ELEMENT_RANGE;
644 struct _POSITION_TO_ELEMENT {
647 UCHAR LogicalUnitNumber : 3;
648 UCHAR TransportElementAddress[2];
649 UCHAR DestinationElementAddress[2];
654 } POSITION_TO_ELEMENT, *PPOSITION_TO_ELEMENT;
656 struct _MOVE_MEDIUM {
659 UCHAR LogicalUnitNumber : 3;
660 UCHAR TransportElementAddress[2];
661 UCHAR SourceElementAddress[2];
662 UCHAR DestinationElementAddress[2];
667 } MOVE_MEDIUM, *PMOVE_MEDIUM;
669 struct _EXCHANGE_MEDIUM {
672 UCHAR LogicalUnitNumber : 3;
673 UCHAR TransportElementAddress[2];
674 UCHAR SourceElementAddress[2];
675 UCHAR Destination1ElementAddress[2];
676 UCHAR Destination2ElementAddress[2];
681 } EXCHANGE_MEDIUM, *PEXCHANGE_MEDIUM;
683 struct _READ_ELEMENT_STATUS {
685 UCHAR ElementType : 4;
687 UCHAR LogicalUnitNumber : 3;
688 UCHAR StartingElementAddress[2];
689 UCHAR NumberOfElements[2];
691 UCHAR AllocationLength[3];
694 } READ_ELEMENT_STATUS, *PREAD_ELEMENT_STATUS;
696 struct _SEND_VOLUME_TAG {
698 UCHAR ElementType : 4;
700 UCHAR LogicalUnitNumber : 3;
701 UCHAR StartingElementAddress[2];
703 UCHAR ActionCode : 5;
706 UCHAR ParameterListLength[2];
709 } SEND_VOLUME_TAG, *PSEND_VOLUME_TAG;
711 struct _REQUEST_VOLUME_ELEMENT_ADDRESS {
713 UCHAR ElementType : 4;
715 UCHAR LogicalUnitNumber : 3;
716 UCHAR StartingElementAddress[2];
717 UCHAR NumberElements[2];
719 UCHAR AllocationLength[3];
722 } REQUEST_VOLUME_ELEMENT_ADDRESS, *PREQUEST_VOLUME_ELEMENT_ADDRESS;
724 struct _LOAD_UNLOAD {
736 } LOAD_UNLOAD, *PLOAD_UNLOAD;
738 struct _MECH_STATUS {
743 UCHAR AllocationLength[2];
746 } MECH_STATUS, *PMECH_STATUS;
748 struct _SYNCHRONIZE_CACHE10 {
757 UCHAR LogicalBlockAddress[4];
761 } SYNCHRONIZE_CACHE10, *PSYNCHRONIZE_CACHE10;
763 struct _GET_EVENT_STATUS_NOTIFICATION {
771 UCHAR NotificationClassRequest;
773 UCHAR EventListLength[2];
776 } GET_EVENT_STATUS_NOTIFICATION, *PGET_EVENT_STATUS_NOTIFICATION;
778 struct _READ_DVD_STRUCTURE {
782 UCHAR RMDBlockNumber[4];
785 UCHAR AllocationLength[2];
789 } READ_DVD_STRUCTURE, *PREAD_DVD_STRUCTURE;
791 struct _SEND_DVD_STRUCTURE {
797 UCHAR ParameterListLength[2];
800 } SEND_DVD_STRUCTURE, *PSEND_DVD_STRUCTURE;
807 UCHAR ParameterListLength[2];
811 } SEND_KEY, *PSEND_KEY;
817 UCHAR LogicalBlockAddress[4];
819 UCHAR AllocationLength[2];
823 } REPORT_KEY, *PREPORT_KEY;
825 struct _SET_READ_AHEAD {
830 UCHAR ReadAheadLBA[4];
833 } SET_READ_AHEAD, *PSET_READ_AHEAD;
835 struct _READ_FORMATTED_CAPACITIES {
840 UCHAR AllocationLength[2];
842 } READ_FORMATTED_CAPACITIES, *PREAD_FORMATTED_CAPACITIES;
844 struct _REPORT_LUNS {
847 UCHAR AllocationLength[4];
850 } REPORT_LUNS, *PREPORT_LUNS;
852 struct _PERSISTENT_RESERVE_IN {
854 UCHAR ServiceAction : 5;
857 UCHAR AllocationLength[2];
859 } PERSISTENT_RESERVE_IN, *PPERSISTENT_RESERVE_IN;
861 struct _PERSISTENT_RESERVE_OUT {
863 UCHAR ServiceAction : 5;
868 UCHAR ParameterListLength[2];
870 } PERSISTENT_RESERVE_OUT, *PPERSISTENT_RESERVE_OUT;
872 struct _GET_CONFIGURATION {
874 UCHAR RequestType : 1;
876 UCHAR StartingFeature[2];
878 UCHAR AllocationLength[2];
880 } GET_CONFIGURATION, *PGET_CONFIGURATION;
882 struct _SET_CD_SPEED {
889 } SET_CD_SPEED, *PSET_CD_SPEED;
895 #ifndef _INQUIRYDATA_DEFINED /* also in minitape.h */
896 #define _INQUIRYDATA_DEFINED
898 #define INQUIRYDATABUFFERSIZE 36
900 typedef struct _INQUIRYDATA {
901 UCHAR DeviceType : 5;
902 UCHAR DeviceTypeQualifier : 3;
903 UCHAR DeviceTypeModifier : 7;
904 UCHAR RemovableMedia : 1;
905 _ANONYMOUS_UNION union {
907 _ANONYMOUS_STRUCT struct {
908 UCHAR ANSIVersion : 3;
909 UCHAR ECMAVersion : 3;
910 UCHAR ISOVersion : 2;
913 UCHAR ResponseDataFormat : 4;
916 UCHAR TerminateTask : 1;
918 UCHAR AdditionalLength;
923 UCHAR MediumChanger : 1;
925 UCHAR ReservedBit2 : 1;
926 UCHAR EnclosureServices : 1;
927 UCHAR ReservedBit3 : 1;
929 UCHAR CommandQueue : 1;
930 UCHAR TransferDisable : 1;
931 UCHAR LinkedCommands : 1;
932 UCHAR Synchronous : 1;
935 UCHAR RelativeAddressing : 1;
938 UCHAR ProductRevisionLevel[4];
939 UCHAR VendorSpecific[20];
941 } INQUIRYDATA, *PINQUIRYDATA;
944 /* INQUIRYDATA.DeviceType constants */
945 #define DIRECT_ACCESS_DEVICE 0x00
946 #define SEQUENTIAL_ACCESS_DEVICE 0x01
947 #define PRINTER_DEVICE 0x02
948 #define PROCESSOR_DEVICE 0x03
949 #define WRITE_ONCE_READ_MULTIPLE_DEVICE 0x04
950 #define READ_ONLY_DIRECT_ACCESS_DEVICE 0x05
951 #define SCANNER_DEVICE 0x06
952 #define OPTICAL_DEVICE 0x07
953 #define MEDIUM_CHANGER 0x08
954 #define COMMUNICATION_DEVICE 0x09
955 #define LOGICAL_UNIT_NOT_PRESENT_DEVICE 0x7F
956 #define DEVICE_QUALIFIER_NOT_SUPPORTED 0x03
958 /* INQUIRYDATA.DeviceTypeQualifier constants */
959 #define DEVICE_CONNECTED 0x00
961 #define SCSISTAT_GOOD 0x00
962 #define SCSISTAT_CHECK_CONDITION 0x02
963 #define SCSISTAT_CONDITION_MET 0x04
964 #define SCSISTAT_BUSY 0x08
965 #define SCSISTAT_INTERMEDIATE 0x10
966 #define SCSISTAT_INTERMEDIATE_COND_MET 0x14
967 #define SCSISTAT_RESERVATION_CONFLICT 0x18
968 #define SCSISTAT_COMMAND_TERMINATED 0x22
969 #define SCSISTAT_QUEUE_FULL 0x28
971 /* Mode Sense/Select page constants */
972 #define MODE_PAGE_ERROR_RECOVERY 0x01
973 #define MODE_PAGE_DISCONNECT 0x02
974 #define MODE_PAGE_FORMAT_DEVICE 0x03
975 #define MODE_PAGE_RIGID_GEOMETRY 0x04
976 #define MODE_PAGE_FLEXIBILE 0x05
977 #define MODE_PAGE_WRITE_PARAMETERS 0x05
978 #define MODE_PAGE_VERIFY_ERROR 0x07
979 #define MODE_PAGE_CACHING 0x08
980 #define MODE_PAGE_PERIPHERAL 0x09
981 #define MODE_PAGE_CONTROL 0x0A
982 #define MODE_PAGE_MEDIUM_TYPES 0x0B
983 #define MODE_PAGE_NOTCH_PARTITION 0x0C
984 #define MODE_PAGE_CD_AUDIO_CONTROL 0x0E
985 #define MODE_PAGE_DATA_COMPRESS 0x0F
986 #define MODE_PAGE_DEVICE_CONFIG 0x10
987 #define MODE_PAGE_MEDIUM_PARTITION 0x11
988 #define MODE_PAGE_CDVD_FEATURE_SET 0x18
989 #define MODE_PAGE_POWER_CONDITION 0x1A
990 #define MODE_PAGE_FAULT_REPORTING 0x1C
991 #define MODE_PAGE_CDVD_INACTIVITY 0x1D
992 #define MODE_PAGE_ELEMENT_ADDRESS 0x1D
993 #define MODE_PAGE_TRANSPORT_GEOMETRY 0x1E
994 #define MODE_PAGE_DEVICE_CAPABILITIES 0x1F
995 #define MODE_PAGE_CAPABILITIES 0x2A
996 #define MODE_SENSE_RETURN_ALL 0x3f
997 #define MODE_SENSE_CURRENT_VALUES 0x00
998 #define MODE_SENSE_CHANGEABLE_VALUES 0x40
999 #define MODE_SENSE_DEFAULT_VAULES 0x80
1000 #define MODE_SENSE_SAVED_VALUES 0xc0
1002 /* SCSI CDB operation codes */
1003 #define SCSIOP_TEST_UNIT_READY 0x00
1004 #define SCSIOP_REZERO_UNIT 0x01
1005 #define SCSIOP_REWIND 0x01
1006 #define SCSIOP_REQUEST_BLOCK_ADDR 0x02
1007 #define SCSIOP_REQUEST_SENSE 0x03
1008 #define SCSIOP_FORMAT_UNIT 0x04
1009 #define SCSIOP_READ_BLOCK_LIMITS 0x05
1010 #define SCSIOP_REASSIGN_BLOCKS 0x07
1011 #define SCSIOP_INIT_ELEMENT_STATUS 0x07
1012 #define SCSIOP_READ6 0x08
1013 #define SCSIOP_RECEIVE 0x08
1014 #define SCSIOP_WRITE6 0x0A
1015 #define SCSIOP_PRINT 0x0A
1016 #define SCSIOP_SEND 0x0A
1017 #define SCSIOP_SEEK6 0x0B
1018 #define SCSIOP_TRACK_SELECT 0x0B
1019 #define SCSIOP_SLEW_PRINT 0x0B
1020 #define SCSIOP_SEEK_BLOCK 0x0C
1021 #define SCSIOP_PARTITION 0x0D
1022 #define SCSIOP_READ_REVERSE 0x0F
1023 #define SCSIOP_WRITE_FILEMARKS 0x10
1024 #define SCSIOP_FLUSH_BUFFER 0x10
1025 #define SCSIOP_SPACE 0x11
1026 #define SCSIOP_INQUIRY 0x12
1027 #define SCSIOP_VERIFY6 0x13
1028 #define SCSIOP_RECOVER_BUF_DATA 0x14
1029 #define SCSIOP_MODE_SELECT 0x15
1030 #define SCSIOP_RESERVE_UNIT 0x16
1031 #define SCSIOP_RELEASE_UNIT 0x17
1032 #define SCSIOP_COPY 0x18
1033 #define SCSIOP_ERASE 0x19
1034 #define SCSIOP_MODE_SENSE 0x1A
1035 #define SCSIOP_START_STOP_UNIT 0x1B
1036 #define SCSIOP_STOP_PRINT 0x1B
1037 #define SCSIOP_LOAD_UNLOAD 0x1B
1038 #define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C
1039 #define SCSIOP_SEND_DIAGNOSTIC 0x1D
1040 #define SCSIOP_MEDIUM_REMOVAL 0x1E
1042 #define SCSIOP_READ_FORMATTED_CAPACITY 0x23
1043 #define SCSIOP_READ_CAPACITY 0x25
1044 #define SCSIOP_READ 0x28
1045 #define SCSIOP_WRITE 0x2A
1046 #define SCSIOP_SEEK 0x2B
1047 #define SCSIOP_LOCATE 0x2B
1048 #define SCSIOP_POSITION_TO_ELEMENT 0x2B
1049 #define SCSIOP_WRITE_VERIFY 0x2E
1050 #define SCSIOP_VERIFY 0x2F
1051 #define SCSIOP_SEARCH_DATA_HIGH 0x30
1052 #define SCSIOP_SEARCH_DATA_EQUAL 0x31
1053 #define SCSIOP_SEARCH_DATA_LOW 0x32
1054 #define SCSIOP_SET_LIMITS 0x33
1055 #define SCSIOP_READ_POSITION 0x34
1056 #define SCSIOP_SYNCHRONIZE_CACHE 0x35
1057 #define SCSIOP_COMPARE 0x39
1058 #define SCSIOP_COPY_COMPARE 0x3A
1059 #define SCSIOP_WRITE_DATA_BUFF 0x3B
1060 #define SCSIOP_READ_DATA_BUFF 0x3C
1061 #define SCSIOP_CHANGE_DEFINITION 0x40
1062 #define SCSIOP_READ_SUB_CHANNEL 0x42
1063 #define SCSIOP_READ_TOC 0x43
1064 #define SCSIOP_READ_HEADER 0x44
1065 #define SCSIOP_PLAY_AUDIO 0x45
1066 #define SCSIOP_GET_CONFIGURATION 0x46
1067 #define SCSIOP_PLAY_AUDIO_MSF 0x47
1068 #define SCSIOP_PLAY_TRACK_INDEX 0x48
1069 #define SCSIOP_PLAY_TRACK_RELATIVE 0x49
1070 #define SCSIOP_GET_EVENT_STATUS 0x4A
1071 #define SCSIOP_PAUSE_RESUME 0x4B
1072 #define SCSIOP_LOG_SELECT 0x4C
1073 #define SCSIOP_LOG_SENSE 0x4D
1074 #define SCSIOP_STOP_PLAY_SCAN 0x4E
1075 #define SCSIOP_READ_DISK_INFORMATION 0x51
1076 #define SCSIOP_READ_TRACK_INFORMATION 0x52
1077 #define SCSIOP_RESERVE_TRACK_RZONE 0x53
1078 #define SCSIOP_SEND_OPC_INFORMATION 0x54
1079 #define SCSIOP_MODE_SELECT10 0x55
1080 #define SCSIOP_MODE_SENSE10 0x5A
1081 #define SCSIOP_CLOSE_TRACK_SESSION 0x5B
1082 #define SCSIOP_READ_BUFFER_CAPACITY 0x5C
1083 #define SCSIOP_SEND_CUE_SHEET 0x5D
1084 #define SCSIOP_PERSISTENT_RESERVE_IN 0x5E
1085 #define SCSIOP_PERSISTENT_RESERVE_OUT 0x5F
1087 #define SCSIOP_REPORT_LUNS 0xA0
1088 #define SCSIOP_BLANK 0xA1
1089 #define SCSIOP_SEND_KEY 0xA3
1090 #define SCSIOP_REPORT_KEY 0xA4
1091 #define SCSIOP_MOVE_MEDIUM 0xA5
1092 #define SCSIOP_LOAD_UNLOAD_SLOT 0xA6
1093 #define SCSIOP_EXCHANGE_MEDIUM 0xA6
1094 #define SCSIOP_SET_READ_AHEAD 0xA7
1095 #define SCSIOP_READ_DVD_STRUCTURE 0xAD
1096 #define SCSIOP_REQUEST_VOL_ELEMENT 0xB5
1097 #define SCSIOP_SEND_VOLUME_TAG 0xB6
1098 #define SCSIOP_READ_ELEMENT_STATUS 0xB8
1099 #define SCSIOP_READ_CD_MSF 0xB9
1100 #define SCSIOP_SCAN_CD 0xBA
1101 #define SCSIOP_SET_CD_SPEED 0xBB
1102 #define SCSIOP_PLAY_CD 0xBC
1103 #define SCSIOP_MECHANISM_STATUS 0xBD
1104 #define SCSIOP_READ_CD 0xBE
1105 #define SCSIOP_SEND_DVD_STRUCTURE 0xBF
1106 #define SCSIOP_INIT_ELEMENT_RANGE 0xE7
1108 #define SCSIOP_DENON_EJECT_DISC 0xE6
1109 #define SCSIOP_DENON_STOP_AUDIO 0xE7
1110 #define SCSIOP_DENON_PLAY_AUDIO 0xE8
1111 #define SCSIOP_DENON_READ_TOC 0xE9
1112 #define SCSIOP_DENON_READ_SUBCODE 0xEB
1114 #define SCSIMESS_MODIFY_DATA_POINTER 0x00
1115 #define SCSIMESS_SYNCHRONOUS_DATA_REQ 0x01
1116 #define SCSIMESS_WIDE_DATA_REQUEST 0x03
1118 #define SCSIMESS_MODIFY_DATA_LENGTH 5
1119 #define SCSIMESS_SYNCH_DATA_LENGTH 3
1120 #define SCSIMESS_WIDE_DATA_LENGTH 2
1122 #define SCSIMESS_ABORT 0x06
1123 #define SCSIMESS_ABORT_WITH_TAG 0x0D
1124 #define SCSIMESS_BUS_DEVICE_RESET 0x0C
1125 #define SCSIMESS_CLEAR_QUEUE 0x0E
1126 #define SCSIMESS_COMMAND_COMPLETE 0x00
1127 #define SCSIMESS_DISCONNECT 0x04
1128 #define SCSIMESS_EXTENDED_MESSAGE 0x01
1129 #define SCSIMESS_IDENTIFY 0x80
1130 #define SCSIMESS_IDENTIFY_WITH_DISCON 0xC0
1131 #define SCSIMESS_IGNORE_WIDE_RESIDUE 0x23
1132 #define SCSIMESS_INITIATE_RECOVERY 0x0F
1133 #define SCSIMESS_INIT_DETECTED_ERROR 0x05
1134 #define SCSIMESS_LINK_CMD_COMP 0x0A
1135 #define SCSIMESS_LINK_CMD_COMP_W_FLAG 0x0B
1136 #define SCSIMESS_MESS_PARITY_ERROR 0x09
1137 #define SCSIMESS_MESSAGE_REJECT 0x07
1138 #define SCSIMESS_NO_OPERATION 0x08
1139 #define SCSIMESS_HEAD_OF_QUEUE_TAG 0x21
1140 #define SCSIMESS_ORDERED_QUEUE_TAG 0x22
1141 #define SCSIMESS_SIMPLE_QUEUE_TAG 0x20
1142 #define SCSIMESS_RELEASE_RECOVERY 0x10
1143 #define SCSIMESS_RESTORE_POINTERS 0x03
1144 #define SCSIMESS_SAVE_DATA_POINTER 0x02
1145 #define SCSIMESS_TERMINATE_IO_PROCESS 0x11
1147 #define CDB_FORCE_MEDIA_ACCESS 0x08
1149 #define CDB_RETURN_ON_COMPLETION 0
1150 #define CDB_RETURN_IMMEDIATE 1
1152 #define CDB_INQUIRY_EVPD 0x01
1154 #define LUN0_FORMAT_SAVING_DEFECT_LIST 0
1155 #define USE_DEFAULTMSB 0
1156 #define USE_DEFAULTLSB 0
1158 #define START_UNIT_CODE 0x01
1159 #define STOP_UNIT_CODE 0x00
1161 typedef struct _SENSE_DATA {
1162 UCHAR ErrorCode : 7;
1164 UCHAR SegmentNumber;
1167 UCHAR IncorrectLength : 1;
1168 UCHAR EndOfMedia : 1;
1170 UCHAR Information[4];
1171 UCHAR AdditionalSenseLength;
1172 UCHAR CommandSpecificInformation[4];
1173 UCHAR AdditionalSenseCode;
1174 UCHAR AdditionalSenseCodeQualifier;
1175 UCHAR FieldReplaceableUnitCode;
1176 UCHAR SenseKeySpecific[3];
1177 } SENSE_DATA, *PSENSE_DATA;
1179 #define SENSE_BUFFER_SIZE 18
1182 #define SCSI_SENSE_NO_SENSE 0x00
1183 #define SCSI_SENSE_RECOVERED_ERROR 0x01
1184 #define SCSI_SENSE_NOT_READY 0x02
1185 #define SCSI_SENSE_MEDIUM_ERROR 0x03
1186 #define SCSI_SENSE_HARDWARE_ERROR 0x04
1187 #define SCSI_SENSE_ILLEGAL_REQUEST 0x05
1188 #define SCSI_SENSE_UNIT_ATTENTION 0x06
1189 #define SCSI_SENSE_DATA_PROTECT 0x07
1190 #define SCSI_SENSE_BLANK_CHECK 0x08
1191 #define SCSI_SENSE_UNIQUE 0x09
1192 #define SCSI_SENSE_COPY_ABORTED 0x0A
1193 #define SCSI_SENSE_ABORTED_COMMAND 0x0B
1194 #define SCSI_SENSE_EQUAL 0x0C
1195 #define SCSI_SENSE_VOL_OVERFLOW 0x0D
1196 #define SCSI_SENSE_MISCOMPARE 0x0E
1197 #define SCSI_SENSE_RESERVED 0x0F
1199 /* Additional tape bit */
1200 #define SCSI_ILLEGAL_LENGTH 0x20
1201 #define SCSI_EOM 0x40
1202 #define SCSI_FILE_MARK 0x80
1204 /* Additional Sense codes */
1205 #define SCSI_ADSENSE_NO_SENSE 0x00
1206 #define SCSI_ADSENSE_NO_SEEK_COMPLETE 0x02
1207 #define SCSI_ADSENSE_LUN_NOT_READY 0x04
1208 #define SCSI_ADSENSE_WRITE_ERROR 0x0C
1209 #define SCSI_ADSENSE_TRACK_ERROR 0x14
1210 #define SCSI_ADSENSE_SEEK_ERROR 0x15
1211 #define SCSI_ADSENSE_REC_DATA_NOECC 0x17
1212 #define SCSI_ADSENSE_REC_DATA_ECC 0x18
1213 #define SCSI_ADSENSE_ILLEGAL_COMMAND 0x20
1214 #define SCSI_ADSENSE_ILLEGAL_BLOCK 0x21
1215 #define SCSI_ADSENSE_INVALID_CDB 0x24
1216 #define SCSI_ADSENSE_INVALID_LUN 0x25
1217 #define SCSI_ADSENSE_WRITE_PROTECT 0x27
1218 #define SCSI_ADSENSE_MEDIUM_CHANGED 0x28
1219 #define SCSI_ADSENSE_BUS_RESET 0x29
1220 #define SCSI_ADSENSE_INSUFFICIENT_TIME_FOR_OPERATION 0x2E
1221 #define SCSI_ADSENSE_INVALID_MEDIA 0x30
1222 #define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE 0x3a
1223 #define SCSI_ADSENSE_POSITION_ERROR 0x3b
1224 #define SCSI_ADSENSE_OPERATOR_REQUEST 0x5a
1225 #define SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5d
1226 #define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK 0x64
1227 #define SCSI_ADSENSE_COPY_PROTECTION_FAILURE 0x6f
1228 #define SCSI_ADSENSE_POWER_CALIBRATION_ERROR 0x73
1229 #define SCSI_ADSENSE_VENDOR_UNIQUE 0x80
1230 #define SCSI_ADSENSE_MUSIC_AREA 0xA0
1231 #define SCSI_ADSENSE_DATA_AREA 0xA1
1232 #define SCSI_ADSENSE_VOLUME_OVERFLOW 0xA7
1234 #define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE 0x00
1235 #define SCSI_SENSEQ_BECOMING_READY 0x01
1236 #define SCSI_SENSEQ_INIT_COMMAND_REQUIRED 0x02
1237 #define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED 0x03
1238 #define SCSI_SENSEQ_FORMAT_IN_PROGRESS 0x04
1239 #define SCSI_SENSEQ_REBUILD_IN_PROGRESS 0x05
1240 #define SCSI_SENSEQ_RECALCULATION_IN_PROGRESS 0x06
1241 #define SCSI_SENSEQ_OPERATION_IN_PROGRESS 0x07
1242 #define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS 0x08
1243 #define SCSI_SENSEQ_LOSS_OF_STREAMING 0x09
1244 #define SCSI_SENSEQ_PADDING_BLOCKS_ADDED 0x0A
1247 #define FILE_DEVICE_SCSI 0x0000001b
1249 #define IOCTL_SCSI_EXECUTE_IN ((FILE_DEVICE_SCSI << 16) + 0x0011)
1250 #define IOCTL_SCSI_EXECUTE_OUT ((FILE_DEVICE_SCSI << 16) + 0x0012)
1251 #define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013)
1253 /* SMART support in ATAPI */
1254 #define IOCTL_SCSI_MINIPORT_SMART_VERSION ((FILE_DEVICE_SCSI << 16) + 0x0500)
1255 #define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501)
1256 #define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS ((FILE_DEVICE_SCSI << 16) + 0x0502)
1257 #define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS ((FILE_DEVICE_SCSI << 16) + 0x0503)
1258 #define IOCTL_SCSI_MINIPORT_ENABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0504)
1259 #define IOCTL_SCSI_MINIPORT_DISABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0505)
1260 #define IOCTL_SCSI_MINIPORT_RETURN_STATUS ((FILE_DEVICE_SCSI << 16) + 0x0506)
1261 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE ((FILE_DEVICE_SCSI << 16) + 0x0507)
1262 #define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES ((FILE_DEVICE_SCSI << 16) + 0x0508)
1263 #define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS ((FILE_DEVICE_SCSI << 16) + 0x0509)
1264 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTO_OFFLINE ((FILE_DEVICE_SCSI << 16) + 0x050a)
1265 #define IOCTL_SCSI_MINIPORT_READ_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050b)
1266 #define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050c)
1268 /* CLUSTER support */
1269 #define IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0520)
1270 #define IOCTL_SCSI_MINIPORT_NOT_CLUSTER_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0521)
1272 /* READ_TOC formats */
1273 #define READ_TOC_FORMAT_TOC 0x00
1274 #define READ_TOC_FORMAT_SESSION 0x01
1275 #define READ_TOC_FORMAT_FULL_TOC 0x02
1276 #define READ_TOC_FORMAT_PMA 0x03
1277 #define READ_TOC_FORMAT_ATIP 0x04
1279 /* Read Capacity Data. Returned in Big Endian format */
1280 typedef struct _READ_CAPACITY_DATA {
1281 ULONG LogicalBlockAddress;
1282 ULONG BytesPerBlock;
1283 } READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
1285 /* Read Block Limits Data. Returned in Big Endian format */
1286 typedef struct _READ_BLOCK_LIMITS {
1288 UCHAR BlockMaximumSize[3];
1289 UCHAR BlockMinimumSize[2];
1290 } READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA;
1293 typedef struct _MODE_PARAMETER_HEADER {
1294 UCHAR ModeDataLength;
1296 UCHAR DeviceSpecificParameter;
1297 UCHAR BlockDescriptorLength;
1298 }MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
1300 typedef struct _MODE_PARAMETER_HEADER10 {
1301 UCHAR ModeDataLength[2];
1303 UCHAR DeviceSpecificParameter;
1305 UCHAR BlockDescriptorLength[2];
1306 } MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10;
1308 #define MODE_FD_SINGLE_SIDE 0x01
1309 #define MODE_FD_DOUBLE_SIDE 0x02
1310 #define MODE_FD_MAXIMUM_TYPE 0x1E
1311 #define MODE_DSP_FUA_SUPPORTED 0x10
1312 #define MODE_DSP_WRITE_PROTECT 0x80
1314 typedef struct _MODE_PARAMETER_BLOCK {
1316 UCHAR NumberOfBlocks[3];
1318 UCHAR BlockLength[3];
1319 } MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK;
1321 typedef struct _MODE_DISCONNECT_PAGE {
1324 UCHAR PageSavable : 1;
1326 UCHAR BufferFullRatio;
1327 UCHAR BufferEmptyRatio;
1328 UCHAR BusInactivityLimit[2];
1329 UCHAR BusDisconnectTime[2];
1330 UCHAR BusConnectTime[2];
1331 UCHAR MaximumBurstSize[2];
1332 UCHAR DataTransferDisconnect : 2;
1334 }MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE;
1336 typedef struct _MODE_CACHING_PAGE {
1339 UCHAR PageSavable : 1;
1341 UCHAR ReadDisableCache : 1;
1342 UCHAR MultiplicationFactor : 1;
1343 UCHAR WriteCacheEnable : 1;
1344 UCHAR Reserved2 : 5;
1345 UCHAR WriteRetensionPriority : 4;
1346 UCHAR ReadRetensionPriority : 4;
1347 UCHAR DisablePrefetchTransfer[2];
1348 UCHAR MinimumPrefetch[2];
1349 UCHAR MaximumPrefetch[2];
1350 UCHAR MaximumPrefetchCeiling[2];
1351 }MODE_CACHING_PAGE, *PMODE_CACHING_PAGE;
1353 typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE {
1355 UCHAR WriteType : 4;
1356 UCHAR TestWrite : 1;
1357 UCHAR LinkSizeValid : 1;
1358 UCHAR BufferUnderrunFreeEnabled : 1;
1359 UCHAR Reserved2 : 1;
1360 UCHAR TrackMode : 4;
1362 UCHAR FixedPacket : 1;
1363 UCHAR MultiSession : 2;
1364 UCHAR DataBlockType : 4;
1365 UCHAR Reserved3 : 4;
1368 UCHAR HostApplicationCode : 6;
1369 UCHAR Reserved5 : 2;
1370 UCHAR SessionFormat;
1372 UCHAR PacketSize[4];
1373 UCHAR AudioPauseLength[2];
1374 UCHAR Reserved7 : 7;
1375 UCHAR MediaCatalogNumberValid : 1;
1376 UCHAR MediaCatalogNumber[13];
1377 UCHAR MediaCatalogNumberZero;
1378 UCHAR MediaCatalogNumberAFrame;
1379 UCHAR Reserved8 : 7;
1380 UCHAR ISRCValid : 1;
1381 UCHAR ISRCCountry[2];
1383 UCHAR ISRCRecordingYear[2];
1384 UCHAR ISRCSerialNumber[5];
1388 UCHAR SubHeaderData[4];
1389 } MODE_CDROM_WRITE_PARAMETERS_PAGE, *PMODE_CDROM_WRITE_PARAMETERS_PAGE;
1391 typedef struct _MODE_FLEXIBLE_DISK_PAGE {
1394 UCHAR PageSavable : 1;
1396 UCHAR TransferRate[2];
1397 UCHAR NumberOfHeads;
1398 UCHAR SectorsPerTrack;
1399 UCHAR BytesPerSector[2];
1400 UCHAR NumberOfCylinders[2];
1401 UCHAR StartWritePrecom[2];
1402 UCHAR StartReducedCurrent[2];
1404 UCHAR StepPluseWidth;
1405 UCHAR HeadSettleDelay[2];
1407 UCHAR MotorOffDelay;
1408 UCHAR Reserved2 : 5;
1409 UCHAR MotorOnAsserted : 1;
1410 UCHAR StartSectorNumber : 1;
1411 UCHAR TrueReadySignal : 1;
1412 UCHAR StepPlusePerCyclynder : 4;
1413 UCHAR Reserved3 : 4;
1414 UCHAR WriteCompenstation;
1415 UCHAR HeadLoadDelay;
1416 UCHAR HeadUnloadDelay;
1417 UCHAR Pin2Usage : 4;
1418 UCHAR Pin34Usage : 4;
1419 UCHAR Pin1Usage : 4;
1420 UCHAR Pin4Usage : 4;
1421 UCHAR MediumRotationRate[2];
1423 } MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE;
1425 typedef struct _MODE_FORMAT_PAGE {
1428 UCHAR PageSavable : 1;
1430 UCHAR TracksPerZone[2];
1431 UCHAR AlternateSectorsPerZone[2];
1432 UCHAR AlternateTracksPerZone[2];
1433 UCHAR AlternateTracksPerLogicalUnit[2];
1434 UCHAR SectorsPerTrack[2];
1435 UCHAR BytesPerPhysicalSector[2];
1436 UCHAR Interleave[2];
1437 UCHAR TrackSkewFactor[2];
1438 UCHAR CylinderSkewFactor[2];
1439 UCHAR Reserved2 : 4;
1440 UCHAR SurfaceFirst : 1;
1441 UCHAR RemovableMedia : 1;
1442 UCHAR HardSectorFormating : 1;
1443 UCHAR SoftSectorFormating : 1;
1445 } MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE;
1447 typedef struct _MODE_RIGID_GEOMETRY_PAGE {
1450 UCHAR PageSavable : 1;
1452 UCHAR NumberOfCylinders[3];
1453 UCHAR NumberOfHeads;
1454 UCHAR StartWritePrecom[3];
1455 UCHAR StartReducedCurrent[3];
1456 UCHAR DriveStepRate[2];
1457 UCHAR LandZoneCyclinder[3];
1458 UCHAR RotationalPositionLock : 2;
1459 UCHAR Reserved2 : 6;
1460 UCHAR RotationOffset;
1462 UCHAR RoataionRate[2];
1464 } MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE;
1466 typedef struct _MODE_READ_WRITE_RECOVERY_PAGE {
1468 UCHAR Reserved1 : 1;
1479 UCHAR ReadRetryCount;
1481 UCHAR WriteRetryCount;
1483 } MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE;
1485 typedef struct _MODE_READ_RECOVERY_PAGE {
1487 UCHAR Reserved1 : 1;
1493 UCHAR Reserved2 : 1;
1496 UCHAR Reserved3 : 2;
1497 UCHAR ReadRetryCount;
1499 } MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE;
1501 typedef struct _MODE_INFO_EXCEPTIONS {
1503 UCHAR Reserved1 : 1;
1506 _ANONYMOUS_UNION union {
1508 _ANONYMOUS_STRUCT struct {
1510 UCHAR Reserved2 : 1;
1513 UCHAR Reserved3 : 3;
1517 UCHAR ReportMethod : 4;
1518 UCHAR Reserved4 : 4;
1519 UCHAR IntervalTimer[4];
1520 UCHAR ReportCount[4];
1521 } MODE_INFO_EXCEPTIONS, *PMODE_INFO_EXCEPTIONS;
1523 /* CDROM audio control */
1524 #define CDB_AUDIO_PAUSE 0x00
1525 #define CDB_AUDIO_RESUME 0x01
1526 #define CDB_DEVICE_START 0x11
1527 #define CDB_DEVICE_STOP 0x10
1528 #define CDB_EJECT_MEDIA 0x10
1529 #define CDB_LOAD_MEDIA 0x01
1530 #define CDB_SUBCHANNEL_HEADER 0x00
1531 #define CDB_SUBCHANNEL_BLOCK 0x01
1533 #define CDROM_AUDIO_CONTROL_PAGE 0x0E
1534 #define MODE_SELECT_IMMEDIATE 0x04
1535 #define MODE_SELECT_PFBIT 0x10
1537 #define CDB_USE_MSF 0x01
1539 typedef struct _PORT_OUTPUT {
1540 UCHAR ChannelSelection;
1542 } PORT_OUTPUT, *PPORT_OUTPUT;
1544 typedef struct _AUDIO_OUTPUT {
1546 UCHAR ParameterLength;
1550 UCHAR LogicalBlocksPerSecond[2];
1551 PORT_OUTPUT PortOutput[4];
1552 } AUDIO_OUTPUT, *PAUDIO_OUTPUT;
1554 /* Multisession CDROMs */
1555 #define GET_LAST_SESSION 0x01
1556 #define GET_SESSION_DATA 0x02;
1558 /* Atapi 2.5 changers */
1559 typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER {
1560 UCHAR CurrentSlot : 5;
1561 UCHAR ChangerState : 2;
1564 UCHAR MechanismState : 3;
1565 UCHAR CurrentLogicalBlockAddress[3];
1566 UCHAR NumberAvailableSlots;
1567 UCHAR SlotTableLength[2];
1568 } MECHANICAL_STATUS_INFORMATION_HEADER, *PMECHANICAL_STATUS_INFORMATION_HEADER;
1570 typedef struct _SLOT_TABLE_INFORMATION {
1571 UCHAR DiscChanged : 1;
1573 UCHAR DiscPresent : 1;
1575 } SLOT_TABLE_INFORMATION, *PSLOT_TABLE_INFORMATION;
1577 typedef struct _MECHANICAL_STATUS {
1578 MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader;
1579 SLOT_TABLE_INFORMATION SlotTableInfo[1];
1580 } MECHANICAL_STATUS, *PMECHANICAL_STATUS;
1583 /* Tape definitions */
1584 typedef struct _TAPE_POSITION_DATA {
1585 UCHAR Reserved1 : 2;
1586 UCHAR BlockPositionUnsupported : 1;
1587 UCHAR Reserved2 : 3;
1588 UCHAR EndOfPartition : 1;
1589 UCHAR BeginningOfPartition : 1;
1590 UCHAR PartitionNumber;
1592 UCHAR FirstBlock[4];
1595 UCHAR NumberOfBlocks[3];
1596 UCHAR NumberOfBytes[4];
1597 } TAPE_POSITION_DATA, *PTAPE_POSITION_DATA;
1599 /* This structure is used to convert little endian ULONGs
1600 to SCSI CDB big endians values. */
1601 typedef union _EIGHT_BYTE {
1602 _ANONYMOUS_STRUCT struct {
1612 ULONGLONG AsULongLong;
1613 } EIGHT_BYTE, *PEIGHT_BYTE;
1615 typedef union _FOUR_BYTE {
1616 _ANONYMOUS_STRUCT struct {
1623 } FOUR_BYTE, *PFOUR_BYTE;
1625 typedef union _TWO_BYTE {
1626 _ANONYMOUS_STRUCT struct {
1631 } TWO_BYTE, *PTWO_BYTE;
1633 /* Byte reversing macro for converting between
1634 big- and little-endian formats */
1635 #define REVERSE_BYTES_QUAD(Destination, Source) { \
1636 PEIGHT_BYTE _val1 = (PEIGHT_BYTE)(Destination); \
1637 PEIGHT_BYTE _val2 = (PEIGHT_BYTE)(Source); \
1638 _val1->Byte7 = _val2->Byte0; \
1639 _val1->Byte6 = _val2->Byte1; \
1640 _val1->Byte5 = _val2->Byte2; \
1641 _val1->Byte4 = _val2->Byte3; \
1642 _val1->Byte3 = _val2->Byte4; \
1643 _val1->Byte2 = _val2->Byte5; \
1644 _val1->Byte1 = _val2->Byte6; \
1645 _val1->Byte0 = _val2->Byte7; \
1648 #define REVERSE_BYTES(Destination, Source) { \
1649 PFOUR_BYTE _val1 = (PFOUR_BYTE)(Destination); \
1650 PFOUR_BYTE _val2 = (PFOUR_BYTE)(Source); \
1651 _val1->Byte3 = _val2->Byte0; \
1652 _val1->Byte2 = _val2->Byte1; \
1653 _val1->Byte1 = _val2->Byte2; \
1654 _val1->Byte0 = _val2->Byte3; \
1657 #define REVERSE_BYTES_SHORT(Destination, Source) { \
1658 PTWO_BYTE _val1 = (PTWO_BYTE)(Destination); \
1659 PTWO_BYTE _val2 = (PTWO_BYTE)(Source); \
1660 _val1->Byte1 = _val2->Byte0; \
1661 _val1->Byte0 = _val2->Byte1; \
1664 #define REVERSE_SHORT(Short) { \
1666 PTWO_BYTE _val2 = (PTWO_BYTE)(Short); \
1667 _val = _val2->Byte0; \
1668 _val2->Byte0 = _val2->Byte1; \
1669 _val2->Byte1 = _val; \
1672 #define REVERSE_LONG(Long) { \
1674 PFOUR_BYTE _val2 = (PFOUR_BYTE)(Long); \
1675 _val = _val2->Byte3; \
1676 _val2->Byte3 = _val2->Byte0; \
1677 _val2->Byte0 = _val; \
1678 _val = _val2->Byte2; \
1679 _val2->Byte2 = _val2->Byte1; \
1680 _val2->Byte1 = _val; \
1683 #define WHICH_BIT(Data, Bit) { \
1685 for (_val = 0; _val < 32; _val++) { \
1686 if (((Data) >> _val) == 1) { \
1690 ASSERT(_val != 32); \
1698 #endif /* __SCSI_H */