Home | History | Annotate | Download | only in include
      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 (at) 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