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.
24 /* Created by Casper S. Hornstrup <chorns@users.sourceforge.net> */
27 #pragma GCC system_header
31 * Media changer IOCTL interface.
41 #define DD_CHANGER_DEVICE_NAME "\\Device\\Changer"
42 #define DD_CHANGER_DEVICE_NAME_U L"\\Device\\Changer"
44 #define IOCTL_CHANGER_BASE FILE_DEVICE_CHANGER
46 #define IOCTL_CHANGER_EXCHANGE_MEDIUM \
47 CTL_CODE(IOCTL_CHANGER_BASE, 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS)
49 #define IOCTL_CHANGER_GET_ELEMENT_STATUS \
50 CTL_CODE(IOCTL_CHANGER_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
52 #define IOCTL_CHANGER_GET_PARAMETERS \
53 CTL_CODE(IOCTL_CHANGER_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS)
55 #define IOCTL_CHANGER_GET_PRODUCT_DATA \
56 CTL_CODE(IOCTL_CHANGER_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
58 #define IOCTL_CHANGER_GET_STATUS \
59 CTL_CODE(IOCTL_CHANGER_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
61 #define IOCTL_CHANGER_INITIALIZE_ELEMENT_STATUS \
62 CTL_CODE(IOCTL_CHANGER_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS)
64 #define IOCTL_CHANGER_MOVE_MEDIUM \
65 CTL_CODE(IOCTL_CHANGER_BASE, 0x0009, METHOD_BUFFERED, FILE_READ_ACCESS)
67 #define IOCTL_CHANGER_QUERY_VOLUME_TAGS \
68 CTL_CODE(IOCTL_CHANGER_BASE, 0x000B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
70 #define IOCTL_CHANGER_REINITIALIZE_TRANSPORT \
71 CTL_CODE(IOCTL_CHANGER_BASE, 0x000A, METHOD_BUFFERED, FILE_READ_ACCESS)
73 #define IOCTL_CHANGER_SET_ACCESS \
74 CTL_CODE(IOCTL_CHANGER_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
76 #define IOCTL_CHANGER_SET_POSITION \
77 CTL_CODE(IOCTL_CHANGER_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS)
80 #define MAX_VOLUME_ID_SIZE 36
81 #define MAX_VOLUME_TEMPLATE_SIZE 40
83 typedef enum _ELEMENT_TYPE {
92 } ELEMENT_TYPE, *PELEMENT_TYPE;
94 typedef struct _CHANGER_ELEMENT {
95 ELEMENT_TYPE ElementType;
97 } CHANGER_ELEMENT, *PCHANGER_ELEMENT;
99 typedef struct _CHANGER_ELEMENT_LIST {
100 CHANGER_ELEMENT Element;
101 ULONG NumberOfElements;
102 } CHANGER_ELEMENT_LIST, *PCHANGER_ELEMENT_LIST;
104 typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS {
105 CHANGER_ELEMENT_LIST ElementList;
107 } CHANGER_INITIALIZE_ELEMENT_STATUS, *PCHANGER_INITIALIZE_ELEMENT_STATUS;
109 typedef struct _CHANGER_READ_ELEMENT_STATUS {
110 CHANGER_ELEMENT_LIST ElementList;
111 BOOLEAN VolumeTagInfo;
112 } CHANGER_READ_ELEMENT_STATUS, *PCHANGER_READ_ELEMENT_STATUS;
115 typedef struct _CHANGER_SET_POSITION {
116 CHANGER_ELEMENT Transport;
117 CHANGER_ELEMENT Destination;
119 } CHANGER_SET_POSITION, *PCHANGER_SET_POSITION;
121 typedef struct _CHANGER_EXCHANGE_MEDIUM {
122 CHANGER_ELEMENT Transport;
123 CHANGER_ELEMENT Source;
124 CHANGER_ELEMENT Destination1;
125 CHANGER_ELEMENT Destination2;
128 } CHANGER_EXCHANGE_MEDIUM, *PCHANGER_EXCHANGE_MEDIUM;
130 typedef struct _CHANGER_MOVE_MEDIUM {
131 CHANGER_ELEMENT Transport;
132 CHANGER_ELEMENT Source;
133 CHANGER_ELEMENT Destination;
135 } CHANGER_MOVE_MEDIUM, *PCHANGER_MOVE_MEDIUM;
137 #define VENDOR_ID_LENGTH 8
138 #define PRODUCT_ID_LENGTH 16
139 #define REVISION_LENGTH 4
140 #define SERIAL_NUMBER_LENGTH 32
142 typedef struct _CHANGER_PRODUCT_DATA {
143 UCHAR VendorId[VENDOR_ID_LENGTH];
144 UCHAR ProductId[PRODUCT_ID_LENGTH];
145 UCHAR Revision[REVISION_LENGTH];
146 UCHAR SerialNumber[SERIAL_NUMBER_LENGTH];
148 } CHANGER_PRODUCT_DATA, *PCHANGER_PRODUCT_DATA;
150 /* CHANGER_SET_ACCESS.Control constants */
151 #define LOCK_ELEMENT 0
152 #define UNLOCK_ELEMENT 1
153 #define EXTEND_IEPORT 2
154 #define RETRACT_IEPORT 3
156 typedef struct _CHANGER_SET_ACCESS {
157 CHANGER_ELEMENT Element;
159 } CHANGER_SET_ACCESS, *PCHANGER_SET_ACCESS;
162 typedef enum _CHANGER_DEVICE_PROBLEM_TYPE {
164 DeviceProblemHardware,
165 DeviceProblemCHMError,
166 DeviceProblemDoorOpen,
167 DeviceProblemCalibrationError,
168 DeviceProblemTargetFailure,
169 DeviceProblemCHMMoveError,
170 DeviceProblemCHMZeroError,
171 DeviceProblemCartridgeInsertError,
172 DeviceProblemPositionError,
173 DeviceProblemSensorError,
174 DeviceProblemCartridgeEjectError,
175 DeviceProblemGripperError,
176 DeviceProblemDriveError
177 } CHANGER_DEVICE_PROBLEM_TYPE, *PCHANGER_DEVICE_PROBLEM_TYPE;
179 /* CHANGER_ELEMENT_STATUS(_EX).Flags constants */
180 #define ELEMENT_STATUS_FULL 0x00000001
181 #define ELEMENT_STATUS_IMPEXP 0x00000002
182 #define ELEMENT_STATUS_EXCEPT 0x00000004
183 #define ELEMENT_STATUS_ACCESS 0x00000008
184 #define ELEMENT_STATUS_EXENAB 0x00000010
185 #define ELEMENT_STATUS_INENAB 0x00000020
186 #define ELEMENT_STATUS_PRODUCT_DATA 0x00000040
187 #define ELEMENT_STATUS_LUN_VALID 0x00001000
188 #define ELEMENT_STATUS_ID_VALID 0x00002000
189 #define ELEMENT_STATUS_NOT_BUS 0x00008000
190 #define ELEMENT_STATUS_INVERT 0x00400000
191 #define ELEMENT_STATUS_SVALID 0x00800000
192 #define ELEMENT_STATUS_PVOLTAG 0x10000000
193 #define ELEMENT_STATUS_AVOLTAG 0x20000000
195 /* CHANGER_ELEMENT_STATUS(_EX).ExceptionCode constants */
196 #define ERROR_LABEL_UNREADABLE 0x00000001
197 #define ERROR_LABEL_QUESTIONABLE 0x00000002
198 #define ERROR_SLOT_NOT_PRESENT 0x00000004
199 #define ERROR_DRIVE_NOT_INSTALLED 0x00000008
200 #define ERROR_TRAY_MALFUNCTION 0x00000010
201 #define ERROR_INIT_STATUS_NEEDED 0x00000011
202 #define ERROR_UNHANDLED_ERROR 0xFFFFFFFF
204 typedef struct _CHANGER_ELEMENT_STATUS {
205 CHANGER_ELEMENT Element;
206 CHANGER_ELEMENT SrcElementAddress;
212 UCHAR PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
213 UCHAR AlternateVolumeID[MAX_VOLUME_ID_SIZE];
214 } CHANGER_ELEMENT_STATUS, *PCHANGER_ELEMENT_STATUS;
216 typedef struct _CHANGER_ELEMENT_STATUS_EX {
217 CHANGER_ELEMENT Element;
218 CHANGER_ELEMENT SrcElementAddress;
224 UCHAR PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
225 UCHAR AlternateVolumeID[MAX_VOLUME_ID_SIZE];
226 UCHAR VendorIdentification[VENDOR_ID_LENGTH];
227 UCHAR ProductIdentification[PRODUCT_ID_LENGTH];
228 UCHAR SerialNumber[SERIAL_NUMBER_LENGTH];
229 } CHANGER_ELEMENT_STATUS_EX, *PCHANGER_ELEMENT_STATUS_EX;
231 /* CHANGER_SEND_VOLUME_TAG_INFORMATION.ActionCode constants */
232 #define SEARCH_ALL 0x0
233 #define SEARCH_PRIMARY 0x1
234 #define SEARCH_ALTERNATE 0x2
235 #define SEARCH_ALL_NO_SEQ 0x4
236 #define SEARCH_PRI_NO_SEQ 0x5
237 #define SEARCH_ALT_NO_SEQ 0x6
238 #define ASSERT_PRIMARY 0x8
239 #define ASSERT_ALTERNATE 0x9
240 #define REPLACE_PRIMARY 0xA
241 #define REPLACE_ALTERNATE 0xB
242 #define UNDEFINE_PRIMARY 0xC
243 #define UNDEFINE_ALTERNATE 0xD
245 typedef struct _CHANGER_SEND_VOLUME_TAG_INFORMATION {
246 CHANGER_ELEMENT StartingElement;
248 UCHAR VolumeIDTemplate[MAX_VOLUME_TEMPLATE_SIZE];
249 } CHANGER_SEND_VOLUME_TAG_INFORMATION, *PCHANGER_SEND_VOLUME_TAG_INFORMATION;
251 /* GET_CHANGER_PARAMETERS.Features0 constants */
252 #define CHANGER_BAR_CODE_SCANNER_INSTALLED 0x00000001
253 #define CHANGER_INIT_ELEM_STAT_WITH_RANGE 0x00000002
254 #define CHANGER_CLOSE_IEPORT 0x00000004
255 #define CHANGER_OPEN_IEPORT 0x00000008
256 #define CHANGER_STATUS_NON_VOLATILE 0x00000010
257 #define CHANGER_EXCHANGE_MEDIA 0x00000020
258 #define CHANGER_CLEANER_SLOT 0x00000040
259 #define CHANGER_LOCK_UNLOCK 0x00000080
260 #define CHANGER_CARTRIDGE_MAGAZINE 0x00000100
261 #define CHANGER_MEDIUM_FLIP 0x00000200
262 #define CHANGER_POSITION_TO_ELEMENT 0x00000400
263 #define CHANGER_REPORT_IEPORT_STATE 0x00000800
264 #define CHANGER_STORAGE_DRIVE 0x00001000
265 #define CHANGER_STORAGE_IEPORT 0x00002000
266 #define CHANGER_STORAGE_SLOT 0x00004000
267 #define CHANGER_STORAGE_TRANSPORT 0x00008000
268 #define CHANGER_DRIVE_CLEANING_REQUIRED 0x00010000
269 #define CHANGER_PREDISMOUNT_EJECT_REQUIRED 0x00020000
270 #define CHANGER_CLEANER_ACCESS_NOT_VALID 0x00040000
271 #define CHANGER_PREMOUNT_EJECT_REQUIRED 0x00080000
272 #define CHANGER_VOLUME_IDENTIFICATION 0x00100000
273 #define CHANGER_VOLUME_SEARCH 0x00200000
274 #define CHANGER_VOLUME_ASSERT 0x00400000
275 #define CHANGER_VOLUME_REPLACE 0x00800000
276 #define CHANGER_VOLUME_UNDEFINE 0x01000000
277 #define CHANGER_SERIAL_NUMBER_VALID 0x04000000
278 #define CHANGER_DEVICE_REINITIALIZE_CAPABLE 0x08000000
279 #define CHANGER_KEYPAD_ENABLE_DISABLE 0x10000000
280 #define CHANGER_DRIVE_EMPTY_ON_DOOR_ACCESS 0x20000000
281 #define CHANGER_RESERVED_BIT 0x80000000
283 /* GET_CHANGER_PARAMETERS.Features1 constants */
284 #define CHANGER_PREDISMOUNT_ALIGN_TO_SLOT 0x80000001
285 #define CHANGER_PREDISMOUNT_ALIGN_TO_DRIVE 0x80000002
286 #define CHANGER_CLEANER_AUTODISMOUNT 0x80000004
287 #define CHANGER_TRUE_EXCHANGE_CAPABLE 0x80000008
288 #define CHANGER_SLOTS_USE_TRAYS 0x80000010
289 #define CHANGER_RTN_MEDIA_TO_ORIGINAL_ADDR 0x80000020
290 #define CHANGER_CLEANER_OPS_NOT_SUPPORTED 0x80000040
291 #define CHANGER_IEPORT_USER_CONTROL_OPEN 0x80000080
292 #define CHANGER_IEPORT_USER_CONTROL_CLOSE 0x80000100
293 #define CHANGER_MOVE_EXTENDS_IEPORT 0x80000200
294 #define CHANGER_MOVE_RETRACTS_IEPORT 0x80000400
296 /* GET_CHANGER_PARAMETERS.MoveFrom,ExchangeFrom,PositionCapabilities constants */
297 #define CHANGER_TO_TRANSPORT 0x01
298 #define CHANGER_TO_SLOT 0x02
299 #define CHANGER_TO_IEPORT 0x04
300 #define CHANGER_TO_DRIVE 0x08
302 /* GET_CHANGER_PARAMETERS.LockUnlockCapabilities constants */
303 #define LOCK_UNLOCK_IEPORT 0x01
304 #define LOCK_UNLOCK_DOOR 0x02
305 #define LOCK_UNLOCK_KEYPAD 0x04
307 typedef struct _GET_CHANGER_PARAMETERS {
309 USHORT NumberTransportElements;
310 USHORT NumberStorageElements;
311 USHORT NumberCleanerSlots;
312 USHORT NumberIEElements;
313 USHORT NumberDataTransferElements;
314 USHORT NumberOfDoors;
315 USHORT FirstSlotNumber;
316 USHORT FirstDriveNumber;
317 USHORT FirstTransportNumber;
318 USHORT FirstIEPortNumber;
319 USHORT FirstCleanerSlotAddress;
321 ULONG DriveCleanTimeout;
324 UCHAR MoveFromTransport;
326 UCHAR MoveFromIePort;
328 UCHAR ExchangeFromTransport;
329 UCHAR ExchangeFromSlot;
330 UCHAR ExchangeFromIePort;
331 UCHAR ExchangeFromDrive;
332 UCHAR LockUnlockCapabilities;
333 UCHAR PositionCapabilities;
336 } GET_CHANGER_PARAMETERS, * PGET_CHANGER_PARAMETERS;
338 typedef struct READ_ELEMENT_ADDRESS_INFO {
339 ULONG NumberOfElements;
340 CHANGER_ELEMENT_STATUS ElementStatus[1];
341 } READ_ELEMENT_ADDRESS_INFO, *PREAD_ELEMENT_ADDRESS_INFO;
343 typedef struct _TAPE_WMI_OPERATIONS {
345 ULONG DataBufferSize;
347 } TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS;
349 typedef struct _WMI_CHANGER_PROBLEM_DEVICE_ERROR {
350 ULONG ChangerProblemType;
351 } WMI_CHANGER_PROBLEM_DEVICE_ERROR, *PWMI_CHANGER_PROBLEM_DEVICE_ERROR;
357 #endif /* __NTDDCHGR_H */