--- /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 <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
+
+#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 */