OSDN Git Service

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