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
|
/*
* minitape.h
*
* Minitape driver interface
*
* This file is part of the w32api package.
*
* Contributors:
* Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
*
* THIS SOFTWARE IS NOT COPYRIGHTED
*
* This source code is offered for use in the public domain. You may
* use, modify or distribute it freely.
*
* This code is distributed in the hope that it will be useful but
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
* DISCLAIMED. This includes but is not limited to warranties of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
*/
#ifndef __MINITAPE_H
#define __MINITAPE_H
#if __GNUC__ >=3
#pragma GCC system_header
#endif
#ifdef __cplusplus
extern "C" {
#endif
#pragma pack(push,4)
#include "ntddk.h"
#define MEDIA_ERASEABLE 0x00000001
#define MEDIA_WRITE_ONCE 0x00000002
#define MEDIA_READ_ONLY 0x00000004
#define MEDIA_READ_WRITE 0x00000008
#define MEDIA_WRITE_PROTECTED 0x00000100
#define MEDIA_CURRENTLY_MOUNTED 0x80000000
typedef enum _TAPE_STATUS {
TAPE_STATUS_SEND_SRB_AND_CALLBACK,
TAPE_STATUS_CALLBACK,
TAPE_STATUS_CHECK_TEST_UNIT_READY,
TAPE_STATUS_SUCCESS,
TAPE_STATUS_INSUFFICIENT_RESOURCES,
TAPE_STATUS_NOT_IMPLEMENTED,
TAPE_STATUS_INVALID_DEVICE_REQUEST,
TAPE_STATUS_INVALID_PARAMETER,
TAPE_STATUS_MEDIA_CHANGED,
TAPE_STATUS_BUS_RESET,
TAPE_STATUS_SETMARK_DETECTED,
TAPE_STATUS_FILEMARK_DETECTED,
TAPE_STATUS_BEGINNING_OF_MEDIA,
TAPE_STATUS_END_OF_MEDIA,
TAPE_STATUS_BUFFER_OVERFLOW,
TAPE_STATUS_NO_DATA_DETECTED,
TAPE_STATUS_EOM_OVERFLOW,
TAPE_STATUS_NO_MEDIA,
TAPE_STATUS_IO_DEVICE_ERROR,
TAPE_STATUS_UNRECOGNIZED_MEDIA,
TAPE_STATUS_DEVICE_NOT_READY,
TAPE_STATUS_MEDIA_WRITE_PROTECTED,
TAPE_STATUS_DEVICE_DATA_ERROR,
TAPE_STATUS_NO_SUCH_DEVICE,
TAPE_STATUS_INVALID_BLOCK_LENGTH,
TAPE_STATUS_IO_TIMEOUT,
TAPE_STATUS_DEVICE_NOT_CONNECTED,
TAPE_STATUS_DATA_OVERRUN,
TAPE_STATUS_DEVICE_BUSY,
TAPE_STATUS_REQUIRES_CLEANING,
TAPE_STATUS_CLEANER_CARTRIDGE_INSTALLED
} TAPE_STATUS, *PTAPE_STATUS;
#define INQUIRYDATABUFFERSIZE 36
#ifndef _INQUIRYDATA_DEFINED /* also in scsi.h */
#define _INQUIRYDATA_DEFINED
typedef struct _INQUIRYDATA {
UCHAR DeviceType : 5;
UCHAR DeviceTypeQualifier : 3;
UCHAR DeviceTypeModifier : 7;
UCHAR RemovableMedia : 1;
union {
UCHAR Versions;
struct {
UCHAR ANSIVersion : 3;
UCHAR ECMAVersion : 3;
UCHAR ISOVersion : 2;
};
};
UCHAR ResponseDataFormat : 4;
UCHAR HiSupport : 1;
UCHAR NormACA : 1;
UCHAR TerminateTask : 1;
UCHAR AERC : 1;
UCHAR AdditionalLength;
UCHAR Reserved;
UCHAR Addr16 : 1;
UCHAR Addr32 : 1;
UCHAR AckReqQ: 1;
UCHAR MediumChanger : 1;
UCHAR MultiPort : 1;
UCHAR ReservedBit2 : 1;
UCHAR EnclosureServices : 1;
UCHAR ReservedBit3 : 1;
UCHAR SoftReset : 1;
UCHAR CommandQueue : 1;
UCHAR TransferDisable : 1;
UCHAR LinkedCommands : 1;
UCHAR Synchronous : 1;
UCHAR Wide16Bit : 1;
UCHAR Wide32Bit : 1;
UCHAR RelativeAddressing : 1;
UCHAR VendorId[8];
UCHAR ProductId[16];
UCHAR ProductRevisionLevel[4];
UCHAR VendorSpecific[20];
UCHAR Reserved3[40];
} INQUIRYDATA, *PINQUIRYDATA;
#endif
typedef struct _MODE_CAPABILITIES_PAGE {
UCHAR PageCode : 6;
UCHAR Reserved1 : 2;
UCHAR PageLength;
UCHAR Reserved2[2];
UCHAR RO : 1;
UCHAR Reserved3 : 4;
UCHAR SPREV : 1;
UCHAR Reserved4 : 2;
UCHAR Reserved5 : 3;
UCHAR EFMT : 1;
UCHAR Reserved6 : 1;
UCHAR QFA : 1;
UCHAR Reserved7 : 2;
UCHAR LOCK : 1;
UCHAR LOCKED : 1;
UCHAR PREVENT : 1;
UCHAR UNLOAD : 1;
UCHAR Reserved8 : 2;
UCHAR ECC : 1;
UCHAR CMPRS : 1;
UCHAR Reserved9 : 1;
UCHAR BLK512 : 1;
UCHAR BLK1024 : 1;
UCHAR Reserved10 : 4;
UCHAR SLOWB : 1;
UCHAR MaximumSpeedSupported[2];
UCHAR MaximumStoredDefectedListEntries[2];
UCHAR ContinuousTransferLimit[2];
UCHAR CurrentSpeedSelected[2];
UCHAR BufferSize[2];
UCHAR Reserved11[2];
} MODE_CAPABILITIES_PAGE, *PMODE_CAPABILITIES_PAGE;
typedef BOOLEAN DDKAPI
(*TAPE_VERIFY_INQUIRY_ROUTINE)(
/*IN*/ PINQUIRYDATA InquiryData,
/*IN*/ PMODE_CAPABILITIES_PAGE ModeCapabilitiesPage);
typedef VOID DDKAPI
(*TAPE_EXTENSION_INIT_ROUTINE)(
/*IN*/ PVOID MinitapeExtension,
/*IN*/ PINQUIRYDATA InquiryData,
/*IN*/ PMODE_CAPABILITIES_PAGE ModeCapabilitiesPage);
typedef VOID DDKAPI
(*TAPE_ERROR_ROUTINE)(
/*IN*/ PVOID MinitapeExtension,
/*IN*/ PSCSI_REQUEST_BLOCK Srb,
/*IN OUT*/ PTAPE_STATUS TapeStatus);
typedef TAPE_STATUS DDKAPI
(*TAPE_PROCESS_COMMAND_ROUTINE)(
/*IN OUT*/ PVOID MinitapeExtension,
/*IN OUT*/ PVOID CommandExtension,
/*IN OUT*/ PVOID CommandParameters,
/*IN OUT*/ PSCSI_REQUEST_BLOCK Srb,
/*IN*/ ULONG CallNumber,
/*IN*/ TAPE_STATUS StatusOfLastCommand,
/*IN OUT*/ PULONG RetryFlags);
#define TAPE_RETRY_MASK 0x0000FFFF
#define IGNORE_ERRORS 0x00010000
#define RETURN_ERRORS 0x00020000
typedef struct _TAPE_INIT_DATA {
TAPE_VERIFY_INQUIRY_ROUTINE VerifyInquiry;
BOOLEAN QueryModeCapabilitiesPage;
ULONG MinitapeExtensionSize;
TAPE_EXTENSION_INIT_ROUTINE ExtensionInit;
ULONG DefaultTimeOutValue;
TAPE_ERROR_ROUTINE TapeError;
ULONG CommandExtensionSize;
TAPE_PROCESS_COMMAND_ROUTINE CreatePartition;
TAPE_PROCESS_COMMAND_ROUTINE Erase;
TAPE_PROCESS_COMMAND_ROUTINE GetDriveParameters;
TAPE_PROCESS_COMMAND_ROUTINE GetMediaParameters;
TAPE_PROCESS_COMMAND_ROUTINE GetPosition;
TAPE_PROCESS_COMMAND_ROUTINE GetStatus;
TAPE_PROCESS_COMMAND_ROUTINE Prepare;
TAPE_PROCESS_COMMAND_ROUTINE SetDriveParameters;
TAPE_PROCESS_COMMAND_ROUTINE SetMediaParameters;
TAPE_PROCESS_COMMAND_ROUTINE SetPosition;
TAPE_PROCESS_COMMAND_ROUTINE WriteMarks;
TAPE_PROCESS_COMMAND_ROUTINE PreProcessReadWrite /* OPTIONAL */;
} TAPE_INIT_DATA, *PTAPE_INIT_DATA;
typedef struct _TAPE_PHYS_POSITION {
ULONG SeekBlockAddress;
ULONG SpaceBlockCount;
} TAPE_PHYS_POSITION, PTAPE_PHYS_POSITION;
#pragma pack(pop)
#ifdef __cplusplus
}
#endif
#endif /* __MINITAPE_H */
|