1 /**
2  * @file scsi.h
3  * Copyright 2012, 2013 MinGW.org project
4  *
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:
11  *
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
14  * Software.
15  *
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.
23  */
24 /* Created by Casper S. Hornstrup <chorns@users.sourceforge.net> */
25 #ifndef __SCSI_H
26 #define __SCSI_H
27 #pragma GCC system_header
28 #include <_mingw.h>
29 
30 /*
31  * SCSI port and class interface.
32  */
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #include "ntddk.h"
39 
40 typedef union _CDB {
41   struct _CDB6GENERIC {
42     UCHAR  OperationCode;
43     UCHAR  Immediate : 1;
44     UCHAR  CommandUniqueBits : 4;
45     UCHAR  LogicalUnitNumber : 3;
46     UCHAR  CommandUniqueBytes[3];
47     UCHAR  Link : 1;
48     UCHAR  Flag : 1;
49     UCHAR  Reserved : 4;
50     UCHAR  VendorUnique : 2;
51   } CDB6GENERIC, *PCDB6GENERIC;
52 
53   struct _CDB6READWRITE {
54     UCHAR  OperationCode;
55     UCHAR  LogicalBlockMsb1 : 5;
56     UCHAR  LogicalUnitNumber : 3;
57     UCHAR  LogicalBlockMsb0;
58     UCHAR  LogicalBlockLsb;
59     UCHAR  TransferBlocks;
60     UCHAR  Control;
61   } CDB6READWRITE, *PCDB6READWRITE;
62 
63   struct _CDB6INQUIRY {
64     UCHAR  OperationCode;
65     UCHAR  Reserved1 : 5;
66     UCHAR  LogicalUnitNumber : 3;
67     UCHAR  PageCode;
68     UCHAR  IReserved;
69     UCHAR  AllocationLength;
70     UCHAR  Control;
71   } CDB6INQUIRY, *PCDB6INQUIRY;
72 
73   struct _CDB6INQUIRY3 {
74     UCHAR  OperationCode;
75     UCHAR  EnableVitalProductData : 1;
76     UCHAR  CommandSupportData : 1;
77     UCHAR  Reserved1 : 6;
78     UCHAR  PageCode;
79     UCHAR  Reserved2;
80     UCHAR  AllocationLength;
81     UCHAR  Control;
82   } CDB6INQUIRY3, *PCDB6INQUIRY3;
83 
84   struct _CDB6VERIFY {
85     UCHAR  OperationCode;
86     UCHAR  Fixed : 1;
87     UCHAR  ByteCompare : 1;
88     UCHAR  Immediate : 1;
89     UCHAR  Reserved : 2;
90     UCHAR  LogicalUnitNumber : 3;
91     UCHAR  VerificationLength[3];
92     UCHAR  Control;
93   } CDB6VERIFY, *PCDB6VERIFY;
94 
95   struct _CDB6FORMAT {
96     UCHAR  OperationCode;
97     UCHAR  FormatControl : 5;
98     UCHAR  LogicalUnitNumber : 3;
99     UCHAR  FReserved1;
100     UCHAR  InterleaveMsb;
101     UCHAR  InterleaveLsb;
102     UCHAR  FReserved2;
103   } CDB6FORMAT, *PCDB6FORMAT;
104 
105   struct _CDB10 {
106     UCHAR  OperationCode;
107     UCHAR  RelativeAddress : 1;
108     UCHAR  Reserved1 : 2;
109     UCHAR  ForceUnitAccess : 1;
110     UCHAR  DisablePageOut : 1;
111     UCHAR  LogicalUnitNumber : 3;
112     UCHAR  LogicalBlockByte0;
113     UCHAR  LogicalBlockByte1;
114     UCHAR  LogicalBlockByte2;
115     UCHAR  LogicalBlockByte3;
116     UCHAR  Reserved2;
117     UCHAR  TransferBlocksMsb;
118     UCHAR  TransferBlocksLsb;
119     UCHAR  Control;
120   } CDB10, *PCDB10;
121 
122   struct _CDB12 {
123     UCHAR  OperationCode;
124     UCHAR  RelativeAddress : 1;
125     UCHAR  Reserved1 : 2;
126     UCHAR  ForceUnitAccess : 1;
127     UCHAR  DisablePageOut : 1;
128     UCHAR  LogicalUnitNumber : 3;
129     UCHAR  LogicalBlock[4];
130     UCHAR  TransferLength[4];
131     UCHAR  Reserved2;
132     UCHAR  Control;
133   } CDB12, *PCDB12;
134 
135   struct _PAUSE_RESUME {
136     UCHAR  OperationCode;
137     UCHAR  Reserved1 : 5;
138     UCHAR  LogicalUnitNumber : 3;
139     UCHAR  Reserved2[6];
140     UCHAR  Action;
141     UCHAR  Control;
142   } PAUSE_RESUME, *PPAUSE_RESUME;
143 
144   struct _READ_TOC {
145     UCHAR  OperationCode;
146     UCHAR  Reserved0 : 1;
147     UCHAR  Msf : 1;
148     UCHAR  Reserved1 : 3;
149     UCHAR  LogicalUnitNumber : 3;
150     UCHAR  Format2 : 4;
151     UCHAR  Reserved2 : 4;
152     UCHAR  Reserved3[3];
153     UCHAR  StartingTrack;
154     UCHAR  AllocationLength[2];
155     UCHAR  Control : 6;
156     UCHAR  Format : 2;
157   } READ_TOC, *PREAD_TOC;
158 
159   struct _READ_DISK_INFORMATION {
160     UCHAR  OperationCode;
161     UCHAR  Reserved1 : 5;
162     UCHAR  Lun : 3;
163     UCHAR  Reserved2[5];
164     UCHAR  AllocationLength[2];
165     UCHAR  Control;
166   } READ_DISK_INFORMATION, *PREAD_DISK_INFORMATION;
167 
168   struct _READ_TRACK_INFORMATION {
169     UCHAR  OperationCode;
170     UCHAR  Track : 1;
171     UCHAR  Reserved1 : 3;
172     UCHAR  Reserved2 : 1;
173     UCHAR  Lun : 3;
174     UCHAR  BlockAddress[4];
175     UCHAR  Reserved3;
176     UCHAR  AllocationLength[2];
177     UCHAR  Control;
178   } READ_TRACK_INFORMATION, *PREAD_TRACK_INFORMATION;
179 
180   struct _RESERVE_TRACK_RZONE {
181     UCHAR  OperationCode;
182     UCHAR  Reserved1[4];
183     UCHAR  ReservationSize[4];
184     UCHAR  Control;
185   } RESERVE_TRACK_RZONE, *PRESERVE_TRACK_RZONE;
186 
187   struct _SEND_OPC_INFORMATION {
188     UCHAR  OperationCode;
189     UCHAR  DoOpc    : 1;
190     UCHAR  Reserved : 7;
191     UCHAR  Reserved1[5];
192     UCHAR  ParameterListLength[2];
193     UCHAR  Reserved2;
194   } SEND_OPC_INFORMATION, *PSEND_OPC_INFORMATION;
195 
196   struct _CLOSE_TRACK {
197     UCHAR  OperationCode;
198     UCHAR  Immediate : 1;
199     UCHAR  Reserved1 : 7;
200     UCHAR  Track     : 1;
201     UCHAR  Session   : 1;
202     UCHAR  Reserved2 : 6;
203     UCHAR  Reserved3;
204     UCHAR  TrackNumber[2];
205     UCHAR  Reserved4[3];
206     UCHAR  Control;
207   } CLOSE_TRACK, *PCLOSE_TRACK;
208 
209   struct _SEND_CUE_SHEET {
210     UCHAR  OperationCode;
211     UCHAR  Reserved[5];
212     UCHAR  CueSheetSize[3];
213     UCHAR  Control;
214   } SEND_CUE_SHEET, *PSEND_CUE_SHEET;
215 
216   struct _READ_HEADER {
217     UCHAR  OperationCode;
218     UCHAR  Reserved1 : 1;
219     UCHAR  Msf : 1;
220     UCHAR  Reserved2 : 3;
221     UCHAR  Lun : 3;
222     UCHAR  LogicalBlockAddress[4];
223     UCHAR  Reserved3;
224     UCHAR  AllocationLength[2];
225     UCHAR  Control;
226   } READ_HEADER, *PREAD_HEADER;
227 
228   struct _PLAY_AUDIO {
229     UCHAR  OperationCode;
230     UCHAR  Reserved1 : 5;
231     UCHAR  LogicalUnitNumber : 3;
232     UCHAR  StartingBlockAddress[4];
233     UCHAR  Reserved2;
234     UCHAR  PlayLength[2];
235     UCHAR  Control;
236   } PLAY_AUDIO, *PPLAY_AUDIO;
237 
238   struct _PLAY_AUDIO_MSF {
239     UCHAR  OperationCode;
240     UCHAR  Reserved1 : 5;
241     UCHAR  LogicalUnitNumber : 3;
242     UCHAR  Reserved2;
243     UCHAR  StartingM;
244     UCHAR  StartingS;
245     UCHAR  StartingF;
246     UCHAR  EndingM;
247     UCHAR  EndingS;
248     UCHAR  EndingF;
249     UCHAR  Control;
250   } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF;
251 
252 /* FIXME: Should the union be anonymous in C++ too?  If so,
253    can't define named types _LBA and _MSF within anonymous union
254    for C++. */
255   struct _PLAY_CD {
256     UCHAR  OperationCode;
257     UCHAR  Reserved1 : 1;
258     UCHAR  CMSF : 1;
259     UCHAR  ExpectedSectorType : 3;
260     UCHAR  Lun : 3;
261 #ifndef __cplusplus
262   _ANONYMOUS_UNION
263 #endif
264   union {
265       struct _LBA {
266             UCHAR  StartingBlockAddress[4];
267             UCHAR  PlayLength[4];
268       } LBA;
269 
270       struct _MSF {
271             UCHAR  Reserved1;
272             UCHAR  StartingM;
273             UCHAR  StartingS;
274             UCHAR  StartingF;
275             UCHAR  EndingM;
276             UCHAR  EndingS;
277             UCHAR  EndingF;
278             UCHAR  Reserved2;
279       } MSF;
280   #ifndef __cplusplus
281   }DUMMYUNIONNAME;
282   #else
283   }u;
284   #endif
285 
286     UCHAR  Audio : 1;
287     UCHAR  Composite : 1;
288     UCHAR  Port1 : 1;
289     UCHAR  Port2 : 1;
290     UCHAR  Reserved2 : 3;
291     UCHAR  Speed : 1;
292     UCHAR  Control;
293   } PLAY_CD, *PPLAY_CD;
294 
295   struct _SCAN_CD {
296     UCHAR  OperationCode;
297     UCHAR  RelativeAddress : 1;
298     UCHAR  Reserved1 : 3;
299     UCHAR  Direct : 1;
300     UCHAR  Lun : 3;
301     UCHAR  StartingAddress[4];
302     UCHAR  Reserved2[3];
303     UCHAR  Reserved3 : 6;
304     UCHAR  Type : 2;
305     UCHAR  Reserved4;
306     UCHAR  Control;
307   } SCAN_CD, *PSCAN_CD;
308 
309   struct _STOP_PLAY_SCAN {
310     UCHAR  OperationCode;
311     UCHAR  Reserved1 : 5;
312     UCHAR  Lun : 3;
313     UCHAR  Reserved2[7];
314     UCHAR  Control;
315   } STOP_PLAY_SCAN, *PSTOP_PLAY_SCAN;
316 
317   struct _SUBCHANNEL {
318     UCHAR  OperationCode;
319     UCHAR  Reserved0 : 1;
320     UCHAR  Msf : 1;
321     UCHAR  Reserved1 : 3;
322     UCHAR  LogicalUnitNumber : 3;
323     UCHAR  Reserved2 : 6;
324     UCHAR  SubQ : 1;
325     UCHAR  Reserved3 : 1;
326     UCHAR  Format;
327     UCHAR  Reserved4[2];
328     UCHAR  TrackNumber;
329     UCHAR  AllocationLength[2];
330     UCHAR  Control;
331   } SUBCHANNEL, *PSUBCHANNEL;
332 
333   struct _READ_CD {
334     UCHAR  OperationCode;
335     UCHAR  RelativeAddress : 1;
336     UCHAR  Reserved0 : 1;
337     UCHAR  ExpectedSectorType : 3;
338     UCHAR  Lun : 3;
339     UCHAR  StartingLBA[4];
340     UCHAR  TransferBlocks[3];
341     UCHAR  Reserved2 : 1;
342     UCHAR  ErrorFlags : 2;
343     UCHAR  IncludeEDC : 1;
344     UCHAR  IncludeUserData : 1;
345     UCHAR  HeaderCode : 2;
346     UCHAR  IncludeSyncData : 1;
347     UCHAR  SubChannelSelection : 3;
348     UCHAR  Reserved3 : 5;
349     UCHAR  Control;
350   } READ_CD, *PREAD_CD;
351 
352   struct _READ_CD_MSF {
353     UCHAR  OperationCode;
354     UCHAR  RelativeAddress : 1;
355     UCHAR  Reserved1 : 1;
356     UCHAR  ExpectedSectorType : 3;
357     UCHAR  Lun : 3;
358     UCHAR  Reserved2;
359     UCHAR  StartingM;
360     UCHAR  StartingS;
361     UCHAR  StartingF;
362     UCHAR  EndingM;
363     UCHAR  EndingS;
364     UCHAR  EndingF;
365     UCHAR  Reserved3;
366     UCHAR  Reserved4 : 1;
367     UCHAR  ErrorFlags : 2;
368     UCHAR  IncludeEDC : 1;
369     UCHAR  IncludeUserData : 1;
370     UCHAR  HeaderCode : 2;
371     UCHAR  IncludeSyncData : 1;
372     UCHAR  SubChannelSelection : 3;
373     UCHAR  Reserved5 : 5;
374     UCHAR  Control;
375   } READ_CD_MSF, *PREAD_CD_MSF;
376 
377   struct _PLXTR_READ_CDDA {
378     UCHAR  OperationCode;
379     UCHAR  Reserved0 : 5;
380     UCHAR  LogicalUnitNumber : 3;
381     UCHAR  LogicalBlockByte0;
382     UCHAR  LogicalBlockByte1;
383     UCHAR  LogicalBlockByte2;
384     UCHAR  LogicalBlockByte3;
385     UCHAR  TransferBlockByte0;
386     UCHAR  TransferBlockByte1;
387     UCHAR  TransferBlockByte2;
388     UCHAR  TransferBlockByte3;
389     UCHAR  SubCode;
390     UCHAR  Control;
391   } PLXTR_READ_CDDA, *PPLXTR_READ_CDDA;
392 
393   struct _NEC_READ_CDDA {
394     UCHAR  OperationCode;
395     UCHAR  Reserved0;
396     UCHAR  LogicalBlockByte0;
397     UCHAR  LogicalBlockByte1;
398     UCHAR  LogicalBlockByte2;
399     UCHAR  LogicalBlockByte3;
400     UCHAR  Reserved1;
401     UCHAR  TransferBlockByte0;
402     UCHAR  TransferBlockByte1;
403     UCHAR  Control;
404   } NEC_READ_CDDA, *PNEC_READ_CDDA;
405 
406   struct _MODE_SENSE {
407     UCHAR  OperationCode;
408     UCHAR  Reserved1 : 3;
409     UCHAR  Dbd : 1;
410     UCHAR  Reserved2 : 1;
411     UCHAR  LogicalUnitNumber : 3;
412     UCHAR  PageCode : 6;
413     UCHAR  Pc : 2;
414     UCHAR  Reserved3;
415     UCHAR  AllocationLength;
416     UCHAR  Control;
417   } MODE_SENSE, *PMODE_SENSE;
418 
419   struct _MODE_SENSE10 {
420     UCHAR  OperationCode;
421     UCHAR  Reserved1 : 3;
422     UCHAR  Dbd : 1;
423     UCHAR  Reserved2 : 1;
424     UCHAR  LogicalUnitNumber : 3;
425     UCHAR  PageCode : 6;
426     UCHAR  Pc : 2;
427     UCHAR  Reserved3[4];
428     UCHAR  AllocationLength[2];
429     UCHAR  Control;
430   } MODE_SENSE10, *PMODE_SENSE10;
431 
432   struct _MODE_SELECT {
433     UCHAR  OperationCode;
434     UCHAR  SPBit : 1;
435     UCHAR  Reserved1 : 3;
436     UCHAR  PFBit : 1;
437     UCHAR  LogicalUnitNumber : 3;
438     UCHAR  Reserved2[2];
439     UCHAR  ParameterListLength;
440     UCHAR  Control;
441   } MODE_SELECT, *PMODE_SELECT;
442 
443   struct _MODE_SELECT10 {
444     UCHAR  OperationCode;
445     UCHAR  SPBit : 1;
446     UCHAR  Reserved1 : 3;
447     UCHAR  PFBit : 1;
448     UCHAR  LogicalUnitNumber : 3;
449     UCHAR  Reserved2[5];
450     UCHAR  ParameterListLength[2];
451     UCHAR  Control;
452   } MODE_SELECT10, *PMODE_SELECT10;
453 
454   struct _LOCATE {
455     UCHAR  OperationCode;
456     UCHAR  Immediate : 1;
457     UCHAR  CPBit : 1;
458     UCHAR  BTBit : 1;
459     UCHAR  Reserved1 : 2;
460     UCHAR  LogicalUnitNumber : 3;
461     UCHAR  Reserved3;
462     UCHAR  LogicalBlockAddress[4];
463     UCHAR  Reserved4;
464     UCHAR  Partition;
465     UCHAR  Control;
466   } LOCATE, *PLOCATE;
467 
468   struct _LOGSENSE {
469     UCHAR  OperationCode;
470     UCHAR  SPBit : 1;
471     UCHAR  PPCBit : 1;
472     UCHAR  Reserved1 : 3;
473     UCHAR  LogicalUnitNumber : 3;
474     UCHAR  PageCode : 6;
475     UCHAR  PCBit : 2;
476     UCHAR  Reserved2;
477     UCHAR  Reserved3;
478     UCHAR  ParameterPointer[2];
479     UCHAR  AllocationLength[2];
480     UCHAR  Control;
481   } LOGSENSE, *PLOGSENSE;
482 
483   struct _LOGSELECT {
484     UCHAR  OperationCode;
485     UCHAR  SPBit : 1;
486     UCHAR  PCRBit : 1;
487     UCHAR  Reserved1 : 3;
488     UCHAR  LogicalUnitNumber : 3;
489     UCHAR  Reserved : 6;
490     UCHAR  PCBit : 2;
491     UCHAR  Reserved2[4];
492     UCHAR  ParameterListLength[2];
493     UCHAR  Control;
494   } LOGSELECT, *PLOGSELECT;
495 
496   struct _PRINT {
497     UCHAR  OperationCode;
498     UCHAR  Reserved : 5;
499     UCHAR  LogicalUnitNumber : 3;
500     UCHAR  TransferLength[3];
501     UCHAR  Control;
502   } PRINT, *PPRINT;
503 
504   struct _SEEK {
505     UCHAR  OperationCode;
506     UCHAR  Reserved1 : 5;
507     UCHAR  LogicalUnitNumber : 3;
508     UCHAR  LogicalBlockAddress[4];
509     UCHAR  Reserved2[3];
510     UCHAR  Control;
511   } SEEK, *PSEEK;
512 
513   struct _ERASE {
514     UCHAR  OperationCode;
515     UCHAR  Long : 1;
516     UCHAR  Immediate : 1;
517     UCHAR  Reserved1 : 3;
518     UCHAR  LogicalUnitNumber : 3;
519     UCHAR  Reserved2[3];
520     UCHAR  Control;
521   } ERASE, *PERASE;
522 
523   struct _START_STOP {
524     UCHAR  OperationCode;
525     UCHAR  Immediate: 1;
526     UCHAR  Reserved1 : 4;
527     UCHAR  LogicalUnitNumber : 3;
528     UCHAR  Reserved2[2];
529     UCHAR  Start : 1;
530     UCHAR  LoadEject : 1;
531     UCHAR  Reserved3 : 6;
532     UCHAR  Control;
533   } START_STOP, *PSTART_STOP;
534 
535   struct _MEDIA_REMOVAL {
536     UCHAR  OperationCode;
537     UCHAR  Reserved1 : 5;
538     UCHAR  LogicalUnitNumber : 3;
539     UCHAR  Reserved2[2];
540 
541     UCHAR  Prevent : 1;
542     UCHAR  Persistant : 1;
543     UCHAR  Reserved3 : 6;
544 
545     UCHAR  Control;
546   } MEDIA_REMOVAL, *PMEDIA_REMOVAL;
547 
548   struct _SEEK_BLOCK {
549     UCHAR  OperationCode;
550     UCHAR  Immediate : 1;
551     UCHAR  Reserved1 : 7;
552     UCHAR  BlockAddress[3];
553     UCHAR  Link : 1;
554     UCHAR  Flag : 1;
555     UCHAR  Reserved2 : 4;
556     UCHAR  VendorUnique : 2;
557   } SEEK_BLOCK, *PSEEK_BLOCK;
558 
559   struct _REQUEST_BLOCK_ADDRESS {
560     UCHAR  OperationCode;
561     UCHAR  Reserved1[3];
562     UCHAR  AllocationLength;
563     UCHAR  Link : 1;
564     UCHAR  Flag : 1;
565     UCHAR  Reserved2 : 4;
566     UCHAR  VendorUnique : 2;
567   } REQUEST_BLOCK_ADDRESS, *PREQUEST_BLOCK_ADDRESS;
568 
569   struct _PARTITION {
570     UCHAR  OperationCode;
571     UCHAR  Immediate : 1;
572     UCHAR  Sel: 1;
573     UCHAR  PartitionSelect : 6;
574     UCHAR  Reserved1[3];
575     UCHAR  Control;
576   } PARTITION, *PPARTITION;
577 
578   struct _WRITE_TAPE_MARKS {
579     UCHAR  OperationCode;
580     UCHAR  Immediate : 1;
581     UCHAR  WriteSetMarks: 1;
582     UCHAR  Reserved : 3;
583     UCHAR  LogicalUnitNumber : 3;
584     UCHAR  TransferLength[3];
585     UCHAR  Control;
586   } WRITE_TAPE_MARKS, *PWRITE_TAPE_MARKS;
587 
588   struct _SPACE_TAPE_MARKS {
589     UCHAR  OperationCode;
590     UCHAR  Code : 3;
591     UCHAR  Reserved : 2;
592     UCHAR  LogicalUnitNumber : 3;
593     UCHAR  NumMarksMSB ;
594     UCHAR  NumMarks;
595     UCHAR  NumMarksLSB;
596   union {
597         UCHAR  value;
598       struct {
599             UCHAR  Link : 1;
600             UCHAR  Flag : 1;
601             UCHAR  Reserved : 4;
602             UCHAR  VendorUnique : 2;
603       } Fields;
604   } Byte6;
605   } SPACE_TAPE_MARKS, *PSPACE_TAPE_MARKS;
606 
607   struct _READ_POSITION {
608     UCHAR  Operation;
609     UCHAR  BlockType : 1;
610     UCHAR  Reserved1 : 4;
611     UCHAR  Lun : 3;
612     UCHAR  Reserved2[7];
613     UCHAR  Control;
614   } READ_POSITION, *PREAD_POSITION;
615 
616   struct _CDB6READWRITETAPE {
617     UCHAR  OperationCode;
618     UCHAR  VendorSpecific : 5;
619     UCHAR  Reserved : 3;
620     UCHAR  TransferLenMSB;
621     UCHAR  TransferLen;
622     UCHAR  TransferLenLSB;
623     UCHAR  Link : 1;
624     UCHAR  Flag : 1;
625     UCHAR  Reserved1 : 4;
626     UCHAR  VendorUnique : 2;
627   } CDB6READWRITETAPE, *PCDB6READWRITETAPE;
628 
629   struct _INIT_ELEMENT_STATUS {
630     UCHAR  OperationCode;
631     UCHAR  Reserved1 : 5;
632     UCHAR  LogicalUnitNubmer : 3;
633     UCHAR  Reserved2[3];
634     UCHAR  Reserved3 : 7;
635     UCHAR  NoBarCode : 1;
636   } INIT_ELEMENT_STATUS, *PINIT_ELEMENT_STATUS;
637 
638   struct _INITIALIZE_ELEMENT_RANGE {
639     UCHAR  OperationCode;
640     UCHAR  Range : 1;
641     UCHAR  Reserved1 : 4;
642     UCHAR  LogicalUnitNubmer : 3;
643     UCHAR  FirstElementAddress[2];
644     UCHAR  Reserved2[2];
645     UCHAR  NumberOfElements[2];
646     UCHAR  Reserved3;
647     UCHAR  Reserved4 : 7;
648     UCHAR  NoBarCode : 1;
649   } INITIALIZE_ELEMENT_RANGE, *PINITIALIZE_ELEMENT_RANGE;
650 
651   struct _POSITION_TO_ELEMENT {
652     UCHAR  OperationCode;
653     UCHAR  Reserved1 : 5;
654     UCHAR  LogicalUnitNumber : 3;
655     UCHAR  TransportElementAddress[2];
656     UCHAR  DestinationElementAddress[2];
657     UCHAR  Reserved2[2];
658     UCHAR  Flip : 1;
659     UCHAR  Reserved3 : 7;
660     UCHAR  Control;
661   } POSITION_TO_ELEMENT, *PPOSITION_TO_ELEMENT;
662 
663   struct _MOVE_MEDIUM {
664     UCHAR  OperationCode;
665     UCHAR  Reserved1 : 5;
666     UCHAR  LogicalUnitNumber : 3;
667     UCHAR  TransportElementAddress[2];
668     UCHAR  SourceElementAddress[2];
669     UCHAR  DestinationElementAddress[2];
670     UCHAR  Reserved2[2];
671     UCHAR  Flip : 1;
672     UCHAR  Reserved3 : 7;
673     UCHAR  Control;
674   } MOVE_MEDIUM, *PMOVE_MEDIUM;
675 
676   struct _EXCHANGE_MEDIUM {
677     UCHAR  OperationCode;
678     UCHAR  Reserved1 : 5;
679     UCHAR  LogicalUnitNumber : 3;
680     UCHAR  TransportElementAddress[2];
681     UCHAR  SourceElementAddress[2];
682     UCHAR  Destination1ElementAddress[2];
683     UCHAR  Destination2ElementAddress[2];
684     UCHAR  Flip1 : 1;
685     UCHAR  Flip2 : 1;
686     UCHAR  Reserved3 : 6;
687     UCHAR  Control;
688   } EXCHANGE_MEDIUM, *PEXCHANGE_MEDIUM;
689 
690   struct _READ_ELEMENT_STATUS {
691     UCHAR  OperationCode;
692     UCHAR  ElementType : 4;
693     UCHAR  VolTag : 1;
694     UCHAR  LogicalUnitNumber : 3;
695     UCHAR  StartingElementAddress[2];
696     UCHAR  NumberOfElements[2];
697     UCHAR  Reserved1;
698     UCHAR  AllocationLength[3];
699     UCHAR  Reserved2;
700     UCHAR  Control;
701   } READ_ELEMENT_STATUS, *PREAD_ELEMENT_STATUS;
702 
703   struct _SEND_VOLUME_TAG {
704     UCHAR  OperationCode;
705     UCHAR  ElementType : 4;
706     UCHAR  Reserved1 : 1;
707     UCHAR  LogicalUnitNumber : 3;
708     UCHAR  StartingElementAddress[2];
709     UCHAR  Reserved2;
710     UCHAR  ActionCode : 5;
711     UCHAR  Reserved3 : 3;
712     UCHAR  Reserved4[2];
713     UCHAR  ParameterListLength[2];
714     UCHAR  Reserved5;
715     UCHAR  Control;
716   } SEND_VOLUME_TAG, *PSEND_VOLUME_TAG;
717 
718   struct _REQUEST_VOLUME_ELEMENT_ADDRESS {
719     UCHAR  OperationCode;
720     UCHAR  ElementType : 4;
721     UCHAR  VolTag : 1;
722     UCHAR  LogicalUnitNumber : 3;
723     UCHAR  StartingElementAddress[2];
724     UCHAR  NumberElements[2];
725     UCHAR  Reserved1;
726     UCHAR  AllocationLength[3];
727     UCHAR  Reserved2;
728     UCHAR  Control;
729   } REQUEST_VOLUME_ELEMENT_ADDRESS, *PREQUEST_VOLUME_ELEMENT_ADDRESS;
730 
731   struct _LOAD_UNLOAD {
732     UCHAR  OperationCode;
733     UCHAR  Immediate : 1;
734     UCHAR  Reserved1 : 4;
735     UCHAR  Lun : 3;
736     UCHAR  Reserved2[2];
737     UCHAR  Start : 1;
738     UCHAR  LoadEject : 1;
739     UCHAR  Reserved3: 6;
740     UCHAR  Reserved4[3];
741     UCHAR  Slot;
742     UCHAR  Reserved5[3];
743   } LOAD_UNLOAD, *PLOAD_UNLOAD;
744 
745   struct _MECH_STATUS {
746     UCHAR  OperationCode;
747     UCHAR  Reserved : 5;
748     UCHAR  Lun : 3;
749     UCHAR  Reserved1[6];
750     UCHAR  AllocationLength[2];
751     UCHAR  Reserved2[1];
752     UCHAR  Control;
753   } MECH_STATUS, *PMECH_STATUS;
754 
755   struct _SYNCHRONIZE_CACHE10 {
756 
757     UCHAR  OperationCode;
758 
759     UCHAR  RelAddr : 1;
760     UCHAR  Immediate : 1;
761     UCHAR  Reserved : 3;
762     UCHAR  Lun : 3;
763 
764     UCHAR  LogicalBlockAddress[4];
765     UCHAR  Reserved2;
766     UCHAR  BlockCount[2];
767     UCHAR  Control;
768   } SYNCHRONIZE_CACHE10, *PSYNCHRONIZE_CACHE10;
769 
770   struct _GET_EVENT_STATUS_NOTIFICATION {
771     UCHAR  OperationCode;
772 
773     UCHAR  Immediate : 1;
774     UCHAR  Reserved : 4;
775     UCHAR  Lun : 3;
776 
777     UCHAR  Reserved2[2];
778     UCHAR  NotificationClassRequest;
779     UCHAR  Reserved3[2];
780     UCHAR  EventListLength[2];
781 
782     UCHAR  Control;
783   } GET_EVENT_STATUS_NOTIFICATION, *PGET_EVENT_STATUS_NOTIFICATION;
784 
785   struct _READ_DVD_STRUCTURE {
786     UCHAR  OperationCode;
787     UCHAR  Reserved1 : 5;
788     UCHAR  Lun : 3;
789     UCHAR  RMDBlockNumber[4];
790     UCHAR  LayerNumber;
791     UCHAR  Format;
792     UCHAR  AllocationLength[2];
793     UCHAR  Reserved3 : 6;
794     UCHAR  AGID : 2;
795     UCHAR  Control;
796   } READ_DVD_STRUCTURE, *PREAD_DVD_STRUCTURE;
797 
798   struct _SEND_DVD_STRUCTURE {
799     UCHAR  OperationCode;
800     UCHAR  Reserved1 : 5;
801     UCHAR  Lun : 3;
802     UCHAR  Reserved2[5];
803     UCHAR  Format;
804     UCHAR  ParameterListLength[2];
805     UCHAR  Reserved3;
806     UCHAR  Control;
807   } SEND_DVD_STRUCTURE, *PSEND_DVD_STRUCTURE;
808 
809   struct _SEND_KEY {
810     UCHAR  OperationCode;
811     UCHAR  Reserved1 : 5;
812     UCHAR  Lun : 3;
813     UCHAR  Reserved2[6];
814     UCHAR  ParameterListLength[2];
815     UCHAR  KeyFormat : 6;
816     UCHAR  AGID : 2;
817     UCHAR  Control;
818   } SEND_KEY, *PSEND_KEY;
819 
820   struct _REPORT_KEY {
821     UCHAR  OperationCode;
822     UCHAR  Reserved1 : 5;
823     UCHAR  Lun : 3;
824     UCHAR  LogicalBlockAddress[4];
825     UCHAR  Reserved2[2];
826     UCHAR  AllocationLength[2];
827     UCHAR  KeyFormat : 6;
828     UCHAR  AGID : 2;
829     UCHAR  Control;
830   } REPORT_KEY, *PREPORT_KEY;
831 
832   struct _SET_READ_AHEAD {
833     UCHAR  OperationCode;
834     UCHAR  Reserved1 : 5;
835     UCHAR  Lun : 3;
836     UCHAR  TriggerLBA[4];
837     UCHAR  ReadAheadLBA[4];
838     UCHAR  Reserved2;
839     UCHAR  Control;
840   } SET_READ_AHEAD, *PSET_READ_AHEAD;
841 
842   struct _READ_FORMATTED_CAPACITIES {
843     UCHAR  OperationCode;
844     UCHAR  Reserved1 : 5;
845     UCHAR  Lun : 3;
846     UCHAR  Reserved2[5];
847     UCHAR  AllocationLength[2];
848     UCHAR  Control;
849   } READ_FORMATTED_CAPACITIES, *PREAD_FORMATTED_CAPACITIES;
850 
851   struct _REPORT_LUNS {
852     UCHAR  OperationCode;
853     UCHAR  Reserved1[5];
854     UCHAR  AllocationLength[4];
855     UCHAR  Reserved2[1];
856     UCHAR  Control;
857   } REPORT_LUNS, *PREPORT_LUNS;
858 
859   struct _PERSISTENT_RESERVE_IN {
860     UCHAR  OperationCode;
861     UCHAR  ServiceAction : 5;
862     UCHAR  Reserved1 : 3;
863     UCHAR  Reserved2[5];
864     UCHAR  AllocationLength[2];
865     UCHAR  Control;
866   } PERSISTENT_RESERVE_IN, *PPERSISTENT_RESERVE_IN;
867 
868   struct _PERSISTENT_RESERVE_OUT {
869     UCHAR  OperationCode;
870     UCHAR  ServiceAction : 5;
871     UCHAR  Reserved1 : 3;
872     UCHAR  Type : 4;
873     UCHAR  Scope : 4;
874     UCHAR  Reserved2[4];
875     UCHAR  ParameterListLength[2];
876     UCHAR  Control;
877   } PERSISTENT_RESERVE_OUT, *PPERSISTENT_RESERVE_OUT;
878 
879   struct _GET_CONFIGURATION {
880     UCHAR  OperationCode;
881     UCHAR  RequestType : 1;
882     UCHAR  Reserved1   : 7;
883     UCHAR  StartingFeature[2];
884     UCHAR  Reserved2[3];
885     UCHAR  AllocationLength[2];
886     UCHAR  Control;
887   } GET_CONFIGURATION, *PGET_CONFIGURATION;
888 
889   struct _SET_CD_SPEED {
890     UCHAR  OperationCode;
891     UCHAR  Reserved1;
892     UCHAR  ReadSpeed[2];
893     UCHAR  WriteSpeed[2];
894     UCHAR  Reserved2[5];
895     UCHAR  Control;
896   } SET_CD_SPEED, *PSET_CD_SPEED;
897 
898   ULONG AsUlong[4];
899     UCHAR  AsByte[16];
900 } CDB, *PCDB;
901 
902 #ifndef _INQUIRYDATA_DEFINED /* also in minitape.h */
903 #define _INQUIRYDATA_DEFINED
904 
905 #define INQUIRYDATABUFFERSIZE             36
906 
907 typedef struct _INQUIRYDATA {
908   UCHAR  DeviceType : 5;
909   UCHAR  DeviceTypeQualifier : 3;
910   UCHAR  DeviceTypeModifier : 7;
911   UCHAR  RemovableMedia : 1;
912   _ANONYMOUS_UNION union {
913     UCHAR  Versions;
914     _ANONYMOUS_STRUCT struct {
915       UCHAR  ANSIVersion : 3;
916       UCHAR  ECMAVersion : 3;
917       UCHAR  ISOVersion : 2;
918     } DUMMYSTRUCTNAME;
919   } DUMMYUNIONNAME;
920   UCHAR  ResponseDataFormat : 4;
921   UCHAR  HiSupport : 1;
922   UCHAR  NormACA : 1;
923   UCHAR  TerminateTask : 1;
924   UCHAR  AERC : 1;
925   UCHAR  AdditionalLength;
926   UCHAR  Reserved;
927   UCHAR  Addr16 : 1;
928   UCHAR  Addr32 : 1;
929   UCHAR  AckReqQ: 1;
930   UCHAR  MediumChanger : 1;
931   UCHAR  MultiPort : 1;
932   UCHAR  ReservedBit2 : 1;
933   UCHAR  EnclosureServices : 1;
934   UCHAR  ReservedBit3 : 1;
935   UCHAR  SoftReset : 1;
936   UCHAR  CommandQueue : 1;
937   UCHAR  TransferDisable : 1;
938   UCHAR  LinkedCommands : 1;
939   UCHAR  Synchronous : 1;
940   UCHAR  Wide16Bit : 1;
941   UCHAR  Wide32Bit : 1;
942   UCHAR  RelativeAddressing : 1;
943   UCHAR  VendorId[8];
944   UCHAR  ProductId[16];
945   UCHAR  ProductRevisionLevel[4];
946   UCHAR  VendorSpecific[20];
947   UCHAR  Reserved3[40];
948 } INQUIRYDATA, *PINQUIRYDATA;
949 #endif
950 
951 /* INQUIRYDATA.DeviceType constants */
952 #define DIRECT_ACCESS_DEVICE              0x00
953 #define SEQUENTIAL_ACCESS_DEVICE          0x01
954 #define PRINTER_DEVICE                    0x02
955 #define PROCESSOR_DEVICE                  0x03
956 #define WRITE_ONCE_READ_MULTIPLE_DEVICE   0x04
957 #define READ_ONLY_DIRECT_ACCESS_DEVICE    0x05
958 #define SCANNER_DEVICE                    0x06
959 #define OPTICAL_DEVICE                    0x07
960 #define MEDIUM_CHANGER                    0x08
961 #define COMMUNICATION_DEVICE              0x09
962 #define LOGICAL_UNIT_NOT_PRESENT_DEVICE   0x7F
963 #define DEVICE_QUALIFIER_NOT_SUPPORTED    0x03
964 
965 /* INQUIRYDATA.DeviceTypeQualifier constants */
966 #define DEVICE_CONNECTED 0x00
967 
968 #define SCSISTAT_GOOD                     0x00
969 #define SCSISTAT_CHECK_CONDITION          0x02
970 #define SCSISTAT_CONDITION_MET            0x04
971 #define SCSISTAT_BUSY                     0x08
972 #define SCSISTAT_INTERMEDIATE             0x10
973 #define SCSISTAT_INTERMEDIATE_COND_MET    0x14
974 #define SCSISTAT_RESERVATION_CONFLICT     0x18
975 #define SCSISTAT_COMMAND_TERMINATED       0x22
976 #define SCSISTAT_QUEUE_FULL               0x28
977 
978 /* Mode Sense/Select page constants */
979 #define MODE_PAGE_ERROR_RECOVERY          0x01
980 #define MODE_PAGE_DISCONNECT              0x02
981 #define MODE_PAGE_FORMAT_DEVICE           0x03
982 #define MODE_PAGE_RIGID_GEOMETRY          0x04
983 #define MODE_PAGE_FLEXIBILE               0x05
984 #define MODE_PAGE_WRITE_PARAMETERS        0x05
985 #define MODE_PAGE_VERIFY_ERROR            0x07
986 #define MODE_PAGE_CACHING                 0x08
987 #define MODE_PAGE_PERIPHERAL              0x09
988 #define MODE_PAGE_CONTROL                 0x0A
989 #define MODE_PAGE_MEDIUM_TYPES            0x0B
990 #define MODE_PAGE_NOTCH_PARTITION         0x0C
991 #define MODE_PAGE_CD_AUDIO_CONTROL        0x0E
992 #define MODE_PAGE_DATA_COMPRESS           0x0F
993 #define MODE_PAGE_DEVICE_CONFIG           0x10
994 #define MODE_PAGE_MEDIUM_PARTITION        0x11
995 #define MODE_PAGE_CDVD_FEATURE_SET        0x18
996 #define MODE_PAGE_POWER_CONDITION         0x1A
997 #define MODE_PAGE_FAULT_REPORTING         0x1C
998 #define MODE_PAGE_CDVD_INACTIVITY         0x1D
999 #define MODE_PAGE_ELEMENT_ADDRESS         0x1D
1000 #define MODE_PAGE_TRANSPORT_GEOMETRY      0x1E
1001 #define MODE_PAGE_DEVICE_CAPABILITIES     0x1F
1002 #define MODE_PAGE_CAPABILITIES            0x2A
1003 #define MODE_SENSE_RETURN_ALL             0x3f
1004 #define MODE_SENSE_CURRENT_VALUES         0x00
1005 #define MODE_SENSE_CHANGEABLE_VALUES      0x40
1006 #define MODE_SENSE_DEFAULT_VAULES         0x80
1007 #define MODE_SENSE_SAVED_VALUES           0xc0
1008 
1009 /* SCSI CDB operation codes */
1010 #define SCSIOP_TEST_UNIT_READY            0x00
1011 #define SCSIOP_REZERO_UNIT                0x01
1012 #define SCSIOP_REWIND                     0x01
1013 #define SCSIOP_REQUEST_BLOCK_ADDR         0x02
1014 #define SCSIOP_REQUEST_SENSE              0x03
1015 #define SCSIOP_FORMAT_UNIT                0x04
1016 #define SCSIOP_READ_BLOCK_LIMITS          0x05
1017 #define SCSIOP_REASSIGN_BLOCKS            0x07
1018 #define SCSIOP_INIT_ELEMENT_STATUS        0x07
1019 #define SCSIOP_READ6                      0x08
1020 #define SCSIOP_RECEIVE                    0x08
1021 #define SCSIOP_WRITE6                     0x0A
1022 #define SCSIOP_PRINT                      0x0A
1023 #define SCSIOP_SEND                       0x0A
1024 #define SCSIOP_SEEK6                      0x0B
1025 #define SCSIOP_TRACK_SELECT               0x0B
1026 #define SCSIOP_SLEW_PRINT                 0x0B
1027 #define SCSIOP_SEEK_BLOCK                 0x0C
1028 #define SCSIOP_PARTITION                  0x0D
1029 #define SCSIOP_READ_REVERSE               0x0F
1030 #define SCSIOP_WRITE_FILEMARKS            0x10
1031 #define SCSIOP_FLUSH_BUFFER               0x10
1032 #define SCSIOP_SPACE                      0x11
1033 #define SCSIOP_INQUIRY                    0x12
1034 #define SCSIOP_VERIFY6                    0x13
1035 #define SCSIOP_RECOVER_BUF_DATA           0x14
1036 #define SCSIOP_MODE_SELECT                0x15
1037 #define SCSIOP_RESERVE_UNIT               0x16
1038 #define SCSIOP_RELEASE_UNIT               0x17
1039 #define SCSIOP_COPY                       0x18
1040 #define SCSIOP_ERASE                      0x19
1041 #define SCSIOP_MODE_SENSE                 0x1A
1042 #define SCSIOP_START_STOP_UNIT            0x1B
1043 #define SCSIOP_STOP_PRINT                 0x1B
1044 #define SCSIOP_LOAD_UNLOAD                0x1B
1045 #define SCSIOP_RECEIVE_DIAGNOSTIC         0x1C
1046 #define SCSIOP_SEND_DIAGNOSTIC            0x1D
1047 #define SCSIOP_MEDIUM_REMOVAL             0x1E
1048 
1049 #define SCSIOP_READ_FORMATTED_CAPACITY    0x23
1050 #define SCSIOP_READ_CAPACITY              0x25
1051 #define SCSIOP_READ                       0x28
1052 #define SCSIOP_WRITE                      0x2A
1053 #define SCSIOP_SEEK                       0x2B
1054 #define SCSIOP_LOCATE                     0x2B
1055 #define SCSIOP_POSITION_TO_ELEMENT        0x2B
1056 #define SCSIOP_WRITE_VERIFY               0x2E
1057 #define SCSIOP_VERIFY                     0x2F
1058 #define SCSIOP_SEARCH_DATA_HIGH           0x30
1059 #define SCSIOP_SEARCH_DATA_EQUAL          0x31
1060 #define SCSIOP_SEARCH_DATA_LOW            0x32
1061 #define SCSIOP_SET_LIMITS                 0x33
1062 #define SCSIOP_READ_POSITION              0x34
1063 #define SCSIOP_SYNCHRONIZE_CACHE          0x35
1064 #define SCSIOP_COMPARE                    0x39
1065 #define SCSIOP_COPY_COMPARE               0x3A
1066 #define SCSIOP_WRITE_DATA_BUFF            0x3B
1067 #define SCSIOP_READ_DATA_BUFF             0x3C
1068 #define SCSIOP_CHANGE_DEFINITION          0x40
1069 #define SCSIOP_READ_SUB_CHANNEL           0x42
1070 #define SCSIOP_READ_TOC                   0x43
1071 #define SCSIOP_READ_HEADER                0x44
1072 #define SCSIOP_PLAY_AUDIO                 0x45
1073 #define SCSIOP_GET_CONFIGURATION          0x46
1074 #define SCSIOP_PLAY_AUDIO_MSF             0x47
1075 #define SCSIOP_PLAY_TRACK_INDEX           0x48
1076 #define SCSIOP_PLAY_TRACK_RELATIVE        0x49
1077 #define SCSIOP_GET_EVENT_STATUS           0x4A
1078 #define SCSIOP_PAUSE_RESUME               0x4B
1079 #define SCSIOP_LOG_SELECT                 0x4C
1080 #define SCSIOP_LOG_SENSE                  0x4D
1081 #define SCSIOP_STOP_PLAY_SCAN             0x4E
1082 #define SCSIOP_READ_DISK_INFORMATION      0x51
1083 #define SCSIOP_READ_TRACK_INFORMATION     0x52
1084 #define SCSIOP_RESERVE_TRACK_RZONE        0x53
1085 #define SCSIOP_SEND_OPC_INFORMATION       0x54
1086 #define SCSIOP_MODE_SELECT10              0x55
1087 #define SCSIOP_MODE_SENSE10               0x5A
1088 #define SCSIOP_CLOSE_TRACK_SESSION        0x5B
1089 #define SCSIOP_READ_BUFFER_CAPACITY       0x5C
1090 #define SCSIOP_SEND_CUE_SHEET             0x5D
1091 #define SCSIOP_PERSISTENT_RESERVE_IN      0x5E
1092 #define SCSIOP_PERSISTENT_RESERVE_OUT     0x5F
1093 
1094 #define SCSIOP_REPORT_LUNS                0xA0
1095 #define SCSIOP_BLANK                      0xA1
1096 #define SCSIOP_SEND_KEY                   0xA3
1097 #define SCSIOP_REPORT_KEY                 0xA4
1098 #define SCSIOP_MOVE_MEDIUM                0xA5
1099 #define SCSIOP_LOAD_UNLOAD_SLOT           0xA6
1100 #define SCSIOP_EXCHANGE_MEDIUM            0xA6
1101 #define SCSIOP_SET_READ_AHEAD             0xA7
1102 #define SCSIOP_READ_DVD_STRUCTURE         0xAD
1103 #define SCSIOP_REQUEST_VOL_ELEMENT        0xB5
1104 #define SCSIOP_SEND_VOLUME_TAG            0xB6
1105 #define SCSIOP_READ_ELEMENT_STATUS        0xB8
1106 #define SCSIOP_READ_CD_MSF                0xB9
1107 #define SCSIOP_SCAN_CD                    0xBA
1108 #define SCSIOP_SET_CD_SPEED               0xBB
1109 #define SCSIOP_PLAY_CD                    0xBC
1110 #define SCSIOP_MECHANISM_STATUS           0xBD
1111 #define SCSIOP_READ_CD                    0xBE
1112 #define SCSIOP_SEND_DVD_STRUCTURE         0xBF
1113 #define SCSIOP_INIT_ELEMENT_RANGE         0xE7
1114 
1115 #define SCSIOP_DENON_EJECT_DISC           0xE6
1116 #define SCSIOP_DENON_STOP_AUDIO           0xE7
1117 #define SCSIOP_DENON_PLAY_AUDIO           0xE8
1118 #define SCSIOP_DENON_READ_TOC             0xE9
1119 #define SCSIOP_DENON_READ_SUBCODE         0xEB
1120 
1121 #define SCSIMESS_MODIFY_DATA_POINTER      0x00
1122 #define SCSIMESS_SYNCHRONOUS_DATA_REQ     0x01
1123 #define SCSIMESS_WIDE_DATA_REQUEST        0x03
1124 
1125 #define SCSIMESS_MODIFY_DATA_LENGTH       5
1126 #define SCSIMESS_SYNCH_DATA_LENGTH        3
1127 #define SCSIMESS_WIDE_DATA_LENGTH         2
1128 
1129 #define SCSIMESS_ABORT                    0x06
1130 #define SCSIMESS_ABORT_WITH_TAG           0x0D
1131 #define SCSIMESS_BUS_DEVICE_RESET         0x0C
1132 #define SCSIMESS_CLEAR_QUEUE              0x0E
1133 #define SCSIMESS_COMMAND_COMPLETE         0x00
1134 #define SCSIMESS_DISCONNECT               0x04
1135 #define SCSIMESS_EXTENDED_MESSAGE         0x01
1136 #define SCSIMESS_IDENTIFY                 0x80
1137 #define SCSIMESS_IDENTIFY_WITH_DISCON     0xC0
1138 #define SCSIMESS_IGNORE_WIDE_RESIDUE      0x23
1139 #define SCSIMESS_INITIATE_RECOVERY        0x0F
1140 #define SCSIMESS_INIT_DETECTED_ERROR      0x05
1141 #define SCSIMESS_LINK_CMD_COMP            0x0A
1142 #define SCSIMESS_LINK_CMD_COMP_W_FLAG     0x0B
1143 #define SCSIMESS_MESS_PARITY_ERROR        0x09
1144 #define SCSIMESS_MESSAGE_REJECT           0x07
1145 #define SCSIMESS_NO_OPERATION             0x08
1146 #define SCSIMESS_HEAD_OF_QUEUE_TAG        0x21
1147 #define SCSIMESS_ORDERED_QUEUE_TAG        0x22
1148 #define SCSIMESS_SIMPLE_QUEUE_TAG         0x20
1149 #define SCSIMESS_RELEASE_RECOVERY         0x10
1150 #define SCSIMESS_RESTORE_POINTERS         0x03
1151 #define SCSIMESS_SAVE_DATA_POINTER        0x02
1152 #define SCSIMESS_TERMINATE_IO_PROCESS     0x11
1153 
1154 #define CDB_FORCE_MEDIA_ACCESS            0x08
1155 
1156 #define CDB_RETURN_ON_COMPLETION          0
1157 #define CDB_RETURN_IMMEDIATE              1
1158 
1159 #define CDB_INQUIRY_EVPD                  0x01
1160 
1161 #define LUN0_FORMAT_SAVING_DEFECT_LIST    0
1162 #define USE_DEFAULTMSB                    0
1163 #define USE_DEFAULTLSB                    0
1164 
1165 #define START_UNIT_CODE                   0x01
1166 #define STOP_UNIT_CODE                    0x00
1167 
1168 typedef struct _SENSE_DATA {
1169   UCHAR  ErrorCode : 7;
1170   UCHAR  Valid : 1;
1171   UCHAR  SegmentNumber;
1172   UCHAR  SenseKey : 4;
1173   UCHAR  Reserved : 1;
1174   UCHAR  IncorrectLength : 1;
1175   UCHAR  EndOfMedia : 1;
1176   UCHAR  FileMark : 1;
1177   UCHAR  Information[4];
1178   UCHAR  AdditionalSenseLength;
1179   UCHAR  CommandSpecificInformation[4];
1180   UCHAR  AdditionalSenseCode;
1181   UCHAR  AdditionalSenseCodeQualifier;
1182   UCHAR  FieldReplaceableUnitCode;
1183   UCHAR  SenseKeySpecific[3];
1184 } SENSE_DATA, *PSENSE_DATA;
1185 
1186 #define SENSE_BUFFER_SIZE                 18
1187 
1188 /* Sense codes */
1189 #define SCSI_SENSE_NO_SENSE               0x00
1190 #define SCSI_SENSE_RECOVERED_ERROR        0x01
1191 #define SCSI_SENSE_NOT_READY              0x02
1192 #define SCSI_SENSE_MEDIUM_ERROR           0x03
1193 #define SCSI_SENSE_HARDWARE_ERROR         0x04
1194 #define SCSI_SENSE_ILLEGAL_REQUEST        0x05
1195 #define SCSI_SENSE_UNIT_ATTENTION         0x06
1196 #define SCSI_SENSE_DATA_PROTECT           0x07
1197 #define SCSI_SENSE_BLANK_CHECK            0x08
1198 #define SCSI_SENSE_UNIQUE                 0x09
1199 #define SCSI_SENSE_COPY_ABORTED           0x0A
1200 #define SCSI_SENSE_ABORTED_COMMAND        0x0B
1201 #define SCSI_SENSE_EQUAL                  0x0C
1202 #define SCSI_SENSE_VOL_OVERFLOW           0x0D
1203 #define SCSI_SENSE_MISCOMPARE             0x0E
1204 #define SCSI_SENSE_RESERVED               0x0F
1205 
1206 /* Additional tape bit */
1207 #define SCSI_ILLEGAL_LENGTH               0x20
1208 #define SCSI_EOM                          0x40
1209 #define SCSI_FILE_MARK                    0x80
1210 
1211 /* Additional Sense codes */
1212 #define SCSI_ADSENSE_NO_SENSE                              0x00
1213 #define SCSI_ADSENSE_NO_SEEK_COMPLETE                      0x02
1214 #define SCSI_ADSENSE_LUN_NOT_READY                         0x04
1215 #define SCSI_ADSENSE_WRITE_ERROR                           0x0C
1216 #define SCSI_ADSENSE_TRACK_ERROR                           0x14
1217 #define SCSI_ADSENSE_SEEK_ERROR                            0x15
1218 #define SCSI_ADSENSE_REC_DATA_NOECC                        0x17
1219 #define SCSI_ADSENSE_REC_DATA_ECC                          0x18
1220 #define SCSI_ADSENSE_ILLEGAL_COMMAND                       0x20
1221 #define SCSI_ADSENSE_ILLEGAL_BLOCK                         0x21
1222 #define SCSI_ADSENSE_INVALID_CDB                           0x24
1223 #define SCSI_ADSENSE_INVALID_LUN                           0x25
1224 #define SCSI_ADSENSE_WRITE_PROTECT                         0x27
1225 #define SCSI_ADSENSE_MEDIUM_CHANGED                        0x28
1226 #define SCSI_ADSENSE_BUS_RESET                             0x29
1227 #define SCSI_ADSENSE_INSUFFICIENT_TIME_FOR_OPERATION       0x2E
1228 #define SCSI_ADSENSE_INVALID_MEDIA                         0x30
1229 #define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE                    0x3a
1230 #define SCSI_ADSENSE_POSITION_ERROR                        0x3b
1231 #define SCSI_ADSENSE_OPERATOR_REQUEST                      0x5a
1232 #define SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5d
1233 #define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK           0x64
1234 #define SCSI_ADSENSE_COPY_PROTECTION_FAILURE               0x6f
1235 #define SCSI_ADSENSE_POWER_CALIBRATION_ERROR               0x73
1236 #define SCSI_ADSENSE_VENDOR_UNIQUE                         0x80
1237 #define SCSI_ADSENSE_MUSIC_AREA                            0xA0
1238 #define SCSI_ADSENSE_DATA_AREA                             0xA1
1239 #define SCSI_ADSENSE_VOLUME_OVERFLOW                       0xA7
1240 
1241 #define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE                   0x00
1242 #define SCSI_SENSEQ_BECOMING_READY                         0x01
1243 #define SCSI_SENSEQ_INIT_COMMAND_REQUIRED                  0x02
1244 #define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED           0x03
1245 #define SCSI_SENSEQ_FORMAT_IN_PROGRESS                     0x04
1246 #define SCSI_SENSEQ_REBUILD_IN_PROGRESS                    0x05
1247 #define SCSI_SENSEQ_RECALCULATION_IN_PROGRESS              0x06
1248 #define SCSI_SENSEQ_OPERATION_IN_PROGRESS                  0x07
1249 #define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS                 0x08
1250 #define SCSI_SENSEQ_LOSS_OF_STREAMING                      0x09
1251 #define SCSI_SENSEQ_PADDING_BLOCKS_ADDED                   0x0A
1252 
1253 
1254 #define FILE_DEVICE_SCSI 0x0000001b
1255 
1256 #define IOCTL_SCSI_EXECUTE_IN ((FILE_DEVICE_SCSI << 16) + 0x0011)
1257 #define IOCTL_SCSI_EXECUTE_OUT ((FILE_DEVICE_SCSI << 16) + 0x0012)
1258 #define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013)
1259 
1260 /* SMART support in ATAPI */
1261 #define IOCTL_SCSI_MINIPORT_SMART_VERSION               ((FILE_DEVICE_SCSI << 16) + 0x0500)
1262 #define IOCTL_SCSI_MINIPORT_IDENTIFY                    ((FILE_DEVICE_SCSI << 16) + 0x0501)
1263 #define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS          ((FILE_DEVICE_SCSI << 16) + 0x0502)
1264 #define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS       ((FILE_DEVICE_SCSI << 16) + 0x0503)
1265 #define IOCTL_SCSI_MINIPORT_ENABLE_SMART                ((FILE_DEVICE_SCSI << 16) + 0x0504)
1266 #define IOCTL_SCSI_MINIPORT_DISABLE_SMART               ((FILE_DEVICE_SCSI << 16) + 0x0505)
1267 #define IOCTL_SCSI_MINIPORT_RETURN_STATUS               ((FILE_DEVICE_SCSI << 16) + 0x0506)
1268 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE     ((FILE_DEVICE_SCSI << 16) + 0x0507)
1269 #define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES       ((FILE_DEVICE_SCSI << 16) + 0x0508)
1270 #define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS       ((FILE_DEVICE_SCSI << 16) + 0x0509)
1271 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTO_OFFLINE ((FILE_DEVICE_SCSI << 16) + 0x050a)
1272 #define IOCTL_SCSI_MINIPORT_READ_SMART_LOG              ((FILE_DEVICE_SCSI << 16) + 0x050b)
1273 #define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG             ((FILE_DEVICE_SCSI << 16) + 0x050c)
1274 
1275 /* CLUSTER support */
1276 #define IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE  ((FILE_DEVICE_SCSI << 16) + 0x0520)
1277 #define IOCTL_SCSI_MINIPORT_NOT_CLUSTER_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0521)
1278 
1279 /* READ_TOC formats */
1280 #define READ_TOC_FORMAT_TOC         0x00
1281 #define READ_TOC_FORMAT_SESSION     0x01
1282 #define READ_TOC_FORMAT_FULL_TOC    0x02
1283 #define READ_TOC_FORMAT_PMA         0x03
1284 #define READ_TOC_FORMAT_ATIP        0x04
1285 
1286 /* Read Capacity Data. Returned in Big Endian format */
1287 typedef struct _READ_CAPACITY_DATA {
1288   ULONG  LogicalBlockAddress;
1289   ULONG  BytesPerBlock;
1290 } READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
1291 
1292 /* Read Block Limits Data. Returned in Big Endian format */
1293 typedef struct _READ_BLOCK_LIMITS {
1294   UCHAR  Reserved;
1295   UCHAR  BlockMaximumSize[3];
1296   UCHAR  BlockMinimumSize[2];
1297 } READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA;
1298 
1299 
1300 typedef struct _MODE_PARAMETER_HEADER {
1301   UCHAR  ModeDataLength;
1302   UCHAR  MediumType;
1303   UCHAR  DeviceSpecificParameter;
1304   UCHAR  BlockDescriptorLength;
1305 }MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
1306 
1307 typedef struct _MODE_PARAMETER_HEADER10 {
1308   UCHAR  ModeDataLength[2];
1309   UCHAR  MediumType;
1310   UCHAR  DeviceSpecificParameter;
1311   UCHAR  Reserved[2];
1312   UCHAR  BlockDescriptorLength[2];
1313 } MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10;
1314 
1315 #define MODE_FD_SINGLE_SIDE               0x01
1316 #define MODE_FD_DOUBLE_SIDE               0x02
1317 #define MODE_FD_MAXIMUM_TYPE              0x1E
1318 #define MODE_DSP_FUA_SUPPORTED            0x10
1319 #define MODE_DSP_WRITE_PROTECT            0x80
1320 
1321 typedef struct _MODE_PARAMETER_BLOCK {
1322   UCHAR  DensityCode;
1323   UCHAR  NumberOfBlocks[3];
1324   UCHAR  Reserved;
1325   UCHAR  BlockLength[3];
1326 } MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK;
1327 
1328 typedef struct _MODE_DISCONNECT_PAGE {
1329   UCHAR  PageCode : 6;
1330   UCHAR  Reserved : 1;
1331   UCHAR  PageSavable : 1;
1332   UCHAR  PageLength;
1333   UCHAR  BufferFullRatio;
1334   UCHAR  BufferEmptyRatio;
1335   UCHAR  BusInactivityLimit[2];
1336   UCHAR  BusDisconnectTime[2];
1337   UCHAR  BusConnectTime[2];
1338   UCHAR  MaximumBurstSize[2];
1339   UCHAR  DataTransferDisconnect : 2;
1340   UCHAR  Reserved2[3];
1341 }MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE;
1342 
1343 typedef struct _MODE_CACHING_PAGE {
1344   UCHAR  PageCode : 6;
1345   UCHAR  Reserved : 1;
1346   UCHAR  PageSavable : 1;
1347   UCHAR  PageLength;
1348   UCHAR  ReadDisableCache : 1;
1349   UCHAR  MultiplicationFactor : 1;
1350   UCHAR  WriteCacheEnable : 1;
1351   UCHAR  Reserved2 : 5;
1352   UCHAR  WriteRetensionPriority : 4;
1353   UCHAR  ReadRetensionPriority : 4;
1354   UCHAR  DisablePrefetchTransfer[2];
1355   UCHAR  MinimumPrefetch[2];
1356   UCHAR  MaximumPrefetch[2];
1357   UCHAR  MaximumPrefetchCeiling[2];
1358 }MODE_CACHING_PAGE, *PMODE_CACHING_PAGE;
1359 
1360 typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE {
1361   UCHAR  PageLength;
1362   UCHAR  WriteType : 4;
1363   UCHAR  TestWrite : 1;
1364   UCHAR  LinkSizeValid : 1;
1365   UCHAR  BufferUnderrunFreeEnabled : 1;
1366   UCHAR  Reserved2 : 1;
1367   UCHAR  TrackMode : 4;
1368   UCHAR  Copy : 1;
1369   UCHAR  FixedPacket : 1;
1370   UCHAR  MultiSession : 2;
1371   UCHAR  DataBlockType : 4;
1372   UCHAR  Reserved3 : 4;
1373   UCHAR  LinkSize;
1374   UCHAR  Reserved4;
1375   UCHAR  HostApplicationCode : 6;
1376   UCHAR  Reserved5 : 2;
1377   UCHAR  SessionFormat;
1378   UCHAR  Reserved6;
1379   UCHAR  PacketSize[4];
1380   UCHAR  AudioPauseLength[2];
1381   UCHAR  Reserved7 : 7;
1382   UCHAR  MediaCatalogNumberValid : 1;
1383   UCHAR  MediaCatalogNumber[13];
1384   UCHAR  MediaCatalogNumberZero;
1385   UCHAR  MediaCatalogNumberAFrame;
1386   UCHAR  Reserved8 : 7;
1387   UCHAR  ISRCValid : 1;
1388   UCHAR  ISRCCountry[2];
1389   UCHAR  ISRCOwner[3];
1390   UCHAR  ISRCRecordingYear[2];
1391   UCHAR  ISRCSerialNumber[5];
1392   UCHAR  ISRCZero;
1393   UCHAR  ISRCAFrame;
1394   UCHAR  ISRCReserved;
1395   UCHAR  SubHeaderData[4];
1396 } MODE_CDROM_WRITE_PARAMETERS_PAGE, *PMODE_CDROM_WRITE_PARAMETERS_PAGE;
1397 
1398 typedef struct _MODE_FLEXIBLE_DISK_PAGE {
1399   UCHAR  PageCode : 6;
1400   UCHAR  Reserved : 1;
1401   UCHAR  PageSavable : 1;
1402   UCHAR  PageLength;
1403   UCHAR  TransferRate[2];
1404   UCHAR  NumberOfHeads;
1405   UCHAR  SectorsPerTrack;
1406   UCHAR  BytesPerSector[2];
1407   UCHAR  NumberOfCylinders[2];
1408   UCHAR  StartWritePrecom[2];
1409   UCHAR  StartReducedCurrent[2];
1410   UCHAR  StepRate[2];
1411   UCHAR  StepPluseWidth;
1412   UCHAR  HeadSettleDelay[2];
1413   UCHAR  MotorOnDelay;
1414   UCHAR  MotorOffDelay;
1415   UCHAR  Reserved2 : 5;
1416   UCHAR  MotorOnAsserted : 1;
1417   UCHAR  StartSectorNumber : 1;
1418   UCHAR  TrueReadySignal : 1;
1419   UCHAR  StepPlusePerCyclynder : 4;
1420   UCHAR  Reserved3 : 4;
1421   UCHAR  WriteCompenstation;
1422   UCHAR  HeadLoadDelay;
1423   UCHAR  HeadUnloadDelay;
1424   UCHAR  Pin2Usage : 4;
1425   UCHAR  Pin34Usage : 4;
1426   UCHAR  Pin1Usage : 4;
1427   UCHAR  Pin4Usage : 4;
1428   UCHAR  MediumRotationRate[2];
1429   UCHAR  Reserved4[2];
1430 } MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE;
1431 
1432 typedef struct _MODE_FORMAT_PAGE {
1433   UCHAR  PageCode : 6;
1434   UCHAR  Reserved : 1;
1435   UCHAR  PageSavable : 1;
1436   UCHAR  PageLength;
1437   UCHAR  TracksPerZone[2];
1438   UCHAR  AlternateSectorsPerZone[2];
1439   UCHAR  AlternateTracksPerZone[2];
1440   UCHAR  AlternateTracksPerLogicalUnit[2];
1441   UCHAR  SectorsPerTrack[2];
1442   UCHAR  BytesPerPhysicalSector[2];
1443   UCHAR  Interleave[2];
1444   UCHAR  TrackSkewFactor[2];
1445   UCHAR  CylinderSkewFactor[2];
1446   UCHAR  Reserved2 : 4;
1447   UCHAR  SurfaceFirst : 1;
1448   UCHAR  RemovableMedia : 1;
1449   UCHAR  HardSectorFormating : 1;
1450   UCHAR  SoftSectorFormating : 1;
1451   UCHAR  Reserved3[3];
1452 } MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE;
1453 
1454 typedef struct _MODE_RIGID_GEOMETRY_PAGE {
1455   UCHAR  PageCode : 6;
1456   UCHAR  Reserved : 1;
1457   UCHAR  PageSavable : 1;
1458   UCHAR  PageLength;
1459   UCHAR  NumberOfCylinders[3];
1460   UCHAR  NumberOfHeads;
1461   UCHAR  StartWritePrecom[3];
1462   UCHAR  StartReducedCurrent[3];
1463   UCHAR  DriveStepRate[2];
1464   UCHAR  LandZoneCyclinder[3];
1465   UCHAR  RotationalPositionLock : 2;
1466   UCHAR  Reserved2 : 6;
1467   UCHAR  RotationOffset;
1468   UCHAR  Reserved3;
1469   UCHAR  RoataionRate[2];
1470   UCHAR  Reserved4[2];
1471 } MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE;
1472 
1473 typedef struct _MODE_READ_WRITE_RECOVERY_PAGE {
1474   UCHAR  PageCode : 6;
1475   UCHAR  Reserved1 : 1;
1476   UCHAR  PSBit : 1;
1477   UCHAR  PageLength;
1478   UCHAR  DCRBit : 1;
1479   UCHAR  DTEBit : 1;
1480   UCHAR  PERBit : 1;
1481   UCHAR  EERBit : 1;
1482   UCHAR  RCBit : 1;
1483   UCHAR  TBBit : 1;
1484   UCHAR  ARRE : 1;
1485   UCHAR  AWRE : 1;
1486   UCHAR  ReadRetryCount;
1487   UCHAR  Reserved4[4];
1488   UCHAR  WriteRetryCount;
1489   UCHAR  Reserved5[3];
1490 } MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE;
1491 
1492 typedef struct _MODE_READ_RECOVERY_PAGE {
1493   UCHAR  PageCode : 6;
1494   UCHAR  Reserved1 : 1;
1495   UCHAR  PSBit : 1;
1496   UCHAR  PageLength;
1497   UCHAR  DCRBit : 1;
1498   UCHAR  DTEBit : 1;
1499   UCHAR  PERBit : 1;
1500   UCHAR  Reserved2 : 1;
1501   UCHAR  RCBit : 1;
1502   UCHAR  TBBit : 1;
1503   UCHAR  Reserved3 : 2;
1504   UCHAR  ReadRetryCount;
1505   UCHAR  Reserved4[4];
1506 } MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE;
1507 
1508 typedef struct _MODE_INFO_EXCEPTIONS {
1509   UCHAR  PageCode : 6;
1510   UCHAR  Reserved1 : 1;
1511   UCHAR  PSBit : 1;
1512   UCHAR  PageLength;
1513   _ANONYMOUS_UNION union {
1514     UCHAR  Flags;
1515     _ANONYMOUS_STRUCT struct {
1516       UCHAR  LogErr : 1;
1517       UCHAR  Reserved2 : 1;
1518       UCHAR  Test : 1;
1519       UCHAR  Dexcpt : 1;
1520       UCHAR  Reserved3 : 3;
1521       UCHAR  Perf : 1;
1522     } DUMMYSTRUCTNAME;
1523   } DUMMYUNIONNAME;
1524   UCHAR  ReportMethod : 4;
1525   UCHAR  Reserved4 : 4;
1526   UCHAR  IntervalTimer[4];
1527   UCHAR  ReportCount[4];
1528 } MODE_INFO_EXCEPTIONS, *PMODE_INFO_EXCEPTIONS;
1529 
1530 /* CDROM audio control */
1531 #define CDB_AUDIO_PAUSE                   0x00
1532 #define CDB_AUDIO_RESUME                  0x01
1533 #define CDB_DEVICE_START                  0x11
1534 #define CDB_DEVICE_STOP                   0x10
1535 #define CDB_EJECT_MEDIA                   0x10
1536 #define CDB_LOAD_MEDIA                    0x01
1537 #define CDB_SUBCHANNEL_HEADER             0x00
1538 #define CDB_SUBCHANNEL_BLOCK              0x01
1539 
1540 #define CDROM_AUDIO_CONTROL_PAGE          0x0E
1541 #define MODE_SELECT_IMMEDIATE             0x04
1542 #define MODE_SELECT_PFBIT                 0x10
1543 
1544 #define CDB_USE_MSF                       0x01
1545 
1546 typedef struct _PORT_OUTPUT {
1547   UCHAR  ChannelSelection;
1548   UCHAR  Volume;
1549 } PORT_OUTPUT, *PPORT_OUTPUT;
1550 
1551 typedef struct _AUDIO_OUTPUT {
1552   UCHAR  CodePage;
1553   UCHAR  ParameterLength;
1554   UCHAR  Immediate;
1555   UCHAR  Reserved[2];
1556   UCHAR  LbaFormat;
1557   UCHAR  LogicalBlocksPerSecond[2];
1558   PORT_OUTPUT  PortOutput[4];
1559 } AUDIO_OUTPUT, *PAUDIO_OUTPUT;
1560 
1561 /* Multisession CDROMs */
1562 #define GET_LAST_SESSION 0x01
1563 #define GET_SESSION_DATA 0x02;
1564 
1565 /* Atapi 2.5 changers */
1566 typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER {
1567   UCHAR  CurrentSlot : 5;
1568   UCHAR  ChangerState : 2;
1569   UCHAR  Fault : 1;
1570   UCHAR  Reserved : 5;
1571   UCHAR  MechanismState : 3;
1572   UCHAR  CurrentLogicalBlockAddress[3];
1573   UCHAR  NumberAvailableSlots;
1574   UCHAR  SlotTableLength[2];
1575 } MECHANICAL_STATUS_INFORMATION_HEADER, *PMECHANICAL_STATUS_INFORMATION_HEADER;
1576 
1577 typedef struct _SLOT_TABLE_INFORMATION {
1578   UCHAR  DiscChanged : 1;
1579   UCHAR  Reserved : 6;
1580   UCHAR  DiscPresent : 1;
1581   UCHAR  Reserved2[3];
1582 } SLOT_TABLE_INFORMATION, *PSLOT_TABLE_INFORMATION;
1583 
1584 typedef struct _MECHANICAL_STATUS {
1585   MECHANICAL_STATUS_INFORMATION_HEADER  MechanicalStatusHeader;
1586   SLOT_TABLE_INFORMATION  SlotTableInfo[1];
1587 } MECHANICAL_STATUS, *PMECHANICAL_STATUS;
1588 
1589 
1590 /* Tape definitions */
1591 typedef struct _TAPE_POSITION_DATA {
1592 	UCHAR  Reserved1 : 2;
1593 	UCHAR  BlockPositionUnsupported : 1;
1594 	UCHAR  Reserved2 : 3;
1595 	UCHAR  EndOfPartition : 1;
1596 	UCHAR  BeginningOfPartition : 1;
1597 	UCHAR  PartitionNumber;
1598 	USHORT  Reserved3;
1599 	UCHAR  FirstBlock[4];
1600 	UCHAR  LastBlock[4];
1601 	UCHAR  Reserved4;
1602 	UCHAR  NumberOfBlocks[3];
1603 	UCHAR  NumberOfBytes[4];
1604 } TAPE_POSITION_DATA, *PTAPE_POSITION_DATA;
1605 
1606 /* This structure is used to convert little endian ULONGs
1607    to SCSI CDB big endians values. */
1608 typedef union _EIGHT_BYTE {
1609   _ANONYMOUS_STRUCT struct {
1610     UCHAR  Byte0;
1611     UCHAR  Byte1;
1612     UCHAR  Byte2;
1613     UCHAR  Byte3;
1614     UCHAR  Byte4;
1615     UCHAR  Byte5;
1616     UCHAR  Byte6;
1617     UCHAR  Byte7;
1618   } DUMMYSTRUCTNAME;
1619   ULONGLONG  AsULongLong;
1620 } EIGHT_BYTE, *PEIGHT_BYTE;
1621 
1622 typedef union _FOUR_BYTE {
1623   _ANONYMOUS_STRUCT struct {
1624     UCHAR  Byte0;
1625     UCHAR  Byte1;
1626     UCHAR  Byte2;
1627     UCHAR  Byte3;
1628   } DUMMYSTRUCTNAME;
1629   ULONG  AsULong;
1630 } FOUR_BYTE, *PFOUR_BYTE;
1631 
1632 typedef union _TWO_BYTE {
1633   _ANONYMOUS_STRUCT struct {
1634     UCHAR  Byte0;
1635     UCHAR  Byte1;
1636   } DUMMYSTRUCTNAME;
1637   USHORT  AsUShort;
1638 } TWO_BYTE, *PTWO_BYTE;
1639 
1640 /* Byte reversing macro for converting between
1641    big- and little-endian formats */
1642 #define REVERSE_BYTES_QUAD(Destination, Source) { \
1643     PEIGHT_BYTE _val1 = (PEIGHT_BYTE)(Destination); \
1644     PEIGHT_BYTE _val2 = (PEIGHT_BYTE)(Source); \
1645     _val1->Byte7 = _val2->Byte0; \
1646     _val1->Byte6 = _val2->Byte1; \
1647     _val1->Byte5 = _val2->Byte2; \
1648     _val1->Byte4 = _val2->Byte3; \
1649     _val1->Byte3 = _val2->Byte4; \
1650     _val1->Byte2 = _val2->Byte5; \
1651     _val1->Byte1 = _val2->Byte6; \
1652     _val1->Byte0 = _val2->Byte7; \
1653 }
1654 
1655 #define REVERSE_BYTES(Destination, Source) { \
1656     PFOUR_BYTE _val1 = (PFOUR_BYTE)(Destination); \
1657     PFOUR_BYTE _val2 = (PFOUR_BYTE)(Source); \
1658     _val1->Byte3 = _val2->Byte0; \
1659     _val1->Byte2 = _val2->Byte1; \
1660     _val1->Byte1 = _val2->Byte2; \
1661     _val1->Byte0 = _val2->Byte3; \
1662 }
1663 
1664 #define REVERSE_BYTES_SHORT(Destination, Source) { \
1665   PTWO_BYTE _val1 = (PTWO_BYTE)(Destination); \
1666   PTWO_BYTE _val2 = (PTWO_BYTE)(Source); \
1667   _val1->Byte1 = _val2->Byte0; \
1668   _val1->Byte0 = _val2->Byte1; \
1669 }
1670 
1671 #define REVERSE_SHORT(Short) { \
1672   UCHAR _val; \
1673   PTWO_BYTE _val2 = (PTWO_BYTE)(Short); \
1674   _val = _val2->Byte0; \
1675   _val2->Byte0 = _val2->Byte1; \
1676   _val2->Byte1 = _val; \
1677 }
1678 
1679 #define REVERSE_LONG(Long) { \
1680   UCHAR _val; \
1681   PFOUR_BYTE _val2 = (PFOUR_BYTE)(Long); \
1682   _val = _val2->Byte3; \
1683   _val2->Byte3 = _val2->Byte0; \
1684   _val2->Byte0 = _val; \
1685   _val = _val2->Byte2; \
1686   _val2->Byte2 = _val2->Byte1; \
1687   _val2->Byte1 = _val; \
1688 }
1689 
1690 #define WHICH_BIT(Data, Bit) { \
1691   UCHAR _val; \
1692   for (_val = 0; _val < 32; _val++) { \
1693     if (((Data) >> _val) == 1) { \
1694       break; \
1695     } \
1696   } \
1697   ASSERT(_val != 32); \
1698   (Bit) = _val; \
1699 }
1700 
1701 #ifdef __cplusplus
1702 }
1703 #endif
1704 
1705 #endif /* __SCSI_H */
1706