ntddchgr.h 12 KB

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