Annotation of ntddk/src/scsi/inc/scsi.h, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1989  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     scsi.h
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     These are the structures and defines that are used in the
        !            12:     SCSI port and class drivers.
        !            13: 
        !            14: Authors:
        !            15: 
        !            16:     John Freeman (johnfr) 28-Mar-90
        !            17:     Andre Vachon (andrev) 06-Jun-90
        !            18:     Mike Glass (mglass)
        !            19:     Jeff Havens (jhavens)
        !            20: 
        !            21: Revision History:
        !            22: 
        !            23: --*/
        !            24: #ifndef _NTSCSI_
        !            25: #define _NTSCSI_
        !            26: 
        !            27: #include "srb.h"
        !            28: 
        !            29: //
        !            30: // Define SCSI maximum configuration parameters.
        !            31: //
        !            32: 
        !            33: #define SCSI_MAXIMUM_TARGETS 8
        !            34: #define SCSI_MAXIMUM_LOGICAL_UNITS 8
        !            35: #define SCSI_MAXIMUM_TARGETS_PER_BUS 32
        !            36: 
        !            37: #define MAXIMUM_CDB_SIZE 12
        !            38: 
        !            39: //
        !            40: // Command Descriptor Block. Passed by SCSI controller chip over the SCSI bus
        !            41: //
        !            42: 
        !            43: typedef union _CDB {
        !            44: 
        !            45:     //
        !            46:     // Generic 6-Byte CDB
        !            47:     //
        !            48: 
        !            49:     struct _CDB6GENERIC {
        !            50:        UCHAR  OperationCode;
        !            51:        UCHAR  Immediate : 1;
        !            52:        UCHAR  CommandUniqueBits : 4;
        !            53:        UCHAR  LogicalUnitNumber : 3;
        !            54:        UCHAR  CommandUniqueBytes[3];
        !            55:        UCHAR  Link : 1;
        !            56:        UCHAR  Flag : 1;
        !            57:        UCHAR  Reserved : 4;
        !            58:        UCHAR  VendorUnique : 2;
        !            59:     } CDB6GENERIC, *PCDB6GENERIC;
        !            60: 
        !            61:     //
        !            62:     // Standard 6-byte CDB
        !            63:     //
        !            64: 
        !            65:     struct _CDB6READWRITE {
        !            66:         UCHAR OperationCode;
        !            67:         UCHAR LogicalBlockMsb1 : 5;
        !            68:         UCHAR LogicalUnitNumber : 3;
        !            69:         UCHAR LogicalBlockMsb0;
        !            70:         UCHAR LogicalBlockLsb;
        !            71:         UCHAR TransferBlocks;
        !            72:         UCHAR Control;
        !            73:     } CDB6READWRITE, *PCDB6READWRITE;
        !            74: 
        !            75: 
        !            76:     //
        !            77:     // SCSI Inquiry CDB
        !            78:     //
        !            79: 
        !            80:     struct _CDB6INQUIRY {
        !            81:         UCHAR OperationCode;
        !            82:         UCHAR Reserved1 : 5;
        !            83:         UCHAR LogicalUnitNumber : 3;
        !            84:         UCHAR PageCode;
        !            85:         UCHAR IReserved;
        !            86:         UCHAR AllocationLength;
        !            87:         UCHAR Control;
        !            88:     } CDB6INQUIRY, *PCDB6INQUIRY;
        !            89: 
        !            90:     //
        !            91:     // SCSI Format CDB
        !            92:     //
        !            93: 
        !            94:     struct _CDB6FORMAT {
        !            95:         UCHAR OperationCode;
        !            96:         UCHAR FormatControl : 5;
        !            97:         UCHAR LogicalUnitNumber : 3;
        !            98:         UCHAR FReserved1;
        !            99:         UCHAR InterleaveMsb;
        !           100:         UCHAR InterleaveLsb;
        !           101:         UCHAR FReserved2;
        !           102:     } CDB6FORMAT, *PCDB6FORMAT;
        !           103: 
        !           104:     //
        !           105:     // Standard 10-byte CDB
        !           106: 
        !           107:     struct _CDB10 {
        !           108:         UCHAR OperationCode;
        !           109:         UCHAR RelativeAddress : 1;
        !           110:         UCHAR Reserved1 : 2;
        !           111:         UCHAR ForceUnitAccess : 1;
        !           112:         UCHAR DisablePageOut : 1;
        !           113:         UCHAR LogicalUnitNumber : 3;
        !           114:         UCHAR LogicalBlockByte0;
        !           115:         UCHAR LogicalBlockByte1;
        !           116:         UCHAR LogicalBlockByte2;
        !           117:         UCHAR LogicalBlockByte3;
        !           118:         UCHAR Reserved2;
        !           119:         UCHAR TransferBlocksMsb;
        !           120:         UCHAR TransferBlocksLsb;
        !           121:         UCHAR Control;
        !           122:     } CDB10, *PCDB10;
        !           123: 
        !           124:     //
        !           125:     // CD Rom Audio CDBs
        !           126:     //
        !           127: 
        !           128:     struct _PAUSE_RESUME {
        !           129:         UCHAR OperationCode;
        !           130:         UCHAR Reserved1 : 5;
        !           131:         UCHAR LogicalUnitNumber : 3;
        !           132:         UCHAR Reserved2[6];
        !           133:         UCHAR Action;
        !           134:         UCHAR Control;
        !           135:     } PAUSE_RESUME, *PPAUSE_RESUME;
        !           136: 
        !           137:     //
        !           138:     // Read Table of Contents
        !           139:     //
        !           140: 
        !           141:     struct _READ_TOC {
        !           142:         UCHAR OperationCode;
        !           143:         UCHAR Reserved0 : 1;
        !           144:         UCHAR Msf : 1;
        !           145:         UCHAR Reserved1 : 3;
        !           146:         UCHAR LogicalUnitNumber : 3;
        !           147:         UCHAR Reserved2[4];
        !           148:         UCHAR StartingTrack;
        !           149:         UCHAR AllocationLength[2];
        !           150:         UCHAR Control : 6;
        !           151:         UCHAR Format : 2;
        !           152:     } READ_TOC, *PREAD_TOC;
        !           153: 
        !           154:     struct _PLAY_AUDIO_MSF {
        !           155:         UCHAR OperationCode;
        !           156:         UCHAR Reserved1 : 5;
        !           157:         UCHAR LogicalUnitNumber : 3;
        !           158:         UCHAR Reserved2;
        !           159:         UCHAR StartingM;
        !           160:         UCHAR StartingS;
        !           161:         UCHAR StartingF;
        !           162:         UCHAR EndingM;
        !           163:         UCHAR EndingS;
        !           164:         UCHAR EndingF;
        !           165:         UCHAR Control;
        !           166:     } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF;
        !           167: 
        !           168:     //
        !           169:     // Read SubChannel Data
        !           170:     //
        !           171: 
        !           172:     struct _SUBCHANNEL {
        !           173:         UCHAR OperationCode;
        !           174:         UCHAR Reserved0 : 1;
        !           175:         UCHAR Msf : 1;
        !           176:         UCHAR Reserved1 : 3;
        !           177:         UCHAR LogicalUnitNumber : 3;
        !           178:         UCHAR Reserved2 : 6;
        !           179:         UCHAR SubQ : 1;
        !           180:         UCHAR Reserved3 : 1;
        !           181:         UCHAR Format;
        !           182:         UCHAR Reserved4[2];
        !           183:         UCHAR TrackNumber;
        !           184:         UCHAR AllocationLength[2];
        !           185:         UCHAR Control;
        !           186:     } SUBCHANNEL, *PSUBCHANNEL;
        !           187: 
        !           188:     //
        !           189:     // Mode sense
        !           190:     //
        !           191: 
        !           192:     struct _MODE_SENSE {
        !           193:         UCHAR OperationCode;
        !           194:         UCHAR Reserved1 : 3;
        !           195:         UCHAR Dbd : 1;
        !           196:         UCHAR Reserved2 : 1;
        !           197:         UCHAR LogicalUnitNumber : 3;
        !           198:         UCHAR PageCode : 6;
        !           199:         UCHAR Pc : 2;
        !           200:         UCHAR Reserved3;
        !           201:         UCHAR AllocationLength;
        !           202:         UCHAR Control;
        !           203:     } MODE_SENSE, *PMODE_SENSE;
        !           204: 
        !           205:     //
        !           206:     // Mode select
        !           207:     //
        !           208: 
        !           209:     struct _MODE_SELECT {
        !           210:         UCHAR OperationCode;
        !           211:         UCHAR SPBit : 1;
        !           212:         UCHAR Reserved1 : 3;
        !           213:         UCHAR PFBit : 1;
        !           214:         UCHAR LogicalUnitNumber : 3;
        !           215:         UCHAR Reserved2[2];
        !           216:         UCHAR ParameterListLength;
        !           217:         UCHAR Control;
        !           218:     } MODE_SELECT, *PMODE_SELECT;
        !           219: 
        !           220:     struct _LOCATE {
        !           221:         UCHAR OperationCode;
        !           222:         UCHAR Immediate : 1;
        !           223:         UCHAR CPBit : 1;
        !           224:         UCHAR BTBit : 1;
        !           225:         UCHAR Reserved1 : 2;
        !           226:         UCHAR LogicalUnitNumber : 3;
        !           227:         UCHAR Reserved3;
        !           228:         UCHAR LogicalBlockAddress[4];
        !           229:         UCHAR Reserved4;
        !           230:         UCHAR Partition;
        !           231:         UCHAR Control;
        !           232:     } LOCATE, *PLOCATE;
        !           233: 
        !           234:     struct _LOGSENSE {
        !           235:         UCHAR OperationCode;
        !           236:         UCHAR SPBit : 1;
        !           237:         UCHAR PPCBit : 1;
        !           238:         UCHAR Reserved1 : 3;
        !           239:         UCHAR LogicalUnitNumber : 3;
        !           240:         UCHAR PageCode : 6;
        !           241:         UCHAR PCBit : 2;
        !           242:         UCHAR Reserved2;
        !           243:         UCHAR Reserved3;
        !           244:         UCHAR ParameterPointer[2];  // [0]=MSB, [1]=LSB
        !           245:         UCHAR AllocationLength[2];  // [0]=MSB, [1]=LSB
        !           246:         UCHAR Control;
        !           247:     } LOGSENSE, *PLOGSENSE;
        !           248: 
        !           249:     struct _PRINT {
        !           250:         UCHAR OperationCode;
        !           251:         UCHAR Reserved : 5;
        !           252:         UCHAR LogicalUnitNumber : 3;
        !           253:         UCHAR TransferLength[3];
        !           254:         UCHAR Control;
        !           255:     } PRINT, *PPRINT;
        !           256: 
        !           257:     struct _SEEK {
        !           258:         UCHAR OperationCode;
        !           259:         UCHAR Reserved1 : 5;
        !           260:         UCHAR LogicalUnitNumber : 3;
        !           261:         UCHAR LogicalBlockAddress[4];
        !           262:         UCHAR Reserved2[3];
        !           263:         UCHAR Control;
        !           264:     } SEEK, *PSEEK;
        !           265: 
        !           266:     struct _ERASE {
        !           267:         UCHAR OperationCode;
        !           268:         UCHAR Long : 1;
        !           269:         UCHAR Immediate : 1;
        !           270:         UCHAR Reserved1 : 3;
        !           271:         UCHAR LogicalUnitNumber : 3;
        !           272:         UCHAR Reserved2[3];
        !           273:         UCHAR Control;
        !           274:     } ERASE, *PERASE;
        !           275: 
        !           276:     struct _START_STOP {
        !           277:         UCHAR OperationCode;
        !           278:         UCHAR Immediate: 1;
        !           279:         UCHAR Reserved1 : 4;
        !           280:         UCHAR LogicalUnitNumber : 3;
        !           281:         UCHAR Reserved2[2];
        !           282:         UCHAR Start : 1;
        !           283:         UCHAR LoadEject : 1;
        !           284:         UCHAR Reserved3 : 6;
        !           285:         UCHAR Control;
        !           286:     } START_STOP, *PSTART_STOP;
        !           287: 
        !           288:     struct _MEDIA_REMOVAL {
        !           289:         UCHAR OperationCode;
        !           290:         UCHAR Reserved1 : 5;
        !           291:         UCHAR LogicalUnitNumber : 3;
        !           292:         UCHAR Reserved2[2];
        !           293:         UCHAR Prevent;
        !           294:         UCHAR Control;
        !           295:     } MEDIA_REMOVAL, *PMEDIA_REMOVAL;
        !           296: 
        !           297:     //
        !           298:     // Tape CDBs
        !           299:     //
        !           300: 
        !           301:     struct _SEEK_BLOCK {
        !           302:         UCHAR OperationCode;
        !           303:         UCHAR Immediate : 1;
        !           304:         UCHAR Reserved1 : 7;
        !           305:         UCHAR BlockAddress[3];
        !           306:         UCHAR Link : 1;
        !           307:         UCHAR Flag : 1;
        !           308:         UCHAR Reserved2 : 4;
        !           309:         UCHAR VendorUnique : 2;
        !           310:     } SEEK_BLOCK, *PSEEK_BLOCK;
        !           311: 
        !           312:     struct _REQUEST_BLOCK_ADDRESS {
        !           313:         UCHAR OperationCode;
        !           314:         UCHAR Reserved1[3];
        !           315:         UCHAR AllocationLength;
        !           316:         UCHAR Link : 1;
        !           317:         UCHAR Flag : 1;
        !           318:         UCHAR Reserved2 : 4;
        !           319:         UCHAR VendorUnique : 2;
        !           320:     } REQUEST_BLOCK_ADDRESS, *PREQUEST_BLOCK_ADDRESS;
        !           321: 
        !           322:     struct _PARTITION {
        !           323:         UCHAR OperationCode;
        !           324:         UCHAR Immediate : 1;
        !           325:         UCHAR Sel: 1;
        !           326:         UCHAR PartitionSelect : 6;
        !           327:         UCHAR Reserved1[3];
        !           328:         UCHAR Control;
        !           329:     } PARTITION, *PPARTITION;
        !           330: 
        !           331:     struct _WRITE_TAPE_MARKS {
        !           332:         UCHAR OperationCode;
        !           333:         UCHAR Immediate : 1;
        !           334:         UCHAR WriteSetMarks: 1;
        !           335:         UCHAR Reserved : 3;
        !           336:         UCHAR LogicalUnitNumber : 3;
        !           337:         UCHAR TransferLength[3];
        !           338:         UCHAR Control;
        !           339:     } WRITE_TAPE_MARKS, *PWRITE_TAPE_MARKS;
        !           340: 
        !           341:     struct _SPACE_TAPE_MARKS {
        !           342:         UCHAR OperationCode;
        !           343:         UCHAR Code : 3;
        !           344:         UCHAR Reserved : 2;
        !           345:         UCHAR LogicalUnitNumber : 3;
        !           346:         UCHAR NumMarksMSB ;
        !           347:         UCHAR NumMarks;
        !           348:         UCHAR NumMarksLSB;
        !           349:         union {
        !           350:             UCHAR value;
        !           351:             struct {
        !           352:                 UCHAR Link : 1;
        !           353:                 UCHAR Flag : 1;
        !           354:                 UCHAR Reserved : 4;
        !           355:                 UCHAR VendorUnique : 2;
        !           356:             } Fields;
        !           357:         } Byte6;
        !           358:     } SPACE_TAPE_MARKS, *PSPACE_TAPE_MARKS;
        !           359: 
        !           360:     //
        !           361:     // Read tape position
        !           362:     //
        !           363: 
        !           364:     struct _READ_POSITION {
        !           365:         UCHAR Operation;
        !           366:         UCHAR BlockType:1;
        !           367:         UCHAR Reserved1:4;
        !           368:         UCHAR Lun:3;
        !           369:         UCHAR Reserved2[7];
        !           370:         UCHAR Control;
        !           371:     } READ_POSITION, *PREAD_POSITION;
        !           372: 
        !           373:     //
        !           374:     // ReadWrite for Tape
        !           375:     //
        !           376: 
        !           377:     struct _CDB6READWRITETAPE {
        !           378:         UCHAR OperationCode;
        !           379:         UCHAR VendorSpecific : 5;
        !           380:         UCHAR Reserved : 3;
        !           381:         UCHAR TransferLenMSB;
        !           382:         UCHAR TransferLen;
        !           383:         UCHAR TransferLenLSB;
        !           384:         UCHAR Link : 1;
        !           385:         UCHAR Flag : 1;
        !           386:         UCHAR Reserved1 : 4;
        !           387:         UCHAR VendorUnique : 2;
        !           388:      } CDB6READWRITETAPE, *PCDB6READWRITETAPE;
        !           389: 
        !           390: } CDB, *PCDB;
        !           391: 
        !           392: //
        !           393: // Command Descriptor Block constants.
        !           394: //
        !           395: 
        !           396: #define CDB6GENERIC_LENGTH                   6
        !           397: #define CDB10GENERIC_LENGTH                  10
        !           398: 
        !           399: #define SETBITON                             1
        !           400: #define SETBITOFF                            0
        !           401: //
        !           402: // Mode Sense/Select page constants.
        !           403: //
        !           404: 
        !           405: #define MODE_PAGE_ERROR_RECOVERY        0x01
        !           406: #define MODE_PAGE_DISCONNECT            0x02
        !           407: #define MODE_PAGE_FORMAT_DEVICE         0x03
        !           408: #define MODE_PAGE_RIGID_GEOMETRY        0x04
        !           409: #define MODE_PAGE_FLEXIBILE             0x05
        !           410: #define MODE_PAGE_VERIFY_ERROR          0x07
        !           411: #define MODE_PAGE_CACHING               0x08
        !           412: #define MODE_PAGE_PERIPHERAL            0x09
        !           413: #define MODE_PAGE_CONTROL               0x0A
        !           414: #define MODE_PAGE_MEDIUM_TYPES          0x0B
        !           415: #define MODE_PAGE_NOTCH_PARTITION       0x0C
        !           416: #define MODE_SENSE_RETURN_ALL           0x3f
        !           417: #define MODE_SENSE_CURRENT_VALUES       0x00
        !           418: #define MODE_SENSE_CHANGEABLE_VALUES    0x40
        !           419: #define MODE_SENSE_DEFAULT_VAULES       0x80
        !           420: #define MODE_SENSE_SAVED_VALUES         0xc0
        !           421: #define MODE_PAGE_DEVICE_CONFIG         0x10
        !           422: #define MODE_PAGE_MEDIUM_PARTITION      0x11
        !           423: #define MODE_PAGE_DATA_COMPRESS         0x0f
        !           424: 
        !           425: //
        !           426: // SCSI CDB operation codes
        !           427: //
        !           428: 
        !           429: #define SCSIOP_TEST_UNIT_READY     0x00
        !           430: #define SCSIOP_REZERO_UNIT         0x01
        !           431: #define SCSIOP_REWIND              0x01
        !           432: #define SCSIOP_REQUEST_BLOCK_ADDR  0x02
        !           433: #define SCSIOP_REQUEST_SENSE       0x03
        !           434: #define SCSIOP_FORMAT_UNIT         0x04
        !           435: #define SCSIOP_READ_BLOCK_LIMITS   0x05
        !           436: #define SCSIOP_REASSIGN_BLOCKS     0x07
        !           437: #define SCSIOP_READ6               0x08
        !           438: #define SCSIOP_RECEIVE             0x08
        !           439: #define SCSIOP_WRITE6              0x0A
        !           440: #define SCSIOP_PRINT               0x0A
        !           441: #define SCSIOP_SEND                0x0A
        !           442: #define SCSIOP_SEEK6               0x0B
        !           443: #define SCSIOP_TRACK_SELECT        0x0B
        !           444: #define SCSIOP_SLEW_PRINT          0x0B
        !           445: #define SCSIOP_SEEK_BLOCK          0x0C
        !           446: #define SCSIOP_PARTITION           0x0D
        !           447: #define SCSIOP_READ_REVERSE        0x0F
        !           448: #define SCSIOP_WRITE_FILEMARKS     0x10
        !           449: #define SCSIOP_FLUSH_BUFFER        0x10
        !           450: #define SCSIOP_SPACE               0x11
        !           451: #define SCSIOP_INQUIRY             0x12
        !           452: #define SCSIOP_VERIFY6             0x13
        !           453: #define SCSIOP_RECOVER_BUF_DATA    0x14
        !           454: #define SCSIOP_MODE_SELECT         0x15
        !           455: #define SCSIOP_RESERVE_UNIT        0x16
        !           456: #define SCSIOP_RELEASE_UNIT        0x17
        !           457: #define SCSIOP_COPY                0x18
        !           458: #define SCSIOP_ERASE               0x19
        !           459: #define SCSIOP_MODE_SENSE          0x1A
        !           460: #define SCSIOP_START_STOP_UNIT     0x1B
        !           461: #define SCSIOP_STOP_PRINT          0x1B
        !           462: #define SCSIOP_LOAD_UNLOAD         0x1B
        !           463: #define SCSIOP_RECEIVE_DIAGNOSTIC  0x1C
        !           464: #define SCSIOP_SEND_DIAGNOSTIC     0x1D
        !           465: #define SCSIOP_MEDIUM_REMOVAL      0x1E
        !           466: #define SCSIOP_READ_CAPACITY       0x25
        !           467: #define SCSIOP_READ                0x28
        !           468: #define SCSIOP_WRITE               0x2A
        !           469: #define SCSIOP_SEEK                0x2B
        !           470: #define SCSIOP_LOCATE              0x2B
        !           471: #define SCSIOP_WRITE_VERIFY        0x2E
        !           472: #define SCSIOP_VERIFY              0x2F
        !           473: #define SCSIOP_SEARCH_DATA_HIGH    0x30
        !           474: #define SCSIOP_SEARCH_DATA_EQUAL   0x31
        !           475: #define SCSIOP_SEARCH_DATA_LOW     0x32
        !           476: #define SCSIOP_SET_LIMITS          0x33
        !           477: #define SCSIOP_READ_POSITION       0x34
        !           478: #define SCSIOP_SYNCHRONIZE_CACHE   0x35
        !           479: #define SCSIOP_COMPARE             0x39
        !           480: #define SCSIOP_COPY_COMPARE        0x3A
        !           481: #define SCSIOP_WRITE_DATA_BUFF     0x3B
        !           482: #define SCSIOP_READ_DATA_BUFF      0x3C
        !           483: #define SCSIOP_CHANGE_DEFINITION   0x40
        !           484: #define SCSIOP_READ_SUB_CHANNEL    0x42
        !           485: #define SCSIOP_READ_TOC            0x43
        !           486: #define SCSIOP_READ_HEADER         0x44
        !           487: #define SCSIOP_PLAY_AUDIO          0x45
        !           488: #define SCSIOP_PLAY_AUDIO_MSF      0x47
        !           489: #define SCSIOP_PLAY_TRACK_INDEX    0x48
        !           490: #define SCSIOP_PLAY_TRACK_RELATIVE 0x49
        !           491: #define SCSIOP_PAUSE_RESUME        0x4B
        !           492: #define SCSIOP_LOG_SELECT          0x4C
        !           493: #define SCSIOP_LOG_SENSE           0x4D
        !           494: 
        !           495: //
        !           496: // If the IMMED bit is 1, status is returned as soon
        !           497: // as the operation is initiated. If the IMMED bit
        !           498: // is 0, status is not returned until the operation
        !           499: // is completed.
        !           500: //
        !           501: 
        !           502: #define CDB_RETURN_ON_COMPLETION   0
        !           503: #define CDB_RETURN_IMMEDIATE       1
        !           504: 
        !           505: //
        !           506: // CDB Force media access used in extended read and write commands.
        !           507: //
        !           508: 
        !           509: #define CDB_FORCE_MEDIA_ACCESS 0x08
        !           510: 
        !           511: //
        !           512: // Denon CD ROM operation codes
        !           513: //
        !           514: 
        !           515: #define SCSIOP_DENON_EJECT_DISC    0xE6
        !           516: #define SCSIOP_DENON_STOP_AUDIO    0xE7
        !           517: #define SCSIOP_DENON_PLAY_AUDIO    0xE8
        !           518: #define SCSIOP_DENON_READ_TOC      0xE9
        !           519: #define SCSIOP_DENON_READ_SUBCODE  0xEB
        !           520: 
        !           521: //
        !           522: // SCSI Bus Messages
        !           523: //
        !           524: 
        !           525: #define SCSIMESS_ABORT                0x06
        !           526: #define SCSIMESS_ABORT_WITH_TAG       0x0D
        !           527: #define SCSIMESS_BUS_DEVICE_RESET     0X0C
        !           528: #define SCSIMESS_CLEAR_QUEUE          0X0E
        !           529: #define SCSIMESS_COMMAND_COMPLETE     0X00
        !           530: #define SCSIMESS_DISCONNECT           0X04
        !           531: #define SCSIMESS_EXTENDED_MESSAGE     0X01
        !           532: #define SCSIMESS_IDENTIFY             0X80
        !           533: #define SCSIMESS_IDENTIFY_WITH_DISCON 0XC0
        !           534: #define SCSIMESS_IGNORE_WIDE_RESIDUE  0X23
        !           535: #define SCSIMESS_INITIATE_RECOVERY    0X0F
        !           536: #define SCSIMESS_INIT_DETECTED_ERROR  0X05
        !           537: #define SCSIMESS_LINK_CMD_COMP        0X0A
        !           538: #define SCSIMESS_LINK_CMD_COMP_W_FLAG 0X0B
        !           539: #define SCSIMESS_MESS_PARITY_ERROR    0X09
        !           540: #define SCSIMESS_MESSAGE_REJECT       0X07
        !           541: #define SCSIMESS_NO_OPERATION         0X08
        !           542: #define SCSIMESS_HEAD_OF_QUEUE_TAG    0X21
        !           543: #define SCSIMESS_ORDERED_QUEUE_TAG    0X22
        !           544: #define SCSIMESS_SIMPLE_QUEUE_TAG     0X20
        !           545: #define SCSIMESS_RELEASE_RECOVERY     0X10
        !           546: #define SCSIMESS_RESTORE_POINTERS     0X03
        !           547: #define SCSIMESS_SAVE_DATA_POINTER    0X02
        !           548: #define SCSIMESS_TERMINATE_IO_PROCESS 0X11
        !           549: 
        !           550: //
        !           551: // SCSI Extended Message operation codes
        !           552: //
        !           553: 
        !           554: #define SCSIMESS_MODIFY_DATA_POINTER  0X00
        !           555: #define SCSIMESS_SYNCHRONOUS_DATA_REQ 0X01
        !           556: #define SCSIMESS_WIDE_DATA_REQUEST    0X03
        !           557: 
        !           558: //
        !           559: // SCSI Extended Message Lengths
        !           560: //
        !           561: 
        !           562: #define SCSIMESS_MODIFY_DATA_LENGTH   5
        !           563: #define SCSIMESS_SYNCH_DATA_LENGTH    3
        !           564: #define SCSIMESS_WIDE_DATA_LENGTH     2
        !           565: 
        !           566: //
        !           567: // SCSI extended message structure
        !           568: //
        !           569: 
        !           570: #pragma pack (1)
        !           571: typedef struct _SCSI_EXTENDED_MESSAGE {
        !           572:     UCHAR InitialMessageCode;
        !           573:     UCHAR MessageLength;
        !           574:     UCHAR MessageType;
        !           575:     union _EXTENDED_ARGUMENTS {
        !           576: 
        !           577:         struct {
        !           578:             UCHAR Modifier[4];
        !           579:         } Modify;
        !           580: 
        !           581:         struct {
        !           582:             UCHAR TransferPeriod;
        !           583:             UCHAR ReqAckOffset;
        !           584:         } Synchronous;
        !           585: 
        !           586:         struct{
        !           587:             UCHAR Width;
        !           588:         } Wide;
        !           589:     }ExtendedArguments;
        !           590: }SCSI_EXTENDED_MESSAGE, *PSCSI_EXTENDED_MESSAGE;
        !           591: #pragma pack ()
        !           592: 
        !           593: //
        !           594: // SCSI bus status codes.
        !           595: //
        !           596: 
        !           597: #define SCSISTAT_GOOD                  0x00
        !           598: #define SCSISTAT_CHECK_CONDITION       0x02
        !           599: #define SCSISTAT_CONDITION_MET         0x04
        !           600: #define SCSISTAT_BUSY                  0x08
        !           601: #define SCSISTAT_INTERMEDIATE          0x10
        !           602: #define SCSISTAT_INTERMEDIATE_COND_MET 0x14
        !           603: #define SCSISTAT_RESERVATION_CONFLICT  0x18
        !           604: #define SCSISTAT_COMMAND_TERMINATED    0x22
        !           605: #define SCSISTAT_QUEUE_FULL            0x28
        !           606: 
        !           607: //
        !           608: // Enable Vital Product Data Flag (EVPD)
        !           609: // used with INQUIRY command.
        !           610: //
        !           611: 
        !           612: #define CDB_INQUIRY_EVPD           0x01
        !           613: 
        !           614: //
        !           615: // Defines for format CDB
        !           616: //
        !           617: 
        !           618: #define LUN0_FORMAT_SAVING_DEFECT_LIST 0
        !           619: #define USE_DEFAULTMSB  0
        !           620: #define USE_DEFAULTLSB  0
        !           621: 
        !           622: #define START_UNIT_CODE 0x01
        !           623: #define STOP_UNIT_CODE  0x00
        !           624: 
        !           625: //
        !           626: // Inquiry buffer structure. This is the data returned from the target
        !           627: // after it receives an inquiry.
        !           628: //
        !           629: // This structure may be extended by the number of bytes specified
        !           630: // in the field AdditionalLength. The defined size constant only
        !           631: // includes fields through ProductRevisionLevel.
        !           632: //
        !           633: // The NT SCSI drivers are only interested in the first 36 bytes of data.
        !           634: //
        !           635: 
        !           636: #define INQUIRYDATABUFFERSIZE 36
        !           637: 
        !           638: typedef struct _INQUIRYDATA {
        !           639:     UCHAR DeviceType : 5;
        !           640:     UCHAR DeviceTypeQualifier : 3;
        !           641:     UCHAR DeviceTypeModifier : 7;
        !           642:     UCHAR RemovableMedia : 1;
        !           643:     UCHAR Versions;
        !           644:     UCHAR ResponseDataFormat;
        !           645:     UCHAR AdditionalLength;
        !           646:     UCHAR Reserved[2];
        !           647:     UCHAR SoftReset : 1;
        !           648:     UCHAR CommandQueue : 1;
        !           649:     UCHAR Reserved2 : 1;
        !           650:     UCHAR LinkedCommands : 1;
        !           651:     UCHAR Synchronous : 1;
        !           652:     UCHAR Wide16Bit : 1;
        !           653:     UCHAR Wide32Bit : 1;
        !           654:     UCHAR RelativeAddressing : 1;
        !           655:     UCHAR VendorId[8];
        !           656:     UCHAR ProductId[16];
        !           657:     UCHAR ProductRevisionLevel[4];
        !           658:     UCHAR VendorSpecific[20];
        !           659:     UCHAR Reserved3[40];
        !           660: } INQUIRYDATA, *PINQUIRYDATA;
        !           661: 
        !           662: //
        !           663: // Inquiry defines. Used to interpret data returned from target as result
        !           664: // of inquiry command.
        !           665: //
        !           666: // DeviceType field
        !           667: //
        !           668: 
        !           669: #define DIRECT_ACCESS_DEVICE            0x00    // disks
        !           670: #define SEQUENTIAL_ACCESS_DEVICE        0x01    // tapes
        !           671: #define PRINTER_DEVICE                  0x02    // printers
        !           672: #define PROCESSOR_DEVICE                0x03    // scanners, printers, etc
        !           673: #define WRITE_ONCE_READ_MULTIPLE_DEVICE 0x04    // worms
        !           674: #define READ_ONLY_DIRECT_ACCESS_DEVICE  0x05    // cdroms
        !           675: #define SCANNER_DEVICE                  0x06    // scanners
        !           676: #define OPTICAL_DEVICE                  0x07    // optical disks
        !           677: #define MEDIUM_CHANGER                  0x08    // jukebox
        !           678: #define COMMUNICATION_DEVICE            0x09    // network
        !           679: #define LOGICAL_UNIT_NOT_PRESENT_DEVICE 0x7F
        !           680: #define DEVICE_QUALIFIER_NOT_SUPPORTED  0x03
        !           681: 
        !           682: //
        !           683: // DeviceTypeQualifier field
        !           684: //
        !           685: 
        !           686: #define DEVICE_CONNECTED 0x00
        !           687: 
        !           688: //
        !           689: // Sense Data Format
        !           690: //
        !           691: 
        !           692: typedef struct _SENSE_DATA {
        !           693:     UCHAR ErrorCode:7;
        !           694:     UCHAR Valid:1;
        !           695:     UCHAR SegmentNumber;
        !           696:     UCHAR SenseKey:4;
        !           697:     UCHAR Reserved:1;
        !           698:     UCHAR IncorrectLength:1;
        !           699:     UCHAR EndOfMedia:1;
        !           700:     UCHAR FileMark:1;
        !           701:     UCHAR Information[4];
        !           702:     UCHAR AdditionalSenseLength;
        !           703:     UCHAR CommandSpecificInformation[4];
        !           704:     UCHAR AdditionalSenseCode;
        !           705:     UCHAR AdditionalSenseCodeQualifier;
        !           706:     UCHAR FieldReplaceableUnitCode;
        !           707:     UCHAR SenseKeySpecific[3];
        !           708: } SENSE_DATA, *PSENSE_DATA;
        !           709: 
        !           710: //
        !           711: // Default request sense buffer size
        !           712: //
        !           713: 
        !           714: #define SENSE_BUFFER_SIZE 18
        !           715: 
        !           716: //
        !           717: // Sense codes
        !           718: //
        !           719: 
        !           720: #define SCSI_SENSE_NO_SENSE         0x00
        !           721: #define SCSI_SENSE_RECOVERED_ERROR  0x01
        !           722: #define SCSI_SENSE_NOT_READY        0x02
        !           723: #define SCSI_SENSE_MEDIUM_ERROR     0x03
        !           724: #define SCSI_SENSE_HARDWARE_ERROR   0x04
        !           725: #define SCSI_SENSE_ILLEGAL_REQUEST  0x05
        !           726: #define SCSI_SENSE_UNIT_ATTENTION   0x06
        !           727: #define SCSI_SENSE_DATA_PROTECT     0x07
        !           728: #define SCSI_SENSE_BLANK_CHECK      0x08
        !           729: #define SCSI_SENSE_UNIQUE           0x09
        !           730: #define SCSI_SENSE_COPY_ABORTED     0x0A
        !           731: #define SCSI_SENSE_ABORTED_COMMAND  0x0B
        !           732: #define SCSI_SENSE_EQUAL            0x0C
        !           733: #define SCSI_SENSE_VOL_OVERFLOW     0x0D
        !           734: #define SCSI_SENSE_MISCOMPARE       0x0E
        !           735: #define SCSI_SENSE_RESERVED         0x0F
        !           736: 
        !           737: //
        !           738: // Additional tape bit
        !           739: //
        !           740: 
        !           741: #define SCSI_ILLEGAL_LENGTH         0x20
        !           742: #define SCSI_EOM                    0x40
        !           743: #define SCSI_FILE_MARK              0x80
        !           744: 
        !           745: //
        !           746: // Additional Sense codes
        !           747: //
        !           748: 
        !           749: #define SCSI_ADSENSE_NO_SENSE       0x00
        !           750: #define SCSI_ADSENSE_LUN_NOT_READY  0x04
        !           751: #define SCSI_ADSENSE_ILLEGAL_COMMAND 0x20
        !           752: #define SCSI_ADSENSE_ILLEGAL_BLOCK  0x21
        !           753: #define SCSI_ADSENSE_INVALID_LUN    0x25
        !           754: #define SCSI_ADSENSE_MUSIC_AREA     0xA0
        !           755: #define SCSI_ADSENSE_DATA_AREA      0xA1
        !           756: #define SCSI_ADSENSE_VOLUME_OVERFLOW 0xA7
        !           757: 
        !           758: #define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE 0x3a
        !           759: #define SCSI_ADWRITE_PROTECT        0x27
        !           760: #define SCSI_ADSENSE_MEDIUM_CHANGED 0x28
        !           761: #define SCSI_ADSENSE_BUS_RESET      0x29
        !           762: #define SCSI_ADSENSE_TRACK_ERROR    0x14
        !           763: #define SCSI_ADSENSE_SEEK_ERROR     0x15
        !           764: #define SCSI_ADSENSE_REC_DATA_NOECC 0x17
        !           765: #define SCSI_ADSENSE_REC_DATA_ECC   0x18
        !           766: 
        !           767: //
        !           768: // Additional sense code qualifier
        !           769: //
        !           770: 
        !           771: #define SCSI_SENSEQ_FORMAT_IN_PROGRESS 0x04
        !           772: #define SCSI_SENSEQ_INIT_COMMAND_REQUIRED 0x02
        !           773: #define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED 0x03
        !           774: #define SCSI_SENSEQ_BECOMING_READY 0x01
        !           775: #define SCSI_SENSEQ_FILEMARK_DETECTED 0x01
        !           776: #define SCSI_SENSEQ_SETMARK_DETECTED 0x03
        !           777: #define SCSI_SENSEQ_END_OF_MEDIA_DETECTED 0x02
        !           778: #define SCSI_SENSEQ_BEGINNING_OF_MEDIA_DETECTED 0x04
        !           779: 
        !           780: //
        !           781: // SCSI IO Device Control Codes
        !           782: //
        !           783: 
        !           784: #define FILE_DEVICE_SCSI 0x0000001b
        !           785: 
        !           786: #define IOCTL_SCSI_EXECUTE_IN   ((FILE_DEVICE_SCSI << 16) + 0x0011)
        !           787: #define IOCTL_SCSI_EXECUTE_OUT  ((FILE_DEVICE_SCSI << 16) + 0x0012)
        !           788: #define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013)
        !           789: 
        !           790: //
        !           791: // Read Capacity Data - returned in Big Endian format
        !           792: //
        !           793: 
        !           794: typedef struct _READ_CAPACITY_DATA {
        !           795:     ULONG LogicalBlockAddress;
        !           796:     ULONG BytesPerBlock;
        !           797: } READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
        !           798: 
        !           799: 
        !           800: //
        !           801: // Read Block Limits Data - returned in Big Endian format
        !           802: // This structure returns the maximum and minimum block
        !           803: // size for a TAPE device.
        !           804: //
        !           805: 
        !           806: typedef struct _READ_BLOCK_LIMITS {
        !           807:     UCHAR Reserved;
        !           808:     UCHAR BlockMaximumSize[3];
        !           809:     UCHAR BlockMinimumSize[2];
        !           810: } READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA;
        !           811: 
        !           812: //
        !           813: // Mode data structures.
        !           814: //
        !           815: 
        !           816: //
        !           817: // Define Mode parameter header.
        !           818: //
        !           819: 
        !           820: typedef struct _MODE_PARAMETER_HEADER {
        !           821:     UCHAR ModeDataLength;
        !           822:     UCHAR MediumType;
        !           823:     UCHAR DeviceSpecificParameter;
        !           824:     UCHAR BlockDescriptorLength;
        !           825: }MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
        !           826: 
        !           827: #define MODE_FD_SINGLE_SIDE     0x01
        !           828: #define MODE_FD_DOUBLE_SIDE     0x02
        !           829: #define MODE_FD_MAXIMUM_TYPE    0x1E
        !           830: #define MODE_DSP_FUA_SUPPORTED  0x10
        !           831: #define MODE_DSP_WRITE_PROTECT  0x80
        !           832: 
        !           833: //
        !           834: // Define the mode parameter block.
        !           835: //
        !           836: 
        !           837: typedef struct _MODE_PARAMETER_BLOCK {
        !           838:     UCHAR DensityCode;
        !           839:     UCHAR NumberOfBlocks[3];
        !           840:     UCHAR Reserved;
        !           841:     UCHAR BlockLength[3];
        !           842: }MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK;
        !           843: 
        !           844: //
        !           845: // Define Disconnect-Reconnect page.
        !           846: //
        !           847: 
        !           848: typedef struct _MODE_DISCONNECT_PAGE {
        !           849:     UCHAR PageCode : 6;
        !           850:     UCHAR Reserved : 1;
        !           851:     UCHAR PageSavable : 1;
        !           852:     UCHAR PageLength;
        !           853:     UCHAR BufferFullRatio;
        !           854:     UCHAR BufferEmptyRatio;
        !           855:     UCHAR BusInactivityLimit[2];
        !           856:     UCHAR BusDisconnectTime[2];
        !           857:     UCHAR BusConnectTime[2];
        !           858:     UCHAR MaximumBurstSize[2];
        !           859:     UCHAR DataTransferDisconnect : 2;
        !           860:     UCHAR Reserved2[3];
        !           861: }MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE;
        !           862: 
        !           863: //
        !           864: // Define mode caching page.
        !           865: //
        !           866: 
        !           867: typedef struct _MODE_CACHING_PAGE {
        !           868:     UCHAR PageCode : 6;
        !           869:     UCHAR Reserved : 1;
        !           870:     UCHAR PageSavable : 1;
        !           871:     UCHAR PageLength;
        !           872:     UCHAR ReadDisableCache : 1;
        !           873:     UCHAR MultiplicationFactor : 1;
        !           874:     UCHAR WriteCacheEnable : 1;
        !           875:     UCHAR Reserved2 : 5;
        !           876:     UCHAR WriteRetensionPriority : 4;
        !           877:     UCHAR ReadRetensionPriority : 4;
        !           878:     UCHAR DisablePrefetchTransfer[2];
        !           879:     UCHAR MinimumPrefectch[2];
        !           880:     UCHAR MaximumPrefectch[2];
        !           881:     UCHAR MaximumPrefectchCeil[2];
        !           882: }MODE_CACHING_PAGE, *PMODE_CACHING_PAGE;
        !           883: 
        !           884: //
        !           885: // Define mode flexible disk page.
        !           886: //
        !           887: 
        !           888: typedef struct _MODE_FLEXIBLE_DISK_PAGE {
        !           889:     UCHAR PageCode : 6;
        !           890:     UCHAR Reserved : 1;
        !           891:     UCHAR PageSavable : 1;
        !           892:     UCHAR PageLength;
        !           893:     UCHAR TransferRate[2];
        !           894:     UCHAR NumberOfHeads;
        !           895:     UCHAR SectorsPerTrack;
        !           896:     UCHAR BytesPerSector[2];
        !           897:     UCHAR NumberOfCylinders[2];
        !           898:     UCHAR StartWritePrecom[2];
        !           899:     UCHAR StartReducedCurrent[2];
        !           900:     UCHAR StepRate[2];
        !           901:     UCHAR StepPluseWidth;
        !           902:     UCHAR HeadSettleDelay[2];
        !           903:     UCHAR MotorOnDelay;
        !           904:     UCHAR MotorOffDelay;
        !           905:     UCHAR Reserved2 : 5;
        !           906:     UCHAR MotorOnAsserted : 1;
        !           907:     UCHAR StartSectorNumber : 1;
        !           908:     UCHAR TrueReadySignal : 1;
        !           909:     UCHAR StepPlusePerCyclynder : 4;
        !           910:     UCHAR Reserved3 : 4;
        !           911:     UCHAR WriteCompenstation;
        !           912:     UCHAR HeadLoadDelay;
        !           913:     UCHAR HeadUnloadDelay;
        !           914:     UCHAR Pin2Usage : 4;
        !           915:     UCHAR Pin34Usage : 4;
        !           916:     UCHAR Pin1Usage : 4;
        !           917:     UCHAR Pin4Usage : 4;
        !           918:     UCHAR MediumRotationRate[2];
        !           919:     UCHAR Reserved4[2];
        !           920: }MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE;
        !           921: 
        !           922: //
        !           923: // Define mode format page.
        !           924: //
        !           925: 
        !           926: typedef struct _MODE_FORMAT_PAGE {
        !           927:     UCHAR PageCode : 6;
        !           928:     UCHAR Reserved : 1;
        !           929:     UCHAR PageSavable : 1;
        !           930:     UCHAR PageLength;
        !           931:     UCHAR TracksPerZone[2];
        !           932:     UCHAR AlternetSectorsPerZone[2];
        !           933:     UCHAR AlternetTracksPerZone[2];
        !           934:     UCHAR SectorsPerTrack[2];
        !           935:     UCHAR BytesPerPhysicalSector[2];
        !           936:     UCHAR Interleave[2];
        !           937:     UCHAR TrackSkewFactor[2];
        !           938:     UCHAR CylinderSkewFactor[2];
        !           939:     UCHAR Reserved2 : 4;
        !           940:     UCHAR SurfaceFirst : 1;
        !           941:     UCHAR RemovableMedia : 1;
        !           942:     UCHAR HardSectorFormating : 1;
        !           943:     UCHAR SoftSectorFormating : 1;
        !           944:     UCHAR Reserved3[2];
        !           945: }MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE;
        !           946: 
        !           947: //
        !           948: // Define rigid disk driver geometry page.
        !           949: //
        !           950: 
        !           951: typedef struct _MODE_RIGID_GEOMETRY_PAGE {
        !           952:     UCHAR PageCode : 6;
        !           953:     UCHAR Reserved : 1;
        !           954:     UCHAR PageSavable : 1;
        !           955:     UCHAR PageLength;
        !           956:     UCHAR NumberOfCylinders[2];
        !           957:     UCHAR NumberOfHeads;
        !           958:     UCHAR StartWritePrecom[2];
        !           959:     UCHAR StartReducedCurrent[2];
        !           960:     UCHAR DriveStepRate[2];
        !           961:     UCHAR LandZoneCyclinder[2];
        !           962:     UCHAR RotationalPositionLock : 2;
        !           963:     UCHAR Reserved2 : 6;
        !           964:     UCHAR RotationOffset;
        !           965:     UCHAR Reserved3;
        !           966:     UCHAR RoataionRate[2];
        !           967:     UCHAR Reserved4[2];
        !           968: }MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE;
        !           969: 
        !           970: //
        !           971: // Define read write recovery page
        !           972: //
        !           973: 
        !           974: typedef struct _MODE_READ_WRITE_RECOVERY_PAGE {
        !           975: 
        !           976:     UCHAR PageCode : 6;
        !           977:     UCHAR Reserved1 : 1;
        !           978:     UCHAR PSBit : 1;
        !           979:     UCHAR PageLength;
        !           980:     UCHAR DCRBit : 1;
        !           981:     UCHAR DTEBit : 1;
        !           982:     UCHAR PERBit : 1;
        !           983:     UCHAR EERBit : 1;
        !           984:     UCHAR Reserved2 : 1;
        !           985:     UCHAR TBBit : 1;
        !           986:     UCHAR Reserved3 : 2;
        !           987:     UCHAR ReadRetryCount;
        !           988:     UCHAR Reserved4[4];
        !           989:     UCHAR WriteRetryCount;
        !           990:     UCHAR Reserved5[3];
        !           991: 
        !           992: } MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE;
        !           993: 
        !           994: //
        !           995: // Mode parameter list block descriptor -
        !           996: // set the block length for reading/writing
        !           997: //
        !           998: //
        !           999: 
        !          1000: #define MODE_BLOCK_DESC_LENGTH               8
        !          1001: 
        !          1002: typedef struct _MODE_PARM_READ_WRITE {
        !          1003: 
        !          1004:    MODE_PARAMETER_HEADER  ParameterListHeader;  // List Header Format
        !          1005:    MODE_PARAMETER_BLOCK   ParameterListBlock;   // List Block Descriptor
        !          1006: 
        !          1007: } MODE_PARM_READ_WRITE_DATA, *PMODE_PARM_READ_WRITE_DATA;
        !          1008: 
        !          1009: //
        !          1010: // CDROM audio control (0x0E)
        !          1011: //
        !          1012: 
        !          1013: #define CDB_AUDIO_PAUSE 0
        !          1014: #define CDB_AUDIO_RESUME 1
        !          1015: 
        !          1016: #define CDB_DEVICE_START 0x11
        !          1017: #define CDB_DEVICE_STOP 0x10
        !          1018: 
        !          1019: #define CDB_EJECT_MEDIA 0x10
        !          1020: #define CDB_LOAD_MEDIA 0x01
        !          1021: 
        !          1022: #define CDB_SUBCHANNEL_HEADER      0x00
        !          1023: #define CDB_SUBCHANNEL_BLOCK       0x01
        !          1024: 
        !          1025: #define CDROM_AUDIO_CONTROL_PAGE   0x0E
        !          1026: #define MODE_SELECT_IMMEDIATE      0x04
        !          1027: #define MODE_SELECT_PFBIT          0x10
        !          1028: 
        !          1029: #define CDB_USE_MSF                0x01
        !          1030: 
        !          1031: typedef struct _PORT_OUTPUT {
        !          1032:     UCHAR ChannelSelection;
        !          1033:     UCHAR Volume;
        !          1034: } PORT_OUTPUT, *PPORT_OUTPUT;
        !          1035: 
        !          1036: typedef struct _AUDIO_OUTPUT {
        !          1037:     UCHAR CodePage;
        !          1038:     UCHAR ParameterLength;
        !          1039:     UCHAR Immediate;
        !          1040:     UCHAR Reserved[2];
        !          1041:     UCHAR LbaFormat;
        !          1042:     UCHAR LogicalBlocksPerSecond[2];
        !          1043:     PORT_OUTPUT PortOutput[4];
        !          1044: } AUDIO_OUTPUT, *PAUDIO_OUTPUT;
        !          1045: 
        !          1046: //
        !          1047: // Multisession CDROM
        !          1048: //
        !          1049: 
        !          1050: #define GET_LAST_SESSION 0x01
        !          1051: #define GET_SESSION_DATA 0x02;
        !          1052: 
        !          1053: //
        !          1054: // Tape definitions
        !          1055: //
        !          1056: 
        !          1057: typedef struct _TAPE_POSITION_DATA {
        !          1058:     UCHAR Reserved1:2;
        !          1059:     UCHAR BlockPositionUnsupported:1;
        !          1060:     UCHAR Reserved2:3;
        !          1061:     UCHAR EndOfPartition:1;
        !          1062:     UCHAR BeginningOfPartition:1;
        !          1063:     UCHAR PartitionNumber;
        !          1064:     USHORT Reserved3;
        !          1065:     UCHAR FirstBlock[4];
        !          1066:     UCHAR LastBlock[4];
        !          1067:     UCHAR Reserved4;
        !          1068:     UCHAR NumberOfBlocks[3];
        !          1069:     UCHAR NumberOfBytes[4];
        !          1070: } TAPE_POSITION_DATA, *PTAPE_POSITION_DATA;
        !          1071: 
        !          1072: //
        !          1073: // Byte reversing macro for converting
        !          1074: // between big- and little-endian formats
        !          1075: //
        !          1076: 
        !          1077: #define REVERSE_BYTES(Destination, Source) {                \
        !          1078:     (Destination)->Byte3 = (Source)->Byte0;                 \
        !          1079:     (Destination)->Byte2 = (Source)->Byte1;                 \
        !          1080:     (Destination)->Byte1 = (Source)->Byte2;                 \
        !          1081:     (Destination)->Byte0 = (Source)->Byte3;                 \
        !          1082: }
        !          1083: 
        !          1084: //
        !          1085: // This structure is used to convert little endian
        !          1086: // ULONGs to SCSI CDB 4 byte big endians values.
        !          1087: //
        !          1088: 
        !          1089: typedef struct _FOUR_BYTE {
        !          1090:     UCHAR Byte0;
        !          1091:     UCHAR Byte1;
        !          1092:     UCHAR Byte2;
        !          1093:     UCHAR Byte3;
        !          1094: } FOUR_BYTE, *PFOUR_BYTE;
        !          1095: 
        !          1096: //
        !          1097: // This macro has the effect of Bit = log2(Data)
        !          1098: //
        !          1099: 
        !          1100: #define WHICH_BIT(Data, Bit) {                      \
        !          1101:     for (Bit = 0; Bit < 32; Bit++) {                \
        !          1102:         if ((Data >> Bit) == 1) {                   \
        !          1103:             break;                                  \
        !          1104:         }                                           \
        !          1105:     }                                               \
        !          1106: }
        !          1107: 
        !          1108: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.