/*
 *  scsi.h      SCSI functions
 *
 * =========================================================================
 *
 *                          Open Watcom Project
 *
 * Copyright (c) 2004-2014 The Open Watcom Contributors. All Rights Reserved.
 *
 *    This file is automatically generated. Do not edit directly.
 *
 * =========================================================================
 */

#ifndef _NTSCSI_
#define _NTSCSI_

#ifndef _ENABLE_AUTODEPEND
 #pragma read_only_file;
#endif

#ifndef _NTSCSI_USER_MODE_
    #include <srb.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

/* Notification class masks */
#define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_MASK  0x02
#define NOTIFICATION_POWER_MANAGEMENT_CLASS_MASK    0x04
#define NOTIFICATION_EXTERNAL_REQUEST_CLASS_MASK    0x08
#define NOTIFICATION_MEDIA_STATUS_CLASS_MASK        0x10
#define NOTIFICATION_MULTI_HOST_CLASS_MASK          0x20
#define NOTIFICATION_DEVICE_BUSY_CLASS_MASK         0x40

/* Notification class event flags */
#define NOTIFICATION_NO_CLASS_EVENTS                    0x00
#define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_EVENTS    0x01
#define NOTIFICATION_POWER_MANAGEMENT_CLASS_EVENTS      0x02
#define NOTIFICATION_EXTERNAL_REQUEST_CLASS_EVENTS      0x03
#define NOTIFICATION_MEDIA_STATUS_CLASS_EVENTS          0x04
#define NOTIFICATION_MULTI_HOST_CLASS_EVENTS            0x05
#define NOTIFICATION_DEVICE_BUSY_CLASS_EVENTS           0x06

/* Notification operational events */
#define NOTIFICATION_OPERATIONAL_EVENT_NO_CHANGE        0x00
#define NOTIFICATION_OPERATIONAL_EVENT_CHANGE_REQUESTED 0x01
#define NOTIFICATION_OPERATIONAL_EVENT_CHANGE_OCCURRED  0x02

/* Notification operational status values */
#define NOTIFICATION_OPERATIONAL_STATUS_AVAILABLE       0x00
#define NOTIFICATION_OPERATIONAL_STATUS_TEMPORARY_BUSY  0x01
#define NOTIFICATION_OPERATIONAL_STATUS_EXTENDED_BUSY   0x02

/* Notification operational operation codes */
#define NOTIFICATION_OPERATIONAL_OPCODE_NONE                0x00
#define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_CHANGE      0x01
#define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_ADDED       0x02
#define NOTIFICATION_OPERATIONAL_OPCODE_UNIT_RESET          0x03
#define NOTIFICATION_OPERATIONAL_OPCODE_FIRMWARE_CHANGED    0x04
#define NOTIFICATION_OPERATIONAL_OPCODE_INQUIRY_CHANGED     0x05

/* Notification power events */
#define NOTIFICATION_POWER_EVENT_NO_CHANGE          0x00
#define NOTIFICATION_POWER_EVENT_CHANGE_SUCCEEDED   0x01
#define NOTIFICATION_POWER_EVENT_CHANGE_FAILED      0x02

/* Notification power status values */
#define NOTIFICATION_POWER_STATUS_ACTIVE    0x01
#define NOTIFICATION_POWER_STATUS_IDLE      0x02
#define NOTIFICATION_POWER_STATUS_STANDBY   0x03
#define NOTIFICATION_POWER_STATUS_SLEEP     0x04

/* Notification external events */
#define NOTIFICATION_MEDIA_EVENT_NO_EVENT       0x00
#define NOTIFICATION_EXTERNAL_EVENT_NO_CHANGE   0x00
#define NOTIFICATION_EXTERNAL_EVENT_BUTTON_DOWN 0x01
#define NOTIFICATION_EXTERNAL_EVENT_BUTTON_UP   0x02
#define NOTIFICATION_EXTERNAL_EVENT_EXTERNAL    0x03

/* Notification external status values */
#define NOTIFICATION_EXTERNAL_STATUS_READY      0x00
#define NOTIFICATION_EXTERNAL_STATUS_PREVENT    0x01

/* Notification external requests */
#define NOTIFICATION_EXTERNAL_REQUEST_NONE          0x0000
#define NOTIFICATION_EXTERNAL_REQUEST_QUEUE_OVERRUN 0x0001
#define NOTIFICATION_EXTERNAL_REQUEST_PLAY          0x0101
#define NOTIFICATION_EXTERNAL_REQUEST_REWIND_BACK   0x0102
#define NOTIFICATION_EXTERNAL_REQUEST_FAST_FORWARD  0x0103
#define NOTIFICATION_EXTERNAL_REQUEST_PAUSE         0x0104
#define NOTIFICATION_EXTERNAL_REQUEST_STOP          0x0106
#define NOTIFICATION_EXTERNAL_REQUEST_ASCII_LOW     0x0200
#define NOTIFICATION_EXTERNAL_REQUEST_ASCII_HIGH    0x02FF

/* Notification media events */
#define NOTIFICATION_MEDIA_EVENT_NO_CHANGE      0x00
#define NOTIFICATION_MEDIA_EVENT_EJECT_REQUEST  0x01
#define NOTIFICATION_MEDIA_EVENT_NEW_MEDIA      0x02
#define NOTIFICATION_MEDIA_EVENT_MEDIA_REMOVAL  0x03
#define NOTIFICATION_MEDIA_EVENT_MEDIA_CHANGE   0x04

/* Notification multi-host events */
#define NOTIFICATION_BUSY_EVENT_NO_EVENT                0x00
#define NOTIFICATION_MULTI_HOST_EVENT_NO_CHANGE         0x00
#define NOTIFICATION_MULTI_HOST_EVENT_CONTROL_REQUEST   0x01
#define NOTIFICATION_MULTI_HOST_EVENT_CONTROL_GRANT     0x02
#define NOTIFICATION_MULTI_HOST_EVENT_CONTROL_RELEASE   0x03

/* Notification multi-host status values */
#define NOTIFICATION_MULTI_HOST_STATUS_READY    0x00
#define NOTIFICATION_MULTI_HOST_STATUS_PREVENT  0x01

/* Notification multi-host priority values */
#define NOTIFICATION_MULTI_HOST_PRIORITY_NO_REQUESTS    0x00
#define NOTIFICATION_MULTI_HOST_PRIORITY_LOW            0x01
#define NOTIFICATION_MULTI_HOST_PRIORITY_MEDIUM         0x02
#define NOTIFICATION_MULTI_HOST_PRIOTITY_HIGH           0x03

/* Notification busy events */
#define NOTIFICATION_BUSY_EVENT_NO_EVENT    0x00
#define NOTIFICATION_BUSY_EVENT_NO_CHANGE   0x00
#define NOTIFICATION_BUSY_EVENT_BUSY        0x01

/* Notification busy status values */
#define NOTIFICATION_BUSY_STATUS_NO_EVENT   0x00
#define NOTIFICATION_BUSY_STATUS_POWER      0x01
#define NOTIFICATION_BUSY_STATUS_IMMEDIATE  0x02
#define NOTIFICATION_BUSY_STATUS_DEFERRED   0x03

/* DVD formats */
#define DVD_FORMAT_LEAD_IN          0x00
#define DVD_FORMAT_COPYRIGHT        0x01
#define DVD_FORMAT_DISK_KEY         0x02
#define DVD_FORMAT_BCA              0x03
#define DVD_FORMAT_MANUFACTURING    0x04

/* CDVD data structure identifiers */
#define DVD_REPORT_AGID     0x00
#define DVD_CHALLENGE_KEY   0x01
#define DVD_KEY_1           0x02
#define DVD_KEY_2           0x03
#define DVD_TITLE_KEY       0x04
#define DVD_REPORT_ASF      0x05
#define DVD_INVALIDATE_AGID 0x3F

/* Blank type codes */
#define BLANK_FULL              0x00
#define BLANK_MINIMAL           0x01
#define BLANK_TRACK             0x02
#define BLANK_UNRESERVE_TRACK   0x03
#define BLANK_TAIL              0x04
#define BLANK_UNCLOSE_SESSION   0x05
#define BLANK_SESSION           0x06

/* CD expected sector values */
#define CD_EXPECTED_SECTOR_ANY          0x00
#define CD_EXPECTED_SECTOR_CDDA         0x01
#define CD_EXPECTED_SECTOR_MODE1        0x02
#define CD_EXPECTED_SECTOR_MODE2        0x03
#define CD_EXPECTED_SECTOR_MODE2_FORM1  0x04
#define CD_EXPECTED_SECTOR_MODE2_FORM2  0x05

/* Disk status values */
#define DISK_STATUS_EMPTY       0x00
#define DISK_STATUS_INCOMPLETE  0x01
#define DISK_STATUS_COMPLETE    0x02
#define DISK_STATUS_OTHERS      0x03

/* Last session values */
#define LAST_SESSION_EMPTY              0x00
#define LAST_SESSION_INCOMPLETE         0x01
#define LAST_SESSION_RESERVED_DAMAGED   0x02
#define LAST_SESSION_COMPLETE           0x03

/* Disk types */
#define DISK_TYPE_CDDA      0x00
#define DISK_TYPE_CDI       0x10
#define DISK_TYPE_XA        0x20
#define DISK_TYPE_UNDEFINED 0xFF

/* Disc background format states */
#define DISC_BGFORMAT_STATE_NONE        0x00
#define DISC_BGFORMAT_STATE_INCOMPLETE  0x01
#define DISC_BGFORMAT_STATE_RUNNING     0x02
#define DISC_BGFORMAT_STATE_COMPLETE    0x03

/* Data block modes */
#define DATA_BLOCK_MODE0    0x00
#define DATA_BLOCK_MODE1    0x01
#define DATA_BLOCK_MODE2    0x02

/* Read TOC format codes */
#define READ_TOC_FORMAT_TOC         0x00
#define READ_TOC_FORMAT_SESSION     0x01
#define READ_TOC_FORMAT_FULL_TOC    0x02
#define READ_TOC_FORMAT_PMA         0x03
#define READ_TOC_FORMAT_ATIP        0x04

/* Common descriptor block lengths */
#define CDB6GENERIC_LENGTH  6
#define CDB10GENERIC_LENGTH 10
#define CDB12GENERIC_LENGTH 12

/* Set bit on/off constants */
#define SETBITON    1
#define SETBITOFF   0

/* Mode page constants */
#define MODE_PAGE_VENDOR_SPECIFIC               0x00
#define MODE_PAGE_ERROR_RECOVERY                0x01
#define MODE_PAGE_DISCONNECT                    0x02
#define MODE_PAGE_FORMAT_DEVICE                 0x03
#define MODE_PAGE_MRW                           0x03
#define MODE_PAGE_RIGID_GEOMETRY                0x04
#define MODE_PAGE_FLEXIBILE                     0x05
#define MODE_PAGE_WRITE_PARAMETERS              0x05
#define MODE_PAGE_VERIFY_ERRORS                 0x07
#define MODE_PAGE_CACHING                       0x08
#define MODE_PAGE_PERIPHERAL                    0x09
#define MODE_PAGE_CONTROL                       0x0A
#define MODE_PAGE_MEDIUM_TYPES                  0x0B
#define MODE_PAGE_NOTCH_PARTITION               0x0C
#define MODE_PAGE_CD_AUDIO_CONTROL              0x0E
#define MODE_PAGE_DATA_COMPRESS                 0x0F
#define MODE_PAGE_DEVICE_CONFIG                 0x10
#define MODE_PAGE_XOR_CONTROL                   0x10
#define MODE_PAGE_MEDIUM_PARTITION              0x11
#define MODE_PAGE_ENCLOSURE_SERVICES_MANAGEMENT 0x14
#define MODE_PAGE_EXTENDED                      0x15
#define MODE_PAGE_EXTENDED_DEVICE_SPECIFIC      0x16
#define MODE_PAGE_CDVD_FEATURE_SET              0x18
#define MODE_PAGE_PROTOCOL_SPECIFIC_LUN         0x18
#define MODE_PAGE_PROTOCOL_SPECIFIC_PORT        0x19
#define MODE_PAGE_POWER_CONDITION               0x1A
#define MODE_PAGE_LUN_MAPPING                   0x1B
#define MODE_PAGE_FAULT_REPORTING               0x1C
#define MODE_PAGE_CDVD_INACTIVITY               0x1D
#define MODE_PAGE_ELEMENT_ADDRESS               0x1D
#define MODE_PAGE_TRANSPORT_GEOMETRY            0x1E
#define MODE_PAGE_DEVICE_CAPABILITIES           0x1F
#define MODE_PAGE_CAPABILITIES                  0x2A

/* Mode sense constants */
#define MODE_SENSE_RETURN_ALL           0x3F
#define MODE_SENSE_CURRENT_VALUES       0x00
#define MODE_SENSE_CHANGEABLE_VALUES    0x40
#define MODE_SENSE_DEFAULT_VALUES       0x80
#define MODE_SENSE_SAVED_VALUES         0xC0

