home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 14 / hacker14.iso / programacao / cwin / c.exe / $INSTDIR / include / ddk / scsi.h < prev    next >
Encoding:
C/C++ Source or Header  |  2003-12-15  |  48.1 KB  |  1,694 lines

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