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
  27extern "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
 806typedef 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
2013typedef 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
2022typedef 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
2031typedef 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
2038typedef 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
2047typedef 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
2063typedef 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
2072typedef 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
2079typedef 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
2085typedef 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
2091typedef struct _CDVD_KEY_HEADER {
2092  UCHAR DataLength[2];
2093  UCHAR Reserved[2];
2094  UCHAR Data[0];
2095} CDVD_KEY_HEADER, *PCDVD_KEY_HEADER;
2096
2097typedef 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
2103typedef struct _CDVD_CHALLENGE_KEY_DATA {
2104  UCHAR ChallengeKeyValue[10];
2105  UCHAR Reserved[2];
2106} CDVD_CHALLENGE_KEY_DATA, *PCDVD_CHALLENGE_KEY_DATA;
2107
2108typedef struct _CDVD_KEY_DATA {
2109  UCHAR Key[5];
2110  UCHAR Reserved[3];
2111} CDVD_KEY_DATA, *PCDVD_KEY_DATA;
2112
2113typedef 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
2119typedef 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
2130typedef 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
2137typedef 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
2151typedef 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
2159typedef 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
2165typedef struct _OPC_TABLE_ENTRY {
2166  UCHAR Speed[2];
2167  UCHAR OPCValue[6];
2168} OPC_TABLE_ENTRY, *POPC_TABLE_ENTRY;
2169
2170typedef 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
2199typedef 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
2224typedef 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
2238typedef 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
2260typedef 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
2288typedef 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
2317typedef 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
2332typedef 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)
2356typedef 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
2384typedef 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
2430typedef 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
2439typedef 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
2448typedef enum _VPD_CODE_SET {
2449  VpdCodeSetReserved = 0,
2450  VpdCodeSetBinary = 1,
2451  VpdCodeSetAscii = 2,
2452  VpdCodeSetUTF8 = 3
2453} VPD_CODE_SET, *PVPD_CODE_SET;
2454
2455typedef enum _VPD_ASSOCIATION {
2456  VpdAssocDevice = 0,
2457  VpdAssocPort = 1,
2458  VpdAssocTarget = 2,
2459  VpdAssocReserved1 = 3,
2460  VpdAssocReserved2 = 4
2461} VPD_ASSOCIATION, *PVPD_ASSOCIATION;
2462
2463typedef 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
2475typedef 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
2486typedef 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
2495typedef 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
2504typedef 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
2510typedef 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
2519typedef 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
2525typedef 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
2535typedef 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 */
2554typedef struct _READ_CAPACITY_DATA {
2555  ULONG LogicalBlockAddress;
2556  ULONG BytesPerBlock;
2557} READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
2558
2559typedef 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 */
2565typedef 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
2571typedef 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
2580typedef struct _MODE_PARAMETER_HEADER {
2581  UCHAR ModeDataLength;
2582  UCHAR MediumType;
2583  UCHAR DeviceSpecificParameter;
2584  UCHAR BlockDescriptorLength;
2585} MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
2586
2587typedef 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
2595typedef 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
2602typedef 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
2617typedef 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
2634typedef 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
2663typedef 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
2674typedef 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
2708typedef 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
2730typedef 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
2749typedef 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
2768typedef 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
2784typedef 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
2806typedef 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
2819typedef struct _CDDA_OUTPUT_PORT {
2820  UCHAR ChannelSelection:4;
2821  UCHAR Reserved:4;
2822  UCHAR Volume;
2823} CDDA_OUTPUT_PORT, *PCDDA_OUTPUT_PORT;
2824
2825typedef 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
2839typedef 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
2857typedef 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
2871typedef 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
2950typedef struct _LUN_LIST {
2951  UCHAR LunListLength[4];
2952  UCHAR Reserved[4];
2953  UCHAR Lun[0][8];
2954} LUN_LIST, *PLUN_LIST;
2955
2956typedef 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
2961typedef struct _PORT_OUTPUT {
2962  UCHAR ChannelSelection;
2963  UCHAR Volume;
2964} PORT_OUTPUT, *PPORT_OUTPUT;
2965
2966typedef 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 */
2977typedef 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
2988typedef 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
2995typedef struct _MECHANICAL_STATUS {
2996  MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader;
2997  SLOT_TABLE_INFORMATION SlotTableInfo[1];
2998} MECHANICAL_STATUS, *PMECHANICAL_STATUS;
2999
3000/* Tape definitions */
3001typedef 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. */
3018typedef 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
3032typedef 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
3042typedef 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 */
3112typedef 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_ */