3 * @copy 2012 MinGW.org project
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
26 #pragma GCC system_header
30 * Media changer IOCTL interface.
40 #define DD_CHANGER_DEVICE_NAME "\\Device\\Changer"
41 #define DD_CHANGER_DEVICE_NAME_U L"\\Device\\Changer"
43 #define IOCTL_CHANGER_BASE FILE_DEVICE_CHANGER
45 #define IOCTL_CHANGER_EXCHANGE_MEDIUM \
46 CTL_CODE(IOCTL_CHANGER_BASE, 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS)
48 #define IOCTL_CHANGER_GET_ELEMENT_STATUS \
49 CTL_CODE(IOCTL_CHANGER_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
51 #define IOCTL_CHANGER_GET_PARAMETERS \
52 CTL_CODE(IOCTL_CHANGER_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS)
54 #define IOCTL_CHANGER_GET_PRODUCT_DATA \
55 CTL_CODE(IOCTL_CHANGER_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
57 #define IOCTL_CHANGER_GET_STATUS \
58 CTL_CODE(IOCTL_CHANGER_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
60 #define IOCTL_CHANGER_INITIALIZE_ELEMENT_STATUS \
61 CTL_CODE(IOCTL_CHANGER_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS)
63 #define IOCTL_CHANGER_MOVE_MEDIUM \
64 CTL_CODE(IOCTL_CHANGER_BASE, 0x0009, METHOD_BUFFERED, FILE_READ_ACCESS)
66 #define IOCTL_CHANGER_QUERY_VOLUME_TAGS \
67 CTL_CODE(IOCTL_CHANGER_BASE, 0x000B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
69 #define IOCTL_CHANGER_REINITIALIZE_TRANSPORT \
70 CTL_CODE(IOCTL_CHANGER_BASE, 0x000A, METHOD_BUFFERED, FILE_READ_ACCESS)
72 #define IOCTL_CHANGER_SET_ACCESS \
73 CTL_CODE(IOCTL_CHANGER_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
75 #define IOCTL_CHANGER_SET_POSITION \
76 CTL_CODE(IOCTL_CHANGER_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS)
79 #define MAX_VOLUME_ID_SIZE 36
80 #define MAX_VOLUME_TEMPLATE_SIZE 40
82 typedef enum _ELEMENT_TYPE {
91 } ELEMENT_TYPE, *PELEMENT_TYPE;
93 typedef struct _CHANGER_ELEMENT {
94 ELEMENT_TYPE ElementType;
96 } CHANGER_ELEMENT, *PCHANGER_ELEMENT;
98 typedef struct _CHANGER_ELEMENT_LIST {
99 CHANGER_ELEMENT Element;
100 ULONG NumberOfElements;
101 } CHANGER_ELEMENT_LIST, *PCHANGER_ELEMENT_LIST;
103 typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS {
104 CHANGER_ELEMENT_LIST ElementList;
106 } CHANGER_INITIALIZE_ELEMENT_STATUS, *PCHANGER_INITIALIZE_ELEMENT_STATUS;
108 typedef struct _CHANGER_READ_ELEMENT_STATUS {
109 CHANGER_ELEMENT_LIST ElementList;
110 BOOLEAN VolumeTagInfo;
111 } CHANGER_READ_ELEMENT_STATUS, *PCHANGER_READ_ELEMENT_STATUS;
114 typedef struct _CHANGER_SET_POSITION {
115 CHANGER_ELEMENT Transport;
116 CHANGER_ELEMENT Destination;
118 } CHANGER_SET_POSITION, *PCHANGER_SET_POSITION;
120 typedef struct _CHANGER_EXCHANGE_MEDIUM {
121 CHANGER_ELEMENT Transport;
122 CHANGER_ELEMENT Source;
123 CHANGER_ELEMENT Destination1;
124 CHANGER_ELEMENT Destination2;
127 } CHANGER_EXCHANGE_MEDIUM, *PCHANGER_EXCHANGE_MEDIUM;
129 typedef struct _CHANGER_MOVE_MEDIUM {
130 CHANGER_ELEMENT Transport;
131 CHANGER_ELEMENT Source;
132 CHANGER_ELEMENT Destination;
134 } CHANGER_MOVE_MEDIUM, *PCHANGER_MOVE_MEDIUM;
136 #define VENDOR_ID_LENGTH 8
137 #define PRODUCT_ID_LENGTH 16
138 #define REVISION_LENGTH 4
139 #define SERIAL_NUMBER_LENGTH 32
141 typedef struct _CHANGER_PRODUCT_DATA {
142 UCHAR VendorId[VENDOR_ID_LENGTH];
143 UCHAR ProductId[PRODUCT_ID_LENGTH];
144 UCHAR Revision[REVISION_LENGTH];
145 UCHAR SerialNumber[SERIAL_NUMBER_LENGTH];
147 } CHANGER_PRODUCT_DATA, *PCHANGER_PRODUCT_DATA;
149 /* CHANGER_SET_ACCESS.Control constants */
150 #define LOCK_ELEMENT 0
151 #define UNLOCK_ELEMENT 1
152 #define EXTEND_IEPORT 2
153 #define RETRACT_IEPORT 3
155 typedef struct _CHANGER_SET_ACCESS {
156 CHANGER_ELEMENT Element;
158 } CHANGER_SET_ACCESS, *PCHANGER_SET_ACCESS;
161 typedef enum _CHANGER_DEVICE_PROBLEM_TYPE {
163 DeviceProblemHardware,
164 DeviceProblemCHMError,
165 DeviceProblemDoorOpen,
166 DeviceProblemCalibrationError,
167 DeviceProblemTargetFailure,
168 DeviceProblemCHMMoveError,
169 DeviceProblemCHMZeroError,
170 DeviceProblemCartridgeInsertError,
171 DeviceProblemPositionError,
172 DeviceProblemSensorError,
173 DeviceProblemCartridgeEjectError,
174 DeviceProblemGripperError,
175 DeviceProblemDriveError
176 } CHANGER_DEVICE_PROBLEM_TYPE, *PCHANGER_DEVICE_PROBLEM_TYPE;
178 /* CHANGER_ELEMENT_STATUS(_EX).Flags constants */
179 #define ELEMENT_STATUS_FULL 0x00000001
180 #define ELEMENT_STATUS_IMPEXP 0x00000002
181 #define ELEMENT_STATUS_EXCEPT 0x00000004
182 #define ELEMENT_STATUS_ACCESS 0x00000008
183 #define ELEMENT_STATUS_EXENAB 0x00000010
184 #define ELEMENT_STATUS_INENAB 0x00000020
185 #define ELEMENT_STATUS_PRODUCT_DATA 0x00000040
186 #define ELEMENT_STATUS_LUN_VALID 0x00001000
187 #define ELEMENT_STATUS_ID_VALID 0x00002000
188 #define ELEMENT_STATUS_NOT_BUS 0x00008000
189 #define ELEMENT_STATUS_INVERT 0x00400000
190 #define ELEMENT_STATUS_SVALID 0x00800000
191 #define ELEMENT_STATUS_PVOLTAG 0x10000000
192 #define ELEMENT_STATUS_AVOLTAG 0x20000000
194 /* CHANGER_ELEMENT_STATUS(_EX).ExceptionCode constants */
195 #define ERROR_LABEL_UNREADABLE 0x00000001
196 #define ERROR_LABEL_QUESTIONABLE 0x00000002
197 #define ERROR_SLOT_NOT_PRESENT 0x00000004
198 #define ERROR_DRIVE_NOT_INSTALLED 0x00000008
199 #define ERROR_TRAY_MALFUNCTION 0x00000010
200 #define ERROR_INIT_STATUS_NEEDED 0x00000011
201 #define ERROR_UNHANDLED_ERROR 0xFFFFFFFF
203 typedef struct _CHANGER_ELEMENT_STATUS {
204 CHANGER_ELEMENT Element;
205 CHANGER_ELEMENT SrcElementAddress;
211 UCHAR PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
212 UCHAR AlternateVolumeID[MAX_VOLUME_ID_SIZE];
213 } CHANGER_ELEMENT_STATUS, *PCHANGER_ELEMENT_STATUS;
215 typedef struct _CHANGER_ELEMENT_STATUS_EX {
216 CHANGER_ELEMENT Element;
217 CHANGER_ELEMENT SrcElementAddress;
223 UCHAR PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
224 UCHAR AlternateVolumeID[MAX_VOLUME_ID_SIZE];
225 UCHAR VendorIdentification[VENDOR_ID_LENGTH];
226 UCHAR ProductIdentification[PRODUCT_ID_LENGTH];
227 UCHAR SerialNumber[SERIAL_NUMBER_LENGTH];
228 } CHANGER_ELEMENT_STATUS_EX, *PCHANGER_ELEMENT_STATUS_EX;
230 /* CHANGER_SEND_VOLUME_TAG_INFORMATION.ActionCode constants */
231 #define SEARCH_ALL 0x0
232 #define SEARCH_PRIMARY 0x1
233 #define SEARCH_ALTERNATE 0x2
234 #define SEARCH_ALL_NO_SEQ 0x4
235 #define SEARCH_PRI_NO_SEQ 0x5
236 #define SEARCH_ALT_NO_SEQ 0x6
237 #define ASSERT_PRIMARY 0x8
238 #define ASSERT_ALTERNATE 0x9
239 #define REPLACE_PRIMARY 0xA
240 #define REPLACE_ALTERNATE 0xB
241 #define UNDEFINE_PRIMARY 0xC
242 #define UNDEFINE_ALTERNATE 0xD
244 typedef struct _CHANGER_SEND_VOLUME_TAG_INFORMATION {
245 CHANGER_ELEMENT StartingElement;
247 UCHAR VolumeIDTemplate[MAX_VOLUME_TEMPLATE_SIZE];
248 } CHANGER_SEND_VOLUME_TAG_INFORMATION, *PCHANGER_SEND_VOLUME_TAG_INFORMATION;
250 /* GET_CHANGER_PARAMETERS.Features0 constants */
251 #define CHANGER_BAR_CODE_SCANNER_INSTALLED 0x00000001
252 #define CHANGER_INIT_ELEM_STAT_WITH_RANGE 0x00000002
253 #define CHANGER_CLOSE_IEPORT 0x00000004
254 #define CHANGER_OPEN_IEPORT 0x00000008
255 #define CHANGER_STATUS_NON_VOLATILE 0x00000010
256 #define CHANGER_EXCHANGE_MEDIA 0x00000020
257 #define CHANGER_CLEANER_SLOT 0x00000040
258 #define CHANGER_LOCK_UNLOCK 0x00000080
259 #define CHANGER_CARTRIDGE_MAGAZINE 0x00000100
260 #define CHANGER_MEDIUM_FLIP 0x00000200
261 #define CHANGER_POSITION_TO_ELEMENT 0x00000400
262 #define CHANGER_REPORT_IEPORT_STATE 0x00000800
263 #define CHANGER_STORAGE_DRIVE 0x00001000
264 #define CHANGER_STORAGE_IEPORT 0x00002000
265 #define CHANGER_STORAGE_SLOT 0x00004000
266 #define CHANGER_STORAGE_TRANSPORT 0x00008000
267 #define CHANGER_DRIVE_CLEANING_REQUIRED 0x00010000
268 #define CHANGER_PREDISMOUNT_EJECT_REQUIRED 0x00020000
269 #define CHANGER_CLEANER_ACCESS_NOT_VALID 0x00040000
270 #define CHANGER_PREMOUNT_EJECT_REQUIRED 0x00080000
271 #define CHANGER_VOLUME_IDENTIFICATION 0x00100000
272 #define CHANGER_VOLUME_SEARCH 0x00200000
273 #define CHANGER_VOLUME_ASSERT 0x00400000
274 #define CHANGER_VOLUME_REPLACE 0x00800000
275 #define CHANGER_VOLUME_UNDEFINE 0x01000000
276 #define CHANGER_SERIAL_NUMBER_VALID 0x04000000
277 #define CHANGER_DEVICE_REINITIALIZE_CAPABLE 0x08000000
278 #define CHANGER_KEYPAD_ENABLE_DISABLE 0x10000000
279 #define CHANGER_DRIVE_EMPTY_ON_DOOR_ACCESS 0x20000000
280 #define CHANGER_RESERVED_BIT 0x80000000
282 /* GET_CHANGER_PARAMETERS.Features1 constants */
283 #define CHANGER_PREDISMOUNT_ALIGN_TO_SLOT 0x80000001
284 #define CHANGER_PREDISMOUNT_ALIGN_TO_DRIVE 0x80000002
285 #define CHANGER_CLEANER_AUTODISMOUNT 0x80000004
286 #define CHANGER_TRUE_EXCHANGE_CAPABLE 0x80000008
287 #define CHANGER_SLOTS_USE_TRAYS 0x80000010
288 #define CHANGER_RTN_MEDIA_TO_ORIGINAL_ADDR 0x80000020
289 #define CHANGER_CLEANER_OPS_NOT_SUPPORTED 0x80000040
290 #define CHANGER_IEPORT_USER_CONTROL_OPEN 0x80000080
291 #define CHANGER_IEPORT_USER_CONTROL_CLOSE 0x80000100
292 #define CHANGER_MOVE_EXTENDS_IEPORT 0x80000200
293 #define CHANGER_MOVE_RETRACTS_IEPORT 0x80000400
295 /* GET_CHANGER_PARAMETERS.MoveFrom,ExchangeFrom,PositionCapabilities constants */
296 #define CHANGER_TO_TRANSPORT 0x01
297 #define CHANGER_TO_SLOT 0x02
298 #define CHANGER_TO_IEPORT 0x04
299 #define CHANGER_TO_DRIVE 0x08
301 /* GET_CHANGER_PARAMETERS.LockUnlockCapabilities constants */
302 #define LOCK_UNLOCK_IEPORT 0x01
303 #define LOCK_UNLOCK_DOOR 0x02
304 #define LOCK_UNLOCK_KEYPAD 0x04
306 typedef struct _GET_CHANGER_PARAMETERS {
308 USHORT NumberTransportElements;
309 USHORT NumberStorageElements;
310 USHORT NumberCleanerSlots;
311 USHORT NumberIEElements;
312 USHORT NumberDataTransferElements;
313 USHORT NumberOfDoors;
314 USHORT FirstSlotNumber;
315 USHORT FirstDriveNumber;
316 USHORT FirstTransportNumber;
317 USHORT FirstIEPortNumber;
318 USHORT FirstCleanerSlotAddress;
320 ULONG DriveCleanTimeout;
323 UCHAR MoveFromTransport;
325 UCHAR MoveFromIePort;
327 UCHAR ExchangeFromTransport;
328 UCHAR ExchangeFromSlot;
329 UCHAR ExchangeFromIePort;
330 UCHAR ExchangeFromDrive;
331 UCHAR LockUnlockCapabilities;
332 UCHAR PositionCapabilities;
335 } GET_CHANGER_PARAMETERS, * PGET_CHANGER_PARAMETERS;
337 typedef struct READ_ELEMENT_ADDRESS_INFO {
338 ULONG NumberOfElements;
339 CHANGER_ELEMENT_STATUS ElementStatus[1];
340 } READ_ELEMENT_ADDRESS_INFO, *PREAD_ELEMENT_ADDRESS_INFO;
342 typedef struct _TAPE_WMI_OPERATIONS {
344 ULONG DataBufferSize;
346 } TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS;
348 typedef struct _WMI_CHANGER_PROBLEM_DEVICE_ERROR {
349 ULONG ChangerProblemType;
350 } WMI_CHANGER_PROBLEM_DEVICE_ERROR, *PWMI_CHANGER_PROBLEM_DEVICE_ERROR;
356 #endif /* __NTDDCHGR_H */