diff -r 000000000000 -r 76b1f169d9fe mingw-5.1.4/win32/include/ddk/scsi.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mingw-5.1.4/win32/include/ddk/scsi.h Fri Apr 03 17:16:45 2009 +0100 @@ -0,0 +1,1694 @@ +/* + * scsi.h + * + * SCSI port and class interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#ifndef __SCSI_H +#define __SCSI_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ntddk.h" + +typedef union _CDB { + struct _CDB6GENERIC { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR CommandUniqueBits : 4; + UCHAR LogicalUnitNumber : 3; + UCHAR CommandUniqueBytes[3]; + UCHAR Link : 1; + UCHAR Flag : 1; + UCHAR Reserved : 4; + UCHAR VendorUnique : 2; + } CDB6GENERIC, *PCDB6GENERIC; + + struct _CDB6READWRITE { + UCHAR OperationCode; + UCHAR LogicalBlockMsb1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR LogicalBlockMsb0; + UCHAR LogicalBlockLsb; + UCHAR TransferBlocks; + UCHAR Control; + } CDB6READWRITE, *PCDB6READWRITE; + + struct _CDB6INQUIRY { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR PageCode; + UCHAR IReserved; + UCHAR AllocationLength; + UCHAR Control; + } CDB6INQUIRY, *PCDB6INQUIRY; + + struct _CDB6INQUIRY3 { + UCHAR OperationCode; + UCHAR EnableVitalProductData : 1; + UCHAR CommandSupportData : 1; + UCHAR Reserved1 : 6; + UCHAR PageCode; + UCHAR Reserved2; + UCHAR AllocationLength; + UCHAR Control; + } CDB6INQUIRY3, *PCDB6INQUIRY3; + + struct _CDB6VERIFY { + UCHAR OperationCode; + UCHAR Fixed : 1; + UCHAR ByteCompare : 1; + UCHAR Immediate : 1; + UCHAR Reserved : 2; + UCHAR LogicalUnitNumber : 3; + UCHAR VerificationLength[3]; + UCHAR Control; + } CDB6VERIFY, *PCDB6VERIFY; + + struct _CDB6FORMAT { + UCHAR OperationCode; + UCHAR FormatControl : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR FReserved1; + UCHAR InterleaveMsb; + UCHAR InterleaveLsb; + UCHAR FReserved2; + } CDB6FORMAT, *PCDB6FORMAT; + + struct _CDB10 { + UCHAR OperationCode; + UCHAR RelativeAddress : 1; + UCHAR Reserved1 : 2; + UCHAR ForceUnitAccess : 1; + UCHAR DisablePageOut : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR LogicalBlockByte0; + UCHAR LogicalBlockByte1; + UCHAR LogicalBlockByte2; + UCHAR LogicalBlockByte3; + UCHAR Reserved2; + UCHAR TransferBlocksMsb; + UCHAR TransferBlocksLsb; + UCHAR Control; + } CDB10, *PCDB10; + + struct _CDB12 { + UCHAR OperationCode; + UCHAR RelativeAddress : 1; + UCHAR Reserved1 : 2; + UCHAR ForceUnitAccess : 1; + UCHAR DisablePageOut : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR LogicalBlock[4]; + UCHAR TransferLength[4]; + UCHAR Reserved2; + UCHAR Control; + } CDB12, *PCDB12; + + struct _PAUSE_RESUME { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2[6]; + UCHAR Action; + UCHAR Control; + } PAUSE_RESUME, *PPAUSE_RESUME; + + struct _READ_TOC { + UCHAR OperationCode; + UCHAR Reserved0 : 1; + UCHAR Msf : 1; + UCHAR Reserved1 : 3; + UCHAR LogicalUnitNumber : 3; + UCHAR Format2 : 4; + UCHAR Reserved2 : 4; + UCHAR Reserved3[3]; + UCHAR StartingTrack; + UCHAR AllocationLength[2]; + UCHAR Control : 6; + UCHAR Format : 2; + } READ_TOC, *PREAD_TOC; + + struct _READ_DISK_INFORMATION { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR Reserved2[5]; + UCHAR AllocationLength[2]; + UCHAR Control; + } READ_DISK_INFORMATION, *PREAD_DISK_INFORMATION; + + struct _READ_TRACK_INFORMATION { + UCHAR OperationCode; + UCHAR Track : 1; + UCHAR Reserved1 : 3; + UCHAR Reserved2 : 1; + UCHAR Lun : 3; + UCHAR BlockAddress[4]; + UCHAR Reserved3; + UCHAR AllocationLength[2]; + UCHAR Control; + } READ_TRACK_INFORMATION, *PREAD_TRACK_INFORMATION; + + struct _RESERVE_TRACK_RZONE { + UCHAR OperationCode; + UCHAR Reserved1[4]; + UCHAR ReservationSize[4]; + UCHAR Control; + } RESERVE_TRACK_RZONE, *PRESERVE_TRACK_RZONE; + + struct _SEND_OPC_INFORMATION { + UCHAR OperationCode; + UCHAR DoOpc : 1; + UCHAR Reserved : 7; + UCHAR Reserved1[5]; + UCHAR ParameterListLength[2]; + UCHAR Reserved2; + } SEND_OPC_INFORMATION, *PSEND_OPC_INFORMATION; + + struct _CLOSE_TRACK { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR Reserved1 : 7; + UCHAR Track : 1; + UCHAR Session : 1; + UCHAR Reserved2 : 6; + UCHAR Reserved3; + UCHAR TrackNumber[2]; + UCHAR Reserved4[3]; + UCHAR Control; + } CLOSE_TRACK, *PCLOSE_TRACK; + + struct _SEND_CUE_SHEET { + UCHAR OperationCode; + UCHAR Reserved[5]; + UCHAR CueSheetSize[3]; + UCHAR Control; + } SEND_CUE_SHEET, *PSEND_CUE_SHEET; + + struct _READ_HEADER { + UCHAR OperationCode; + UCHAR Reserved1 : 1; + UCHAR Msf : 1; + UCHAR Reserved2 : 3; + UCHAR Lun : 3; + UCHAR LogicalBlockAddress[4]; + UCHAR Reserved3; + UCHAR AllocationLength[2]; + UCHAR Control; + } READ_HEADER, *PREAD_HEADER; + + struct _PLAY_AUDIO { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR StartingBlockAddress[4]; + UCHAR Reserved2; + UCHAR PlayLength[2]; + UCHAR Control; + } PLAY_AUDIO, *PPLAY_AUDIO; + + struct _PLAY_AUDIO_MSF { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2; + UCHAR StartingM; + UCHAR StartingS; + UCHAR StartingF; + UCHAR EndingM; + UCHAR EndingS; + UCHAR EndingF; + UCHAR Control; + } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF; + +/* FIXME: Should the union be anonymous in C++ too? If so, + can't define named types _LBA and _MSF within anonymous union + for C++. */ + struct _PLAY_CD { + UCHAR OperationCode; + UCHAR Reserved1 : 1; + UCHAR CMSF : 1; + UCHAR ExpectedSectorType : 3; + UCHAR Lun : 3; +#ifndef __cplusplus + _ANONYMOUS_UNION +#endif + union { + struct _LBA { + UCHAR StartingBlockAddress[4]; + UCHAR PlayLength[4]; + } LBA; + + struct _MSF { + UCHAR Reserved1; + UCHAR StartingM; + UCHAR StartingS; + UCHAR StartingF; + UCHAR EndingM; + UCHAR EndingS; + UCHAR EndingF; + UCHAR Reserved2; + } MSF; + #ifndef __cplusplus + }DUMMYUNIONNAME; + #else + }u; + #endif + + UCHAR Audio : 1; + UCHAR Composite : 1; + UCHAR Port1 : 1; + UCHAR Port2 : 1; + UCHAR Reserved2 : 3; + UCHAR Speed : 1; + UCHAR Control; + } PLAY_CD, *PPLAY_CD; + + struct _SCAN_CD { + UCHAR OperationCode; + UCHAR RelativeAddress : 1; + UCHAR Reserved1 : 3; + UCHAR Direct : 1; + UCHAR Lun : 3; + UCHAR StartingAddress[4]; + UCHAR Reserved2[3]; + UCHAR Reserved3 : 6; + UCHAR Type : 2; + UCHAR Reserved4; + UCHAR Control; + } SCAN_CD, *PSCAN_CD; + + struct _STOP_PLAY_SCAN { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR Reserved2[7]; + UCHAR Control; + } STOP_PLAY_SCAN, *PSTOP_PLAY_SCAN; + + struct _SUBCHANNEL { + UCHAR OperationCode; + UCHAR Reserved0 : 1; + UCHAR Msf : 1; + UCHAR Reserved1 : 3; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2 : 6; + UCHAR SubQ : 1; + UCHAR Reserved3 : 1; + UCHAR Format; + UCHAR Reserved4[2]; + UCHAR TrackNumber; + UCHAR AllocationLength[2]; + UCHAR Control; + } SUBCHANNEL, *PSUBCHANNEL; + + struct _READ_CD { + UCHAR OperationCode; + UCHAR RelativeAddress : 1; + UCHAR Reserved0 : 1; + UCHAR ExpectedSectorType : 3; + UCHAR Lun : 3; + UCHAR StartingLBA[4]; + UCHAR TransferBlocks[3]; + UCHAR Reserved2 : 1; + UCHAR ErrorFlags : 2; + UCHAR IncludeEDC : 1; + UCHAR IncludeUserData : 1; + UCHAR HeaderCode : 2; + UCHAR IncludeSyncData : 1; + UCHAR SubChannelSelection : 3; + UCHAR Reserved3 : 5; + UCHAR Control; + } READ_CD, *PREAD_CD; + + struct _READ_CD_MSF { + UCHAR OperationCode; + UCHAR RelativeAddress : 1; + UCHAR Reserved1 : 1; + UCHAR ExpectedSectorType : 3; + UCHAR Lun : 3; + UCHAR Reserved2; + UCHAR StartingM; + UCHAR StartingS; + UCHAR StartingF; + UCHAR EndingM; + UCHAR EndingS; + UCHAR EndingF; + UCHAR Reserved3; + UCHAR Reserved4 : 1; + UCHAR ErrorFlags : 2; + UCHAR IncludeEDC : 1; + UCHAR IncludeUserData : 1; + UCHAR HeaderCode : 2; + UCHAR IncludeSyncData : 1; + UCHAR SubChannelSelection : 3; + UCHAR Reserved5 : 5; + UCHAR Control; + } READ_CD_MSF, *PREAD_CD_MSF; + + struct _PLXTR_READ_CDDA { + UCHAR OperationCode; + UCHAR Reserved0 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR LogicalBlockByte0; + UCHAR LogicalBlockByte1; + UCHAR LogicalBlockByte2; + UCHAR LogicalBlockByte3; + UCHAR TransferBlockByte0; + UCHAR TransferBlockByte1; + UCHAR TransferBlockByte2; + UCHAR TransferBlockByte3; + UCHAR SubCode; + UCHAR Control; + } PLXTR_READ_CDDA, *PPLXTR_READ_CDDA; + + struct _NEC_READ_CDDA { + UCHAR OperationCode; + UCHAR Reserved0; + UCHAR LogicalBlockByte0; + UCHAR LogicalBlockByte1; + UCHAR LogicalBlockByte2; + UCHAR LogicalBlockByte3; + UCHAR Reserved1; + UCHAR TransferBlockByte0; + UCHAR TransferBlockByte1; + UCHAR Control; + } NEC_READ_CDDA, *PNEC_READ_CDDA; + + struct _MODE_SENSE { + UCHAR OperationCode; + UCHAR Reserved1 : 3; + UCHAR Dbd : 1; + UCHAR Reserved2 : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR PageCode : 6; + UCHAR Pc : 2; + UCHAR Reserved3; + UCHAR AllocationLength; + UCHAR Control; + } MODE_SENSE, *PMODE_SENSE; + + struct _MODE_SENSE10 { + UCHAR OperationCode; + UCHAR Reserved1 : 3; + UCHAR Dbd : 1; + UCHAR Reserved2 : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR PageCode : 6; + UCHAR Pc : 2; + UCHAR Reserved3[4]; + UCHAR AllocationLength[2]; + UCHAR Control; + } MODE_SENSE10, *PMODE_SENSE10; + + struct _MODE_SELECT { + UCHAR OperationCode; + UCHAR SPBit : 1; + UCHAR Reserved1 : 3; + UCHAR PFBit : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2[2]; + UCHAR ParameterListLength; + UCHAR Control; + } MODE_SELECT, *PMODE_SELECT; + + struct _MODE_SELECT10 { + UCHAR OperationCode; + UCHAR SPBit : 1; + UCHAR Reserved1 : 3; + UCHAR PFBit : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2[5]; + UCHAR ParameterListLength[2]; + UCHAR Control; + } MODE_SELECT10, *PMODE_SELECT10; + + struct _LOCATE { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR CPBit : 1; + UCHAR BTBit : 1; + UCHAR Reserved1 : 2; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved3; + UCHAR LogicalBlockAddress[4]; + UCHAR Reserved4; + UCHAR Partition; + UCHAR Control; + } LOCATE, *PLOCATE; + + struct _LOGSENSE { + UCHAR OperationCode; + UCHAR SPBit : 1; + UCHAR PPCBit : 1; + UCHAR Reserved1 : 3; + UCHAR LogicalUnitNumber : 3; + UCHAR PageCode : 6; + UCHAR PCBit : 2; + UCHAR Reserved2; + UCHAR Reserved3; + UCHAR ParameterPointer[2]; + UCHAR AllocationLength[2]; + UCHAR Control; + } LOGSENSE, *PLOGSENSE; + + struct _LOGSELECT { + UCHAR OperationCode; + UCHAR SPBit : 1; + UCHAR PCRBit : 1; + UCHAR Reserved1 : 3; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved : 6; + UCHAR PCBit : 2; + UCHAR Reserved2[4]; + UCHAR ParameterListLength[2]; + UCHAR Control; + } LOGSELECT, *PLOGSELECT; + + struct _PRINT { + UCHAR OperationCode; + UCHAR Reserved : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR TransferLength[3]; + UCHAR Control; + } PRINT, *PPRINT; + + struct _SEEK { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR LogicalBlockAddress[4]; + UCHAR Reserved2[3]; + UCHAR Control; + } SEEK, *PSEEK; + + struct _ERASE { + UCHAR OperationCode; + UCHAR Long : 1; + UCHAR Immediate : 1; + UCHAR Reserved1 : 3; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2[3]; + UCHAR Control; + } ERASE, *PERASE; + + struct _START_STOP { + UCHAR OperationCode; + UCHAR Immediate: 1; + UCHAR Reserved1 : 4; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2[2]; + UCHAR Start : 1; + UCHAR LoadEject : 1; + UCHAR Reserved3 : 6; + UCHAR Control; + } START_STOP, *PSTART_STOP; + + struct _MEDIA_REMOVAL { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR Reserved2[2]; + + UCHAR Prevent : 1; + UCHAR Persistant : 1; + UCHAR Reserved3 : 6; + + UCHAR Control; + } MEDIA_REMOVAL, *PMEDIA_REMOVAL; + + struct _SEEK_BLOCK { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR Reserved1 : 7; + UCHAR BlockAddress[3]; + UCHAR Link : 1; + UCHAR Flag : 1; + UCHAR Reserved2 : 4; + UCHAR VendorUnique : 2; + } SEEK_BLOCK, *PSEEK_BLOCK; + + struct _REQUEST_BLOCK_ADDRESS { + UCHAR OperationCode; + UCHAR Reserved1[3]; + UCHAR AllocationLength; + UCHAR Link : 1; + UCHAR Flag : 1; + UCHAR Reserved2 : 4; + UCHAR VendorUnique : 2; + } REQUEST_BLOCK_ADDRESS, *PREQUEST_BLOCK_ADDRESS; + + struct _PARTITION { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR Sel: 1; + UCHAR PartitionSelect : 6; + UCHAR Reserved1[3]; + UCHAR Control; + } PARTITION, *PPARTITION; + + struct _WRITE_TAPE_MARKS { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR WriteSetMarks: 1; + UCHAR Reserved : 3; + UCHAR LogicalUnitNumber : 3; + UCHAR TransferLength[3]; + UCHAR Control; + } WRITE_TAPE_MARKS, *PWRITE_TAPE_MARKS; + + struct _SPACE_TAPE_MARKS { + UCHAR OperationCode; + UCHAR Code : 3; + UCHAR Reserved : 2; + UCHAR LogicalUnitNumber : 3; + UCHAR NumMarksMSB ; + UCHAR NumMarks; + UCHAR NumMarksLSB; + union { + UCHAR value; + struct { + UCHAR Link : 1; + UCHAR Flag : 1; + UCHAR Reserved : 4; + UCHAR VendorUnique : 2; + } Fields; + } Byte6; + } SPACE_TAPE_MARKS, *PSPACE_TAPE_MARKS; + + struct _READ_POSITION { + UCHAR Operation; + UCHAR BlockType : 1; + UCHAR Reserved1 : 4; + UCHAR Lun : 3; + UCHAR Reserved2[7]; + UCHAR Control; + } READ_POSITION, *PREAD_POSITION; + + struct _CDB6READWRITETAPE { + UCHAR OperationCode; + UCHAR VendorSpecific : 5; + UCHAR Reserved : 3; + UCHAR TransferLenMSB; + UCHAR TransferLen; + UCHAR TransferLenLSB; + UCHAR Link : 1; + UCHAR Flag : 1; + UCHAR Reserved1 : 4; + UCHAR VendorUnique : 2; + } CDB6READWRITETAPE, *PCDB6READWRITETAPE; + + struct _INIT_ELEMENT_STATUS { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNubmer : 3; + UCHAR Reserved2[3]; + UCHAR Reserved3 : 7; + UCHAR NoBarCode : 1; + } INIT_ELEMENT_STATUS, *PINIT_ELEMENT_STATUS; + + struct _INITIALIZE_ELEMENT_RANGE { + UCHAR OperationCode; + UCHAR Range : 1; + UCHAR Reserved1 : 4; + UCHAR LogicalUnitNubmer : 3; + UCHAR FirstElementAddress[2]; + UCHAR Reserved2[2]; + UCHAR NumberOfElements[2]; + UCHAR Reserved3; + UCHAR Reserved4 : 7; + UCHAR NoBarCode : 1; + } INITIALIZE_ELEMENT_RANGE, *PINITIALIZE_ELEMENT_RANGE; + + struct _POSITION_TO_ELEMENT { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR TransportElementAddress[2]; + UCHAR DestinationElementAddress[2]; + UCHAR Reserved2[2]; + UCHAR Flip : 1; + UCHAR Reserved3 : 7; + UCHAR Control; + } POSITION_TO_ELEMENT, *PPOSITION_TO_ELEMENT; + + struct _MOVE_MEDIUM { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR TransportElementAddress[2]; + UCHAR SourceElementAddress[2]; + UCHAR DestinationElementAddress[2]; + UCHAR Reserved2[2]; + UCHAR Flip : 1; + UCHAR Reserved3 : 7; + UCHAR Control; + } MOVE_MEDIUM, *PMOVE_MEDIUM; + + struct _EXCHANGE_MEDIUM { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR LogicalUnitNumber : 3; + UCHAR TransportElementAddress[2]; + UCHAR SourceElementAddress[2]; + UCHAR Destination1ElementAddress[2]; + UCHAR Destination2ElementAddress[2]; + UCHAR Flip1 : 1; + UCHAR Flip2 : 1; + UCHAR Reserved3 : 6; + UCHAR Control; + } EXCHANGE_MEDIUM, *PEXCHANGE_MEDIUM; + + struct _READ_ELEMENT_STATUS { + UCHAR OperationCode; + UCHAR ElementType : 4; + UCHAR VolTag : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR StartingElementAddress[2]; + UCHAR NumberOfElements[2]; + UCHAR Reserved1; + UCHAR AllocationLength[3]; + UCHAR Reserved2; + UCHAR Control; + } READ_ELEMENT_STATUS, *PREAD_ELEMENT_STATUS; + + struct _SEND_VOLUME_TAG { + UCHAR OperationCode; + UCHAR ElementType : 4; + UCHAR Reserved1 : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR StartingElementAddress[2]; + UCHAR Reserved2; + UCHAR ActionCode : 5; + UCHAR Reserved3 : 3; + UCHAR Reserved4[2]; + UCHAR ParameterListLength[2]; + UCHAR Reserved5; + UCHAR Control; + } SEND_VOLUME_TAG, *PSEND_VOLUME_TAG; + + struct _REQUEST_VOLUME_ELEMENT_ADDRESS { + UCHAR OperationCode; + UCHAR ElementType : 4; + UCHAR VolTag : 1; + UCHAR LogicalUnitNumber : 3; + UCHAR StartingElementAddress[2]; + UCHAR NumberElements[2]; + UCHAR Reserved1; + UCHAR AllocationLength[3]; + UCHAR Reserved2; + UCHAR Control; + } REQUEST_VOLUME_ELEMENT_ADDRESS, *PREQUEST_VOLUME_ELEMENT_ADDRESS; + + struct _LOAD_UNLOAD { + UCHAR OperationCode; + UCHAR Immediate : 1; + UCHAR Reserved1 : 4; + UCHAR Lun : 3; + UCHAR Reserved2[2]; + UCHAR Start : 1; + UCHAR LoadEject : 1; + UCHAR Reserved3: 6; + UCHAR Reserved4[3]; + UCHAR Slot; + UCHAR Reserved5[3]; + } LOAD_UNLOAD, *PLOAD_UNLOAD; + + struct _MECH_STATUS { + UCHAR OperationCode; + UCHAR Reserved : 5; + UCHAR Lun : 3; + UCHAR Reserved1[6]; + UCHAR AllocationLength[2]; + UCHAR Reserved2[1]; + UCHAR Control; + } MECH_STATUS, *PMECH_STATUS; + + struct _SYNCHRONIZE_CACHE10 { + + UCHAR OperationCode; + + UCHAR RelAddr : 1; + UCHAR Immediate : 1; + UCHAR Reserved : 3; + UCHAR Lun : 3; + + UCHAR LogicalBlockAddress[4]; + UCHAR Reserved2; + UCHAR BlockCount[2]; + UCHAR Control; + } SYNCHRONIZE_CACHE10, *PSYNCHRONIZE_CACHE10; + + struct _GET_EVENT_STATUS_NOTIFICATION { + UCHAR OperationCode; + + UCHAR Immediate : 1; + UCHAR Reserved : 4; + UCHAR Lun : 3; + + UCHAR Reserved2[2]; + UCHAR NotificationClassRequest; + UCHAR Reserved3[2]; + UCHAR EventListLength[2]; + + UCHAR Control; + } GET_EVENT_STATUS_NOTIFICATION, *PGET_EVENT_STATUS_NOTIFICATION; + + struct _READ_DVD_STRUCTURE { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR RMDBlockNumber[4]; + UCHAR LayerNumber; + UCHAR Format; + UCHAR AllocationLength[2]; + UCHAR Reserved3 : 6; + UCHAR AGID : 2; + UCHAR Control; + } READ_DVD_STRUCTURE, *PREAD_DVD_STRUCTURE; + + struct _SEND_DVD_STRUCTURE { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR Reserved2[5]; + UCHAR Format; + UCHAR ParameterListLength[2]; + UCHAR Reserved3; + UCHAR Control; + } SEND_DVD_STRUCTURE, *PSEND_DVD_STRUCTURE; + + struct _SEND_KEY { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR Reserved2[6]; + UCHAR ParameterListLength[2]; + UCHAR KeyFormat : 6; + UCHAR AGID : 2; + UCHAR Control; + } SEND_KEY, *PSEND_KEY; + + struct _REPORT_KEY { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR LogicalBlockAddress[4]; + UCHAR Reserved2[2]; + UCHAR AllocationLength[2]; + UCHAR KeyFormat : 6; + UCHAR AGID : 2; + UCHAR Control; + } REPORT_KEY, *PREPORT_KEY; + + struct _SET_READ_AHEAD { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR TriggerLBA[4]; + UCHAR ReadAheadLBA[4]; + UCHAR Reserved2; + UCHAR Control; + } SET_READ_AHEAD, *PSET_READ_AHEAD; + + struct _READ_FORMATTED_CAPACITIES { + UCHAR OperationCode; + UCHAR Reserved1 : 5; + UCHAR Lun : 3; + UCHAR Reserved2[5]; + UCHAR AllocationLength[2]; + UCHAR Control; + } READ_FORMATTED_CAPACITIES, *PREAD_FORMATTED_CAPACITIES; + + struct _REPORT_LUNS { + UCHAR OperationCode; + UCHAR Reserved1[5]; + UCHAR AllocationLength[4]; + UCHAR Reserved2[1]; + UCHAR Control; + } REPORT_LUNS, *PREPORT_LUNS; + + struct _PERSISTENT_RESERVE_IN { + UCHAR OperationCode; + UCHAR ServiceAction : 5; + UCHAR Reserved1 : 3; + UCHAR Reserved2[5]; + UCHAR AllocationLength[2]; + UCHAR Control; + } PERSISTENT_RESERVE_IN, *PPERSISTENT_RESERVE_IN; + + struct _PERSISTENT_RESERVE_OUT { + UCHAR OperationCode; + UCHAR ServiceAction : 5; + UCHAR Reserved1 : 3; + UCHAR Type : 4; + UCHAR Scope : 4; + UCHAR Reserved2[4]; + UCHAR ParameterListLength[2]; + UCHAR Control; + } PERSISTENT_RESERVE_OUT, *PPERSISTENT_RESERVE_OUT; + + struct _GET_CONFIGURATION { + UCHAR OperationCode; + UCHAR RequestType : 1; + UCHAR Reserved1 : 7; + UCHAR StartingFeature[2]; + UCHAR Reserved2[3]; + UCHAR AllocationLength[2]; + UCHAR Control; + } GET_CONFIGURATION, *PGET_CONFIGURATION; + + struct _SET_CD_SPEED { + UCHAR OperationCode; + UCHAR Reserved1; + UCHAR ReadSpeed[2]; + UCHAR WriteSpeed[2]; + UCHAR Reserved2[5]; + UCHAR Control; + } SET_CD_SPEED, *PSET_CD_SPEED; + + ULONG AsUlong[4]; + UCHAR AsByte[16]; +} CDB, *PCDB; + +#ifndef _INQUIRYDATA_DEFINED /* also in minitape.h */ +#define _INQUIRYDATA_DEFINED + +#define INQUIRYDATABUFFERSIZE 36 + +typedef struct _INQUIRYDATA { + UCHAR DeviceType : 5; + UCHAR DeviceTypeQualifier : 3; + UCHAR DeviceTypeModifier : 7; + UCHAR RemovableMedia : 1; + _ANONYMOUS_UNION union { + UCHAR Versions; + _ANONYMOUS_STRUCT struct { + UCHAR ANSIVersion : 3; + UCHAR ECMAVersion : 3; + UCHAR ISOVersion : 2; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + UCHAR ResponseDataFormat : 4; + UCHAR HiSupport : 1; + UCHAR NormACA : 1; + UCHAR TerminateTask : 1; + UCHAR AERC : 1; + UCHAR AdditionalLength; + UCHAR Reserved; + UCHAR Addr16 : 1; + UCHAR Addr32 : 1; + UCHAR AckReqQ: 1; + UCHAR MediumChanger : 1; + UCHAR MultiPort : 1; + UCHAR ReservedBit2 : 1; + UCHAR EnclosureServices : 1; + UCHAR ReservedBit3 : 1; + UCHAR SoftReset : 1; + UCHAR CommandQueue : 1; + UCHAR TransferDisable : 1; + UCHAR LinkedCommands : 1; + UCHAR Synchronous : 1; + UCHAR Wide16Bit : 1; + UCHAR Wide32Bit : 1; + UCHAR RelativeAddressing : 1; + UCHAR VendorId[8]; + UCHAR ProductId[16]; + UCHAR ProductRevisionLevel[4]; + UCHAR VendorSpecific[20]; + UCHAR Reserved3[40]; +} INQUIRYDATA, *PINQUIRYDATA; +#endif + +/* INQUIRYDATA.DeviceType constants */ +#define DIRECT_ACCESS_DEVICE 0x00 +#define SEQUENTIAL_ACCESS_DEVICE 0x01 +#define PRINTER_DEVICE 0x02 +#define PROCESSOR_DEVICE 0x03 +#define WRITE_ONCE_READ_MULTIPLE_DEVICE 0x04 +#define READ_ONLY_DIRECT_ACCESS_DEVICE 0x05 +#define SCANNER_DEVICE 0x06 +#define OPTICAL_DEVICE 0x07 +#define MEDIUM_CHANGER 0x08 +#define COMMUNICATION_DEVICE 0x09 +#define LOGICAL_UNIT_NOT_PRESENT_DEVICE 0x7F +#define DEVICE_QUALIFIER_NOT_SUPPORTED 0x03 + +/* INQUIRYDATA.DeviceTypeQualifier constants */ +#define DEVICE_CONNECTED 0x00 + +#define SCSISTAT_GOOD 0x00 +#define SCSISTAT_CHECK_CONDITION 0x02 +#define SCSISTAT_CONDITION_MET 0x04 +#define SCSISTAT_BUSY 0x08 +#define SCSISTAT_INTERMEDIATE 0x10 +#define SCSISTAT_INTERMEDIATE_COND_MET 0x14 +#define SCSISTAT_RESERVATION_CONFLICT 0x18 +#define SCSISTAT_COMMAND_TERMINATED 0x22 +#define SCSISTAT_QUEUE_FULL 0x28 + +/* Mode Sense/Select page constants */ +#define MODE_PAGE_ERROR_RECOVERY 0x01 +#define MODE_PAGE_DISCONNECT 0x02 +#define MODE_PAGE_FORMAT_DEVICE 0x03 +#define MODE_PAGE_RIGID_GEOMETRY 0x04 +#define MODE_PAGE_FLEXIBILE 0x05 +#define MODE_PAGE_WRITE_PARAMETERS 0x05 +#define MODE_PAGE_VERIFY_ERROR 0x07 +#define MODE_PAGE_CACHING 0x08 +#define MODE_PAGE_PERIPHERAL 0x09 +#define MODE_PAGE_CONTROL 0x0A +#define MODE_PAGE_MEDIUM_TYPES 0x0B +#define MODE_PAGE_NOTCH_PARTITION 0x0C +#define MODE_PAGE_CD_AUDIO_CONTROL 0x0E +#define MODE_PAGE_DATA_COMPRESS 0x0F +#define MODE_PAGE_DEVICE_CONFIG 0x10 +#define MODE_PAGE_MEDIUM_PARTITION 0x11 +#define MODE_PAGE_CDVD_FEATURE_SET 0x18 +#define MODE_PAGE_POWER_CONDITION 0x1A +#define MODE_PAGE_FAULT_REPORTING 0x1C +#define MODE_PAGE_CDVD_INACTIVITY 0x1D +#define MODE_PAGE_ELEMENT_ADDRESS 0x1D +#define MODE_PAGE_TRANSPORT_GEOMETRY 0x1E +#define MODE_PAGE_DEVICE_CAPABILITIES 0x1F +#define MODE_PAGE_CAPABILITIES 0x2A +#define MODE_SENSE_RETURN_ALL 0x3f +#define MODE_SENSE_CURRENT_VALUES 0x00 +#define MODE_SENSE_CHANGEABLE_VALUES 0x40 +#define MODE_SENSE_DEFAULT_VAULES 0x80 +#define MODE_SENSE_SAVED_VALUES 0xc0 + +/* SCSI CDB operation codes */ +#define SCSIOP_TEST_UNIT_READY 0x00 +#define SCSIOP_REZERO_UNIT 0x01 +#define SCSIOP_REWIND 0x01 +#define SCSIOP_REQUEST_BLOCK_ADDR 0x02 +#define SCSIOP_REQUEST_SENSE 0x03 +#define SCSIOP_FORMAT_UNIT 0x04 +#define SCSIOP_READ_BLOCK_LIMITS 0x05 +#define SCSIOP_REASSIGN_BLOCKS 0x07 +#define SCSIOP_INIT_ELEMENT_STATUS 0x07 +#define SCSIOP_READ6 0x08 +#define SCSIOP_RECEIVE 0x08 +#define SCSIOP_WRITE6 0x0A +#define SCSIOP_PRINT 0x0A +#define SCSIOP_SEND 0x0A +#define SCSIOP_SEEK6 0x0B +#define SCSIOP_TRACK_SELECT 0x0B +#define SCSIOP_SLEW_PRINT 0x0B +#define SCSIOP_SEEK_BLOCK 0x0C +#define SCSIOP_PARTITION 0x0D +#define SCSIOP_READ_REVERSE 0x0F +#define SCSIOP_WRITE_FILEMARKS 0x10 +#define SCSIOP_FLUSH_BUFFER 0x10 +#define SCSIOP_SPACE 0x11 +#define SCSIOP_INQUIRY 0x12 +#define SCSIOP_VERIFY6 0x13 +#define SCSIOP_RECOVER_BUF_DATA 0x14 +#define SCSIOP_MODE_SELECT 0x15 +#define SCSIOP_RESERVE_UNIT 0x16 +#define SCSIOP_RELEASE_UNIT 0x17 +#define SCSIOP_COPY 0x18 +#define SCSIOP_ERASE 0x19 +#define SCSIOP_MODE_SENSE 0x1A +#define SCSIOP_START_STOP_UNIT 0x1B +#define SCSIOP_STOP_PRINT 0x1B +#define SCSIOP_LOAD_UNLOAD 0x1B +#define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C +#define SCSIOP_SEND_DIAGNOSTIC 0x1D +#define SCSIOP_MEDIUM_REMOVAL 0x1E + +#define SCSIOP_READ_FORMATTED_CAPACITY 0x23 +#define SCSIOP_READ_CAPACITY 0x25 +#define SCSIOP_READ 0x28 +#define SCSIOP_WRITE 0x2A +#define SCSIOP_SEEK 0x2B +#define SCSIOP_LOCATE 0x2B +#define SCSIOP_POSITION_TO_ELEMENT 0x2B +#define SCSIOP_WRITE_VERIFY 0x2E +#define SCSIOP_VERIFY 0x2F +#define SCSIOP_SEARCH_DATA_HIGH 0x30 +#define SCSIOP_SEARCH_DATA_EQUAL 0x31 +#define SCSIOP_SEARCH_DATA_LOW 0x32 +#define SCSIOP_SET_LIMITS 0x33 +#define SCSIOP_READ_POSITION 0x34 +#define SCSIOP_SYNCHRONIZE_CACHE 0x35 +#define SCSIOP_COMPARE 0x39 +#define SCSIOP_COPY_COMPARE 0x3A +#define SCSIOP_WRITE_DATA_BUFF 0x3B +#define SCSIOP_READ_DATA_BUFF 0x3C +#define SCSIOP_CHANGE_DEFINITION 0x40 +#define SCSIOP_READ_SUB_CHANNEL 0x42 +#define SCSIOP_READ_TOC 0x43 +#define SCSIOP_READ_HEADER 0x44 +#define SCSIOP_PLAY_AUDIO 0x45 +#define SCSIOP_GET_CONFIGURATION 0x46 +#define SCSIOP_PLAY_AUDIO_MSF 0x47 +#define SCSIOP_PLAY_TRACK_INDEX 0x48 +#define SCSIOP_PLAY_TRACK_RELATIVE 0x49 +#define SCSIOP_GET_EVENT_STATUS 0x4A +#define SCSIOP_PAUSE_RESUME 0x4B +#define SCSIOP_LOG_SELECT 0x4C +#define SCSIOP_LOG_SENSE 0x4D +#define SCSIOP_STOP_PLAY_SCAN 0x4E +#define SCSIOP_READ_DISK_INFORMATION 0x51 +#define SCSIOP_READ_TRACK_INFORMATION 0x52 +#define SCSIOP_RESERVE_TRACK_RZONE 0x53 +#define SCSIOP_SEND_OPC_INFORMATION 0x54 +#define SCSIOP_MODE_SELECT10 0x55 +#define SCSIOP_MODE_SENSE10 0x5A +#define SCSIOP_CLOSE_TRACK_SESSION 0x5B +#define SCSIOP_READ_BUFFER_CAPACITY 0x5C +#define SCSIOP_SEND_CUE_SHEET 0x5D +#define SCSIOP_PERSISTENT_RESERVE_IN 0x5E +#define SCSIOP_PERSISTENT_RESERVE_OUT 0x5F + +#define SCSIOP_REPORT_LUNS 0xA0 +#define SCSIOP_BLANK 0xA1 +#define SCSIOP_SEND_KEY 0xA3 +#define SCSIOP_REPORT_KEY 0xA4 +#define SCSIOP_MOVE_MEDIUM 0xA5 +#define SCSIOP_LOAD_UNLOAD_SLOT 0xA6 +#define SCSIOP_EXCHANGE_MEDIUM 0xA6 +#define SCSIOP_SET_READ_AHEAD 0xA7 +#define SCSIOP_READ_DVD_STRUCTURE 0xAD +#define SCSIOP_REQUEST_VOL_ELEMENT 0xB5 +#define SCSIOP_SEND_VOLUME_TAG 0xB6 +#define SCSIOP_READ_ELEMENT_STATUS 0xB8 +#define SCSIOP_READ_CD_MSF 0xB9 +#define SCSIOP_SCAN_CD 0xBA +#define SCSIOP_SET_CD_SPEED 0xBB +#define SCSIOP_PLAY_CD 0xBC +#define SCSIOP_MECHANISM_STATUS 0xBD +#define SCSIOP_READ_CD 0xBE +#define SCSIOP_SEND_DVD_STRUCTURE 0xBF +#define SCSIOP_INIT_ELEMENT_RANGE 0xE7 + +#define SCSIOP_DENON_EJECT_DISC 0xE6 +#define SCSIOP_DENON_STOP_AUDIO 0xE7 +#define SCSIOP_DENON_PLAY_AUDIO 0xE8 +#define SCSIOP_DENON_READ_TOC 0xE9 +#define SCSIOP_DENON_READ_SUBCODE 0xEB + +#define SCSIMESS_MODIFY_DATA_POINTER 0x00 +#define SCSIMESS_SYNCHRONOUS_DATA_REQ 0x01 +#define SCSIMESS_WIDE_DATA_REQUEST 0x03 + +#define SCSIMESS_MODIFY_DATA_LENGTH 5 +#define SCSIMESS_SYNCH_DATA_LENGTH 3 +#define SCSIMESS_WIDE_DATA_LENGTH 2 + +#define SCSIMESS_ABORT 0x06 +#define SCSIMESS_ABORT_WITH_TAG 0x0D +#define SCSIMESS_BUS_DEVICE_RESET 0x0C +#define SCSIMESS_CLEAR_QUEUE 0x0E +#define SCSIMESS_COMMAND_COMPLETE 0x00 +#define SCSIMESS_DISCONNECT 0x04 +#define SCSIMESS_EXTENDED_MESSAGE 0x01 +#define SCSIMESS_IDENTIFY 0x80 +#define SCSIMESS_IDENTIFY_WITH_DISCON 0xC0 +#define SCSIMESS_IGNORE_WIDE_RESIDUE 0x23 +#define SCSIMESS_INITIATE_RECOVERY 0x0F +#define SCSIMESS_INIT_DETECTED_ERROR 0x05 +#define SCSIMESS_LINK_CMD_COMP 0x0A +#define SCSIMESS_LINK_CMD_COMP_W_FLAG 0x0B +#define SCSIMESS_MESS_PARITY_ERROR 0x09 +#define SCSIMESS_MESSAGE_REJECT 0x07 +#define SCSIMESS_NO_OPERATION 0x08 +#define SCSIMESS_HEAD_OF_QUEUE_TAG 0x21 +#define SCSIMESS_ORDERED_QUEUE_TAG 0x22 +#define SCSIMESS_SIMPLE_QUEUE_TAG 0x20 +#define SCSIMESS_RELEASE_RECOVERY 0x10 +#define SCSIMESS_RESTORE_POINTERS 0x03 +#define SCSIMESS_SAVE_DATA_POINTER 0x02 +#define SCSIMESS_TERMINATE_IO_PROCESS 0x11 + +#define CDB_FORCE_MEDIA_ACCESS 0x08 + +#define CDB_RETURN_ON_COMPLETION 0 +#define CDB_RETURN_IMMEDIATE 1 + +#define CDB_INQUIRY_EVPD 0x01 + +#define LUN0_FORMAT_SAVING_DEFECT_LIST 0 +#define USE_DEFAULTMSB 0 +#define USE_DEFAULTLSB 0 + +#define START_UNIT_CODE 0x01 +#define STOP_UNIT_CODE 0x00 + +typedef struct _SENSE_DATA { + UCHAR ErrorCode : 7; + UCHAR Valid : 1; + UCHAR SegmentNumber; + UCHAR SenseKey : 4; + UCHAR Reserved : 1; + UCHAR IncorrectLength : 1; + UCHAR EndOfMedia : 1; + UCHAR FileMark : 1; + UCHAR Information[4]; + UCHAR AdditionalSenseLength; + UCHAR CommandSpecificInformation[4]; + UCHAR AdditionalSenseCode; + UCHAR AdditionalSenseCodeQualifier; + UCHAR FieldReplaceableUnitCode; + UCHAR SenseKeySpecific[3]; +} SENSE_DATA, *PSENSE_DATA; + +#define SENSE_BUFFER_SIZE 18 + +/* Sense codes */ +#define SCSI_SENSE_NO_SENSE 0x00 +#define SCSI_SENSE_RECOVERED_ERROR 0x01 +#define SCSI_SENSE_NOT_READY 0x02 +#define SCSI_SENSE_MEDIUM_ERROR 0x03 +#define SCSI_SENSE_HARDWARE_ERROR 0x04 +#define SCSI_SENSE_ILLEGAL_REQUEST 0x05 +#define SCSI_SENSE_UNIT_ATTENTION 0x06 +#define SCSI_SENSE_DATA_PROTECT 0x07 +#define SCSI_SENSE_BLANK_CHECK 0x08 +#define SCSI_SENSE_UNIQUE 0x09 +#define SCSI_SENSE_COPY_ABORTED 0x0A +#define SCSI_SENSE_ABORTED_COMMAND 0x0B +#define SCSI_SENSE_EQUAL 0x0C +#define SCSI_SENSE_VOL_OVERFLOW 0x0D +#define SCSI_SENSE_MISCOMPARE 0x0E +#define SCSI_SENSE_RESERVED 0x0F + +/* Additional tape bit */ +#define SCSI_ILLEGAL_LENGTH 0x20 +#define SCSI_EOM 0x40 +#define SCSI_FILE_MARK 0x80 + +/* Additional Sense codes */ +#define SCSI_ADSENSE_NO_SENSE 0x00 +#define SCSI_ADSENSE_NO_SEEK_COMPLETE 0x02 +#define SCSI_ADSENSE_LUN_NOT_READY 0x04 +#define SCSI_ADSENSE_WRITE_ERROR 0x0C +#define SCSI_ADSENSE_TRACK_ERROR 0x14 +#define SCSI_ADSENSE_SEEK_ERROR 0x15 +#define SCSI_ADSENSE_REC_DATA_NOECC 0x17 +#define SCSI_ADSENSE_REC_DATA_ECC 0x18 +#define SCSI_ADSENSE_ILLEGAL_COMMAND 0x20 +#define SCSI_ADSENSE_ILLEGAL_BLOCK 0x21 +#define SCSI_ADSENSE_INVALID_CDB 0x24 +#define SCSI_ADSENSE_INVALID_LUN 0x25 +#define SCSI_ADSENSE_WRITE_PROTECT 0x27 +#define SCSI_ADSENSE_MEDIUM_CHANGED 0x28 +#define SCSI_ADSENSE_BUS_RESET 0x29 +#define SCSI_ADSENSE_INSUFFICIENT_TIME_FOR_OPERATION 0x2E +#define SCSI_ADSENSE_INVALID_MEDIA 0x30 +#define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE 0x3a +#define SCSI_ADSENSE_POSITION_ERROR 0x3b +#define SCSI_ADSENSE_OPERATOR_REQUEST 0x5a +#define SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5d +#define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK 0x64 +#define SCSI_ADSENSE_COPY_PROTECTION_FAILURE 0x6f +#define SCSI_ADSENSE_POWER_CALIBRATION_ERROR 0x73 +#define SCSI_ADSENSE_VENDOR_UNIQUE 0x80 +#define SCSI_ADSENSE_MUSIC_AREA 0xA0 +#define SCSI_ADSENSE_DATA_AREA 0xA1 +#define SCSI_ADSENSE_VOLUME_OVERFLOW 0xA7 + +#define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE 0x00 +#define SCSI_SENSEQ_BECOMING_READY 0x01 +#define SCSI_SENSEQ_INIT_COMMAND_REQUIRED 0x02 +#define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED 0x03 +#define SCSI_SENSEQ_FORMAT_IN_PROGRESS 0x04 +#define SCSI_SENSEQ_REBUILD_IN_PROGRESS 0x05 +#define SCSI_SENSEQ_RECALCULATION_IN_PROGRESS 0x06 +#define SCSI_SENSEQ_OPERATION_IN_PROGRESS 0x07 +#define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS 0x08 +#define SCSI_SENSEQ_LOSS_OF_STREAMING 0x09 +#define SCSI_SENSEQ_PADDING_BLOCKS_ADDED 0x0A + + +#define FILE_DEVICE_SCSI 0x0000001b + +#define IOCTL_SCSI_EXECUTE_IN ((FILE_DEVICE_SCSI << 16) + 0x0011) +#define IOCTL_SCSI_EXECUTE_OUT ((FILE_DEVICE_SCSI << 16) + 0x0012) +#define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013) + +/* SMART support in ATAPI */ +#define IOCTL_SCSI_MINIPORT_SMART_VERSION ((FILE_DEVICE_SCSI << 16) + 0x0500) +#define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501) +#define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS ((FILE_DEVICE_SCSI << 16) + 0x0502) +#define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS ((FILE_DEVICE_SCSI << 16) + 0x0503) +#define IOCTL_SCSI_MINIPORT_ENABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0504) +#define IOCTL_SCSI_MINIPORT_DISABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0505) +#define IOCTL_SCSI_MINIPORT_RETURN_STATUS ((FILE_DEVICE_SCSI << 16) + 0x0506) +#define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE ((FILE_DEVICE_SCSI << 16) + 0x0507) +#define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES ((FILE_DEVICE_SCSI << 16) + 0x0508) +#define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS ((FILE_DEVICE_SCSI << 16) + 0x0509) +#define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTO_OFFLINE ((FILE_DEVICE_SCSI << 16) + 0x050a) +#define IOCTL_SCSI_MINIPORT_READ_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050b) +#define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050c) + +/* CLUSTER support */ +#define IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0520) +#define IOCTL_SCSI_MINIPORT_NOT_CLUSTER_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0521) + +/* Read Capacity Data. Returned in Big Endian format */ +typedef struct _READ_CAPACITY_DATA { + ULONG LogicalBlockAddress; + ULONG BytesPerBlock; +} READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA; + +/* Read Block Limits Data. Returned in Big Endian format */ +typedef struct _READ_BLOCK_LIMITS { + UCHAR Reserved; + UCHAR BlockMaximumSize[3]; + UCHAR BlockMinimumSize[2]; +} READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA; + + +typedef struct _MODE_PARAMETER_HEADER { + UCHAR ModeDataLength; + UCHAR MediumType; + UCHAR DeviceSpecificParameter; + UCHAR BlockDescriptorLength; +}MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER; + +typedef struct _MODE_PARAMETER_HEADER10 { + UCHAR ModeDataLength[2]; + UCHAR MediumType; + UCHAR DeviceSpecificParameter; + UCHAR Reserved[2]; + UCHAR BlockDescriptorLength[2]; +} MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10; + +#define MODE_FD_SINGLE_SIDE 0x01 +#define MODE_FD_DOUBLE_SIDE 0x02 +#define MODE_FD_MAXIMUM_TYPE 0x1E +#define MODE_DSP_FUA_SUPPORTED 0x10 +#define MODE_DSP_WRITE_PROTECT 0x80 + +typedef struct _MODE_PARAMETER_BLOCK { + UCHAR DensityCode; + UCHAR NumberOfBlocks[3]; + UCHAR Reserved; + UCHAR BlockLength[3]; +} MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK; + +typedef struct _MODE_DISCONNECT_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved : 1; + UCHAR PageSavable : 1; + UCHAR PageLength; + UCHAR BufferFullRatio; + UCHAR BufferEmptyRatio; + UCHAR BusInactivityLimit[2]; + UCHAR BusDisconnectTime[2]; + UCHAR BusConnectTime[2]; + UCHAR MaximumBurstSize[2]; + UCHAR DataTransferDisconnect : 2; + UCHAR Reserved2[3]; +}MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE; + +typedef struct _MODE_CACHING_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved : 1; + UCHAR PageSavable : 1; + UCHAR PageLength; + UCHAR ReadDisableCache : 1; + UCHAR MultiplicationFactor : 1; + UCHAR WriteCacheEnable : 1; + UCHAR Reserved2 : 5; + UCHAR WriteRetensionPriority : 4; + UCHAR ReadRetensionPriority : 4; + UCHAR DisablePrefetchTransfer[2]; + UCHAR MinimumPrefetch[2]; + UCHAR MaximumPrefetch[2]; + UCHAR MaximumPrefetchCeiling[2]; +}MODE_CACHING_PAGE, *PMODE_CACHING_PAGE; + +typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE { + UCHAR PageLength; + UCHAR WriteType : 4; + UCHAR TestWrite : 1; + UCHAR LinkSizeValid : 1; + UCHAR BufferUnderrunFreeEnabled : 1; + UCHAR Reserved2 : 1; + UCHAR TrackMode : 4; + UCHAR Copy : 1; + UCHAR FixedPacket : 1; + UCHAR MultiSession : 2; + UCHAR DataBlockType : 4; + UCHAR Reserved3 : 4; + UCHAR LinkSize; + UCHAR Reserved4; + UCHAR HostApplicationCode : 6; + UCHAR Reserved5 : 2; + UCHAR SessionFormat; + UCHAR Reserved6; + UCHAR PacketSize[4]; + UCHAR AudioPauseLength[2]; + UCHAR Reserved7 : 7; + UCHAR MediaCatalogNumberValid : 1; + UCHAR MediaCatalogNumber[13]; + UCHAR MediaCatalogNumberZero; + UCHAR MediaCatalogNumberAFrame; + UCHAR Reserved8 : 7; + UCHAR ISRCValid : 1; + UCHAR ISRCCountry[2]; + UCHAR ISRCOwner[3]; + UCHAR ISRCRecordingYear[2]; + UCHAR ISRCSerialNumber[5]; + UCHAR ISRCZero; + UCHAR ISRCAFrame; + UCHAR ISRCReserved; + UCHAR SubHeaderData[4]; +} MODE_CDROM_WRITE_PARAMETERS_PAGE, *PMODE_CDROM_WRITE_PARAMETERS_PAGE; + +typedef struct _MODE_FLEXIBLE_DISK_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved : 1; + UCHAR PageSavable : 1; + UCHAR PageLength; + UCHAR TransferRate[2]; + UCHAR NumberOfHeads; + UCHAR SectorsPerTrack; + UCHAR BytesPerSector[2]; + UCHAR NumberOfCylinders[2]; + UCHAR StartWritePrecom[2]; + UCHAR StartReducedCurrent[2]; + UCHAR StepRate[2]; + UCHAR StepPluseWidth; + UCHAR HeadSettleDelay[2]; + UCHAR MotorOnDelay; + UCHAR MotorOffDelay; + UCHAR Reserved2 : 5; + UCHAR MotorOnAsserted : 1; + UCHAR StartSectorNumber : 1; + UCHAR TrueReadySignal : 1; + UCHAR StepPlusePerCyclynder : 4; + UCHAR Reserved3 : 4; + UCHAR WriteCompenstation; + UCHAR HeadLoadDelay; + UCHAR HeadUnloadDelay; + UCHAR Pin2Usage : 4; + UCHAR Pin34Usage : 4; + UCHAR Pin1Usage : 4; + UCHAR Pin4Usage : 4; + UCHAR MediumRotationRate[2]; + UCHAR Reserved4[2]; +} MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE; + +typedef struct _MODE_FORMAT_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved : 1; + UCHAR PageSavable : 1; + UCHAR PageLength; + UCHAR TracksPerZone[2]; + UCHAR AlternateSectorsPerZone[2]; + UCHAR AlternateTracksPerZone[2]; + UCHAR AlternateTracksPerLogicalUnit[2]; + UCHAR SectorsPerTrack[2]; + UCHAR BytesPerPhysicalSector[2]; + UCHAR Interleave[2]; + UCHAR TrackSkewFactor[2]; + UCHAR CylinderSkewFactor[2]; + UCHAR Reserved2 : 4; + UCHAR SurfaceFirst : 1; + UCHAR RemovableMedia : 1; + UCHAR HardSectorFormating : 1; + UCHAR SoftSectorFormating : 1; + UCHAR Reserved3[3]; +} MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE; + +typedef struct _MODE_RIGID_GEOMETRY_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved : 1; + UCHAR PageSavable : 1; + UCHAR PageLength; + UCHAR NumberOfCylinders[3]; + UCHAR NumberOfHeads; + UCHAR StartWritePrecom[3]; + UCHAR StartReducedCurrent[3]; + UCHAR DriveStepRate[2]; + UCHAR LandZoneCyclinder[3]; + UCHAR RotationalPositionLock : 2; + UCHAR Reserved2 : 6; + UCHAR RotationOffset; + UCHAR Reserved3; + UCHAR RoataionRate[2]; + UCHAR Reserved4[2]; +} MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE; + +typedef struct _MODE_READ_WRITE_RECOVERY_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved1 : 1; + UCHAR PSBit : 1; + UCHAR PageLength; + UCHAR DCRBit : 1; + UCHAR DTEBit : 1; + UCHAR PERBit : 1; + UCHAR EERBit : 1; + UCHAR RCBit : 1; + UCHAR TBBit : 1; + UCHAR ARRE : 1; + UCHAR AWRE : 1; + UCHAR ReadRetryCount; + UCHAR Reserved4[4]; + UCHAR WriteRetryCount; + UCHAR Reserved5[3]; +} MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE; + +typedef struct _MODE_READ_RECOVERY_PAGE { + UCHAR PageCode : 6; + UCHAR Reserved1 : 1; + UCHAR PSBit : 1; + UCHAR PageLength; + UCHAR DCRBit : 1; + UCHAR DTEBit : 1; + UCHAR PERBit : 1; + UCHAR Reserved2 : 1; + UCHAR RCBit : 1; + UCHAR TBBit : 1; + UCHAR Reserved3 : 2; + UCHAR ReadRetryCount; + UCHAR Reserved4[4]; +} MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE; + +typedef struct _MODE_INFO_EXCEPTIONS { + UCHAR PageCode : 6; + UCHAR Reserved1 : 1; + UCHAR PSBit : 1; + UCHAR PageLength; + _ANONYMOUS_UNION union { + UCHAR Flags; + _ANONYMOUS_STRUCT struct { + UCHAR LogErr : 1; + UCHAR Reserved2 : 1; + UCHAR Test : 1; + UCHAR Dexcpt : 1; + UCHAR Reserved3 : 3; + UCHAR Perf : 1; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + UCHAR ReportMethod : 4; + UCHAR Reserved4 : 4; + UCHAR IntervalTimer[4]; + UCHAR ReportCount[4]; +} MODE_INFO_EXCEPTIONS, *PMODE_INFO_EXCEPTIONS; + +/* CDROM audio control */ +#define CDB_AUDIO_PAUSE 0x00 +#define CDB_AUDIO_RESUME 0x01 +#define CDB_DEVICE_START 0x11 +#define CDB_DEVICE_STOP 0x10 +#define CDB_EJECT_MEDIA 0x10 +#define CDB_LOAD_MEDIA 0x01 +#define CDB_SUBCHANNEL_HEADER 0x00 +#define CDB_SUBCHANNEL_BLOCK 0x01 + +#define CDROM_AUDIO_CONTROL_PAGE 0x0E +#define MODE_SELECT_IMMEDIATE 0x04 +#define MODE_SELECT_PFBIT 0x10 + +#define CDB_USE_MSF 0x01 + +typedef struct _PORT_OUTPUT { + UCHAR ChannelSelection; + UCHAR Volume; +} PORT_OUTPUT, *PPORT_OUTPUT; + +typedef struct _AUDIO_OUTPUT { + UCHAR CodePage; + UCHAR ParameterLength; + UCHAR Immediate; + UCHAR Reserved[2]; + UCHAR LbaFormat; + UCHAR LogicalBlocksPerSecond[2]; + PORT_OUTPUT PortOutput[4]; +} AUDIO_OUTPUT, *PAUDIO_OUTPUT; + +/* Multisession CDROMs */ +#define GET_LAST_SESSION 0x01 +#define GET_SESSION_DATA 0x02; + +/* Atapi 2.5 changers */ +typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER { + UCHAR CurrentSlot : 5; + UCHAR ChangerState : 2; + UCHAR Fault : 1; + UCHAR Reserved : 5; + UCHAR MechanismState : 3; + UCHAR CurrentLogicalBlockAddress[3]; + UCHAR NumberAvailableSlots; + UCHAR SlotTableLength[2]; +} MECHANICAL_STATUS_INFORMATION_HEADER, *PMECHANICAL_STATUS_INFORMATION_HEADER; + +typedef struct _SLOT_TABLE_INFORMATION { + UCHAR DiscChanged : 1; + UCHAR Reserved : 6; + UCHAR DiscPresent : 1; + UCHAR Reserved2[3]; +} SLOT_TABLE_INFORMATION, *PSLOT_TABLE_INFORMATION; + +typedef struct _MECHANICAL_STATUS { + MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader; + SLOT_TABLE_INFORMATION SlotTableInfo[1]; +} MECHANICAL_STATUS, *PMECHANICAL_STATUS; + + +/* Tape definitions */ +typedef struct _TAPE_POSITION_DATA { + UCHAR Reserved1 : 2; + UCHAR BlockPositionUnsupported : 1; + UCHAR Reserved2 : 3; + UCHAR EndOfPartition : 1; + UCHAR BeginningOfPartition : 1; + UCHAR PartitionNumber; + USHORT Reserved3; + UCHAR FirstBlock[4]; + UCHAR LastBlock[4]; + UCHAR Reserved4; + UCHAR NumberOfBlocks[3]; + UCHAR NumberOfBytes[4]; +} TAPE_POSITION_DATA, *PTAPE_POSITION_DATA; + +/* This structure is used to convert little endian ULONGs + to SCSI CDB big endians values. */ +typedef union _EIGHT_BYTE { + _ANONYMOUS_STRUCT struct { + UCHAR Byte0; + UCHAR Byte1; + UCHAR Byte2; + UCHAR Byte3; + UCHAR Byte4; + UCHAR Byte5; + UCHAR Byte6; + UCHAR Byte7; + } DUMMYSTRUCTNAME; + ULONGLONG AsULongLong; +} EIGHT_BYTE, *PEIGHT_BYTE; + +typedef union _FOUR_BYTE { + _ANONYMOUS_STRUCT struct { + UCHAR Byte0; + UCHAR Byte1; + UCHAR Byte2; + UCHAR Byte3; + } DUMMYSTRUCTNAME; + ULONG AsULong; +} FOUR_BYTE, *PFOUR_BYTE; + +typedef union _TWO_BYTE { + _ANONYMOUS_STRUCT struct { + UCHAR Byte0; + UCHAR Byte1; + } DUMMYSTRUCTNAME; + USHORT AsUShort; +} TWO_BYTE, *PTWO_BYTE; + +/* Byte reversing macro for converting between + big- and little-endian formats */ +#define REVERSE_BYTES_QUAD(Destination, Source) { \ + PEIGHT_BYTE _val1 = (PEIGHT_BYTE)(Destination); \ + PEIGHT_BYTE _val2 = (PEIGHT_BYTE)(Source); \ + _val1->Byte7 = _val2->Byte0; \ + _val1->Byte6 = _val2->Byte1; \ + _val1->Byte5 = _val2->Byte2; \ + _val1->Byte4 = _val2->Byte3; \ + _val1->Byte3 = _val2->Byte4; \ + _val1->Byte2 = _val2->Byte5; \ + _val1->Byte1 = _val2->Byte6; \ + _val1->Byte0 = _val2->Byte7; \ +} + +#define REVERSE_BYTES(Destination, Source) { \ + PFOUR_BYTE _val1 = (PFOUR_BYTE)(Destination); \ + PFOUR_BYTE _val2 = (PFOUR_BYTE)(Source); \ + _val1->Byte3 = _val2->Byte0; \ + _val1->Byte2 = _val2->Byte1; \ + _val1->Byte1 = _val2->Byte2; \ + _val1->Byte0 = _val2->Byte3; \ +} + +#define REVERSE_BYTES_SHORT(Destination, Source) { \ + PTWO_BYTE _val1 = (PTWO_BYTE)(Destination); \ + PTWO_BYTE _val2 = (PTWO_BYTE)(Source); \ + _val1->Byte1 = _val2->Byte0; \ + _val1->Byte0 = _val2->Byte1; \ +} + +#define REVERSE_SHORT(Short) { \ + UCHAR _val; \ + PTWO_BYTE _val2 = (PTWO_BYTE)(Short); \ + _val = _val2->Byte0; \ + _val2->Byte0 = _val2->Byte1; \ + _val2->Byte1 = _val; \ +} + +#define REVERSE_LONG(Long) { \ + UCHAR _val; \ + PFOUR_BYTE _val2 = (PFOUR_BYTE)(Long); \ + _val = _val2->Byte3; \ + _val2->Byte3 = _val2->Byte0; \ + _val2->Byte0 = _val; \ + _val = _val2->Byte2; \ + _val2->Byte2 = _val2->Byte1; \ + _val2->Byte1 = _val; \ +} + +#define WHICH_BIT(Data, Bit) { \ + UCHAR _val; \ + for (_val = 0; _val < 32; _val++) { \ + if (((Data) >> _val) == 1) { \ + break; \ + } \ + } \ + ASSERT(_val != 32); \ + (Bit) = _val; \ +} + +#ifdef __cplusplus +} +#endif + +#endif /* __SCSI_H */