Naveen Neel / shedskin
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers scsi.h Source File

scsi.h

00001 /*
00002  * scsi.h
00003  *
00004  * SCSI port and class interface.
00005  *
00006  * This file is part of the w32api package.
00007  *
00008  * Contributors:
00009  *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
00010  *
00011  * THIS SOFTWARE IS NOT COPYRIGHTED
00012  *
00013  * This source code is offered for use in the public domain. You may
00014  * use, modify or distribute it freely.
00015  *
00016  * This code is distributed in the hope that it will be useful but
00017  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
00018  * DISCLAIMED. This includes but is not limited to warranties of
00019  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00020  *
00021  */
00022 
00023 #ifndef __SCSI_H
00024 #define __SCSI_H
00025 
00026 #if __GNUC__ >=3
00027 #pragma GCC system_header
00028 #endif
00029 
00030 #ifdef __cplusplus
00031 extern "C" {
00032 #endif
00033 
00034 #include "ntddk.h"
00035 
00036 typedef union _CDB {
00037   struct _CDB6GENERIC {
00038     UCHAR  OperationCode;
00039     UCHAR  Immediate : 1;
00040     UCHAR  CommandUniqueBits : 4;
00041     UCHAR  LogicalUnitNumber : 3;
00042     UCHAR  CommandUniqueBytes[3];
00043     UCHAR  Link : 1;
00044     UCHAR  Flag : 1;
00045     UCHAR  Reserved : 4;
00046     UCHAR  VendorUnique : 2;
00047   } CDB6GENERIC, *PCDB6GENERIC;
00048   
00049   struct _CDB6READWRITE {
00050     UCHAR  OperationCode;
00051     UCHAR  LogicalBlockMsb1 : 5;
00052     UCHAR  LogicalUnitNumber : 3;
00053     UCHAR  LogicalBlockMsb0;
00054     UCHAR  LogicalBlockLsb;
00055     UCHAR  TransferBlocks;
00056     UCHAR  Control;
00057   } CDB6READWRITE, *PCDB6READWRITE;
00058   
00059   struct _CDB6INQUIRY {
00060     UCHAR  OperationCode;
00061     UCHAR  Reserved1 : 5;
00062     UCHAR  LogicalUnitNumber : 3;
00063     UCHAR  PageCode;
00064     UCHAR  IReserved;
00065     UCHAR  AllocationLength;
00066     UCHAR  Control;
00067   } CDB6INQUIRY, *PCDB6INQUIRY;
00068   
00069   struct _CDB6INQUIRY3 {
00070     UCHAR  OperationCode;
00071     UCHAR  EnableVitalProductData : 1;
00072     UCHAR  CommandSupportData : 1;
00073     UCHAR  Reserved1 : 6;
00074     UCHAR  PageCode;
00075     UCHAR  Reserved2;
00076     UCHAR  AllocationLength;
00077     UCHAR  Control;
00078   } CDB6INQUIRY3, *PCDB6INQUIRY3;
00079   
00080   struct _CDB6VERIFY {
00081     UCHAR  OperationCode;
00082     UCHAR  Fixed : 1;
00083     UCHAR  ByteCompare : 1;
00084     UCHAR  Immediate : 1;
00085     UCHAR  Reserved : 2;
00086     UCHAR  LogicalUnitNumber : 3;
00087     UCHAR  VerificationLength[3];
00088     UCHAR  Control;
00089   } CDB6VERIFY, *PCDB6VERIFY;
00090   
00091   struct _CDB6FORMAT {
00092     UCHAR  OperationCode;
00093     UCHAR  FormatControl : 5;
00094     UCHAR  LogicalUnitNumber : 3;
00095     UCHAR  FReserved1;
00096     UCHAR  InterleaveMsb;
00097     UCHAR  InterleaveLsb;
00098     UCHAR  FReserved2;
00099   } CDB6FORMAT, *PCDB6FORMAT;
00100   
00101   struct _CDB10 {
00102     UCHAR  OperationCode;
00103     UCHAR  RelativeAddress : 1;
00104     UCHAR  Reserved1 : 2;
00105     UCHAR  ForceUnitAccess : 1;
00106     UCHAR  DisablePageOut : 1;
00107     UCHAR  LogicalUnitNumber : 3;
00108     UCHAR  LogicalBlockByte0;
00109     UCHAR  LogicalBlockByte1;
00110     UCHAR  LogicalBlockByte2;
00111     UCHAR  LogicalBlockByte3;
00112     UCHAR  Reserved2;
00113     UCHAR  TransferBlocksMsb;
00114     UCHAR  TransferBlocksLsb;
00115     UCHAR  Control;
00116   } CDB10, *PCDB10;
00117   
00118   struct _CDB12 {
00119     UCHAR  OperationCode;
00120     UCHAR  RelativeAddress : 1;
00121     UCHAR  Reserved1 : 2;
00122     UCHAR  ForceUnitAccess : 1;
00123     UCHAR  DisablePageOut : 1;
00124     UCHAR  LogicalUnitNumber : 3;
00125     UCHAR  LogicalBlock[4];
00126     UCHAR  TransferLength[4];
00127     UCHAR  Reserved2;
00128     UCHAR  Control;
00129   } CDB12, *PCDB12;
00130   
00131   struct _PAUSE_RESUME {
00132     UCHAR  OperationCode;
00133     UCHAR  Reserved1 : 5;
00134     UCHAR  LogicalUnitNumber : 3;
00135     UCHAR  Reserved2[6];
00136     UCHAR  Action;
00137     UCHAR  Control;
00138   } PAUSE_RESUME, *PPAUSE_RESUME;
00139   
00140   struct _READ_TOC {
00141     UCHAR  OperationCode;
00142     UCHAR  Reserved0 : 1;
00143     UCHAR  Msf : 1;
00144     UCHAR  Reserved1 : 3;
00145     UCHAR  LogicalUnitNumber : 3;
00146     UCHAR  Format2 : 4;
00147     UCHAR  Reserved2 : 4;
00148     UCHAR  Reserved3[3];
00149     UCHAR  StartingTrack;
00150     UCHAR  AllocationLength[2];
00151     UCHAR  Control : 6;
00152     UCHAR  Format : 2;
00153   } READ_TOC, *PREAD_TOC;
00154   
00155   struct _READ_DISK_INFORMATION {
00156     UCHAR  OperationCode;
00157     UCHAR  Reserved1 : 5;
00158     UCHAR  Lun : 3;
00159     UCHAR  Reserved2[5];
00160     UCHAR  AllocationLength[2];
00161     UCHAR  Control;
00162   } READ_DISK_INFORMATION, *PREAD_DISK_INFORMATION;
00163   
00164   struct _READ_TRACK_INFORMATION {
00165     UCHAR  OperationCode;
00166     UCHAR  Track : 1;
00167     UCHAR  Reserved1 : 3;
00168     UCHAR  Reserved2 : 1;
00169     UCHAR  Lun : 3;
00170     UCHAR  BlockAddress[4];
00171     UCHAR  Reserved3;
00172     UCHAR  AllocationLength[2];
00173     UCHAR  Control;
00174   } READ_TRACK_INFORMATION, *PREAD_TRACK_INFORMATION;
00175   
00176   struct _RESERVE_TRACK_RZONE {
00177     UCHAR  OperationCode;
00178     UCHAR  Reserved1[4];
00179     UCHAR  ReservationSize[4];
00180     UCHAR  Control;
00181   } RESERVE_TRACK_RZONE, *PRESERVE_TRACK_RZONE;
00182   
00183   struct _SEND_OPC_INFORMATION {
00184     UCHAR  OperationCode;
00185     UCHAR  DoOpc    : 1;
00186     UCHAR  Reserved : 7;
00187     UCHAR  Reserved1[5];
00188     UCHAR  ParameterListLength[2];
00189     UCHAR  Reserved2;
00190   } SEND_OPC_INFORMATION, *PSEND_OPC_INFORMATION;
00191   
00192   struct _CLOSE_TRACK {
00193     UCHAR  OperationCode;
00194     UCHAR  Immediate : 1;
00195     UCHAR  Reserved1 : 7;
00196     UCHAR  Track     : 1;
00197     UCHAR  Session   : 1;
00198     UCHAR  Reserved2 : 6;
00199     UCHAR  Reserved3;
00200     UCHAR  TrackNumber[2];
00201     UCHAR  Reserved4[3];
00202     UCHAR  Control;
00203   } CLOSE_TRACK, *PCLOSE_TRACK;
00204   
00205   struct _SEND_CUE_SHEET {
00206     UCHAR  OperationCode;
00207     UCHAR  Reserved[5];
00208     UCHAR  CueSheetSize[3];
00209     UCHAR  Control;
00210   } SEND_CUE_SHEET, *PSEND_CUE_SHEET;
00211   
00212   struct _READ_HEADER {
00213     UCHAR  OperationCode;
00214     UCHAR  Reserved1 : 1;
00215     UCHAR  Msf : 1;
00216     UCHAR  Reserved2 : 3;
00217     UCHAR  Lun : 3;
00218     UCHAR  LogicalBlockAddress[4];
00219     UCHAR  Reserved3;
00220     UCHAR  AllocationLength[2];
00221     UCHAR  Control;
00222   } READ_HEADER, *PREAD_HEADER;
00223   
00224   struct _PLAY_AUDIO {
00225     UCHAR  OperationCode;
00226     UCHAR  Reserved1 : 5;
00227     UCHAR  LogicalUnitNumber : 3;
00228     UCHAR  StartingBlockAddress[4];
00229     UCHAR  Reserved2;
00230     UCHAR  PlayLength[2];
00231     UCHAR  Control;
00232   } PLAY_AUDIO, *PPLAY_AUDIO;
00233   
00234   struct _PLAY_AUDIO_MSF { 
00235     UCHAR  OperationCode;
00236     UCHAR  Reserved1 : 5;
00237     UCHAR  LogicalUnitNumber : 3;
00238     UCHAR  Reserved2;
00239     UCHAR  StartingM;
00240     UCHAR  StartingS;
00241     UCHAR  StartingF;
00242     UCHAR  EndingM;
00243     UCHAR  EndingS;
00244     UCHAR  EndingF;
00245     UCHAR  Control;
00246   } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF;
00247   
00248 /* FIXME: Should the union be anonymous in C++ too?  If so,
00249    can't define named types _LBA and _MSF within anonymous union
00250    for C++. */  
00251   struct _PLAY_CD {
00252     UCHAR  OperationCode;
00253     UCHAR  Reserved1 : 1;
00254     UCHAR  CMSF : 1;
00255     UCHAR  ExpectedSectorType : 3;
00256     UCHAR  Lun : 3;
00257 #ifndef __cplusplus
00258   _ANONYMOUS_UNION
00259 #endif
00260   union {
00261       struct _LBA {
00262             UCHAR  StartingBlockAddress[4];
00263             UCHAR  PlayLength[4];
00264       } LBA;
00265   
00266       struct _MSF {
00267             UCHAR  Reserved1;
00268             UCHAR  StartingM;
00269             UCHAR  StartingS;
00270             UCHAR  StartingF;
00271             UCHAR  EndingM;
00272             UCHAR  EndingS;
00273             UCHAR  EndingF;
00274             UCHAR  Reserved2;
00275       } MSF;
00276   #ifndef __cplusplus
00277   }DUMMYUNIONNAME;
00278   #else
00279   }u;
00280   #endif
00281   
00282     UCHAR  Audio : 1;
00283     UCHAR  Composite : 1;
00284     UCHAR  Port1 : 1;
00285     UCHAR  Port2 : 1;
00286     UCHAR  Reserved2 : 3;
00287     UCHAR  Speed : 1;
00288     UCHAR  Control;
00289   } PLAY_CD, *PPLAY_CD;
00290   
00291   struct _SCAN_CD {
00292     UCHAR  OperationCode;
00293     UCHAR  RelativeAddress : 1;
00294     UCHAR  Reserved1 : 3;
00295     UCHAR  Direct : 1;
00296     UCHAR  Lun : 3;
00297     UCHAR  StartingAddress[4];
00298     UCHAR  Reserved2[3];
00299     UCHAR  Reserved3 : 6;
00300     UCHAR  Type : 2;
00301     UCHAR  Reserved4;
00302     UCHAR  Control;
00303   } SCAN_CD, *PSCAN_CD;
00304   
00305   struct _STOP_PLAY_SCAN {
00306     UCHAR  OperationCode;
00307     UCHAR  Reserved1 : 5;
00308     UCHAR  Lun : 3;
00309     UCHAR  Reserved2[7];
00310     UCHAR  Control;
00311   } STOP_PLAY_SCAN, *PSTOP_PLAY_SCAN;
00312   
00313   struct _SUBCHANNEL {
00314     UCHAR  OperationCode;
00315     UCHAR  Reserved0 : 1;
00316     UCHAR  Msf : 1;
00317     UCHAR  Reserved1 : 3;
00318     UCHAR  LogicalUnitNumber : 3;
00319     UCHAR  Reserved2 : 6;
00320     UCHAR  SubQ : 1;
00321     UCHAR  Reserved3 : 1;
00322     UCHAR  Format;
00323     UCHAR  Reserved4[2];
00324     UCHAR  TrackNumber;
00325     UCHAR  AllocationLength[2];
00326     UCHAR  Control;
00327   } SUBCHANNEL, *PSUBCHANNEL;
00328   
00329   struct _READ_CD { 
00330     UCHAR  OperationCode;
00331     UCHAR  RelativeAddress : 1;
00332     UCHAR  Reserved0 : 1;
00333     UCHAR  ExpectedSectorType : 3;
00334     UCHAR  Lun : 3;
00335     UCHAR  StartingLBA[4];
00336     UCHAR  TransferBlocks[3];
00337     UCHAR  Reserved2 : 1;
00338     UCHAR  ErrorFlags : 2;
00339     UCHAR  IncludeEDC : 1;
00340     UCHAR  IncludeUserData : 1;
00341     UCHAR  HeaderCode : 2;
00342     UCHAR  IncludeSyncData : 1;
00343     UCHAR  SubChannelSelection : 3;
00344     UCHAR  Reserved3 : 5;
00345     UCHAR  Control;
00346   } READ_CD, *PREAD_CD;
00347   
00348   struct _READ_CD_MSF {
00349     UCHAR  OperationCode;
00350     UCHAR  RelativeAddress : 1;
00351     UCHAR  Reserved1 : 1;
00352     UCHAR  ExpectedSectorType : 3;
00353     UCHAR  Lun : 3;
00354     UCHAR  Reserved2;
00355     UCHAR  StartingM;
00356     UCHAR  StartingS;
00357     UCHAR  StartingF;
00358     UCHAR  EndingM;
00359     UCHAR  EndingS;
00360     UCHAR  EndingF;
00361     UCHAR  Reserved3;
00362     UCHAR  Reserved4 : 1;
00363     UCHAR  ErrorFlags : 2;
00364     UCHAR  IncludeEDC : 1;
00365     UCHAR  IncludeUserData : 1;
00366     UCHAR  HeaderCode : 2;
00367     UCHAR  IncludeSyncData : 1;
00368     UCHAR  SubChannelSelection : 3;
00369     UCHAR  Reserved5 : 5;
00370     UCHAR  Control;
00371   } READ_CD_MSF, *PREAD_CD_MSF;
00372   
00373   struct _PLXTR_READ_CDDA {
00374     UCHAR  OperationCode;
00375     UCHAR  Reserved0 : 5;
00376     UCHAR  LogicalUnitNumber : 3;
00377     UCHAR  LogicalBlockByte0;
00378     UCHAR  LogicalBlockByte1;
00379     UCHAR  LogicalBlockByte2;
00380     UCHAR  LogicalBlockByte3;
00381     UCHAR  TransferBlockByte0;
00382     UCHAR  TransferBlockByte1;
00383     UCHAR  TransferBlockByte2;
00384     UCHAR  TransferBlockByte3;
00385     UCHAR  SubCode;
00386     UCHAR  Control;
00387   } PLXTR_READ_CDDA, *PPLXTR_READ_CDDA;
00388   
00389   struct _NEC_READ_CDDA {
00390     UCHAR  OperationCode;
00391     UCHAR  Reserved0;
00392     UCHAR  LogicalBlockByte0;
00393     UCHAR  LogicalBlockByte1;
00394     UCHAR  LogicalBlockByte2;
00395     UCHAR  LogicalBlockByte3;
00396     UCHAR  Reserved1;
00397     UCHAR  TransferBlockByte0;
00398     UCHAR  TransferBlockByte1;
00399     UCHAR  Control;
00400   } NEC_READ_CDDA, *PNEC_READ_CDDA;
00401   
00402   struct _MODE_SENSE {
00403     UCHAR  OperationCode;
00404     UCHAR  Reserved1 : 3;
00405     UCHAR  Dbd : 1;
00406     UCHAR  Reserved2 : 1;
00407     UCHAR  LogicalUnitNumber : 3;
00408     UCHAR  PageCode : 6;
00409     UCHAR  Pc : 2;
00410     UCHAR  Reserved3;
00411     UCHAR  AllocationLength;
00412     UCHAR  Control;
00413   } MODE_SENSE, *PMODE_SENSE;
00414   
00415   struct _MODE_SENSE10 {
00416     UCHAR  OperationCode;
00417     UCHAR  Reserved1 : 3;
00418     UCHAR  Dbd : 1;
00419     UCHAR  Reserved2 : 1;
00420     UCHAR  LogicalUnitNumber : 3;
00421     UCHAR  PageCode : 6;
00422     UCHAR  Pc : 2;
00423     UCHAR  Reserved3[4];
00424     UCHAR  AllocationLength[2];
00425     UCHAR  Control;
00426   } MODE_SENSE10, *PMODE_SENSE10;
00427   
00428   struct _MODE_SELECT {
00429     UCHAR  OperationCode;
00430     UCHAR  SPBit : 1;
00431     UCHAR  Reserved1 : 3;
00432     UCHAR  PFBit : 1;
00433     UCHAR  LogicalUnitNumber : 3;
00434     UCHAR  Reserved2[2];
00435     UCHAR  ParameterListLength;
00436     UCHAR  Control;
00437   } MODE_SELECT, *PMODE_SELECT;
00438   
00439   struct _MODE_SELECT10 {
00440     UCHAR  OperationCode;
00441     UCHAR  SPBit : 1;
00442     UCHAR  Reserved1 : 3;
00443     UCHAR  PFBit : 1;
00444     UCHAR  LogicalUnitNumber : 3;
00445     UCHAR  Reserved2[5];
00446     UCHAR  ParameterListLength[2];
00447     UCHAR  Control;
00448   } MODE_SELECT10, *PMODE_SELECT10;
00449   
00450   struct _LOCATE {
00451     UCHAR  OperationCode;
00452     UCHAR  Immediate : 1;
00453     UCHAR  CPBit : 1;
00454     UCHAR  BTBit : 1;
00455     UCHAR  Reserved1 : 2;
00456     UCHAR  LogicalUnitNumber : 3;
00457     UCHAR  Reserved3;
00458     UCHAR  LogicalBlockAddress[4];
00459     UCHAR  Reserved4;
00460     UCHAR  Partition;
00461     UCHAR  Control;
00462   } LOCATE, *PLOCATE;
00463   
00464   struct _LOGSENSE {
00465     UCHAR  OperationCode;
00466     UCHAR  SPBit : 1;
00467     UCHAR  PPCBit : 1;
00468     UCHAR  Reserved1 : 3;
00469     UCHAR  LogicalUnitNumber : 3;
00470     UCHAR  PageCode : 6;
00471     UCHAR  PCBit : 2;
00472     UCHAR  Reserved2;
00473     UCHAR  Reserved3;
00474     UCHAR  ParameterPointer[2];
00475     UCHAR  AllocationLength[2];
00476     UCHAR  Control;
00477   } LOGSENSE, *PLOGSENSE;
00478   
00479   struct _LOGSELECT {
00480     UCHAR  OperationCode;
00481     UCHAR  SPBit : 1;
00482     UCHAR  PCRBit : 1;
00483     UCHAR  Reserved1 : 3;
00484     UCHAR  LogicalUnitNumber : 3;
00485     UCHAR  Reserved : 6;
00486     UCHAR  PCBit : 2;
00487     UCHAR  Reserved2[4];
00488     UCHAR  ParameterListLength[2];
00489     UCHAR  Control;
00490   } LOGSELECT, *PLOGSELECT;
00491   
00492   struct _PRINT {
00493     UCHAR  OperationCode;
00494     UCHAR  Reserved : 5;
00495     UCHAR  LogicalUnitNumber : 3;
00496     UCHAR  TransferLength[3];
00497     UCHAR  Control;
00498   } PRINT, *PPRINT;
00499   
00500   struct _SEEK {
00501     UCHAR  OperationCode;
00502     UCHAR  Reserved1 : 5;
00503     UCHAR  LogicalUnitNumber : 3;
00504     UCHAR  LogicalBlockAddress[4];
00505     UCHAR  Reserved2[3];
00506     UCHAR  Control;
00507   } SEEK, *PSEEK;
00508   
00509   struct _ERASE {
00510     UCHAR  OperationCode;
00511     UCHAR  Long : 1;
00512     UCHAR  Immediate : 1;
00513     UCHAR  Reserved1 : 3;
00514     UCHAR  LogicalUnitNumber : 3;
00515     UCHAR  Reserved2[3];
00516     UCHAR  Control;
00517   } ERASE, *PERASE;
00518   
00519   struct _START_STOP {
00520     UCHAR  OperationCode;
00521     UCHAR  Immediate: 1;
00522     UCHAR  Reserved1 : 4;
00523     UCHAR  LogicalUnitNumber : 3;
00524     UCHAR  Reserved2[2];
00525     UCHAR  Start : 1;
00526     UCHAR  LoadEject : 1;
00527     UCHAR  Reserved3 : 6;
00528     UCHAR  Control;
00529   } START_STOP, *PSTART_STOP;
00530   
00531   struct _MEDIA_REMOVAL {
00532     UCHAR  OperationCode;
00533     UCHAR  Reserved1 : 5;
00534     UCHAR  LogicalUnitNumber : 3;
00535     UCHAR  Reserved2[2];
00536   
00537     UCHAR  Prevent : 1;
00538     UCHAR  Persistant : 1;
00539     UCHAR  Reserved3 : 6;
00540   
00541     UCHAR  Control;
00542   } MEDIA_REMOVAL, *PMEDIA_REMOVAL;
00543   
00544   struct _SEEK_BLOCK {
00545     UCHAR  OperationCode;
00546     UCHAR  Immediate : 1;
00547     UCHAR  Reserved1 : 7;
00548     UCHAR  BlockAddress[3];
00549     UCHAR  Link : 1;
00550     UCHAR  Flag : 1;
00551     UCHAR  Reserved2 : 4;
00552     UCHAR  VendorUnique : 2;
00553   } SEEK_BLOCK, *PSEEK_BLOCK;
00554   
00555   struct _REQUEST_BLOCK_ADDRESS {
00556     UCHAR  OperationCode;
00557     UCHAR  Reserved1[3];
00558     UCHAR  AllocationLength;
00559     UCHAR  Link : 1;
00560     UCHAR  Flag : 1;
00561     UCHAR  Reserved2 : 4;
00562     UCHAR  VendorUnique : 2;
00563   } REQUEST_BLOCK_ADDRESS, *PREQUEST_BLOCK_ADDRESS;
00564   
00565   struct _PARTITION {
00566     UCHAR  OperationCode;
00567     UCHAR  Immediate : 1;
00568     UCHAR  Sel: 1;
00569     UCHAR  PartitionSelect : 6;
00570     UCHAR  Reserved1[3];
00571     UCHAR  Control;
00572   } PARTITION, *PPARTITION;
00573   
00574   struct _WRITE_TAPE_MARKS {
00575     UCHAR  OperationCode;
00576     UCHAR  Immediate : 1;
00577     UCHAR  WriteSetMarks: 1;
00578     UCHAR  Reserved : 3;
00579     UCHAR  LogicalUnitNumber : 3;
00580     UCHAR  TransferLength[3];
00581     UCHAR  Control;
00582   } WRITE_TAPE_MARKS, *PWRITE_TAPE_MARKS;
00583   
00584   struct _SPACE_TAPE_MARKS {
00585     UCHAR  OperationCode;
00586     UCHAR  Code : 3;
00587     UCHAR  Reserved : 2;
00588     UCHAR  LogicalUnitNumber : 3;
00589     UCHAR  NumMarksMSB ;
00590     UCHAR  NumMarks;
00591     UCHAR  NumMarksLSB;
00592   union {
00593         UCHAR  value;
00594       struct {
00595             UCHAR  Link : 1;
00596             UCHAR  Flag : 1;
00597             UCHAR  Reserved : 4;
00598             UCHAR  VendorUnique : 2;
00599       } Fields;
00600   } Byte6;
00601   } SPACE_TAPE_MARKS, *PSPACE_TAPE_MARKS;
00602   
00603   struct _READ_POSITION {
00604     UCHAR  Operation;
00605     UCHAR  BlockType : 1;
00606     UCHAR  Reserved1 : 4;
00607     UCHAR  Lun : 3;
00608     UCHAR  Reserved2[7];
00609     UCHAR  Control;
00610   } READ_POSITION, *PREAD_POSITION;
00611   
00612   struct _CDB6READWRITETAPE {
00613     UCHAR  OperationCode;
00614     UCHAR  VendorSpecific : 5;
00615     UCHAR  Reserved : 3;
00616     UCHAR  TransferLenMSB;
00617     UCHAR  TransferLen;
00618     UCHAR  TransferLenLSB;
00619     UCHAR  Link : 1;
00620     UCHAR  Flag : 1;
00621     UCHAR  Reserved1 : 4;
00622     UCHAR  VendorUnique : 2;
00623   } CDB6READWRITETAPE, *PCDB6READWRITETAPE;
00624   
00625   struct _INIT_ELEMENT_STATUS {
00626     UCHAR  OperationCode;
00627     UCHAR  Reserved1 : 5;
00628     UCHAR  LogicalUnitNubmer : 3;
00629     UCHAR  Reserved2[3];
00630     UCHAR  Reserved3 : 7;
00631     UCHAR  NoBarCode : 1;
00632   } INIT_ELEMENT_STATUS, *PINIT_ELEMENT_STATUS;
00633   
00634   struct _INITIALIZE_ELEMENT_RANGE {
00635     UCHAR  OperationCode;
00636     UCHAR  Range : 1;
00637     UCHAR  Reserved1 : 4;
00638     UCHAR  LogicalUnitNubmer : 3;
00639     UCHAR  FirstElementAddress[2];
00640     UCHAR  Reserved2[2];
00641     UCHAR  NumberOfElements[2];
00642     UCHAR  Reserved3;
00643     UCHAR  Reserved4 : 7;
00644     UCHAR  NoBarCode : 1;
00645   } INITIALIZE_ELEMENT_RANGE, *PINITIALIZE_ELEMENT_RANGE;
00646   
00647   struct _POSITION_TO_ELEMENT {
00648     UCHAR  OperationCode;
00649     UCHAR  Reserved1 : 5;
00650     UCHAR  LogicalUnitNumber : 3;
00651     UCHAR  TransportElementAddress[2];
00652     UCHAR  DestinationElementAddress[2];
00653     UCHAR  Reserved2[2];
00654     UCHAR  Flip : 1;
00655     UCHAR  Reserved3 : 7;
00656     UCHAR  Control;
00657   } POSITION_TO_ELEMENT, *PPOSITION_TO_ELEMENT;
00658   
00659   struct _MOVE_MEDIUM {
00660     UCHAR  OperationCode;
00661     UCHAR  Reserved1 : 5;
00662     UCHAR  LogicalUnitNumber : 3;
00663     UCHAR  TransportElementAddress[2];
00664     UCHAR  SourceElementAddress[2];
00665     UCHAR  DestinationElementAddress[2];
00666     UCHAR  Reserved2[2];
00667     UCHAR  Flip : 1;
00668     UCHAR  Reserved3 : 7;
00669     UCHAR  Control;
00670   } MOVE_MEDIUM, *PMOVE_MEDIUM;
00671   
00672   struct _EXCHANGE_MEDIUM {
00673     UCHAR  OperationCode;
00674     UCHAR  Reserved1 : 5;
00675     UCHAR  LogicalUnitNumber : 3;
00676     UCHAR  TransportElementAddress[2];
00677     UCHAR  SourceElementAddress[2];
00678     UCHAR  Destination1ElementAddress[2];
00679     UCHAR  Destination2ElementAddress[2];
00680     UCHAR  Flip1 : 1;
00681     UCHAR  Flip2 : 1;
00682     UCHAR  Reserved3 : 6;
00683     UCHAR  Control;
00684   } EXCHANGE_MEDIUM, *PEXCHANGE_MEDIUM;
00685   
00686   struct _READ_ELEMENT_STATUS {
00687     UCHAR  OperationCode;
00688     UCHAR  ElementType : 4;
00689     UCHAR  VolTag : 1;
00690     UCHAR  LogicalUnitNumber : 3;
00691     UCHAR  StartingElementAddress[2];
00692     UCHAR  NumberOfElements[2];
00693     UCHAR  Reserved1;
00694     UCHAR  AllocationLength[3];
00695     UCHAR  Reserved2;
00696     UCHAR  Control;
00697   } READ_ELEMENT_STATUS, *PREAD_ELEMENT_STATUS;
00698   
00699   struct _SEND_VOLUME_TAG {
00700     UCHAR  OperationCode;
00701     UCHAR  ElementType : 4;
00702     UCHAR  Reserved1 : 1;
00703     UCHAR  LogicalUnitNumber : 3;
00704     UCHAR  StartingElementAddress[2];
00705     UCHAR  Reserved2;
00706     UCHAR  ActionCode : 5;
00707     UCHAR  Reserved3 : 3;
00708     UCHAR  Reserved4[2];
00709     UCHAR  ParameterListLength[2];
00710     UCHAR  Reserved5;
00711     UCHAR  Control;
00712   } SEND_VOLUME_TAG, *PSEND_VOLUME_TAG;
00713   
00714   struct _REQUEST_VOLUME_ELEMENT_ADDRESS {
00715     UCHAR  OperationCode;
00716     UCHAR  ElementType : 4;
00717     UCHAR  VolTag : 1;
00718     UCHAR  LogicalUnitNumber : 3;
00719     UCHAR  StartingElementAddress[2];
00720     UCHAR  NumberElements[2];
00721     UCHAR  Reserved1;
00722     UCHAR  AllocationLength[3];
00723     UCHAR  Reserved2;
00724     UCHAR  Control;
00725   } REQUEST_VOLUME_ELEMENT_ADDRESS, *PREQUEST_VOLUME_ELEMENT_ADDRESS;
00726   
00727   struct _LOAD_UNLOAD {
00728     UCHAR  OperationCode;
00729     UCHAR  Immediate : 1;
00730     UCHAR  Reserved1 : 4;
00731     UCHAR  Lun : 3;
00732     UCHAR  Reserved2[2];
00733     UCHAR  Start : 1;
00734     UCHAR  LoadEject : 1;
00735     UCHAR  Reserved3: 6;
00736     UCHAR  Reserved4[3];
00737     UCHAR  Slot;
00738     UCHAR  Reserved5[3];
00739   } LOAD_UNLOAD, *PLOAD_UNLOAD;
00740   
00741   struct _MECH_STATUS {
00742     UCHAR  OperationCode;
00743     UCHAR  Reserved : 5;
00744     UCHAR  Lun : 3;
00745     UCHAR  Reserved1[6];
00746     UCHAR  AllocationLength[2];
00747     UCHAR  Reserved2[1];
00748     UCHAR  Control;
00749   } MECH_STATUS, *PMECH_STATUS;
00750   
00751   struct _SYNCHRONIZE_CACHE10 {
00752   
00753     UCHAR  OperationCode;
00754   
00755     UCHAR  RelAddr : 1;
00756     UCHAR  Immediate : 1;
00757     UCHAR  Reserved : 3;
00758     UCHAR  Lun : 3;
00759   
00760     UCHAR  LogicalBlockAddress[4];
00761     UCHAR  Reserved2;
00762     UCHAR  BlockCount[2];
00763     UCHAR  Control;
00764   } SYNCHRONIZE_CACHE10, *PSYNCHRONIZE_CACHE10;
00765   
00766   struct _GET_EVENT_STATUS_NOTIFICATION {
00767     UCHAR  OperationCode;
00768   
00769     UCHAR  Immediate : 1;
00770     UCHAR  Reserved : 4;
00771     UCHAR  Lun : 3;
00772   
00773     UCHAR  Reserved2[2];
00774     UCHAR  NotificationClassRequest;
00775     UCHAR  Reserved3[2];
00776     UCHAR  EventListLength[2];
00777   
00778     UCHAR  Control;
00779   } GET_EVENT_STATUS_NOTIFICATION, *PGET_EVENT_STATUS_NOTIFICATION;
00780   
00781   struct _READ_DVD_STRUCTURE {
00782     UCHAR  OperationCode;
00783     UCHAR  Reserved1 : 5;
00784     UCHAR  Lun : 3;
00785     UCHAR  RMDBlockNumber[4];
00786     UCHAR  LayerNumber;
00787     UCHAR  Format;
00788     UCHAR  AllocationLength[2];
00789     UCHAR  Reserved3 : 6;
00790     UCHAR  AGID : 2;
00791     UCHAR  Control;
00792   } READ_DVD_STRUCTURE, *PREAD_DVD_STRUCTURE;
00793   
00794   struct _SEND_DVD_STRUCTURE {
00795     UCHAR  OperationCode;
00796     UCHAR  Reserved1 : 5;
00797     UCHAR  Lun : 3;
00798     UCHAR  Reserved2[5];
00799     UCHAR  Format;
00800     UCHAR  ParameterListLength[2];
00801     UCHAR  Reserved3;
00802     UCHAR  Control;
00803   } SEND_DVD_STRUCTURE, *PSEND_DVD_STRUCTURE;
00804   
00805   struct _SEND_KEY {
00806     UCHAR  OperationCode;
00807     UCHAR  Reserved1 : 5;
00808     UCHAR  Lun : 3;
00809     UCHAR  Reserved2[6];
00810     UCHAR  ParameterListLength[2];
00811     UCHAR  KeyFormat : 6;
00812     UCHAR  AGID : 2;
00813     UCHAR  Control;
00814   } SEND_KEY, *PSEND_KEY;
00815   
00816   struct _REPORT_KEY {
00817     UCHAR  OperationCode;
00818     UCHAR  Reserved1 : 5;
00819     UCHAR  Lun : 3;
00820     UCHAR  LogicalBlockAddress[4];
00821     UCHAR  Reserved2[2];
00822     UCHAR  AllocationLength[2];
00823     UCHAR  KeyFormat : 6;
00824     UCHAR  AGID : 2;
00825     UCHAR  Control;
00826   } REPORT_KEY, *PREPORT_KEY;
00827   
00828   struct _SET_READ_AHEAD {
00829     UCHAR  OperationCode;
00830     UCHAR  Reserved1 : 5;
00831     UCHAR  Lun : 3;
00832     UCHAR  TriggerLBA[4];
00833     UCHAR  ReadAheadLBA[4];
00834     UCHAR  Reserved2;
00835     UCHAR  Control;
00836   } SET_READ_AHEAD, *PSET_READ_AHEAD;
00837   
00838   struct _READ_FORMATTED_CAPACITIES {
00839     UCHAR  OperationCode;
00840     UCHAR  Reserved1 : 5;
00841     UCHAR  Lun : 3;
00842     UCHAR  Reserved2[5];
00843     UCHAR  AllocationLength[2];
00844     UCHAR  Control;
00845   } READ_FORMATTED_CAPACITIES, *PREAD_FORMATTED_CAPACITIES;
00846   
00847   struct _REPORT_LUNS {
00848     UCHAR  OperationCode;
00849     UCHAR  Reserved1[5];
00850     UCHAR  AllocationLength[4];
00851     UCHAR  Reserved2[1];
00852     UCHAR  Control;
00853   } REPORT_LUNS, *PREPORT_LUNS;
00854   
00855   struct _PERSISTENT_RESERVE_IN {
00856     UCHAR  OperationCode;
00857     UCHAR  ServiceAction : 5;
00858     UCHAR  Reserved1 : 3;
00859     UCHAR  Reserved2[5];
00860     UCHAR  AllocationLength[2];
00861     UCHAR  Control;
00862   } PERSISTENT_RESERVE_IN, *PPERSISTENT_RESERVE_IN;
00863   
00864   struct _PERSISTENT_RESERVE_OUT {
00865     UCHAR  OperationCode;
00866     UCHAR  ServiceAction : 5;
00867     UCHAR  Reserved1 : 3;
00868     UCHAR  Type : 4;
00869     UCHAR  Scope : 4;
00870     UCHAR  Reserved2[4];
00871     UCHAR  ParameterListLength[2];
00872     UCHAR  Control;
00873   } PERSISTENT_RESERVE_OUT, *PPERSISTENT_RESERVE_OUT;
00874   
00875   struct _GET_CONFIGURATION {
00876     UCHAR  OperationCode;
00877     UCHAR  RequestType : 1;
00878     UCHAR  Reserved1   : 7;
00879     UCHAR  StartingFeature[2];
00880     UCHAR  Reserved2[3];
00881     UCHAR  AllocationLength[2];
00882     UCHAR  Control;
00883   } GET_CONFIGURATION, *PGET_CONFIGURATION;
00884   
00885   struct _SET_CD_SPEED {
00886     UCHAR  OperationCode;
00887     UCHAR  Reserved1;
00888     UCHAR  ReadSpeed[2];
00889     UCHAR  WriteSpeed[2];
00890     UCHAR  Reserved2[5];
00891     UCHAR  Control;
00892   } SET_CD_SPEED, *PSET_CD_SPEED;
00893   
00894   ULONG AsUlong[4];
00895     UCHAR  AsByte[16];
00896 } CDB, *PCDB;
00897 
00898 #ifndef _INQUIRYDATA_DEFINED /* also in minitape.h */
00899 #define _INQUIRYDATA_DEFINED
00900 
00901 #define INQUIRYDATABUFFERSIZE             36
00902 
00903 typedef struct _INQUIRYDATA {
00904   UCHAR  DeviceType : 5;
00905   UCHAR  DeviceTypeQualifier : 3;
00906   UCHAR  DeviceTypeModifier : 7;
00907   UCHAR  RemovableMedia : 1;
00908   _ANONYMOUS_UNION union {
00909     UCHAR  Versions;
00910     _ANONYMOUS_STRUCT struct {
00911       UCHAR  ANSIVersion : 3;
00912       UCHAR  ECMAVersion : 3;
00913       UCHAR  ISOVersion : 2;
00914     } DUMMYSTRUCTNAME;
00915   } DUMMYUNIONNAME;
00916   UCHAR  ResponseDataFormat : 4;
00917   UCHAR  HiSupport : 1;
00918   UCHAR  NormACA : 1;
00919   UCHAR  TerminateTask : 1;
00920   UCHAR  AERC : 1;
00921   UCHAR  AdditionalLength;
00922   UCHAR  Reserved;
00923   UCHAR  Addr16 : 1;
00924   UCHAR  Addr32 : 1;
00925   UCHAR  AckReqQ: 1;
00926   UCHAR  MediumChanger : 1;
00927   UCHAR  MultiPort : 1;
00928   UCHAR  ReservedBit2 : 1;
00929   UCHAR  EnclosureServices : 1;
00930   UCHAR  ReservedBit3 : 1;
00931   UCHAR  SoftReset : 1;
00932   UCHAR  CommandQueue : 1;
00933   UCHAR  TransferDisable : 1;
00934   UCHAR  LinkedCommands : 1;
00935   UCHAR  Synchronous : 1;
00936   UCHAR  Wide16Bit : 1;
00937   UCHAR  Wide32Bit : 1;
00938   UCHAR  RelativeAddressing : 1;
00939   UCHAR  VendorId[8];
00940   UCHAR  ProductId[16];
00941   UCHAR  ProductRevisionLevel[4];
00942   UCHAR  VendorSpecific[20];
00943   UCHAR  Reserved3[40];
00944 } INQUIRYDATA, *PINQUIRYDATA;
00945 #endif
00946 
00947 /* INQUIRYDATA.DeviceType constants */
00948 #define DIRECT_ACCESS_DEVICE              0x00
00949 #define SEQUENTIAL_ACCESS_DEVICE          0x01
00950 #define PRINTER_DEVICE                    0x02
00951 #define PROCESSOR_DEVICE                  0x03
00952 #define WRITE_ONCE_READ_MULTIPLE_DEVICE   0x04
00953 #define READ_ONLY_DIRECT_ACCESS_DEVICE    0x05
00954 #define SCANNER_DEVICE                    0x06
00955 #define OPTICAL_DEVICE                    0x07
00956 #define MEDIUM_CHANGER                    0x08
00957 #define COMMUNICATION_DEVICE              0x09
00958 #define LOGICAL_UNIT_NOT_PRESENT_DEVICE   0x7F
00959 #define DEVICE_QUALIFIER_NOT_SUPPORTED    0x03
00960 
00961 /* INQUIRYDATA.DeviceTypeQualifier constants */
00962 #define DEVICE_CONNECTED 0x00
00963 
00964 #define SCSISTAT_GOOD                     0x00
00965 #define SCSISTAT_CHECK_CONDITION          0x02
00966 #define SCSISTAT_CONDITION_MET            0x04
00967 #define SCSISTAT_BUSY                     0x08
00968 #define SCSISTAT_INTERMEDIATE             0x10
00969 #define SCSISTAT_INTERMEDIATE_COND_MET    0x14
00970 #define SCSISTAT_RESERVATION_CONFLICT     0x18
00971 #define SCSISTAT_COMMAND_TERMINATED       0x22
00972 #define SCSISTAT_QUEUE_FULL               0x28
00973 
00974 /* Mode Sense/Select page constants */
00975 #define MODE_PAGE_ERROR_RECOVERY          0x01
00976 #define MODE_PAGE_DISCONNECT              0x02
00977 #define MODE_PAGE_FORMAT_DEVICE           0x03
00978 #define MODE_PAGE_RIGID_GEOMETRY          0x04
00979 #define MODE_PAGE_FLEXIBILE               0x05
00980 #define MODE_PAGE_WRITE_PARAMETERS        0x05
00981 #define MODE_PAGE_VERIFY_ERROR            0x07
00982 #define MODE_PAGE_CACHING                 0x08
00983 #define MODE_PAGE_PERIPHERAL              0x09
00984 #define MODE_PAGE_CONTROL                 0x0A
00985 #define MODE_PAGE_MEDIUM_TYPES            0x0B
00986 #define MODE_PAGE_NOTCH_PARTITION         0x0C
00987 #define MODE_PAGE_CD_AUDIO_CONTROL        0x0E
00988 #define MODE_PAGE_DATA_COMPRESS           0x0F
00989 #define MODE_PAGE_DEVICE_CONFIG           0x10
00990 #define MODE_PAGE_MEDIUM_PARTITION        0x11
00991 #define MODE_PAGE_CDVD_FEATURE_SET        0x18
00992 #define MODE_PAGE_POWER_CONDITION         0x1A
00993 #define MODE_PAGE_FAULT_REPORTING         0x1C
00994 #define MODE_PAGE_CDVD_INACTIVITY         0x1D
00995 #define MODE_PAGE_ELEMENT_ADDRESS         0x1D
00996 #define MODE_PAGE_TRANSPORT_GEOMETRY      0x1E
00997 #define MODE_PAGE_DEVICE_CAPABILITIES     0x1F
00998 #define MODE_PAGE_CAPABILITIES            0x2A
00999 #define MODE_SENSE_RETURN_ALL             0x3f
01000 #define MODE_SENSE_CURRENT_VALUES         0x00
01001 #define MODE_SENSE_CHANGEABLE_VALUES      0x40
01002 #define MODE_SENSE_DEFAULT_VAULES         0x80
01003 #define MODE_SENSE_SAVED_VALUES           0xc0
01004 
01005 /* SCSI CDB operation codes */
01006 #define SCSIOP_TEST_UNIT_READY            0x00
01007 #define SCSIOP_REZERO_UNIT                0x01
01008 #define SCSIOP_REWIND                     0x01
01009 #define SCSIOP_REQUEST_BLOCK_ADDR         0x02
01010 #define SCSIOP_REQUEST_SENSE              0x03
01011 #define SCSIOP_FORMAT_UNIT                0x04
01012 #define SCSIOP_READ_BLOCK_LIMITS          0x05
01013 #define SCSIOP_REASSIGN_BLOCKS            0x07
01014 #define SCSIOP_INIT_ELEMENT_STATUS        0x07
01015 #define SCSIOP_READ6                      0x08
01016 #define SCSIOP_RECEIVE                    0x08
01017 #define SCSIOP_WRITE6                     0x0A
01018 #define SCSIOP_PRINT                      0x0A
01019 #define SCSIOP_SEND                       0x0A
01020 #define SCSIOP_SEEK6                      0x0B
01021 #define SCSIOP_TRACK_SELECT               0x0B
01022 #define SCSIOP_SLEW_PRINT                 0x0B
01023 #define SCSIOP_SEEK_BLOCK                 0x0C
01024 #define SCSIOP_PARTITION                  0x0D
01025 #define SCSIOP_READ_REVERSE               0x0F
01026 #define SCSIOP_WRITE_FILEMARKS            0x10
01027 #define SCSIOP_FLUSH_BUFFER               0x10
01028 #define SCSIOP_SPACE                      0x11
01029 #define SCSIOP_INQUIRY                    0x12
01030 #define SCSIOP_VERIFY6                    0x13
01031 #define SCSIOP_RECOVER_BUF_DATA           0x14
01032 #define SCSIOP_MODE_SELECT                0x15
01033 #define SCSIOP_RESERVE_UNIT               0x16
01034 #define SCSIOP_RELEASE_UNIT               0x17
01035 #define SCSIOP_COPY                       0x18
01036 #define SCSIOP_ERASE                      0x19
01037 #define SCSIOP_MODE_SENSE                 0x1A
01038 #define SCSIOP_START_STOP_UNIT            0x1B
01039 #define SCSIOP_STOP_PRINT                 0x1B
01040 #define SCSIOP_LOAD_UNLOAD                0x1B
01041 #define SCSIOP_RECEIVE_DIAGNOSTIC         0x1C
01042 #define SCSIOP_SEND_DIAGNOSTIC            0x1D
01043 #define SCSIOP_MEDIUM_REMOVAL             0x1E
01044 
01045 #define SCSIOP_READ_FORMATTED_CAPACITY    0x23
01046 #define SCSIOP_READ_CAPACITY              0x25
01047 #define SCSIOP_READ                       0x28
01048 #define SCSIOP_WRITE                      0x2A
01049 #define SCSIOP_SEEK                       0x2B
01050 #define SCSIOP_LOCATE                     0x2B
01051 #define SCSIOP_POSITION_TO_ELEMENT        0x2B
01052 #define SCSIOP_WRITE_VERIFY               0x2E
01053 #define SCSIOP_VERIFY                     0x2F
01054 #define SCSIOP_SEARCH_DATA_HIGH           0x30
01055 #define SCSIOP_SEARCH_DATA_EQUAL          0x31
01056 #define SCSIOP_SEARCH_DATA_LOW            0x32
01057 #define SCSIOP_SET_LIMITS                 0x33
01058 #define SCSIOP_READ_POSITION              0x34
01059 #define SCSIOP_SYNCHRONIZE_CACHE          0x35
01060 #define SCSIOP_COMPARE                    0x39
01061 #define SCSIOP_COPY_COMPARE               0x3A
01062 #define SCSIOP_WRITE_DATA_BUFF            0x3B
01063 #define SCSIOP_READ_DATA_BUFF             0x3C
01064 #define SCSIOP_CHANGE_DEFINITION          0x40
01065 #define SCSIOP_READ_SUB_CHANNEL           0x42
01066 #define SCSIOP_READ_TOC                   0x43
01067 #define SCSIOP_READ_HEADER                0x44
01068 #define SCSIOP_PLAY_AUDIO                 0x45
01069 #define SCSIOP_GET_CONFIGURATION          0x46
01070 #define SCSIOP_PLAY_AUDIO_MSF             0x47
01071 #define SCSIOP_PLAY_TRACK_INDEX           0x48
01072 #define SCSIOP_PLAY_TRACK_RELATIVE        0x49
01073 #define SCSIOP_GET_EVENT_STATUS           0x4A
01074 #define SCSIOP_PAUSE_RESUME               0x4B
01075 #define SCSIOP_LOG_SELECT                 0x4C
01076 #define SCSIOP_LOG_SENSE                  0x4D
01077 #define SCSIOP_STOP_PLAY_SCAN             0x4E
01078 #define SCSIOP_READ_DISK_INFORMATION      0x51
01079 #define SCSIOP_READ_TRACK_INFORMATION     0x52
01080 #define SCSIOP_RESERVE_TRACK_RZONE        0x53
01081 #define SCSIOP_SEND_OPC_INFORMATION       0x54
01082 #define SCSIOP_MODE_SELECT10              0x55
01083 #define SCSIOP_MODE_SENSE10               0x5A
01084 #define SCSIOP_CLOSE_TRACK_SESSION        0x5B
01085 #define SCSIOP_READ_BUFFER_CAPACITY       0x5C
01086 #define SCSIOP_SEND_CUE_SHEET             0x5D
01087 #define SCSIOP_PERSISTENT_RESERVE_IN      0x5E
01088 #define SCSIOP_PERSISTENT_RESERVE_OUT     0x5F
01089 
01090 #define SCSIOP_REPORT_LUNS                0xA0
01091 #define SCSIOP_BLANK                      0xA1
01092 #define SCSIOP_SEND_KEY                   0xA3
01093 #define SCSIOP_REPORT_KEY                 0xA4
01094 #define SCSIOP_MOVE_MEDIUM                0xA5
01095 #define SCSIOP_LOAD_UNLOAD_SLOT           0xA6
01096 #define SCSIOP_EXCHANGE_MEDIUM            0xA6
01097 #define SCSIOP_SET_READ_AHEAD             0xA7
01098 #define SCSIOP_READ_DVD_STRUCTURE         0xAD
01099 #define SCSIOP_REQUEST_VOL_ELEMENT        0xB5
01100 #define SCSIOP_SEND_VOLUME_TAG            0xB6
01101 #define SCSIOP_READ_ELEMENT_STATUS        0xB8
01102 #define SCSIOP_READ_CD_MSF                0xB9
01103 #define SCSIOP_SCAN_CD                    0xBA
01104 #define SCSIOP_SET_CD_SPEED               0xBB
01105 #define SCSIOP_PLAY_CD                    0xBC
01106 #define SCSIOP_MECHANISM_STATUS           0xBD
01107 #define SCSIOP_READ_CD                    0xBE
01108 #define SCSIOP_SEND_DVD_STRUCTURE         0xBF
01109 #define SCSIOP_INIT_ELEMENT_RANGE         0xE7
01110 
01111 #define SCSIOP_DENON_EJECT_DISC           0xE6
01112 #define SCSIOP_DENON_STOP_AUDIO           0xE7
01113 #define SCSIOP_DENON_PLAY_AUDIO           0xE8
01114 #define SCSIOP_DENON_READ_TOC             0xE9
01115 #define SCSIOP_DENON_READ_SUBCODE         0xEB
01116 
01117 #define SCSIMESS_MODIFY_DATA_POINTER      0x00
01118 #define SCSIMESS_SYNCHRONOUS_DATA_REQ     0x01
01119 #define SCSIMESS_WIDE_DATA_REQUEST        0x03
01120 
01121 #define SCSIMESS_MODIFY_DATA_LENGTH       5
01122 #define SCSIMESS_SYNCH_DATA_LENGTH        3
01123 #define SCSIMESS_WIDE_DATA_LENGTH         2
01124 
01125 #define SCSIMESS_ABORT                    0x06
01126 #define SCSIMESS_ABORT_WITH_TAG           0x0D
01127 #define SCSIMESS_BUS_DEVICE_RESET         0x0C
01128 #define SCSIMESS_CLEAR_QUEUE              0x0E
01129 #define SCSIMESS_COMMAND_COMPLETE         0x00
01130 #define SCSIMESS_DISCONNECT               0x04
01131 #define SCSIMESS_EXTENDED_MESSAGE         0x01
01132 #define SCSIMESS_IDENTIFY                 0x80
01133 #define SCSIMESS_IDENTIFY_WITH_DISCON     0xC0
01134 #define SCSIMESS_IGNORE_WIDE_RESIDUE      0x23
01135 #define SCSIMESS_INITIATE_RECOVERY        0x0F
01136 #define SCSIMESS_INIT_DETECTED_ERROR      0x05
01137 #define SCSIMESS_LINK_CMD_COMP            0x0A
01138 #define SCSIMESS_LINK_CMD_COMP_W_FLAG     0x0B
01139 #define SCSIMESS_MESS_PARITY_ERROR        0x09
01140 #define SCSIMESS_MESSAGE_REJECT           0x07
01141 #define SCSIMESS_NO_OPERATION             0x08
01142 #define SCSIMESS_HEAD_OF_QUEUE_TAG        0x21
01143 #define SCSIMESS_ORDERED_QUEUE_TAG        0x22
01144 #define SCSIMESS_SIMPLE_QUEUE_TAG         0x20
01145 #define SCSIMESS_RELEASE_RECOVERY         0x10
01146 #define SCSIMESS_RESTORE_POINTERS         0x03
01147 #define SCSIMESS_SAVE_DATA_POINTER        0x02
01148 #define SCSIMESS_TERMINATE_IO_PROCESS     0x11
01149 
01150 #define CDB_FORCE_MEDIA_ACCESS            0x08
01151 
01152 #define CDB_RETURN_ON_COMPLETION          0
01153 #define CDB_RETURN_IMMEDIATE              1
01154 
01155 #define CDB_INQUIRY_EVPD                  0x01
01156 
01157 #define LUN0_FORMAT_SAVING_DEFECT_LIST    0
01158 #define USE_DEFAULTMSB                    0
01159 #define USE_DEFAULTLSB                    0
01160 
01161 #define START_UNIT_CODE                   0x01
01162 #define STOP_UNIT_CODE                    0x00
01163 
01164 typedef struct _SENSE_DATA {
01165   UCHAR  ErrorCode : 7;
01166   UCHAR  Valid : 1;
01167   UCHAR  SegmentNumber;
01168   UCHAR  SenseKey : 4;
01169   UCHAR  Reserved : 1;
01170   UCHAR  IncorrectLength : 1;
01171   UCHAR  EndOfMedia : 1;
01172   UCHAR  FileMark : 1;
01173   UCHAR  Information[4];
01174   UCHAR  AdditionalSenseLength;
01175   UCHAR  CommandSpecificInformation[4];
01176   UCHAR  AdditionalSenseCode;
01177   UCHAR  AdditionalSenseCodeQualifier;
01178   UCHAR  FieldReplaceableUnitCode;
01179   UCHAR  SenseKeySpecific[3];
01180 } SENSE_DATA, *PSENSE_DATA;
01181 
01182 #define SENSE_BUFFER_SIZE                 18
01183 
01184 /* Sense codes */
01185 #define SCSI_SENSE_NO_SENSE               0x00
01186 #define SCSI_SENSE_RECOVERED_ERROR        0x01
01187 #define SCSI_SENSE_NOT_READY              0x02
01188 #define SCSI_SENSE_MEDIUM_ERROR           0x03
01189 #define SCSI_SENSE_HARDWARE_ERROR         0x04
01190 #define SCSI_SENSE_ILLEGAL_REQUEST        0x05
01191 #define SCSI_SENSE_UNIT_ATTENTION         0x06
01192 #define SCSI_SENSE_DATA_PROTECT           0x07
01193 #define SCSI_SENSE_BLANK_CHECK            0x08
01194 #define SCSI_SENSE_UNIQUE                 0x09
01195 #define SCSI_SENSE_COPY_ABORTED           0x0A
01196 #define SCSI_SENSE_ABORTED_COMMAND        0x0B
01197 #define SCSI_SENSE_EQUAL                  0x0C
01198 #define SCSI_SENSE_VOL_OVERFLOW           0x0D
01199 #define SCSI_SENSE_MISCOMPARE             0x0E
01200 #define SCSI_SENSE_RESERVED               0x0F
01201 
01202 /* Additional tape bit */
01203 #define SCSI_ILLEGAL_LENGTH               0x20
01204 #define SCSI_EOM                          0x40
01205 #define SCSI_FILE_MARK                    0x80
01206 
01207 /* Additional Sense codes */
01208 #define SCSI_ADSENSE_NO_SENSE                              0x00
01209 #define SCSI_ADSENSE_NO_SEEK_COMPLETE                      0x02
01210 #define SCSI_ADSENSE_LUN_NOT_READY                         0x04
01211 #define SCSI_ADSENSE_WRITE_ERROR                           0x0C
01212 #define SCSI_ADSENSE_TRACK_ERROR                           0x14
01213 #define SCSI_ADSENSE_SEEK_ERROR                            0x15
01214 #define SCSI_ADSENSE_REC_DATA_NOECC                        0x17
01215 #define SCSI_ADSENSE_REC_DATA_ECC                          0x18
01216 #define SCSI_ADSENSE_ILLEGAL_COMMAND                       0x20
01217 #define SCSI_ADSENSE_ILLEGAL_BLOCK                         0x21
01218 #define SCSI_ADSENSE_INVALID_CDB                           0x24
01219 #define SCSI_ADSENSE_INVALID_LUN                           0x25
01220 #define SCSI_ADSENSE_WRITE_PROTECT                         0x27
01221 #define SCSI_ADSENSE_MEDIUM_CHANGED                        0x28
01222 #define SCSI_ADSENSE_BUS_RESET                             0x29
01223 #define SCSI_ADSENSE_INSUFFICIENT_TIME_FOR_OPERATION       0x2E
01224 #define SCSI_ADSENSE_INVALID_MEDIA                         0x30
01225 #define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE                    0x3a
01226 #define SCSI_ADSENSE_POSITION_ERROR                        0x3b
01227 #define SCSI_ADSENSE_OPERATOR_REQUEST                      0x5a
01228 #define SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5d
01229 #define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK           0x64
01230 #define SCSI_ADSENSE_COPY_PROTECTION_FAILURE               0x6f
01231 #define SCSI_ADSENSE_POWER_CALIBRATION_ERROR               0x73
01232 #define SCSI_ADSENSE_VENDOR_UNIQUE                         0x80
01233 #define SCSI_ADSENSE_MUSIC_AREA                            0xA0
01234 #define SCSI_ADSENSE_DATA_AREA                             0xA1
01235 #define SCSI_ADSENSE_VOLUME_OVERFLOW                       0xA7
01236 
01237 #define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE                   0x00
01238 #define SCSI_SENSEQ_BECOMING_READY                         0x01
01239 #define SCSI_SENSEQ_INIT_COMMAND_REQUIRED                  0x02
01240 #define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED           0x03
01241 #define SCSI_SENSEQ_FORMAT_IN_PROGRESS                     0x04
01242 #define SCSI_SENSEQ_REBUILD_IN_PROGRESS                    0x05
01243 #define SCSI_SENSEQ_RECALCULATION_IN_PROGRESS              0x06
01244 #define SCSI_SENSEQ_OPERATION_IN_PROGRESS                  0x07
01245 #define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS                 0x08
01246 #define SCSI_SENSEQ_LOSS_OF_STREAMING                      0x09
01247 #define SCSI_SENSEQ_PADDING_BLOCKS_ADDED                   0x0A
01248 
01249 
01250 #define FILE_DEVICE_SCSI 0x0000001b
01251 
01252 #define IOCTL_SCSI_EXECUTE_IN ((FILE_DEVICE_SCSI << 16) + 0x0011)
01253 #define IOCTL_SCSI_EXECUTE_OUT ((FILE_DEVICE_SCSI << 16) + 0x0012)
01254 #define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013)
01255 
01256 /* SMART support in ATAPI */
01257 #define IOCTL_SCSI_MINIPORT_SMART_VERSION               ((FILE_DEVICE_SCSI << 16) + 0x0500)
01258 #define IOCTL_SCSI_MINIPORT_IDENTIFY                    ((FILE_DEVICE_SCSI << 16) + 0x0501)
01259 #define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS          ((FILE_DEVICE_SCSI << 16) + 0x0502)
01260 #define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS       ((FILE_DEVICE_SCSI << 16) + 0x0503)
01261 #define IOCTL_SCSI_MINIPORT_ENABLE_SMART                ((FILE_DEVICE_SCSI << 16) + 0x0504)
01262 #define IOCTL_SCSI_MINIPORT_DISABLE_SMART               ((FILE_DEVICE_SCSI << 16) + 0x0505)
01263 #define IOCTL_SCSI_MINIPORT_RETURN_STATUS               ((FILE_DEVICE_SCSI << 16) + 0x0506)
01264 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE     ((FILE_DEVICE_SCSI << 16) + 0x0507)
01265 #define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES       ((FILE_DEVICE_SCSI << 16) + 0x0508)
01266 #define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS       ((FILE_DEVICE_SCSI << 16) + 0x0509)
01267 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTO_OFFLINE ((FILE_DEVICE_SCSI << 16) + 0x050a)
01268 #define IOCTL_SCSI_MINIPORT_READ_SMART_LOG              ((FILE_DEVICE_SCSI << 16) + 0x050b)
01269 #define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG             ((FILE_DEVICE_SCSI << 16) + 0x050c)
01270 
01271 /* CLUSTER support */
01272 #define IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE  ((FILE_DEVICE_SCSI << 16) + 0x0520)
01273 #define IOCTL_SCSI_MINIPORT_NOT_CLUSTER_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0521)
01274 
01275 /* READ_TOC formats */
01276 #define READ_TOC_FORMAT_TOC         0x00
01277 #define READ_TOC_FORMAT_SESSION     0x01
01278 #define READ_TOC_FORMAT_FULL_TOC    0x02
01279 #define READ_TOC_FORMAT_PMA         0x03
01280 #define READ_TOC_FORMAT_ATIP        0x04
01281 
01282 /* Read Capacity Data. Returned in Big Endian format */
01283 typedef struct _READ_CAPACITY_DATA {
01284   ULONG  LogicalBlockAddress;
01285   ULONG  BytesPerBlock;
01286 } READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
01287 
01288 /* Read Block Limits Data. Returned in Big Endian format */
01289 typedef struct _READ_BLOCK_LIMITS {
01290   UCHAR  Reserved;
01291   UCHAR  BlockMaximumSize[3];
01292   UCHAR  BlockMinimumSize[2];
01293 } READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA;
01294 
01295 
01296 typedef struct _MODE_PARAMETER_HEADER {
01297   UCHAR  ModeDataLength;
01298   UCHAR  MediumType;
01299   UCHAR  DeviceSpecificParameter;
01300   UCHAR  BlockDescriptorLength;
01301 }MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
01302 
01303 typedef struct _MODE_PARAMETER_HEADER10 {
01304   UCHAR  ModeDataLength[2];
01305   UCHAR  MediumType;
01306   UCHAR  DeviceSpecificParameter;
01307   UCHAR  Reserved[2];
01308   UCHAR  BlockDescriptorLength[2];
01309 } MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10;
01310 
01311 #define MODE_FD_SINGLE_SIDE               0x01
01312 #define MODE_FD_DOUBLE_SIDE               0x02
01313 #define MODE_FD_MAXIMUM_TYPE              0x1E
01314 #define MODE_DSP_FUA_SUPPORTED            0x10
01315 #define MODE_DSP_WRITE_PROTECT            0x80
01316 
01317 typedef struct _MODE_PARAMETER_BLOCK {
01318   UCHAR  DensityCode;
01319   UCHAR  NumberOfBlocks[3];
01320   UCHAR  Reserved;
01321   UCHAR  BlockLength[3];
01322 } MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK;
01323 
01324 typedef struct _MODE_DISCONNECT_PAGE {
01325   UCHAR  PageCode : 6;
01326   UCHAR  Reserved : 1;
01327   UCHAR  PageSavable : 1;
01328   UCHAR  PageLength;
01329   UCHAR  BufferFullRatio;
01330   UCHAR  BufferEmptyRatio;
01331   UCHAR  BusInactivityLimit[2];
01332   UCHAR  BusDisconnectTime[2];
01333   UCHAR  BusConnectTime[2];
01334   UCHAR  MaximumBurstSize[2];
01335   UCHAR  DataTransferDisconnect : 2;
01336   UCHAR  Reserved2[3];
01337 }MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE;
01338 
01339 typedef struct _MODE_CACHING_PAGE {
01340   UCHAR  PageCode : 6;
01341   UCHAR  Reserved : 1;
01342   UCHAR  PageSavable : 1;
01343   UCHAR  PageLength;
01344   UCHAR  ReadDisableCache : 1;
01345   UCHAR  MultiplicationFactor : 1;
01346   UCHAR  WriteCacheEnable : 1;
01347   UCHAR  Reserved2 : 5;
01348   UCHAR  WriteRetensionPriority : 4;
01349   UCHAR  ReadRetensionPriority : 4;
01350   UCHAR  DisablePrefetchTransfer[2];
01351   UCHAR  MinimumPrefetch[2];
01352   UCHAR  MaximumPrefetch[2];
01353   UCHAR  MaximumPrefetchCeiling[2];
01354 }MODE_CACHING_PAGE, *PMODE_CACHING_PAGE;
01355 
01356 typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE {
01357   UCHAR  PageLength;
01358   UCHAR  WriteType : 4;
01359   UCHAR  TestWrite : 1;
01360   UCHAR  LinkSizeValid : 1;
01361   UCHAR  BufferUnderrunFreeEnabled : 1;
01362   UCHAR  Reserved2 : 1;
01363   UCHAR  TrackMode : 4;
01364   UCHAR  Copy : 1;
01365   UCHAR  FixedPacket : 1;
01366   UCHAR  MultiSession : 2;
01367   UCHAR  DataBlockType : 4;
01368   UCHAR  Reserved3 : 4;    
01369   UCHAR  LinkSize;
01370   UCHAR  Reserved4;
01371   UCHAR  HostApplicationCode : 6;
01372   UCHAR  Reserved5 : 2;    
01373   UCHAR  SessionFormat;
01374   UCHAR  Reserved6;
01375   UCHAR  PacketSize[4];
01376   UCHAR  AudioPauseLength[2];
01377   UCHAR  Reserved7 : 7;
01378   UCHAR  MediaCatalogNumberValid : 1;
01379   UCHAR  MediaCatalogNumber[13];
01380   UCHAR  MediaCatalogNumberZero;
01381   UCHAR  MediaCatalogNumberAFrame;
01382   UCHAR  Reserved8 : 7;
01383   UCHAR  ISRCValid : 1;
01384   UCHAR  ISRCCountry[2];
01385   UCHAR  ISRCOwner[3];
01386   UCHAR  ISRCRecordingYear[2];
01387   UCHAR  ISRCSerialNumber[5];
01388   UCHAR  ISRCZero;
01389   UCHAR  ISRCAFrame;
01390   UCHAR  ISRCReserved;
01391   UCHAR  SubHeaderData[4];
01392 } MODE_CDROM_WRITE_PARAMETERS_PAGE, *PMODE_CDROM_WRITE_PARAMETERS_PAGE;
01393 
01394 typedef struct _MODE_FLEXIBLE_DISK_PAGE {
01395   UCHAR  PageCode : 6;
01396   UCHAR  Reserved : 1;
01397   UCHAR  PageSavable : 1;
01398   UCHAR  PageLength;
01399   UCHAR  TransferRate[2];
01400   UCHAR  NumberOfHeads;
01401   UCHAR  SectorsPerTrack;
01402   UCHAR  BytesPerSector[2];
01403   UCHAR  NumberOfCylinders[2];
01404   UCHAR  StartWritePrecom[2];
01405   UCHAR  StartReducedCurrent[2];
01406   UCHAR  StepRate[2];
01407   UCHAR  StepPluseWidth;
01408   UCHAR  HeadSettleDelay[2];
01409   UCHAR  MotorOnDelay;
01410   UCHAR  MotorOffDelay;
01411   UCHAR  Reserved2 : 5;
01412   UCHAR  MotorOnAsserted : 1;
01413   UCHAR  StartSectorNumber : 1;
01414   UCHAR  TrueReadySignal : 1;
01415   UCHAR  StepPlusePerCyclynder : 4;
01416   UCHAR  Reserved3 : 4;
01417   UCHAR  WriteCompenstation;
01418   UCHAR  HeadLoadDelay;
01419   UCHAR  HeadUnloadDelay;
01420   UCHAR  Pin2Usage : 4;
01421   UCHAR  Pin34Usage : 4;
01422   UCHAR  Pin1Usage : 4;
01423   UCHAR  Pin4Usage : 4;
01424   UCHAR  MediumRotationRate[2];
01425   UCHAR  Reserved4[2];
01426 } MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE;
01427 
01428 typedef struct _MODE_FORMAT_PAGE {
01429   UCHAR  PageCode : 6;
01430   UCHAR  Reserved : 1;
01431   UCHAR  PageSavable : 1;
01432   UCHAR  PageLength;
01433   UCHAR  TracksPerZone[2];
01434   UCHAR  AlternateSectorsPerZone[2];
01435   UCHAR  AlternateTracksPerZone[2];
01436   UCHAR  AlternateTracksPerLogicalUnit[2];
01437   UCHAR  SectorsPerTrack[2];
01438   UCHAR  BytesPerPhysicalSector[2];
01439   UCHAR  Interleave[2];
01440   UCHAR  TrackSkewFactor[2];
01441   UCHAR  CylinderSkewFactor[2];
01442   UCHAR  Reserved2 : 4;
01443   UCHAR  SurfaceFirst : 1;
01444   UCHAR  RemovableMedia : 1;
01445   UCHAR  HardSectorFormating : 1;
01446   UCHAR  SoftSectorFormating : 1;
01447   UCHAR  Reserved3[3];
01448 } MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE;
01449 
01450 typedef struct _MODE_RIGID_GEOMETRY_PAGE {
01451   UCHAR  PageCode : 6;
01452   UCHAR  Reserved : 1;
01453   UCHAR  PageSavable : 1;
01454   UCHAR  PageLength;
01455   UCHAR  NumberOfCylinders[3];
01456   UCHAR  NumberOfHeads;
01457   UCHAR  StartWritePrecom[3];
01458   UCHAR  StartReducedCurrent[3];
01459   UCHAR  DriveStepRate[2];
01460   UCHAR  LandZoneCyclinder[3];
01461   UCHAR  RotationalPositionLock : 2;
01462   UCHAR  Reserved2 : 6;
01463   UCHAR  RotationOffset;
01464   UCHAR  Reserved3;
01465   UCHAR  RoataionRate[2];
01466   UCHAR  Reserved4[2];
01467 } MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE;
01468 
01469 typedef struct _MODE_READ_WRITE_RECOVERY_PAGE {
01470   UCHAR  PageCode : 6;
01471   UCHAR  Reserved1 : 1;
01472   UCHAR  PSBit : 1;
01473   UCHAR  PageLength;
01474   UCHAR  DCRBit : 1;
01475   UCHAR  DTEBit : 1;
01476   UCHAR  PERBit : 1;
01477   UCHAR  EERBit : 1;
01478   UCHAR  RCBit : 1;
01479   UCHAR  TBBit : 1;
01480   UCHAR  ARRE : 1;
01481   UCHAR  AWRE : 1;
01482   UCHAR  ReadRetryCount;
01483   UCHAR  Reserved4[4];
01484   UCHAR  WriteRetryCount;
01485   UCHAR  Reserved5[3];
01486 } MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE;
01487 
01488 typedef struct _MODE_READ_RECOVERY_PAGE {
01489   UCHAR  PageCode : 6;
01490   UCHAR  Reserved1 : 1;
01491   UCHAR  PSBit : 1;
01492   UCHAR  PageLength;
01493   UCHAR  DCRBit : 1;
01494   UCHAR  DTEBit : 1;
01495   UCHAR  PERBit : 1;
01496   UCHAR  Reserved2 : 1;
01497   UCHAR  RCBit : 1;
01498   UCHAR  TBBit : 1;
01499   UCHAR  Reserved3 : 2;
01500   UCHAR  ReadRetryCount;
01501   UCHAR  Reserved4[4];
01502 } MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE;
01503 
01504 typedef struct _MODE_INFO_EXCEPTIONS {
01505   UCHAR  PageCode : 6;
01506   UCHAR  Reserved1 : 1;
01507   UCHAR  PSBit : 1;
01508   UCHAR  PageLength;
01509   _ANONYMOUS_UNION union {
01510     UCHAR  Flags;
01511     _ANONYMOUS_STRUCT struct {
01512       UCHAR  LogErr : 1;
01513       UCHAR  Reserved2 : 1;
01514       UCHAR  Test : 1;
01515       UCHAR  Dexcpt : 1;
01516       UCHAR  Reserved3 : 3;
01517       UCHAR  Perf : 1;
01518     } DUMMYSTRUCTNAME;
01519   } DUMMYUNIONNAME;
01520   UCHAR  ReportMethod : 4;
01521   UCHAR  Reserved4 : 4;
01522   UCHAR  IntervalTimer[4];
01523   UCHAR  ReportCount[4];
01524 } MODE_INFO_EXCEPTIONS, *PMODE_INFO_EXCEPTIONS;
01525 
01526 /* CDROM audio control */
01527 #define CDB_AUDIO_PAUSE                   0x00
01528 #define CDB_AUDIO_RESUME                  0x01
01529 #define CDB_DEVICE_START                  0x11
01530 #define CDB_DEVICE_STOP                   0x10
01531 #define CDB_EJECT_MEDIA                   0x10
01532 #define CDB_LOAD_MEDIA                    0x01
01533 #define CDB_SUBCHANNEL_HEADER             0x00
01534 #define CDB_SUBCHANNEL_BLOCK              0x01
01535 
01536 #define CDROM_AUDIO_CONTROL_PAGE          0x0E
01537 #define MODE_SELECT_IMMEDIATE             0x04
01538 #define MODE_SELECT_PFBIT                 0x10
01539 
01540 #define CDB_USE_MSF                       0x01
01541 
01542 typedef struct _PORT_OUTPUT {
01543   UCHAR  ChannelSelection;
01544   UCHAR  Volume;
01545 } PORT_OUTPUT, *PPORT_OUTPUT;
01546 
01547 typedef struct _AUDIO_OUTPUT {
01548   UCHAR  CodePage;
01549   UCHAR  ParameterLength;
01550   UCHAR  Immediate;
01551   UCHAR  Reserved[2];
01552   UCHAR  LbaFormat;
01553   UCHAR  LogicalBlocksPerSecond[2];
01554   PORT_OUTPUT  PortOutput[4];
01555 } AUDIO_OUTPUT, *PAUDIO_OUTPUT;
01556 
01557 /* Multisession CDROMs */
01558 #define GET_LAST_SESSION 0x01
01559 #define GET_SESSION_DATA 0x02;
01560 
01561 /* Atapi 2.5 changers */
01562 typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER {
01563   UCHAR  CurrentSlot : 5;
01564   UCHAR  ChangerState : 2;
01565   UCHAR  Fault : 1;
01566   UCHAR  Reserved : 5;
01567   UCHAR  MechanismState : 3;
01568   UCHAR  CurrentLogicalBlockAddress[3];
01569   UCHAR  NumberAvailableSlots;
01570   UCHAR  SlotTableLength[2];
01571 } MECHANICAL_STATUS_INFORMATION_HEADER, *PMECHANICAL_STATUS_INFORMATION_HEADER;
01572 
01573 typedef struct _SLOT_TABLE_INFORMATION {
01574   UCHAR  DiscChanged : 1;
01575   UCHAR  Reserved : 6;
01576   UCHAR  DiscPresent : 1;
01577   UCHAR  Reserved2[3];
01578 } SLOT_TABLE_INFORMATION, *PSLOT_TABLE_INFORMATION;
01579 
01580 typedef struct _MECHANICAL_STATUS {
01581   MECHANICAL_STATUS_INFORMATION_HEADER  MechanicalStatusHeader;
01582   SLOT_TABLE_INFORMATION  SlotTableInfo[1];
01583 } MECHANICAL_STATUS, *PMECHANICAL_STATUS;
01584 
01585 
01586 /* Tape definitions */
01587 typedef struct _TAPE_POSITION_DATA {
01588     UCHAR  Reserved1 : 2;
01589     UCHAR  BlockPositionUnsupported : 1;
01590     UCHAR  Reserved2 : 3;
01591     UCHAR  EndOfPartition : 1;
01592     UCHAR  BeginningOfPartition : 1;
01593     UCHAR  PartitionNumber;
01594     USHORT  Reserved3;
01595     UCHAR  FirstBlock[4];
01596     UCHAR  LastBlock[4];
01597     UCHAR  Reserved4;
01598     UCHAR  NumberOfBlocks[3];
01599     UCHAR  NumberOfBytes[4];
01600 } TAPE_POSITION_DATA, *PTAPE_POSITION_DATA;
01601 
01602 /* This structure is used to convert little endian ULONGs
01603    to SCSI CDB big endians values. */
01604 typedef union _EIGHT_BYTE {
01605   _ANONYMOUS_STRUCT struct {
01606     UCHAR  Byte0;
01607     UCHAR  Byte1;
01608     UCHAR  Byte2;
01609     UCHAR  Byte3;
01610     UCHAR  Byte4;
01611     UCHAR  Byte5;
01612     UCHAR  Byte6;
01613     UCHAR  Byte7;
01614   } DUMMYSTRUCTNAME;
01615   ULONGLONG  AsULongLong;
01616 } EIGHT_BYTE, *PEIGHT_BYTE;
01617 
01618 typedef union _FOUR_BYTE {
01619   _ANONYMOUS_STRUCT struct {
01620     UCHAR  Byte0;
01621     UCHAR  Byte1;
01622     UCHAR  Byte2;
01623     UCHAR  Byte3;
01624   } DUMMYSTRUCTNAME;
01625   ULONG  AsULong;
01626 } FOUR_BYTE, *PFOUR_BYTE;
01627 
01628 typedef union _TWO_BYTE {
01629   _ANONYMOUS_STRUCT struct {
01630     UCHAR  Byte0;
01631     UCHAR  Byte1;
01632   } DUMMYSTRUCTNAME;
01633   USHORT  AsUShort;
01634 } TWO_BYTE, *PTWO_BYTE;
01635 
01636 /* Byte reversing macro for converting between
01637    big- and little-endian formats */
01638 #define REVERSE_BYTES_QUAD(Destination, Source) { \
01639     PEIGHT_BYTE _val1 = (PEIGHT_BYTE)(Destination); \
01640     PEIGHT_BYTE _val2 = (PEIGHT_BYTE)(Source); \
01641     _val1->Byte7 = _val2->Byte0; \
01642     _val1->Byte6 = _val2->Byte1; \
01643     _val1->Byte5 = _val2->Byte2; \
01644     _val1->Byte4 = _val2->Byte3; \
01645     _val1->Byte3 = _val2->Byte4; \
01646     _val1->Byte2 = _val2->Byte5; \
01647     _val1->Byte1 = _val2->Byte6; \
01648     _val1->Byte0 = _val2->Byte7; \
01649 }
01650 
01651 #define REVERSE_BYTES(Destination, Source) { \
01652     PFOUR_BYTE _val1 = (PFOUR_BYTE)(Destination); \
01653     PFOUR_BYTE _val2 = (PFOUR_BYTE)(Source); \
01654     _val1->Byte3 = _val2->Byte0; \
01655     _val1->Byte2 = _val2->Byte1; \
01656     _val1->Byte1 = _val2->Byte2; \
01657     _val1->Byte0 = _val2->Byte3; \
01658 }
01659 
01660 #define REVERSE_BYTES_SHORT(Destination, Source) { \
01661   PTWO_BYTE _val1 = (PTWO_BYTE)(Destination); \
01662   PTWO_BYTE _val2 = (PTWO_BYTE)(Source); \
01663   _val1->Byte1 = _val2->Byte0; \
01664   _val1->Byte0 = _val2->Byte1; \
01665 }
01666 
01667 #define REVERSE_SHORT(Short) { \
01668   UCHAR _val; \
01669   PTWO_BYTE _val2 = (PTWO_BYTE)(Short); \
01670   _val = _val2->Byte0; \
01671   _val2->Byte0 = _val2->Byte1; \
01672   _val2->Byte1 = _val; \
01673 }
01674 
01675 #define REVERSE_LONG(Long) { \
01676   UCHAR _val; \
01677   PFOUR_BYTE _val2 = (PFOUR_BYTE)(Long); \
01678   _val = _val2->Byte3; \
01679   _val2->Byte3 = _val2->Byte0; \
01680   _val2->Byte0 = _val; \
01681   _val = _val2->Byte2; \
01682   _val2->Byte2 = _val2->Byte1; \
01683   _val2->Byte1 = _val; \
01684 }
01685 
01686 #define WHICH_BIT(Data, Bit) { \
01687   UCHAR _val; \
01688   for (_val = 0; _val < 32; _val++) { \
01689     if (((Data) >> _val) == 1) { \
01690       break; \
01691     } \
01692   } \
01693   ASSERT(_val != 32); \
01694   (Bit) = _val; \
01695 }
01696 
01697 #ifdef __cplusplus
01698 }
01699 #endif
01700 
01701 #endif /* __SCSI_H */