OSDN Git Service

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