410 lines
16 KiB
C
410 lines
16 KiB
C
|
#ifndef ASPI_INCLUDED
|
||
|
#define ASPI_INCLUDED
|
||
|
|
||
|
#include <Windows.h>
|
||
|
#include <Stdio.h>
|
||
|
#include <Stdlib.h>
|
||
|
|
||
|
// Handle to the ASPI libaray
|
||
|
extern HINSTANCE hAspiLib;
|
||
|
void GetAspiError(int nErrorCode,LPSTR lpszError);
|
||
|
|
||
|
// 1 byte alignment or SCSI structures
|
||
|
#pragma pack(push,1)
|
||
|
|
||
|
#define MAX_SCSIDEVICES 16
|
||
|
|
||
|
|
||
|
#define TIMEOUT 10000
|
||
|
|
||
|
|
||
|
typedef void (*POSTPROCFUNC)();
|
||
|
|
||
|
typedef struct TOC_TAG
|
||
|
{
|
||
|
BYTE _reserved1;
|
||
|
BYTE bFlags;
|
||
|
BYTE bTrack;
|
||
|
BYTE _reserved2;
|
||
|
DWORD dwStartSector;
|
||
|
} TOC;
|
||
|
|
||
|
|
||
|
// The SRB_Flags are defined below. These flags may be OR'd together to form
|
||
|
// the final value for SRB_Flags in the SRB. Note that SRB_POSTING and
|
||
|
// SRB_EVENT_NOTIFY are mutually exclusive, as are SRB_DIR_IN and SRB_DIR_OUT. In
|
||
|
// addition, the directioin bits (SRB_DIR_IN and SRB_DIR_OUT) MUST be set
|
||
|
// correctly on commands which transfer data. Using SRB_DIR_SCSI is no longer
|
||
|
// an option as in ASPI for DOS and ASPI for Win16.
|
||
|
|
||
|
#define SRB_POSTING 0x01 // Enable ASPI command completion posting. See section on posting below.
|
||
|
#define SRB_ENABLE_RESIDUAL_COUNT 0x04 // Enables reporting of residual byte count.This flag is only significant if the host adapter reports support for residual byte count in the SC_HA_INQUIRY command. When data underrun occurs, the SRB_BufLen field is updated to reflect the remaining bytes to transfer.
|
||
|
#define SRB_DIR_IN 0x08 // Data transfer from SCSI target to host.
|
||
|
#define SRB_DIR_OUT 0x10 // Data transfer from host to SCSI target.
|
||
|
#define SRB_EVENT_NOTIFY 0x40 // Enable ASPI command event notification. See section on event notification below.
|
||
|
|
||
|
|
||
|
// Inquiry DeviceTypeCodes
|
||
|
#define DTC_DISK 0x00 // Direct-access device
|
||
|
#define DTC_TAPE 0x01 // Sequential-access device
|
||
|
#define DTC_PRINTER 0x02 // Printer device
|
||
|
#define DTC_PROCESSOR 0x03 // Processor device
|
||
|
#define DTC_WORM 0x04 // Write-once device
|
||
|
#define DTC_CDROM 0x05 // CD-ROM device
|
||
|
#define DTC_SCANNER 0x06 // Scanner device
|
||
|
#define DTC_OPTICAL 0x07 // Optical memory device
|
||
|
#define DTC_JUKEBOX 0x08 // Medium changer device
|
||
|
#define DTC_COMM 0x09 // Communications device
|
||
|
#define DTC_PREPRESS1 0x0A // Pre-press device 1
|
||
|
#define DTC_PREPRESS2 0x0B // Pre-press device 2
|
||
|
#define DTC_UNKNOWN 0x1F // Unknown or no device type
|
||
|
|
||
|
|
||
|
/***************************************************************************
|
||
|
** SRB Status
|
||
|
***************************************************************************/
|
||
|
#define SS_PENDING 0x00 /* SRB being processed */
|
||
|
#define SS_COMP 0x01 /* SRB completed without error */
|
||
|
#define SS_ABORTED 0x02 /* SRB aborted */
|
||
|
#define SS_ABORT_FAIL 0x03 /* Unable to abort SRB */
|
||
|
#define SS_ERR 0x04 /* SRB completed with error */
|
||
|
#define SS_INVALID_CMD 0x80 /* Invalid ASPI command */
|
||
|
#define SS_INVALID_HA 0x81 /* Invalid host adapter number */
|
||
|
#define SS_NO_DEVICE 0x82 /* SCSI device not installed */
|
||
|
#define SS_INVALID_SRB 0xE0 /* Invalid parameter set in SRB */
|
||
|
#define SS_OLD_MANAGER 0xE1 /* ASPI manager doesn't support */
|
||
|
/* windows */
|
||
|
#define SS_BUFFER_ALIGN 0xE1 /* Buffer not aligned (replaces */
|
||
|
/* SS_OLD_MANAGER in Win32) */
|
||
|
#define SS_ILLEGAL_MODE 0xE2 /* Unsupported Windows mode */
|
||
|
#define SS_NO_ASPI 0xE3 /* No ASPI managers */
|
||
|
#define SS_FAILED_INIT 0xE4 /* ASPI for windows failed init */
|
||
|
#define SS_ASPI_IS_BUSY 0xE5 /* No resources available to */
|
||
|
/* execute command */
|
||
|
#define SS_BUFFER_TO_BIG 0xE6 /* Buffer size too big to handle */
|
||
|
#define SS_BUFFER_TOO_BIG 0xE6 /* Correct spelling of 'too' */
|
||
|
#define SS_MISMATCHED_COMPONENTS 0xE7 /* The DLLs/EXEs of ASPI don't */
|
||
|
/* version check */
|
||
|
#define SS_NO_ADAPTERS 0xE8 /* No host adapters to manager */
|
||
|
#define SS_INSUFFICIENT_RESOURCES 0xE9 /* Couldn't allocate resources */
|
||
|
/* needed to init */
|
||
|
#define SS_ASPI_IS_SHUTDOWN 0xEA /* Call came to ASPI after */
|
||
|
/* PROCESS_DETACH */
|
||
|
#define SS_BAD_INSTALL 0xEB /* The DLL or other components */
|
||
|
/* are installed wrong */
|
||
|
|
||
|
|
||
|
// SRB defines
|
||
|
#define SC_HA_INQUIRY 0x00 // Get information about installed host adapters,including the number of installed adapters.
|
||
|
#define SC_GET_DEV_TYPE 0x01 // Get information about installed SCSI devices.
|
||
|
#define SC_EXEC_SCSI_CMD 0x02 // Execute SCSI I/O.
|
||
|
#define SC_ABORT_SRB 0x03 // Abort an outstanding I/O request.
|
||
|
#define SC_RESET_DEV 0x04 // Reset an individual SCSI target.
|
||
|
#define SC_GET_DISK_INFO 0x06 // Get information on disk type SCSI devices (not available under Windows NT).
|
||
|
#define SC_GETSET_TIMEOUTS 0x08
|
||
|
|
||
|
// MISC defines
|
||
|
#define CDSAMPLEFREQ 44100
|
||
|
#define TRACKSPERSEC 75
|
||
|
|
||
|
#define CB_CDDASECTOR 2352
|
||
|
#define CB_QSUBCHANNEL 0
|
||
|
#define CB_CDROMSECTOR 2048
|
||
|
#define CB_AUDIO (CB_CDDASECTOR-CB_QSUBCHANNEL)
|
||
|
|
||
|
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
BYTE SRB_Cmd; // ASPI command code
|
||
|
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
|
||
|
} SRB_HEADER, *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
|
||
|
DWORD SRB_Hdr_Rsvd; // Reserved, MUST = 0
|
||
|
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_Rsvd1;
|
||
|
} SRB_HAINQUIRY, *LPSRB_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; // Reserved
|
||
|
DWORD SRB_Hdr_Rsvd; // Reserved
|
||
|
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, *LPSRB_GDEVBLOCK;
|
||
|
|
||
|
|
||
|
#define SENSE_LEN 14 // Maximum sense length
|
||
|
|
||
|
|
||
|
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
|
||
|
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 Length
|
||
|
BYTE *SRB_BufPointer; // Data Buffer Point
|
||
|
BYTE SRB_SenseLen; // Sense Allocation Length
|
||
|
BYTE SRB_CDBLen; // CDB Length
|
||
|
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_EXECSCSICMD, *LPSRB_EXECSCSICMD;
|
||
|
|
||
|
|
||
|
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; // Reserved
|
||
|
DWORD SRB_Hdr_Rsvd; // Reserved
|
||
|
BYTE SRB_Target; // Target's SCSI ID
|
||
|
BYTE SRB_Lun; // Target's LUN number
|
||
|
BYTE SRB_DriveFlags; // Driver flags
|
||
|
BYTE SRB_Int13HDriveInfo;// Host Adapter Status
|
||
|
BYTE SRB_Heads; // Preferred number of heads translation
|
||
|
BYTE SRB_Sectors; // Preferred number of sectors translation
|
||
|
BYTE SRB_Rsvd1[10]; // Reserved
|
||
|
} SRB_GETDISKINFO, *LPSRB_GETDISKINFO;
|
||
|
|
||
|
|
||
|
|
||
|
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; // Reserved
|
||
|
DWORD SRB_Hdr_Rsvd; // Reserved
|
||
|
BYTE SRB_Target; // Target's SCSI ID
|
||
|
BYTE SRB_Lun; // Target's LUN number
|
||
|
BYTE SRB_Rsvd1[12]; // Reserved for Alignment
|
||
|
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, *LPSRB_BUSDEVICERESET;
|
||
|
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
BYTE SRB_Cmd; /* 00/000 ASPI cmd code == SC_ABORT_SRB */
|
||
|
BYTE SRB_Status; /* 01/001 ASPI command status byte */
|
||
|
BYTE SRB_HaID; /* 02/002 ASPI host adapter number */
|
||
|
BYTE SRB_Flags; /* 03/003 Reserved, must = 0 */
|
||
|
DWORD SRB_Hdr_Rsvd; /* 04/004 Reserved, must = 0 */
|
||
|
void *SRB_ToAbort; /* 08/008 Pointer to SRB to abort */
|
||
|
} SRB_Abort, *PSRB_Abort, FAR *LPSRB_Abort;
|
||
|
|
||
|
|
||
|
typedef unsigned char Ucbit;
|
||
|
typedef unsigned char u_char;
|
||
|
|
||
|
#define MP_P_CODE \
|
||
|
Ucbit p_code : 6; \
|
||
|
Ucbit p_res : 1; \
|
||
|
Ucbit parsave : 1
|
||
|
|
||
|
|
||
|
// CD Cap / mech status
|
||
|
typedef struct SCSICDMODEPAGE2A_TAG
|
||
|
{
|
||
|
MP_P_CODE; // parsave & pagecode (0)
|
||
|
u_char p_len; // 0x14 = 20 Bytes (1)
|
||
|
|
||
|
Ucbit cd_r_read : 1; // Reads CD-R media (2)
|
||
|
Ucbit cd_rw_read : 1; // Reads CD-RW media
|
||
|
Ucbit method2 : 1; // Reads fixed packet method2 media
|
||
|
Ucbit dvd_rom_read: 1; // Reads DVD ROM media
|
||
|
Ucbit dvd_r_read : 1; // Reads DVD-R media
|
||
|
Ucbit dvd_ram_read: 1; // Reads DVD-RAM media
|
||
|
Ucbit res_2_67 : 2; // Reserved
|
||
|
|
||
|
Ucbit cd_r_write : 1; // Supports writing CD-R media (3)
|
||
|
Ucbit cd_rw_write : 1; // Supports writing CD-RW media
|
||
|
Ucbit test_write : 1; // Supports emulation write
|
||
|
Ucbit res_3_3 : 1; // Reserved
|
||
|
Ucbit dvd_r_write : 1; // Supports writing DVD-R media
|
||
|
Ucbit dvd_ram_write: 1; // Supports writing DVD-RAM media
|
||
|
Ucbit res_3_67 : 2; // Reserved
|
||
|
|
||
|
Ucbit audio_play : 1; // Supports Audio play operation (4)
|
||
|
Ucbit composite : 1; // Deliveres composite A/V stream
|
||
|
Ucbit digital_port_2: 1; // Supports digital output on port 2
|
||
|
Ucbit digital_port_1: 1; // Supports digital output on port 1
|
||
|
Ucbit mode_2_form_1: 1; // Reads Mode-2 form 1 media (XA)
|
||
|
Ucbit mode_2_form_2: 1; // Reads Mode-2 form 2 media
|
||
|
Ucbit multi_session: 1; // Reads multi-session media
|
||
|
Ucbit res_4 : 1; // Reserved
|
||
|
|
||
|
Ucbit cd_da_supported: 1; // Reads audio data with READ CD cmd
|
||
|
Ucbit cd_da_accurate: 1; // READ CD data stream is accurate
|
||
|
Ucbit rw_supported: 1; // Reads R-W sub channel information
|
||
|
Ucbit rw_deint_cor: 1; // Reads de-interleved R-W sub chan
|
||
|
Ucbit c2_pointers : 1; // Supports C2 error pointers
|
||
|
Ucbit ISRC : 1; // Reads ISRC information
|
||
|
Ucbit UPC : 1; // Reads media catalog number (UPC)
|
||
|
Ucbit read_bar_code: 1; // Supports reading bar codes
|
||
|
|
||
|
Ucbit lock : 1; // PREVENT/ALLOW may lock media (5)
|
||
|
Ucbit lock_state : 1; // Lock state 0=unlocked 1=locked
|
||
|
Ucbit prevent_jumper: 1; // State of prev/allow jumper 0=pres
|
||
|
Ucbit eject : 1; // Ejects disc/cartr with STOP LoEj
|
||
|
Ucbit res_6_4 : 1; // Reserved
|
||
|
Ucbit loading_type: 3; // Loading mechanism type
|
||
|
|
||
|
Ucbit sep_chan_vol: 1; // Vol controls each channel separat (6)
|
||
|
Ucbit sep_chan_mute: 1; // Mute controls each channel separat
|
||
|
Ucbit disk_present_rep:1; // Changer supports disk present rep
|
||
|
Ucbit sw_slot_sel:1; // Load empty slot in changer
|
||
|
Ucbit res_7 : 4; // Reserved
|
||
|
|
||
|
BYTE ReadSpeedH; // Max. read speed in KB/s (7)
|
||
|
BYTE ReadSpeedL; // Max. read speed in KB/s (7)
|
||
|
|
||
|
u_char num_vol_levels[2]; // # of supported volume levels (9)
|
||
|
|
||
|
u_char buffer_size[2]; // Buffer size for the data in KB (11)
|
||
|
u_char cur_read_speed[2]; // Current read speed in KB/s (13)
|
||
|
u_char res_16; // Reserved (14)
|
||
|
|
||
|
Ucbit res_17_0: 1; // Reserved (15)
|
||
|
Ucbit BCK : 1; // Data valid on falling edge of BCK
|
||
|
Ucbit RCK : 1; // Set: HIGH high LRCK=left channel
|
||
|
Ucbit LSBF : 1; // Set: LSB first Clear: MSB first
|
||
|
Ucbit length : 2; // 0=32BCKs 1=16BCKs 2=24BCKs 3=24I2c
|
||
|
Ucbit res_17 : 2; // Reserved
|
||
|
|
||
|
u_char max_write_speed[2]; // Max. write speed supported in KB/s (17)
|
||
|
|
||
|
u_char cur_write_speed[2]; // Current write speed in KB/s (19)
|
||
|
|
||
|
} SCSICDMODEPAGE2A;
|
||
|
|
||
|
char *fillbytes(void *tov, int cnt, char val);
|
||
|
|
||
|
|
||
|
typedef struct SCISMODEHEADER_TAG {
|
||
|
Ucbit sense_data_len : 8;
|
||
|
u_char medium_type;
|
||
|
Ucbit res2 : 4;
|
||
|
Ucbit cache : 1;
|
||
|
Ucbit res : 2;
|
||
|
Ucbit write_prot : 1;
|
||
|
BYTE nBlockLen;
|
||
|
} SCISMODEHEADER;
|
||
|
|
||
|
typedef struct SCSIMODEHDR_6_TAG {
|
||
|
BYTE btModeDataLen; // 0
|
||
|
BYTE btMediumType; // 1
|
||
|
BYTE btDevSpecificParam; // 2
|
||
|
BYTE btBlkDescrLen; // 3
|
||
|
} SCSIMODEHDR_6;
|
||
|
|
||
|
|
||
|
typedef struct SCSIMODEHDR_10_TAG {
|
||
|
BYTE btModeDataLenH; // 0
|
||
|
BYTE btModeDataLenL; // 1
|
||
|
BYTE btMediumType; // 2
|
||
|
BYTE btDevSpecificParam; // 3
|
||
|
BYTE btReserved1; // 4
|
||
|
BYTE btReserved2; // 5
|
||
|
BYTE btBlkDescrLenH; // 6
|
||
|
BYTE btBlkDescrLenL; // 7
|
||
|
} SCSIMODEHDR_10;
|
||
|
|
||
|
typedef struct SCSIBLOCKDESCRIPTOR_TAG {
|
||
|
BYTE btDensity; // 0
|
||
|
BYTE btNumberOfBlocksH; // 1
|
||
|
BYTE btNumberOfBlocksM; // 2
|
||
|
BYTE btNumberOfBlocksL; // 3
|
||
|
BYTE btReserved; // 4
|
||
|
BYTE btBlockLenH; // 5
|
||
|
BYTE btBlockLenM; // 6
|
||
|
BYTE btBlockLenL; // 7
|
||
|
} SCSIBLOCKDESCRIPTOR;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// Error recovery Parameters
|
||
|
typedef struct SCSICDMODEPAGE1A_TAG{
|
||
|
MP_P_CODE; // 0 parsave & pagecode
|
||
|
u_char p_len; // 1 0x0A = 12 Bytes
|
||
|
Ucbit disa_correction : 1; // 2 Byte 2
|
||
|
Ucbit term_on_rec_err : 1;
|
||
|
Ucbit report_rec_err : 1;
|
||
|
Ucbit en_early_corr : 1;
|
||
|
Ucbit read_continuous : 1;
|
||
|
Ucbit tranfer_block : 1;
|
||
|
Ucbit en_auto_reall_r : 1;
|
||
|
Ucbit en_auto_reall_w : 1;
|
||
|
u_char rd_retry_count; // 3 Byte 3
|
||
|
u_char correction_span; // 4
|
||
|
char head_offset_count; // 5
|
||
|
char data_strobe_offset; // 6
|
||
|
u_char res; // 7
|
||
|
u_char wr_retry_count; // 8
|
||
|
u_char res_tape[2]; // 9
|
||
|
u_char recov_timelim[2]; // 11
|
||
|
} SCSICDMODEPAGE1A;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
BYTE SRB_Cmd; // ASPI command code = SC_GETSET_TIMEOUTS
|
||
|
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
|
||
|
BYTE SRB_Target; // Target's SCSI ID
|
||
|
BYTE SRB_Lun; // Target's LUN number
|
||
|
DWORD SRB_Timeout; // Timeout in half seconds
|
||
|
}
|
||
|
SRB_GetSetTimeouts, *PSRB_GetSetTimeouts;
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
LPBYTE AB_BufPointer; // Pointer to the ASPI allocated buffer
|
||
|
DWORD AB_BufLen; // Length in bytes of the buffer
|
||
|
DWORD AB_ZeroFill; // Flag set to 1 if buffer should be zeroed
|
||
|
DWORD AB_Reserved; // Reserved, MUST = 0
|
||
|
}
|
||
|
ASPI32BUFF, *PASPI32BUFF;
|
||
|
|
||
|
#pragma pack(pop)
|
||
|
|
||
|
#endif
|