/* SCSI operation codes */
#define SCSIOP_TEST_UNIT_READY          0x00
#define SCSIOP_REZERO_UNIT              0x01
#define SCSIOP_REWIND                   0x01
#define SCSIOP_REQUEST_BLOCK_ADDR       0x02
#define SCSIOP_REQUEST_SENSE            0x03
#define SCSIOP_FORMAT_UNIT              0x04
#define SCSIOP_READ_BLOCK_LIMITS        0x05
#define SCSIOP_REASSIGN_BLOCKS          0x07
#define SCSIOP_INIT_ELEMENT_STATUS      0x07
#define SCSIOP_READ6                    0x08
#define SCSIOP_RECEIVE                  0x08
#define SCSIOP_WRITE6                   0x0A
#define SCSIOP_PRINT                    0x0A
#define SCSIOP_SEND                     0x0A
#define SCSIOP_SEEK6                    0x0B
#define SCSIOP_TRACK_SELECT             0x0B
#define SCSIOP_SLEW_PRINT               0x0B
#define SCSIOP_SET_CAPACITY             0x0B
#define SCSIOP_SEEK_BLOCK               0x0C
#define SCSIOP_PARTITION                0x0D
#define SCSIOP_READ_REVERSE             0x0F
#define SCSIOP_WRITE_FILEMARKS          0x10
#define SCSIOP_FLUSH_BUFFER             0x10
#define SCSIOP_SPACE                    0x11
#define SCSIOP_INQUIRY                  0x12
#define SCSIOP_VERIFY6                  0x13
#define SCSIOP_RECOVER_BUF_DATA         0x14
#define SCSIOP_MODE_SELECT              0x15
#define SCSIOP_RESERVE_UNIT             0x16
#define SCSIOP_RELEASE_UNIT             0x17
#define SCSIOP_COPY                     0x18
#define SCSIOP_ERASE                    0x19
#define SCSIOP_MODE_SENSE               0x1A
#define SCSIOP_START_STOP_UNIT          0x1B
#define SCSIOP_STOP_PRINT               0x1B
#define SCSIOP_LOAD_UNLOAD              0x1B
#define SCSIOP_RECEIVE_DIAGNOSTIC       0x1C
#define SCSIOP_SEND_DIAGNOSTIC          0x1D
#define SCSIOP_MEDIUM_REMOVAL           0x1E
#define SCSIOP_READ_FORMATTED_CAPACITY  0x23
#define SCSIOP_READ_CAPACITY            0x25
#define SCSIOP_READ                     0x28
#define SCSIOP_WRITE                    0x2A
#define SCSIOP_SEEK                     0x2B
#define SCSIOP_LOCATE                   0x2B
#define SCSIOP_POSITION_TO_ELEMENT      0x2B
#define SCSIOP_WRITE_VERIFY             0x2E
#define SCSIOP_VERIFY                   0x2F
#define SCSIOP_SEARCH_DATA_HIGH         0x30
#define SCSIOP_SEARCH_DATA_EQUAL        0x31
#define SCSIOP_SEARCH_DATA_LOW          0x32
#define SCSIOP_SET_LIMITS               0x33
#define SCSIOP_READ_POSITION            0x34
#define SCSIOP_SYNCHRONIZE_CACHE        0x35
#define SCSIOP_COMPARE                  0x39
#define SCSIOP_COPY_COMPARE             0x3A
#define SCSIOP_WRITE_DATA_BUFF          0x3B
#define SCSIOP_READ_DATA_BUFF           0x3C
#define SCSIOP_WRITE_LONG               0x3F
#define SCSIOP_CHANGE_DEFINITION        0x40
#define SCSIOP_WRITE_SAME               0x41
#define SCSIOP_READ_SUB_CHANNEL         0x42
#define SCSIOP_READ_TOC                 0x43
#define SCSIOP_READ_HEADER              0x44
#define SCSIOP_REPORT_DENSITY_SUPPORT   0x44
#define SCSIOP_PLAY_AUDIO               0x45
#define SCSIOP_GET_CONFIGURATION        0x46
#define SCSIOP_PLAY_AUDIO_MSF           0x47
#define SCSIOP_PLAY_TRACK_INDEX         0x48
#define SCSIOP_PLAY_TRACK_RELATIVE      0x49
#define SCSIOP_GET_EVENT_STATUS         0x4A
#define SCSIOP_PAUSE_RESUME             0x4B
#define SCSIOP_LOG_SELECT               0x4C
#define SCSIOP_LOG_SENSE                0x4D
#define SCSIOP_STOP_PLAY_SCAN           0x4E
#define SCSIOP_XDWRITE                  0x50
#define SCSIOP_XPWRITE                  0x51
#define SCSIOP_READ_DISK_INFORMATION    0x51
#define SCSIOP_READ_DISC_INFORMATION    0x51
#define SCSIOP_READ_TRACK_INFORMATION   0x52
#define SCSIOP_XDWRITE_READ             0x53
#define SCSIOP_RESERVE_TRACK_RZONE      0x53
#define SCSIOP_SEND_OPC_INFORMATION     0x54
#define SCSIOP_MODE_SELECT10            0x55
#define SCSIOP_RESERVE_UNIT10           0x56
#define SCSIOP_RESERVE_ELEMENT          0x56
#define SCSIOP_RELEASE_UNIT10           0x57
#define SCSIOP_RELEASE_ELEMENT          0x57
#define SCSIOP_REPAIR_TRACK             0x58
#define SCSIOP_MODE_SENSE10             0x5A
#define SCSIOP_CLOSE_TRACK_SESSION      0x5B
#define SCSIOP_READ_BUFFER_CAPACITY     0x5C
#define SCSIOP_SEND_CUE_SHEET           0x5D
#define SCSIOP_PERSISTENT_RESERVE_IN    0x5E
#define SCSIOP_PERSISTENT_RESERVE_OUT   0x5F
#define SCSIOP_REPORT_LUNS              0xA0
#define SCSIOP_BLANK                    0xA1
#define SCSIOP_ATA_PASSTHROUGH12        0xA1
#define SCSIOP_SEND_EVENT               0xA2
#define SCSIOP_SEND_KEY                 0xA3
#define SCSIOP_MAINTENANCE_IN           0xA3
#define SCSIOP_REPORT_KEY               0xA4
#define SCSIOP_MAINTENANCE_OUT          0xA4
#define SCSIOP_MOVE_MEDIUM              0xA5
#define SCSIOP_LOAD_UNLOAD_SLOT         0xA6
#define SCSIOP_EXCHANGE_MEDIUM          0xA6
#define SCSIOP_SET_READ_AHEAD           0xA7
#define SCSIOP_MOVE_MEDIUM_ATTACHED     0xA7
#define SCSIOP_READ12                   0xA8
#define SCSIOP_GET_MESSAGE              0xA8
#define SCSIOP_SERVICE_ACTION_OUT12     0xA9
#define SCSIOP_WRITE12                  0xAA
#define SCSIOP_SEND_MESSAGE             0xAB
#define SCSIOP_SERVICE_ACTION_IN12      0xAB
#define SCSIOP_GET_PERFORMANCE          0xAC
#define SCSIOP_READ_DVD_STRUCTURE       0xAD
#define SCSIOP_WRITE_VERIFY12           0xAE
#define SCSIOP_VERIFY12                 0xAF
#define SCSIOP_SEARCH_DATA_HIGH12       0xB0
#define SCSIOP_SEARCH_DATA_EQUAL12      0xB1
#define SCSIOP_SEARCH_DATA_LOW12        0xB2
#define SCSIOP_SET_LIMITS12             0xB3
#define SCSIOP_READ_ELEMENT_STATUS_ATTACHED 0xB4
#define SCSIOP_REQUEST_VOL_ELEMENT      0xB5
#define SCSIOP_SEND_VOLUME_TAG          0xB6
#define SCSIOP_SET_STREAMING            0xB6
#define SCSIOP_READ_DEFECT_DATA         0xB7
#define SCSIOP_READ_ELEMENT_STATUS      0xB8
#define SCSIOP_READ_CD_MSF              0xB9
#define SCSIOP_SCAN_CD                  0xBA
#define SCSIOP_REDUNDANCY_GROUP_IN      0xBA
#define SCSIOP_SET_CD_SPEED             0xBB
#define SCSIOP_REDUNDANCY_GROUP_OUT     0xBB
#define SCSIOP_PLAY_CD                  0xBC
#define SCSIOP_SPARE_IN                 0xBC
#define SCSIOP_MECHANISM_STATUS         0xBD
#define SCSIOP_SPARE_OUT                0xBD
#define SCSIOP_READ_CD                  0xBE
#define SCSIOP_VOLUME_SET_IN            0xBE
#define SCSIOP_SEND_DVD_STRUCTURE       0xBF
#define SCSIOP_VOLUME_SET_OUT           0xBF
#define SCSIOP_INIT_ELEMENT_RANGE       0xE7
#define SCSIOP_XDWRITE_EXTENDED16       0x80
#define SCSIOP_WRITE_FILEMARKS16        0x80
#define SCSIOP_REBUILD16                0x81
#define SCSIOP_READ_REVERSE16           0x81
#define SCSIOP_REGENERATE16             0x82
#define SCSIOP_EXTENDED_COPY            0x83
#define SCSIOP_RECEIVE_COPY_RESULTS     0x84
#define SCSIOP_ATA_PASSTHROUGH16        0x85
#define SCSIOP_ACCESS_CONTROL_IN        0x86
#define SCSIOP_ACCESS_CONTROL_OUT       0x87
#define SCSIOP_READ16                   0x88
#define SCSIOP_WRITE16                  0x8A
#define SCSIOP_READ_ATTRIBUTES          0x8C
#define SCSIOP_WRITE_ATTRIBUTES         0x8D
#define SCSIOP_WRITE_VERIFY16           0x8E
#define SCSIOP_VERIFY16                 0x8F
#define SCSIOP_PREFETCH16               0x90
#define SCSIOP_SYNCHRONIZE_CACHE16      0x91
#define SCSIOP_SPACE16                  0x91
#define SCSIOP_LOCK_UNLOCK_CACHE16      0x92
#define SCSIOP_LOCATE16                 0x92
#define SCSIOP_WRITE_SAME16             0x93
#define SCSIOP_ERASE16                  0x93
#define SCSIOP_READ_CAPACITY16          0x9E
#define SCSIOP_SERVICE_ACTION_IN16      0x9E
#define SCSIOP_SERVICE_ACTION_OUT16     0x9F

/* Common descriptor block return values */
#define CDB_RETURN_ON_COMPLETION    0
#define CDB_RETURN_IMMEDIATE        1

/* Common descriptor block force media access flag */
#define CDB_FORCE_MEDIA_ACCESS  0x08

/* Denon SCSI operation codes */
#define SCSIOP_DENON_EJECT_DISC     0xE6
#define SCSIOP_DENON_STOP_AUDIO     0xE7
#define SCSIOP_DENON_PLAY_AUDIO     0xE8
#define SCSIOP_DENON_READ_TOC       0xE9
#define SCSIOP_DENON_READ_SUBCODE   0xEB

/* SCSI messages */
#define SCSIMESS_ABORT                  0x06
#define SCSIMESS_ABORT_WITH_TAG         0x0D
#define SCSIMESS_BUS_DEVICE_RESET       0x0C
#define SCSIMESS_CLEAR_QUEUE            0x0E
#define SCSIMESS_COMMAND_COMPLETE       0x00
#define SCSIMESS_DISCONNECT             0x04
#define SCSIMESS_EXTENDED_MESSAGE       0x01
#define SCSIMESS_IDENTIFY               0x80
#define SCSIMESS_IDENTIFY_WITH_DISCON   0xC0
#define SCSIMESS_IGNORE_WITH_RESIDUE    0x23
#define SCSIMESS_INITIATE_RECOVERY      0x0F
#define SCSIMESS_INIT_DETECTED_ERROR    0x05
#define SCSIMESS_LINK_CMD_COMP          0x0A
#define SCSIMESS_LINK_CMD_COMP_W_FLAG   0x0B
#define SCSIMESS_MESS_PARITY_ERROR      0x09
#define SCSIMESS_MESSAGE_REJECT         0x07
#define SCSIMESS_NO_OPERATION           0x08
#define SCSIMESS_HEAD_OF_QUEUE_TAG      0x21
#define SCSIMESS_ORDERED_QUEUE_TAG      0x22
#define SCSIMESS_SIMPLE_QUEUE_TAG       0x20
#define SCSIMESS_RELEASE_RECOVERY       0x10
#define SCSIMESS_RESTORE_POINTERS       0x03
#define SCSIMESS_SAVE_DATA_POINTER      0x02
#define SCSIMESS_TERMINATE_IO_PROCESS   0x11
#define SCSIMESS_MODIFY_DATA_POINTER    0x00
#define SCSIMESS_SYNCHRONOUS_DATA_REQ   0x01
#define SCSIMESS_WIDE_DATA_REQUEST      0x03

/* SCSI message lengths */
#define SCSIMESS_MODIFY_DATA_LENGTH 5
#define SCSIMESS_SYNCH_DATA_LENGTH  3
#define SCSIMESS_WIDE_DATA_LENGTH   2

/* SCSI status codes */
#define SCSISTAT_GOOD                   0x00
#define SCSISTAT_CHECK_CONDITION        0x02
#define SCSISTAT_CONDITION_MET          0x04
#define SCSISTAT_BUSY                   0x08
#define SCSISTAT_INTERMEDIATE           0x10
#define SCSISTAT_INTERMEDIATE_COND_MET  0x14
#define SCSISTAT_RESERVATION_CONFLICT   0x18
#define SCSISTAT_COMMAND_TERMINATED     0x22
#define SCSISTAT_QUEUE_FULL             0x28

/* Common descriptor block inquiry EVPD flag */
#define CDB_INQUIRY_EVPD    0x01

/* Format common descriptor block constants */
#define LUN0_FORMAT_SAVING_DEFECT_LIST  0
#define USE_DEFAULTMSB                  0
#define USE_DEFAULTLSB                  0

/* Unit codes */
#define START_UNIT_CODE 0x01
#define STOP_UNIT_CODE  0x00

/* Inquiry data buffer size */
#define INQUIRYDATABUFFERSIZE   36

/* Device types */
#define DIRECT_ACCESS_DEVICE                0x00
#define SEQUENTIAL_ACCESS_DEVICE            0x01
#define PRINTER_DEVICE                      0x02
#define PROCESSOR_DEVICE                    0x03
#define WRITE_ONCE_READ_MULTIPLE_DEVICE     0x04
#define READ_ONLY_DIRECT_ACCESS_DEVICE      0x05
#define SCANNER_DEVICE                      0x06
#define OPTICAL_DEVICE                      0x07
#define MEDIUM_CHANGER                      0x08
#define COMMUNICATION_DEVICE                0x09
#define ARRAY_CONTROLLER_DEVICE             0x0C
#define SCSI_ENCLOSURE_DEVICE               0x0D
#define REDUCED_BLOCK_DEVICE                0x0E
#define OPTICAL_CARD_READER_WRITER_DEVICE   0x0F
#define BRIDGE_CONTROLLER_DEVICE            0x10
#define OBJECT_BASED_STORAGE_DEVICE         0x11
#define LOGICAL_UNIT_NOT_PRESENT_DEVICE     0x7F

/* Device qualifiers */
#define DEVICE_QUALIFIER_ACTIVE         0x00
#define DEVICE_QUALIFIER_NOT_ACTIVE     0x01
#define DEVICE_QUALIFIER_NOT_SUPPORTED  0x03

/* Device type qualifier */
#define DEVICE_CONNECTED    0x00

/* Vital product data maximum buffer size */
#define VPD_MAX_BUFFER_SIZE 0xFF

/* Vital product data page identifiers */
#define VPD_SUPPORTED_PAGES                 0x00
#define VPD_SERIAL_NUMBER                   0x80
#define VPD_DEVICE_IDENTIFIERS              0x83
#define VPD_MEDIA_SERIAL_NUMBER             0x84
#define VPD_SOFTWARE_INTERFACE_IDENTIFIERS  0x84
#define VPD_NETWORK_MANAGEMENT_ADDRESSES    0x85
#define VPD_EXTENDED_INQUIRY_DATA           0x86
#define VPD_MODE_PAGE_POLICY                0x87
#define VPD_SCSI_PORTS                      0x88

/* Reservation actions */
#define RESERVATION_ACTION_READ_KEYS                0x00
#define RESERVATION_ACTION_READ_RESERVATIONS        0x01
#define RESERVATION_ACTION_REGISTER                 0x00
#define RESERVATION_ACTION_RESERVE                  0x01
#define RESERVATION_ACTION_RELEASE                  0x02
#define RESERVATION_ACTION_CLEAR                    0x03
#define RESERVATION_ACTION_PREEMPT                  0x04
#define RESERVATION_ACTION_PREEMPT_ABORT            0x05
#define RESERVATION_ACTION_REGISTER_IGNORE_EXISTING 0x06

/* Reservation scopes */
#define RESERVATION_SCOPE_LU        0x00
#define RESERVATION_SCOPE_ELEMENT   0x02

/* Reservation types */
#define RESERVATION_TYPE_WRITE_EXCLUSIVE                0x01
#define RESERVATION_TYPE_EXCLUSIVE                      0x03
#define RESERVATION_TYPE_WRITE_EXCLUSIVE_REGISTRANTS    0x05
#define RESERVATION_TYPE_EXCLUSIVE_REGISTRANTS          0x06

/* Sense buffer size constants */
#define SENSE_BUFFER_SIZE           18
#define MAX_SENSE_BUFFER_SIZE       255
#define MAX_ADDITIONAL_SENSE_BYTES  (MAX_SENSE_BUFFER_SIZE - SENSE_BUFFER_SIZE)

/* SCSI sense codes */
#define SCSI_SENSE_NO_SENSE         0x00
#define SCSI_SENSE_RECOVERED_ERROR  0x01
#define SCSI_SENSE_NOT_READY        0x02
#define SCSI_SENSE_MEDIUM_ERROR     0x03
#define SCSI_SENSE_HARDWARE_ERROR   0x04
#define SCSI_SENSE_ILLEGAL_REQUEST  0x05
#define SCSI_SENSE_UNIT_ATTENTION   0x06
#define SCSI_SENSE_DATA_PROTECT     0x07
#define SCSI_SENSE_BLANK_CHECK      0x08
#define SCSI_SENSE_UNIQUE           0x09
#define SCSI_SENSE_COPY_ABORTED     0x0A
#define SCSI_SENSE_ABORTED_COMMAND  0x0B
#define SCSI_SENSE_EQUAL            0x0C
#define SCSI_SENSE_VOL_OVERFLOW     0x0D
#define SCSI_SENSE_MISCOMPARE       0x0E
#define SCSI_SENSE_RESERVED         0x0F

/* SCSI additional tape bits */
#define SCSI_ILLEGAL_LENGTH 0x20
#define SCSI_EOM            0x40
#define SCSI_FILE_MARK      0x80

