📄 mbaspi.pas
字号:
{*******************************************************************************
Unit : mbASPI.pas
Date : Jul 2001 - Nov 2002
Author : Ehsan Khan
Description :
Copyright : 2001-02 Binary Magic, All rights reserved.
{******************************************************************************}
unit mbASPI;
{$I DEFINES.INC}
interface
uses
mbSPTI,
Windows;
const
SENSE_LEN = 24; { Default sense buffer length}
SRB_DIR_SCSI = $00; { Direction determined by SCSI}
SRB_POSTING = $01; { Enable ASPI posting}
SRB_ENABLE_RESIDUAL_COUNT = $04; { Enable residual byte count reporting}
SRB_DIR_IN = $08; { Transfer from SCSI target to host}
SRB_DIR_OUT = $10; { Transfer from host to SCSI target}
SRB_EVENT_NOTIFY = $40; { Enable ASPI event notification}
RESIDUAL_COUNT_SUPPORTED = $02; { Extended buffer flag}
MAX_SRB_TIMEOUT = 108000; { 30 hour maximum timeout in sec}
DEFAULT_SRB_TIMEOUT = 108000; { Max timeout by default}
{******************************************************************************}
{ ASPI Command Definitions }
{******************************************************************************}
SC_HA_INQUIRY = $00; { Host adapter inquiry}
SC_GET_DEV_TYPE = $01; { Get device type}
SC_EXEC_SCSI_CMD = $02; { Execute SCSI command}
SC_ABORT_SRB = $03; { Abort an SRB}
SC_RESET_DEV = $04; { SCSI bus device reset}
SC_SET_HA_PARMS = $05; { Set HA parameters}
SC_GET_DISK_INFO = $06; { Get Disk information}
SC_RESCAN_SCSI_BUS = $07; { ReBuild SCSI device map}
SC_GETSET_TIMEOUTS = $08; { Get/Set target timeouts}
{******************************************************************************}
{ SRB Status }
{******************************************************************************}
SS_PENDING = $00; { SRB being processed}
SS_COMP = $01; { SRB completed without error}
SS_ABORTED = $02; { SRB aborted}
SS_ABORT_FAIL = $03; { Unable to abort SRB}
SS_ERR = $04; { SRB completed with error}
SS_INVALID_CMD = $80; { Invalid ASPI command}
SS_INVALID_HA = $81; { Invalid host adapter number}
SS_NO_DEVICE = $82; { SCSI device not installed}
SS_INVALID_SRB = $E0; { Invalid parameter set in SRB}
SS_OLD_MANAGER = $E1; { ASPI manager doesn't support Windows}
SS_BUFFER_ALIGN = $E1; { Buffer not aligned (replaces OLD_MANAGER in Win32)}
SS_ILLEGAL_MODE = $E2; { Unsupported Windows mode}
SS_NO_ASPI = $E3; { No ASPI managers resident}
SS_FAILED_INIT = $E4; { ASPI for windows failed init}
SS_ASPI_IS_BUSY = $E5; { No resources available to execute cmd}
SS_BUFFER_TO_BIG = $E6; { Buffer size to big to handle!}
SS_MISMATCHED_COMPONENTS = $E7; { The DLLs/EXEs of ASPI don't version check}
SS_NO_ADAPTERS = $E8; { No host adapters to manage}
SS_INSUFFICIENT_RESOURCES = $E9; { Couldn't allocate resources needed to init}
SS_ASPI_IS_SHUTDOWN = $EA; { Call came to ASPI after PROCESS_DETACH}
SS_BAD_INSTALL = $EB; { The DLL or other components are installed wrong}
{******************************************************************************}
{ Host Adapter Status }
{******************************************************************************}
HASTAT_OK = $00; { Host adapter did not detect an error}
HASTAT_SEL_TO = $11; { Selection Timeout}
HASTAT_DO_DU = $12; { Data overrun data underrun}
HASTAT_BUS_FREE = $13; { Unexpected bus free}
HASTAT_PHASE_ERR = $14; { Target bus phase sequence failure}
HASTAT_TIMEOUT = $09; { Timed out while SRB was waiting to beprocessed.}
HASTAT_COMMAND_TIMEOUT = $0B; { Adapter timed out processing SRB.}
HASTAT_MESSAGE_REJECT = $0D; { While processing SRB, the adapter received a MESSAGE}
HASTAT_BUS_RESET = $0E; { A bus reset was detected.}
HASTAT_PARITY_ERROR = $00; { A parity error was detected.}
HASTAT_REQUEST_SENSE_FAILED = $10; { The adapter failed in issuing}
DTYPE_DASD = $00; { Disk Device }
DTYPE_SEQD = $01; { Tape Device }
DTYPE_PRNT = $02; { Printer }
DTYPE_PROC = $03; { Processor }
DTYPE_WORM = $04; { Write-once read-multiple }
DTYPE_CROM = $05; { CD-ROM device }
DTYPE_CDROM = $05; { CD-ROM device }
DTYPE_SCAN = $06; { Scanner device }
DTYPE_OPTI = $07; { Optical memory device }
DTYPE_JUKE = $08; { Medium Changer device }
DTYPE_COMM = $09; { Communications device }
DTYPE_RESL = $0A; { Reserved (low) }
DTYPE_RESH = $1E; { Reserved (high) }
DTYPE_UNKNOWN = $1F; { Unknown or no device type }
SCSI_INQUIRY = $12;
DEF_SENSE_LEN = 16; { Default Sense Len }
{***************************************************************************}
{ Request Sense Data Format }
{***************************************************************************}
type TSenseArea = packed record
ErrorCode,
SegmentNum,
SenseKey,
InfoByte0,
InfoByte1,
InfoByte2,
InfoByte3,
AddSenLen,
ComSpecInf0,
ComSpecInf1,
ComSpecInf2,
ComSpecInf3,
AddSenseCode,
AddSenQual,
FieldRepUCode,
SenKeySpec15,
SenKeySpec16,
SenKeySpec17: Byte;
AddSenseBytes: Array[18..$20] of byte;
end;
{*****************************************************************************}
{ SRB - HOST ADAPTER INQUIRY - SC_HA_INQUIRY (0) }
{*****************************************************************************}
type
TSRB_HAInquiry = packed record
Command: BYTE;
Status: BYTE;
HaId: BYTE;
Flags: BYTE;
Hdr_Rsvd: LongInt;
HA_Count: BYTE;
HA_SCSI_ID: BYTE;
HA_ManagerId: Array[0..15] of char;
HA_Identifier: Array[0..15] of char;
HA_Unique: Array[0..15] of char;
HA_Rsvd1: Word;
end;
{******************************************************************************}
{ SRB - GET DEVICE TYPE - SC_GET_DEV_TYPE (1) }
{******************************************************************************}
type
TSRB_GDEVBlock = packed record
Command: BYTE;
Status: BYTE;
HaId: BYTE;
Flags: BYTE;
Hdr_Rsvd: LongInt;
Target: BYTE;
Lun: BYTE;
DeviceType: BYTE;
Rsvd1: BYTE;
end;
{*****************************************************************************}
{ SRB - EXECUTE SCSI COMMAND - SC_EXEC_SCSI_CMD (2) }
{*****************************************************************************}
type
TSRB_ExecSCSICmd = packed record
Command: BYTE;
Status: BYTE;
HaId: BYTE;
Flags: BYTE;
Hdr_Rsvd: LongInt;
Target: BYTE;
Lun: BYTE;
Rsvd1: Word;
BufLen: LongInt;
BufPointer: PChar;
SenseLen: BYTE;
CDBLen: BYTE;
HaStat: BYTE;
TargStat: BYTE;
PostProc: THandle;
Rsvd2: array[0..19] of byte;
CDBCmd: Byte;
CDBByte: array[1..15] of byte;
SenseArea: TSenseArea;
end;
{******************************************************************************}
{ SRB - ABORT AN SRB - SC_ABORT_SRB (3) }
{******************************************************************************}
type
TSRB_Abort = packed record
Command: BYTE;
Status: BYTE;
HaId: BYTE;
Flags: BYTE;
Hdr_Rsvd: LongInt;
ToAbort: Pointer;
end;
{*****************************************************************************}
{ SRB - BUS DEVICE RESET - SC_RESET_DEV (4) }
{*****************************************************************************}
type
SRB_BusDeviceReset = packed record
Command: BYTE;
Status: BYTE;
HaId: BYTE;
Flags: BYTE;
Hdr_Rsvd: LongInt;
Target: BYTE;
Lun: BYTE;
Rsvd1: Array[0..12-1] of BYTE;
HaStat: BYTE;
TargStat: BYTE;
PostProc: Pointer;
Rsvd2: Array[0..36-1] of BYTE;
end;
{******************************************************************************}
{ SRB - GET DISK INFORMATION - SC_GET_DISK_INFO }
{******************************************************************************}
type
TSRB_GetDiskInfo = packed record
Command: BYTE;
Status: BYTE;
HaId: BYTE;
Flags: BYTE;
Hdr_Rsvd: LongInt;
Target: BYTE;
Lun: BYTE;
DriveFlags: BYTE;
Int13HDriveInfo: BYTE;
Heads: BYTE;
Sectors: BYTE;
Rsvd1: Array[0..9] of BYTE;
end {SRB_GetDiskInfo};
{******************************************************************************}
{ SRB - RESCAN SCSI BUS(ES) ON SCSIPORT }
{******************************************************************************}
type
SRB_RescanPort = packed record
Command: BYTE;
Status: BYTE;
HaId: BYTE;
Flags: BYTE;
Hdr_Rsvd: LongInt;
end {RescanPort};
{******************************************************************************}
{ SRB - GET/SET TARGET TIMEOUTS }
{******************************************************************************}
type
TSRB_GetSetTimeouts = packed record
Command: BYTE;
Status: BYTE;
HaId: BYTE;
Flags: BYTE;
Hdr_Rsvd: LongInt;
Target: BYTE;
Lun: BYTE;
Timeout: LongInt;
end;
{******************************************************************************}
{ ASPIBUFF - Structure For Controllng I/O Buffers }
{******************************************************************************}
type
tag_ASPI32BUFF = packed record
AB_BufPointer: Pointer;
AB_BufLen: LongInt;
AB_ZeroFill: LongInt;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -