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