/* SCSI additional sense codes */
#define SCSI_ADSENSE_NO_SENSE                           0x00
#define SCSI_ADSENSE_NO_SEEK_COMPLETE                   0x02
#define SCSI_ADSENSE_LUN_NOT_READY                      0x04
#define SCSI_ADSENSE_LUN_COMMUNICATION                  0x08
#define SCSI_ADSENSE_WRITE_ERROR                        0x0C
#define SCSI_ADSENSE_TRACK_ERROR                        0x14
#define SCSI_ADSENSE_SEEK_ERROR                         0x15
#define SCSI_ADSENSE_REC_DATA_NOECC                     0x17
#define SCSI_ADSENSE_REC_DATA_ECC                       0x18
#define SCSI_ADSENSE_PARAMETER_LIST_LENGTH              0x1A
#define SCSI_ADSENSE_ILLEGAL_COMMAND                    0x20
#define SCSI_ADSENSE_ILLEGAL_BLOCK                      0x21
#define SCSI_ADSENSE_INVALID_CDB                        0x24
#define SCSI_ADSENSE_INVALID_LUN                        0x25
#define SCSI_ADSENSE_INVALID_FIELD_PARAMETER_LIST       0x26
#define SCSI_ADSENSE_WRITE_PROTECT                      0x27
#define SCSI_ADSENSE_MEDIUM_CHANGED                     0x28
#define SCSI_ADSENSE_BUS_RESET                          0x29
#define SCSI_ADSENSE_PARAMETERS_CHANGED                 0x2A
#define SCSI_ADSENSE_INSUFFICIENT_TIME_FOR_OPERATION    0x2E
#define SCSI_ADSENSE_INVALID_MEDIA                      0x30
#define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE                 0x3A
#define SCSI_ADSENSE_POSITION_ERROR                     0x3B
#define SCSI_ADSENSE_OPERATING_CONDITIONS_CHANGED       0x3F
#define SCSI_ADSENSE_OPERATOR_REQUEST                   0x5A
#define SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED  0x5D
#define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK        0x64
#define SCSI_ADSENSE_COPY_PROTECTION_FAILURE            0x6F
#define SCSI_ADSENSE_POWER_CALIBRATION_ERROR            0x73
#define SCSI_ADSENSE_VENDOR_UNIQUE                      0x80
#define SCSI_ADSENSE_MUSIC_AREA                         0xA0
#define SCSI_ADSENSE_DATA_AREA                          0xA1
#define SCSI_ADSENSE_VOLUME_OVERFLOW                    0xA7
#define SCSI_ADWRITE_PROTECT                            SCSI_ADSENSE_WRITE_PROTECT
#define SCSI_FAILURE_PREDICTION_THRESHOLD_EXCEEDED \
    SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED

/* SCSI sense qualifiers */
#define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE                0x00
#define SCSI_SENSEQ_BECOMING_READY                      0x01
#define SCSI_SENSEQ_INIT_COMMAND_REQUIRED               0x02
#define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED        0x03
#define SCSI_SENSEQ_FORMAT_IN_PROGRESS                  0x04
#define SCSI_SENSEQ_REBUILD_IN_PROGRESS                 0x05
#define SCSI_SENSEQ_RECALCULATION_IN_PROGRESS           0x06
#define SCSI_SENSEQ_OPERATION_IN_PROGRESS               0x07
#define SCSI_SENSEQ_LONG_WRITE_IN_PROGRESS              0x08
#define SCSI_SENSEQ_COMM_FAILURE                        0x00
#define SCSI_SENSEQ_COMM_TIMEOUT                        0x01
#define SCSI_SENSEQ_COMM_PARITY_ERROR                   0x02
#define SCSI_SENSEQ_COMM_CRC_ERROR                      0x03
#define SCSI_SENSEQ_UNREACHABLE_TARGET                  0x04
#define SCSI_SENSEQ_LOSS_OF_STREAMING                   0x09
#define SCSI_SENSEQ_PADDING_BLOCKS_ADDED                0x0A
#define SCSI_SENSEQ_FILEMARK_DETECTED                   0x01
#define SCSI_SENSEQ_END_OF_MEDIA_DETECTED               0x02
#define SCSI_SENSEQ_SETMARK_DETECTED                    0x03
#define SCSI_SENSEQ_BEGINNING_OF_MEDIA_DETECTED         0x04
#define SCSI_SENSEQ_ILLEGAL_ELEMENT_ADDR                0x01
#define SCSI_SENSEQ_DESTINATION_FULL                    0x0D
#define SCSI_SENSEQ_SOURCE_EMPTY                        0x0E
#define SCSI_SENSEQ_INCOMPATIBLE_MEDIA_INSTALLED        0x00
#define SCSI_SENSEQ_UNKNOWN_FORMAT                      0x01
#define SCSI_SENSEQ_INCOMPATIBLE_FORMAT                 0x02
#define SCSI_SENSEQ_CLEANING_CARTRIDGE_INSTALLED        0x03
#define SCSI_SENSEQ_TARGET_OPERATING_CONDITIONS_CHANGED 0x00
#define SCSI_SENSEQ_MICROCODE_CHANGED                   0x01
#define SCSI_SENSEQ_OPERATING_DEFINITION_CHANGED        0x02
#define SCSI_SENSEQ_INQUIRY_DATA_CHANGED                0x03
#define SCSI_SENSEQ_COMPONENT_DEVICE_ATTACHED           0x04
#define SCSI_SENSEQ_DEVICE_IDENTIFIER_CHANGED           0x05
#define SCSI_SENSEQ_REDUNDANCY_GROUP_MODIFIED           0x06
#define SCSI_SENSEQ_REDUNDANCY_GROUP_DELETED            0x07
#define SCSI_SENSEQ_SPARE_MODIFIED                      0x08
#define SCSI_SENSEQ_SPARE_DELETED                       0x09
#define SCSI_SENSEQ_VOLUME_SET_MODIFIED                 0x0A
#define SCSI_SENSEQ_VOLUME_SET_DELETED                  0x0B
#define SCSI_SENSEQ_VOLUME_SET_DEASSIGNED               0x0C
#define SCSI_SENSEQ_VOLUME_SET_REASSIGNED               0x0D
#define SCSI_SENSEQ_REPORTED_LUNS_DATA_CHANGED          0x0E
#define SCSI_SENSEQ_ECHO_BUFFER_OVERWRITTEN             0x0F
#define SCSI_SENSEQ_MEDIUM_LOADABLE                     0x10
#define SCSI_SENSEQ_MEDIUM_AUXILIARY_MEMORY_ACCESSIBLE  0x11
#define SCSI_SENSEQ_STATE_CHANGE_INPUT                  0x00
#define SCSI_SENSEQ_MEDIUM_REMOVAL                      0x01
#define SCSI_SENSEQ_WRITE_PROTECT_ENABLE                0x02
#define SCSI_SENSEQ_WRITE_PROTECT_DISABLE               0x03
#define SCSI_SENSEQ_AUTHENTICATION_FAILURE              0x00
#define SCSI_SENSEQ_KEY_NOT_PRESENT                     0x01
#define SCSI_SENSEQ_KEY_NOT_ESTABLISHED                 0x02
#define SCSI_SENSEQ_READ_OF_SCRAMBLED_SECTOR_WITHOUT_AUTHENTICATION 0x03
#define SCSI_SENSEQ_MEDIA_CODE_MISMATCHED_TO_LOGICAL_UNIT   0x04
#define SCSI_SENSEQ_LOGICAL_UNIT_RESET_COUNT_ERROR      0x05
#define SCSI_SENSEQ_POWER_CALIBRATION_AREA_ALMOST_FULL  0x01
#define SCSI_SENSEQ_POWER_CALIBRATION_AREA_FULL         0x02
#define SCSI_SENSEQ_POWER_CALIBRATION_AREA_ERROR        0x03
#define SCSI_SENSEQ_PMA_RMA_UPDATE_FAILURE              0x04
#define SCSI_SENSEQ_PMA_RMA_IS_FULL                     0x05
#define SCSI_SENSEQ_PMA_RMA_ALMOST_FULL                 0x06

/* SCSI device type */
#define FILE_DEVICE_SCSI    0x0000001BL

/* SCSI device I/O control codes */
#define IOCTL_SCSI_EXECUTE_IN                       ((FILE_DEVICE_SCSI << 16) + 0x0011)
#define IOCTL_SCSI_EXECUTE_OUT                      ((FILE_DEVICE_SCSI << 16) + 0x0012)
#define IOCTL_SCSI_EXECUTE_NONE                     ((FILE_DEVICE_SCSI << 16) + 0x0013)
#define IOCTL_SCSI_MINIPORT_SMART_VERSION           ((FILE_DEVICE_SCSI << 16) + 0x0500)
#define IOCTL_SCSI_MINIPORT_IDENTIFY                ((FILE_DEVICE_SCSI << 16) + 0x0501)
#define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS      ((FILE_DEVICE_SCSI << 16) + 0x0502)
#define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS   ((FILE_DEVICE_SCSI << 16) + 0x0503)
#define IOCTL_SCSI_MINIPORT_ENABLE_SMART            ((FILE_DEVICE_SCSI << 16) + 0x0504)
#define IOCTL_SCSI_MINIPORT_DISABLE_SMART           ((FILE_DEVICE_SCSI << 16) + 0x0505)
#define IOCTL_SCSI_MINIPORT_RETURN_STATUS           ((FILE_DEVICE_SCSI << 16) + 0x0506)
#define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE ((FILE_DEVICE_SCSI << 16) + 0x0507)
#define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES   ((FILE_DEVICE_SCSI << 16) + 0x0508)
#define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS   ((FILE_DEVICE_SCSI << 16) + 0x0509)
#define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTO_OFFLINE \
    ((FILE_DEVICE_SCSI << 16) + 0x050A)
#define IOCTL_SCSI_MINIPORT_READ_SMART_LOG          ((FILE_DEVICE_SCSI << 16) + 0x050B)
#define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG         ((FILE_DEVICE_SCSI << 16) + 0x050C)
#define IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE      ((FILE_DEVICE_SCSI << 16) + 0x0520)
#define IOCTL_SCSI_MINIPORT_NOT_CLUSTER_CAPABLE     ((FILE_DEVICE_SCSI << 16) + 0x0521)

/* Mode parameter constants */
#define MODE_FD_SINGLE_SIDE     0x01
#define MODE_FD_DOUBLE_SIDE     0x02
#define MODE_FD_MAXIMUM_TYPE    0x1E
#define MODE_DSP_FUA_SUPPORTED  0x10
#define MODE_DSP_WRITE_PROTECT  0x80

/* CDDA channels */
#define CDDA_CHANNEL_MUTED  0x00
#define CDDA_CHANNEL_ZERO   0x01
#define CDDA_CHANNEL_ONE    0x02
#define CDDA_CHANNEL_TWO    0x04
#define CDDA_CHANNEL_THREE  0x08

/* CDVD capabilities constants */
#define CDVD_LMT_CADDY              0
#define CDVD_LMT_TRAY               1
#define CDVD_LMT_POPUP              2
#define CDVD_LMT_CHANGER_INDIVIDUAL 4
#define CDVD_LMT_CHANGER_CARTRIDGE  5

/* Loading machanisms */
#define LOADING_MECHANISM_CADDY                 0x00
#define LOADING_MECHANISM_TRAY                  0x01
#define LOADING_MECHANISM_POPUP                 0x02
#define LOADING_MECHANISM_INDIVIDUAL_CHANGER    0x04
#define LOADING_MECHANISM_CARTRIDGE_CHANGER     0x05

/* Mode block lengths */
#define MODE_BLOCK_DESC_LENGTH  8
#define MODE_HEADER_LENGTH      4
#define MODE_HEADER_LENGTH10    8

/* CD-ROM audio control constants */
#define CDB_AUDIO_PAUSE             0
#define CDB_AUDIO_RESUME            1
#define CDB_DEVICE_START            0x11
#define CDB_DEVICE_STOP             0x10
#define CDB_EJECT_MEDIA             0x10
#define CDB_LOAD_MEDIA              0x01
#define CDB_SUBCHANNEL_HEADER       0x00
#define CDB_SUBCHANNEL_BLOCK        0x01
#define CDROM_AUDIO_CONTROL_PAGE    0x0E
#define MODE_SELECT_IMMEDIATE       0x04
#define MODE_SELECT_PFBIT           0x10
#define CDB_USE_MSF                 0x01

/* Multisession CD-ROM constants */
#define GET_LAST_SESSION    0x01
#define GET_SESSION_DATA    0x02

/* All structures in this file get one-byte packing. */
#pragma pack( push, 1 )

/* There is a constant called _PRINT declared in ctype.h that causes a conflict with
 * the following structure.
 */
#ifdef _PRINT
    #undef _PRINT
#endif

