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