1 /* 2 * ntddchgr.h 3 * 4 * Media changer IOCTL interface. 5 * 6 * This file is part of the w32api package. 7 * 8 * Contributors: 9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> 10 * 11 * THIS SOFTWARE IS NOT COPYRIGHTED 12 * 13 * This source code is offered for use in the public domain. You may 14 * use, modify or distribute it freely. 15 * 16 * This code is distributed in the hope that it will be useful but 17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY 18 * DISCLAIMED. This includes but is not limited to warranties of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 20 * 21 */ 22 23 #pragma once 24 25 #include "ntddstor.h" 26 27 #ifdef __cplusplus 28 extern "C" { 29 #endif 30 31 #define DD_CHANGER_DEVICE_NAME "\\Device\\Changer" 32 #define DD_CHANGER_DEVICE_NAME_U L"\\Device\\Changer" 33 34 #define IOCTL_CHANGER_BASE FILE_DEVICE_CHANGER 35 36 #define IOCTL_CHANGER_EXCHANGE_MEDIUM \ 37 CTL_CODE(IOCTL_CHANGER_BASE, 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS) 38 39 #define IOCTL_CHANGER_GET_ELEMENT_STATUS \ 40 CTL_CODE(IOCTL_CHANGER_BASE, 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 41 42 #define IOCTL_CHANGER_GET_PARAMETERS \ 43 CTL_CODE(IOCTL_CHANGER_BASE, 0x0000, METHOD_BUFFERED, FILE_READ_ACCESS) 44 45 #define IOCTL_CHANGER_GET_PRODUCT_DATA \ 46 CTL_CODE(IOCTL_CHANGER_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS) 47 48 #define IOCTL_CHANGER_GET_STATUS \ 49 CTL_CODE(IOCTL_CHANGER_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) 50 51 #define IOCTL_CHANGER_INITIALIZE_ELEMENT_STATUS \ 52 CTL_CODE(IOCTL_CHANGER_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS) 53 54 #define IOCTL_CHANGER_MOVE_MEDIUM \ 55 CTL_CODE(IOCTL_CHANGER_BASE, 0x0009, METHOD_BUFFERED, FILE_READ_ACCESS) 56 57 #define IOCTL_CHANGER_QUERY_VOLUME_TAGS \ 58 CTL_CODE(IOCTL_CHANGER_BASE, 0x000B, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 59 60 #define IOCTL_CHANGER_REINITIALIZE_TRANSPORT \ 61 CTL_CODE(IOCTL_CHANGER_BASE, 0x000A, METHOD_BUFFERED, FILE_READ_ACCESS) 62 63 #define IOCTL_CHANGER_SET_ACCESS \ 64 CTL_CODE(IOCTL_CHANGER_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 65 66 #define IOCTL_CHANGER_SET_POSITION \ 67 CTL_CODE(IOCTL_CHANGER_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS) 68 69 #define MAX_VOLUME_ID_SIZE 36 70 #define MAX_VOLUME_TEMPLATE_SIZE 40 71 72 #define VENDOR_ID_LENGTH 8 73 #define PRODUCT_ID_LENGTH 16 74 #define REVISION_LENGTH 4 75 #define SERIAL_NUMBER_LENGTH 32 76 77 /* GET_CHANGER_PARAMETERS.Features0 constants */ 78 #define CHANGER_BAR_CODE_SCANNER_INSTALLED 0x00000001 79 #define CHANGER_INIT_ELEM_STAT_WITH_RANGE 0x00000002 80 #define CHANGER_CLOSE_IEPORT 0x00000004 81 #define CHANGER_OPEN_IEPORT 0x00000008 82 #define CHANGER_STATUS_NON_VOLATILE 0x00000010 83 #define CHANGER_EXCHANGE_MEDIA 0x00000020 84 #define CHANGER_CLEANER_SLOT 0x00000040 85 #define CHANGER_LOCK_UNLOCK 0x00000080 86 #define CHANGER_CARTRIDGE_MAGAZINE 0x00000100 87 #define CHANGER_MEDIUM_FLIP 0x00000200 88 #define CHANGER_POSITION_TO_ELEMENT 0x00000400 89 #define CHANGER_REPORT_IEPORT_STATE 0x00000800 90 #define CHANGER_STORAGE_DRIVE 0x00001000 91 #define CHANGER_STORAGE_IEPORT 0x00002000 92 #define CHANGER_STORAGE_SLOT 0x00004000 93 #define CHANGER_STORAGE_TRANSPORT 0x00008000 94 #define CHANGER_DRIVE_CLEANING_REQUIRED 0x00010000 95 #define CHANGER_PREDISMOUNT_EJECT_REQUIRED 0x00020000 96 #define CHANGER_CLEANER_ACCESS_NOT_VALID 0x00040000 97 #define CHANGER_PREMOUNT_EJECT_REQUIRED 0x00080000 98 #define CHANGER_VOLUME_IDENTIFICATION 0x00100000 99 #define CHANGER_VOLUME_SEARCH 0x00200000 100 #define CHANGER_VOLUME_ASSERT 0x00400000 101 #define CHANGER_VOLUME_REPLACE 0x00800000 102 #define CHANGER_VOLUME_UNDEFINE 0x01000000 103 #define CHANGER_SERIAL_NUMBER_VALID 0x04000000 104 #define CHANGER_DEVICE_REINITIALIZE_CAPABLE 0x08000000 105 #define CHANGER_KEYPAD_ENABLE_DISABLE 0x10000000 106 #define CHANGER_DRIVE_EMPTY_ON_DOOR_ACCESS 0x20000000 107 #define CHANGER_RESERVED_BIT 0x80000000 108 109 /* GET_CHANGER_PARAMETERS.Features1 constants */ 110 #define CHANGER_PREDISMOUNT_ALIGN_TO_SLOT 0x80000001 111 #define CHANGER_PREDISMOUNT_ALIGN_TO_DRIVE 0x80000002 112 #define CHANGER_CLEANER_AUTODISMOUNT 0x80000004 113 #define CHANGER_TRUE_EXCHANGE_CAPABLE 0x80000008 114 #define CHANGER_SLOTS_USE_TRAYS 0x80000010 115 #define CHANGER_RTN_MEDIA_TO_ORIGINAL_ADDR 0x80000020 116 #define CHANGER_CLEANER_OPS_NOT_SUPPORTED 0x80000040 117 #define CHANGER_IEPORT_USER_CONTROL_OPEN 0x80000080 118 #define CHANGER_IEPORT_USER_CONTROL_CLOSE 0x80000100 119 #define CHANGER_MOVE_EXTENDS_IEPORT 0x80000200 120 #define CHANGER_MOVE_RETRACTS_IEPORT 0x80000400 121 122 /* GET_CHANGER_PARAMETERS.MoveFrom,ExchangeFrom,PositionCapabilities constants */ 123 #define CHANGER_TO_TRANSPORT 0x01 124 #define CHANGER_TO_SLOT 0x02 125 #define CHANGER_TO_IEPORT 0x04 126 #define CHANGER_TO_DRIVE 0x08 127 128 /* GET_CHANGER_PARAMETERS.LockUnlockCapabilities constants */ 129 #define LOCK_UNLOCK_IEPORT 0x01 130 #define LOCK_UNLOCK_DOOR 0x02 131 #define LOCK_UNLOCK_KEYPAD 0x04 132 133 /* CHANGER_SET_ACCESS.Control constants */ 134 #define LOCK_ELEMENT 0 135 #define UNLOCK_ELEMENT 1 136 #define EXTEND_IEPORT 2 137 #define RETRACT_IEPORT 3 138 139 /* CHANGER_ELEMENT_STATUS(_EX).Flags constants */ 140 #define ELEMENT_STATUS_FULL 0x00000001 141 #define ELEMENT_STATUS_IMPEXP 0x00000002 142 #define ELEMENT_STATUS_EXCEPT 0x00000004 143 #define ELEMENT_STATUS_ACCESS 0x00000008 144 #define ELEMENT_STATUS_EXENAB 0x00000010 145 #define ELEMENT_STATUS_INENAB 0x00000020 146 #define ELEMENT_STATUS_PRODUCT_DATA 0x00000040 147 #define ELEMENT_STATUS_LUN_VALID 0x00001000 148 #define ELEMENT_STATUS_ID_VALID 0x00002000 149 #define ELEMENT_STATUS_NOT_BUS 0x00008000 150 #define ELEMENT_STATUS_INVERT 0x00400000 151 #define ELEMENT_STATUS_SVALID 0x00800000 152 #define ELEMENT_STATUS_PVOLTAG 0x10000000 153 #define ELEMENT_STATUS_AVOLTAG 0x20000000 154 155 /* CHANGER_ELEMENT_STATUS(_EX).ExceptionCode constants */ 156 #define ERROR_LABEL_UNREADABLE 0x00000001 157 #define ERROR_LABEL_QUESTIONABLE 0x00000002 158 #define ERROR_SLOT_NOT_PRESENT 0x00000004 159 #define ERROR_DRIVE_NOT_INSTALLED 0x00000008 160 #define ERROR_TRAY_MALFUNCTION 0x00000010 161 #define ERROR_INIT_STATUS_NEEDED 0x00000011 162 #define ERROR_UNHANDLED_ERROR 0xFFFFFFFF 163 164 /* CHANGER_SEND_VOLUME_TAG_INFORMATION.ActionCode constants */ 165 #define SEARCH_ALL 0x0 166 #define SEARCH_PRIMARY 0x1 167 #define SEARCH_ALTERNATE 0x2 168 #define SEARCH_ALL_NO_SEQ 0x4 169 #define SEARCH_PRI_NO_SEQ 0x5 170 #define SEARCH_ALT_NO_SEQ 0x6 171 #define ASSERT_PRIMARY 0x8 172 #define ASSERT_ALTERNATE 0x9 173 #define REPLACE_PRIMARY 0xA 174 #define REPLACE_ALTERNATE 0xB 175 #define UNDEFINE_PRIMARY 0xC 176 #define UNDEFINE_ALTERNATE 0xD 177 178 typedef enum _ELEMENT_TYPE { 179 AllElements, 180 ChangerTransport, 181 ChangerSlot, 182 ChangerIEPort, 183 ChangerDrive, 184 ChangerDoor, 185 ChangerKeypad, 186 ChangerMaxElement 187 } ELEMENT_TYPE, *PELEMENT_TYPE; 188 189 typedef struct _CHANGER_ELEMENT { 190 ELEMENT_TYPE ElementType; 191 ULONG ElementAddress; 192 } CHANGER_ELEMENT, *PCHANGER_ELEMENT; 193 194 typedef struct _CHANGER_ELEMENT_LIST { 195 CHANGER_ELEMENT Element; 196 ULONG NumberOfElements; 197 } CHANGER_ELEMENT_LIST, *PCHANGER_ELEMENT_LIST; 198 199 typedef struct _GET_CHANGER_PARAMETERS { 200 ULONG Size; 201 USHORT NumberTransportElements; 202 USHORT NumberStorageElements; 203 USHORT NumberCleanerSlots; 204 USHORT NumberIEElements; 205 USHORT NumberDataTransferElements; 206 USHORT NumberOfDoors; 207 USHORT FirstSlotNumber; 208 USHORT FirstDriveNumber; 209 USHORT FirstTransportNumber; 210 USHORT FirstIEPortNumber; 211 USHORT FirstCleanerSlotAddress; 212 USHORT MagazineSize; 213 ULONG DriveCleanTimeout; 214 ULONG Features0; 215 ULONG Features1; 216 UCHAR MoveFromTransport; 217 UCHAR MoveFromSlot; 218 UCHAR MoveFromIePort; 219 UCHAR MoveFromDrive; 220 UCHAR ExchangeFromTransport; 221 UCHAR ExchangeFromSlot; 222 UCHAR ExchangeFromIePort; 223 UCHAR ExchangeFromDrive; 224 UCHAR LockUnlockCapabilities; 225 UCHAR PositionCapabilities; 226 UCHAR Reserved1[2]; 227 ULONG Reserved2[2]; 228 } GET_CHANGER_PARAMETERS, * PGET_CHANGER_PARAMETERS; 229 230 typedef struct _CHANGER_PRODUCT_DATA { 231 UCHAR VendorId[VENDOR_ID_LENGTH]; 232 UCHAR ProductId[PRODUCT_ID_LENGTH]; 233 UCHAR Revision[REVISION_LENGTH]; 234 UCHAR SerialNumber[SERIAL_NUMBER_LENGTH]; 235 UCHAR DeviceType; 236 } CHANGER_PRODUCT_DATA, *PCHANGER_PRODUCT_DATA; 237 238 typedef struct _CHANGER_SET_ACCESS { 239 CHANGER_ELEMENT Element; 240 ULONG Control; 241 } CHANGER_SET_ACCESS, *PCHANGER_SET_ACCESS; 242 243 typedef struct _CHANGER_READ_ELEMENT_STATUS { 244 CHANGER_ELEMENT_LIST ElementList; 245 BOOLEAN VolumeTagInfo; 246 } CHANGER_READ_ELEMENT_STATUS, *PCHANGER_READ_ELEMENT_STATUS; 247 248 typedef struct _CHANGER_ELEMENT_STATUS { 249 CHANGER_ELEMENT Element; 250 CHANGER_ELEMENT SrcElementAddress; 251 ULONG Flags; 252 ULONG ExceptionCode; 253 UCHAR TargetId; 254 UCHAR Lun; 255 USHORT Reserved; 256 UCHAR PrimaryVolumeID[MAX_VOLUME_ID_SIZE]; 257 UCHAR AlternateVolumeID[MAX_VOLUME_ID_SIZE]; 258 } CHANGER_ELEMENT_STATUS, *PCHANGER_ELEMENT_STATUS; 259 260 typedef struct _CHANGER_ELEMENT_STATUS_EX { 261 CHANGER_ELEMENT Element; 262 CHANGER_ELEMENT SrcElementAddress; 263 ULONG Flags; 264 ULONG ExceptionCode; 265 UCHAR TargetId; 266 UCHAR Lun; 267 USHORT Reserved; 268 UCHAR PrimaryVolumeID[MAX_VOLUME_ID_SIZE]; 269 UCHAR AlternateVolumeID[MAX_VOLUME_ID_SIZE]; 270 UCHAR VendorIdentification[VENDOR_ID_LENGTH]; 271 UCHAR ProductIdentification[PRODUCT_ID_LENGTH]; 272 UCHAR SerialNumber[SERIAL_NUMBER_LENGTH]; 273 } CHANGER_ELEMENT_STATUS_EX, *PCHANGER_ELEMENT_STATUS_EX; 274 275 typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS { 276 CHANGER_ELEMENT_LIST ElementList; 277 BOOLEAN BarCodeScan; 278 } CHANGER_INITIALIZE_ELEMENT_STATUS, *PCHANGER_INITIALIZE_ELEMENT_STATUS; 279 280 typedef struct _CHANGER_SET_POSITION { 281 CHANGER_ELEMENT Transport; 282 CHANGER_ELEMENT Destination; 283 BOOLEAN Flip; 284 } CHANGER_SET_POSITION, *PCHANGER_SET_POSITION; 285 286 typedef struct _CHANGER_EXCHANGE_MEDIUM { 287 CHANGER_ELEMENT Transport; 288 CHANGER_ELEMENT Source; 289 CHANGER_ELEMENT Destination1; 290 CHANGER_ELEMENT Destination2; 291 BOOLEAN Flip1; 292 BOOLEAN Flip2; 293 } CHANGER_EXCHANGE_MEDIUM, *PCHANGER_EXCHANGE_MEDIUM; 294 295 typedef struct _CHANGER_MOVE_MEDIUM { 296 CHANGER_ELEMENT Transport; 297 CHANGER_ELEMENT Source; 298 CHANGER_ELEMENT Destination; 299 BOOLEAN Flip; 300 } CHANGER_MOVE_MEDIUM, *PCHANGER_MOVE_MEDIUM; 301 302 typedef struct _CHANGER_SEND_VOLUME_TAG_INFORMATION { 303 CHANGER_ELEMENT StartingElement; 304 ULONG ActionCode; 305 UCHAR VolumeIDTemplate[MAX_VOLUME_TEMPLATE_SIZE]; 306 } CHANGER_SEND_VOLUME_TAG_INFORMATION, *PCHANGER_SEND_VOLUME_TAG_INFORMATION; 307 308 typedef struct READ_ELEMENT_ADDRESS_INFO { 309 ULONG NumberOfElements; 310 CHANGER_ELEMENT_STATUS ElementStatus[1]; 311 } READ_ELEMENT_ADDRESS_INFO, *PREAD_ELEMENT_ADDRESS_INFO; 312 313 typedef enum _CHANGER_DEVICE_PROBLEM_TYPE { 314 DeviceProblemNone, 315 DeviceProblemHardware, 316 DeviceProblemCHMError, 317 DeviceProblemDoorOpen, 318 DeviceProblemCalibrationError, 319 DeviceProblemTargetFailure, 320 DeviceProblemCHMMoveError, 321 DeviceProblemCHMZeroError, 322 DeviceProblemCartridgeInsertError, 323 DeviceProblemPositionError, 324 DeviceProblemSensorError, 325 DeviceProblemCartridgeEjectError, 326 DeviceProblemGripperError, 327 DeviceProblemDriveError 328 } CHANGER_DEVICE_PROBLEM_TYPE, *PCHANGER_DEVICE_PROBLEM_TYPE; 329 330 #ifdef __cplusplus 331 } 332 #endif 333