3 * @copy 2012 MinGW.org project
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
27 * SCSI port and class interface.
29 * This file is part of the w32api package.
32 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
34 * THIS SOFTWARE IS NOT COPYRIGHTED
36 * This source code is offered for use in the public domain. You may
37 * use, modify or distribute it freely.
39 * This code is distributed in the hope that it will be useful but
40 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
41 * DISCLAIMED. This includes but is not limited to warranties of
42 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
48 #pragma GCC system_header
60 UCHAR CommandUniqueBits : 4;
61 UCHAR LogicalUnitNumber : 3;
62 UCHAR CommandUniqueBytes[3];
66 UCHAR VendorUnique : 2;
67 } CDB6GENERIC, *PCDB6GENERIC;
69 struct _CDB6READWRITE {
71 UCHAR LogicalBlockMsb1 : 5;
72 UCHAR LogicalUnitNumber : 3;
73 UCHAR LogicalBlockMsb0;
74 UCHAR LogicalBlockLsb;
77 } CDB6READWRITE, *PCDB6READWRITE;
82 UCHAR LogicalUnitNumber : 3;
85 UCHAR AllocationLength;
87 } CDB6INQUIRY, *PCDB6INQUIRY;
89 struct _CDB6INQUIRY3 {
91 UCHAR EnableVitalProductData : 1;
92 UCHAR CommandSupportData : 1;
96 UCHAR AllocationLength;
98 } CDB6INQUIRY3, *PCDB6INQUIRY3;
103 UCHAR ByteCompare : 1;
106 UCHAR LogicalUnitNumber : 3;
107 UCHAR VerificationLength[3];
109 } CDB6VERIFY, *PCDB6VERIFY;
113 UCHAR FormatControl : 5;
114 UCHAR LogicalUnitNumber : 3;
119 } CDB6FORMAT, *PCDB6FORMAT;
123 UCHAR RelativeAddress : 1;
125 UCHAR ForceUnitAccess : 1;
126 UCHAR DisablePageOut : 1;
127 UCHAR LogicalUnitNumber : 3;
128 UCHAR LogicalBlockByte0;
129 UCHAR LogicalBlockByte1;
130 UCHAR LogicalBlockByte2;
131 UCHAR LogicalBlockByte3;
133 UCHAR TransferBlocksMsb;
134 UCHAR TransferBlocksLsb;
140 UCHAR RelativeAddress : 1;
142 UCHAR ForceUnitAccess : 1;
143 UCHAR DisablePageOut : 1;
144 UCHAR LogicalUnitNumber : 3;
145 UCHAR LogicalBlock[4];
146 UCHAR TransferLength[4];
151 struct _PAUSE_RESUME {
154 UCHAR LogicalUnitNumber : 3;
158 } PAUSE_RESUME, *PPAUSE_RESUME;
165 UCHAR LogicalUnitNumber : 3;
170 UCHAR AllocationLength[2];
173 } READ_TOC, *PREAD_TOC;
175 struct _READ_DISK_INFORMATION {
180 UCHAR AllocationLength[2];
182 } READ_DISK_INFORMATION, *PREAD_DISK_INFORMATION;
184 struct _READ_TRACK_INFORMATION {
190 UCHAR BlockAddress[4];
192 UCHAR AllocationLength[2];
194 } READ_TRACK_INFORMATION, *PREAD_TRACK_INFORMATION;
196 struct _RESERVE_TRACK_RZONE {
199 UCHAR ReservationSize[4];
201 } RESERVE_TRACK_RZONE, *PRESERVE_TRACK_RZONE;
203 struct _SEND_OPC_INFORMATION {
208 UCHAR ParameterListLength[2];
210 } SEND_OPC_INFORMATION, *PSEND_OPC_INFORMATION;
212 struct _CLOSE_TRACK {
220 UCHAR TrackNumber[2];
223 } CLOSE_TRACK, *PCLOSE_TRACK;
225 struct _SEND_CUE_SHEET {
228 UCHAR CueSheetSize[3];
230 } SEND_CUE_SHEET, *PSEND_CUE_SHEET;
232 struct _READ_HEADER {
238 UCHAR LogicalBlockAddress[4];
240 UCHAR AllocationLength[2];
242 } READ_HEADER, *PREAD_HEADER;
247 UCHAR LogicalUnitNumber : 3;
248 UCHAR StartingBlockAddress[4];
252 } PLAY_AUDIO, *PPLAY_AUDIO;
254 struct _PLAY_AUDIO_MSF {
257 UCHAR LogicalUnitNumber : 3;
266 } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF;
268 /* FIXME: Should the union be anonymous in C++ too? If so,
269 can't define named types _LBA and _MSF within anonymous union
275 UCHAR ExpectedSectorType : 3;
282 UCHAR StartingBlockAddress[4];
309 } PLAY_CD, *PPLAY_CD;
313 UCHAR RelativeAddress : 1;
317 UCHAR StartingAddress[4];
323 } SCAN_CD, *PSCAN_CD;
325 struct _STOP_PLAY_SCAN {
331 } STOP_PLAY_SCAN, *PSTOP_PLAY_SCAN;
338 UCHAR LogicalUnitNumber : 3;
345 UCHAR AllocationLength[2];
347 } SUBCHANNEL, *PSUBCHANNEL;
351 UCHAR RelativeAddress : 1;
353 UCHAR ExpectedSectorType : 3;
355 UCHAR StartingLBA[4];
356 UCHAR TransferBlocks[3];
358 UCHAR ErrorFlags : 2;
359 UCHAR IncludeEDC : 1;
360 UCHAR IncludeUserData : 1;
361 UCHAR HeaderCode : 2;
362 UCHAR IncludeSyncData : 1;
363 UCHAR SubChannelSelection : 3;
366 } READ_CD, *PREAD_CD;
368 struct _READ_CD_MSF {
370 UCHAR RelativeAddress : 1;
372 UCHAR ExpectedSectorType : 3;
383 UCHAR ErrorFlags : 2;
384 UCHAR IncludeEDC : 1;
385 UCHAR IncludeUserData : 1;
386 UCHAR HeaderCode : 2;
387 UCHAR IncludeSyncData : 1;
388 UCHAR SubChannelSelection : 3;
391 } READ_CD_MSF, *PREAD_CD_MSF;
393 struct _PLXTR_READ_CDDA {
396 UCHAR LogicalUnitNumber : 3;
397 UCHAR LogicalBlockByte0;
398 UCHAR LogicalBlockByte1;
399 UCHAR LogicalBlockByte2;
400 UCHAR LogicalBlockByte3;
401 UCHAR TransferBlockByte0;
402 UCHAR TransferBlockByte1;
403 UCHAR TransferBlockByte2;
404 UCHAR TransferBlockByte3;
407 } PLXTR_READ_CDDA, *PPLXTR_READ_CDDA;
409 struct _NEC_READ_CDDA {
412 UCHAR LogicalBlockByte0;
413 UCHAR LogicalBlockByte1;
414 UCHAR LogicalBlockByte2;
415 UCHAR LogicalBlockByte3;
417 UCHAR TransferBlockByte0;
418 UCHAR TransferBlockByte1;
420 } NEC_READ_CDDA, *PNEC_READ_CDDA;
427 UCHAR LogicalUnitNumber : 3;
431 UCHAR AllocationLength;
433 } MODE_SENSE, *PMODE_SENSE;
435 struct _MODE_SENSE10 {
440 UCHAR LogicalUnitNumber : 3;
444 UCHAR AllocationLength[2];
446 } MODE_SENSE10, *PMODE_SENSE10;
448 struct _MODE_SELECT {
453 UCHAR LogicalUnitNumber : 3;
455 UCHAR ParameterListLength;
457 } MODE_SELECT, *PMODE_SELECT;
459 struct _MODE_SELECT10 {
464 UCHAR LogicalUnitNumber : 3;
466 UCHAR ParameterListLength[2];
468 } MODE_SELECT10, *PMODE_SELECT10;
476 UCHAR LogicalUnitNumber : 3;
478 UCHAR LogicalBlockAddress[4];
489 UCHAR LogicalUnitNumber : 3;
494 UCHAR ParameterPointer[2];
495 UCHAR AllocationLength[2];
497 } LOGSENSE, *PLOGSENSE;
504 UCHAR LogicalUnitNumber : 3;
508 UCHAR ParameterListLength[2];
510 } LOGSELECT, *PLOGSELECT;
515 UCHAR LogicalUnitNumber : 3;
516 UCHAR TransferLength[3];
523 UCHAR LogicalUnitNumber : 3;
524 UCHAR LogicalBlockAddress[4];
534 UCHAR LogicalUnitNumber : 3;
543 UCHAR LogicalUnitNumber : 3;
549 } START_STOP, *PSTART_STOP;
551 struct _MEDIA_REMOVAL {
554 UCHAR LogicalUnitNumber : 3;
558 UCHAR Persistant : 1;
562 } MEDIA_REMOVAL, *PMEDIA_REMOVAL;
568 UCHAR BlockAddress[3];
572 UCHAR VendorUnique : 2;
573 } SEEK_BLOCK, *PSEEK_BLOCK;
575 struct _REQUEST_BLOCK_ADDRESS {
578 UCHAR AllocationLength;
582 UCHAR VendorUnique : 2;
583 } REQUEST_BLOCK_ADDRESS, *PREQUEST_BLOCK_ADDRESS;
589 UCHAR PartitionSelect : 6;
592 } PARTITION, *PPARTITION;
594 struct _WRITE_TAPE_MARKS {
597 UCHAR WriteSetMarks: 1;
599 UCHAR LogicalUnitNumber : 3;
600 UCHAR TransferLength[3];
602 } WRITE_TAPE_MARKS, *PWRITE_TAPE_MARKS;
604 struct _SPACE_TAPE_MARKS {
608 UCHAR LogicalUnitNumber : 3;
618 UCHAR VendorUnique : 2;
621 } SPACE_TAPE_MARKS, *PSPACE_TAPE_MARKS;
623 struct _READ_POSITION {
630 } READ_POSITION, *PREAD_POSITION;
632 struct _CDB6READWRITETAPE {
634 UCHAR VendorSpecific : 5;
636 UCHAR TransferLenMSB;
638 UCHAR TransferLenLSB;
642 UCHAR VendorUnique : 2;
643 } CDB6READWRITETAPE, *PCDB6READWRITETAPE;
645 struct _INIT_ELEMENT_STATUS {
648 UCHAR LogicalUnitNubmer : 3;
652 } INIT_ELEMENT_STATUS, *PINIT_ELEMENT_STATUS;
654 struct _INITIALIZE_ELEMENT_RANGE {
658 UCHAR LogicalUnitNubmer : 3;
659 UCHAR FirstElementAddress[2];
661 UCHAR NumberOfElements[2];
665 } INITIALIZE_ELEMENT_RANGE, *PINITIALIZE_ELEMENT_RANGE;
667 struct _POSITION_TO_ELEMENT {
670 UCHAR LogicalUnitNumber : 3;
671 UCHAR TransportElementAddress[2];
672 UCHAR DestinationElementAddress[2];
677 } POSITION_TO_ELEMENT, *PPOSITION_TO_ELEMENT;
679 struct _MOVE_MEDIUM {
682 UCHAR LogicalUnitNumber : 3;
683 UCHAR TransportElementAddress[2];
684 UCHAR SourceElementAddress[2];
685 UCHAR DestinationElementAddress[2];
690 } MOVE_MEDIUM, *PMOVE_MEDIUM;
692 struct _EXCHANGE_MEDIUM {
695 UCHAR LogicalUnitNumber : 3;
696 UCHAR TransportElementAddress[2];
697 UCHAR SourceElementAddress[2];
698 UCHAR Destination1ElementAddress[2];
699 UCHAR Destination2ElementAddress[2];
704 } EXCHANGE_MEDIUM, *PEXCHANGE_MEDIUM;
706 struct _READ_ELEMENT_STATUS {
708 UCHAR ElementType : 4;
710 UCHAR LogicalUnitNumber : 3;
711 UCHAR StartingElementAddress[2];
712 UCHAR NumberOfElements[2];
714 UCHAR AllocationLength[3];
717 } READ_ELEMENT_STATUS, *PREAD_ELEMENT_STATUS;
719 struct _SEND_VOLUME_TAG {
721 UCHAR ElementType : 4;
723 UCHAR LogicalUnitNumber : 3;
724 UCHAR StartingElementAddress[2];
726 UCHAR ActionCode : 5;
729 UCHAR ParameterListLength[2];
732 } SEND_VOLUME_TAG, *PSEND_VOLUME_TAG;
734 struct _REQUEST_VOLUME_ELEMENT_ADDRESS {
736 UCHAR ElementType : 4;
738 UCHAR LogicalUnitNumber : 3;
739 UCHAR StartingElementAddress[2];
740 UCHAR NumberElements[2];
742 UCHAR AllocationLength[3];
745 } REQUEST_VOLUME_ELEMENT_ADDRESS, *PREQUEST_VOLUME_ELEMENT_ADDRESS;
747 struct _LOAD_UNLOAD {
759 } LOAD_UNLOAD, *PLOAD_UNLOAD;
761 struct _MECH_STATUS {
766 UCHAR AllocationLength[2];
769 } MECH_STATUS, *PMECH_STATUS;
771 struct _SYNCHRONIZE_CACHE10 {
780 UCHAR LogicalBlockAddress[4];
784 } SYNCHRONIZE_CACHE10, *PSYNCHRONIZE_CACHE10;
786 struct _GET_EVENT_STATUS_NOTIFICATION {
794 UCHAR NotificationClassRequest;
796 UCHAR EventListLength[2];
799 } GET_EVENT_STATUS_NOTIFICATION, *PGET_EVENT_STATUS_NOTIFICATION;
801 struct _READ_DVD_STRUCTURE {
805 UCHAR RMDBlockNumber[4];
808 UCHAR AllocationLength[2];
812 } READ_DVD_STRUCTURE, *PREAD_DVD_STRUCTURE;
814 struct _SEND_DVD_STRUCTURE {
820 UCHAR ParameterListLength[2];
823 } SEND_DVD_STRUCTURE, *PSEND_DVD_STRUCTURE;
830 UCHAR ParameterListLength[2];
834 } SEND_KEY, *PSEND_KEY;
840 UCHAR LogicalBlockAddress[4];
842 UCHAR AllocationLength[2];
846 } REPORT_KEY, *PREPORT_KEY;
848 struct _SET_READ_AHEAD {
853 UCHAR ReadAheadLBA[4];
856 } SET_READ_AHEAD, *PSET_READ_AHEAD;
858 struct _READ_FORMATTED_CAPACITIES {
863 UCHAR AllocationLength[2];
865 } READ_FORMATTED_CAPACITIES, *PREAD_FORMATTED_CAPACITIES;
867 struct _REPORT_LUNS {
870 UCHAR AllocationLength[4];
873 } REPORT_LUNS, *PREPORT_LUNS;
875 struct _PERSISTENT_RESERVE_IN {
877 UCHAR ServiceAction : 5;
880 UCHAR AllocationLength[2];
882 } PERSISTENT_RESERVE_IN, *PPERSISTENT_RESERVE_IN;
884 struct _PERSISTENT_RESERVE_OUT {
886 UCHAR ServiceAction : 5;
891 UCHAR ParameterListLength[2];
893 } PERSISTENT_RESERVE_OUT, *PPERSISTENT_RESERVE_OUT;
895 struct _GET_CONFIGURATION {
897 UCHAR RequestType : 1;
899 UCHAR StartingFeature[2];
901 UCHAR AllocationLength[2];
903 } GET_CONFIGURATION, *PGET_CONFIGURATION;
905 struct _SET_CD_SPEED {
912 } SET_CD_SPEED, *PSET_CD_SPEED;
918 #ifndef _INQUIRYDATA_DEFINED /* also in minitape.h */
919 #define _INQUIRYDATA_DEFINED
921 #define INQUIRYDATABUFFERSIZE 36
923 typedef struct _INQUIRYDATA {
924 UCHAR DeviceType : 5;
925 UCHAR DeviceTypeQualifier : 3;
926 UCHAR DeviceTypeModifier : 7;
927 UCHAR RemovableMedia : 1;
928 _ANONYMOUS_UNION union {
930 _ANONYMOUS_STRUCT struct {
931 UCHAR ANSIVersion : 3;
932 UCHAR ECMAVersion : 3;
933 UCHAR ISOVersion : 2;
936 UCHAR ResponseDataFormat : 4;
939 UCHAR TerminateTask : 1;
941 UCHAR AdditionalLength;
946 UCHAR MediumChanger : 1;
948 UCHAR ReservedBit2 : 1;
949 UCHAR EnclosureServices : 1;
950 UCHAR ReservedBit3 : 1;
952 UCHAR CommandQueue : 1;
953 UCHAR TransferDisable : 1;
954 UCHAR LinkedCommands : 1;
955 UCHAR Synchronous : 1;
958 UCHAR RelativeAddressing : 1;
961 UCHAR ProductRevisionLevel[4];
962 UCHAR VendorSpecific[20];
964 } INQUIRYDATA, *PINQUIRYDATA;
967 /* INQUIRYDATA.DeviceType constants */
968 #define DIRECT_ACCESS_DEVICE 0x00
969 #define SEQUENTIAL_ACCESS_DEVICE 0x01
970 #define PRINTER_DEVICE 0x02
971 #define PROCESSOR_DEVICE 0x03
972 #define WRITE_ONCE_READ_MULTIPLE_DEVICE 0x04
973 #define READ_ONLY_DIRECT_ACCESS_DEVICE 0x05
974 #define SCANNER_DEVICE 0x06
975 #define OPTICAL_DEVICE 0x07
976 #define MEDIUM_CHANGER 0x08
977 #define COMMUNICATION_DEVICE 0x09
978 #define LOGICAL_UNIT_NOT_PRESENT_DEVICE 0x7F
979 #define DEVICE_QUALIFIER_NOT_SUPPORTED 0x03
981 /* INQUIRYDATA.DeviceTypeQualifier constants */
982 #define DEVICE_CONNECTED 0x00
984 #define SCSISTAT_GOOD 0x00
985 #define SCSISTAT_CHECK_CONDITION 0x02
986 #define SCSISTAT_CONDITION_MET 0x04
987 #define SCSISTAT_BUSY 0x08
988 #define SCSISTAT_INTERMEDIATE 0x10
989 #define SCSISTAT_INTERMEDIATE_COND_MET 0x14
990 #define SCSISTAT_RESERVATION_CONFLICT 0x18
991 #define SCSISTAT_COMMAND_TERMINATED 0x22
992 #define SCSISTAT_QUEUE_FULL 0x28
994 /* Mode Sense/Select page constants */
995 #define MODE_PAGE_ERROR_RECOVERY 0x01
996 #define MODE_PAGE_DISCONNECT 0x02
997 #define MODE_PAGE_FORMAT_DEVICE 0x03
998 #define MODE_PAGE_RIGID_GEOMETRY 0x04
999 #define MODE_PAGE_FLEXIBILE 0x05
1000 #define MODE_PAGE_WRITE_PARAMETERS 0x05
1001 #define MODE_PAGE_VERIFY_ERROR 0x07
1002 #define MODE_PAGE_CACHING 0x08
1003 #define MODE_PAGE_PERIPHERAL 0x09
1004 #define MODE_PAGE_CONTROL 0x0A
1005 #define MODE_PAGE_MEDIUM_TYPES 0x0B
1006 #define MODE_PAGE_NOTCH_PARTITION 0x0C
1007 #define MODE_PAGE_CD_AUDIO_CONTROL 0x0E
1008 #define MODE_PAGE_DATA_COMPRESS 0x0F
1009 #define MODE_PAGE_DEVICE_CONFIG 0x10
1010 #define MODE_PAGE_MEDIUM_PARTITION 0x11
1011 #define MODE_PAGE_CDVD_FEATURE_SET 0x18
1012 #define MODE_PAGE_POWER_CONDITION 0x1A
1013 #define MODE_PAGE_FAULT_REPORTING 0x1C
1014 #define MODE_PAGE_CDVD_INACTIVITY 0x1D
1015 #define MODE_PAGE_ELEMENT_ADDRESS 0x1D
1016 #define MODE_PAGE_TRANSPORT_GEOMETRY 0x1E
1017 #define MODE_PAGE_DEVICE_CAPABILITIES 0x1F
1018 #define MODE_PAGE_CAPABILITIES 0x2A
1019 #define MODE_SENSE_RETURN_ALL 0x3f
1020 #define MODE_SENSE_CURRENT_VALUES 0x00
1021 #define MODE_SENSE_CHANGEABLE_VALUES 0x40
1022 #define MODE_SENSE_DEFAULT_VAULES 0x80
1023 #define MODE_SENSE_SAVED_VALUES 0xc0
1025 /* SCSI CDB operation codes */
1026 #define SCSIOP_TEST_UNIT_READY 0x00
1027 #define SCSIOP_REZERO_UNIT 0x01
1028 #define SCSIOP_REWIND 0x01
1029 #define SCSIOP_REQUEST_BLOCK_ADDR 0x02
1030 #define SCSIOP_REQUEST_SENSE 0x03
1031 #define SCSIOP_FORMAT_UNIT 0x04
1032 #define SCSIOP_READ_BLOCK_LIMITS 0x05
1033 #define SCSIOP_REASSIGN_BLOCKS 0x07
1034 #define SCSIOP_INIT_ELEMENT_STATUS 0x07
1035 #define SCSIOP_READ6 0x08
1036 #define SCSIOP_RECEIVE 0x08
1037 #define SCSIOP_WRITE6 0x0A
1038 #define SCSIOP_PRINT 0x0A
1039 #define SCSIOP_SEND 0x0A
1040 #define SCSIOP_SEEK6 0x0B
1041 #define SCSIOP_TRACK_SELECT 0x0B
1042 #define SCSIOP_SLEW_PRINT 0x0B
1043 #define SCSIOP_SEEK_BLOCK 0x0C
1044 #define SCSIOP_PARTITION 0x0D
1045 #define SCSIOP_READ_REVERSE 0x0F
1046 #define SCSIOP_WRITE_FILEMARKS 0x10
1047 #define SCSIOP_FLUSH_BUFFER 0x10
1048 #define SCSIOP_SPACE 0x11
1049 #define SCSIOP_INQUIRY 0x12
1050 #define SCSIOP_VERIFY6 0x13
1051 #define SCSIOP_RECOVER_BUF_DATA 0x14
1052 #define SCSIOP_MODE_SELECT 0x15
1053 #define SCSIOP_RESERVE_UNIT 0x16
1054 #define SCSIOP_RELEASE_UNIT 0x17
1055 #define SCSIOP_COPY 0x18
1056 #define SCSIOP_ERASE 0x19
1057 #define SCSIOP_MODE_SENSE 0x1A
1058 #define SCSIOP_START_STOP_UNIT 0x1B
1059 #define SCSIOP_STOP_PRINT 0x1B
1060 #define SCSIOP_LOAD_UNLOAD 0x1B
1061 #define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C
1062 #define SCSIOP_SEND_DIAGNOSTIC 0x1D
1063 #define SCSIOP_MEDIUM_REMOVAL 0x1E
1065 #define SCSIOP_READ_FORMATTED_CAPACITY 0x23
1066 #define SCSIOP_READ_CAPACITY 0x25
1067 #define SCSIOP_READ 0x28
1068 #define SCSIOP_WRITE 0x2A
1069 #define SCSIOP_SEEK 0x2B
1070 #define SCSIOP_LOCATE 0x2B
1071 #define SCSIOP_POSITION_TO_ELEMENT 0x2B
1072 #define SCSIOP_WRITE_VERIFY 0x2E
1073 #define SCSIOP_VERIFY 0x2F
1074 #define SCSIOP_SEARCH_DATA_HIGH 0x30
1075 #define SCSIOP_SEARCH_DATA_EQUAL 0x31
1076 #define SCSIOP_SEARCH_DATA_LOW 0x32
1077 #define SCSIOP_SET_LIMITS 0x33
1078 #define SCSIOP_READ_POSITION 0x34
1079 #define SCSIOP_SYNCHRONIZE_CACHE 0x35
1080 #define SCSIOP_COMPARE 0x39
1081 #define SCSIOP_COPY_COMPARE 0x3A
1082 #define SCSIOP_WRITE_DATA_BUFF 0x3B
1083 #define SCSIOP_READ_DATA_BUFF 0x3C
1084 #define SCSIOP_CHANGE_DEFINITION 0x40
1085 #define SCSIOP_READ_SUB_CHANNEL 0x42
1086 #define SCSIOP_READ_TOC 0x43
1087 #define SCSIOP_READ_HEADER 0x44
1088 #define SCSIOP_PLAY_AUDIO 0x45
1089 #define SCSIOP_GET_CONFIGURATION 0x46
1090 #define SCSIOP_PLAY_AUDIO_MSF 0x47
1091 #define SCSIOP_PLAY_TRACK_INDEX 0x48
1092 #define SCSIOP_PLAY_TRACK_RELATIVE 0x49
1093 #define SCSIOP_GET_EVENT_STATUS 0x4A
1094 #define SCSIOP_PAUSE_RESUME 0x4B
1095 #define SCSIOP_LOG_SELECT 0x4C
1096 #define SCSIOP_LOG_SENSE 0x4D
1097 #define SCSIOP_STOP_PLAY_SCAN 0x4E
1098 #define SCSIOP_READ_DISK_INFORMATION 0x51
1099 #define SCSIOP_READ_TRACK_INFORMATION 0x52
1100 #define SCSIOP_RESERVE_TRACK_RZONE 0x53
1101 #define SCSIOP_SEND_OPC_INFORMATION 0x54
1102 #define SCSIOP_MODE_SELECT10 0x55
1103 #define SCSIOP_MODE_SENSE10 0x5A
1104 #define SCSIOP_CLOSE_TRACK_SESSION 0x5B
1105 #define SCSIOP_READ_BUFFER_CAPACITY 0x5C
1106 #define SCSIOP_SEND_CUE_SHEET 0x5D
1107 #define SCSIOP_PERSISTENT_RESERVE_IN 0x5E
1108 #define SCSIOP_PERSISTENT_RESERVE_OUT 0x5F
1110 #define SCSIOP_REPORT_LUNS 0xA0
1111 #define SCSIOP_BLANK 0xA1
1112 #define SCSIOP_SEND_KEY 0xA3
1113 #define SCSIOP_REPORT_KEY 0xA4
1114 #define SCSIOP_MOVE_MEDIUM 0xA5
1115 #define SCSIOP_LOAD_UNLOAD_SLOT 0xA6
1116 #define SCSIOP_EXCHANGE_MEDIUM 0xA6
1117 #define SCSIOP_SET_READ_AHEAD 0xA7
1118 #define SCSIOP_READ_DVD_STRUCTURE 0xAD
1119 #define SCSIOP_REQUEST_VOL_ELEMENT 0xB5
1120 #define SCSIOP_SEND_VOLUME_TAG 0xB6
1121 #define SCSIOP_READ_ELEMENT_STATUS 0xB8
1122 #define SCSIOP_READ_CD_MSF 0xB9
1123 #define SCSIOP_SCAN_CD 0xBA
1124 #define SCSIOP_SET_CD_SPEED 0xBB
1125 #define SCSIOP_PLAY_CD 0xBC
1126 #define SCSIOP_MECHANISM_STATUS 0xBD
1127 #define SCSIOP_READ_CD 0xBE
1128 #define SCSIOP_SEND_DVD_STRUCTURE 0xBF
1129 #define SCSIOP_INIT_ELEMENT_RANGE 0xE7
1131 #define SCSIOP_DENON_EJECT_DISC 0xE6
1132 #define SCSIOP_DENON_STOP_AUDIO 0xE7
1133 #define SCSIOP_DENON_PLAY_AUDIO 0xE8
1134 #define SCSIOP_DENON_READ_TOC 0xE9
1135 #define SCSIOP_DENON_READ_SUBCODE 0xEB
1137 #define SCSIMESS_MODIFY_DATA_POINTER 0x00
1138 #define SCSIMESS_SYNCHRONOUS_DATA_REQ 0x01
1139 #define SCSIMESS_WIDE_DATA_REQUEST 0x03
1141 #define SCSIMESS_MODIFY_DATA_LENGTH 5
1142 #define SCSIMESS_SYNCH_DATA_LENGTH 3
1143 #define SCSIMESS_WIDE_DATA_LENGTH 2
1145 #define SCSIMESS_ABORT 0x06
1146 #define SCSIMESS_ABORT_WITH_TAG 0x0D
1147 #define SCSIMESS_BUS_DEVICE_RESET 0x0C
1148 #define SCSIMESS_CLEAR_QUEUE 0x0E
1149 #define SCSIMESS_COMMAND_COMPLETE 0x00
1150 #define SCSIMESS_DISCONNECT 0x04
1151 #define SCSIMESS_EXTENDED_MESSAGE 0x01
1152 #define SCSIMESS_IDENTIFY 0x80
1153 #define SCSIMESS_IDENTIFY_WITH_DISCON 0xC0
1154 #define SCSIMESS_IGNORE_WIDE_RESIDUE 0x23
1155 #define SCSIMESS_INITIATE_RECOVERY 0x0F
1156 #define SCSIMESS_INIT_DETECTED_ERROR 0x05
1157 #define SCSIMESS_LINK_CMD_COMP 0x0A
1158 #define SCSIMESS_LINK_CMD_COMP_W_FLAG 0x0B
1159 #define SCSIMESS_MESS_PARITY_ERROR 0x09
1160 #define SCSIMESS_MESSAGE_REJECT 0x07
1161 #define SCSIMESS_NO_OPERATION 0x08
1162 #define SCSIMESS_HEAD_OF_QUEUE_TAG 0x21
1163 #define SCSIMESS_ORDERED_QUEUE_TAG 0x22
1164 #define SCSIMESS_SIMPLE_QUEUE_TAG 0x20
1165 #define SCSIMESS_RELEASE_RECOVERY 0x10
1166 #define SCSIMESS_RESTORE_POINTERS 0x03
1167 #define SCSIMESS_SAVE_DATA_POINTER 0x02
1168 #define SCSIMESS_TERMINATE_IO_PROCESS 0x11
1170 #define CDB_FORCE_MEDIA_ACCESS 0x08
1172 #define CDB_RETURN_ON_COMPLETION 0
1173 #define CDB_RETURN_IMMEDIATE 1
1175 #define CDB_INQUIRY_EVPD 0x01
1177 #define LUN0_FORMAT_SAVING_DEFECT_LIST 0
1178 #define USE_DEFAULTMSB 0
1179 #define USE_DEFAULTLSB 0
1181 #define START_UNIT_CODE 0x01
1182 #define STOP_UNIT_CODE 0x00
1184 typedef struct _SENSE_DATA {
1185 UCHAR ErrorCode : 7;
1187 UCHAR SegmentNumber;
1190 UCHAR IncorrectLength : 1;
1191 UCHAR EndOfMedia : 1;
1193 UCHAR Information[4];
1194 UCHAR AdditionalSenseLength;
1195 UCHAR CommandSpecificInformation[4];
1196 UCHAR AdditionalSenseCode;
1197 UCHAR AdditionalSenseCodeQualifier;
1198 UCHAR FieldReplaceableUnitCode;
1199 UCHAR SenseKeySpecific[3];
1200 } SENSE_DATA, *PSENSE_DATA;
1202 #define SENSE_BUFFER_SIZE 18
1205 #define SCSI_SENSE_NO_SENSE 0x00
1206 #define SCSI_SENSE_RECOVERED_ERROR 0x01
1207 #define SCSI_SENSE_NOT_READY 0x02
1208 #define SCSI_SENSE_MEDIUM_ERROR 0x03
1209 #define SCSI_SENSE_HARDWARE_ERROR 0x04
1210 #define SCSI_SENSE_ILLEGAL_REQUEST 0x05
1211 #define SCSI_SENSE_UNIT_ATTENTION 0x06
1212 #define SCSI_SENSE_DATA_PROTECT 0x07
1213 #define SCSI_SENSE_BLANK_CHECK 0x08
1214 #define SCSI_SENSE_UNIQUE 0x09
1215 #define SCSI_SENSE_COPY_ABORTED 0x0A
1216 #define SCSI_SENSE_ABORTED_COMMAND 0x0B
1217 #define SCSI_SENSE_EQUAL 0x0C
1218 #define SCSI_SENSE_VOL_OVERFLOW 0x0D
1219 #define SCSI_SENSE_MISCOMPARE 0x0E
1220 #define SCSI_SENSE_RESERVED 0x0F
1222 /* Additional tape bit */
1223 #define SCSI_ILLEGAL_LENGTH 0x20
1224 #define SCSI_EOM 0x40
1225 #define SCSI_FILE_MARK 0x80
1227 /* Additional Sense codes */
1228 #define SCSI_ADSENSE_NO_SENSE 0x00
1229 #define SCSI_ADSENSE_NO_SEEK_COMPLETE 0x02
1230 #define SCSI_ADSENSE_LUN_NOT_READY 0x04
1231 #define SCSI_ADSENSE_WRITE_ERROR 0x0C
1232 #define SCSI_ADSENSE_TRACK_ERROR 0x14
1233 #define SCSI_ADSENSE_SEEK_ERROR 0x15
1234 #define SCSI_ADSENSE_REC_DATA_NOECC 0x17
1235 #define SCSI_ADSENSE_REC_DATA_ECC 0x18
1236 #define SCSI_ADSENSE_ILLEGAL_COMMAND 0x20
1237 #define SCSI_ADSENSE_ILLEGAL_BLOCK 0x21
1238 #define SCSI_ADSENSE_INVALID_CDB 0x24
1239 #define SCSI_ADSENSE_INVALID_LUN 0x25
1240 #define SCSI_ADSENSE_WRITE_PROTECT 0x27
1241 #define SCSI_ADSENSE_MEDIUM_CHANGED 0x28
1242 #define SCSI_ADSENSE_BUS_RESET 0x29
1243 #define SCSI_ADSENSE_INSUFFICIENT_TIME_FOR_OPERATION 0x2E
1244 #define SCSI_ADSENSE_INVALID_MEDIA 0x30
1245 #define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE 0x3a
1246 #define SCSI_ADSENSE_POSITION_ERROR 0x3b
1247 #define SCSI_ADSENSE_OPERATOR_REQUEST 0x5a
1248 #define SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5d
1249 #define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK 0x64
1250 #define SCSI_ADSENSE_COPY_PROTECTION_FAILURE 0x6f
1251 #define SCSI_ADSENSE_POWER_CALIBRATION_ERROR 0x73
1252 #define SCSI_ADSENSE_VENDOR_UNIQUE 0x80
1253 #define SCSI_ADSENSE_MUSIC_AREA 0xA0
1254 #define SCSI_ADSENSE_DATA_AREA 0xA1
1255 #define SCSI_ADSENSE_VOLUME_OVERFLOW 0xA7
1257 #define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE 0x00
1258 #define SCSI_SENSEQ_BECOMING_READY 0x01
1259 #define SCSI_SENSEQ_INIT_COMMAND_REQUIRED 0x02
1260 #define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED 0x03
1261 #define SCSI_SENSEQ_FORMAT_IN_PROGRESS 0x04
1262 #define SCSI_SENSEQ_REBUILD_IN_PROGRESS 0x05
1263 #define SCSI_SENSEQ_RECALCULATION_IN_PROGRESS 0x06
1264 #define SCSI_SENSEQ_OPERATION_IN_PROGRESS 0x07
1265 #define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS 0x08
1266 #define SCSI_SENSEQ_LOSS_OF_STREAMING 0x09
1267 #define SCSI_SENSEQ_PADDING_BLOCKS_ADDED 0x0A
1270 #define FILE_DEVICE_SCSI 0x0000001b
1272 #define IOCTL_SCSI_EXECUTE_IN ((FILE_DEVICE_SCSI << 16) + 0x0011)
1273 #define IOCTL_SCSI_EXECUTE_OUT ((FILE_DEVICE_SCSI << 16) + 0x0012)
1274 #define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013)
1276 /* SMART support in ATAPI */
1277 #define IOCTL_SCSI_MINIPORT_SMART_VERSION ((FILE_DEVICE_SCSI << 16) + 0x0500)
1278 #define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501)
1279 #define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS ((FILE_DEVICE_SCSI << 16) + 0x0502)
1280 #define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS ((FILE_DEVICE_SCSI << 16) + 0x0503)
1281 #define IOCTL_SCSI_MINIPORT_ENABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0504)
1282 #define IOCTL_SCSI_MINIPORT_DISABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0505)
1283 #define IOCTL_SCSI_MINIPORT_RETURN_STATUS ((FILE_DEVICE_SCSI << 16) + 0x0506)
1284 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE ((FILE_DEVICE_SCSI << 16) + 0x0507)
1285 #define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES ((FILE_DEVICE_SCSI << 16) + 0x0508)
1286 #define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS ((FILE_DEVICE_SCSI << 16) + 0x0509)
1287 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTO_OFFLINE ((FILE_DEVICE_SCSI << 16) + 0x050a)
1288 #define IOCTL_SCSI_MINIPORT_READ_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050b)
1289 #define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050c)
1291 /* CLUSTER support */
1292 #define IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0520)
1293 #define IOCTL_SCSI_MINIPORT_NOT_CLUSTER_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0521)
1295 /* READ_TOC formats */
1296 #define READ_TOC_FORMAT_TOC 0x00
1297 #define READ_TOC_FORMAT_SESSION 0x01
1298 #define READ_TOC_FORMAT_FULL_TOC 0x02
1299 #define READ_TOC_FORMAT_PMA 0x03
1300 #define READ_TOC_FORMAT_ATIP 0x04
1302 /* Read Capacity Data. Returned in Big Endian format */
1303 typedef struct _READ_CAPACITY_DATA {
1304 ULONG LogicalBlockAddress;
1305 ULONG BytesPerBlock;
1306 } READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
1308 /* Read Block Limits Data. Returned in Big Endian format */
1309 typedef struct _READ_BLOCK_LIMITS {
1311 UCHAR BlockMaximumSize[3];
1312 UCHAR BlockMinimumSize[2];
1313 } READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA;
1316 typedef struct _MODE_PARAMETER_HEADER {
1317 UCHAR ModeDataLength;
1319 UCHAR DeviceSpecificParameter;
1320 UCHAR BlockDescriptorLength;
1321 }MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
1323 typedef struct _MODE_PARAMETER_HEADER10 {
1324 UCHAR ModeDataLength[2];
1326 UCHAR DeviceSpecificParameter;
1328 UCHAR BlockDescriptorLength[2];
1329 } MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10;
1331 #define MODE_FD_SINGLE_SIDE 0x01
1332 #define MODE_FD_DOUBLE_SIDE 0x02
1333 #define MODE_FD_MAXIMUM_TYPE 0x1E
1334 #define MODE_DSP_FUA_SUPPORTED 0x10
1335 #define MODE_DSP_WRITE_PROTECT 0x80
1337 typedef struct _MODE_PARAMETER_BLOCK {
1339 UCHAR NumberOfBlocks[3];
1341 UCHAR BlockLength[3];
1342 } MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK;
1344 typedef struct _MODE_DISCONNECT_PAGE {
1347 UCHAR PageSavable : 1;
1349 UCHAR BufferFullRatio;
1350 UCHAR BufferEmptyRatio;
1351 UCHAR BusInactivityLimit[2];
1352 UCHAR BusDisconnectTime[2];
1353 UCHAR BusConnectTime[2];
1354 UCHAR MaximumBurstSize[2];
1355 UCHAR DataTransferDisconnect : 2;
1357 }MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE;
1359 typedef struct _MODE_CACHING_PAGE {
1362 UCHAR PageSavable : 1;
1364 UCHAR ReadDisableCache : 1;
1365 UCHAR MultiplicationFactor : 1;
1366 UCHAR WriteCacheEnable : 1;
1367 UCHAR Reserved2 : 5;
1368 UCHAR WriteRetensionPriority : 4;
1369 UCHAR ReadRetensionPriority : 4;
1370 UCHAR DisablePrefetchTransfer[2];
1371 UCHAR MinimumPrefetch[2];
1372 UCHAR MaximumPrefetch[2];
1373 UCHAR MaximumPrefetchCeiling[2];
1374 }MODE_CACHING_PAGE, *PMODE_CACHING_PAGE;
1376 typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE {
1378 UCHAR WriteType : 4;
1379 UCHAR TestWrite : 1;
1380 UCHAR LinkSizeValid : 1;
1381 UCHAR BufferUnderrunFreeEnabled : 1;
1382 UCHAR Reserved2 : 1;
1383 UCHAR TrackMode : 4;
1385 UCHAR FixedPacket : 1;
1386 UCHAR MultiSession : 2;
1387 UCHAR DataBlockType : 4;
1388 UCHAR Reserved3 : 4;
1391 UCHAR HostApplicationCode : 6;
1392 UCHAR Reserved5 : 2;
1393 UCHAR SessionFormat;
1395 UCHAR PacketSize[4];
1396 UCHAR AudioPauseLength[2];
1397 UCHAR Reserved7 : 7;
1398 UCHAR MediaCatalogNumberValid : 1;
1399 UCHAR MediaCatalogNumber[13];
1400 UCHAR MediaCatalogNumberZero;
1401 UCHAR MediaCatalogNumberAFrame;
1402 UCHAR Reserved8 : 7;
1403 UCHAR ISRCValid : 1;
1404 UCHAR ISRCCountry[2];
1406 UCHAR ISRCRecordingYear[2];
1407 UCHAR ISRCSerialNumber[5];
1411 UCHAR SubHeaderData[4];
1412 } MODE_CDROM_WRITE_PARAMETERS_PAGE, *PMODE_CDROM_WRITE_PARAMETERS_PAGE;
1414 typedef struct _MODE_FLEXIBLE_DISK_PAGE {
1417 UCHAR PageSavable : 1;
1419 UCHAR TransferRate[2];
1420 UCHAR NumberOfHeads;
1421 UCHAR SectorsPerTrack;
1422 UCHAR BytesPerSector[2];
1423 UCHAR NumberOfCylinders[2];
1424 UCHAR StartWritePrecom[2];
1425 UCHAR StartReducedCurrent[2];
1427 UCHAR StepPluseWidth;
1428 UCHAR HeadSettleDelay[2];
1430 UCHAR MotorOffDelay;
1431 UCHAR Reserved2 : 5;
1432 UCHAR MotorOnAsserted : 1;
1433 UCHAR StartSectorNumber : 1;
1434 UCHAR TrueReadySignal : 1;
1435 UCHAR StepPlusePerCyclynder : 4;
1436 UCHAR Reserved3 : 4;
1437 UCHAR WriteCompenstation;
1438 UCHAR HeadLoadDelay;
1439 UCHAR HeadUnloadDelay;
1440 UCHAR Pin2Usage : 4;
1441 UCHAR Pin34Usage : 4;
1442 UCHAR Pin1Usage : 4;
1443 UCHAR Pin4Usage : 4;
1444 UCHAR MediumRotationRate[2];
1446 } MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE;
1448 typedef struct _MODE_FORMAT_PAGE {
1451 UCHAR PageSavable : 1;
1453 UCHAR TracksPerZone[2];
1454 UCHAR AlternateSectorsPerZone[2];
1455 UCHAR AlternateTracksPerZone[2];
1456 UCHAR AlternateTracksPerLogicalUnit[2];
1457 UCHAR SectorsPerTrack[2];
1458 UCHAR BytesPerPhysicalSector[2];
1459 UCHAR Interleave[2];
1460 UCHAR TrackSkewFactor[2];
1461 UCHAR CylinderSkewFactor[2];
1462 UCHAR Reserved2 : 4;
1463 UCHAR SurfaceFirst : 1;
1464 UCHAR RemovableMedia : 1;
1465 UCHAR HardSectorFormating : 1;
1466 UCHAR SoftSectorFormating : 1;
1468 } MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE;
1470 typedef struct _MODE_RIGID_GEOMETRY_PAGE {
1473 UCHAR PageSavable : 1;
1475 UCHAR NumberOfCylinders[3];
1476 UCHAR NumberOfHeads;
1477 UCHAR StartWritePrecom[3];
1478 UCHAR StartReducedCurrent[3];
1479 UCHAR DriveStepRate[2];
1480 UCHAR LandZoneCyclinder[3];
1481 UCHAR RotationalPositionLock : 2;
1482 UCHAR Reserved2 : 6;
1483 UCHAR RotationOffset;
1485 UCHAR RoataionRate[2];
1487 } MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE;
1489 typedef struct _MODE_READ_WRITE_RECOVERY_PAGE {
1491 UCHAR Reserved1 : 1;
1502 UCHAR ReadRetryCount;
1504 UCHAR WriteRetryCount;
1506 } MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE;
1508 typedef struct _MODE_READ_RECOVERY_PAGE {
1510 UCHAR Reserved1 : 1;
1516 UCHAR Reserved2 : 1;
1519 UCHAR Reserved3 : 2;
1520 UCHAR ReadRetryCount;
1522 } MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE;
1524 typedef struct _MODE_INFO_EXCEPTIONS {
1526 UCHAR Reserved1 : 1;
1529 _ANONYMOUS_UNION union {
1531 _ANONYMOUS_STRUCT struct {
1533 UCHAR Reserved2 : 1;
1536 UCHAR Reserved3 : 3;
1540 UCHAR ReportMethod : 4;
1541 UCHAR Reserved4 : 4;
1542 UCHAR IntervalTimer[4];
1543 UCHAR ReportCount[4];
1544 } MODE_INFO_EXCEPTIONS, *PMODE_INFO_EXCEPTIONS;
1546 /* CDROM audio control */
1547 #define CDB_AUDIO_PAUSE 0x00
1548 #define CDB_AUDIO_RESUME 0x01
1549 #define CDB_DEVICE_START 0x11
1550 #define CDB_DEVICE_STOP 0x10
1551 #define CDB_EJECT_MEDIA 0x10
1552 #define CDB_LOAD_MEDIA 0x01
1553 #define CDB_SUBCHANNEL_HEADER 0x00
1554 #define CDB_SUBCHANNEL_BLOCK 0x01
1556 #define CDROM_AUDIO_CONTROL_PAGE 0x0E
1557 #define MODE_SELECT_IMMEDIATE 0x04
1558 #define MODE_SELECT_PFBIT 0x10
1560 #define CDB_USE_MSF 0x01
1562 typedef struct _PORT_OUTPUT {
1563 UCHAR ChannelSelection;
1565 } PORT_OUTPUT, *PPORT_OUTPUT;
1567 typedef struct _AUDIO_OUTPUT {
1569 UCHAR ParameterLength;
1573 UCHAR LogicalBlocksPerSecond[2];
1574 PORT_OUTPUT PortOutput[4];
1575 } AUDIO_OUTPUT, *PAUDIO_OUTPUT;
1577 /* Multisession CDROMs */
1578 #define GET_LAST_SESSION 0x01
1579 #define GET_SESSION_DATA 0x02;
1581 /* Atapi 2.5 changers */
1582 typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER {
1583 UCHAR CurrentSlot : 5;
1584 UCHAR ChangerState : 2;
1587 UCHAR MechanismState : 3;
1588 UCHAR CurrentLogicalBlockAddress[3];
1589 UCHAR NumberAvailableSlots;
1590 UCHAR SlotTableLength[2];
1591 } MECHANICAL_STATUS_INFORMATION_HEADER, *PMECHANICAL_STATUS_INFORMATION_HEADER;
1593 typedef struct _SLOT_TABLE_INFORMATION {
1594 UCHAR DiscChanged : 1;
1596 UCHAR DiscPresent : 1;
1598 } SLOT_TABLE_INFORMATION, *PSLOT_TABLE_INFORMATION;
1600 typedef struct _MECHANICAL_STATUS {
1601 MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader;
1602 SLOT_TABLE_INFORMATION SlotTableInfo[1];
1603 } MECHANICAL_STATUS, *PMECHANICAL_STATUS;
1606 /* Tape definitions */
1607 typedef struct _TAPE_POSITION_DATA {
1608 UCHAR Reserved1 : 2;
1609 UCHAR BlockPositionUnsupported : 1;
1610 UCHAR Reserved2 : 3;
1611 UCHAR EndOfPartition : 1;
1612 UCHAR BeginningOfPartition : 1;
1613 UCHAR PartitionNumber;
1615 UCHAR FirstBlock[4];
1618 UCHAR NumberOfBlocks[3];
1619 UCHAR NumberOfBytes[4];
1620 } TAPE_POSITION_DATA, *PTAPE_POSITION_DATA;
1622 /* This structure is used to convert little endian ULONGs
1623 to SCSI CDB big endians values. */
1624 typedef union _EIGHT_BYTE {
1625 _ANONYMOUS_STRUCT struct {
1635 ULONGLONG AsULongLong;
1636 } EIGHT_BYTE, *PEIGHT_BYTE;
1638 typedef union _FOUR_BYTE {
1639 _ANONYMOUS_STRUCT struct {
1646 } FOUR_BYTE, *PFOUR_BYTE;
1648 typedef union _TWO_BYTE {
1649 _ANONYMOUS_STRUCT struct {
1654 } TWO_BYTE, *PTWO_BYTE;
1656 /* Byte reversing macro for converting between
1657 big- and little-endian formats */
1658 #define REVERSE_BYTES_QUAD(Destination, Source) { \
1659 PEIGHT_BYTE _val1 = (PEIGHT_BYTE)(Destination); \
1660 PEIGHT_BYTE _val2 = (PEIGHT_BYTE)(Source); \
1661 _val1->Byte7 = _val2->Byte0; \
1662 _val1->Byte6 = _val2->Byte1; \
1663 _val1->Byte5 = _val2->Byte2; \
1664 _val1->Byte4 = _val2->Byte3; \
1665 _val1->Byte3 = _val2->Byte4; \
1666 _val1->Byte2 = _val2->Byte5; \
1667 _val1->Byte1 = _val2->Byte6; \
1668 _val1->Byte0 = _val2->Byte7; \
1671 #define REVERSE_BYTES(Destination, Source) { \
1672 PFOUR_BYTE _val1 = (PFOUR_BYTE)(Destination); \
1673 PFOUR_BYTE _val2 = (PFOUR_BYTE)(Source); \
1674 _val1->Byte3 = _val2->Byte0; \
1675 _val1->Byte2 = _val2->Byte1; \
1676 _val1->Byte1 = _val2->Byte2; \
1677 _val1->Byte0 = _val2->Byte3; \
1680 #define REVERSE_BYTES_SHORT(Destination, Source) { \
1681 PTWO_BYTE _val1 = (PTWO_BYTE)(Destination); \
1682 PTWO_BYTE _val2 = (PTWO_BYTE)(Source); \
1683 _val1->Byte1 = _val2->Byte0; \
1684 _val1->Byte0 = _val2->Byte1; \
1687 #define REVERSE_SHORT(Short) { \
1689 PTWO_BYTE _val2 = (PTWO_BYTE)(Short); \
1690 _val = _val2->Byte0; \
1691 _val2->Byte0 = _val2->Byte1; \
1692 _val2->Byte1 = _val; \
1695 #define REVERSE_LONG(Long) { \
1697 PFOUR_BYTE _val2 = (PFOUR_BYTE)(Long); \
1698 _val = _val2->Byte3; \
1699 _val2->Byte3 = _val2->Byte0; \
1700 _val2->Byte0 = _val; \
1701 _val = _val2->Byte2; \
1702 _val2->Byte2 = _val2->Byte1; \
1703 _val2->Byte1 = _val; \
1706 #define WHICH_BIT(Data, Bit) { \
1708 for (_val = 0; _val < 32; _val++) { \
1709 if (((Data) >> _val) == 1) { \
1713 ASSERT(_val != 32); \
1721 #endif /* __SCSI_H */