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 28extern "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 178typedef 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 189typedef struct _CHANGER_ELEMENT { 190 ELEMENT_TYPE ElementType; 191 ULONG ElementAddress; 192} CHANGER_ELEMENT, *PCHANGER_ELEMENT; 193 194typedef struct _CHANGER_ELEMENT_LIST { 195 CHANGER_ELEMENT Element; 196 ULONG NumberOfElements; 197} CHANGER_ELEMENT_LIST, *PCHANGER_ELEMENT_LIST; 198 199typedef 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 230typedef 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 238typedef struct _CHANGER_SET_ACCESS { 239 CHANGER_ELEMENT Element; 240 ULONG Control; 241} CHANGER_SET_ACCESS, *PCHANGER_SET_ACCESS; 242 243typedef struct _CHANGER_READ_ELEMENT_STATUS { 244 CHANGER_ELEMENT_LIST ElementList; 245 BOOLEAN VolumeTagInfo; 246} CHANGER_READ_ELEMENT_STATUS, *PCHANGER_READ_ELEMENT_STATUS; 247 248typedef 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 260typedef 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 275typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS { 276 CHANGER_ELEMENT_LIST ElementList; 277 BOOLEAN BarCodeScan; 278} CHANGER_INITIALIZE_ELEMENT_STATUS, *PCHANGER_INITIALIZE_ELEMENT_STATUS; 279 280typedef struct _CHANGER_SET_POSITION { 281 CHANGER_ELEMENT Transport; 282 CHANGER_ELEMENT Destination; 283 BOOLEAN Flip; 284} CHANGER_SET_POSITION, *PCHANGER_SET_POSITION; 285 286typedef 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 295typedef 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 302typedef 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 308typedef struct READ_ELEMENT_ADDRESS_INFO { 309 ULONG NumberOfElements; 310 CHANGER_ELEMENT_STATUS ElementStatus[1]; 311} READ_ELEMENT_ADDRESS_INFO, *PREAD_ELEMENT_ADDRESS_INFO; 312 313typedef 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