/* Common descriptor block */
typedef union _CDB {
    struct _CDB6GENERIC {
        UCHAR   OperationCode;
        UCHAR   Immediate           : 1;
        UCHAR   CommandUniqueBits   : 4;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   CommandUniqueBytes[3];
        UCHAR   Link                : 1;
        UCHAR   Flag                : 1;
        UCHAR   Reserved            : 4;
        UCHAR   VendorUnique        : 2;
    } CDB6GENERIC;
    struct _CDB6READWRITE {
        UCHAR   OperationCode;
        UCHAR   LogicalBlockMsb1    : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   LogicalBlockMsb0;
        UCHAR   LogicalBlockLsb;
        UCHAR   TransferBlocks;
        UCHAR   Control;
    } CDB6READWRITE;
    struct _CDB6INQUIRY {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   PageCode;
        UCHAR   IReserved;
        UCHAR   AllocationLength;
        UCHAR   Control;
    } CDB6INQUIRY;
    struct _CDB6INQUIRY3 {
        UCHAR   OperationCode;
        UCHAR   EnableVitalProductData  : 1;
        UCHAR   CommandSupportData      : 1;
        UCHAR   Reserved1               : 6;
        UCHAR   PageCode;
        UCHAR   Reserved2;
        UCHAR   AllocationLength;
        UCHAR   Control;
    } CDB6INQUIRY3;
    struct _CDB6VERIFY {
        UCHAR   OperationCode;
        UCHAR   Fixed               : 1;
        UCHAR   ByteCompare         : 1;
        UCHAR   Immediate           : 1;
        UCHAR   Reserved            : 2;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   VerificationLength[3];
        UCHAR   Control;
    } CDB6VERIFY;
    struct _CDB6FORMAT {
        UCHAR   OperationCode;
        UCHAR   FormatControl       : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   FReserved1;
        UCHAR   InterleaveMsb;
        UCHAR   InterleaveLsb;
        UCHAR   FReserved2;
    } CDB6FORMAT;
    struct _CDB10 {
        UCHAR   OperationCode;
        UCHAR   RelativeAddress     : 1;
        UCHAR   Reserved1           : 2;
        UCHAR   ForceUnitAccess     : 1;
        UCHAR   DisablePageOut      : 1;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   LogicalBlockByte0;
        UCHAR   LogicalBlockByte1;
        UCHAR   LogicalBlockByte2;
        UCHAR   LogicalBlockByte3;
        UCHAR   Reserved2;
        UCHAR   TransferBlocksMsb;
        UCHAR   TransferBlocksLsb;
        UCHAR   Control;
    } CDB10;
    struct _CDB12 {
        UCHAR   OperationCode;
        UCHAR   RelativeAddress     : 1;
        UCHAR   Reserved1           : 2;
        UCHAR   ForceUnitAccess     : 1;
        UCHAR   DisablePageOut      : 1;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   LogicalBlock[4];
        UCHAR   TransferLength[4];
        UCHAR   Reserved2;
        UCHAR   Control;
    } CDB12;
    struct _CDB16 {
        UCHAR   OperationCode;
        UCHAR   Reserved1       : 3;
        UCHAR   ForceUnitAccess : 1;
        UCHAR   DisablePageOut  : 1;
        UCHAR   Protection      : 3;
        UCHAR   LogicalBlock[8];
        UCHAR   TransferLength[4];
        UCHAR   Reserved2;
        UCHAR   Control;
    } CDB16;
    struct _PAUSE_RESUME {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   Reserved2[6];
        UCHAR   Action;
        UCHAR   Control;
    } PAUSE_RESUME;
    struct _READ_TOC {
        UCHAR   OperationCode;
        UCHAR   Reserved0           : 1;
        UCHAR   Msf                 : 1;
        UCHAR   Reserved1           : 3;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   Format2             : 4;
        UCHAR   Reserved2           : 4;
        UCHAR   Reserved3[3];
        UCHAR   StartingTrack;
        UCHAR   AllocationLength[2];
        UCHAR   Control             : 6;
        UCHAR   Format              : 2;
    } READ_TOC;
    struct _READ_DISK_INFORMATION {
        UCHAR   OperationCode;
        UCHAR   Reserved1   : 5;
        UCHAR   Lun         : 3;
        UCHAR   Reserved2[5];
        UCHAR   AllocationLength[2];
        UCHAR   Control;
    } READ_DISK_INFORMATION, READ_DISC_INFORMATION;
    struct _READ_TRACK_INFORMATION {
        UCHAR   OperationCode;
        UCHAR   Track       : 2;
        UCHAR   Reserved4   : 3;
        UCHAR   Lun         : 3;
        UCHAR   BlockAddress[4];
        UCHAR   Reserved3;
        UCHAR   AllocationLength[2];
        UCHAR   Control;
    } READ_TRACK_INFORMATION;
    struct _RESERVE_TRACK_RZONE {
        UCHAR   OperationCode;
        UCHAR   Reserved1[4];
        UCHAR   ReservationSize[4];
        UCHAR   Control;
    } RESERVE_TRACK_RZONE;
    struct _SEND_OPC_INFORMATION {
        UCHAR   OperationCode;
        UCHAR   DoOpc       : 1;
        UCHAR   Reserved1   : 7;
        UCHAR   Exclude0    : 1;
        UCHAR   Exclude1    : 1;
        UCHAR   Reserved2   : 6;
        UCHAR   Reserved3[4];
        UCHAR   ParameterListLength[2];
        UCHAR   Reserved4;
    } SEND_OPC_INFORMATION;
    struct _REPAIR_TRACK {
        UCHAR   OperationCode;
        UCHAR   Immediate   : 1;
        UCHAR   Reserved1   : 7;
        UCHAR   Reserved2[2];
        UCHAR   TrackNumber[2];
        UCHAR   Reserved3[3];
        UCHAR   Control;
    } REPAIR_TRACK;
    struct _CLOSE_TRACK {
        UCHAR   OperationCode;
        UCHAR   Immediate   : 1;
        UCHAR   Reserved1   : 7;
        UCHAR   Track       : 1;
        UCHAR   Session     : 1;
        UCHAR   Reserved2   : 6;
        UCHAR   Reserved3;
        UCHAR   TrackNumber[2];
        UCHAR   Reserved4[3];
        UCHAR   Control;
    } CLOSE_TRACK;
    struct _READ_BUFFER_CAPACITY {
        UCHAR   OperationCode;
        UCHAR   BlockInfo   : 1;
        UCHAR   Reserved1   : 7;
        UCHAR   Reserved2[5];
        UCHAR   AllocationLength[2];
        UCHAR   Control;
    } READ_BUFFER_CAPACITY;
    struct _SEND_CUE_SHEET {
        UCHAR   OperationCode;
        UCHAR   Reserved[5];
        UCHAR   CueSheetSize[3];
        UCHAR   Control;
    } SEND_CUE_SHEET;
    struct _READ_HEADER {
        UCHAR   OperationCode;
        UCHAR   Reserved1   : 1;
        UCHAR   Msf         : 1;
        UCHAR   Reserved2   : 3;
        UCHAR   Lun         : 3;
        UCHAR   LogicalBlockAddress[4];
        UCHAR   Reserved3;
        UCHAR   AllocationLength[2];
        UCHAR   Control;
    } READ_HEADER;
    struct _PLAY_AUDIO {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   StartingBlockAddress[4];
        UCHAR   Reserved2;
        UCHAR   PlayLength[2];
        UCHAR   Control;
    } PLAY_AUDIO;
    struct _PLAY_AUDIO_MSF {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   Reserved2;
        UCHAR   StartingM;
        UCHAR   StartingS;
        UCHAR   StartingF;
        UCHAR   EndingM;
        UCHAR   EndingS;
        UCHAR   EndingF;
        UCHAR   Control;
    } PLAY_AUDIO_MSF;
    struct _BLANK_MEDIA {
        UCHAR   OperationCode;
        UCHAR   BlankType   : 3;
        UCHAR   Reserved1   : 1;
        UCHAR   Immediate   : 1;
        UCHAR   Reserved2   : 3;
        UCHAR   AddressOrTrack[4];
        UCHAR   Reserved3[5];
        UCHAR   Control;
    } BLANK_MEDIA;
    struct _PLAY_CD {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 1;
        UCHAR   CMSF                : 1;
        UCHAR   ExpectedSectorType  : 3;
        UCHAR   Lun                 : 3;
        union {
            struct _LBA {
                UCHAR   StartingBlockAddress[4];
                UCHAR   PlayLength[4];
            } LBA;
            struct _MSF {
                UCHAR   Reserved1;
                UCHAR   StartingM;
                UCHAR   StartingS;
                UCHAR   StartingF;
                UCHAR   EndingM;
                UCHAR   EndingS;
                UCHAR   EndingF;
                UCHAR   Reserved2;
            } MSF;
        };
        UCHAR   Audio               : 1;
        UCHAR   Composite           : 1;
        UCHAR   Port1               : 1;
        UCHAR   Port2               : 1;
        UCHAR   Reserved2           : 3;
        UCHAR   Speed               : 1;
        UCHAR   Control;
    } PLAY_CD;
    struct _SCAN_CD {
        UCHAR   OperationCode;
        UCHAR   RelativeAddress : 1;
        UCHAR   Reserved1       : 3;
        UCHAR   Direct          : 1;
        UCHAR   Lun             : 3;
        UCHAR   StartingAddress[4];
        UCHAR   Reserved2[3];
        UCHAR   Reserved3       : 6;
        UCHAR   Type            : 2;
        UCHAR   Reserved4;
        UCHAR   Control;
    } SCAN_CD;
    struct _STOP_PLAY_SCAN {
        UCHAR   OperationCode;
        UCHAR   Reserved1   : 5;
        UCHAR   Lun         : 3;
        UCHAR   Reserved2[7];
        UCHAR   Control;
    } STOP_PLAY_SCAN;
    struct _SUBCHANNEL {
        UCHAR   OperationCode;
        UCHAR   Reserved0           : 1;
        UCHAR   Msf                 : 1;
        UCHAR   Reserved1           : 3;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   Reserved2           : 6;
        UCHAR   SubQ                : 1;
        UCHAR   Reserved3           : 1;
        UCHAR   Format;
        UCHAR   Reserved4[2];
        UCHAR   TrackNumber;
        UCHAR   AllocationLength[2];
        UCHAR   Control;
    } SUBCHANNEL;
    struct _READ_CD {
        UCHAR   OperationCode;
        UCHAR   RelativeAddress     : 1;
        UCHAR   Reserved0           : 1;
        UCHAR   ExpectedSectorType  : 3;
        UCHAR   Lun                 : 3;
        UCHAR   StartingLBA[4];
        UCHAR   TransferBlocks[3];
        UCHAR   Reserved2           : 1;
        UCHAR   ErrorFlags          : 2;
        UCHAR   IncludeEDC          : 1;
        UCHAR   IncludeUserData     : 1;
        UCHAR   HeaderCode          : 2;
        UCHAR   IncludeSyncData     : 1;
        UCHAR   SubChannelSelection : 3;
        UCHAR   Reserved3           : 5;
        UCHAR   Control;
    } READ_CD;
    struct _READ_CD_MSF {
        UCHAR   OperationCode;
        UCHAR   RelativeAddress     : 1;
        UCHAR   Reserved1           : 1;
        UCHAR   ExpectedSectorType  : 3;
        UCHAR   Lun                 : 3;
        UCHAR   Reserved2;
        UCHAR   StartingM;
        UCHAR   StartingS;
        UCHAR   StartingF;
        UCHAR   EndingM;
        UCHAR   EndingS;
        UCHAR   EndingF;
        UCHAR   Reserved4           : 1;
        UCHAR   ErrorFlags          : 2;
        UCHAR   IncludeEDC          : 1;
        UCHAR   IncludeUserData     : 1;
        UCHAR   HeaderCode          : 2;
        UCHAR   IncludeSyncData     : 1;
        UCHAR   SubChannelSelection : 3;
        UCHAR   Reserved5           : 5;
        UCHAR   Control;
    } READ_CD_MSF;
    struct _PLXTR_READ_CDDA {
        UCHAR   OperationCode;
        UCHAR   Reserved0           : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   LogicalBlockByte0;
        UCHAR   LogicalBlockByte1;
        UCHAR   LogicalBlockByte2;
        UCHAR   LogicalBlockByte3;
        UCHAR   TransferBlockByte0;
        UCHAR   TransferBlockByte1;
        UCHAR   TransferBlockByte2;
        UCHAR   TransferBlockByte3;
        UCHAR   SubCode;
        UCHAR   Control;
    } PLXTR_READ_CDDA;
    struct _NEC_READ_CDDA {
        UCHAR   OperationCode;
        UCHAR   Reserved0;
        UCHAR   LogicalBlockByte0;
        UCHAR   LogicalBlockByte1;
        UCHAR   LogicalBlockByte2;
        UCHAR   LogicalBlockByte3;
        UCHAR   Reserved1;
        UCHAR   TransferBlockByte0;
        UCHAR   TransferBlockByte1;
        UCHAR   Control;
    } NEC_READ_CDDA;
    struct _MODE_SENSE {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 3;
        UCHAR   Dbd                 : 1;
        UCHAR   Reserved2           : 1;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   PageCode            : 6;
        UCHAR   Pc                  : 2;
        UCHAR   Reserved3;
        UCHAR   AllocationLength;
        UCHAR   Control;
    } MODE_SENSE;
    struct _MODE_SENSE10 {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 3;
        UCHAR   Dbd                 : 1;
        UCHAR   Reserved2           : 1;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   PageCode            : 6;
        UCHAR   Pc                  : 2;
        UCHAR   Reserved3[4];
        UCHAR   AllocationLength[2];
        UCHAR   Control;
    } MODE_SENSE10;
    struct _MODE_SELECT {
        UCHAR   OperationCode;
        UCHAR   SPBit               : 1;
        UCHAR   Reserved1           : 3;
        UCHAR   PFBit               : 1;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   Reserved2[2];
        UCHAR   ParameterListLength;
        UCHAR   Control;
    } MODE_SELECT;
    struct _MODE_SELECT10 {
        UCHAR   OperationCode;
        UCHAR   SPBit               : 1;
        UCHAR   Reserved1           : 3;
        UCHAR   PFBit               : 1;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   Reserved2[5];
        UCHAR   ParameterListLength[2];
        UCHAR   Control;
    } MODE_SELECT10;
    struct _LOCATE {
        UCHAR   OperationCode;
        UCHAR   Immediate           : 1;
        UCHAR   CPBit               : 1;
        UCHAR   BTBit               : 1;
        UCHAR   Reserved1           : 2;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   Reserved3;
        UCHAR   LogicalBlockAddress[4];
        UCHAR   Reserved4;
        UCHAR   Partition;
        UCHAR   Control;
    } LOCATE;
    struct _LOGSENSE {
        UCHAR   OperationCode;
        UCHAR   SPBit               : 1;
        UCHAR   PPCBit              : 1;
        UCHAR   Reserved1           : 3;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   PageCode            : 6;
        UCHAR   PCBit               : 2;
        UCHAR   Reserved2;
        UCHAR   Reserved3;
        UCHAR   ParameterPointer[2];
        UCHAR   AllocationLength[2];
        UCHAR   Control;
    } LOGSENSE;
    struct _LOGSELECT {
        UCHAR   OperationCode;
        UCHAR   SPBit               : 1;
        UCHAR   PCRBit              : 1;
        UCHAR   Reserved1           : 3;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   Reserved            : 6;
        UCHAR   PCBit               : 2;
        UCHAR   Reserved2[4];
        UCHAR   ParameterListLength[2];
        UCHAR   Control;
    } LOGSELECT;
    struct _PRINT {
        UCHAR   OperationCode;
        UCHAR   Reserved            : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   TransferLength[3];
        UCHAR   Control;
    } PRINT;
    struct _SEEK {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   LogicalBlockAddress[4];
        UCHAR   Reserved2[3];
        UCHAR   Control;
    } SEEK;
    struct _ERASE {
        UCHAR   OperationCode;
        UCHAR   Long                : 1;
        UCHAR   Immediate           : 1;
        UCHAR   Reserved1           : 3;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   Reserved2[3];
        UCHAR   Control;
    } ERASE;
    struct _START_STOP {
        UCHAR   OperationCode;
        UCHAR   Immediate           : 1;
        UCHAR   Reserved1           : 4;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   Reserved2[2];
        UCHAR   Start               : 1;
        UCHAR   LoadEject           : 1;
        UCHAR   Reserved3           : 6;
        UCHAR   Control;
    } START_STOP;
    struct _MEDIA_REMOVAL {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   Reserved2[2];
        UCHAR   Prevent             : 1;
        UCHAR   Persistant          : 1;
        UCHAR   Reserved3           : 6;
        UCHAR   Control;
    } MEDIA_REMOVAL;
    struct _SEEK_BLOCK {
        UCHAR   OperationCode;
        UCHAR   Immediate       : 1;
        UCHAR   Reserved1       : 7;
        UCHAR   BlockAddress[3];
        UCHAR   Link            : 1;
        UCHAR   Flag            : 1;
        UCHAR   Reserved2       : 4;
        UCHAR   VendorUnique    : 2;
    } SEEK_BLOCK;
    struct _REQUEST_BLOCK_ADDRESS {
        UCHAR   OperationCode;
        UCHAR   Reserved1[3];
        UCHAR   AllocationLength;
        UCHAR   Link            : 1;
        UCHAR   Flag            : 1;
        UCHAR   Reserved2       : 4;
        UCHAR   VendorUnique    : 2;
    } REQUEST_BLOCK_ADDRESS;
    struct _PARTITION {
        UCHAR   OperationCode;
        UCHAR   Immediate       : 1;
        UCHAR   Sel             : 1;
        UCHAR   PartitionSelect : 6;
        UCHAR   Reserved1[3];
        UCHAR   Control;
    } PARTITION;
    struct _WRITE_TAPE_MARKS {
        UCHAR   OperationCode;
        UCHAR   Immediate           : 1;
        UCHAR   WriteSetMarks       : 1;
        UCHAR   Reserved            : 3;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   TransferLength[3];
        UCHAR   Control;
    } WRITE_TAPE_MARKS;
    struct _SPACE_TAPE_MARKS {
        UCHAR   OperationCode;
        UCHAR   Code                : 3;
        UCHAR   Reserved            : 2;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   NumMarksMSB;
        UCHAR   NumMarks;
        UCHAR   NumMarksLSB;
        union {
            UCHAR   value;
            struct {
                UCHAR   Link            : 1;
                UCHAR   Flag            : 1;
                UCHAR   Reserved        : 4;
                UCHAR   VendorUnique    : 2;
            } Fields;
        } Byte6;
    } SPACE_TAPE_MARKS;
    struct _READ_POSITION {
        UCHAR   Operation;
        UCHAR   BlockType   : 1;
        UCHAR   Reserved1   : 4;
        UCHAR   Lun         : 3;
        UCHAR   Reserved2[7];
        UCHAR   Control;
    } READ_POSITION;
    struct _CDB6READWRITETAPE {
        UCHAR   OperationCode;
        UCHAR   VendorSpecific  : 5;
        UCHAR   Reserved        : 3;
        UCHAR   TransferLenMSB;
        UCHAR   TransferLen;
        UCHAR   TransferLenLSB;
        UCHAR   Link            : 1;
        UCHAR   Flag            : 1;
        UCHAR   Reserved1       : 4;
        UCHAR   VendorUnique    : 2;
    } CDB6READWRITETAPE;
    struct _INIT_ELEMENT_STATUS {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   Reserved2[3];
        UCHAR   Reserved3           : 7;
        UCHAR   NoBarCode           : 1;
    } INIT_ELEMENT_STATUS;
    struct _INITIALIZE_ELEMENT_RANGE {
        UCHAR   OperationCode;
        UCHAR   Range               : 1;
        UCHAR   Reserved1           : 4;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   FirstElementAddress[2];
        UCHAR   Reserved2[2];
        UCHAR   NumberOfElements[2];
        UCHAR   Reserved3;
        UCHAR   Reserved4           : 7;
        UCHAR   NoBarCode           : 1;
    } INITIALIZE_ELEMENT_RANGE;
    struct _POSITION_TO_ELEMENT {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   TransportElementAddress[2];
        UCHAR   DestinationElementAddress[2];
        UCHAR   Reserved2[2];
        UCHAR   Flip                : 1;
        UCHAR   Reserved3           : 7;
        UCHAR   Control;
    } POSITION_TO_ELEMENT;
    struct _MOVE_MEDIUM {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   TransportElementAddress[2];
        UCHAR   SourceElementAddress[2];
        UCHAR   DestinationElementAddress[2];
        UCHAR   Reserved2[2];
        UCHAR   Flip                : 1;
        UCHAR   Reserved3           : 7;
        UCHAR   Control;
    } MOVE_MEDIUM;
    struct _EXCHANGE_MEDIUM {
        UCHAR   OperationCode;
        UCHAR   Reserved1           : 5;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   TransportElementAddress[2];
        UCHAR   SourceElementAddress[2];
        UCHAR   Destination1ElementAddress[2];
        UCHAR   Destination2ElementAddress[2];
        UCHAR   Flip1               : 1;
        UCHAR   Flip2               : 1;
        UCHAR   Reserved3           : 6;
        UCHAR   Control;
    } EXCHANGE_MEDIUM;
    struct _READ_ELEMENT_STATUS {
        UCHAR   OperationCode;
        UCHAR   ElementType         : 4;
        UCHAR   VolTag              : 1;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   StartingElementAddress[2];
        UCHAR   NumberOfElements[2];
        UCHAR   Reserved1;
        UCHAR   AllocationLength[3];
        UCHAR   Reserved2;
        UCHAR   Control;
    } READ_ELEMENT_STATUS;
    struct _SEND_VOLUME_TAG {
        UCHAR   OperationCode;
        UCHAR   ElementType         : 4;
        UCHAR   Reserved1           : 1;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   StartingElementAddress[2];
        UCHAR   Reserved2;
        UCHAR   ActionCode          : 5;
        UCHAR   Reserved3           : 3;
        UCHAR   Reserved4[2];
        UCHAR   ParameterListLength[2];
        UCHAR   Reserved5;
        UCHAR   Control;
    } SEND_VOLUME_TAG;
    struct _REQUEST_VOLUME_ELEMENT_ADDRESS {
        UCHAR   OperationCode;
        UCHAR   ElementType         : 4;
        UCHAR   VolTag              : 1;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   StartingElementAddress[2];
        UCHAR   NumberElements[2];
        UCHAR   Reserved1;
        UCHAR   AllocationLength[3];
        UCHAR   Reserved2;
        UCHAR   Control;
    } REQUEST_VOLUME_ELEMENT_ADDRESS;
    struct _LOAD_UNLOAD {
        UCHAR   OperationCode;
        UCHAR   Immediate   : 1;
        UCHAR   Reserved1   : 4;
        UCHAR   Lun         : 3;
        UCHAR   Reserved2[2];
        UCHAR   Start       : 1;
        UCHAR   LoadEject   : 1;
        UCHAR   Reserved3   : 6;
        UCHAR   Reserved4[3];
        UCHAR   Slot;
        UCHAR   Reserved5[3];
    } LOAD_UNLOAD;
    struct _MECH_STATUS {
        UCHAR   OperationCode;
        UCHAR   Reserved    : 5;
        UCHAR   Lun         : 3;
        UCHAR   Reserved1[6];
        UCHAR   AllocationLength[2];
        UCHAR   Reserved2[1];
        UCHAR   Control;
    } MECH_STATUS;
    struct _SYNCHRONIZE_CACHE10 {
        UCHAR   OperationCode;
        UCHAR   RelAddr     : 1;
        UCHAR   Immediate   : 1;
        UCHAR   Reserved    : 3;
        UCHAR   Lun         : 3;
        UCHAR   LogicalBlockAddress[4];
        UCHAR   Reserved2;
        UCHAR   BlockCount[2];
        UCHAR   Control;
    } SYNCHRONIZE_CACHE10;
    struct _GET_EVENT_STATUS_NOTIFICATION {
        UCHAR   OperationCode;
        UCHAR   Immediate   : 1;
        UCHAR   Reserved    : 4;
        UCHAR   Lun         : 3;
        UCHAR   Reserved2[2];
        UCHAR   NotificationClassRequest;
        UCHAR   Reserved3[2];
        UCHAR   EventListLength[2];
        UCHAR   Control;
    } GET_EVENT_STATUS_NOTIFICATION;
    struct _GET_PERFORMANCE {
        UCHAR   OperationCode;
        UCHAR   Except      : 2;
        UCHAR   Write       : 1;
        UCHAR   Tolerance   : 2;
        UCHAR   Reserved0   : 3;
        UCHAR   StartingLBA[4];
        UCHAR   Reserved1[2];
        UCHAR   MaximumNumberOfDescriptors[2];
        UCHAR   Type;
        UCHAR   Control;
    } GET_PERFORMANCE;
    struct _READ_DVD_STRUCTURE {
        UCHAR   OperationCode;
        UCHAR   Reserved1   : 5;
        UCHAR   Lun         : 3;
        UCHAR   RMDBlockNumber[4];
        UCHAR   LayerNumber;
        UCHAR   Format;
        UCHAR   AllocationLength[2];
        UCHAR   Reserved3   : 6;
        UCHAR   AGID        : 2;
        UCHAR   Control;
    } READ_DVD_STRUCTURE;
    struct _SET_STREAMING {
        UCHAR   OperationCode;
        UCHAR   Reserved[8];
        UCHAR   ParameterListLength[2];
        UCHAR   Control;
    } SET_STREAMING;
    struct _SEND_DVD_STRUCTURE {
        UCHAR   OperationCode;
        UCHAR   Reserved1   : 5;
        UCHAR   Lun         : 3;
        UCHAR   Reserved2[5];
        UCHAR   Format;
        UCHAR   ParameterListLength[2];
        UCHAR   Reserved3;
        UCHAR   Control;
    } SEND_DVD_STRUCTURE;
    struct _SEND_KEY {
        UCHAR   OperationCode;
        UCHAR   Reserved1   : 5;
        UCHAR   Lun         : 3;
        UCHAR   Reserved2[6];
        UCHAR   ParameterListLength[2];
        UCHAR   KeyFormat   : 6;
        UCHAR   AGID        : 2;
        UCHAR   Control;
    } SEND_KEY;
    struct _REPORT_KEY {
        UCHAR   OperationCode;
        UCHAR   Reserved1   : 5;
        UCHAR   Lun         : 3;
        UCHAR   LogicalBlockAddress[4];
        UCHAR   Reserved2[2];
        UCHAR   AllocationLength[2];
        UCHAR   KeyFormat   : 6;
        UCHAR   AGID        : 2;
        UCHAR   Control;
    } REPORT_KEY;
    struct _SET_READ_AHEAD {
        UCHAR   OperationCode;
        UCHAR   Reserved1   : 5;
        UCHAR   Lun         : 3;
        UCHAR   TriggerLBA[4];
        UCHAR   ReadAheadLBA[4];
        UCHAR   Reserved2;
        UCHAR   Control;
    } SET_READ_AHEAD;
    struct _READ_FORMATTED_CAPACITIES {
        UCHAR   OperationCode;
        UCHAR   Reserved1   : 5;
        UCHAR   Lun         : 3;
        UCHAR   Reserved2[5];
        UCHAR   AllocationLength[2];
        UCHAR   Control;
    } READ_FORMATTED_CAPACITIES;
    struct _REPORT_LUNS {
        UCHAR   OperationCode;
        UCHAR   Reserved1[5];
        UCHAR   AllocationLength[4];
        UCHAR   Reserved2[1];
        UCHAR   Control;
    } REPORT_LUNS;
    struct _PERSISTENT_RESERVE_IN {
        UCHAR   OperationCode;
        UCHAR   ServiceAction   : 5;
        UCHAR   Reserved1       : 3;
        UCHAR   Reserved2[5];
        UCHAR   AllocationLength[2];
        UCHAR   Control;
    } PERSISTENT_RESERVE_IN;
    struct _PERSISTENT_RESERVE_OUT {
        UCHAR   OperationCode;
        UCHAR   ServiceAction   : 5;
        UCHAR   Reserved1       : 3;
        UCHAR   Type            : 4;
        UCHAR   Scope           : 4;
        UCHAR   Reserved2[4];
        UCHAR   ParameterListLength[2];
        UCHAR   Control;
    } PERSISTENT_RESERVE_OUT;
    struct _GET_CONFIGURATION {
        UCHAR   OperationCode;
        UCHAR   RequestType : 2;
        UCHAR   Reserved1   : 6;
        UCHAR   StartingFeature[2];
        UCHAR   Reserved2[3];
        UCHAR   AllocationLength[2];
        UCHAR   Control;
    } GET_CONFIGURATION;
    struct _SET_CD_SPEED {
        UCHAR   OperationCode;
        union {
            UCHAR   Reserved1;
            struct {
                UCHAR   RotationControl : 2;
                UCHAR   Reserved3       : 6;
            };
        };
        UCHAR   ReadSpeed[2];
        UCHAR   WriteSpeed[2];
        UCHAR   Reserved2[5];
        UCHAR   Control;
    } SET_CD_SPEED;
    struct _READ12 {
        UCHAR   OperationCode;
        UCHAR   RelativeAddress     : 1;
        UCHAR   Reserved1           : 2;
        UCHAR   ForceUnitAccess     : 1;
        UCHAR   DisablePageOut      : 1;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   LogicalBlock[4];
        UCHAR   TransferLength[4];
        UCHAR   Reserved2           : 7;
        UCHAR   Streaming           : 1;
        UCHAR   Control;
    } READ12;
    struct _WRITE12 {
        UCHAR   OperationCode;
        UCHAR   RelativeAddress     : 1;
        UCHAR   Reserved1           : 1;
        UCHAR   EBP                 : 1;
        UCHAR   ForceUnitAccess     : 1;
        UCHAR   DisablePageOut      : 1;
        UCHAR   LogicalUnitNumber   : 3;
        UCHAR   LogicalBlock[4];
        UCHAR   TransferLength[4];
        UCHAR   Reserved2           : 7;
        UCHAR   Streaming           : 1;
        UCHAR   Control;
    } WRITE12;
    struct _READ16 {
        UCHAR   OperationCode;
        UCHAR   Reserved1       : 3;
        UCHAR   ForceUnitAccess : 1;
        UCHAR   DisablePageOut  : 1;
        UCHAR   ReadProtect     : 3;
        UCHAR   LogicalBlock[8];
        UCHAR   TransferLength[4];
        UCHAR   Reserved2       : 7;
        UCHAR   Streaming       : 1;
        UCHAR   Control;
    } READ16;
    struct _WRITE16 {
        UCHAR   OperationCode;
        UCHAR   Reserved1       : 3;
        UCHAR   ForceUnitAccess : 1;
        UCHAR   DisablePageOut  : 1;
        UCHAR   WriteProtect    : 3;
        UCHAR   LogicalBlock[8];
        UCHAR   TransferLength[4];
        UCHAR   Reserved2       : 7;
        UCHAR   Streaming       : 1;
        UCHAR   Control;
    } WRITE16;
    struct _VERIFY16 {
        UCHAR   OperationCode;
        UCHAR   Reserved1       : 1;
        UCHAR   ByteCheck       : 1;
        UCHAR   BlockVerify     : 1;
        UCHAR   Reserved2       : 1;
        UCHAR   DisablePageOut  : 1;
        UCHAR   VerifyProtect   : 3;
        UCHAR   LogicalBlock[8];
        UCHAR   VerificationLength[4];
        UCHAR   Reserved3       : 7;
        UCHAR   Streaming       : 1;
        UCHAR   Control;
    } VERIFY16;
    struct _SYNCHRONIZE_CACHE16 {
        UCHAR   OperationCode;
        UCHAR   Reserved1   : 1;
        UCHAR   Immediate   : 1;
        UCHAR   Reserved2   : 6;
        UCHAR   LogicalBlock[8];
        UCHAR   BlockCount[4];
        UCHAR   Reserved3;
        UCHAR   Control;
    } SYNCHRONIZE_CACHE16;
    struct _READ_CAPACITY16 {
        UCHAR   OperationCode;
        UCHAR   ServiceAction   : 5;
        UCHAR   Reserved1       : 3;
        UCHAR   LogicalBlock[8];
        UCHAR   BlockCount[4];
        UCHAR   PMI             : 1;
        UCHAR   Reserved2       : 7;
        UCHAR   Control;
    } READ_CAPACITY16;
    ULONG   AsUlong[4];
    UCHAR   AsByte[16];
} CDB;
typedef CDB *PCDB;

