1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
|
#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
|