1 /*
2  * scsi.h
3  *
4  * SCSI port and class interface.
5  *
6  * This file is part of the w32api package.
7  *
8  * Contributors:
9  *   Created by Casper S. Hornstrup <[email protected]>
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 #ifndef _NTSCSI_
24 #define _NTSCSI_
25 
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29 
30 #ifndef _NTSCSI_USER_MODE_
31 #include "srb.h"
32 #endif
33 
34 #define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_MASK    0x02
35 #define NOTIFICATION_POWER_MANAGEMENT_CLASS_MASK      0x04
36 #define NOTIFICATION_EXTERNAL_REQUEST_CLASS_MASK      0x08
37 #define NOTIFICATION_MEDIA_STATUS_CLASS_MASK          0x10
38 #define NOTIFICATION_MULTI_HOST_CLASS_MASK            0x20
39 #define NOTIFICATION_DEVICE_BUSY_CLASS_MASK           0x40
40 
41 
42 #define NOTIFICATION_NO_CLASS_EVENTS                  0x0
43 #define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_EVENTS  0x1
44 #define NOTIFICATION_POWER_MANAGEMENT_CLASS_EVENTS    0x2
45 #define NOTIFICATION_EXTERNAL_REQUEST_CLASS_EVENTS    0x3
46 #define NOTIFICATION_MEDIA_STATUS_CLASS_EVENTS        0x4
47 #define NOTIFICATION_MULTI_HOST_CLASS_EVENTS          0x5
48 #define NOTIFICATION_DEVICE_BUSY_CLASS_EVENTS         0x6
49 
50 #define NOTIFICATION_OPERATIONAL_EVENT_NO_CHANGE         0x0
51 #define NOTIFICATION_OPERATIONAL_EVENT_CHANGE_REQUESTED  0x1
52 #define NOTIFICATION_OPERATIONAL_EVENT_CHANGE_OCCURRED   0x2
53 
54 #define NOTIFICATION_OPERATIONAL_STATUS_AVAILABLE        0x0
55 #define NOTIFICATION_OPERATIONAL_STATUS_TEMPORARY_BUSY   0x1
56 #define NOTIFICATION_OPERATIONAL_STATUS_EXTENDED_BUSY    0x2
57 
58 #define NOTIFICATION_OPERATIONAL_OPCODE_NONE             0x0
59 #define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_CHANGE   0x1
60 #define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_ADDED    0x2
61 #define NOTIFICATION_OPERATIONAL_OPCODE_UNIT_RESET       0x3
62 #define NOTIFICATION_OPERATIONAL_OPCODE_FIRMWARE_CHANGED 0x4
63 #define NOTIFICATION_OPERATIONAL_OPCODE_INQUIRY_CHANGED  0x5
64 
65 #define NOTIFICATION_POWER_EVENT_NO_CHANGE          0x0
66 #define NOTIFICATION_POWER_EVENT_CHANGE_SUCCEEDED   0x1
67 #define NOTIFICATION_POWER_EVENT_CHANGE_FAILED      0x2
68 
69 #define NOTIFICATION_POWER_STATUS_ACTIVE            0x1
70 #define NOTIFICATION_POWER_STATUS_IDLE              0x2
71 #define NOTIFICATION_POWER_STATUS_STANDBY           0x3
72 #define NOTIFICATION_POWER_STATUS_SLEEP             0x4
73 
74 #define NOTIFICATION_MEDIA_EVENT_NO_EVENT           0x0
75 #define NOTIFICATION_EXTERNAL_EVENT_NO_CHANGE       0x0
76 #define NOTIFICATION_EXTERNAL_EVENT_BUTTON_DOWN     0x1
77 #define NOTIFICATION_EXTERNAL_EVENT_BUTTON_UP       0x2
78 #define NOTIFICATION_EXTERNAL_EVENT_EXTERNAL        0x3
79 
80 #define NOTIFICATION_EXTERNAL_STATUS_READY          0x0
81 #define NOTIFICATION_EXTERNAL_STATUS_PREVENT        0x1
82 
83 #define NOTIFICATION_EXTERNAL_REQUEST_NONE          0x0000
84 #define NOTIFICATION_EXTERNAL_REQUEST_QUEUE_OVERRUN 0x0001
85 #define NOTIFICATION_EXTERNAL_REQUEST_PLAY          0x0101
86 #define NOTIFICATION_EXTERNAL_REQUEST_REWIND_BACK   0x0102
87 #define NOTIFICATION_EXTERNAL_REQUEST_FAST_FORWARD  0x0103
88 #define NOTIFICATION_EXTERNAL_REQUEST_PAUSE         0x0104
89 #define NOTIFICATION_EXTERNAL_REQUEST_STOP          0x0106
90 #define NOTIFICATION_EXTERNAL_REQUEST_ASCII_LOW     0x0200
91 #define NOTIFICATION_EXTERNAL_REQUEST_ASCII_HIGH    0x02ff
92 
93 #define NOTIFICATION_MEDIA_EVENT_NO_CHANGE          0x0
94 #define NOTIFICATION_MEDIA_EVENT_EJECT_REQUEST      0x1
95 #define NOTIFICATION_MEDIA_EVENT_NEW_MEDIA          0x2
96 #define NOTIFICATION_MEDIA_EVENT_MEDIA_REMOVAL      0x3
97 #define NOTIFICATION_MEDIA_EVENT_MEDIA_CHANGE       0x4
98 
99 #define NOTIFICATION_BUSY_EVENT_NO_EVENT               0x0
100 #define NOTIFICATION_MULTI_HOST_EVENT_NO_CHANGE        0x0
101 #define NOTIFICATION_MULTI_HOST_EVENT_CONTROL_REQUEST  0x1
102 #define NOTIFICATION_MULTI_HOST_EVENT_CONTROL_GRANT    0x2
103 #define NOTIFICATION_MULTI_HOST_EVENT_CONTROL_RELEASE  0x3
104 
105 #define NOTIFICATION_MULTI_HOST_STATUS_READY           0x0
106 #define NOTIFICATION_MULTI_HOST_STATUS_PREVENT         0x1
107 
108 #define NOTIFICATION_MULTI_HOST_PRIORITY_NO_REQUESTS   0x0
109 #define NOTIFICATION_MULTI_HOST_PRIORITY_LOW           0x1
110 #define NOTIFICATION_MULTI_HOST_PRIORITY_MEDIUM        0x2
111 #define NOTIFICATION_MULTI_HOST_PRIORITY_HIGH          0x3
112 
113 #define NOTIFICATION_BUSY_EVENT_NO_EVENT            0x0
114 #define NOTIFICATION_BUSY_EVENT_NO_CHANGE           0x0
115 #define NOTIFICATION_BUSY_EVENT_BUSY                0x1
116 
117 #define NOTIFICATION_BUSY_STATUS_NO_EVENT           0x0
118 #define NOTIFICATION_BUSY_STATUS_POWER              0x1
119 #define NOTIFICATION_BUSY_STATUS_IMMEDIATE          0x2
120 #define NOTIFICATION_BUSY_STATUS_DEFERRED           0x3
121 
122 #define DVD_FORMAT_LEAD_IN          0x00
123 #define DVD_FORMAT_COPYRIGHT        0x01
124 #define DVD_FORMAT_DISK_KEY         0x02
125 #define DVD_FORMAT_BCA              0x03
126 #define DVD_FORMAT_MANUFACTURING    0x04
127 
128 #define DVD_REPORT_AGID            0x00
129 #define DVD_CHALLENGE_KEY          0x01
130 #define DVD_KEY_1                  0x02
131 #define DVD_KEY_2                  0x03
132 #define DVD_TITLE_KEY              0x04
133 #define DVD_REPORT_ASF             0x05
134 #define DVD_INVALIDATE_AGID        0x3F
135 
136 #define BLANK_FULL              0x0
137 #define BLANK_MINIMAL           0x1
138 #define BLANK_TRACK             0x2
139 #define BLANK_UNRESERVE_TRACK   0x3
140 #define BLANK_TAIL              0x4
141 #define BLANK_UNCLOSE_SESSION   0x5
142 #define BLANK_SESSION           0x6
143 
144 #define CD_EXPECTED_SECTOR_ANY          0x0
145 #define CD_EXPECTED_SECTOR_CDDA         0x1
146 #define CD_EXPECTED_SECTOR_MODE1        0x2
147 #define CD_EXPECTED_SECTOR_MODE2        0x3
148 #define CD_EXPECTED_SECTOR_MODE2_FORM1  0x4
149 #define CD_EXPECTED_SECTOR_MODE2_FORM2  0x5
150 
151 #define DISK_STATUS_EMPTY       0x00
152 #define DISK_STATUS_INCOMPLETE  0x01
153 #define DISK_STATUS_COMPLETE    0x02
154 #define DISK_STATUS_OTHERS      0x03
155 
156 #define LAST_SESSION_EMPTY              0x00
157 #define LAST_SESSION_INCOMPLETE         0x01
158 #define LAST_SESSION_RESERVED_DAMAGED   0x02
159 #define LAST_SESSION_COMPLETE           0x03
160 
161 #define DISK_TYPE_CDDA          0x00
162 #define DISK_TYPE_CDI           0x10
163 #define DISK_TYPE_XA            0x20
164 #define DISK_TYPE_UNDEFINED     0xFF
165 
166 #define DISC_BGFORMAT_STATE_NONE        0x0
167 #define DISC_BGFORMAT_STATE_INCOMPLETE  0x1
168 #define DISC_BGFORMAT_STATE_RUNNING     0x2
169 #define DISC_BGFORMAT_STATE_COMPLETE    0x3
170 
171 #define DATA_BLOCK_MODE0    0x0
172 #define DATA_BLOCK_MODE1    0x1
173 #define DATA_BLOCK_MODE2    0x2
174 
175 /* READ_TOC formats */
176 #define READ_TOC_FORMAT_TOC         0x00
177 #define READ_TOC_FORMAT_SESSION     0x01
178 #define READ_TOC_FORMAT_FULL_TOC    0x02
179 #define READ_TOC_FORMAT_PMA         0x03
180 #define READ_TOC_FORMAT_ATIP        0x04
181 
182 #define CDB6GENERIC_LENGTH                   6
183 #define CDB10GENERIC_LENGTH                  10
184 #define CDB12GENERIC_LENGTH                  12
185 
186 #define SETBITON                             1
187 #define SETBITOFF                            0
188 
189 /* Mode Sense/Select page constants */
190 #define MODE_PAGE_VENDOR_SPECIFIC       0x00
191 #define MODE_PAGE_ERROR_RECOVERY        0x01
192 #define MODE_PAGE_DISCONNECT            0x02
193 #define MODE_PAGE_FORMAT_DEVICE         0x03
194 #define MODE_PAGE_MRW                   0x03
195 #define MODE_PAGE_RIGID_GEOMETRY        0x04
196 #define MODE_PAGE_FLEXIBILE             0x05
197 #define MODE_PAGE_WRITE_PARAMETERS      0x05
198 #define MODE_PAGE_VERIFY_ERROR          0x07
199 #define MODE_PAGE_CACHING               0x08
200 #define MODE_PAGE_PERIPHERAL            0x09
201 #define MODE_PAGE_CONTROL               0x0A
202 #define MODE_PAGE_MEDIUM_TYPES          0x0B
203 #define MODE_PAGE_NOTCH_PARTITION       0x0C
204 #define MODE_PAGE_CD_AUDIO_CONTROL      0x0E
205 #define MODE_PAGE_DATA_COMPRESS         0x0F
206 #define MODE_PAGE_DEVICE_CONFIG         0x10
207 #define MODE_PAGE_XOR_CONTROL           0x10
208 #define MODE_PAGE_MEDIUM_PARTITION      0x11
209 #define MODE_PAGE_ENCLOSURE_SERVICES_MANAGEMENT 0x14
210 #define MODE_PAGE_EXTENDED              0x15
211 #define MODE_PAGE_EXTENDED_DEVICE_SPECIFIC 0x16
212 #define MODE_PAGE_CDVD_FEATURE_SET      0x18
213 #define MODE_PAGE_PROTOCOL_SPECIFIC_LUN 0x18
214 #define MODE_PAGE_PROTOCOL_SPECIFIC_PORT 0x19
215 #define MODE_PAGE_POWER_CONDITION       0x1A
216 #define MODE_PAGE_LUN_MAPPING           0x1B
217 #define MODE_PAGE_FAULT_REPORTING       0x1C
218 #define MODE_PAGE_CDVD_INACTIVITY       0x1D
219 #define MODE_PAGE_ELEMENT_ADDRESS       0x1D
220 #define MODE_PAGE_TRANSPORT_GEOMETRY    0x1E
221 #define MODE_PAGE_DEVICE_CAPABILITIES   0x1F
222 #define MODE_PAGE_CAPABILITIES          0x2A
223 
224 #define MODE_SENSE_RETURN_ALL           0x3f
225 
226 #define MODE_SENSE_CURRENT_VALUES       0x00
227 #define MODE_SENSE_CHANGEABLE_VALUES    0x40
228 #define MODE_SENSE_DEFAULT_VAULES       0x80
229 #define MODE_SENSE_SAVED_VALUES         0xc0
230 
231 /* SCSI CDB operation codes */
232 #define SCSIOP_TEST_UNIT_READY          0x00
233 #define SCSIOP_REZERO_UNIT              0x01
234 #define SCSIOP_REWIND                   0x01
235 #define SCSIOP_REQUEST_BLOCK_ADDR       0x02
236 #define SCSIOP_REQUEST_SENSE            0x03
237 #define SCSIOP_FORMAT_UNIT              0x04
238 #define SCSIOP_READ_BLOCK_LIMITS        0x05
239 #define SCSIOP_REASSIGN_BLOCKS          0x07
240 #define SCSIOP_INIT_ELEMENT_STATUS      0x07
241 #define SCSIOP_READ6                    0x08
242 #define SCSIOP_RECEIVE                  0x08
243 #define SCSIOP_WRITE6                   0x0A
244 #define SCSIOP_PRINT                    0x0A
245 #define SCSIOP_SEND                     0x0A
246 #define SCSIOP_SEEK6                    0x0B
247 #define SCSIOP_TRACK_SELECT             0x0B
248 #define SCSIOP_SLEW_PRINT               0x0B
249 #define SCSIOP_SET_CAPACITY             0x0B
250 #define SCSIOP_SEEK_BLOCK               0x0C
251 #define SCSIOP_PARTITION                0x0D
252 #define SCSIOP_READ_REVERSE             0x0F
253 #define SCSIOP_WRITE_FILEMARKS          0x10
254 #define SCSIOP_FLUSH_BUFFER             0x10
255 #define SCSIOP_SPACE                    0x11
256 #define SCSIOP_INQUIRY                  0x12
257 #define SCSIOP_VERIFY6                  0x13
258 #define SCSIOP_RECOVER_BUF_DATA         0x14
259 #define SCSIOP_MODE_SELECT              0x15
260 #define SCSIOP_RESERVE_UNIT             0x16
261 #define SCSIOP_RELEASE_UNIT             0x17
262 #define SCSIOP_COPY                     0x18
263 #define SCSIOP_ERASE                    0x19
264 #define SCSIOP_MODE_SENSE               0x1A
265 #define SCSIOP_START_STOP_UNIT          0x1B
266 #define SCSIOP_STOP_PRINT               0x1B
267 #define SCSIOP_LOAD_UNLOAD              0x1B
268 #define SCSIOP_RECEIVE_DIAGNOSTIC       0x1C
269 #define SCSIOP_SEND_DIAGNOSTIC          0x1D
270 #define SCSIOP_MEDIUM_REMOVAL           0x1E
271 
272 #define SCSIOP_READ_FORMATTED_CAPACITY  0x23
273 #define SCSIOP_READ_CAPACITY            0x25
274 #define SCSIOP_READ                     0x28
275 #define SCSIOP_WRITE                    0x2A
276 #define SCSIOP_SEEK                     0x2B
277 #define SCSIOP_LOCATE                   0x2B
278 #define SCSIOP_POSITION_TO_ELEMENT      0x2B
279 #define SCSIOP_WRITE_VERIFY             0x2E
280 #define SCSIOP_VERIFY                   0x2F
281 #define SCSIOP_SEARCH_DATA_HIGH         0x30
282 #define SCSIOP_SEARCH_DATA_EQUAL        0x31
283 #define SCSIOP_SEARCH_DATA_LOW          0x32
284 #define SCSIOP_SET_LIMITS               0x33
285 #define SCSIOP_READ_POSITION            0x34
286 #define SCSIOP_SYNCHRONIZE_CACHE        0x35
287 #define SCSIOP_COMPARE                  0x39
288 #define SCSIOP_COPY_COMPARE             0x3A
289 #define SCSIOP_WRITE_DATA_BUFF          0x3B
290 #define SCSIOP_READ_DATA_BUFF           0x3C
291 #define SCSIOP_WRITE_LONG               0x3F
292 #define SCSIOP_CHANGE_DEFINITION        0x40
293 #define SCSIOP_WRITE_SAME               0x41
294 #define SCSIOP_READ_SUB_CHANNEL         0x42
295 #define SCSIOP_READ_TOC                 0x43
296 #define SCSIOP_READ_HEADER              0x44
297 #define SCSIOP_REPORT_DENSITY_SUPPORT   0x44
298 #define SCSIOP_PLAY_AUDIO               0x45
299 #define SCSIOP_GET_CONFIGURATION        0x46
300 #define SCSIOP_PLAY_AUDIO_MSF           0x47
301 #define SCSIOP_PLAY_TRACK_INDEX         0x48
302 #define SCSIOP_PLAY_TRACK_RELATIVE      0x49
303 #define SCSIOP_GET_EVENT_STATUS         0x4A
304 #define SCSIOP_PAUSE_RESUME             0x4B
305 #define SCSIOP_LOG_SELECT               0x4C
306 #define SCSIOP_LOG_SENSE                0x4D
307 #define SCSIOP_STOP_PLAY_SCAN           0x4E
308 #define SCSIOP_XDWRITE                  0x50
309 #define SCSIOP_XPWRITE                  0x51
310 #define SCSIOP_READ_DISK_INFORMATION    0x51
311 #define SCSIOP_READ_DISC_INFORMATION    0x51
312 #define SCSIOP_READ_TRACK_INFORMATION   0x52
313 #define SCSIOP_XDWRITE_READ             0x53
314 #define SCSIOP_RESERVE_TRACK_RZONE      0x53
315 #define SCSIOP_SEND_OPC_INFORMATION     0x54
316 #define SCSIOP_MODE_SELECT10            0x55
317 #define SCSIOP_RESERVE_UNIT10           0x56
318 #define SCSIOP_RESERVE_ELEMENT          0x56
319 #define SCSIOP_RELEASE_UNIT10           0x57
320 #define SCSIOP_RELEASE_ELEMENT          0x57
321 #define SCSIOP_REPAIR_TRACK             0x58
322 #define SCSIOP_MODE_SENSE10             0x5A
323 #define SCSIOP_CLOSE_TRACK_SESSION      0x5B
324 #define SCSIOP_READ_BUFFER_CAPACITY     0x5C
325 #define SCSIOP_SEND_CUE_SHEET           0x5D
326 #define SCSIOP_PERSISTENT_RESERVE_IN    0x5E
327 #define SCSIOP_PERSISTENT_RESERVE_OUT   0x5F
328 
329 #define SCSIOP_REPORT_LUNS              0xA0
330 #define SCSIOP_BLANK                    0xA1
331 #define SCSIOP_ATA_PASSTHROUGH12        0xA1
332 #define SCSIOP_SEND_EVENT               0xA2
333 #define SCSIOP_SEND_KEY                 0xA3
334 #define SCSIOP_MAINTENANCE_IN           0xA3
335 #define SCSIOP_REPORT_KEY               0xA4
336 #define SCSIOP_MAINTENANCE_OUT          0xA4
337 #define SCSIOP_MOVE_MEDIUM              0xA5
338 #define SCSIOP_LOAD_UNLOAD_SLOT         0xA6
339 #define SCSIOP_EXCHANGE_MEDIUM          0xA6
340 #define SCSIOP_SET_READ_AHEAD           0xA7
341 #define SCSIOP_MOVE_MEDIUM_ATTACHED     0xA7
342 #define SCSIOP_READ12                   0xA8
343 #define SCSIOP_GET_MESSAGE              0xA8
344 #define SCSIOP_SERVICE_ACTION_OUT12     0xA9
345 #define SCSIOP_WRITE12                  0xAA
346 #define SCSIOP_SEND_MESSAGE             0xAB
347 #define SCSIOP_SERVICE_ACTION_IN12      0xAB
348 #define SCSIOP_GET_PERFORMANCE          0xAC
349 #define SCSIOP_READ_DVD_STRUCTURE       0xAD
350 #define SCSIOP_WRITE_VERIFY12           0xAE
351 #define SCSIOP_VERIFY12                 0xAF
352 #define SCSIOP_SEARCH_DATA_HIGH12       0xB0
353 #define SCSIOP_SEARCH_DATA_EQUAL12      0xB1
354 #define SCSIOP_SEARCH_DATA_LOW12        0xB2
355 #define SCSIOP_SET_LIMITS12             0xB3
356 #define SCSIOP_READ_ELEMENT_STATUS_ATTACHED 0xB4
357 #define SCSIOP_REQUEST_VOL_ELEMENT      0xB5
358 #define SCSIOP_SEND_VOLUME_TAG          0xB6
359 #define SCSIOP_SET_STREAMING            0xB6
360 #define SCSIOP_READ_DEFECT_DATA         0xB7
361 #define SCSIOP_READ_ELEMENT_STATUS      0xB8
362 #define SCSIOP_READ_CD_MSF              0xB9
363 #define SCSIOP_SCAN_CD                  0xBA
364 #define SCSIOP_REDUNDANCY_GROUP_IN      0xBA
365 #define SCSIOP_SET_CD_SPEED             0xBB
366 #define SCSIOP_REDUNDANCY_GROUP_OUT     0xBB
367 #define SCSIOP_PLAY_CD                  0xBC
368 #define SCSIOP_SPARE_IN                 0xBC
369 #define SCSIOP_MECHANISM_STATUS         0xBD
370 #define SCSIOP_SPARE_OUT                0xBD
371 #define SCSIOP_READ_CD                  0xBE
372 #define SCSIOP_VOLUME_SET_IN            0xBE
373 #define SCSIOP_SEND_DVD_STRUCTURE       0xBF
374 #define SCSIOP_VOLUME_SET_OUT           0xBF
375 #define SCSIOP_INIT_ELEMENT_RANGE       0xE7
376 
377 #define SCSIOP_XDWRITE_EXTENDED16       0x80
378 #define SCSIOP_WRITE_FILEMARKS16        0x80
379 #define SCSIOP_REBUILD16                0x81
380 #define SCSIOP_READ_REVERSE16           0x81
381 #define SCSIOP_REGENERATE16             0x82
382 #define SCSIOP_EXTENDED_COPY            0x83
383 #define SCSIOP_RECEIVE_COPY_RESULTS     0x84
384 #define SCSIOP_ATA_PASSTHROUGH16        0x85
385 #define SCSIOP_ACCESS_CONTROL_IN        0x86
386 #define SCSIOP_ACCESS_CONTROL_OUT       0x87
387 #define SCSIOP_READ16                   0x88
388 #define SCSIOP_WRITE16                  0x8A
389 #define SCSIOP_READ_ATTRIBUTES          0x8C
390 #define SCSIOP_WRITE_ATTRIBUTES         0x8D
391 #define SCSIOP_WRITE_VERIFY16           0x8E
392 #define SCSIOP_VERIFY16                 0x8F
393 #define SCSIOP_PREFETCH16               0x90
394 #define SCSIOP_SYNCHRONIZE_CACHE16      0x91
395 #define SCSIOP_SPACE16                  0x91
396 #define SCSIOP_LOCK_UNLOCK_CACHE16      0x92
397 #define SCSIOP_LOCATE16                 0x92
398 #define SCSIOP_WRITE_SAME16             0x93
399 #define SCSIOP_ERASE16                  0x93
400 #define SCSIOP_READ_CAPACITY16          0x9E
401 #define SCSIOP_SERVICE_ACTION_IN16      0x9E
402 #define SCSIOP_SERVICE_ACTION_OUT16     0x9F
403 
404 #define CDB_RETURN_ON_COMPLETION   0
405 #define CDB_RETURN_IMMEDIATE       1
406 
407 #define CDB_FORCE_MEDIA_ACCESS 0x08
408 
409 #define SCSIOP_DENON_EJECT_DISC    0xE6
410 #define SCSIOP_DENON_STOP_AUDIO    0xE7
411 #define SCSIOP_DENON_PLAY_AUDIO    0xE8
412 #define SCSIOP_DENON_READ_TOC      0xE9
413 #define SCSIOP_DENON_READ_SUBCODE  0xEB
414 
415 #define SCSIMESS_ABORT                0x06
416 #define SCSIMESS_ABORT_WITH_TAG       0x0D
417 #define SCSIMESS_BUS_DEVICE_RESET     0X0C
418 #define SCSIMESS_CLEAR_QUEUE          0X0E
419 #define SCSIMESS_COMMAND_COMPLETE     0X00
420 #define SCSIMESS_DISCONNECT           0X04
421 #define SCSIMESS_EXTENDED_MESSAGE     0X01
422 #define SCSIMESS_IDENTIFY             0X80
423 #define SCSIMESS_IDENTIFY_WITH_DISCON 0XC0
424 #define SCSIMESS_IGNORE_WIDE_RESIDUE  0X23
425 #define SCSIMESS_INITIATE_RECOVERY    0X0F
426 #define SCSIMESS_INIT_DETECTED_ERROR  0X05
427 #define SCSIMESS_LINK_CMD_COMP        0X0A
428 #define SCSIMESS_LINK_CMD_COMP_W_FLAG 0X0B
429 #define SCSIMESS_MESS_PARITY_ERROR    0X09
430 #define SCSIMESS_MESSAGE_REJECT       0X07
431 #define SCSIMESS_NO_OPERATION         0X08
432 #define SCSIMESS_HEAD_OF_QUEUE_TAG    0X21
433 #define SCSIMESS_ORDERED_QUEUE_TAG    0X22
434 #define SCSIMESS_SIMPLE_QUEUE_TAG     0X20
435 #define SCSIMESS_RELEASE_RECOVERY     0X10
436 #define SCSIMESS_RESTORE_POINTERS     0X03
437 #define SCSIMESS_SAVE_DATA_POINTER    0X02
438 #define SCSIMESS_TERMINATE_IO_PROCESS 0X11
439 
440 #define SCSIMESS_MODIFY_DATA_POINTER  0X00
441 #define SCSIMESS_SYNCHRONOUS_DATA_REQ 0X01
442 #define SCSIMESS_WIDE_DATA_REQUEST    0X03
443 
444 #define SCSIMESS_MODIFY_DATA_LENGTH   5
445 #define SCSIMESS_SYNCH_DATA_LENGTH    3
446 #define SCSIMESS_WIDE_DATA_LENGTH     2
447 
448 #define CDB_INQUIRY_EVPD           0x01
449 
450 #define LUN0_FORMAT_SAVING_DEFECT_LIST 0
451 #define USE_DEFAULTMSB 0
452 #define USE_DEFAULTLSB 0
453 
454 #define START_UNIT_CODE 0x01
455 #define STOP_UNIT_CODE 0x00
456 
457 /* INQUIRYDATA.DeviceType constants */
458 #define DIRECT_ACCESS_DEVICE              0x00
459 #define SEQUENTIAL_ACCESS_DEVICE          0x01
460 #define PRINTER_DEVICE                    0x02
461 #define PROCESSOR_DEVICE                  0x03
462 #define WRITE_ONCE_READ_MULTIPLE_DEVICE   0x04
463 #define READ_ONLY_DIRECT_ACCESS_DEVICE    0x05
464 #define SCANNER_DEVICE                    0x06
465 #define OPTICAL_DEVICE                    0x07
466 #define MEDIUM_CHANGER                    0x08
467 #define COMMUNICATION_DEVICE              0x09
468 #define ARRAY_CONTROLLER_DEVICE           0x0C
469 #define SCSI_ENCLOSURE_DEVICE             0x0D
470 #define REDUCED_BLOCK_DEVICE              0x0E
471 #define OPTICAL_CARD_READER_WRITER_DEVICE 0x0F
472 #define BRIDGE_CONTROLLER_DEVICE          0x10
473 #define OBJECT_BASED_STORAGE_DEVICE       0x11
474 #define LOGICAL_UNIT_NOT_PRESENT_DEVICE   0x7F
475 
476 #define DEVICE_QUALIFIER_ACTIVE           0x00
477 #define DEVICE_QUALIFIER_NOT_ACTIVE       0x01
478 #define DEVICE_QUALIFIER_NOT_SUPPORTED    0x03
479 
480 /* INQUIRYDATA.DeviceTypeQualifier constants */
481 #define DEVICE_CONNECTED 0x00
482 
483 #define SCSISTAT_GOOD                     0x00
484 #define SCSISTAT_CHECK_CONDITION          0x02
485 #define SCSISTAT_CONDITION_MET            0x04
486 #define SCSISTAT_BUSY                     0x08
487 #define SCSISTAT_INTERMEDIATE             0x10
488 #define SCSISTAT_INTERMEDIATE_COND_MET    0x14
489 #define SCSISTAT_RESERVATION_CONFLICT     0x18
490 #define SCSISTAT_COMMAND_TERMINATED       0x22
491 #define SCSISTAT_QUEUE_FULL               0x28
492 
493 #define VPD_MAX_BUFFER_SIZE                 0xff
494 
495 #define VPD_SUPPORTED_PAGES                 0x00
496 #define VPD_SERIAL_NUMBER                   0x80
497 #define VPD_DEVICE_IDENTIFIERS              0x83
498 #define VPD_MEDIA_SERIAL_NUMBER             0x84
499 #define VPD_SOFTWARE_INTERFACE_IDENTIFIERS  0x84
500 #define VPD_NETWORK_MANAGEMENT_ADDRESSES    0x85
501 #define VPD_EXTENDED_INQUIRY_DATA           0x86
502 #define VPD_MODE_PAGE_POLICY                0x87
503 #define VPD_SCSI_PORTS                      0x88
504 
505 #define RESERVATION_ACTION_READ_KEYS                    0x00
506 #define RESERVATION_ACTION_READ_RESERVATIONS            0x01
507 
508 #define RESERVATION_ACTION_REGISTER                     0x00
509 #define RESERVATION_ACTION_RESERVE                      0x01
510 #define RESERVATION_ACTION_RELEASE                      0x02
511 #define RESERVATION_ACTION_CLEAR                        0x03
512 #define RESERVATION_ACTION_PREEMPT                      0x04
513 #define RESERVATION_ACTION_PREEMPT_ABORT                0x05
514 #define RESERVATION_ACTION_REGISTER_IGNORE_EXISTING     0x06
515 
516 #define RESERVATION_SCOPE_LU                            0x00
517 #define RESERVATION_SCOPE_ELEMENT                       0x02
518 
519 #define RESERVATION_TYPE_WRITE_EXCLUSIVE                0x01
520 #define RESERVATION_TYPE_EXCLUSIVE                      0x03
521 #define RESERVATION_TYPE_WRITE_EXCLUSIVE_REGISTRANTS    0x05
522 #define RESERVATION_TYPE_EXCLUSIVE_REGISTRANTS          0x06
523 
524 #define SENSE_BUFFER_SIZE              18
525 
526 #define MAX_SENSE_BUFFER_SIZE          255
527 
528 #define MAX_ADDITIONAL_SENSE_BYTES (MAX_SENSE_BUFFER_SIZE - SENSE_BUFFER_SIZE)
529 
530 /* Sense codes */
531 #define SCSI_SENSE_NO_SENSE               0x00
532 #define SCSI_SENSE_RECOVERED_ERROR        0x01
533 #define SCSI_SENSE_NOT_READY              0x02
534 #define SCSI_SENSE_MEDIUM_ERROR           0x03
535 #define SCSI_SENSE_HARDWARE_ERROR         0x04
536 #define SCSI_SENSE_ILLEGAL_REQUEST        0x05
537 #define SCSI_SENSE_UNIT_ATTENTION         0x06
538 #define SCSI_SENSE_DATA_PROTECT           0x07
539 #define SCSI_SENSE_BLANK_CHECK            0x08
540 #define SCSI_SENSE_UNIQUE                 0x09
541 #define SCSI_SENSE_COPY_ABORTED           0x0A
542 #define SCSI_SENSE_ABORTED_COMMAND        0x0B
543 #define SCSI_SENSE_EQUAL                  0x0C
544 #define SCSI_SENSE_VOL_OVERFLOW           0x0D
545 #define SCSI_SENSE_MISCOMPARE             0x0E
546 #define SCSI_SENSE_RESERVED               0x0F
547 
548 /* Additional tape bit */
549 #define SCSI_ILLEGAL_LENGTH               0x20
550 #define SCSI_EOM                          0x40
551 #define SCSI_FILE_MARK                    0x80
552 
553 /* Additional Sense codes */
554 #define SCSI_ADSENSE_NO_SENSE                              0x00
555 #define SCSI_ADSENSE_NO_SEEK_COMPLETE                      0x02
556 #define SCSI_ADSENSE_LUN_NOT_READY                         0x04
557 #define SCSI_ADSENSE_LUN_COMMUNICATION                     0x08
558 #define SCSI_ADSENSE_WRITE_ERROR                           0x0C
559 #define SCSI_ADSENSE_TRACK_ERROR                           0x14
560 #define SCSI_ADSENSE_SEEK_ERROR                            0x15
561 #define SCSI_ADSENSE_REC_DATA_NOECC                        0x17
562 #define SCSI_ADSENSE_REC_DATA_ECC                          0x18
563 #define SCSI_ADSENSE_PARAMETER_LIST_LENGTH                 0x1A
564 #define SCSI_ADSENSE_ILLEGAL_COMMAND                       0x20
565 #define SCSI_ADSENSE_ILLEGAL_BLOCK                         0x21
566 #define SCSI_ADSENSE_INVALID_CDB                           0x24
567 #define SCSI_ADSENSE_INVALID_LUN                           0x25
568 #define SCSI_ADSENSE_INVALID_FIELD_PARAMETER_LIST          0x26
569 #define SCSI_ADSENSE_WRITE_PROTECT                         0x27
570 #define SCSI_ADSENSE_MEDIUM_CHANGED                        0x28
571 #define SCSI_ADSENSE_BUS_RESET                             0x29
572 #define SCSI_ADSENSE_PARAMETERS_CHANGED                    0x2A
573 #define SCSI_ADSENSE_INSUFFICIENT_TIME_FOR_OPERATION       0x2E
574 #define SCSI_ADSENSE_INVALID_MEDIA                         0x30
575 #define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE                    0x3a
576 #define SCSI_ADSENSE_POSITION_ERROR                        0x3b
577 #define SCSI_ADSENSE_OPERATING_CONDITIONS_CHANGED          0x3f
578 #define SCSI_ADSENSE_OPERATOR_REQUEST                      0x5a
579 #define SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5d
580 #define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK           0x64
581 #define SCSI_ADSENSE_COPY_PROTECTION_FAILURE               0x6f
582 #define SCSI_ADSENSE_POWER_CALIBRATION_ERROR               0x73
583 #define SCSI_ADSENSE_VENDOR_UNIQUE                         0x80
584 #define SCSI_ADSENSE_MUSIC_AREA                            0xA0
585 #define SCSI_ADSENSE_DATA_AREA                             0xA1
586 #define SCSI_ADSENSE_VOLUME_OVERFLOW                       0xA7
587 
588 #define SCSI_ADWRITE_PROTECT                        SCSI_ADSENSE_WRITE_PROTECT
589 #define SCSI_FAILURE_PREDICTION_THRESHOLD_EXCEEDED  SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED
590 
591 #define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE                   0x00
592 #define SCSI_SENSEQ_BECOMING_READY                         0x01
593 #define SCSI_SENSEQ_INIT_COMMAND_REQUIRED                  0x02
594 #define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED           0x03
595 #define SCSI_SENSEQ_FORMAT_IN_PROGRESS                     0x04
596 #define SCSI_SENSEQ_REBUILD_IN_PROGRESS                    0x05
597 #define SCSI_SENSEQ_RECALCULATION_IN_PROGRESS              0x06
598 #define SCSI_SENSEQ_OPERATION_IN_PROGRESS                  0x07
599 #define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS                 0x08
600 #define SCSI_SENSEQ_LOSS_OF_STREAMING                      0x09
601 #define SCSI_SENSEQ_PADDING_BLOCKS_ADDED                   0x0A
602 
603 #define SCSI_SENSEQ_COMM_FAILURE                 0x00
604 #define SCSI_SENSEQ_COMM_TIMEOUT                 0x01
605 #define SCSI_SENSEQ_COMM_PARITY_ERROR            0x02
606 #define SCSI_SESNEQ_COMM_CRC_ERROR               0x03
607 #define SCSI_SENSEQ_UNREACHABLE_TARGET           0x04
608 
609 #define SCSI_SENSEQ_FILEMARK_DETECTED 0x01
610 #define SCSI_SENSEQ_END_OF_MEDIA_DETECTED 0x02
611 #define SCSI_SENSEQ_SETMARK_DETECTED 0x03
612 #define SCSI_SENSEQ_BEGINNING_OF_MEDIA_DETECTED 0x04
613 
614 #define SCSI_SENSEQ_ILLEGAL_ELEMENT_ADDR 0x01
615 
616 #define SCSI_SENSEQ_DESTINATION_FULL 0x0d
617 #define SCSI_SENSEQ_SOURCE_EMPTY     0x0e
618 
619 #define SCSI_SENSEQ_INCOMPATIBLE_MEDIA_INSTALLED 0x00
620 #define SCSI_SENSEQ_UNKNOWN_FORMAT 0x01
621 #define SCSI_SENSEQ_INCOMPATIBLE_FORMAT 0x02
622 #define SCSI_SENSEQ_CLEANING_CARTRIDGE_INSTALLED 0x03
623 
624 #define SCSI_SENSEQ_TARGET_OPERATING_CONDITIONS_CHANGED 0x00
625 #define SCSI_SENSEQ_MICROCODE_CHANGED                   0x01
626 #define SCSI_SENSEQ_OPERATING_DEFINITION_CHANGED        0x02
627 #define SCSI_SENSEQ_INQUIRY_DATA_CHANGED                0x03
628 #define SCSI_SENSEQ_COMPONENT_DEVICE_ATTACHED           0x04
629 #define SCSI_SENSEQ_DEVICE_IDENTIFIER_CHANGED           0x05
630 #define SCSI_SENSEQ_REDUNDANCY_GROUP_MODIFIED           0x06
631 #define SCSI_SENSEQ_REDUNDANCY_GROUP_DELETED            0x07
632 #define SCSI_SENSEQ_SPARE_MODIFIED                      0x08
633 #define SCSI_SENSEQ_SPARE_DELETED                       0x09
634 #define SCSI_SENSEQ_VOLUME_SET_MODIFIED                 0x0A
635 #define SCSI_SENSEQ_VOLUME_SET_DELETED                  0x0B
636 #define SCSI_SENSEQ_VOLUME_SET_DEASSIGNED               0x0C
637 #define SCSI_SENSEQ_VOLUME_SET_REASSIGNED               0x0D
638 #define SCSI_SENSEQ_REPORTED_LUNS_DATA_CHANGED          0x0E
639 #define SCSI_SENSEQ_ECHO_BUFFER_OVERWRITTEN             0x0F
640 #define SCSI_SENSEQ_MEDIUM_LOADABLE                     0x10
641 #define SCSI_SENSEQ_MEDIUM_AUXILIARY_MEMORY_ACCESSIBLE  0x11
642 
643 #define SCSI_SENSEQ_STATE_CHANGE_INPUT     0x00
644 #define SCSI_SENSEQ_MEDIUM_REMOVAL         0x01
645 #define SCSI_SENSEQ_WRITE_PROTECT_ENABLE   0x02
646 #define SCSI_SENSEQ_WRITE_PROTECT_DISABLE  0x03
647 
648 #define SCSI_SENSEQ_AUTHENTICATION_FAILURE                          0x00
649 #define SCSI_SENSEQ_KEY_NOT_PRESENT                                 0x01
650 #define SCSI_SENSEQ_KEY_NOT_ESTABLISHED                             0x02
651 #define SCSI_SENSEQ_READ_OF_SCRAMBLED_SECTOR_WITHOUT_AUTHENTICATION 0x03
652 #define SCSI_SENSEQ_MEDIA_CODE_MISMATCHED_TO_LOGICAL_UNIT           0x04
653 #define SCSI_SENSEQ_LOGICAL_UNIT_RESET_COUNT_ERROR                  0x05
654 
655 #define SCSI_SENSEQ_POWER_CALIBRATION_AREA_ALMOST_FULL 0x01
656 #define SCSI_SENSEQ_POWER_CALIBRATION_AREA_FULL        0x02
657 #define SCSI_SENSEQ_POWER_CALIBRATION_AREA_ERROR       0x03
658 #define SCSI_SENSEQ_PMA_RMA_UPDATE_FAILURE             0x04
659 #define SCSI_SENSEQ_PMA_RMA_IS_FULL                    0x05
660 #define SCSI_SENSEQ_PMA_RMA_ALMOST_FULL                0x06
661 
662 #define FILE_DEVICE_SCSI 0x0000001b
663 
664 #define IOCTL_SCSI_EXECUTE_IN ((FILE_DEVICE_SCSI << 16) + 0x0011)
665 #define IOCTL_SCSI_EXECUTE_OUT ((FILE_DEVICE_SCSI << 16) + 0x0012)
666 #define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013)
667 
668 /* SMART support in ATAPI */
669 #define IOCTL_SCSI_MINIPORT_SMART_VERSION               ((FILE_DEVICE_SCSI << 16) + 0x0500)
670 #define IOCTL_SCSI_MINIPORT_IDENTIFY                    ((FILE_DEVICE_SCSI << 16) + 0x0501)
671 #define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS          ((FILE_DEVICE_SCSI << 16) + 0x0502)
672 #define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS       ((FILE_DEVICE_SCSI << 16) + 0x0503)
673 #define IOCTL_SCSI_MINIPORT_ENABLE_SMART                ((FILE_DEVICE_SCSI << 16) + 0x0504)
674 #define IOCTL_SCSI_MINIPORT_DISABLE_SMART               ((FILE_DEVICE_SCSI << 16) + 0x0505)
675 #define IOCTL_SCSI_MINIPORT_RETURN_STATUS               ((FILE_DEVICE_SCSI << 16) + 0x0506)
676 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE     ((FILE_DEVICE_SCSI << 16) + 0x0507)
677 #define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES       ((FILE_DEVICE_SCSI << 16) + 0x0508)
678 #define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS       ((FILE_DEVICE_SCSI << 16) + 0x0509)
679 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTO_OFFLINE ((FILE_DEVICE_SCSI << 16) + 0x050a)
680 #define IOCTL_SCSI_MINIPORT_READ_SMART_LOG              ((FILE_DEVICE_SCSI << 16) + 0x050b)
681 #define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG             ((FILE_DEVICE_SCSI << 16) + 0x050c)
682 
683 /* CLUSTER support */
684 #define IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0520)
685 #define IOCTL_SCSI_MINIPORT_NOT_CLUSTER_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0521)
686 
687 #define MODE_FD_SINGLE_SIDE               0x01
688 #define MODE_FD_DOUBLE_SIDE               0x02
689 #define MODE_FD_MAXIMUM_TYPE              0x1E
690 #define MODE_DSP_FUA_SUPPORTED            0x10
691 #define MODE_DSP_WRITE_PROTECT            0x80
692 
693 #define CDDA_CHANNEL_MUTED      0x0
694 #define CDDA_CHANNEL_ZERO       0x1
695 #define CDDA_CHANNEL_ONE        0x2
696 #define CDDA_CHANNEL_TWO        0x4
697 #define CDDA_CHANNEL_THREE      0x8
698 
699 #define CDVD_LMT_CADDY              0
700 #define CDVD_LMT_TRAY               1
701 #define CDVD_LMT_POPUP              2
702 #define CDVD_LMT_RESERVED1          3
703 #define CDVD_LMT_CHANGER_INDIVIDUAL 4
704 #define CDVD_LMT_CHANGER_CARTRIDGE  5
705 #define CDVD_LMT_RESERVED2          6
706 #define CDVD_LMT_RESERVED3          7
707 
708 #define LOADING_MECHANISM_CADDY                 0x00
709 #define LOADING_MECHANISM_TRAY                  0x01
710 #define LOADING_MECHANISM_POPUP                 0x02
711 #define LOADING_MECHANISM_INDIVIDUAL_CHANGER    0x04
712 #define LOADING_MECHANISM_CARTRIDGE_CHANGER     0x05
713 
714 #define MODE_BLOCK_DESC_LENGTH        8
715 #define MODE_HEADER_LENGTH            4
716 #define MODE_HEADER_LENGTH10          8
717 
718 /* CDROM audio control */
719 #define CDB_AUDIO_PAUSE                   0x00
720 #define CDB_AUDIO_RESUME                  0x01
721 #define CDB_DEVICE_START                  0x11
722 #define CDB_DEVICE_STOP                   0x10
723 #define CDB_EJECT_MEDIA                   0x10
724 #define CDB_LOAD_MEDIA                    0x01
725 #define CDB_SUBCHANNEL_HEADER             0x00
726 #define CDB_SUBCHANNEL_BLOCK              0x01
727 
728 #define CDROM_AUDIO_CONTROL_PAGE          0x0E
729 #define MODE_SELECT_IMMEDIATE             0x04
730 #define MODE_SELECT_PFBIT                 0x10
731 
732 #define CDB_USE_MSF                       0x01
733 
734 /* Multisession CDROMs */
735 #define GET_LAST_SESSION 0x01
736 #define GET_SESSION_DATA 0x02
737 
738 typedef union _CDB {
739   struct _CDB6GENERIC {
740     UCHAR OperationCode;
741     UCHAR Immediate:1;
742     UCHAR CommandUniqueBits:4;
743     UCHAR LogicalUnitNumber:3;
744     UCHAR CommandUniqueBytes[3];
745     UCHAR Link:1;
746     UCHAR Flag:1;
747     UCHAR Reserved:4;
748     UCHAR VendorUnique:2;
749   } CDB6GENERIC;
750   struct _CDB6READWRITE {
751     UCHAR OperationCode;
752     UCHAR LogicalBlockMsb1:5;
753     UCHAR LogicalUnitNumber:3;
754     UCHAR LogicalBlockMsb0;
755     UCHAR LogicalBlockLsb;
756     UCHAR TransferBlocks;
757     UCHAR Control;
758   } CDB6READWRITE;
759   struct _CDB6INQUIRY {
760     UCHAR OperationCode;
761     UCHAR Reserved1:5;
762     UCHAR LogicalUnitNumber:3;
763     UCHAR PageCode;
764     UCHAR IReserved;
765     UCHAR AllocationLength;
766     UCHAR Control;
767   } CDB6INQUIRY;
768   struct _CDB6INQUIRY3 {
769     UCHAR OperationCode;
770     UCHAR EnableVitalProductData:1;
771     UCHAR CommandSupportData:1;
772     UCHAR Reserved1:6;
773     UCHAR PageCode;
774     UCHAR Reserved2;
775     UCHAR AllocationLength;
776     UCHAR Control;
777   } CDB6INQUIRY3;
778   struct _CDB6VERIFY {
779     UCHAR OperationCode;
780     UCHAR Fixed:1;
781     UCHAR ByteCompare:1;
782     UCHAR Immediate:1;
783     UCHAR Reserved:2;
784     UCHAR LogicalUnitNumber:3;
785     UCHAR VerificationLength[3];
786     UCHAR Control;
787   } CDB6VERIFY;
788   struct _CDB6FORMAT {
789     UCHAR OperationCode;
790     UCHAR FormatControl:5;
791     UCHAR LogicalUnitNumber:3;
792     UCHAR FReserved1;
793     UCHAR InterleaveMsb;
794     UCHAR InterleaveLsb;
795     UCHAR FReserved2;
796   } CDB6FORMAT;
797   struct _CDB10 {
798     UCHAR OperationCode;
799     UCHAR RelativeAddress:1;
800     UCHAR Reserved1:2;
801     UCHAR ForceUnitAccess:1;
802     UCHAR DisablePageOut:1;
803     UCHAR LogicalUnitNumber:3;
804     UCHAR LogicalBlockByte0;
805     UCHAR LogicalBlockByte1;
806     UCHAR LogicalBlockByte2;
807     UCHAR LogicalBlockByte3;
808     UCHAR Reserved2;
809     UCHAR TransferBlocksMsb;
810     UCHAR TransferBlocksLsb;
811     UCHAR Control;
812   } CDB10;
813   struct _CDB12 {
814     UCHAR OperationCode;
815     UCHAR RelativeAddress:1;
816     UCHAR Reserved1:2;
817     UCHAR ForceUnitAccess:1;
818     UCHAR DisablePageOut:1;
819     UCHAR LogicalUnitNumber:3;
820     UCHAR LogicalBlock[4];
821     UCHAR TransferLength[4];
822     UCHAR Reserved2;
823     UCHAR Control;
824   } CDB12;
825   struct _CDB16 {
826      UCHAR OperationCode;
827      UCHAR Reserved1:3;
828      UCHAR ForceUnitAccess:1;
829      UCHAR DisablePageOut:1;
830      UCHAR Protection:3;
831      UCHAR LogicalBlock[8];
832      UCHAR TransferLength[4];
833      UCHAR Reserved2;
834      UCHAR Control;
835   } CDB16;
836   struct _PAUSE_RESUME {
837     UCHAR OperationCode;
838     UCHAR Reserved1:5;
839     UCHAR LogicalUnitNumber:3;
840     UCHAR Reserved2[6];
841     UCHAR Action;
842     UCHAR Control;
843   } PAUSE_RESUME;
844   struct _READ_TOC {
845     UCHAR OperationCode;
846     UCHAR Reserved0:1;
847     UCHAR Msf:1;
848     UCHAR Reserved1:3;
849     UCHAR LogicalUnitNumber:3;
850     UCHAR Format2:4;
851     UCHAR Reserved2:4;
852     UCHAR Reserved3[3];
853     UCHAR StartingTrack;
854     UCHAR AllocationLength[2];
855     UCHAR Control:6;
856     UCHAR Format:2;
857   } READ_TOC;
858   struct _READ_DISK_INFORMATION {
859     UCHAR OperationCode;
860     UCHAR Reserved1:5;
861     UCHAR Lun:3;
862     UCHAR Reserved2[5];
863     UCHAR AllocationLength[2];
864     UCHAR Control;
865   } READ_DISK_INFORMATION;
866   struct _READ_TRACK_INFORMATION {
867     UCHAR OperationCode;
868     UCHAR Track:1;
869     UCHAR Reserved1:3;
870     UCHAR Reserved2:1;
871     UCHAR Lun:3;
872     UCHAR BlockAddress[4];
873     UCHAR Reserved3;
874     UCHAR AllocationLength[2];
875     UCHAR Control;
876   } READ_TRACK_INFORMATION;
877   struct _RESERVE_TRACK_RZONE {
878     UCHAR OperationCode;
879     UCHAR Reserved1[4];
880     UCHAR ReservationSize[4];
881     UCHAR Control;
882   } RESERVE_TRACK_RZONE;
883   struct _SEND_OPC_INFORMATION {
884     UCHAR OperationCode;
885     UCHAR DoOpc:1;
886     UCHAR Reserved1:7;
887     UCHAR Exclude0:1;
888     UCHAR Exclude1:1;
889     UCHAR Reserved2:6;
890     UCHAR Reserved3[4];
891     UCHAR ParameterListLength[2];
892     UCHAR Reserved4;
893   } SEND_OPC_INFORMATION;
894   struct _REPAIR_TRACK {
895     UCHAR OperationCode;
896     UCHAR Immediate:1;
897     UCHAR Reserved1:7;
898     UCHAR Reserved2[2];
899     UCHAR TrackNumber[2];
900     UCHAR Reserved3[3];
901     UCHAR Control;
902   } REPAIR_TRACK;
903   struct _CLOSE_TRACK {
904     UCHAR OperationCode;
905     UCHAR Immediate:1;
906     UCHAR Reserved1:7;
907     UCHAR Track:1;
908     UCHAR Session:1;
909     UCHAR Reserved2:6;
910     UCHAR Reserved3;
911     UCHAR TrackNumber[2];
912     UCHAR Reserved4[3];
913     UCHAR Control;
914   } CLOSE_TRACK;
915   struct _READ_BUFFER_CAPACITY {
916     UCHAR OperationCode;
917     UCHAR BlockInfo:1;
918     UCHAR Reserved1:7;
919     UCHAR Reserved2[5];
920     UCHAR AllocationLength[2];
921     UCHAR Control;
922   } READ_BUFFER_CAPACITY;
923   struct _SEND_CUE_SHEET {
924     UCHAR OperationCode;
925     UCHAR Reserved[5];
926     UCHAR CueSheetSize[3];
927     UCHAR Control;
928   } SEND_CUE_SHEET;
929   struct _READ_HEADER {
930     UCHAR OperationCode;
931     UCHAR Reserved1:1;
932     UCHAR Msf:1;
933     UCHAR Reserved2:3;
934     UCHAR Lun:3;
935     UCHAR LogicalBlockAddress[4];
936     UCHAR Reserved3;
937     UCHAR AllocationLength[2];
938     UCHAR Control;
939   } READ_HEADER;
940   struct _PLAY_AUDIO {
941     UCHAR OperationCode;
942     UCHAR Reserved1:5;
943     UCHAR LogicalUnitNumber:3;
944     UCHAR StartingBlockAddress[4];
945     UCHAR Reserved2;
946     UCHAR PlayLength[2];
947     UCHAR Control;
948   } PLAY_AUDIO;
949   struct _PLAY_AUDIO_MSF {
950     UCHAR OperationCode;
951     UCHAR Reserved1:5;
952     UCHAR LogicalUnitNumber:3;
953     UCHAR Reserved2;
954     UCHAR StartingM;
955     UCHAR StartingS;
956     UCHAR StartingF;
957     UCHAR EndingM;
958     UCHAR EndingS;
959     UCHAR EndingF;
960     UCHAR Control;
961   } PLAY_AUDIO_MSF;
962   struct _BLANK_MEDIA {
963     UCHAR OperationCode;
964     UCHAR BlankType:3;
965     UCHAR Reserved1:1;
966     UCHAR Immediate:1;
967     UCHAR Reserved2:3;
968     UCHAR AddressOrTrack[4];
969     UCHAR Reserved3[5];
970     UCHAR Control;
971   } BLANK_MEDIA;
972   struct _PLAY_CD {
973     UCHAR OperationCode;
974     UCHAR Reserved1:1;
975     UCHAR CMSF:1;
976     UCHAR ExpectedSectorType:3;
977     UCHAR Lun:3;
978     struct _LBA {
979       UCHAR StartingBlockAddress[4];
980       UCHAR PlayLength[4];
981     };
982     struct _MSF {
983       UCHAR Reserved1;
984       UCHAR StartingM;
985       UCHAR StartingS;
986       UCHAR StartingF;
987       UCHAR EndingM;
988       UCHAR EndingS;
989       UCHAR EndingF;
990       UCHAR Reserved2;
991     };
992     _ANONYMOUS_UNION union {
993       struct _LBA LBA;
994       struct _MSF MSF;
995     } DUMMYUNIONNAME;
996     UCHAR Audio:1;
997     UCHAR Composite:1;
998     UCHAR Port1:1;
999     UCHAR Port2:1;
1000     UCHAR Reserved2:3;
1001     UCHAR Speed:1;
1002     UCHAR Control;
1003   } PLAY_CD;
1004   struct _SCAN_CD {
1005     UCHAR OperationCode;
1006     UCHAR RelativeAddress:1;
1007     UCHAR Reserved1:3;
1008     UCHAR Direct:1;
1009     UCHAR Lun:3;
1010     UCHAR StartingAddress[4];
1011     UCHAR Reserved2[3];
1012     UCHAR Reserved3:6;
1013     UCHAR Type:2;
1014     UCHAR Reserved4;
1015     UCHAR Control;
1016   } SCAN_CD;
1017   struct _STOP_PLAY_SCAN {
1018     UCHAR OperationCode;
1019     UCHAR Reserved1:5;
1020     UCHAR Lun:3;
1021     UCHAR Reserved2[7];
1022     UCHAR Control;
1023   } STOP_PLAY_SCAN;
1024   struct _SUBCHANNEL {
1025     UCHAR OperationCode;
1026     UCHAR Reserved0:1;
1027     UCHAR Msf:1;
1028     UCHAR Reserved1:3;
1029     UCHAR LogicalUnitNumber:3;
1030     UCHAR Reserved2:6;
1031     UCHAR SubQ:1;
1032     UCHAR Reserved3:1;
1033     UCHAR Format;
1034     UCHAR Reserved4[2];
1035     UCHAR TrackNumber;
1036     UCHAR AllocationLength[2];
1037     UCHAR Control;
1038   } SUBCHANNEL;
1039   struct _READ_CD {
1040     UCHAR OperationCode;
1041     UCHAR RelativeAddress:1;
1042     UCHAR Reserved0:1;
1043     UCHAR ExpectedSectorType:3;
1044     UCHAR Lun:3;
1045     UCHAR StartingLBA[4];
1046     UCHAR TransferBlocks[3];
1047     UCHAR Reserved2:1;
1048     UCHAR ErrorFlags:2;
1049     UCHAR IncludeEDC:1;
1050     UCHAR IncludeUserData:1;
1051     UCHAR HeaderCode:2;
1052     UCHAR IncludeSyncData:1;
1053     UCHAR SubChannelSelection:3;
1054     UCHAR Reserved3:5;
1055     UCHAR Control;
1056   } READ_CD;
1057   struct _READ_CD_MSF {
1058     UCHAR OperationCode;
1059     UCHAR RelativeAddress:1;
1060     UCHAR Reserved1:1;
1061     UCHAR ExpectedSectorType:3;
1062     UCHAR Lun:3;
1063     UCHAR Reserved2;
1064     UCHAR StartingM;
1065     UCHAR StartingS;
1066     UCHAR StartingF;
1067     UCHAR EndingM;
1068     UCHAR EndingS;
1069     UCHAR EndingF;
1070     UCHAR Reserved3;
1071     UCHAR Reserved4:1;
1072     UCHAR ErrorFlags:2;
1073     UCHAR IncludeEDC:1;
1074     UCHAR IncludeUserData:1;
1075     UCHAR HeaderCode:2;
1076     UCHAR IncludeSyncData:1;
1077     UCHAR SubChannelSelection:3;
1078     UCHAR Reserved5:5;
1079     UCHAR Control;
1080   } READ_CD_MSF;
1081   struct _PLXTR_READ_CDDA {
1082     UCHAR OperationCode;
1083     UCHAR Reserved0:5;
1084     UCHAR LogicalUnitNumber:3;
1085     UCHAR LogicalBlockByte0;
1086     UCHAR LogicalBlockByte1;
1087     UCHAR LogicalBlockByte2;
1088     UCHAR LogicalBlockByte3;
1089     UCHAR TransferBlockByte0;
1090     UCHAR TransferBlockByte1;
1091     UCHAR TransferBlockByte2;
1092     UCHAR TransferBlockByte3;
1093     UCHAR SubCode;
1094     UCHAR Control;
1095   } PLXTR_READ_CDDA;
1096   struct _NEC_READ_CDDA {
1097     UCHAR OperationCode;
1098     UCHAR Reserved0;
1099     UCHAR LogicalBlockByte0;
1100     UCHAR LogicalBlockByte1;
1101     UCHAR LogicalBlockByte2;
1102     UCHAR LogicalBlockByte3;
1103     UCHAR Reserved1;
1104     UCHAR TransferBlockByte0;
1105     UCHAR TransferBlockByte1;
1106     UCHAR Control;
1107   } NEC_READ_CDDA;
1108   struct _MODE_SENSE {
1109     UCHAR OperationCode;
1110     UCHAR Reserved1:3;
1111     UCHAR Dbd:1;
1112     UCHAR Reserved2:1;
1113     UCHAR LogicalUnitNumber:3;
1114     UCHAR PageCode:6;
1115     UCHAR Pc:2;
1116     UCHAR Reserved3;
1117     UCHAR AllocationLength;
1118     UCHAR Control;
1119   } MODE_SENSE;
1120   struct _MODE_SENSE10 {
1121     UCHAR OperationCode;
1122     UCHAR Reserved1:3;
1123     UCHAR Dbd:1;
1124     UCHAR Reserved2:1;
1125     UCHAR LogicalUnitNumber:3;
1126     UCHAR PageCode:6;
1127     UCHAR Pc:2;
1128     UCHAR Reserved3[4];
1129     UCHAR AllocationLength[2];
1130     UCHAR Control;
1131   } MODE_SENSE10;
1132   struct _MODE_SELECT {
1133     UCHAR OperationCode;
1134     UCHAR SPBit:1;
1135     UCHAR Reserved1:3;
1136     UCHAR PFBit:1;
1137     UCHAR LogicalUnitNumber:3;
1138     UCHAR Reserved2[2];
1139     UCHAR ParameterListLength;
1140     UCHAR Control;
1141   } MODE_SELECT;
1142   struct _MODE_SELECT10 {
1143     UCHAR OperationCode;
1144     UCHAR SPBit:1;
1145     UCHAR Reserved1:3;
1146     UCHAR PFBit:1;
1147     UCHAR LogicalUnitNumber:3;
1148     UCHAR Reserved2[5];
1149     UCHAR ParameterListLength[2];
1150     UCHAR Control;
1151   } MODE_SELECT10;
1152   struct _LOCATE {
1153     UCHAR OperationCode;
1154     UCHAR Immediate:1;
1155     UCHAR CPBit:1;
1156     UCHAR BTBit:1;
1157     UCHAR Reserved1:2;
1158     UCHAR LogicalUnitNumber:3;
1159     UCHAR Reserved3;
1160     UCHAR LogicalBlockAddress[4];
1161     UCHAR Reserved4;
1162     UCHAR Partition;
1163     UCHAR Control;
1164   } LOCATE;
1165   struct _LOGSENSE {
1166     UCHAR OperationCode;
1167     UCHAR SPBit:1;
1168     UCHAR PPCBit:1;
1169     UCHAR Reserved1:3;
1170     UCHAR LogicalUnitNumber:3;
1171     UCHAR PageCode:6;
1172     UCHAR PCBit:2;
1173     UCHAR Reserved2;
1174     UCHAR Reserved3;
1175     UCHAR ParameterPointer[2];
1176     UCHAR AllocationLength[2];
1177     UCHAR Control;
1178   } LOGSENSE;
1179   struct _LOGSELECT {
1180     UCHAR OperationCode;
1181     UCHAR SPBit:1;
1182     UCHAR PCRBit:1;
1183     UCHAR Reserved1:3;
1184     UCHAR LogicalUnitNumber:3;
1185     UCHAR Reserved:6;
1186     UCHAR PCBit:2;
1187     UCHAR Reserved2[4];
1188     UCHAR ParameterListLength[2];
1189     UCHAR Control;
1190   } LOGSELECT;
1191   struct _PRINT {
1192     UCHAR OperationCode;
1193     UCHAR Reserved:5;
1194     UCHAR LogicalUnitNumber:3;
1195     UCHAR TransferLength[3];
1196     UCHAR Control;
1197   } PRINT;
1198   struct _SEEK {
1199     UCHAR OperationCode;
1200     UCHAR Reserved1:5;
1201     UCHAR LogicalUnitNumber:3;
1202     UCHAR LogicalBlockAddress[4];
1203     UCHAR Reserved2[3];
1204     UCHAR Control;
1205   } SEEK;
1206   struct _ERASE {
1207     UCHAR OperationCode;
1208     UCHAR Long:1;
1209     UCHAR Immediate:1;
1210     UCHAR Reserved1:3;
1211     UCHAR LogicalUnitNumber:3;
1212     UCHAR Reserved2[3];
1213     UCHAR Control;
1214   } ERASE;
1215   struct _START_STOP {
1216     UCHAR OperationCode;
1217     UCHAR Immediate:1;
1218     UCHAR Reserved1:4;
1219     UCHAR LogicalUnitNumber:3;
1220     UCHAR Reserved2[2];
1221     UCHAR Start:1;
1222     UCHAR LoadEject:1;
1223     UCHAR Reserved3:6;
1224     UCHAR Control;
1225   } START_STOP;
1226   struct _MEDIA_REMOVAL {
1227     UCHAR OperationCode;
1228     UCHAR Reserved1:5;
1229     UCHAR LogicalUnitNumber:3;
1230     UCHAR Reserved2[2];
1231     UCHAR Prevent:1;
1232     UCHAR Persistant:1;
1233     UCHAR Reserved3:6;
1234     UCHAR Control;
1235   } MEDIA_REMOVAL;
1236   struct _SEEK_BLOCK {
1237     UCHAR OperationCode;
1238     UCHAR Immediate:1;
1239     UCHAR Reserved1:7;
1240     UCHAR BlockAddress[3];
1241     UCHAR Link:1;
1242     UCHAR Flag:1;
1243     UCHAR Reserved2:4;
1244     UCHAR VendorUnique:2;
1245   } SEEK_BLOCK;
1246   struct _REQUEST_BLOCK_ADDRESS {
1247     UCHAR OperationCode;
1248     UCHAR Reserved1[3];
1249     UCHAR AllocationLength;
1250     UCHAR Link:1;
1251     UCHAR Flag:1;
1252     UCHAR Reserved2:4;
1253     UCHAR VendorUnique:2;
1254   } REQUEST_BLOCK_ADDRESS;
1255   struct _PARTITION {
1256     UCHAR OperationCode;
1257     UCHAR Immediate:1;
1258     UCHAR Sel:1;
1259     UCHAR PartitionSelect:6;
1260     UCHAR Reserved1[3];
1261     UCHAR Control;
1262   } PARTITION;
1263   struct _WRITE_TAPE_MARKS {
1264     UCHAR OperationCode;
1265     UCHAR Immediate:1;
1266     UCHAR WriteSetMarks:1;
1267     UCHAR Reserved:3;
1268     UCHAR LogicalUnitNumber:3;
1269     UCHAR TransferLength[3];
1270     UCHAR Control;
1271   } WRITE_TAPE_MARKS;
1272   struct _SPACE_TAPE_MARKS {
1273     UCHAR OperationCode;
1274     UCHAR Code:3;
1275     UCHAR Reserved:2;
1276     UCHAR LogicalUnitNumber:3;
1277     UCHAR NumMarksMSB;
1278     UCHAR NumMarks;
1279     UCHAR NumMarksLSB;
1280   union {
1281     UCHAR value;
1282     struct {
1283       UCHAR Link:1;
1284       UCHAR Flag:1;
1285       UCHAR Reserved:4;
1286       UCHAR VendorUnique:2;
1287     } Fields;
1288   } Byte6;
1289   } SPACE_TAPE_MARKS;
1290   struct _READ_POSITION {
1291     UCHAR Operation;
1292     UCHAR BlockType:1;
1293     UCHAR Reserved1:4;
1294     UCHAR Lun:3;
1295     UCHAR Reserved2[7];
1296     UCHAR Control;
1297   } READ_POSITION;
1298   struct _CDB6READWRITETAPE {
1299     UCHAR OperationCode;
1300     UCHAR VendorSpecific:5;
1301     UCHAR Reserved:3;
1302     UCHAR TransferLenMSB;
1303     UCHAR TransferLen;
1304     UCHAR TransferLenLSB;
1305     UCHAR Link:1;
1306     UCHAR Flag:1;
1307     UCHAR Reserved1:4;
1308     UCHAR VendorUnique:2;
1309   } CDB6READWRITETAPE;
1310   struct _INIT_ELEMENT_STATUS {
1311     UCHAR OperationCode;
1312     UCHAR Reserved1:5;
1313     UCHAR LogicalUnitNubmer:3;
1314     UCHAR Reserved2[3];
1315     UCHAR Reserved3:7;
1316     UCHAR NoBarCode:1;
1317   } INIT_ELEMENT_STATUS;
1318   struct _INITIALIZE_ELEMENT_RANGE {
1319     UCHAR OperationCode;
1320     UCHAR Range:1;
1321     UCHAR Reserved1:4;
1322     UCHAR LogicalUnitNubmer:3;
1323     UCHAR FirstElementAddress[2];
1324     UCHAR Reserved2[2];
1325     UCHAR NumberOfElements[2];
1326     UCHAR Reserved3;
1327     UCHAR Reserved4:7;
1328     UCHAR NoBarCode:1;
1329   } INITIALIZE_ELEMENT_RANGE;
1330   struct _POSITION_TO_ELEMENT {
1331     UCHAR OperationCode;
1332     UCHAR Reserved1:5;
1333     UCHAR LogicalUnitNumber:3;
1334     UCHAR TransportElementAddress[2];
1335     UCHAR DestinationElementAddress[2];
1336     UCHAR Reserved2[2];
1337     UCHAR Flip:1;
1338     UCHAR Reserved3:7;
1339     UCHAR Control;
1340   } POSITION_TO_ELEMENT;
1341   struct _MOVE_MEDIUM {
1342     UCHAR OperationCode;
1343     UCHAR Reserved1:5;
1344     UCHAR LogicalUnitNumber:3;
1345     UCHAR TransportElementAddress[2];
1346     UCHAR SourceElementAddress[2];
1347     UCHAR DestinationElementAddress[2];
1348     UCHAR Reserved2[2];
1349     UCHAR Flip:1;
1350     UCHAR Reserved3:7;
1351     UCHAR Control;
1352   } MOVE_MEDIUM;
1353   struct _EXCHANGE_MEDIUM {
1354     UCHAR OperationCode;
1355     UCHAR Reserved1:5;
1356     UCHAR LogicalUnitNumber:3;
1357     UCHAR TransportElementAddress[2];
1358     UCHAR SourceElementAddress[2];
1359     UCHAR Destination1ElementAddress[2];
1360     UCHAR Destination2ElementAddress[2];
1361     UCHAR Flip1:1;
1362     UCHAR Flip2:1;
1363     UCHAR Reserved3:6;
1364     UCHAR Control;
1365   } EXCHANGE_MEDIUM;
1366   struct _READ_ELEMENT_STATUS {
1367     UCHAR OperationCode;
1368     UCHAR ElementType:4;
1369     UCHAR VolTag:1;
1370     UCHAR LogicalUnitNumber:3;
1371     UCHAR StartingElementAddress[2];
1372     UCHAR NumberOfElements[2];
1373     UCHAR Reserved1;
1374     UCHAR AllocationLength[3];
1375     UCHAR Reserved2;
1376     UCHAR Control;
1377   } READ_ELEMENT_STATUS;
1378   struct _SEND_VOLUME_TAG {
1379     UCHAR OperationCode;
1380     UCHAR ElementType:4;
1381     UCHAR Reserved1:1;
1382     UCHAR LogicalUnitNumber:3;
1383     UCHAR StartingElementAddress[2];
1384     UCHAR Reserved2;
1385     UCHAR ActionCode:5;
1386     UCHAR Reserved3:3;
1387     UCHAR Reserved4[2];
1388     UCHAR ParameterListLength[2];
1389     UCHAR Reserved5;
1390     UCHAR Control;
1391   } SEND_VOLUME_TAG;
1392   struct _REQUEST_VOLUME_ELEMENT_ADDRESS {
1393     UCHAR OperationCode;
1394     UCHAR ElementType:4;
1395     UCHAR VolTag:1;
1396     UCHAR LogicalUnitNumber:3;
1397     UCHAR StartingElementAddress[2];
1398     UCHAR NumberElements[2];
1399     UCHAR Reserved1;
1400     UCHAR AllocationLength[3];
1401     UCHAR Reserved2;
1402     UCHAR Control;
1403   } REQUEST_VOLUME_ELEMENT_ADDRESS;
1404   struct _LOAD_UNLOAD {
1405     UCHAR OperationCode;
1406     UCHAR Immediate:1;
1407     UCHAR Reserved1:4;
1408     UCHAR Lun:3;
1409     UCHAR Reserved2[2];
1410     UCHAR Start:1;
1411     UCHAR LoadEject:1;
1412     UCHAR Reserved3:6;
1413     UCHAR Reserved4[3];
1414     UCHAR Slot;
1415     UCHAR Reserved5[3];
1416   } LOAD_UNLOAD;
1417   struct _MECH_STATUS {
1418     UCHAR OperationCode;
1419     UCHAR Reserved:5;
1420     UCHAR Lun:3;
1421     UCHAR Reserved1[6];
1422     UCHAR AllocationLength[2];
1423     UCHAR Reserved2[1];
1424     UCHAR Control;
1425   } MECH_STATUS;
1426   struct _SYNCHRONIZE_CACHE10 {
1427     UCHAR OperationCode;
1428     UCHAR RelAddr:1;
1429     UCHAR Immediate:1;
1430     UCHAR Reserved:3;
1431     UCHAR Lun:3;
1432     UCHAR LogicalBlockAddress[4];
1433     UCHAR Reserved2;
1434     UCHAR BlockCount[2];
1435     UCHAR Control;
1436   } SYNCHRONIZE_CACHE10;
1437   struct _GET_EVENT_STATUS_NOTIFICATION {
1438     UCHAR OperationCode;
1439     UCHAR Immediate:1;
1440     UCHAR Reserved:4;
1441     UCHAR Lun:3;
1442     UCHAR Reserved2[2];
1443     UCHAR NotificationClassRequest;
1444     UCHAR Reserved3[2];
1445     UCHAR EventListLength[2];
1446     UCHAR Control;
1447   } GET_EVENT_STATUS_NOTIFICATION;
1448   struct _GET_PERFORMANCE {
1449     UCHAR OperationCode;
1450     UCHAR Except:2;
1451     UCHAR Write:1;
1452     UCHAR Tolerance:2;
1453     UCHAR Reserved0:3;
1454     UCHAR StartingLBA[4];
1455     UCHAR Reserved1[2];
1456     UCHAR MaximumNumberOfDescriptors[2];
1457     UCHAR Type;
1458     UCHAR Control;
1459   } GET_PERFORMANCE;
1460   struct _READ_DVD_STRUCTURE {
1461     UCHAR OperationCode;
1462     UCHAR Reserved1:5;
1463     UCHAR Lun:3;
1464     UCHAR RMDBlockNumber[4];
1465     UCHAR LayerNumber;
1466     UCHAR Format;
1467     UCHAR AllocationLength[2];
1468     UCHAR Reserved3:6;
1469     UCHAR AGID:2;
1470     UCHAR Control;
1471   } READ_DVD_STRUCTURE;
1472   struct _SET_STREAMING {
1473     UCHAR OperationCode;
1474     UCHAR Reserved[8];
1475     UCHAR ParameterListLength[2];
1476     UCHAR Control;
1477   } SET_STREAMING;
1478   struct _SEND_DVD_STRUCTURE {
1479     UCHAR OperationCode;
1480     UCHAR Reserved1:5;
1481     UCHAR Lun:3;
1482     UCHAR Reserved2[5];
1483     UCHAR Format;
1484     UCHAR ParameterListLength[2];
1485     UCHAR Reserved3;
1486     UCHAR Control;
1487   } SEND_DVD_STRUCTURE;
1488   struct _SEND_KEY {
1489     UCHAR OperationCode;
1490     UCHAR Reserved1:5;
1491     UCHAR Lun:3;
1492     UCHAR Reserved2[6];
1493     UCHAR ParameterListLength[2];
1494     UCHAR KeyFormat:6;
1495     UCHAR AGID:2;
1496     UCHAR Control;
1497   } SEND_KEY;
1498   struct _REPORT_KEY {
1499     UCHAR OperationCode;
1500     UCHAR Reserved1:5;
1501     UCHAR Lun:3;
1502     UCHAR LogicalBlockAddress[4];
1503     UCHAR Reserved2[2];
1504     UCHAR AllocationLength[2];
1505     UCHAR KeyFormat:6;
1506     UCHAR AGID:2;
1507     UCHAR Control;
1508   } REPORT_KEY;
1509   struct _SET_READ_AHEAD {
1510     UCHAR OperationCode;
1511     UCHAR Reserved1:5;
1512     UCHAR Lun:3;
1513     UCHAR TriggerLBA[4];
1514     UCHAR ReadAheadLBA[4];
1515     UCHAR Reserved2;
1516     UCHAR Control;
1517   } SET_READ_AHEAD;
1518   struct _READ_FORMATTED_CAPACITIES {
1519     UCHAR OperationCode;
1520     UCHAR Reserved1:5;
1521     UCHAR Lun:3;
1522     UCHAR Reserved2[5];
1523     UCHAR AllocationLength[2];
1524     UCHAR Control;
1525   } READ_FORMATTED_CAPACITIES;
1526   struct _REPORT_LUNS {
1527     UCHAR OperationCode;
1528     UCHAR Reserved1[5];
1529     UCHAR AllocationLength[4];
1530     UCHAR Reserved2[1];
1531     UCHAR Control;
1532   } REPORT_LUNS;
1533   struct _PERSISTENT_RESERVE_IN {
1534     UCHAR OperationCode;
1535     UCHAR ServiceAction:5;
1536     UCHAR Reserved1:3;
1537     UCHAR Reserved2[5];
1538     UCHAR AllocationLength[2];
1539     UCHAR Control;
1540   } PERSISTENT_RESERVE_IN;
1541   struct _PERSISTENT_RESERVE_OUT {
1542     UCHAR OperationCode;
1543     UCHAR ServiceAction:5;
1544     UCHAR Reserved1:3;
1545     UCHAR Type:4;
1546     UCHAR Scope:4;
1547     UCHAR Reserved2[4];
1548     UCHAR ParameterListLength[2];
1549     UCHAR Control;
1550   } PERSISTENT_RESERVE_OUT;
1551   struct _GET_CONFIGURATION {
1552     UCHAR OperationCode;
1553     UCHAR RequestType:1;
1554     UCHAR Reserved1:7;
1555     UCHAR StartingFeature[2];
1556     UCHAR Reserved2[3];
1557     UCHAR AllocationLength[2];
1558     UCHAR Control;
1559   } GET_CONFIGURATION;
1560   struct _SET_CD_SPEED {
1561     UCHAR OperationCode;
1562     _ANONYMOUS_UNION union {
1563       UCHAR Reserved1;
1564       _ANONYMOUS_STRUCT struct {
1565         UCHAR RotationControl:2;
1566         UCHAR Reserved3:6;
1567       } DUMMYSTRUCTNAME;
1568     } DUMMYUNIONNAME;
1569     UCHAR ReadSpeed[2];
1570     UCHAR WriteSpeed[2];
1571     UCHAR Reserved2[5];
1572     UCHAR Control;
1573   } SET_CD_SPEED;
1574   struct _READ12 {
1575     UCHAR OperationCode;
1576     UCHAR RelativeAddress:1;
1577     UCHAR Reserved1:2;
1578     UCHAR ForceUnitAccess:1;
1579     UCHAR DisablePageOut:1;
1580     UCHAR LogicalUnitNumber:3;
1581     UCHAR LogicalBlock[4];
1582     UCHAR TransferLength[4];
1583     UCHAR Reserved2:7;
1584     UCHAR Streaming:1;
1585     UCHAR Control;
1586   } READ12;
1587   struct _WRITE12 {
1588     UCHAR OperationCode;
1589     UCHAR RelativeAddress:1;
1590     UCHAR Reserved1:1;
1591     UCHAR EBP:1;
1592     UCHAR ForceUnitAccess:1;
1593     UCHAR DisablePageOut:1;
1594     UCHAR LogicalUnitNumber:3;
1595     UCHAR LogicalBlock[4];
1596     UCHAR TransferLength[4];
1597     UCHAR Reserved2:7;
1598     UCHAR Streaming:1;
1599     UCHAR Control;
1600   } WRITE12;
1601   struct _READ16 {
1602     UCHAR OperationCode;
1603     UCHAR Reserved1:3;
1604     UCHAR ForceUnitAccess:1;
1605     UCHAR DisablePageOut:1;
1606     UCHAR ReadProtect:3;
1607     UCHAR LogicalBlock[8];
1608     UCHAR TransferLength[4];
1609     UCHAR Reserved2:7;
1610     UCHAR Streaming:1;
1611     UCHAR Control;
1612   } READ16;
1613   struct _WRITE16 {
1614     UCHAR OperationCode;
1615     UCHAR Reserved1:3;
1616     UCHAR ForceUnitAccess:1;
1617     UCHAR DisablePageOut:1;
1618     UCHAR WriteProtect:3;
1619     UCHAR LogicalBlock[8];
1620     UCHAR TransferLength[4];
1621     UCHAR Reserved2:7;
1622     UCHAR Streaming:1;
1623     UCHAR Control;
1624   } WRITE16;
1625   struct _VERIFY16 {
1626     UCHAR OperationCode;
1627     UCHAR Reserved1:1;
1628     UCHAR ByteCheck:1;
1629     UCHAR BlockVerify:1;
1630     UCHAR Reserved2: 1;
1631     UCHAR DisablePageOut:1;
1632     UCHAR VerifyProtect:3;
1633     UCHAR LogicalBlock[8];
1634     UCHAR VerificationLength[4];
1635     UCHAR Reserved3:7;
1636     UCHAR Streaming:1;
1637     UCHAR Control;
1638   } VERIFY16;
1639   struct _SYNCHRONIZE_CACHE16 {
1640     UCHAR OperationCode;
1641     UCHAR Reserved1:1;
1642     UCHAR Immediate:1;
1643     UCHAR Reserved2:6;
1644     UCHAR LogicalBlock[8];
1645     UCHAR BlockCount[4];
1646     UCHAR Reserved3;
1647     UCHAR Control;
1648   } SYNCHRONIZE_CACHE16;
1649   struct _READ_CAPACITY16 {
1650     UCHAR OperationCode;
1651     UCHAR ServiceAction:5;
1652     UCHAR Reserved1:3;
1653     UCHAR LogicalBlock[8];
1654     UCHAR BlockCount[4];
1655     UCHAR PMI:1;
1656     UCHAR Reserved2:7;
1657     UCHAR Control;
1658   } READ_CAPACITY16;
1659   ULONG AsUlong[4];
1660   UCHAR AsByte[16];
1661 } CDB, *PCDB;
1662 
1663 typedef struct _NOTIFICATION_EVENT_STATUS_HEADER {
1664   UCHAR EventDataLength[2];
1665   UCHAR NotificationClass:3;
1666   UCHAR Reserved:4;
1667   UCHAR NEA:1;
1668   UCHAR SupportedEventClasses;
1669   UCHAR ClassEventData[0];
1670 } NOTIFICATION_EVENT_STATUS_HEADER, *PNOTIFICATION_EVENT_STATUS_HEADER;
1671 
1672 typedef struct _NOTIFICATION_OPERATIONAL_STATUS {
1673   UCHAR OperationalEvent:4;
1674   UCHAR Reserved1:4;
1675   UCHAR OperationalStatus:4;
1676   UCHAR Reserved2:3;
1677   UCHAR PersistentPrevented:1;
1678   UCHAR Operation[2];
1679 } NOTIFICATION_OPERATIONAL_STATUS, *PNOTIFICATION_OPERATIONAL_STATUS;
1680 
1681 typedef struct _NOTIFICATION_POWER_STATUS {
1682   UCHAR PowerEvent:4;
1683   UCHAR Reserved:4;
1684   UCHAR PowerStatus;
1685   UCHAR Reserved2[2];
1686 } NOTIFICATION_POWER_STATUS, *PNOTIFICATION_POWER_STATUS;
1687 
1688 typedef struct _NOTIFICATION_EXTERNAL_STATUS {
1689   UCHAR ExternalEvent:4;
1690   UCHAR Reserved1:4;
1691   UCHAR ExternalStatus:4;
1692   UCHAR Reserved2:3;
1693   UCHAR PersistentPrevented:1;
1694   UCHAR Request[2];
1695 } NOTIFICATION_EXTERNAL_STATUS, *PNOTIFICATION_EXTERNAL_STATUS;
1696 
1697 typedef struct _NOTIFICATION_MEDIA_STATUS {
1698   UCHAR MediaEvent:4;
1699   UCHAR Reserved:4;
1700   _ANONYMOUS_UNION union {
1701     UCHAR PowerStatus;
1702     UCHAR MediaStatus;
1703     _ANONYMOUS_STRUCT struct {
1704       UCHAR DoorTrayOpen:1;
1705       UCHAR MediaPresent:1;
1706       UCHAR ReservedX:6;
1707     } DUMMYSTRUCTNAME;
1708   } DUMMYUNIONNAME;
1709   UCHAR StartSlot;
1710   UCHAR EndSlot;
1711 } NOTIFICATION_MEDIA_STATUS, *PNOTIFICATION_MEDIA_STATUS;
1712 
1713 typedef struct _NOTIFICATION_MULTI_HOST_STATUS {
1714   UCHAR MultiHostEvent:4;
1715   UCHAR Reserved1:4;
1716   UCHAR MultiHostStatus:4;
1717   UCHAR Reserved2:3;
1718   UCHAR PersistentPrevented:1;
1719   UCHAR Priority[2];
1720 } NOTIFICATION_MULTI_HOST_STATUS, *PNOTIFICATION_MULTI_HOST_STATUS;
1721 
1722 typedef struct _NOTIFICATION_BUSY_STATUS {
1723   UCHAR DeviceBusyEvent:4;
1724   UCHAR Reserved:4;
1725   UCHAR DeviceBusyStatus;
1726   UCHAR Time[2];
1727 } NOTIFICATION_BUSY_STATUS, *PNOTIFICATION_BUSY_STATUS;
1728 
1729 typedef struct _READ_DVD_STRUCTURES_HEADER {
1730   UCHAR Length[2];
1731   UCHAR Reserved[2];
1732   UCHAR Data[0];
1733 } READ_DVD_STRUCTURES_HEADER, *PREAD_DVD_STRUCTURES_HEADER;
1734 
1735 typedef struct _CDVD_KEY_HEADER {
1736   UCHAR DataLength[2];
1737   UCHAR Reserved[2];
1738   UCHAR Data[0];
1739 } CDVD_KEY_HEADER, *PCDVD_KEY_HEADER;
1740 
1741 typedef struct _CDVD_REPORT_AGID_DATA {
1742   UCHAR Reserved1[3];
1743   UCHAR Reserved2:6;
1744   UCHAR AGID:2;
1745 } CDVD_REPORT_AGID_DATA, *PCDVD_REPORT_AGID_DATA;
1746 
1747 typedef struct _CDVD_CHALLENGE_KEY_DATA {
1748   UCHAR ChallengeKeyValue[10];
1749   UCHAR Reserved[2];
1750 } CDVD_CHALLENGE_KEY_DATA, *PCDVD_CHALLENGE_KEY_DATA;
1751 
1752 typedef struct _CDVD_KEY_DATA {
1753   UCHAR Key[5];
1754   UCHAR Reserved[3];
1755 } CDVD_KEY_DATA, *PCDVD_KEY_DATA;
1756 
1757 typedef struct _CDVD_REPORT_ASF_DATA {
1758   UCHAR Reserved1[3];
1759   UCHAR Success:1;
1760   UCHAR Reserved2:7;
1761 } CDVD_REPORT_ASF_DATA, *PCDVD_REPORT_ASF_DATA;
1762 
1763 typedef struct _CDVD_TITLE_KEY_HEADER {
1764   UCHAR DataLength[2];
1765   UCHAR Reserved1[1];
1766   UCHAR Reserved2:3;
1767   UCHAR CGMS:2;
1768   UCHAR CP_SEC:1;
1769   UCHAR CPM:1;
1770   UCHAR Zero:1;
1771   CDVD_KEY_DATA TitleKey;
1772 } CDVD_TITLE_KEY_HEADER, *PCDVD_TITLE_KEY_HEADER;
1773 
1774 typedef struct _FORMAT_DESCRIPTOR {
1775   UCHAR NumberOfBlocks[4];
1776   UCHAR FormatSubType:2;
1777   UCHAR FormatType:6;
1778   UCHAR BlockLength[3];
1779 } FORMAT_DESCRIPTOR, *PFORMAT_DESCRIPTOR;
1780 
1781 typedef struct _FORMAT_LIST_HEADER {
1782   UCHAR Reserved;
1783   UCHAR VendorSpecific:1;
1784   UCHAR Immediate:1;
1785   UCHAR TryOut:1;
1786   UCHAR IP:1;
1787   UCHAR STPF:1;
1788   UCHAR DCRT:1;
1789   UCHAR DPRY:1;
1790   UCHAR FOV:1;
1791   UCHAR FormatDescriptorLength[2];
1792   FORMAT_DESCRIPTOR Descriptors[0];
1793 } FORMAT_LIST_HEADER, *PFORMAT_LIST_HEADER;
1794 
1795 typedef struct _FORMATTED_CAPACITY_DESCRIPTOR {
1796   UCHAR NumberOfBlocks[4];
1797   UCHAR Maximum:1;
1798   UCHAR Valid:1;
1799   UCHAR FormatType:6;
1800   UCHAR BlockLength[3];
1801 } FORMATTED_CAPACITY_DESCRIPTOR, *PFORMATTED_CAPACITY_DESCRIPTOR;
1802 
1803 typedef struct _FORMATTED_CAPACITY_LIST {
1804   UCHAR Reserved[3];
1805   UCHAR CapacityListLength;
1806   FORMATTED_CAPACITY_DESCRIPTOR Descriptors[0];
1807 } FORMATTED_CAPACITY_LIST, *PFORMATTED_CAPACITY_LIST;
1808 
1809 typedef struct _OPC_TABLE_ENTRY {
1810   UCHAR Speed[2];
1811   UCHAR OPCValue[6];
1812 } OPC_TABLE_ENTRY, *POPC_TABLE_ENTRY;
1813 
1814 typedef struct _DISC_INFORMATION {
1815   UCHAR Length[2];
1816   UCHAR DiscStatus:2;
1817   UCHAR LastSessionStatus:2;
1818   UCHAR Erasable:1;
1819   UCHAR Reserved1:3;
1820   UCHAR FirstTrackNumber;
1821   UCHAR NumberOfSessionsLsb;
1822   UCHAR LastSessionFirstTrackLsb;
1823   UCHAR LastSessionLastTrackLsb;
1824   UCHAR MrwStatus:2;
1825   UCHAR MrwDirtyBit:1;
1826   UCHAR Reserved2:2;
1827   UCHAR URU:1;
1828   UCHAR DBC_V:1;
1829   UCHAR DID_V:1;
1830   UCHAR DiscType;
1831   UCHAR NumberOfSessionsMsb;
1832   UCHAR LastSessionFirstTrackMsb;
1833   UCHAR LastSessionLastTrackMsb;
1834   UCHAR DiskIdentification[4];
1835   UCHAR LastSessionLeadIn[4];
1836   UCHAR LastPossibleLeadOutStartTime[4];
1837   UCHAR DiskBarCode[8];
1838   UCHAR Reserved4;
1839   UCHAR NumberOPCEntries;
1840   OPC_TABLE_ENTRY OPCTable[1];
1841 } DISC_INFORMATION, *PDISC_INFORMATION;
1842 
1843 typedef struct _DISK_INFORMATION {
1844   UCHAR Length[2];
1845   UCHAR DiskStatus:2;
1846   UCHAR LastSessionStatus:2;
1847   UCHAR Erasable:1;
1848   UCHAR Reserved1:3;
1849   UCHAR FirstTrackNumber;
1850   UCHAR NumberOfSessions;
1851   UCHAR LastSessionFirstTrack;
1852   UCHAR LastSessionLastTrack;
1853   UCHAR Reserved2:5;
1854   UCHAR GEN:1;
1855   UCHAR DBC_V:1;
1856   UCHAR DID_V:1;
1857   UCHAR DiskType;
1858   UCHAR Reserved3[3];
1859   UCHAR DiskIdentification[4];
1860   UCHAR LastSessionLeadIn[4];
1861   UCHAR LastPossibleStartTime[4];
1862   UCHAR DiskBarCode[8];
1863   UCHAR Reserved4;
1864   UCHAR NumberOPCEntries;
1865   OPC_TABLE_ENTRY OPCTable[0];
1866 } DISK_INFORMATION, *PDISK_INFORMATION;
1867 
1868 typedef struct _DATA_BLOCK_HEADER {
1869   UCHAR DataMode;
1870   UCHAR Reserved[4];
1871   _ANONYMOUS_UNION union {
1872     UCHAR LogicalBlockAddress[4];
1873     struct {
1874       UCHAR Reserved;
1875       UCHAR M;
1876       UCHAR S;
1877       UCHAR F;
1878     } MSF;
1879   } DUMMYUNIONNAME;
1880 } DATA_BLOCK_HEADER, *PDATA_BLOCK_HEADER;
1881 
1882 typedef struct _TRACK_INFORMATION {
1883   UCHAR Length[2];
1884   UCHAR TrackNumber;
1885   UCHAR SessionNumber;
1886   UCHAR Reserved1;
1887   UCHAR TrackMode:4;
1888   UCHAR Copy:1;
1889   UCHAR Damage:1;
1890   UCHAR Reserved2:2;
1891   UCHAR DataMode:4;
1892   UCHAR FP:1;
1893   UCHAR Packet:1;
1894   UCHAR Blank:1;
1895   UCHAR RT:1;
1896   UCHAR NWA_V:1;
1897   UCHAR Reserved3:7;
1898   UCHAR TrackStartAddress[4];
1899   UCHAR NextWritableAddress[4];
1900   UCHAR FreeBlocks[4];
1901   UCHAR FixedPacketSize[4];
1902 } TRACK_INFORMATION, *PTRACK_INFORMATION;
1903 
1904 typedef struct _TRACK_INFORMATION2 {
1905   UCHAR Length[2];
1906   UCHAR TrackNumberLsb;
1907   UCHAR SessionNumberLsb;
1908   UCHAR Reserved4;
1909   UCHAR TrackMode:4;
1910   UCHAR Copy:1;
1911   UCHAR Damage:1;
1912   UCHAR Reserved5:2;
1913   UCHAR DataMode:4;
1914   UCHAR FixedPacket:1;
1915   UCHAR Packet:1;
1916   UCHAR Blank:1;
1917   UCHAR ReservedTrack:1;
1918   UCHAR NWA_V:1;
1919   UCHAR LRA_V:1;
1920   UCHAR Reserved6:6;
1921   UCHAR TrackStartAddress[4];
1922   UCHAR NextWritableAddress[4];
1923   UCHAR FreeBlocks[4];
1924   UCHAR FixedPacketSize[4];
1925   UCHAR TrackSize[4];
1926   UCHAR LastRecordedAddress[4];
1927   UCHAR TrackNumberMsb;
1928   UCHAR SessionNumberMsb;
1929   UCHAR Reserved7[2];
1930 } TRACK_INFORMATION2, *PTRACK_INFORMATION2;
1931 
1932 typedef struct _TRACK_INFORMATION3 {
1933   UCHAR Length[2];
1934   UCHAR TrackNumberLsb;
1935   UCHAR SessionNumberLsb;
1936   UCHAR Reserved4;
1937   UCHAR TrackMode:4;
1938   UCHAR Copy:1;
1939   UCHAR Damage:1;
1940   UCHAR Reserved5:2;
1941   UCHAR DataMode:4;
1942   UCHAR FixedPacket:1;
1943   UCHAR Packet:1;
1944   UCHAR Blank:1;
1945   UCHAR ReservedTrack:1;
1946   UCHAR NWA_V:1;
1947   UCHAR LRA_V:1;
1948   UCHAR Reserved6:6;
1949   UCHAR TrackStartAddress[4];
1950   UCHAR NextWritableAddress[4];
1951   UCHAR FreeBlocks[4];
1952   UCHAR FixedPacketSize[4];
1953   UCHAR TrackSize[4];
1954   UCHAR LastRecordedAddress[4];
1955   UCHAR TrackNumberMsb;
1956   UCHAR SessionNumberMsb;
1957   UCHAR Reserved7[2];
1958   UCHAR ReadCompatibilityLba[4];
1959 } TRACK_INFORMATION3, *PTRACK_INFORMATION3;
1960 
1961 typedef struct _PERFORMANCE_DESCRIPTOR {
1962   UCHAR RandomAccess:1;
1963   UCHAR Exact:1;
1964   UCHAR RestoreDefaults:1;
1965   UCHAR WriteRotationControl:2;
1966   UCHAR Reserved1:3;
1967   UCHAR Reserved[3];
1968   UCHAR StartLba[4];
1969   UCHAR EndLba[4];
1970   UCHAR ReadSize[4];
1971   UCHAR ReadTime[4];
1972   UCHAR WriteSize[4];
1973   UCHAR WriteTime[4];
1974 } PERFORMANCE_DESCRIPTOR, *PPERFORMANCE_DESCRIPTOR;
1975 
1976 typedef struct _SCSI_EXTENDED_MESSAGE {
1977   UCHAR InitialMessageCode;
1978   UCHAR MessageLength;
1979   UCHAR MessageType;
1980   union _EXTENDED_ARGUMENTS {
1981     struct {
1982       UCHAR Modifier[4];
1983     } Modify;
1984     struct {
1985       UCHAR TransferPeriod;
1986       UCHAR ReqAckOffset;
1987     } Synchronous;
1988     struct{
1989       UCHAR Width;
1990     } Wide;
1991   } ExtendedArguments;
1992 }SCSI_EXTENDED_MESSAGE, *PSCSI_EXTENDED_MESSAGE;
1993 
1994 #ifndef _INQUIRYDATA_DEFINED /* also in minitape.h */
1995 #define _INQUIRYDATA_DEFINED
1996 
1997 #define INQUIRYDATABUFFERSIZE 36
1998 
1999 #if (NTDDI_VERSION < NTDDI_WINXP)
2000 typedef struct _INQUIRYDATA {
2001   UCHAR DeviceType:5;
2002   UCHAR DeviceTypeQualifier:3;
2003   UCHAR DeviceTypeModifier:7;
2004   UCHAR RemovableMedia:1;
2005   UCHAR Versions;
2006   UCHAR ResponseDataFormat:4;
2007   UCHAR HiSupport:1;
2008   UCHAR NormACA:1;
2009   UCHAR ReservedBit:1;
2010   UCHAR AERC:1;
2011   UCHAR AdditionalLength;
2012   UCHAR Reserved[2];
2013   UCHAR SoftReset:1;
2014   UCHAR CommandQueue:1;
2015   UCHAR Reserved2:1;
2016   UCHAR LinkedCommands:1;
2017   UCHAR Synchronous:1;
2018   UCHAR Wide16Bit:1;
2019   UCHAR Wide32Bit:1;
2020   UCHAR RelativeAddressing:1;
2021   UCHAR VendorId[8];
2022   UCHAR ProductId[16];
2023   UCHAR ProductRevisionLevel[4];
2024   UCHAR VendorSpecific[20];
2025   UCHAR Reserved3[40];
2026 } INQUIRYDATA, *PINQUIRYDATA;
2027 #else
2028 typedef struct _INQUIRYDATA {
2029   UCHAR DeviceType:5;
2030   UCHAR DeviceTypeQualifier:3;
2031   UCHAR DeviceTypeModifier:7;
2032   UCHAR RemovableMedia:1;
2033   _ANONYMOUS_UNION union {
2034     UCHAR Versions;
2035     _ANONYMOUS_STRUCT struct {
2036       UCHAR ANSIVersion:3;
2037       UCHAR ECMAVersion:3;
2038       UCHAR ISOVersion:2;
2039     } DUMMYSTRUCTNAME;
2040   } DUMMYUNIONNAME;
2041   UCHAR ResponseDataFormat:4;
2042   UCHAR HiSupport:1;
2043   UCHAR NormACA:1;
2044   UCHAR TerminateTask:1;
2045   UCHAR AERC:1;
2046   UCHAR AdditionalLength;
2047   UCHAR Reserved;
2048   UCHAR Addr16:1;
2049   UCHAR Addr32:1;
2050   UCHAR AckReqQ:1;
2051   UCHAR MediumChanger:1;
2052   UCHAR MultiPort:1;
2053   UCHAR ReservedBit2:1;
2054   UCHAR EnclosureServices:1;
2055   UCHAR ReservedBit3:1;
2056   UCHAR SoftReset:1;
2057   UCHAR CommandQueue:1;
2058   UCHAR TransferDisable:1;
2059   UCHAR LinkedCommands:1;
2060   UCHAR Synchronous:1;
2061   UCHAR Wide16Bit:1;
2062   UCHAR Wide32Bit:1;
2063   UCHAR RelativeAddressing:1;
2064   UCHAR VendorId[8];
2065   UCHAR ProductId[16];
2066   UCHAR ProductRevisionLevel[4];
2067   UCHAR VendorSpecific[20];
2068   UCHAR Reserved3[40];
2069 } INQUIRYDATA, *PINQUIRYDATA;
2070 #endif /* (NTDDI_VERSION < NTDDI_WINXP) */
2071 
2072 #endif /* _INQUIRYDATA_DEFINED */
2073 
2074 typedef struct _VPD_MEDIA_SERIAL_NUMBER_PAGE {
2075   UCHAR DeviceType:5;
2076   UCHAR DeviceTypeQualifier:3;
2077   UCHAR PageCode;
2078   UCHAR Reserved;
2079   UCHAR PageLength;
2080   UCHAR SerialNumber[0];
2081 } VPD_MEDIA_SERIAL_NUMBER_PAGE, *PVPD_MEDIA_SERIAL_NUMBER_PAGE;
2082 
2083 typedef struct _VPD_SERIAL_NUMBER_PAGE {
2084   UCHAR DeviceType:5;
2085   UCHAR DeviceTypeQualifier:3;
2086   UCHAR PageCode;
2087   UCHAR Reserved;
2088   UCHAR PageLength;
2089   UCHAR SerialNumber[0];
2090 } VPD_SERIAL_NUMBER_PAGE, *PVPD_SERIAL_NUMBER_PAGE;
2091 
2092 typedef enum _VPD_CODE_SET {
2093   VpdCodeSetReserved = 0,
2094   VpdCodeSetBinary = 1,
2095   VpdCodeSetAscii = 2,
2096   VpdCodeSetUTF8 = 3
2097 } VPD_CODE_SET, *PVPD_CODE_SET;
2098 
2099 typedef enum _VPD_ASSOCIATION {
2100   VpdAssocDevice = 0,
2101   VpdAssocPort = 1,
2102   VpdAssocTarget = 2,
2103   VpdAssocReserved1 = 3,
2104   VpdAssocReserved2 = 4
2105 } VPD_ASSOCIATION, *PVPD_ASSOCIATION;
2106 
2107 typedef enum _VPD_IDENTIFIER_TYPE {
2108   VpdIdentifierTypeVendorSpecific = 0,
2109   VpdIdentifierTypeVendorId = 1,
2110   VpdIdentifierTypeEUI64 = 2,
2111   VpdIdentifierTypeFCPHName = 3,
2112   VpdIdentifierTypePortRelative = 4,
2113   VpdIdentifierTypeTargetPortGroup = 5,
2114   VpdIdentifierTypeLogicalUnitGroup = 6,
2115   VpdIdentifierTypeMD5LogicalUnitId = 7,
2116   VpdIdentifierTypeSCSINameString = 8
2117 } VPD_IDENTIFIER_TYPE, *PVPD_IDENTIFIER_TYPE;
2118 
2119 typedef struct _VPD_IDENTIFICATION_DESCRIPTOR {
2120   UCHAR CodeSet:4;
2121   UCHAR Reserved:4;
2122   UCHAR IdentifierType:4;
2123   UCHAR Association:2;
2124   UCHAR Reserved2:2;
2125   UCHAR Reserved3;
2126   UCHAR IdentifierLength;
2127   UCHAR Identifier[0];
2128 } VPD_IDENTIFICATION_DESCRIPTOR, *PVPD_IDENTIFICATION_DESCRIPTOR;
2129 
2130 typedef struct _VPD_IDENTIFICATION_PAGE {
2131   UCHAR DeviceType:5;
2132   UCHAR DeviceTypeQualifier:3;
2133   UCHAR PageCode;
2134   UCHAR Reserved;
2135   UCHAR PageLength;
2136   UCHAR Descriptors[0];
2137 } VPD_IDENTIFICATION_PAGE, *PVPD_IDENTIFICATION_PAGE;
2138 
2139 typedef struct _VPD_SUPPORTED_PAGES_PAGE {
2140   UCHAR DeviceType:5;
2141   UCHAR DeviceTypeQualifier:3;
2142   UCHAR PageCode;
2143   UCHAR Reserved;
2144   UCHAR PageLength;
2145   UCHAR SupportedPageList[0];
2146 } VPD_SUPPORTED_PAGES_PAGE, *PVPD_SUPPORTED_PAGES_PAGE;
2147 
2148 typedef struct _PRI_REGISTRATION_LIST {
2149   UCHAR Generation[4];
2150   UCHAR AdditionalLength[4];
2151   UCHAR ReservationKeyList[0][8];
2152 } PRI_REGISTRATION_LIST, *PPRI_REGISTRATION_LIST;
2153 
2154 typedef struct _PRI_RESERVATION_DESCRIPTOR {
2155   UCHAR ReservationKey[8];
2156   UCHAR ScopeSpecificAddress[4];
2157   UCHAR Reserved;
2158   UCHAR Type:4;
2159   UCHAR Scope:4;
2160   UCHAR Obsolete[2];
2161 } PRI_RESERVATION_DESCRIPTOR, *PPRI_RESERVATION_DESCRIPTOR;
2162 
2163 typedef struct _PRI_RESERVATION_LIST {
2164   UCHAR Generation[4];
2165   UCHAR AdditionalLength[4];
2166   PRI_RESERVATION_DESCRIPTOR Reservations[0];
2167 } PRI_RESERVATION_LIST, *PPRI_RESERVATION_LIST;
2168 
2169 typedef struct _PRO_PARAMETER_LIST {
2170   UCHAR ReservationKey[8];
2171   UCHAR ServiceActionReservationKey[8];
2172   UCHAR ScopeSpecificAddress[4];
2173   UCHAR ActivatePersistThroughPowerLoss:1;
2174   UCHAR Reserved1:7;
2175   UCHAR Reserved2;
2176   UCHAR Obsolete[2];
2177 } PRO_PARAMETER_LIST, *PPRO_PARAMETER_LIST;
2178 
2179 typedef struct _SENSE_DATA {
2180   UCHAR ErrorCode:7;
2181   UCHAR Valid:1;
2182   UCHAR SegmentNumber;
2183   UCHAR SenseKey:4;
2184   UCHAR Reserved:1;
2185   UCHAR IncorrectLength:1;
2186   UCHAR EndOfMedia:1;
2187   UCHAR FileMark:1;
2188   UCHAR Information[4];
2189   UCHAR AdditionalSenseLength;
2190   UCHAR CommandSpecificInformation[4];
2191   UCHAR AdditionalSenseCode;
2192   UCHAR AdditionalSenseCodeQualifier;
2193   UCHAR FieldReplaceableUnitCode;
2194   UCHAR SenseKeySpecific[3];
2195 } SENSE_DATA, *PSENSE_DATA;
2196 
2197 /* Read Capacity Data. Returned in Big Endian format */
2198 typedef struct _READ_CAPACITY_DATA {
2199   ULONG LogicalBlockAddress;
2200   ULONG BytesPerBlock;
2201 } READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
2202 
2203 typedef struct _READ_CAPACITY_DATA_EX {
2204   LARGE_INTEGER LogicalBlockAddress;
2205   ULONG BytesPerBlock;
2206 } READ_CAPACITY_DATA_EX, *PREAD_CAPACITY_DATA_EX;
2207 
2208 /* Read Block Limits Data. Returned in Big Endian format */
2209 typedef struct _READ_BLOCK_LIMITS {
2210   UCHAR Reserved;
2211   UCHAR BlockMaximumSize[3];
2212   UCHAR BlockMinimumSize[2];
2213 } READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA;
2214 
2215 typedef struct _READ_BUFFER_CAPACITY_DATA {
2216   UCHAR DataLength[2];
2217   UCHAR Reserved1;
2218   UCHAR BlockDataReturned:1;
2219   UCHAR Reserved4:7;
2220   UCHAR TotalBufferSize[4];
2221   UCHAR AvailableBufferSize[4];
2222 } READ_BUFFER_CAPACITY_DATA, *PREAD_BUFFER_CAPACITY_DATA;
2223 
2224 typedef struct _MODE_PARAMETER_HEADER {
2225   UCHAR ModeDataLength;
2226   UCHAR MediumType;
2227   UCHAR DeviceSpecificParameter;
2228   UCHAR BlockDescriptorLength;
2229 } MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
2230 
2231 typedef struct _MODE_PARAMETER_HEADER10 {
2232   UCHAR ModeDataLength[2];
2233   UCHAR MediumType;
2234   UCHAR DeviceSpecificParameter;
2235   UCHAR Reserved[2];
2236   UCHAR BlockDescriptorLength[2];
2237 } MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10;
2238 
2239 typedef struct _MODE_PARAMETER_BLOCK {
2240   UCHAR DensityCode;
2241   UCHAR NumberOfBlocks[3];
2242   UCHAR Reserved;
2243   UCHAR BlockLength[3];
2244 } MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK;
2245 
2246 typedef struct _MODE_DISCONNECT_PAGE {
2247   UCHAR PageCode:6;
2248   UCHAR Reserved:1;
2249   UCHAR PageSavable:1;
2250   UCHAR PageLength;
2251   UCHAR BufferFullRatio;
2252   UCHAR BufferEmptyRatio;
2253   UCHAR BusInactivityLimit[2];
2254   UCHAR BusDisconnectTime[2];
2255   UCHAR BusConnectTime[2];
2256   UCHAR MaximumBurstSize[2];
2257   UCHAR DataTransferDisconnect:2;
2258   UCHAR Reserved2[3];
2259 } MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE;
2260 
2261 typedef struct _MODE_CACHING_PAGE {
2262   UCHAR PageCode:6;
2263   UCHAR Reserved:1;
2264   UCHAR PageSavable:1;
2265   UCHAR PageLength;
2266   UCHAR ReadDisableCache:1;
2267   UCHAR MultiplicationFactor:1;
2268   UCHAR WriteCacheEnable:1;
2269   UCHAR Reserved2:5;
2270   UCHAR WriteRetensionPriority:4;
2271   UCHAR ReadRetensionPriority:4;
2272   UCHAR DisablePrefetchTransfer[2];
2273   UCHAR MinimumPrefetch[2];
2274   UCHAR MaximumPrefetch[2];
2275   UCHAR MaximumPrefetchCeiling[2];
2276 } MODE_CACHING_PAGE, *PMODE_CACHING_PAGE;
2277 
2278 typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE2 {
2279   UCHAR PageCode:6;
2280   UCHAR Reserved:1;
2281   UCHAR PageSavable:1;
2282   UCHAR PageLength;
2283   UCHAR WriteType:4;
2284   UCHAR TestWrite:1;
2285   UCHAR LinkSizeValid:1;
2286   UCHAR BufferUnderrunFreeEnabled:1;
2287   UCHAR Reserved2:1;
2288   UCHAR TrackMode:4;
2289   UCHAR Copy:1;
2290   UCHAR FixedPacket:1;
2291   UCHAR MultiSession:2;
2292   UCHAR DataBlockType:4;
2293   UCHAR Reserved3:4;
2294   UCHAR LinkSize;
2295   UCHAR Reserved4;
2296   UCHAR HostApplicationCode:6;
2297   UCHAR Reserved5:2;
2298   UCHAR SessionFormat;
2299   UCHAR Reserved6;
2300   UCHAR PacketSize[4];
2301   UCHAR AudioPauseLength[2];
2302   UCHAR MediaCatalogNumber[16];
2303   UCHAR ISRC[16];
2304   UCHAR SubHeaderData[4];
2305 } MODE_CDROM_WRITE_PARAMETERS_PAGE2, *PMODE_CDROM_WRITE_PARAMETERS_PAGE2;
2306 
2307 typedef struct _MODE_MRW_PAGE {
2308   UCHAR PageCode:6;
2309   UCHAR Reserved:1;
2310   UCHAR PageSavable:1;
2311   UCHAR PageLength;
2312   UCHAR Reserved1;
2313   UCHAR LbaSpace:1;
2314   UCHAR Reserved2:7;
2315   UCHAR Reserved3[4];
2316 } MODE_MRW_PAGE, *PMODE_MRW_PAGE;
2317 
2318 typedef struct _MODE_FLEXIBLE_DISK_PAGE {
2319   UCHAR PageCode:6;
2320   UCHAR Reserved:1;
2321   UCHAR PageSavable:1;
2322   UCHAR PageLength;
2323   UCHAR TransferRate[2];
2324   UCHAR NumberOfHeads;
2325   UCHAR SectorsPerTrack;
2326   UCHAR BytesPerSector[2];
2327   UCHAR NumberOfCylinders[2];
2328   UCHAR StartWritePrecom[2];
2329   UCHAR StartReducedCurrent[2];
2330   UCHAR StepRate[2];
2331   UCHAR StepPluseWidth;
2332   UCHAR HeadSettleDelay[2];
2333   UCHAR MotorOnDelay;
2334   UCHAR MotorOffDelay;
2335   UCHAR Reserved2:5;
2336   UCHAR MotorOnAsserted:1;
2337   UCHAR StartSectorNumber:1;
2338   UCHAR TrueReadySignal:1;
2339   UCHAR StepPlusePerCyclynder:4;
2340   UCHAR Reserved3:4;
2341   UCHAR WriteCompenstation;
2342   UCHAR HeadLoadDelay;
2343   UCHAR HeadUnloadDelay;
2344   UCHAR Pin2Usage:4;
2345   UCHAR Pin34Usage:4;
2346   UCHAR Pin1Usage:4;
2347   UCHAR Pin4Usage:4;
2348   UCHAR MediumRotationRate[2];
2349   UCHAR Reserved4[2];
2350 } MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE;
2351 
2352 typedef struct _MODE_FORMAT_PAGE {
2353   UCHAR PageCode:6;
2354   UCHAR Reserved:1;
2355   UCHAR PageSavable:1;
2356   UCHAR PageLength;
2357   UCHAR TracksPerZone[2];
2358   UCHAR AlternateSectorsPerZone[2];
2359   UCHAR AlternateTracksPerZone[2];
2360   UCHAR AlternateTracksPerLogicalUnit[2];
2361   UCHAR SectorsPerTrack[2];
2362   UCHAR BytesPerPhysicalSector[2];
2363   UCHAR Interleave[2];
2364   UCHAR TrackSkewFactor[2];
2365   UCHAR CylinderSkewFactor[2];
2366   UCHAR Reserved2:4;
2367   UCHAR SurfaceFirst:1;
2368   UCHAR RemovableMedia:1;
2369   UCHAR HardSectorFormating:1;
2370   UCHAR SoftSectorFormating:1;
2371   UCHAR Reserved3[3];
2372 } MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE;
2373 
2374 typedef struct _MODE_RIGID_GEOMETRY_PAGE {
2375   UCHAR PageCode:6;
2376   UCHAR Reserved:1;
2377   UCHAR PageSavable:1;
2378   UCHAR PageLength;
2379   UCHAR NumberOfCylinders[3];
2380   UCHAR NumberOfHeads;
2381   UCHAR StartWritePrecom[3];
2382   UCHAR StartReducedCurrent[3];
2383   UCHAR DriveStepRate[2];
2384   UCHAR LandZoneCyclinder[3];
2385   UCHAR RotationalPositionLock:2;
2386   UCHAR Reserved2:6;
2387   UCHAR RotationOffset;
2388   UCHAR Reserved3;
2389   UCHAR RoataionRate[2];
2390   UCHAR Reserved4[2];
2391 } MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE;
2392 
2393 typedef struct _MODE_READ_WRITE_RECOVERY_PAGE {
2394   UCHAR PageCode:6;
2395   UCHAR Reserved1:1;
2396   UCHAR PSBit:1;
2397   UCHAR PageLength;
2398   UCHAR DCRBit:1;
2399   UCHAR DTEBit:1;
2400   UCHAR PERBit:1;
2401   UCHAR EERBit:1;
2402   UCHAR RCBit:1;
2403   UCHAR TBBit:1;
2404   UCHAR ARRE:1;
2405   UCHAR AWRE:1;
2406   UCHAR ReadRetryCount;
2407   UCHAR Reserved4[4];
2408   UCHAR WriteRetryCount;
2409   UCHAR Reserved5[3];
2410 } MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE;
2411 
2412 typedef struct _MODE_READ_RECOVERY_PAGE {
2413   UCHAR PageCode:6;
2414   UCHAR Reserved1:1;
2415   UCHAR PSBit:1;
2416   UCHAR PageLength;
2417   UCHAR DCRBit:1;
2418   UCHAR DTEBit:1;
2419   UCHAR PERBit:1;
2420   UCHAR Reserved2:1;
2421   UCHAR RCBit:1;
2422   UCHAR TBBit:1;
2423   UCHAR Reserved3:2;
2424   UCHAR ReadRetryCount;
2425   UCHAR Reserved4[4];
2426 } MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE;
2427 
2428 typedef struct _MODE_INFO_EXCEPTIONS {
2429   UCHAR PageCode:6;
2430   UCHAR Reserved1:1;
2431   UCHAR PSBit:1;
2432   UCHAR PageLength;
2433   _ANONYMOUS_UNION union {
2434     UCHAR Flags;
2435     _ANONYMOUS_STRUCT struct {
2436       UCHAR LogErr:1;
2437       UCHAR Reserved2:1;
2438       UCHAR Test:1;
2439       UCHAR Dexcpt:1;
2440       UCHAR Reserved3:3;
2441       UCHAR Perf:1;
2442     } DUMMYSTRUCTNAME;
2443   } DUMMYUNIONNAME;
2444   UCHAR ReportMethod:4;
2445   UCHAR Reserved4:4;
2446   UCHAR IntervalTimer[4];
2447   UCHAR ReportCount[4];
2448 } MODE_INFO_EXCEPTIONS, *PMODE_INFO_EXCEPTIONS;
2449 
2450 typedef struct _POWER_CONDITION_PAGE {
2451   UCHAR PageCode:6;
2452   UCHAR Reserved:1;
2453   UCHAR PSBit:1;
2454   UCHAR PageLength;
2455   UCHAR Reserved2;
2456   UCHAR Standby:1;
2457   UCHAR Idle:1;
2458   UCHAR Reserved3:6;
2459   UCHAR IdleTimer[4];
2460   UCHAR StandbyTimer[4];
2461 } POWER_CONDITION_PAGE, *PPOWER_CONDITION_PAGE;
2462 
2463 typedef struct _CDDA_OUTPUT_PORT {
2464   UCHAR ChannelSelection:4;
2465   UCHAR Reserved:4;
2466   UCHAR Volume;
2467 } CDDA_OUTPUT_PORT, *PCDDA_OUTPUT_PORT;
2468 
2469 typedef struct _CDAUDIO_CONTROL_PAGE {
2470   UCHAR PageCode:6;
2471   UCHAR Reserved:1;
2472   UCHAR PSBit:1;
2473   UCHAR PageLength;
2474   UCHAR Reserved2:1;
2475   UCHAR StopOnTrackCrossing:1;
2476   UCHAR Immediate:1;
2477   UCHAR Reserved3:5;
2478   UCHAR Reserved4[3];
2479   UCHAR Obsolete[2];
2480   CDDA_OUTPUT_PORT CDDAOutputPorts[4];
2481 } CDAUDIO_CONTROL_PAGE, *PCDAUDIO_CONTROL_PAGE;
2482 
2483 typedef struct _CDVD_FEATURE_SET_PAGE {
2484   UCHAR PageCode:6;
2485   UCHAR Reserved:1;
2486   UCHAR PSBit:1;
2487   UCHAR PageLength;
2488   UCHAR CDAudio[2];
2489   UCHAR EmbeddedChanger[2];
2490   UCHAR PacketSMART[2];
2491   UCHAR PersistantPrevent[2];
2492   UCHAR EventStatusNotification[2];
2493   UCHAR DigitalOutput[2];
2494   UCHAR CDSequentialRecordable[2];
2495   UCHAR DVDSequentialRecordable[2];
2496   UCHAR RandomRecordable[2];
2497   UCHAR KeyExchange[2];
2498   UCHAR Reserved2[2];
2499 } CDVD_FEATURE_SET_PAGE, *PCDVD_FEATURE_SET_PAGE;
2500 
2501 typedef struct _CDVD_INACTIVITY_TIMEOUT_PAGE {
2502   UCHAR PageCode:6;
2503   UCHAR Reserved:1;
2504   UCHAR PSBit:1;
2505   UCHAR PageLength;
2506   UCHAR Reserved2[2];
2507   UCHAR SWPP:1;
2508   UCHAR DISP:1;
2509   UCHAR Reserved3:6;
2510   UCHAR Reserved4;
2511   UCHAR GroupOneMinimumTimeout[2];
2512   UCHAR GroupTwoMinimumTimeout[2];
2513 } CDVD_INACTIVITY_TIMEOUT_PAGE, *PCDVD_INACTIVITY_TIMEOUT_PAGE;
2514 
2515 typedef struct _CDVD_CAPABILITIES_PAGE {
2516   UCHAR PageCode:6;
2517   UCHAR Reserved:1;
2518   UCHAR PSBit:1;
2519   UCHAR PageLength;
2520   UCHAR CDRRead:1;
2521   UCHAR CDERead:1;
2522   UCHAR Method2:1;
2523   UCHAR DVDROMRead:1;
2524   UCHAR DVDRRead:1;
2525   UCHAR DVDRAMRead:1;
2526   UCHAR Reserved2:2;
2527   UCHAR CDRWrite:1;
2528   UCHAR CDEWrite:1;
2529   UCHAR TestWrite:1;
2530   UCHAR Reserved3:1;
2531   UCHAR DVDRWrite:1;
2532   UCHAR DVDRAMWrite:1;
2533   UCHAR Reserved4:2;
2534   UCHAR AudioPlay:1;
2535   UCHAR Composite:1;
2536   UCHAR DigitalPortOne:1;
2537   UCHAR DigitalPortTwo:1;
2538   UCHAR Mode2Form1:1;
2539   UCHAR Mode2Form2:1;
2540   UCHAR MultiSession:1;
2541   UCHAR BufferUnderrunFree:1;
2542   UCHAR CDDA:1;
2543   UCHAR CDDAAccurate:1;
2544   UCHAR RWSupported:1;
2545   UCHAR RWDeinterleaved:1;
2546   UCHAR C2Pointers:1;
2547   UCHAR ISRC:1;
2548   UCHAR UPC:1;
2549   UCHAR ReadBarCodeCapable:1;
2550   UCHAR Lock:1;
2551   UCHAR LockState:1;
2552   UCHAR PreventJumper:1;
2553   UCHAR Eject:1;
2554   UCHAR Reserved6:1;
2555   UCHAR LoadingMechanismType:3;
2556   UCHAR SeparateVolume:1;
2557   UCHAR SeperateChannelMute:1;
2558   UCHAR SupportsDiskPresent:1;
2559   UCHAR SWSlotSelection:1;
2560   UCHAR SideChangeCapable:1;
2561   UCHAR RWInLeadInReadable:1;
2562   UCHAR Reserved7:2;
2563   _ANONYMOUS_UNION union {
2564     UCHAR ReadSpeedMaximum[2];
2565     UCHAR ObsoleteReserved[2];
2566   } DUMMYUNIONNAME;
2567   UCHAR NumberVolumeLevels[2];
2568   UCHAR BufferSize[2];
2569   _ANONYMOUS_UNION union {
2570     UCHAR ReadSpeedCurrent[2];
2571     UCHAR ObsoleteReserved2[2];
2572   } DUMMYUNIONNAME2;
2573   UCHAR ObsoleteReserved3;
2574   UCHAR Reserved8:1;
2575   UCHAR BCK:1;
2576   UCHAR RCK:1;
2577   UCHAR LSBF:1;
2578   UCHAR Length:2;
2579   UCHAR Reserved9:2;
2580   _ANONYMOUS_UNION union {
2581     UCHAR WriteSpeedMaximum[2];
2582     UCHAR ObsoleteReserved4[2];
2583   } DUMMYUNIONNAME3;
2584   _ANONYMOUS_UNION union {
2585     UCHAR WriteSpeedCurrent[2];
2586     UCHAR ObsoleteReserved11[2];
2587   } DUMMYUNIONNAME4;
2588   _ANONYMOUS_UNION union {
2589     UCHAR CopyManagementRevision[2];
2590     UCHAR Reserved10[2];
2591   } DUMMYUNIONNAME5;
2592 } CDVD_CAPABILITIES_PAGE, *PCDVD_CAPABILITIES_PAGE;
2593 
2594 typedef struct _LUN_LIST {
2595   UCHAR LunListLength[4];
2596   UCHAR Reserved[4];
2597   UCHAR Lun[0][8];
2598 } LUN_LIST, *PLUN_LIST;
2599 
2600 typedef struct _MODE_PARM_READ_WRITE {
2601   MODE_PARAMETER_HEADER ParameterListHeader;
2602   MODE_PARAMETER_BLOCK ParameterListBlock;
2603 } MODE_PARM_READ_WRITE_DATA, *PMODE_PARM_READ_WRITE_DATA;
2604 
2605 typedef struct _PORT_OUTPUT {
2606   UCHAR ChannelSelection;
2607   UCHAR Volume;
2608 } PORT_OUTPUT, *PPORT_OUTPUT;
2609 
2610 typedef struct _AUDIO_OUTPUT {
2611   UCHAR CodePage;
2612   UCHAR ParameterLength;
2613   UCHAR Immediate;
2614   UCHAR Reserved[2];
2615   UCHAR LbaFormat;
2616   UCHAR LogicalBlocksPerSecond[2];
2617   PORT_OUTPUT PortOutput[4];
2618 } AUDIO_OUTPUT, *PAUDIO_OUTPUT;
2619 
2620 /* Atapi 2.5 changers */
2621 typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER {
2622   UCHAR CurrentSlot:5;
2623   UCHAR ChangerState:2;
2624   UCHAR Fault:1;
2625   UCHAR Reserved:5;
2626   UCHAR MechanismState:3;
2627   UCHAR CurrentLogicalBlockAddress[3];
2628   UCHAR NumberAvailableSlots;
2629   UCHAR SlotTableLength[2];
2630 } MECHANICAL_STATUS_INFORMATION_HEADER, *PMECHANICAL_STATUS_INFORMATION_HEADER;
2631 
2632 typedef struct _SLOT_TABLE_INFORMATION {
2633   UCHAR DiscChanged:1;
2634   UCHAR Reserved:6;
2635   UCHAR DiscPresent:1;
2636   UCHAR Reserved2[3];
2637 } SLOT_TABLE_INFORMATION, *PSLOT_TABLE_INFORMATION;
2638 
2639 typedef struct _MECHANICAL_STATUS {
2640   MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader;
2641   SLOT_TABLE_INFORMATION SlotTableInfo[1];
2642 } MECHANICAL_STATUS, *PMECHANICAL_STATUS;
2643 
2644 /* Tape definitions */
2645 typedef struct _TAPE_POSITION_DATA {
2646   UCHAR Reserved1:2;
2647   UCHAR BlockPositionUnsupported:1;
2648   UCHAR Reserved2:3;
2649   UCHAR EndOfPartition:1;
2650   UCHAR BeginningOfPartition:1;
2651   UCHAR PartitionNumber;
2652   USHORT Reserved3;
2653   UCHAR FirstBlock[4];
2654   UCHAR LastBlock[4];
2655   UCHAR Reserved4;
2656   UCHAR NumberOfBlocks[3];
2657   UCHAR NumberOfBytes[4];
2658 } TAPE_POSITION_DATA, *PTAPE_POSITION_DATA;
2659 
2660 /* This structure is used to convert little endian ULONGs
2661    to SCSI CDB big endians values. */
2662 typedef union _EIGHT_BYTE {
2663   _ANONYMOUS_STRUCT struct {
2664     UCHAR Byte0;
2665     UCHAR Byte1;
2666     UCHAR Byte2;
2667     UCHAR Byte3;
2668     UCHAR Byte4;
2669     UCHAR Byte5;
2670     UCHAR Byte6;
2671     UCHAR Byte7;
2672   } DUMMYSTRUCTNAME;
2673   ULONGLONG AsULongLong;
2674 } EIGHT_BYTE, *PEIGHT_BYTE;
2675 
2676 typedef union _FOUR_BYTE {
2677   _ANONYMOUS_STRUCT struct {
2678     UCHAR Byte0;
2679     UCHAR Byte1;
2680     UCHAR Byte2;
2681     UCHAR Byte3;
2682   } DUMMYSTRUCTNAME;
2683   ULONG AsULong;
2684 } FOUR_BYTE, *PFOUR_BYTE;
2685 
2686 typedef union _TWO_BYTE {
2687   _ANONYMOUS_STRUCT struct {
2688     UCHAR Byte0;
2689     UCHAR Byte1;
2690   } DUMMYSTRUCTNAME;
2691   USHORT AsUShort;
2692 } TWO_BYTE, *PTWO_BYTE;
2693 
2694 /* Byte reversing macro for converting between
2695    big- and little-endian formats */
2696 #define REVERSE_BYTES_QUAD(Destination, Source) { \
2697   PEIGHT_BYTE _val1 = (PEIGHT_BYTE)(Destination); \
2698   PEIGHT_BYTE _val2 = (PEIGHT_BYTE)(Source); \
2699   _val1->Byte7 = _val2->Byte0; \
2700   _val1->Byte6 = _val2->Byte1; \
2701   _val1->Byte5 = _val2->Byte2; \
2702   _val1->Byte4 = _val2->Byte3; \
2703   _val1->Byte3 = _val2->Byte4; \
2704   _val1->Byte2 = _val2->Byte5; \
2705   _val1->Byte1 = _val2->Byte6; \
2706   _val1->Byte0 = _val2->Byte7; \
2707 }
2708 
2709 #define REVERSE_BYTES(Destination, Source) { \
2710   PFOUR_BYTE _val1 = (PFOUR_BYTE)(Destination); \
2711   PFOUR_BYTE _val2 = (PFOUR_BYTE)(Source); \
2712   _val1->Byte3 = _val2->Byte0; \
2713   _val1->Byte2 = _val2->Byte1; \
2714   _val1->Byte1 = _val2->Byte2; \
2715   _val1->Byte0 = _val2->Byte3; \
2716 }
2717 
2718 #define REVERSE_BYTES_SHORT(Destination, Source) { \
2719   PTWO_BYTE _val1 = (PTWO_BYTE)(Destination); \
2720   PTWO_BYTE _val2 = (PTWO_BYTE)(Source); \
2721   _val1->Byte1 = _val2->Byte0; \
2722   _val1->Byte0 = _val2->Byte1; \
2723 }
2724 
2725 #define REVERSE_SHORT(Short) { \
2726   UCHAR _val; \
2727   PTWO_BYTE _val2 = (PTWO_BYTE)(Short); \
2728   _val = _val2->Byte0; \
2729   _val2->Byte0 = _val2->Byte1; \
2730   _val2->Byte1 = _val; \
2731 }
2732 
2733 #define REVERSE_LONG(Long) { \
2734   UCHAR _val; \
2735   PFOUR_BYTE _val2 = (PFOUR_BYTE)(Long); \
2736   _val = _val2->Byte3; \
2737   _val2->Byte3 = _val2->Byte0; \
2738   _val2->Byte0 = _val; \
2739   _val = _val2->Byte2; \
2740   _val2->Byte2 = _val2->Byte1; \
2741   _val2->Byte1 = _val; \
2742 }
2743 
2744 #define WHICH_BIT(Data, Bit) { \
2745   UCHAR _val; \
2746   for (_val = 0; _val < 32; _val++) { \
2747     if (((Data) >> _val) == 1) { \
2748       break; \
2749     } \
2750   } \
2751   ASSERT(_val != 32); \
2752   (Bit) = _val; \
2753 }
2754 
2755 /* FIXME : This structure doesn't exist in the official header */
2756 typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE {
2757   UCHAR PageLength;
2758   UCHAR WriteType:4;
2759   UCHAR TestWrite:1;
2760   UCHAR LinkSizeValid:1;
2761   UCHAR BufferUnderrunFreeEnabled:1;
2762   UCHAR Reserved2:1;
2763   UCHAR TrackMode:4;
2764   UCHAR Copy:1;
2765   UCHAR FixedPacket:1;
2766   UCHAR MultiSession:2;
2767   UCHAR DataBlockType:4;
2768   UCHAR Reserved3:4;
2769   UCHAR LinkSize;
2770   UCHAR Reserved4;
2771   UCHAR HostApplicationCode:6;
2772   UCHAR Reserved5:2;
2773   UCHAR SessionFormat;
2774   UCHAR Reserved6;
2775   UCHAR PacketSize[4];
2776   UCHAR AudioPauseLength[2];
2777   UCHAR Reserved7:7;
2778   UCHAR MediaCatalogNumberValid:1;
2779   UCHAR MediaCatalogNumber[13];
2780   UCHAR MediaCatalogNumberZero;
2781   UCHAR MediaCatalogNumberAFrame;
2782   UCHAR Reserved8:7;
2783   UCHAR ISRCValid:1;
2784   UCHAR ISRCCountry[2];
2785   UCHAR ISRCOwner[3];
2786   UCHAR ISRCRecordingYear[2];
2787   UCHAR ISRCSerialNumber[5];
2788   UCHAR ISRCZero;
2789   UCHAR ISRCAFrame;
2790   UCHAR ISRCReserved;
2791   UCHAR SubHeaderData[4];
2792 } MODE_CDROM_WRITE_PARAMETERS_PAGE, *PMODE_CDROM_WRITE_PARAMETERS_PAGE;
2793 
2794 #ifdef __cplusplus
2795 }
2796 #endif
2797 
2798 #endif /* _NTSCSI_ */
2799