/* Notification event status header */
typedef struct _NOTIFICATION_EVENT_STATUS_HEADER {
    UCHAR   EventDataLength[2];
    UCHAR   NotificationClass   : 3;
    UCHAR   Reserved            : 4;
    UCHAR   NEA                 : 1;
    UCHAR   SupportedEventClasses;
} NOTIFICATION_EVENT_STATUS_HEADER;
typedef NOTIFICATION_EVENT_STATUS_HEADER    *PNOTIFICATION_EVENT_STATUS_HEADER;

/* Notification operational status */
typedef struct _NOTIFICATION_OPERATIONAL_STATUS {
    UCHAR   OperationalEvent    : 4;
    UCHAR   Reserved1           : 4;
    UCHAR   OperationalStatus   : 4;
    UCHAR   Reserved2           : 3;
    UCHAR   PersistentPrevented : 1;
    UCHAR   Operation[2];
} NOTIFICATION_OPERATIONAL_STATUS;
typedef NOTIFICATION_OPERATIONAL_STATUS *PNOTIFICATION_OPERATIONAL_STATUS;

/* Notification power status */
typedef struct _NOTIFICATION_POWER_STATUS {
    UCHAR   PowerEvent  : 4;
    UCHAR   Reserved    : 4;
    UCHAR   PowerStatus;
    UCHAR   Reserved2[2];
} NOTIFICATION_POWER_STATUS;
typedef NOTIFICATION_POWER_STATUS   *PNOTIFICATION_POWER_STATUS;

/* Notification external status */
typedef struct _NOTIFICATION_EXTERNAL_STATUS {
    UCHAR   ExternalEvent       : 4;
    UCHAR   Reserved1           : 4;
    UCHAR   ExternalStatus      : 4;
    UCHAR   Reserved2           : 3;
    UCHAR   PersistentPrevented : 1;
    UCHAR   Request[2];
} NOTIFICATION_EXTERNAL_STATUS;
typedef NOTIFICATION_EXTERNAL_STATUS    *PNOTIFICATION_EXTERNAL_STATUS;

/* Notification media status */
typedef struct _NOTIFICATION_MEDIA_STATUS {
    UCHAR   MediaEvent  : 4;
    UCHAR   Reserved    : 4;
    union {
        UCHAR   PowerStatus;
        UCHAR   MediaStatus;
        struct {
            UCHAR   DoorTrayOpen    : 1;
            UCHAR   MediaPresent    : 1;
            UCHAR   ReservedX       : 6;
        };
    };
    UCHAR   StartSlot;
    UCHAR   EndSlot;
} NOTIFICATION_MEDIA_STATUS;
typedef NOTIFICATION_MEDIA_STATUS   *PNOTIFICATION_MEDIA_STATUS;

/* Notification multi-host status */
typedef struct _NOTIFICATION_MULTI_HOST_STATUS {
    UCHAR   MultiHostEvent      : 4;
    UCHAR   Reserved1           : 4;
    UCHAR   MultiHostStatus     : 4;
    UCHAR   Reserved2           : 3;
    UCHAR   PersistentPrevented : 1;
    UCHAR   Priority[2];
} NOTIFICATION_MULTI_HOST_STATUS;
typedef NOTIFICATION_MULTI_HOST_STATUS  *PNOTIFICATION_MULTI_HOST_STATUS;

/* Notification busy status */
typedef struct _NOTIFICATION_BUSY_STATUS {
    UCHAR   DeviceBusyEvent : 4;
    UCHAR   Reserved        : 4;
    UCHAR   DeviceBusyStatus;
    UCHAR   Time[2];
} NOTIFICATION_BUSY_STATUS;
typedef NOTIFICATION_BUSY_STATUS    *PNOTIFICATION_BUSY_STATUS;

/* Read DVD structures header */
typedef struct _READ_DVD_STRUCTURES_HEADER {
    UCHAR   Length[2];
    UCHAR   Reserved[2];
    UCHAR   Data[1];
} READ_DVD_STRUCTURES_HEADER;
typedef READ_DVD_STRUCTURES_HEADER  *PREAD_DVD_STRUCTURES_HEADER;

/* CDVD key header */
typedef struct _CDVD_KEY_HEADER {
    UCHAR   DataLength[2];
    UCHAR   Reserved[2];
    UCHAR   Data[1];
} CDVD_KEY_HEADER;
typedef CDVD_KEY_HEADER *PCDVD_KEY_HEADER;

/* CDVD report AGID data */
typedef struct _CDVD_REPORT_AGID_DATA {
    UCHAR   Reserved1[3];
    UCHAR   Reserved2   : 6;
    UCHAR   AGID        : 2;
} CDVD_REPORT_AGID_DATA;
typedef CDVD_REPORT_AGID_DATA   *PCDVD_REPORT_AGID_DATA;

