📄 scsi.h
字号:
UCHAR RoataionRate[2];
UCHAR Reserved4[2];
}MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE;
//
// Define read write recovery 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;
//
// Define read recovery page - cdrom
//
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;
//
// Define Informational Exception Control Page. Used for failure prediction
//
typedef struct _MODE_INFO_EXCEPTIONS
{
UCHAR PageCode : 6;
UCHAR Reserved1 : 1;
UCHAR PSBit : 1;
UCHAR PageLength;
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]; // [0]=MSB, [3]=LSB
UCHAR ReportCount[4]; // [0]=MSB, [3]=LSB
} MODE_INFO_EXCEPTIONS, *PMODE_INFO_EXCEPTIONS;
//
// Begin C/DVD 0.9 definitions
//
//
// Power Condition Mode Page Format
//
typedef struct _POWER_CONDITION_PAGE {
UCHAR PageCode : 6; // 0x1A
UCHAR Reserved : 1;
UCHAR PSBit : 1;
UCHAR PageLength; // 0x0A
UCHAR Reserved2;
UCHAR Standby : 1;
UCHAR Idle : 1;
UCHAR Reserved3 : 6;
UCHAR IdleTimer[4]; // [0]=MSB, [3]=LSB
UCHAR StandbyTimer[4]; // [0]=MSB, [3]=LSB
} POWER_CONDITION_PAGE, *PPOWER_CONDITION_PAGE;
//
// CD-Audio Control Mode Page Format
//
typedef struct _CDDA_OUTPUT_PORT {
UCHAR ChannelSelection : 4;
UCHAR Reserved : 4;
UCHAR Volume;
} CDDA_OUTPUT_PORT, *PCDDA_OUTPUT_PORT;
typedef struct _CDAUDIO_CONTROL_PAGE {
UCHAR PageCode : 6; // 0x0E
UCHAR Reserved : 1;
UCHAR PSBit : 1;
UCHAR PageLength; // 0x0E
UCHAR Reserved2 : 1;
UCHAR StopOnTrackCrossing : 1; // Default 0
UCHAR Immediate : 1; // Always 1
UCHAR Reserved3 : 5;
UCHAR Reserved4[3];
UCHAR Obsolete[2];
CDDA_OUTPUT_PORT CDDAOutputPorts[4];
} CDAUDIO_CONTROL_PAGE, *PCDAUDIO_CONTROL_PAGE;
#define CDDA_CHANNEL_MUTED 0x0
#define CDDA_CHANNEL_ZERO 0x1
#define CDDA_CHANNEL_ONE 0x2
#define CDDA_CHANNEL_TWO 0x4
#define CDDA_CHANNEL_THREE 0x8
//
// C/DVD Feature Set Support & Version Page
//
typedef struct _CDVD_FEATURE_SET_PAGE {
UCHAR PageCode : 6; // 0x18
UCHAR Reserved : 1;
UCHAR PSBit : 1;
UCHAR PageLength; // 0x16
UCHAR CDAudio[2]; // [0]=MSB, [1]=LSB
UCHAR EmbeddedChanger[2];
UCHAR PacketSMART[2];
UCHAR PersistantPrevent[2];
UCHAR EventStatusNotification[2];
UCHAR DigitalOutput[2];
UCHAR CDSequentialRecordable[2];
UCHAR DVDSequentialRecordable[2];
UCHAR RandomRecordable[2];
UCHAR KeyExchange[2];
UCHAR Reserved2[2];
} CDVD_FEATURE_SET_PAGE, *PCDVD_FEATURE_SET_PAGE;
//
// CDVD Inactivity Time-out Page Format
//
typedef struct _CDVD_INACTIVITY_TIMEOUT_PAGE {
UCHAR PageCode : 6; // 0x1D
UCHAR Reserved : 1;
UCHAR PSBit : 1;
UCHAR PageLength; // 0x08
UCHAR Reserved2[2];
UCHAR SWPP : 1;
UCHAR DISP : 1;
UCHAR Reserved3 : 6;
UCHAR Reserved4;
UCHAR GroupOneMinimumTimeout[2];
UCHAR GroupTwoMinimumTimeout[2];
} CDVD_INACTIVITY_TIMEOUT_PAGE, *PCDVD_INACTIVITY_TIMEOUT_PAGE;
//
// CDVD Capabilities & Mechanism Status Page
//
#define CDVD_LMT_CADDY 0
#define CDVD_LMT_TRAY 1
#define CDVD_LMT_POPUP 2
#define CDVD_LMT_RESERVED1 3
#define CDVD_LMT_CHANGER_INDIVIDUAL 4
#define CDVD_LMT_CHANGER_CARTRIDGE 5
#define CDVD_LMT_RESERVED2 6
#define CDVD_LMT_RESERVED3 7
typedef struct _CDVD_CAPABILITIES_PAGE {
UCHAR PageCode : 6; // 0x2A
UCHAR Reserved : 1;
UCHAR PSBit : 1; // offset 0
UCHAR PageLength; // 0x18 // offset 1
UCHAR CDRRead : 1;
UCHAR CDERead : 1;
UCHAR Method2 : 1;
UCHAR DVDROMRead : 1;
UCHAR DVDRRead : 1;
UCHAR DVDRAMRead : 1;
UCHAR Reserved2 : 2; // offset 2
UCHAR CDRWrite : 1;
UCHAR CDEWrite : 1;
UCHAR TestWrite : 1;
UCHAR Reserved3 : 1;
UCHAR DVDRWrite : 1;
UCHAR DVDRAMWrite : 1;
UCHAR Reserved4 : 2; // offset 3
UCHAR AudioPlay : 1;
UCHAR Composite : 1;
UCHAR DigitalPortOne : 1;
UCHAR DigitalPortTwo : 1;
UCHAR Mode2Form1 : 1;
UCHAR Mode2Form2 : 1;
UCHAR MultiSession : 1;
UCHAR Reserved5 : 1; // offset 4
UCHAR CDDA : 1;
UCHAR CDDAAccurate : 1;
UCHAR RWSupported : 1;
UCHAR RWDeinterleaved : 1;
UCHAR C2Pointers : 1;
UCHAR ISRC : 1;
UCHAR UPC : 1;
UCHAR ReadBarCodeCapable : 1; // offset 5
UCHAR Lock : 1;
UCHAR LockState : 1;
UCHAR PreventJumper : 1;
UCHAR Eject : 1;
UCHAR Reserved6 : 1;
UCHAR LoadingMechanismType : 3; // offset 6
UCHAR SeparateVolume : 1;
UCHAR SeperateChannelMute : 1;
UCHAR SupportsDiskPresent : 1;
UCHAR SWSlotSelection : 1;
UCHAR SideChangeCapable : 1;
UCHAR RWInLeadInReadable : 1;
UCHAR Reserved7 : 2; // offset 7
UCHAR ObsoleteReserved[2]; // offset 8
UCHAR NumberVolumeLevels[2]; // offset 10
UCHAR BufferSize[2]; // offset 12
UCHAR ObsoleteReserved2[2]; // offset 14
UCHAR ObsoleteReserved3; // offset 16
UCHAR Reserved8 : 1;
UCHAR BCK : 1;
UCHAR RCK : 1;
UCHAR LSBF : 1;
UCHAR Length : 2;
UCHAR Reserved9 : 2; // offset 17
UCHAR ObsoleteReserved4[2]; // offset 18
UCHAR CopyManagementRevision[2]; // offset 20
UCHAR Reserved10[2]; // offset 22
} CDVD_CAPABILITIES_PAGE, *PCDVD_CAPABILITIES_PAGE;
typedef struct _LUN_LIST {
UCHAR LunListLength[4]; // sizeof LunSize * 8
UCHAR Reserved[4];
UCHAR Lun[0][8]; // 4 level of addressing. 2 bytes each.
} LUN_LIST, *PLUN_LIST;
#define LOADING_MECHANISM_CADDY 0x00
#define LOADING_MECHANISM_TRAY 0x01
#define LOADING_MECHANISM_POPUP 0x02
#define LOADING_MECHANISM_INDIVIDUAL_CHANGER 0x04
#define LOADING_MECHANISM_CARTRIDGE_CHANGER 0x05
//
// end C/DVD 0.9 mode page definitions
//
// Mode parameter list block descriptor -
// set the block length for reading/writing
//
//
#define MODE_BLOCK_DESC_LENGTH 8
#define MODE_HEADER_LENGTH 4
#define MODE_HEADER_LENGTH10 8
typedef struct _MODE_PARM_READ_WRITE {
MODE_PARAMETER_HEADER ParameterListHeader; // List Header Format
MODE_PARAMETER_BLOCK ParameterListBlock; // List Block Descriptor
} MODE_PARM_READ_WRITE_DATA, *PMODE_PARM_READ_WRITE_DATA;
// end_ntminitape
//
// CDROM audio control (0x0E)
//
#define CDB_AUDIO_PAUSE 0
#define CDB_AUDIO_RESUME 1
#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 CDROM
//
#define GET_LAST_SESSION 0x01
#define GET_SESSION_DATA 0x02;
//
// Atapi 2.5 changer
//
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;
// begin_ntminitape
//
// 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 4 byte big endians values.
//
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(Destination, Source) { \
PFOUR_BYTE d = (PFOUR_BYTE)(Destination); \
PFOUR_BYTE s = (PFOUR_BYTE)(Source); \
d->Byte3 = s->Byte0; \
d->Byte2 = s->Byte1; \
d->Byte1 = s->Byte2; \
d->Byte0 = s->Byte3; \
}
//
// Byte reversing macro for converting
// USHORTS from big to little endian in place
//
#define REVERSE_SHORT(Short) { \
UCHAR tmp; \
PTWO_BYTE w = (PTWO_BYTE)(Short); \
tmp = w->Byte0; \
w->Byte0 = w->Byte1; \
w->Byte1 = tmp; \
}
//
// Byte reversing macro for convering
// ULONGS between big & little endian in place
//
#define REVERSE_LONG(Long) { \
UCHAR tmp; \
PFOUR_BYTE l = (PFOUR_BYTE)(Long); \
tmp = l->Byte3; \
l->Byte3 = l->Byte0; \
l->Byte0 = tmp; \
tmp = l->Byte2; \
l->Byte2 = l->Byte1; \
l->Byte1 = tmp; \
}
//
// This macro has the effect of Bit = log2(Data)
//
#define WHICH_BIT(Data, Bit) { \
UCHAR tmp; \
for (tm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -