OSDN Git Service

06accf870aeaf57942432df97a53ebaef58d3088
[mingw/mingw-org-wsl.git] / include / ddk / ntddchgr.h
1 /**
2  * @file ntddchgr.h
3  * @copy 2012 MinGW.org project
4  *
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:
11  * 
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
14  * Software.
15  * 
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.
23  */
24 /* Created by Casper S. Hornstrup <chorns@users.sourceforge.net> */
25 #ifndef __NTDDCHGR_H
26 #define __NTDDCHGR_H
27 #pragma GCC system_header
28 #include <_mingw.h>
29
30 /*
31  * Media changer IOCTL interface.
32  */
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37
38 #include "ntddk.h"
39 #include "ntddstor.h"
40
41 #define DD_CHANGER_DEVICE_NAME            "\\Device\\Changer"
42 #define DD_CHANGER_DEVICE_NAME_U          L"\\Device\\Changer"
43
44 #define IOCTL_CHANGER_BASE                FILE_DEVICE_CHANGER
45
46 #define IOCTL_CHANGER_EXCHANGE_MEDIUM  \
47   CTL_CODE(IOCTL_CHANGER_BASE, 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS)
48
49 #define IOCTL_CHANGER_GET_ELEMENT_STATUS \
50   CTL_CODE(IOCTL_CHANGER_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
51
52 #define IOCTL_CHANGER_GET_PARAMETERS \
53   CTL_CODE(IOCTL_CHANGER_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS)
54
55 #define IOCTL_CHANGER_GET_PRODUCT_DATA \
56   CTL_CODE(IOCTL_CHANGER_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS)
57
58 #define IOCTL_CHANGER_GET_STATUS \
59   CTL_CODE(IOCTL_CHANGER_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
60
61 #define IOCTL_CHANGER_INITIALIZE_ELEMENT_STATUS \
62   CTL_CODE(IOCTL_CHANGER_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS)
63
64 #define IOCTL_CHANGER_MOVE_MEDIUM \
65   CTL_CODE(IOCTL_CHANGER_BASE, 0x0009, METHOD_BUFFERED, FILE_READ_ACCESS)
66
67 #define IOCTL_CHANGER_QUERY_VOLUME_TAGS \
68   CTL_CODE(IOCTL_CHANGER_BASE, 0x000B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
69
70 #define IOCTL_CHANGER_REINITIALIZE_TRANSPORT \
71   CTL_CODE(IOCTL_CHANGER_BASE, 0x000A, METHOD_BUFFERED, FILE_READ_ACCESS)
72
73 #define IOCTL_CHANGER_SET_ACCESS \
74   CTL_CODE(IOCTL_CHANGER_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
75
76 #define IOCTL_CHANGER_SET_POSITION \
77   CTL_CODE(IOCTL_CHANGER_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS)
78
79
80 #define MAX_VOLUME_ID_SIZE                36
81 #define MAX_VOLUME_TEMPLATE_SIZE          40
82
83 typedef  enum _ELEMENT_TYPE {
84   AllElements,
85   ChangerTransport,
86   ChangerSlot,
87   ChangerIEPort,
88   ChangerDrive,
89   ChangerDoor,
90   ChangerKeypad,
91   ChangerMaxElement
92 } ELEMENT_TYPE, *PELEMENT_TYPE;
93
94 typedef struct _CHANGER_ELEMENT {
95   ELEMENT_TYPE  ElementType;
96   ULONG  ElementAddress;
97 } CHANGER_ELEMENT, *PCHANGER_ELEMENT;
98
99 typedef struct _CHANGER_ELEMENT_LIST {
100   CHANGER_ELEMENT  Element;
101   ULONG  NumberOfElements;
102 } CHANGER_ELEMENT_LIST, *PCHANGER_ELEMENT_LIST;
103
104 typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS {
105   CHANGER_ELEMENT_LIST  ElementList;
106   BOOLEAN  BarCodeScan;
107 } CHANGER_INITIALIZE_ELEMENT_STATUS, *PCHANGER_INITIALIZE_ELEMENT_STATUS;
108
109 typedef struct _CHANGER_READ_ELEMENT_STATUS {
110   CHANGER_ELEMENT_LIST  ElementList;
111   BOOLEAN  VolumeTagInfo;
112 } CHANGER_READ_ELEMENT_STATUS, *PCHANGER_READ_ELEMENT_STATUS;
113
114
115 typedef struct _CHANGER_SET_POSITION {
116         CHANGER_ELEMENT  Transport;
117         CHANGER_ELEMENT  Destination;
118         BOOLEAN  Flip;
119 } CHANGER_SET_POSITION, *PCHANGER_SET_POSITION;
120
121 typedef struct _CHANGER_EXCHANGE_MEDIUM {
122         CHANGER_ELEMENT  Transport;
123         CHANGER_ELEMENT  Source;
124         CHANGER_ELEMENT  Destination1;
125         CHANGER_ELEMENT  Destination2;
126         BOOLEAN  Flip1;
127         BOOLEAN  Flip2;
128 } CHANGER_EXCHANGE_MEDIUM, *PCHANGER_EXCHANGE_MEDIUM;
129
130 typedef struct _CHANGER_MOVE_MEDIUM {
131   CHANGER_ELEMENT  Transport;
132   CHANGER_ELEMENT  Source;
133   CHANGER_ELEMENT  Destination;
134   BOOLEAN  Flip;
135 } CHANGER_MOVE_MEDIUM, *PCHANGER_MOVE_MEDIUM;
136
137 #define VENDOR_ID_LENGTH                  8
138 #define PRODUCT_ID_LENGTH                 16
139 #define REVISION_LENGTH                   4
140 #define SERIAL_NUMBER_LENGTH              32
141
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];
147         UCHAR  DeviceType;
148 } CHANGER_PRODUCT_DATA, *PCHANGER_PRODUCT_DATA;
149
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
155
156 typedef struct _CHANGER_SET_ACCESS {
157   CHANGER_ELEMENT  Element;
158   ULONG  Control;
159 } CHANGER_SET_ACCESS, *PCHANGER_SET_ACCESS;
160
161
162 typedef enum _CHANGER_DEVICE_PROBLEM_TYPE {
163   DeviceProblemNone,
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;
178
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
194
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
203
204 typedef struct _CHANGER_ELEMENT_STATUS {
205   CHANGER_ELEMENT  Element;
206   CHANGER_ELEMENT  SrcElementAddress;
207   ULONG  Flags;
208   ULONG  ExceptionCode;
209   UCHAR  TargetId;
210   UCHAR  Lun;
211   USHORT  Reserved;
212   UCHAR  PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
213   UCHAR  AlternateVolumeID[MAX_VOLUME_ID_SIZE];
214 } CHANGER_ELEMENT_STATUS, *PCHANGER_ELEMENT_STATUS;
215
216 typedef  struct _CHANGER_ELEMENT_STATUS_EX {
217   CHANGER_ELEMENT  Element;
218   CHANGER_ELEMENT  SrcElementAddress;
219   ULONG  Flags;
220   ULONG  ExceptionCode;
221   UCHAR  TargetId;
222   UCHAR  Lun;
223   USHORT  Reserved;
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;
230
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
244
245 typedef struct _CHANGER_SEND_VOLUME_TAG_INFORMATION {
246   CHANGER_ELEMENT StartingElement;
247   ULONG  ActionCode;
248   UCHAR  VolumeIDTemplate[MAX_VOLUME_TEMPLATE_SIZE];
249 } CHANGER_SEND_VOLUME_TAG_INFORMATION, *PCHANGER_SEND_VOLUME_TAG_INFORMATION;
250
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
282
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
295
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
301
302 /* GET_CHANGER_PARAMETERS.LockUnlockCapabilities constants */
303 #define LOCK_UNLOCK_IEPORT                0x01
304 #define LOCK_UNLOCK_DOOR                  0x02
305 #define LOCK_UNLOCK_KEYPAD                0x04
306
307 typedef struct _GET_CHANGER_PARAMETERS {
308   ULONG  Size;
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;
320   USHORT  MagazineSize;
321   ULONG  DriveCleanTimeout;
322   ULONG  Features0;
323   ULONG  Features1;
324   UCHAR  MoveFromTransport;
325   UCHAR  MoveFromSlot;
326   UCHAR  MoveFromIePort;
327   UCHAR  MoveFromDrive;
328   UCHAR  ExchangeFromTransport;
329   UCHAR  ExchangeFromSlot;
330   UCHAR  ExchangeFromIePort;
331   UCHAR  ExchangeFromDrive;
332   UCHAR  LockUnlockCapabilities;
333   UCHAR  PositionCapabilities;
334   UCHAR  Reserved1[2];
335   ULONG  Reserved2[2];
336 } GET_CHANGER_PARAMETERS, * PGET_CHANGER_PARAMETERS;
337
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;
342
343 typedef struct _TAPE_WMI_OPERATIONS {
344   ULONG  Method;
345   ULONG  DataBufferSize;
346   PVOID  DataBuffer;
347 } TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS;
348
349 typedef struct _WMI_CHANGER_PROBLEM_DEVICE_ERROR {
350   ULONG  ChangerProblemType;
351 } WMI_CHANGER_PROBLEM_DEVICE_ERROR, *PWMI_CHANGER_PROBLEM_DEVICE_ERROR;
352
353 #ifdef __cplusplus
354 }
355 #endif
356
357 #endif /* __NTDDCHGR_H */