/* CDVD challenge key data */
typedef struct _CDVD_CHALLENGE_KEY_DATA {
    UCHAR   ChallengeKeyValue[10];
    UCHAR   Reserved[2];
} CDVD_CHALLENGE_KEY_DATA;
typedef CDVD_CHALLENGE_KEY_DATA *PCDVD_CHALLENGE_KEY_DATA;

/* CDVD key data */
typedef struct _CDVD_KEY_DATA {
    UCHAR   Key[5];
    UCHAR   Reserved[3];
} CDVD_KEY_DATA;
typedef CDVD_KEY_DATA   *PCDVD_KEY_DATA;

/* CDVD report ASF data */
typedef struct _CDVD_REPORT_ASF_DATA {
    UCHAR   Reserved1[3];
    UCHAR   Success     : 1;
    UCHAR   Reserved2   : 7;
} CDVD_REPORT_ASF_DATA;
typedef CDVD_REPORT_ASF_DATA    *PCDVD_REPORT_ASF_DATA;

/* CDVD title key header */
typedef struct _CDVD_TITLE_KEY_HEADER {
    UCHAR           DataLength[2];
    UCHAR           Reserved1[1];
    UCHAR           Reserved2   : 3;
    UCHAR           CGMS        : 2;
    UCHAR           CP_SEC      : 1;
    UCHAR           CPM         : 1;
    UCHAR           Zero        : 1;
    CDVD_KEY_DATA   TitleKey;
} CDVD_TITLE_KEY_HEADER;
typedef CDVD_TITLE_KEY_HEADER   *PCDVD_TITLE_KEY_HEADER;

/* Format descriptor */
typedef struct _FORMAT_DESCRIPTOR {
    UCHAR   NumberOfBlocks[4];
    UCHAR   FormatSubType   : 2;
    UCHAR   FormatType      : 6;
    UCHAR   BlockLength[3];
} FORMAT_DESCRIPTOR;
typedef FORMAT_DESCRIPTOR   *PFORMAT_DESCRIPTOR;

/* Format list header */
typedef struct _FORMAT_LIST_HEADER {
    UCHAR               Reserved;
    UCHAR               VendorSpecific  : 1;
    UCHAR               Immediate       : 1;
    UCHAR               TryOut          : 1;
    UCHAR               IP              : 1;
    UCHAR               STPF            : 1;
    UCHAR               DCRT            : 1;
    UCHAR               DPRY            : 1;
    UCHAR               FOV             : 1;
    UCHAR               FormatDescriptorLength[2];
    FORMAT_DESCRIPTOR   Descriptors[1];
} FORMAT_LIST_HEADER;
typedef FORMAT_LIST_HEADER  *PFORMAT_LIST_HEADER;

/* Formatted capacity descriptor */
typedef struct _FORMATTED_CAPACITY_DESCRIPTOR {
    UCHAR   NumberOfBlocks[4];
    UCHAR   Maximum     : 1;
    UCHAR   Valid       : 1;
    UCHAR   FormatType  : 6;
    UCHAR   BlockLength[3];
} FORMATTED_CAPACITY_DESCRIPTOR;
typedef FORMATTED_CAPACITY_DESCRIPTOR   *PFORMATTED_CAPACITY_DESCRIPTOR;

/* Formatted capacity list */
typedef struct _FORMATTED_CAPACITY_LIST {
    UCHAR                           Reserved[3];
    UCHAR                           CapacityListLength;
    FORMATTED_CAPACITY_DESCRIPTOR   Descriptors[1];
} FORMATTED_CAPACITY_LIST;
typedef FORMATTED_CAPACITY_LIST *PFORMATTED_CAPACITY_LIST;

/* OPC table entry */
typedef struct _OPC_TABLE_ENTRY {
    UCHAR   Speed[2];
    UCHAR   OPCValue[6];
} OPC_TABLE_ENTRY;
typedef OPC_TABLE_ENTRY *POPC_TABLE_ENTRY;

/* Disc information */
typedef struct _DISC_INFORMATION {
    UCHAR           Length[2];
    UCHAR           DiscStatus          : 2;
    UCHAR           LastSessionStatus   : 2;
    UCHAR           Erasable            : 1;
    UCHAR           Reserved1           : 3;
    UCHAR           FirstTrackNumber;
    UCHAR           NumberOfSessionsLsb;
    UCHAR           LastSessionFirstTrackLsb;
    UCHAR           LastSessionLastTrackLsb;
    UCHAR           MrwStatus           : 2;
    UCHAR           MrwDirtyBit         : 1;
    UCHAR           Reserved2           : 2;
    UCHAR           URU                 : 1;
    UCHAR           DBC_V               : 1;
    UCHAR           DID_V               : 1;
    UCHAR           DiscType;
    UCHAR           NumberOfSessionsMsb;
    UCHAR           LastSessionFirstTrackMsb;
    UCHAR           LastSessionLastTrackMsb;
    UCHAR           DiskIdentification[4];
    UCHAR           LastSessionLeadIn[4];
    UCHAR           LastPossibleLeadOutStartTime[4];
    UCHAR           DiskBarCode[8];
    UCHAR           Reserved4;
    UCHAR           NumberOPCEntries;
    OPC_TABLE_ENTRY OPCTable[1];
} DISC_INFORMATION;
typedef DISC_INFORMATION    *PDISC_INFORMATION;

/* Disk information */
typedef struct _DISK_INFORMATION {
    UCHAR           Length[2];
    UCHAR           DiskStatus          : 2;
    UCHAR           LastSessionStatus   : 2;
    UCHAR           Erasable            : 1;
    UCHAR           Reserved1           : 3;
    UCHAR           FirstTrackNumber;
    UCHAR           NumberOfSessions;
    UCHAR           LastSessionFirstTrack;
    UCHAR           LastSessionLastTrack;
    UCHAR           Reserved2           : 5;
    UCHAR           GEN                 : 1;
    UCHAR           DBC_V               : 1;
    UCHAR           DID_V               : 1;
    UCHAR           DiskType;
    UCHAR           Reserved3[3];
    UCHAR           DiskIdentification[4];
    UCHAR           LastSessionLeadIn[4];
    UCHAR           LastPossibleStartTime[4];
    UCHAR           DiskBarCode[8];
    UCHAR           Reserved4;
    UCHAR           NumberOPCEntries;
    OPC_TABLE_ENTRY OPCTable[1];
} DISK_INFORMATION;
typedef DISK_INFORMATION    *PDISK_INFORMATION;

/* Data block header */
typedef struct _DATA_BLOCK_HEADER {
    UCHAR   DataMode;
    UCHAR   Reserved[4];
    union {
        UCHAR   LogicalBlockAddress[4];
        struct {
            UCHAR   Reserved;
            UCHAR   M;
            UCHAR   S;
            UCHAR   F;
        } MSF;
    };
} DATA_BLOCK_HEADER;
typedef DATA_BLOCK_HEADER   *PDATA_BLOCK_HEADER;

/* Track information */
typedef struct _TRACK_INFORMATION {
    UCHAR   Length[2];
    UCHAR   TrackNumber;
    UCHAR   SessionNumber;
    UCHAR   Reserved1;
    UCHAR   TrackMode   : 4;
    UCHAR   Copy        : 1;
    UCHAR   Damage      : 1;
    UCHAR   Reserved2   : 2;
    UCHAR   DataMode    : 4;
    UCHAR   FP          : 1;
    UCHAR   Packet      : 1;
    UCHAR   Blank       : 1;
    UCHAR   RT          : 1;
    UCHAR   NWA_V       : 1;
    UCHAR   Reserved3   : 7;
    UCHAR   TrackStartAddress[4];
    UCHAR   NextWritableAddress[4];
    UCHAR   FreeBlocks[4];
    UCHAR   FixedPacketSize[4];
} TRACK_INFORMATION;
typedef TRACK_INFORMATION   *PTRACK_INFORMATION;

/* Track information (revision 2) */
typedef struct _TRACK_INFORMATION2 {
    UCHAR   Length[2];
    UCHAR   TrackNumberLsb;
    UCHAR   SessionNumberLsb;
    UCHAR   Reserved4;
    UCHAR   TrackMode       : 4;
    UCHAR   Copy            : 1;
    UCHAR   Damage          : 1;
    UCHAR   Reserved5       : 2;
    UCHAR   DataMode        : 4;
    UCHAR   FixedPacket     : 1;
    UCHAR   Packet          : 1;
    UCHAR   Blank           : 1;
    UCHAR   ReservedTrack   : 1;
    UCHAR   NWA_V           : 1;
    UCHAR   LRA_V           : 1;
    UCHAR   Reserved6       : 6;
    UCHAR   TrackStartAddress[4];
    UCHAR   NextWritableAddress[4];
    UCHAR   FreeBlocks[4];
    UCHAR   FixedPacketSize[4];
    UCHAR   TrackSize[4];
    UCHAR   LastRecordedAddress[4];
    UCHAR   TrackNumberMsb;
    UCHAR   SessionNumberMsb;
    UCHAR   Reserved7[2];
} TRACK_INFORMATION2;
typedef TRACK_INFORMATION2  *PTRACK_INFORMATION2;

/* Track information (revision 3) */
typedef struct _TRACK_INFORMATION3 {
    UCHAR   Length[2];
    UCHAR   TrackNumberLsb;
    UCHAR   SessionNumberLsb;
    UCHAR   Reserved4;
    UCHAR   TrackMode       : 4;
    UCHAR   Copy            : 1;
    UCHAR   Damage          : 1;
    UCHAR   Reserved5       : 2;
    UCHAR   DataMode        : 4;
    UCHAR   FixedPacket     : 1;
    UCHAR   Packet          : 1;
    UCHAR   Blank           : 1;
    UCHAR   ReservedTrack   : 1;
    UCHAR   NWA_V           : 1;
    UCHAR   LRA_V           : 1;
    UCHAR   Reserved6       : 6;
    UCHAR   TrackStartAddress[4];
    UCHAR   NextWritableAddress[4];
    UCHAR   FreeBlocks[4];
    UCHAR   FixedPacketSize[4];
    UCHAR   TrackSize[4];
    UCHAR   LastRecordedAddress[4];
    UCHAR   TrackNumberMsb;
    UCHAR   SessionNumberMsb;
    UCHAR   Reserved7[2];
    UCHAR   ReadCompatibilityLba[4];
} TRACK_INFORMATION3;
typedef TRACK_INFORMATION3  *PTRACK_INFORMATION3;

/* Performance descriptor */
typedef struct _PERFORMANCE_DESCRIPTOR {
    UCHAR   RandomAccess            : 1;
    UCHAR   Exact                   : 1;
    UCHAR   RestoreDefaults         : 1;
    UCHAR   WriteRotationControl    : 2;
    UCHAR   Reserved1               : 3;
    UCHAR   Reserved[3];
    UCHAR   StartLba[4];
    UCHAR   EndLba[4];
    UCHAR   ReadSize[4];
    UCHAR   ReadTime[4];
    UCHAR   WriteSize[4];
    UCHAR   WriteTime[4];
} PERFORMANCE_DESCRIPTOR;
typedef PERFORMANCE_DESCRIPTOR  *PPERFORMANCE_DESCRIPTOR;

/* SCSI extended message */
typedef struct _SCSI_EXTENDED_MESSAGE {
    UCHAR   InitialMessageCode;
    UCHAR   MessageLength;
    UCHAR   MessageType;
    union _EXTENDED_ARGUMENTS {
        struct {
            UCHAR   Modifier[4];
        } Modify;
        struct {
            UCHAR   TransferPeriod;
            UCHAR   ReqAckOffset;
        } Synchronous;
        struct {
            UCHAR   Width;
        } Wide;
    } ExtendedArguments;
} SCSI_EXTENDED_MESSAGE;
typedef SCSI_EXTENDED_MESSAGE   *PSCSI_EXTENDED_MESSAGE;

/* Inquiry data */
typedef struct _INQUIRYDATA {
    UCHAR   DeviceType          : 5;
    UCHAR   DeviceTypeQualifier : 3;
    UCHAR   DeviceTypeModifier  : 7;
    UCHAR   RemovableMedia      : 1;
#if (NTDDI_VERSION >= 0x05010000)
    union {
        UCHAR   Versions;
        struct {
            UCHAR   ANSIVersion : 3;
            UCHAR   ECMAVersion : 3;
            UCHAR   ISOVersion  : 2;
        };
    };
#else
    UCHAR   Versions;
#endif
    UCHAR   ResponseDataFormat  : 4;
    UCHAR   HiSupport           : 1;
    UCHAR   NormACA             : 1;
#if (NTDDI_VERSION >= 0x05010000)
    UCHAR   TerminateTask       : 1;
#else
    UCHAR   ReservedBit         : 1;
#endif
    UCHAR   AERC                : 1;
    UCHAR   AdditionalLength;
#if (NTDDI_VERSION >= 0x05010000)
    UCHAR   Reserved;
    UCHAR   Addr16              : 1;
    UCHAR   Addr32              : 1;
    UCHAR   AckReqQ             : 1;
    UCHAR   MediumChanger       : 1;
    UCHAR   MultiPort           : 1;
    UCHAR   ReservedBit2        : 1;
    UCHAR   EnclosureServices   : 1;
    UCHAR   ReservedBit3        : 1;
#else
    UCHAR   Reserved[2];
#endif
    UCHAR   SoftReset           : 1;
    UCHAR   CommandQueue        : 1;
#if (NTDDI_VERSION >= 0x05010000)
    UCHAR   TransferDisable     : 1;
#else
    UCHAR   Reserved2           : 1;
#endif
    UCHAR   LinkedCommands      : 1;
    UCHAR   Synchronous         : 1;
    UCHAR   Wide16Bit           : 1;
    UCHAR   Wide32Bit           : 1;
    UCHAR   RelativeAddressing  : 1;
    UCHAR   VendorId[8];
    UCHAR   ProductId[16];
    UCHAR   ProductRevisionLevel[4];
    UCHAR   VendorSpecific[20];
    UCHAR   Reserved3[40];
} INQUIRYDATA;
typedef INQUIRYDATA *PINQUIRYDATA;

/* Vital product data media serial number page */
typedef struct _VPD_MEDIA_SERIAL_NUMBER_PAGE {
    UCHAR   DeviceType          : 5;
    UCHAR   DeviceTypeQualifier : 3;
    UCHAR   PageCode;
    UCHAR   Reserved;
    UCHAR   PageLength;
    UCHAR   SerialNumber[1];
} VPD_MEDIA_SERIAL_NUMBER_PAGE;
typedef VPD_MEDIA_SERIAL_NUMBER_PAGE    *PVPD_MEDIA_SERIAL_NUMBER_PAGE;

/* Vital product data serial number page */
typedef struct _VPD_SERIAL_NUMBER_PAGE {
    UCHAR   DeviceType          : 5;
    UCHAR   DeviceTypeQualifier : 3;
    UCHAR   PageCode;
    UCHAR   Reserved;
    UCHAR   PageLength;
    UCHAR   SerialNumber[1];
} VPD_SERIAL_NUMBER_PAGE;
typedef VPD_SERIAL_NUMBER_PAGE  *PVPD_SERIAL_NUMBER_PAGE;

/* Vital product data code sets */
typedef enum _VPD_CODE_SET {
    VpdCodeSetReserved  = 0,
    VpdCodeSetBinary    = 1,
    VpdCodeSetAscii     = 2,
    VpdCodeSetUTF8      = 3
} VPD_CODE_SET;
typedef VPD_CODE_SET    *PVPD_CODE_SET;

/* Vital product data associations */
typedef enum _VPD_ASSOCIATION {
    VpdAssocDevice  = 0,
    VpdAssocPort    = 1,
    VpdAssocTarget  = 2
} VPD_ASSOCIATION;
typedef VPD_ASSOCIATION *PVPD_ASSOCIATION;

/* Vital product data identifier types */
typedef enum _VPD_IDENTIFIER_TYPE {
    VpdIdentifierTypeVendorSpecific     = 0,
    VpdIdentifierTypeVendorId           = 1,
    VpdIdentifierTypeEUI64              = 2,
    VpdIdentifierTypeFCPHName           = 3,
    VpdIdentifierTypePortRelative       = 4,
    VpdIdentifierTypeTargetPortGroup    = 5,
    VpdIdentifierTypeLogicalUnitGroup   = 6,
    VpdIdentifierTypeMD5LogicalUnitId   = 7,
    VpdIdentifierTypeSCSINameString     = 8
} VPD_IDENTIFIER_TYPE;
typedef VPD_IDENTIFIER_TYPE *PVPD_IDENTIFIER_TYPE;

