/*------------------------------------------------------------------------------ winaspi.h ------------------------------------------------------------------------------*/ #define SS_PENDING 0x00 // SCSI request is in progress. #define SS_COMP 0x01 // SCSI Request Completed Without Error #define SS_ABORTED 0x02 // SCSI command has been aborted. #define SS_ERR 0x04 // SCSI command has completed with an error. #define SS_INVALID_SRB 0xE0 // One or more parameters in the SCSI Request Block // (SRB) are set incorrectly. #define SS_OLD_MANAGER 0xE1 // One or more ASPI for DOS managers are loaded which // do not support ASPI for Win16. #define SS_ILLEGAL_MODE 0xE2 // This ASPI manager does not support this mode of // Windows. You typically see this error code when // running Windows in Real Mode. #define SS_NO_ASPI 0xE3 // No ASPI managers are loaded. This typically occurs // when a DOS ASPI manager is not resident in memory. #define SS_FAILED_INIT 0xE4 // For some reason, other than SS_OLD_MANAGER, // SS_ILLEGAL_MODE or SS_NO_ASPI, ASPI for Win16 // could not properly initialize itself. This may be // caused by a lack of system resources. #define SS_ASPI_IS_BUSY 0xE5 // The ASPI manager cannot handle the request at this // time. This error generally occurs if the ASPI // manager is already using up all of his resources // to execute other requests. Try resending the // command later. #define SS_BUFFER_TO_BIG 0xE6 // The ASPI manager cannot handle the given transfer #define SS_INVALID_HA 0x81 // Invalid Host Adapter Number #define SS_NO_DEVICE 0x82 // SCSI Device Not Installed #define HASTAT_OK 0x00 // Host adapter did not detect an error #define HASTAT_SEL_TO 0x11 // Selection time-out #define HASTAT_DO_DU 0x12 // Data overrun/underrun #define HASTAT_BUS_FREE 0x13 // Unexpected Bus Free #define HASTAT_PHASE_ERR 0x14 // Target Bus phase sequence failure #define STATUS_GOOD 0x00 // No target status #define STATUS_CHKCOND 0x02 // Check status (sense data is in SenseArea) #define STATUS_BUSY 0x08 // Specified Target/LUN is busy #define STATUS_RESCONF 0x18 // Reservation conflict #define SENSE_LEN 14 #define SC_HA_INQUIRY 0x00 #define SC_GET_DEV_TYPE 0x01 #define SC_EXEC_SCSI_CMD 0x02 #define SC_ABORT_SRB 0x03 #define SC_RESET_DEV 0x04 #define SRBF_POSTING 0x01 #define SRBF_LINKED 0x02 #define SRBF_NOLENCHECK 0x00 // direction ctrled by SCSI cmd #define SRBF_READ 0x08 // xfer to host, length checked #define SRBF_WRITE 0x10 // xfer to target, length checked #define SRBF_NOXFER 0x18 // no data transfer #define SRB_EVENT_NOTIFY 0x40 /* typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD; */ typedef unsigned char * LPSRB; typedef struct { BYTE SRB_Cmd; // ASPI command code = SC_HA_INQUIRY BYTE SRB_Status; // ASPI command status byte BYTE SRB_HaId; // ASPI host adapter number BYTE SRB_Flags; // ASPI request flags WORD SRB_55AASignature; // Extended signature bytes WORD SRB_ExtBufferSize; // Extended buffer length BYTE HA_Count; // Number of host adapters present BYTE HA_SCSI_ID; // SCSI ID of host adapter BYTE HA_ManagerId[16]; // String describing the manager BYTE HA_Identifier[16]; // String describing the host adapter BYTE HA_Unique[16]; // Host Adapter Unique parameters WORD HA_ExtBuffer; // Extended buffer area } SRB_HAInquiry; typedef struct { BYTE SRB_Cmd; // ASPI command code = SC_GET_DEV_TYPE BYTE SRB_Status; // ASPI command status byte BYTE SRB_HaId; // ASPI host adapter number BYTE SRB_Flags; // ASPI request flags DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0 BYTE SRB_Target; // Target's SCSI ID BYTE SRB_Lun; // Target's LUN number BYTE SRB_DeviceType; // Target's peripheral device type BYTE SRB_Rsvd1; // Reserved for alignment } SRB_GDEVBlock; typedef struct { // Structure for 6-byte CDBs BYTE SRB_Cmd; // ASPI command code = SC_EXEC_SCSI_CMD BYTE SRB_Status; // ASPI command status byte BYTE SRB_HaId; // ASPI host adapter number BYTE SRB_Flags; // ASPI request flags DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0 BYTE SRB_Target; // Target's SCSI ID BYTE SRB_Lun; // Target's LUN number WORD SRB_Rsvd1; // Reserved for Alignment DWORD SRB_BufLen; // Data Allocation LengthPG BYTE *SRB_BufPointer; // Data Buffer Pointer BYTE SRB_SenseLen; // Sense Allocation Length BYTE SRB_CDBLen; // CDB Length = 6 BYTE SRB_HaStat; // Host Adapter Status BYTE SRB_TargStat; // Target Status void (*SRB_PostProc)(); // Post routine void *SRB_Rsvd2; // Reserved BYTE SRB_Rsvd3[16]; // Reserved for expansion BYTE CDBByte[16]; // SCSI CDB BYTE SenseArea[SENSE_LEN+2]; // Request Sense buffer } SRB_ExecSCSICmd6; typedef struct { // Structure for 10-byte CDBs BYTE SRB_Cmd; // ASPI command code = SC_EXEC_SCSI_CMD BYTE SRB_Status; // ASPI command status byte BYTE SRB_HaId; // ASPI host adapter number BYTE SRB_Flags; // ASPI request flags DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0 BYTE SRB_Target; // Target's SCSI ID BYTE SRB_Lun; // Target's LUN number WORD SRB_Rsvd1; // Reserved, MUST = 0 DWORD SRB_BufLen; // Data Allocation Length BYTE *SRB_BufPointer; // Data Buffer Pointer BYTE SRB_SenseLen; // Sense Allocation Length BYTE SRB_CDBLen; // CDB Length = 10 BYTE SRB_HaStat; // Host Adapter Status BYTE SRB_TargStat; // Target Status void (*SRB_PostProc)(); // Post routine void *SRB_Rsvd2; // Reserved BYTE SRB_Rsvd3[16]; // Reserved for expansion BYTE CDBByte[16]; // SCSI CDB BYTE SenseArea10[SENSE_LEN+2]; // Request Sense buffer } SRB_ExecSCSICmd10; typedef struct { BYTE SRB_Cmd; // ASPI command code = SC_EXEC_SCSI_CMD BYTE SRB_Status; // ASPI command status byte BYTE SRB_HaId; // ASPI host adapter number BYTE SRB_Flags; // ASPI request flags DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0 BYTE SRB_Target; // Target's SCSI ID BYTE SRB_Lun; // Target's LUN number WORD SRB_Rsvd1; // Reserved, MUST = 0 DWORD SRB_BufLen; // Data Allocation Length BYTE *SRB_BufPointer; // Data Buffer Pointer BYTE SRB_SenseLen; // Sense Allocation Length BYTE SRB_CDBLen; // CDB Length = 10 BYTE SRB_HaStat; // Host Adapter Status BYTE SRB_TargStat; // Target Status void (*SRB_PostProc)(); // Post routine void *SRB_Rsvd2; // Reserved BYTE SRB_Rsvd3[16]; // Reserved for expansion BYTE CDBByte[16]; // SCSI CDB BYTE SenseArea12[SENSE_LEN+2]; // Request Sense buffer } SRB_ExecSCSICmd12; typedef struct { BYTE SRB_Cmd; // ASPI command code = SC_ABORT_SRB BYTE SRB_Status; // ASPI command status byte BYTE SRB_HaId; // ASPI host adapter number BYTE SRB_Flags; // ASPI request flags DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0 void *SRB_ToAbort; // Pointer to SRB to abort } SRB_Abort; typedef struct { BYTE SRB_Cmd; // ASPI command code = SC_RESET_DEV BYTE SRB_Status; // ASPI command status byte BYTE SRB_HaId; // ASPI host adapter number BYTE SRB_Flags; // ASPI request flags DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0 BYTE SRB_Target; // Target's SCSI ID BYTE SRB_Lun; // Target's LUN number BYTE SRB_ResetRsvd1[12]; // Reserved, MUST = 0 BYTE SRB_HaStat; // Host Adapter Status BYTE SRB_TargStat; // Target Status void *SRB_PostProc; // Post routine void *SRB_Rsvd2; // Reserved BYTE SRB_Rsvd3[32]; // Reserved } SRB_BusDeviceReset; typedef struct { BYTE res0; BYTE TRACK_adr_contrl; BYTE TRACK_nr; BYTE res1; DWORD TRACK_abs_adr; } TRACK; typedef struct { WORD TOC_len; BYTE TOC_first; BYTE TOC_last; TRACK track[99]; } TOC; void ASPIPostProc6 (SRB_ExecSCSICmd6 *DoneSRB); void ASPIPostProc10 (SRB_ExecSCSICmd10 *DoneSRB); void ASPIPostProc12 (SRB_ExecSCSICmd12 *DoneSRB);