mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-16 03:19:54 +08:00
540d550a38
d4iface.h, ddkmapi.h, hidclass.h, hidpi.h, hidusage.h, mcd.h, miniport.h, minitape.h, mountdev.h, mountmgr.h, ndis.h, ndisquid.h, ndistapi.h, ndisvan.h, netevent.h, netpnp.h, netdev.h, ntapi.h, ntdd8042.h, ntddbeep.h, ntddcdrm.h, ntddcdvd.h, ntddchgr.h, ntdddisk.h, ntddk.h, ntddkbd.h, ntddmou.h, ntddndis.h, ntddpar.h, ntddpcm.h, ntddscsi.h, ntddser.h, ntddstor.h, ntddtape.h, ntddtdi.h, ntddvdeo.h, ntddvol.h, ntifs.h, ntpoapi.h, ntstatus.h, parallel.h, pfhook.h, poclass.h, scsi.h, scsiscan.h, scsiwmi.h, smbus.h, srb.h, storport.h, tdi.h, tdiinfo.h, tdikrnl.h, tdistat.h, tvout.h, upssvc.h, usb.h, usb100.h, usbcamdi.h, usbdi.h, usbioctl.h, usbiodef.h, usbscan.h, usbuser.h, video.h, videoagp.h, win2k.h, winddi.h, winddk.h, winnt4.h, winxp.h, ws2san.h, xfilter.h): Change comment to refer w32api package, not MinGW.
1690 lines
48 KiB
C
1690 lines
48 KiB
C
/*
|
|
* scsi.h
|
|
*
|
|
* SCSI port and class interface.
|
|
*
|
|
* This file is part of the w32api package.
|
|
*
|
|
* Contributors:
|
|
* Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
|
|
*
|
|
* 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
|
|
|
|
#pragma pack(push,4)
|
|
|
|
#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;
|
|
|
|
struct _PLAY_CD {
|
|
UCHAR OperationCode;
|
|
UCHAR Reserved1 : 1;
|
|
UCHAR CMSF : 1;
|
|
UCHAR ExpectedSectorType : 3;
|
|
UCHAR Lun : 3;
|
|
|
|
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;
|
|
#ifdef __cplusplus
|
|
} u;
|
|
#else
|
|
};
|
|
#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;
|
|
|
|
#define INQUIRYDATABUFFERSIZE 36
|
|
|
|
typedef struct _INQUIRYDATA {
|
|
UCHAR DeviceType : 5;
|
|
UCHAR DeviceTypeQualifier : 3;
|
|
UCHAR DeviceTypeModifier : 7;
|
|
UCHAR RemovableMedia : 1;
|
|
union {
|
|
UCHAR Versions;
|
|
struct {
|
|
UCHAR ANSIVersion : 3;
|
|
UCHAR ECMAVersion : 3;
|
|
UCHAR ISOVersion : 2;
|
|
};
|
|
};
|
|
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;
|
|
|
|
/* 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;
|
|
union {
|
|
UCHAR Flags;
|
|
struct {
|
|
UCHAR LogErr : 1;
|
|
UCHAR Reserved2 : 1;
|
|
UCHAR Test : 1;
|
|
UCHAR Dexcpt : 1;
|
|
UCHAR Reserved3 : 3;
|
|
UCHAR Perf : 1;
|
|
};
|
|
};
|
|
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 {
|
|
struct {
|
|
UCHAR Byte0;
|
|
UCHAR Byte1;
|
|
UCHAR Byte2;
|
|
UCHAR Byte3;
|
|
UCHAR Byte4;
|
|
UCHAR Byte5;
|
|
UCHAR Byte6;
|
|
UCHAR Byte7;
|
|
};
|
|
ULONGLONG AsULongLong;
|
|
} EIGHT_BYTE, *PEIGHT_BYTE;
|
|
|
|
typedef union _FOUR_BYTE {
|
|
struct {
|
|
UCHAR Byte0;
|
|
UCHAR Byte1;
|
|
UCHAR Byte2;
|
|
UCHAR Byte3;
|
|
};
|
|
ULONG AsULong;
|
|
} FOUR_BYTE, *PFOUR_BYTE;
|
|
|
|
typedef union _TWO_BYTE {
|
|
struct {
|
|
UCHAR Byte0;
|
|
UCHAR Byte1;
|
|
};
|
|
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; \
|
|
}
|
|
|
|
#pragma pack(pop)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __SCSI_H */
|