/* Vital product data identification descriptor */
typedef struct _VPD_IDENTIFICATION_DESCRIPTOR {
    UCHAR   CodeSet         : 4;
    UCHAR   Reserved        : 4;
    UCHAR   IdentifierType  : 4;
    UCHAR   Association     : 2;
    UCHAR   Reserved2       : 2;
    UCHAR   Reserved3;
    UCHAR   IdentifierLength;
    UCHAR   Identifier[1];
} VPD_IDENTIFICATION_DESCRIPTOR;
typedef VPD_IDENTIFICATION_DESCRIPTOR   *PVPD_IDENTIFICATION_DESCRIPTOR;

/* Vital product data identification page */
typedef struct _VPD_IDENTIFICATION_PAGE {
    UCHAR   DeviceType          : 5;
    UCHAR   DeviceTypeQualifier : 3;
    UCHAR   PageCode;
    UCHAR   Reserved;
    UCHAR   PageLength;
    UCHAR   Descriptors[1];
} VPD_IDENTIFICATION_PAGE;
typedef VPD_IDENTIFICATION_PAGE *PVPD_IDENTIFICATION_PAGE;

/* Vital product data supported pages page */
typedef struct _VPD_SUPPORTED_PAGES_PAGE {
    UCHAR   DeviceType          : 5;
    UCHAR   DeviceTypeQualifier : 3;
    UCHAR   PageCode;
    UCHAR   Reserved;
    UCHAR   PageLength;
    UCHAR   SupportedPageList[1];
} VPD_SUPPORTED_PAGES_PAGE;
typedef VPD_SUPPORTED_PAGES_PAGE    *PVPD_SUPPORTED_PAGES_PAGE;

/* Registration list */
typedef struct {
    UCHAR   Generation[4];
    UCHAR   AdditionalLength[4];
    UCHAR   ReservationKeyList[1][8];
} PRI_REGISTRATION_LIST;
typedef PRI_REGISTRATION_LIST   *PPRI_REGISTRATION_LIST;

/* Reservation descriptor */
typedef struct {
    UCHAR   ReservationKey[8];
    UCHAR   ScopeSpecificAddress[4];
    UCHAR   Reserved;
    UCHAR   Type    : 4;
    UCHAR   Scope   : 4;
    UCHAR   Obsolete[2];
} PRI_RESERVATION_DESCRIPTOR;
typedef PRI_RESERVATION_DESCRIPTOR  *PPRI_RESERVATION_DESCRIPTOR;

/* Reservation list */
typedef struct {
    UCHAR                       Generation[4];
    UCHAR                       AdditionalLength[4];
    PRI_RESERVATION_DESCRIPTOR  Reservations[1];
} PRI_RESERVATION_LIST;
typedef PRI_RESERVATION_LIST    *PPRI_RESERVATION_LIST;

/* Parameter list */
typedef struct {
    UCHAR   ReservationKey[8];
    UCHAR   ServiceActionReservationKey[8];
    UCHAR   ScopeSpecificAddress[4];
    UCHAR   ActivatePersistThroughPowerLoss : 1;
    UCHAR   Reserved1                       : 7;
    UCHAR   Reserved2;
    UCHAR   Obsolete[2];
} PRO_PARAMETER_LIST;
typedef PRO_PARAMETER_LIST  *PPRO_PARAMETER_LIST;

/* Sense data */
typedef struct _SENSE_DATA {
    UCHAR   ErrorCode       : 7;
    UCHAR   Valid           : 1;
    UCHAR   SegmentNumber;
    UCHAR   SenseKey        : 4;
    UCHAR   Reserved        : 1;
    UCHAR   IncorrectLength : 1;
    UCHAR   EndOfMedia      : 1;
    UCHAR   FileMark        : 1;
    UCHAR   Information[4];
    UCHAR   AdditionalSenseLength;
    UCHAR   CommandSpecificInformation[4];
    UCHAR   AdditionalSenseCode;
    UCHAR   AdditionalSenseCodeQualifier;
    UCHAR   FieldReplaceableUnitCode;
    UCHAR   SenseKeySpecific[3];
} SENSE_DATA;
typedef SENSE_DATA  *PSENSE_DATA;

/* Read capacity data */
typedef struct _READ_CAPACITY_DATA {
    ULONG   LogicalBlockAddress;
    ULONG   BytesPerBlock;
} READ_CAPACITY_DATA;
typedef READ_CAPACITY_DATA  *PREAD_CAPACITY_DATA;

/* Read capacity data (extended version) */
typedef struct _READ_CAPACITY_DATA_EX {
    LARGE_INTEGER   LogicalBlockAddress;
    ULONG           BytesPerBlock;
} READ_CAPACITY_DATA_EX;
typedef READ_CAPACITY_DATA_EX   *PREAD_CAPACITY_DATA_EX;

/* Read block limits */
typedef struct _READ_BLOCK_LIMITS {
    UCHAR   Reserved;
    UCHAR   BlockMaximumSize[3];
    UCHAR   BlockMinimumSize[2];
} READ_BLOCK_LIMITS_DATA;
typedef READ_BLOCK_LIMITS_DATA  *PREAD_BLOCK_LIMITS_DATA;

/* Read buffer capacity data */
typedef struct _READ_BUFFER_CAPACITY_DATA {
    UCHAR   DataLength[2];
    UCHAR   Reserved1;
    UCHAR   BlockDataReturned   : 1;
    UCHAR   Reserved4           : 7;
    UCHAR   TotalBufferSize[4];
    UCHAR   AvailableBufferSize[4];
} READ_BUFFER_CAPACITY_DATA;
typedef READ_BUFFER_CAPACITY_DATA   *PREAD_BUFFER_CAPACITY_DATA;

/* Mode parameter header */
typedef struct _MODE_PARAMETER_HEADER {
    UCHAR   ModeDataLength;
    UCHAR   MediumType;
    UCHAR   DeviceSpecificParameter;
    UCHAR   BlockDescriptorLength;
} MODE_PARAMETER_HEADER;
typedef MODE_PARAMETER_HEADER   *PMODE_PARAMETER_HEADER;

/* Mode parameter header (version 10) */
typedef struct _MODE_PARAMETER_HEADER10 {
    UCHAR   ModeDataLength[2];
    UCHAR   MediumType;
    UCHAR   DeviceSpecificParameter;
    UCHAR   Reserved[2];
    UCHAR   BlockDescriptorLength[2];
} MODE_PARAMETER_HEADER10;
typedef MODE_PARAMETER_HEADER10 *PMODE_PARAMETER_HEADER10;

/* Mode parameter block */
typedef struct _MODE_PARAMETER_BLOCK {
    UCHAR   DensityCode;
    UCHAR   NumberOfBlocks[3];
    UCHAR   Reserved;
    UCHAR   BlockLength[3];
} MODE_PARAMETER_BLOCK;
typedef MODE_PARAMETER_BLOCK    *PMODE_PARAMETER_BLOCK;

/* Mode disconnect page */
typedef struct _MODE_DISCONNECT_PAGE {
    UCHAR   PageCode                : 6;
    UCHAR   Reserved                : 1;
    UCHAR   PageSavable             : 1;
    UCHAR   PageLength;
    UCHAR   BufferFullRatio;
    UCHAR   BufferEmptyRatio;
    UCHAR   BusInactivityLimit[2];
    UCHAR   BusDisconnectTime[2];
    UCHAR   BusConnectTime[2];
    UCHAR   MaximumBurstSize[2];
    UCHAR   DataTransferDisconnect  : 2;
    UCHAR   Reserved2[3];
} MODE_DISCONNECT_PAGE;
typedef MODE_DISCONNECT_PAGE    *PMODE_DISCONNECT_PAGE;

/* Mode caching page */
typedef struct _MODE_CACHING_PAGE {
    UCHAR   PageCode                : 6;
    UCHAR   Reserved                : 1;
    UCHAR   PageSavable             : 1;
    UCHAR   PageLength;
    UCHAR   ReadDisableCache        : 1;
    UCHAR   MultiplicationFactor    : 1;
    UCHAR   WriteCacheEnable        : 1;
    UCHAR   Reserved2               : 5;
    UCHAR   WriteRetensionPriority  : 4;
    UCHAR   ReadRetensionPriority   : 4;
    UCHAR   DisablePrefetchTransfer[2];
    UCHAR   MinimumPrefetch[2];
    UCHAR   MaximumPrefetch[2];
    UCHAR   MaximumPrefetchCeiling[2];
} MODE_CACHING_PAGE;
typedef MODE_CACHING_PAGE   *PMODE_CACHING_PAGE;

/* Mode CD-ROM write parameters page (version 2) */
typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE2 {
    UCHAR   PageCode                    : 6;
    UCHAR   Reserved                    : 1;
    UCHAR   PageSavable                 : 1;
    UCHAR   PageLength;
    UCHAR   WriteType                   : 4;
    UCHAR   TestWrite                   : 1;
    UCHAR   LinkSizeValid               : 1;
    UCHAR   BufferUnderrunFreeEnabled   : 1;
    UCHAR   Reserved2                   : 1;
    UCHAR   TrackMode                   : 4;
    UCHAR   Copy                        : 1;
    UCHAR   FixedPacket                 : 1;
    UCHAR   MultiSession                : 2;
    UCHAR   DataBlockType               : 4;
    UCHAR   Reserved3                   : 4;
    UCHAR   LinkSize;
    UCHAR   Reserved4;
    UCHAR   HostApplicationCode         : 6;
    UCHAR   Reserved5                   : 2;
    UCHAR   SessionFormat;
    UCHAR   Reserved6;
    UCHAR   PacketSize[4];
    UCHAR   AudioPauseLength[2];
    UCHAR   MediaCatalogNumber[16];
    UCHAR   ISRC[16];
    UCHAR   SubHeaderData[4];
} MODE_CDROM_WRITE_PARAMETERS_PAGE2;
typedef MODE_CDROM_WRITE_PARAMETERS_PAGE2   *PMODE_CDROM_WRITE_PARAMETERS_PAGE2;

/* Mode CD-ROM write parameters page */
typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE {
    UCHAR   PageLength;
    UCHAR   WriteType                   : 4;
    UCHAR   TestWrite                   : 1;
    UCHAR   LinkSizeValid               : 1;
    UCHAR   BufferUnderrunFreeEnabled   : 1;
    UCHAR   Reserved2                   : 1;
    UCHAR   TrackMode                   : 4;
    UCHAR   Copy                        : 1;
    UCHAR   FixedPacket                 : 1;
    UCHAR   MultiSession                : 2;
    UCHAR   DataBlockType               : 4;
    UCHAR   Reserved3                   : 4;
    UCHAR   LinkSize;
    UCHAR   Reserved4;
    UCHAR   HostApplicationCode         : 6;
    UCHAR   Reserved5                   : 2;
    UCHAR   SessionFormat;
    UCHAR   Reserved6;
    UCHAR   PacketSize[4];
    UCHAR   AudioPauseLength[2];
    UCHAR   Reserved7                   : 7;
    UCHAR   MediaCatalogNumberValid     : 1;
    UCHAR   MediaCatalogNumber[13];
    UCHAR   MediaCatalogNumberZero;
    UCHAR   MediaCatalogNumberAFrame;
    UCHAR   Reserved8                   : 7;
    UCHAR   ISRCValid                   : 1;
    UCHAR   ISRCCountry[2];
    UCHAR   ISRCOwner[3];
    UCHAR   ISRCRecordingYear[2];
    UCHAR   ISRCSerialNumber[5];
    UCHAR   ISRCZero;
    UCHAR   ISRCAFrame;
    UCHAR   ISRCReserved;
    UCHAR   SubHeaderData[4];
} MODE_CDROM_WRITE_PARAMETERS_PAGE;
typedef MODE_CDROM_WRITE_PARAMETERS_PAGE    *PMODE_CDROM_WRITE_PARAMETERS_PAGE;

/* Mode MRW page */
typedef struct _MODE_MRW_PAGE {
    UCHAR   PageCode    : 6;
    UCHAR   Reserved    : 1;
    UCHAR   PageSavable : 1;
    UCHAR   PageLength;
    UCHAR   Reserved1;
    UCHAR   LbaSpace    : 1;
    UCHAR   Reserved2   : 7;
    UCHAR   Reserved3[4];
} MODE_MRW_PAGE;
typedef MODE_MRW_PAGE   *PMODE_MRW_PAGE;

/* Mode flexible disk page */
typedef struct _MODE_FLEXIBLE_DISK_PAGE {
    UCHAR   PageCode                : 6;
    UCHAR   Reserved                : 1;
    UCHAR   PageSavable             : 1;
    UCHAR   PageLength;
    UCHAR   TransferRate[2];
    UCHAR   NumberOfHeads;
    UCHAR   SectorsPerTrack;
    UCHAR   BytesPerSector[2];
    UCHAR   NumberOfCylinders[2];
    UCHAR   StartWritePrecom[2];
    UCHAR   StartReducedCurrent[2];
    UCHAR   StepRate[2];
    UCHAR   StepPluseWidth;
    UCHAR   HeadSettleDelay[2];
    UCHAR   MotorOnDelay;
    UCHAR   MotorOffDelay;
    UCHAR   Reserved2               : 5;
    UCHAR   MotorOnAsserted         : 1;
    UCHAR   StartSectorNumber       : 1;
    UCHAR   TrueReadySignal         : 1;
    UCHAR   StepPlusePerCyclynder   : 4;
    UCHAR   Reserved3               : 4;
    UCHAR   WriteCompenstation;
    UCHAR   HeadLoadDelay;
    UCHAR   HeadUnloadDelay;
    UCHAR   Pin2Usage               : 4;
    UCHAR   Pin34Usage              : 4;
    UCHAR   Pin1Usage               : 4;
    UCHAR   Pin4Usage               : 4;
    UCHAR   MediumRotationRate[2];
    UCHAR   Reserved4[2];
} MODE_FLEXIBLE_DISK_PAGE;
typedef MODE_FLEXIBLE_DISK_PAGE *PMODE_FLEXIBLE_DISK_PAGE;

/* Mode format page */
typedef struct _MODE_FORMAT_PAGE {
    UCHAR   PageCode            : 6;
    UCHAR   Reserved            : 1;
    UCHAR   PageSavable         : 1;
    UCHAR   PageLength;
    UCHAR   TracksPerZone[2];
    UCHAR   AlternateSectorsPerZone[2];
    UCHAR   AlternateTracksPerZone[2];
    UCHAR   AlternateTracksPerLogicalUnit[2];
    UCHAR   SectorsPerTrack[2];
    UCHAR   BytesPerPhysicalSector[2];
    UCHAR   Interleave[2];
    UCHAR   TrackSkewFactor[2];
    UCHAR   CylinderSkewFactor[2];
    UCHAR   Reserved2           : 4;
    UCHAR   SurfaceFirst        : 1;
    UCHAR   RemovableMedia      : 1;
    UCHAR   HardSectorFormating : 1;
    UCHAR   SoftSectorFormating : 1;
    UCHAR   Reserved3[3];
} MODE_FORMAT_PAGE;
typedef MODE_FORMAT_PAGE    *PMODE_FORMAT_PAGE;

/* Mode rigid geometry page */
typedef struct _MODE_RIGID_GEOMETRY_PAGE {
    UCHAR   PageCode                : 6;
    UCHAR   Reserved                : 1;
    UCHAR   PageSavable             : 1;
    UCHAR   PageLength;
    UCHAR   NumberOfCylinders[3];
    UCHAR   NumberOfHeads;
    UCHAR   StartWritePrecom[3];
    UCHAR   StartReducedCurrent[3];
    UCHAR   DriveStepRate[2];
    UCHAR   LandZoneCylinder[3];
    UCHAR   RotationalPositionLock  : 2;
    UCHAR   Reserved2               : 6;
    UCHAR   RotationOffset;
    UCHAR   Reserved3;
    UCHAR   RoataionRate[2];
    UCHAR   Reserved4[2];
} MODE_RIGID_GEOMETRY_PAGE;
typedef MODE_RIGID_GEOMETRY_PAGE    *PMODE_RIGID_GEOMETRY_PAGE;

/* Mode read/write recovery page */
typedef struct _MODE_READ_WRITE_RECOVERY_PAGE {
    UCHAR   PageCode    : 6;
    UCHAR   Reserved1   : 1;
    UCHAR   PSBit       : 1;
    UCHAR   PageLength;
    UCHAR   DCRBit      : 1;
    UCHAR   DTEBit      : 1;
    UCHAR   PERBit      : 1;
    UCHAR   EERBit      : 1;
    UCHAR   RCBit       : 1;
    UCHAR   TBBit       : 1;
    UCHAR   ARRE        : 1;
    UCHAR   AWRE        : 1;
    UCHAR   ReadRetryCount;
    UCHAR   Reserved4[4];
    UCHAR   WriteRetryCount;
    UCHAR   Reserved5[3];
} MODE_READ_WRITE_RECOVERY_PAGE;
typedef MODE_READ_WRITE_RECOVERY_PAGE   *PMODE_READ_WRITE_RECOVERY_PAGE;

/* Mode read recovery page */
typedef struct _MODE_READ_RECOVERY_PAGE {
    UCHAR   PageCode    : 6;
    UCHAR   Reserved1   : 1;
    UCHAR   PSBit       : 1;
    UCHAR   PageLength;
    UCHAR   DCRBit      : 1;
    UCHAR   DTEBit      : 1;
    UCHAR   PERBit      : 1;
    UCHAR   Reserved2   : 1;
    UCHAR   RCBit       : 1;
    UCHAR   TBBit       : 1;
    UCHAR   ReadRetryCount;
    UCHAR   Reserved4[4];
} MODE_READ_RECOVERY_PAGE;
typedef MODE_READ_RECOVERY_PAGE *PMODE_READ_RECOVERY_PAGE;

/* Mode information exceptions */
typedef struct _MODE_INFO_EXCEPTIONS {
    UCHAR   PageCode        : 6;
    UCHAR   Reserved1       : 1;
    UCHAR   PSBit           : 1;
    UCHAR   PageLength;
    union {
        UCHAR   Flags;
        struct {
            UCHAR   LogErr      : 1;
            UCHAR   Reserved2   : 1;
            UCHAR   Test        : 1;
            UCHAR   Dexcpt      : 1;
            UCHAR   Reserved3   : 3;
            UCHAR   Perf        : 1;
        };
    };
    UCHAR   ReportMethod    : 4;
    UCHAR   Reserved4       : 4;
    UCHAR   IntervalTimer[4];
    UCHAR   ReportCount[4];
} MODE_INFO_EXCEPTIONS;
typedef MODE_INFO_EXCEPTIONS    *PMODE_INFO_EXCEPTIONS;

/* Power condition page */
typedef struct _POWER_CONDITION_PAGE {
    UCHAR   PageCode    : 6;
    UCHAR   Reserved    : 1;
    UCHAR   PSBit       : 1;
    UCHAR   PageLength;
    UCHAR   Reserved2;
    UCHAR   Standby     : 1;
    UCHAR   Idle        : 1;
    UCHAR   Reserved3   : 6;
    UCHAR   IdleTimer[4];
    UCHAR   StandbyTimer[4];
} POWER_CONDITION_PAGE;
typedef POWER_CONDITION_PAGE    *PPOWER_CONDITION_PAGE;

/* CDDA output port */
typedef struct _CDDA_OUTPUT_PORT {
    UCHAR   ChannelSelection    : 4;
    UCHAR   Reserved            : 4;
    UCHAR   Volume;
} CDDA_OUTPUT_PORT;
typedef CDDA_OUTPUT_PORT    *PCDDA_OUTPUT_PORT;

/* CD audio control page */
typedef struct _CDAUDIO_CONTROL_PAGE {
    UCHAR               PageCode            : 6;
    UCHAR               Reserved            : 1;
    UCHAR               PSBit               : 1;
    UCHAR               PageLength;
    UCHAR               Reserved2           : 1;
    UCHAR               StopOnTrackCrossing : 1;
    UCHAR               Immediate           : 1;
    UCHAR               Reserved3           : 5;
    UCHAR               Reserved4[3];
    UCHAR               Obsolete[2];
    CDDA_OUTPUT_PORT    CDDAOutputPorts[4];
} CDAUDIO_CONTROL_PAGE;
typedef CDAUDIO_CONTROL_PAGE    *PCDAUDIO_CONTROL_PAGE;

/* CDVD feature set page */
typedef struct _CDVD_FEATURE_SET_PAGE {
    UCHAR   PageCode    : 6;
    UCHAR   Reserved    : 1;
    UCHAR   PSBit       : 1;
    UCHAR   PageLength;
    UCHAR   CDAudio[2];
    UCHAR   EmbeddedChanger[2];
    UCHAR   PacketSMART[2];
    UCHAR   PersistentPrevent[2];
    UCHAR   EventStatusNotification[2];
    UCHAR   DigitalOutput[2];
    UCHAR   CDSequentialRecordable[2];
    UCHAR   DVDSequentialRecordable[2];
    UCHAR   RandomRecordable[2];
    UCHAR   KeyExchange[2];
    UCHAR   Reserved2[2];
} CDVD_FEATURE_SET_PAGE;
typedef CDVD_FEATURE_SET_PAGE   *PCDVD_FEATURE_SET_PAGE;

/* CDVD inactivity timeout page */
typedef struct _CDVD_INACTIVITY_TIMEOUT_PAGE {
    UCHAR   PageCode    : 6;
    UCHAR   Reserved    : 1;
    UCHAR   PSBit       : 1;
    UCHAR   PageLength;
    UCHAR   Reserved2[2];
    UCHAR   SWPP        : 1;
    UCHAR   DISP        : 1;
    UCHAR   Reserved3   : 6;
    UCHAR   Reserved4;
    UCHAR   GroupOneMinimumTimeout[2];
    UCHAR   GroupTwoMinimumTimeout[2];
} CDVD_INACTIVITY_TIMEOUT_PAGE;
typedef CDVD_INACTIVITY_TIMEOUT_PAGE    *PCDVD_INACTIVITY_TIMEOUT_PAGE;

/* CDVD capabilities page */
typedef struct _CDVD_CAPABILITIES_PAGE {
    UCHAR   PageCode                : 6;
    UCHAR   Reserved                : 1;
    UCHAR   PSBit                   : 1;
    UCHAR   PageLength;
    UCHAR   CDRRead                 : 1;
    UCHAR   CDERead                 : 1;
    UCHAR   Method2                 : 1;
    UCHAR   DVDROMRead              : 1;
    UCHAR   DVDRead                 : 1;
    UCHAR   DVDRAMRead              : 1;
    UCHAR   Reserved2               : 2;
    UCHAR   CDRWrite                : 1;
    UCHAR   CDEWrite                : 1;
    UCHAR   TestWrite               : 1;
    UCHAR   Reserved3               : 1;
    UCHAR   DVDRWrite               : 1;
    UCHAR   DVDRAMWrite             : 1;
    UCHAR   Reserved4               : 2;
    UCHAR   AudioPlay               : 1;
    UCHAR   Composite               : 1;
    UCHAR   DigitalPortOne          : 1;
    UCHAR   DigitalPortTwo          : 1;
    UCHAR   Mode2Form1              : 1;
    UCHAR   Mode2Form2              : 1;
    UCHAR   MultiSession            : 1;
    UCHAR   BufferUnderrunFree      : 1;
    UCHAR   CDDA                    : 1;
    UCHAR   CDAAAccurate            : 1;
    UCHAR   RWSupported             : 1;
    UCHAR   RWDeinterleaved         : 1;
    UCHAR   C2Pointers              : 1;
    UCHAR   ISRC                    : 1;
    UCHAR   UPC                     : 1;
    UCHAR   ReadBarCodeCapable      : 1;
    UCHAR   Lock                    : 1;
    UCHAR   LockState               : 1;
    UCHAR   PreventJumper           : 1;
    UCHAR   Eject                   : 1;
    UCHAR   Reserved6               : 1;
    UCHAR   LoadingMechanismType    : 3;
    UCHAR   SeparateVolume          : 1;
    UCHAR   SeparateChannelMute     : 1;
    UCHAR   SupportsDiskPresent     : 1;
    UCHAR   SWSlotSelection         : 1;
    UCHAR   SideChangeCapable       : 1;
    UCHAR   RWInLeadInReadable      : 1;
    UCHAR   Reserved7               : 2;
    union {
        UCHAR   ReadSpeedMaximum[2];
        UCHAR   ObsoleteReserved[2];
    };
    UCHAR   NumberVolumeLevels[2];
    UCHAR   BufferSize[2];
    union {
        UCHAR   ReadSpeedCurrent[2];
        UCHAR   ObsoleteReserved2[2];
    };
    UCHAR   ObsoleteReserved3;
    UCHAR   Reserved8               : 1;
    UCHAR   BCK                     : 1;
    UCHAR   RCK                     : 1;
    UCHAR   LSBF                    : 1;
    UCHAR   Length                  : 2;
    UCHAR   Reserved9               : 2;
    union {
        UCHAR   WriteSpeedMaximum[2];
        UCHAR   ObsoleteReserved4[2];
    };
    union {
        UCHAR   WriteSpeedCurrent[2];
        UCHAR   ObsoleteReserved11[2];
    };
    union {
        UCHAR   CopyManagementRevision[2];
        UCHAR   Reserved10[2];
    };
} CDVD_CAPABILITIES_PAGE;
typedef CDVD_CAPABILITIES_PAGE  *PCDVD_CAPABILITIES_PAGE;

/* LUN list */
typedef struct _LUN_LIST {
    UCHAR   LunListLength[4];
    UCHAR   Reserved[4];
    UCHAR   Lun[1][8];
} LUN_LIST;
typedef LUN_LIST    *PLUN_LIST;

/* Mode parameter read/write */
typedef struct _MODE_PARM_READ_WRITE {
    MODE_PARAMETER_HEADER   ParameterListHeader;
    MODE_PARAMETER_BLOCK    ParameterListBlock;
} MODE_PARM_READ_WRITE_DATA;
typedef MODE_PARM_READ_WRITE_DATA   *PMODE_PARM_READ_WRITE_DATA;

/* Port output */
typedef struct _PORT_OUTPUT {
    UCHAR   ChannelSelection;
    UCHAR   Volume;
} PORT_OUTPUT;
typedef PORT_OUTPUT *PPORT_OUTPUT;

/* Audio output */
typedef struct _AUDIO_OUTPUT {
    UCHAR       CodePage;
    UCHAR       ParameterLength;
    UCHAR       Immediate;
    UCHAR       Reserved[2];
    UCHAR       LbaFormat;
    UCHAR       LogicalBlocksPerSecond[2];
    PORT_OUTPUT PortOutput[4];
} AUDIO_OUTPUT;
typedef AUDIO_OUTPUT    *PAUDIO_OUTPUT;

/* Mechanical status information header */
typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER {
    UCHAR   CurrentSlot     : 5;
    UCHAR   ChangerState    : 2;
    UCHAR   Fault           : 1;
    UCHAR   Reserved        : 5;
    UCHAR   MechanismState  : 3;
    UCHAR   CurrentLogicalBlockAddress[3];
    UCHAR   NumberAvailableSlots;
    UCHAR   SlotTableLength[2];
} MECHANICAL_STATUS_INFORMATION_HEADER;
typedef MECHANICAL_STATUS_INFORMATION_HEADER    *PMECHANICAL_STATUS_INFORMATION_HEADER;

/* Slot table information */
typedef struct _SLOT_TABLE_INFORMATION {
    UCHAR   DiscChanged : 1;
    UCHAR   Reserved    : 6;
    UCHAR   DiscPresent : 1;
    UCHAR   Reserved2[3];
} SLOT_TABLE_INFORMATION;
typedef SLOT_TABLE_INFORMATION  *PSLOT_TABLE_INFORMATION;

/* Mechanical status */
typedef struct _MECHANICAL_STATUS {
    MECHANICAL_STATUS_INFORMATION_HEADER    MechanicalStatusHeader;
    SLOT_TABLE_INFORMATION                  SlotTableInfo[1];
} MECHANICAL_STATUS;
typedef MECHANICAL_STATUS   *PMECHANICAL_STATUS;

/* Tape position data */
typedef struct _TAPE_POSITION_DATA {
    UCHAR   Reserved1                   : 2;
    UCHAR   BlockPositionUnsupported    : 1;
    UCHAR   Reserved2                   : 3;
    UCHAR   EndOfPartition              : 1;
    UCHAR   BeginningOfPartition        : 1;
    UCHAR   PartitionNumber;
    USHORT  Reserved9;
    UCHAR   FirstBlock[4];
    UCHAR   LastBlock[4];
    UCHAR   Reserved4;
    UCHAR   NumberOfBlocks[3];
    UCHAR   NumberOfBytes[4];
} TAPE_POSITION_DATA;
typedef TAPE_POSITION_DATA  *PTAPE_POSITION_DATA;

/* Eight byte */
typedef union _EIGHT_BYTE {
    struct {
        UCHAR   Byte0;
        UCHAR   Byte1;
        UCHAR   Byte2;
        UCHAR   Byte3;
        UCHAR   Byte4;
        UCHAR   Byte5;
        UCHAR   Byte6;
        UCHAR   Byte7;
    };
    ULONGLONG   AsULongLong;
} EIGHT_BYTE;
typedef EIGHT_BYTE  *PEIGHT_BYTE;

/* Four byte */
typedef union _FOUR_BYTE {
    struct {
        UCHAR   Byte0;
        UCHAR   Byte1;
        UCHAR   Byte2;
        UCHAR   Byte3;
    };
    ULONG   AsULong;
} FOUR_BYTE;
typedef FOUR_BYTE   *PFOUR_BYTE;

/* Two byte */
typedef union _TWO_BYTE {
    struct {
        UCHAR   Byte0;
        UCHAR   Byte1;
    };
    USHORT  AsUShort;
} TWO_BYTE;
typedef TWO_BYTE    *PTWO_BYTE;

/* Revert to default packing. */
#pragma pack( pop )

/* Byte-reversing macros */
#define REVERSE_BYTES_QUAD( p1, p2 ) \
    { \
        PEIGHT_BYTE v1 = (PEIGHT_BYTE)(p1); \
        PEIGHT_BYTE v2 = (PEIGHT_BYTE)(p2); \
        v1->Byte7 = v2->Byte0; \
        v1->Byte6 = v2->Byte1; \
        v1->Byte5 = v2->Byte2; \
        v1->Byte4 = v2->Byte3; \
        v1->Byte3 = v2->Byte4; \
        v1->Byte2 = v2->Byte5; \
        v1->Byte1 = v2->Byte6; \
        v1->Byte0 = v2->Byte7; \
    }
#define REVERSE_BYTES( p1, p2 ) \
    { \
        PFOUR_BYTE  v1 = (PFOUR_BYTE)(p1); \
        PFOUR_BYTE  v2 = (PFOUR_BYTE)(p2); \
        v1->Byte3 = v2->Byte0; \
        v1->Byte2 = v2->Byte1; \
        v1->Byte1 = v2->Byte2; \
        v1->Byte0 = v2->Byte3; \
    }
#define REVERSE_BYTES_SHORT( p1, p2 ) \
    { \
        PTWO_BYTE   v1 = (PTWO_BYTE)(p1); \
        PTWO_BYTE   v2 = (PTWO_BYTE)(p2); \
        v1->Byte1 = v2->Byte0; \
        v1->Byte0 = v2->Byte1; \
    }
#define REVERSE_SHORT( x ) \
    { \
        UCHAR       v1; \
        PTWO_BYTE   v2 = (PTWO_BYTE)(x); \
        v1 = v2->Byte0; \
        v2->Byte0 = v2->Byte1; \
        v2->Byte1 = v1; \
    }
#define REVERSE_LONG( x ) \
    { \
        UCHAR       v1; \
        PFOUR_BYTE  v2 = (PFOUR_BYTE)(x); \
        v1 = v2->Byte3; \
        v2->Byte3 = v2->Byte0; \
        v2->Byte0 = v1; \
        v1 = v2->Byte2; \
        v2->Byte2 = v2->Byte1; \
        v2->Byte1 = v1; \
    }
#define WHICH_BIT( p1, p2 ) \
    { \
        UCHAR   v; \
        for( v = 0; v < 32; v++ ) { \
            if( ((p1) >> v) == 1) { \
                break; \
            } \
        } \
        ASSERT( v != 32 ); \
        (p2) = v; \
    }

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* _NTSCSI_ */
