reactos/sdk/include/ddk/storport.h

3223 lines
85 KiB
C

/*
* storport.h
*
* StorPort interface
*
* This file is part of the w32api package.
*
* Contributors:
* Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
*
* THIS SOFTWARE IS NOT COPYRIGHTED
*
* This source code is offered for use in the public domain. You may
* use, modify or distribute it freely.
*
* This code is distributed in the hope that it will be useful but
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
* DISCLAIMED. This includes but is not limited to warranties of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
*/
#ifdef _NTSCSI_
#error STORPORT.H must be included instead of SCSI.H
#endif
#ifdef _NTSRB_
#error STORPORT.H must be included instead of SRB.H
#endif
#ifndef _NTSTORPORT_
#define _NTSTORPORT_
#ifdef __cplusplus
extern "C" {
#endif
//
// Common definitions with SRB.H
//
/* NOTE: the current SCSI_MAXIMUM_TARGETS_PER_BUS is applicable
* only on scsiport miniports. For storport miniports, the max
* target supported is 255. */
#if (NTDDI_VERSION >= NTDDI_WIN8)
#define SCSI_MAXIMUM_BUSES_PER_ADAPTER 255
#endif
#define SCSI_MAXIMUM_TARGETS_PER_BUS 128
#define SCSI_MAXIMUM_LUNS_PER_TARGET 255
#define SCSI_MINIMUM_PHYSICAL_BREAKS 16
#define SCSI_MAXIMUM_PHYSICAL_BREAKS 255
/* These constants are for backward compatibility.
* They used to be the maximum supported. */
#define SCSI_MAXIMUM_BUSES 8
#define SCSI_MAXIMUM_TARGETS 8
#define SCSI_MAXIMUM_LOGICAL_UNITS 8
/* PORT_CONFIGURATION_INFORMATION.Dma64BitAddresses constants */
#define SCSI_DMA64_MINIPORT_SUPPORTED 0x01
#define SCSI_DMA64_SYSTEM_SUPPORTED 0x80
#if (NTDDI_VERSION > NTDDI_WS03SP1)
#define SCSI_DMA64_MINIPORT_FULL64BIT_SUPPORTED 0x02
#endif
#define SP_UNINITIALIZED_VALUE ((ULONG) ~0)
#define SP_UNTAGGED ((UCHAR) ~0)
// End of common definitions with SRB.H
#if defined(_STORPORT_)
#define STORPORT_API
#else
#define STORPORT_API DECLSPEC_IMPORT
#endif
#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
#define DEVICE_CONNECTED 0x00
#define CDB6GENERIC_LENGTH 6
#define CDB10GENERIC_LENGTH 10
#define CDB12GENERIC_LENGTH 12
#define INQUIRYDATABUFFERSIZE 36
#define SENSE_BUFFER_SIZE 18
#define MAX_SENSE_BUFFER_SIZE 255
#define FILE_DEVICE_SCSI 0x0000001b
#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 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_ERROR 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
#define MODE_SENSE_RETURN_ALL 0x3F
#define MODE_SENSE_CURRENT_VALUES 0x00
#define MODE_SENSE_CHANGEABLE_VALUES 0x40
#define MODE_SENSE_DEFAULT_VAULES 0x80
#define MODE_SENSE_SAVED_VALUES 0xc0
#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_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
#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 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
#define SETBITON 1
#define SETBITOFF 0
#define SP_RETURN_NOT_FOUND 0
#define SP_RETURN_FOUND 1
#define SP_RETURN_ERROR 2
#define SP_RETURN_BAD_CONFIG 3
/* SCSI_REQUEST_BLOCK.Function constants */
#define SRB_FUNCTION_EXECUTE_SCSI 0x00
#define SRB_FUNCTION_CLAIM_DEVICE 0x01
#define SRB_FUNCTION_IO_CONTROL 0x02
#define SRB_FUNCTION_RECEIVE_EVENT 0x03
#define SRB_FUNCTION_RELEASE_QUEUE 0x04
#define SRB_FUNCTION_ATTACH_DEVICE 0x05
#define SRB_FUNCTION_RELEASE_DEVICE 0x06
#define SRB_FUNCTION_SHUTDOWN 0x07
#define SRB_FUNCTION_FLUSH 0x08
#define SRB_FUNCTION_ABORT_COMMAND 0x10
#define SRB_FUNCTION_RELEASE_RECOVERY 0x11
#define SRB_FUNCTION_RESET_BUS 0x12
#define SRB_FUNCTION_RESET_DEVICE 0x13
#define SRB_FUNCTION_TERMINATE_IO 0x14
#define SRB_FUNCTION_FLUSH_QUEUE 0x15
#define SRB_FUNCTION_REMOVE_DEVICE 0x16
#define SRB_FUNCTION_WMI 0x17
#define SRB_FUNCTION_LOCK_QUEUE 0x18
#define SRB_FUNCTION_UNLOCK_QUEUE 0x19
#define SRB_FUNCTION_RESET_LOGICAL_UNIT 0x20
#define SRB_FUNCTION_SET_LINK_TIMEOUT 0x21
#define SRB_FUNCTION_LINK_TIMEOUT_OCCURRED 0x22
#define SRB_FUNCTION_LINK_TIMEOUT_COMPLETE 0x23
#define SRB_FUNCTION_POWER 0x24
#define SRB_FUNCTION_PNP 0x25
#define SRB_FUNCTION_DUMP_POINTERS 0x26
/* SCSI_REQUEST_BLOCK.SrbStatus constants */
#define SRB_STATUS_PENDING 0x00
#define SRB_STATUS_SUCCESS 0x01
#define SRB_STATUS_ABORTED 0x02
#define SRB_STATUS_ABORT_FAILED 0x03
#define SRB_STATUS_ERROR 0x04
#define SRB_STATUS_BUSY 0x05
#define SRB_STATUS_INVALID_REQUEST 0x06
#define SRB_STATUS_INVALID_PATH_ID 0x07
#define SRB_STATUS_NO_DEVICE 0x08
#define SRB_STATUS_TIMEOUT 0x09
#define SRB_STATUS_SELECTION_TIMEOUT 0x0A
#define SRB_STATUS_COMMAND_TIMEOUT 0x0B
#define SRB_STATUS_MESSAGE_REJECTED 0x0D
#define SRB_STATUS_BUS_RESET 0x0E
#define SRB_STATUS_PARITY_ERROR 0x0F
#define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
#define SRB_STATUS_NO_HBA 0x11
#define SRB_STATUS_DATA_OVERRUN 0x12
#define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
#define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
#define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
#define SRB_STATUS_REQUEST_FLUSHED 0x16
#define SRB_STATUS_INVALID_LUN 0x20
#define SRB_STATUS_INVALID_TARGET_ID 0x21
#define SRB_STATUS_BAD_FUNCTION 0x22
#define SRB_STATUS_ERROR_RECOVERY 0x23
#define SRB_STATUS_NOT_POWERED 0x24
#define SRB_STATUS_LINK_DOWN 0x25
#define SRB_STATUS_INTERNAL_ERROR 0x30
#define SRB_STATUS_QUEUE_FROZEN 0x40
#define SRB_STATUS_AUTOSENSE_VALID 0x80
#define SRB_STATUS(Status) (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
/* SCSI_REQUEST_BLOCK.SrbFlags constants */
#define SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002
#define SRB_FLAGS_DISABLE_DISCONNECT 0x00000004
#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER 0x00000008
#define SRB_FLAGS_BYPASS_FROZEN_QUEUE 0x00000010
#define SRB_FLAGS_DISABLE_AUTOSENSE 0x00000020
#define SRB_FLAGS_DATA_IN 0x00000040
#define SRB_FLAGS_DATA_OUT 0x00000080
#define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000
#define SRB_FLAGS_UNSPECIFIED_DIRECTION (SRB_FLAGS_DATA_IN | SRB_FLAGS_DATA_OUT)
#define SRB_FLAGS_NO_QUEUE_FREEZE 0x00000100
#define SRB_FLAGS_ADAPTER_CACHE_ENABLE 0x00000200
#define SRB_FLAGS_FREE_SENSE_BUFFER 0x00000400
#define SRB_FLAGS_IS_ACTIVE 0x00010000
#define SRB_FLAGS_ALLOCATED_FROM_ZONE 0x00020000
#define SRB_FLAGS_SGLIST_FROM_POOL 0x00040000
#define SRB_FLAGS_BYPASS_LOCKED_QUEUE 0x00080000
#define SRB_FLAGS_NO_KEEP_AWAKE 0x00100000
#define SRB_FLAGS_PORT_DRIVER_ALLOCSENSE 0x00200000
#define SRB_FLAGS_PORT_DRIVER_SENSEHASPORT 0x00400000
#define SRB_FLAGS_DONT_START_NEXT_PACKET 0x00800000
#define SRB_FLAGS_PORT_DRIVER_RESERVED 0x0F000000
#define SRB_FLAGS_CLASS_DRIVER_RESERVED 0xF0000000
#define SRB_SIMPLE_TAG_REQUEST 0x20
#define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
#define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
#define SRB_WMI_FLAGS_ADAPTER_REQUEST 0x01
#define SRB_POWER_FLAGS_ADAPTER_REQUEST 0x01
#define SRB_PNP_FLAGS_ADAPTER_REQUEST 0x01
#define STOR_MAP_NO_BUFFERS (0)
#define STOR_MAP_ALL_BUFFERS (1)
#define STOR_MAP_NON_READ_WRITE_BUFFERS (2)
#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
#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
typedef enum _STOR_SYNCHRONIZATION_MODEL
{
StorSynchronizeHalfDuplex,
StorSynchronizeFullDuplex
} STOR_SYNCHRONIZATION_MODEL;
typedef enum _STOR_DMA_WIDTH
{
DmaUnknown,
Dma32Bit,
Dma64BitScatterGather,
Dma64Bit
} STOR_DMA_WIDTH;
typedef enum _STOR_SPINLOCK
{
DpcLock = 1,
StartIoLock,
InterruptLock
} STOR_SPINLOCK;
typedef enum _SCSI_ADAPTER_CONTROL_TYPE
{
ScsiQuerySupportedControlTypes = 0,
ScsiStopAdapter,
ScsiRestartAdapter,
ScsiSetBootConfig,
ScsiSetRunningConfig,
ScsiAdapterControlMax,
MakeAdapterControlTypeSizeOfUlong = 0xffffffff
} SCSI_ADAPTER_CONTROL_TYPE, *PSCSI_ADAPTER_CONTROL_TYPE;
typedef enum _SCSI_ADAPTER_CONTROL_STATUS
{
ScsiAdapterControlSuccess = 0,
ScsiAdapterControlUnsuccessful
} SCSI_ADAPTER_CONTROL_STATUS, *PSCSI_ADAPTER_CONTROL_STATUS;
typedef enum _SCSI_NOTIFICATION_TYPE
{
RequestComplete,
NextRequest,
NextLuRequest,
ResetDetected,
_obsolete1,
_obsolete2,
RequestTimerCall,
BusChangeDetected,
WMIEvent,
WMIReregister,
LinkUp,
LinkDown,
QueryTickCount,
BufferOverrunDetected,
TraceNotification,
GetExtendedFunctionTable,
EnablePassiveInitialization = 0x1000,
InitializeDpc,
IssueDpc,
AcquireSpinLock,
ReleaseSpinLock
} SCSI_NOTIFICATION_TYPE, *PSCSI_NOTIFICATION_TYPE;
typedef enum _STOR_DEVICE_POWER_STATE
{
StorPowerDeviceUnspecified = 0,
StorPowerDeviceD0,
StorPowerDeviceD1,
StorPowerDeviceD2,
StorPowerDeviceD3,
StorPowerDeviceMaximum
} STOR_DEVICE_POWER_STATE, *PSTOR_DEVICE_POWER_STATE;
typedef enum _STOR_POWER_ACTION
{
StorPowerActionNone = 0,
StorPowerActionReserved,
StorPowerActionSleep,
StorPowerActionHibernate,
StorPowerActionShutdown,
StorPowerActionShutdownReset,
StorPowerActionShutdownOff,
StorPowerActionWarmEject
} STOR_POWER_ACTION, *PSTOR_POWER_ACTION;
typedef enum _STOR_PNP_ACTION
{
StorStartDevice = 0x0,
StorRemoveDevice = 0x2,
StorStopDevice = 0x4,
StorQueryCapabilities = 0x9,
StorQueryResourceRequirements = 0xB,
StorFilterResourceRequirements = 0xD,
StorSurpriseRemoval = 0x17
} STOR_PNP_ACTION, *PSTOR_PNP_ACTION;
typedef enum _VPD_CODE_SET
{
VpdCodeSetReserved = 0,
VpdCodeSetBinary = 1,
VpdCodeSetAscii = 2,
VpdCodeSetUTF8 = 3
} VPD_CODE_SET, *PVPD_CODE_SET;
typedef enum _VPD_ASSOCIATION
{
VpdAssocDevice = 0,
VpdAssocPort = 1,
VpdAssocTarget = 2,
VpdAssocReserved1 = 3,
VpdAssocReserved2 = 4
} VPD_ASSOCIATION, *PVPD_ASSOCIATION;
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, *PVPD_IDENTIFIER_TYPE;
typedef enum _STORPORT_FUNCTION_CODE
{
ExtFunctionAllocatePool,
ExtFunctionFreePool,
ExtFunctionAllocateMdl,
ExtFunctionFreeMdl,
ExtFunctionBuildMdlForNonPagedPool,
ExtFunctionGetSystemAddress,
ExtFunctionGetOriginalMdl,
ExtFunctionCompleteServiceIrp,
ExtFunctionGetDeviceObjects,
ExtFunctionBuildScatterGatherList,
ExtFunctionPutScatterGatherList,
ExtFunctionAcquireMSISpinLock,
ExtFunctionReleaseMSISpinLock,
ExtFunctionGetMessageInterruptInformation,
ExtFunctionInitializePerformanceOptimizations,
ExtFunctionGetStartIoPerformanceParameters,
ExtFunctionLogSystemEvent,
#if (NTDDI_VERSION >= NTDDI_WIN7)
ExtFunctionGetCurrentProcessorNumber,
ExtFunctionGetActiveGroupCount,
ExtFunctionGetGroupAffinity,
ExtFunctionGetActiveNodeCount,
ExtFunctionGetNodeAffinity,
ExtFunctionGetHighestNodeNumber,
ExtFunctionGetLogicalProcessorRelationship,
ExtFunctionAllocateContiguousMemorySpecifyCacheNode,
ExtFunctionFreeContiguousMemorySpecifyCache
#endif
} STORPORT_FUNCTION_CODE, *PSTORPORT_FUNCTION_CODE;
typedef enum _STOR_EVENT_ASSOCIATION_ENUM
{
StorEventAdapterAssociation = 0,
StorEventLunAssociation,
StorEventTargetAssociation,
StorEventInvalidAssociation
} STOR_EVENT_ASSOCIATION_ENUM;
typedef enum _GETSGSTATUS
{
SG_ALLOCATED = 0,
SG_BUFFER_TOO_SMALL
} GETSGSTATUS, *PGETSGSTATUS;
typedef struct _SCSI_REQUEST_BLOCK
{
USHORT Length;
UCHAR Function;
UCHAR SrbStatus;
UCHAR ScsiStatus;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
UCHAR QueueTag;
UCHAR QueueAction;
UCHAR CdbLength;
UCHAR SenseInfoBufferLength;
ULONG SrbFlags;
ULONG DataTransferLength;
ULONG TimeOutValue;
PVOID DataBuffer;
PVOID SenseInfoBuffer;
struct _SCSI_REQUEST_BLOCK *NextSrb;
PVOID OriginalRequest;
PVOID SrbExtension;
union
{
ULONG InternalStatus;
ULONG QueueSortKey;
ULONG LinkTimeoutValue;
};
#if defined(_WIN64)
ULONG Reserved;
#endif
UCHAR Cdb[16];
} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
typedef struct _SCSI_WMI_REQUEST_BLOCK
{
USHORT Length;
UCHAR Function;
UCHAR SrbStatus;
UCHAR WMISubFunction;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
UCHAR Reserved1;
UCHAR WMIFlags;
UCHAR Reserved2[2];
ULONG SrbFlags;
ULONG DataTransferLength;
ULONG TimeOutValue;
PVOID DataBuffer;
PVOID DataPath;
PVOID Reserved3;
PVOID OriginalRequest;
PVOID SrbExtension;
ULONG Reserved4;
#if (NTDDI_VERSION >= NTDDI_WS03SP1) && defined(_WIN64)
ULONG Reserved6;
#endif
UCHAR Reserved5[16];
} SCSI_WMI_REQUEST_BLOCK, *PSCSI_WMI_REQUEST_BLOCK;
typedef struct _SCSI_POWER_REQUEST_BLOCK
{
USHORT Length;
UCHAR Function;
UCHAR SrbStatus;
UCHAR SrbPowerFlags;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
STOR_DEVICE_POWER_STATE DevicePowerState;
ULONG SrbFlags;
ULONG DataTransferLength;
ULONG TimeOutValue;
PVOID DataBuffer;
PVOID SenseInfoBuffer;
struct _SCSI_REQUEST_BLOCK *NextSrb;
PVOID OriginalRequest;
PVOID SrbExtension;
STOR_POWER_ACTION PowerAction;
#if defined(_WIN64)
ULONG Reserved;
#endif
UCHAR Reserved5[16];
} SCSI_POWER_REQUEST_BLOCK, *PSCSI_POWER_REQUEST_BLOCK;
typedef struct _STOR_DEVICE_CAPABILITIES
{
USHORT Version;
ULONG DeviceD1:1;
ULONG DeviceD2:1;
ULONG LockSupported:1;
ULONG EjectSupported:1;
ULONG Removable:1;
ULONG DockDevice:1;
ULONG UniqueID:1;
ULONG SilentInstall:1;
ULONG SurpriseRemovalOK:1;
ULONG NoDisplayInUI:1;
} STOR_DEVICE_CAPABILITIES, *PSTOR_DEVICE_CAPABILITIES;
typedef struct _SCSI_PNP_REQUEST_BLOCK
{
USHORT Length;
UCHAR Function;
UCHAR SrbStatus;
UCHAR PnPSubFunction;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
STOR_PNP_ACTION PnPAction;
ULONG SrbFlags;
ULONG DataTransferLength;
ULONG TimeOutValue;
PVOID DataBuffer;
PVOID SenseInfoBuffer;
struct _SCSI_REQUEST_BLOCK *NextSrb;
PVOID OriginalRequest;
PVOID SrbExtension;
ULONG SrbPnPFlags;
#if defined(_WIN64)
ULONG Reserved;
#endif
UCHAR Reserved4[16];
} SCSI_PNP_REQUEST_BLOCK, *PSCSI_PNP_REQUEST_BLOCK;
#include <pshpack1.h>
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, *PCDB6GENERIC;
struct _CDB6READWRITE
{
UCHAR OperationCode;
UCHAR LogicalBlockMsb1:5;
UCHAR LogicalUnitNumber:3;
UCHAR LogicalBlockMsb0;
UCHAR LogicalBlockLsb;
UCHAR TransferBlocks;
UCHAR Control;
} CDB6READWRITE, *PCDB6READWRITE;
struct _CDB6INQUIRY
{
UCHAR OperationCode;
UCHAR Reserved1:5;
UCHAR LogicalUnitNumber:3;
UCHAR PageCode;
UCHAR IReserved;
UCHAR AllocationLength;
UCHAR Control;
} CDB6INQUIRY, *PCDB6INQUIRY;
struct _CDB6INQUIRY3
{
UCHAR OperationCode;
UCHAR EnableVitalProductData:1;
UCHAR CommandSupportData:1;
UCHAR Reserved1:6;
UCHAR PageCode;
UCHAR Reserved2;
UCHAR AllocationLength;
UCHAR Control;
} CDB6INQUIRY3, *PCDB6INQUIRY3;
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, *PCDB6VERIFY;
struct _CDB6FORMAT
{
UCHAR OperationCode;
UCHAR FormatControl:5;
UCHAR LogicalUnitNumber:3;
UCHAR FReserved1;
UCHAR InterleaveMsb;
UCHAR InterleaveLsb;
UCHAR FReserved2;
} CDB6FORMAT, *PCDB6FORMAT;
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, *PCDB10;
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, *PCDB12;
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, *PCDB16;
struct _PAUSE_RESUME
{
UCHAR OperationCode;
UCHAR Reserved1:5;
UCHAR LogicalUnitNumber:3;
UCHAR Reserved2[6];
UCHAR Action;
UCHAR Control;
} PAUSE_RESUME, *PPAUSE_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, *PREAD_TOC;
struct _READ_DISK_INFORMATION
{
UCHAR OperationCode;
UCHAR Reserved1:5;
UCHAR Lun:3;
UCHAR Reserved2[5];
UCHAR AllocationLength[2];
UCHAR Control;
} READ_DISK_INFORMATION, *PREAD_DISK_INFORMATION;
struct _READ_TRACK_INFORMATION
{
UCHAR OperationCode;
UCHAR Track:1;
UCHAR Reserved1:3;
UCHAR Reserved2:1;
UCHAR Lun:3;
UCHAR BlockAddress[4];
UCHAR Reserved3;
UCHAR AllocationLength[2];
UCHAR Control;
} READ_TRACK_INFORMATION, *PREAD_TRACK_INFORMATION;
struct _RESERVE_TRACK_RZONE
{
UCHAR OperationCode;
UCHAR Reserved1[4];
UCHAR ReservationSize[4];
UCHAR Control;
} RESERVE_TRACK_RZONE, *PRESERVE_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, *PSEND_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, *PREPAIR_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, *PCLOSE_TRACK;
struct _READ_BUFFER_CAPACITY
{
UCHAR OperationCode;
UCHAR BlockInfo:1;
UCHAR Reserved1:7;
UCHAR Reserved2[5];
UCHAR AllocationLength[2];
UCHAR Control;
} READ_BUFFER_CAPACITY, *PREAD_BUFFER_CAPACITY;
struct _SEND_CUE_SHEET
{
UCHAR OperationCode;
UCHAR Reserved[5];
UCHAR CueSheetSize[3];
UCHAR Control;
} SEND_CUE_SHEET, *PSEND_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, *PREAD_HEADER;
struct _PLAY_AUDIO
{
UCHAR OperationCode;
UCHAR Reserved1:5;
UCHAR LogicalUnitNumber:3;
UCHAR StartingBlockAddress[4];
UCHAR Reserved2;
UCHAR PlayLength[2];
UCHAR Control;
} PLAY_AUDIO, *PPLAY_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, *PPLAY_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, *PBLANK_MEDIA;
struct _PLAY_CD
{
UCHAR OperationCode;
UCHAR Reserved1:1;
UCHAR CMSF:1;
UCHAR ExpectedSectorType:3;
UCHAR Lun:3;
_ANONYMOUS_UNION 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;
} DUMMYUNIONNAME;
UCHAR Audio:1;
UCHAR Composite:1;
UCHAR Port1:1;
UCHAR Port2:1;
UCHAR Reserved2:3;
UCHAR Speed:1;
UCHAR Control;
} PLAY_CD, *PPLAY_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, *PSCAN_CD;
struct _STOP_PLAY_SCAN
{
UCHAR OperationCode;
UCHAR Reserved1:5;
UCHAR Lun:3;
UCHAR Reserved2[7];
UCHAR Control;
} STOP_PLAY_SCAN, *PSTOP_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, *PSUBCHANNEL;
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, *PREAD_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 Reserved3;
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, *PREAD_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, *PPLXTR_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, *PNEC_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, *PMODE_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, *PMODE_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, *PMODE_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, *PMODE_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, *PLOCATE;
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, *PLOGSENSE;
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, *PLOGSELECT;
struct _PRINT
{
UCHAR OperationCode;
UCHAR Reserved:5;
UCHAR LogicalUnitNumber:3;
UCHAR TransferLength[3];
UCHAR Control;
} PRINT, *PPRINT;
struct _SEEK
{
UCHAR OperationCode;
UCHAR Reserved1:5;
UCHAR LogicalUnitNumber:3;
UCHAR LogicalBlockAddress[4];
UCHAR Reserved2[3];
UCHAR Control;
} SEEK, *PSEEK;
struct _ERASE
{
UCHAR OperationCode;
UCHAR Long:1;
UCHAR Immediate:1;
UCHAR Reserved1:3;
UCHAR LogicalUnitNumber:3;
UCHAR Reserved2[3];
UCHAR Control;
} ERASE, *PERASE;
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, *PSTART_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, *PMEDIA_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, *PSEEK_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, *PREQUEST_BLOCK_ADDRESS;
struct _PARTITION
{
UCHAR OperationCode;
UCHAR Immediate:1;
UCHAR Sel:1;
UCHAR PartitionSelect:6;
UCHAR Reserved1[3];
UCHAR Control;
} PARTITION, *PPARTITION;
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, *PWRITE_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, *PSPACE_TAPE_MARKS;
struct _READ_POSITION
{
UCHAR Operation;
UCHAR BlockType:1;
UCHAR Reserved1:4;
UCHAR Lun:3;
UCHAR Reserved2[7];
UCHAR Control;
} READ_POSITION, *PREAD_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, *PCDB6READWRITETAPE;
struct _INIT_ELEMENT_STATUS
{
UCHAR OperationCode;
UCHAR Reserved1:5;
UCHAR LogicalUnitNubmer:3;
UCHAR Reserved2[3];
UCHAR Reserved3:7;
UCHAR NoBarCode:1;
} INIT_ELEMENT_STATUS, *PINIT_ELEMENT_STATUS;
struct _INITIALIZE_ELEMENT_RANGE
{
UCHAR OperationCode;
UCHAR Range:1;
UCHAR Reserved1:4;
UCHAR LogicalUnitNubmer:3;
UCHAR FirstElementAddress[2];
UCHAR Reserved2[2];
UCHAR NumberOfElements[2];
UCHAR Reserved3;
UCHAR Reserved4:7;
UCHAR NoBarCode:1;
} INITIALIZE_ELEMENT_RANGE, *PINITIALIZE_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, *PPOSITION_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, *PMOVE_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, *PEXCHANGE_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, *PREAD_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, *PSEND_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, *PREQUEST_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, *PLOAD_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, *PMECH_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, *PSYNCHRONIZE_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, *PGET_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, *PREAD_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, *PSEND_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, *PSEND_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, *PREPORT_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, *PSET_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, *PREAD_FORMATTED_CAPACITIES;
struct _REPORT_LUNS
{
UCHAR OperationCode;
UCHAR Reserved1[5];
UCHAR AllocationLength[4];
UCHAR Reserved2[1];
UCHAR Control;
} REPORT_LUNS, *PREPORT_LUNS;
struct _PERSISTENT_RESERVE_IN
{
UCHAR OperationCode;
UCHAR ServiceAction:5;
UCHAR Reserved1:3;
UCHAR Reserved2[5];
UCHAR AllocationLength[2];
UCHAR Control;
} PERSISTENT_RESERVE_IN, *PPERSISTENT_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, *PPERSISTENT_RESERVE_OUT;
struct _GET_CONFIGURATION
{
UCHAR OperationCode;
UCHAR RequestType:1;
UCHAR Reserved1:7;
UCHAR StartingFeature[2];
UCHAR Reserved2[3];
UCHAR AllocationLength[2];
UCHAR Control;
} GET_CONFIGURATION, *PGET_CONFIGURATION;
struct _SET_CD_SPEED
{
UCHAR OperationCode;
_ANONYMOUS_UNION union
{
UCHAR Reserved1;
_ANONYMOUS_STRUCT struct
{
UCHAR RotationControl:2;
UCHAR Reserved3:6;
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
UCHAR ReadSpeed[2];
UCHAR WriteSpeed[2];
UCHAR Reserved2[5];
UCHAR Control;
} SET_CD_SPEED, *PSET_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, *PCDB;
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, *PEIGHT_BYTE;
typedef union _FOUR_BYTE
{
struct
{
UCHAR Byte0;
UCHAR Byte1;
UCHAR Byte2;
UCHAR Byte3;
};
ULONG AsULong;
} FOUR_BYTE, *PFOUR_BYTE;
typedef union _TWO_BYTE
{
struct
{
UCHAR Byte0;
UCHAR Byte1;
};
USHORT AsUShort;
} TWO_BYTE, *PTWO_BYTE;
#include <poppack.h>
#if (NTDDI_VERSION < NTDDI_WINXP)
typedef struct _INQUIRYDATA
{
UCHAR DeviceType:5;
UCHAR DeviceTypeQualifier:3;
UCHAR DeviceTypeModifier:7;
UCHAR RemovableMedia:1;
UCHAR Versions;
UCHAR ResponseDataFormat:4;
UCHAR HiSupport:1;
UCHAR NormACA:1;
UCHAR ReservedBit:1;
UCHAR AERC:1;
UCHAR AdditionalLength;
UCHAR Reserved[2];
UCHAR SoftReset:1;
UCHAR CommandQueue:1;
UCHAR Reserved2:1;
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, *PINQUIRYDATA;
#else
#include <pshpack1.h>
typedef struct _INQUIRYDATA
{
UCHAR DeviceType:5;
UCHAR DeviceTypeQualifier:3;
UCHAR DeviceTypeModifier:7;
UCHAR RemovableMedia:1;
union
{
UCHAR Versions;
struct
{
UCHAR ANSIVersion:3;
UCHAR ECMAVersion:3;
UCHAR ISOVersion:2;
};
};
UCHAR ResponseDataFormat:4;
UCHAR HiSupport:1;
UCHAR NormACA:1;
UCHAR TerminateTask:1;
UCHAR AERC:1;
UCHAR AdditionalLength;
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;
UCHAR SoftReset:1;
UCHAR CommandQueue:1;
UCHAR TransferDisable:1;
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, *PINQUIRYDATA;
#include <poppack.h>
#endif
typedef struct _VPD_MEDIA_SERIAL_NUMBER_PAGE
{
UCHAR DeviceType:5;
UCHAR DeviceTypeQualifier:3;
UCHAR PageCode;
UCHAR Reserved;
UCHAR PageLength;
UCHAR SerialNumber[0];
} VPD_MEDIA_SERIAL_NUMBER_PAGE, *PVPD_MEDIA_SERIAL_NUMBER_PAGE;
typedef struct _VPD_SERIAL_NUMBER_PAGE
{
UCHAR DeviceType:5;
UCHAR DeviceTypeQualifier:3;
UCHAR PageCode;
UCHAR Reserved;
UCHAR PageLength;
UCHAR SerialNumber[0];
} VPD_SERIAL_NUMBER_PAGE, *PVPD_SERIAL_NUMBER_PAGE;
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[0];
} VPD_IDENTIFICATION_DESCRIPTOR, *PVPD_IDENTIFICATION_DESCRIPTOR;
typedef struct _VPD_IDENTIFICATION_PAGE
{
UCHAR DeviceType:5;
UCHAR DeviceTypeQualifier:3;
UCHAR PageCode;
UCHAR Reserved;
UCHAR PageLength;
UCHAR Descriptors[0];
} VPD_IDENTIFICATION_PAGE, *PVPD_IDENTIFICATION_PAGE;
typedef struct _VPD_SUPPORTED_PAGES_PAGE
{
UCHAR DeviceType:5;
UCHAR DeviceTypeQualifier:3;
UCHAR PageCode;
UCHAR Reserved;
UCHAR PageLength;
UCHAR SupportedPageList[0];
} VPD_SUPPORTED_PAGES_PAGE, *PVPD_SUPPORTED_PAGES_PAGE;
#include <pshpack1.h>
typedef struct _READ_CAPACITY_DATA
{
ULONG LogicalBlockAddress;
ULONG BytesPerBlock;
} READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
typedef struct _READ_CAPACITY_DATA_EX
{
LARGE_INTEGER LogicalBlockAddress;
ULONG BytesPerBlock;
} READ_CAPACITY_DATA_EX, *PREAD_CAPACITY_DATA_EX;
typedef struct _MODE_PARAMETER_HEADER
{
UCHAR ModeDataLength;
UCHAR MediumType;
UCHAR DeviceSpecificParameter;
UCHAR BlockDescriptorLength;
}MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
typedef struct _MODE_PARAMETER_HEADER10
{
UCHAR ModeDataLength[2];
UCHAR MediumType;
UCHAR DeviceSpecificParameter;
UCHAR Reserved[2];
UCHAR BlockDescriptorLength[2];
}MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10;
typedef struct _MODE_PARAMETER_BLOCK
{
UCHAR DensityCode;
UCHAR NumberOfBlocks[3];
UCHAR Reserved;
UCHAR BlockLength[3];
}MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK;
typedef struct _LUN_LIST
{
UCHAR LunListLength[4];
UCHAR Reserved[4];
#if !defined(__midl)
UCHAR Lun[0][8];
#endif
} LUN_LIST, *PLUN_LIST;
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, *PSENSE_DATA;
#include <poppack.h>
typedef PHYSICAL_ADDRESS STOR_PHYSICAL_ADDRESS;
typedef struct _ACCESS_RANGE
{
STOR_PHYSICAL_ADDRESS RangeStart;
ULONG RangeLength;
BOOLEAN RangeInMemory;
} ACCESS_RANGE, *PACCESS_RANGE;
typedef struct _MEMORY_REGION
{
PUCHAR VirtualBase;
PHYSICAL_ADDRESS PhysicalBase;
ULONG Length;
} MEMORY_REGION, *PMEMORY_REGION;
typedef struct _PORT_CONFIGURATION_INFORMATION
{
ULONG Length;
ULONG SystemIoBusNumber;
INTERFACE_TYPE AdapterInterfaceType;
ULONG BusInterruptLevel;
ULONG BusInterruptVector;
KINTERRUPT_MODE InterruptMode;
ULONG MaximumTransferLength;
ULONG NumberOfPhysicalBreaks;
ULONG DmaChannel;
ULONG DmaPort;
DMA_WIDTH DmaWidth;
DMA_SPEED DmaSpeed;
ULONG AlignmentMask;
ULONG NumberOfAccessRanges;
ACCESS_RANGE (*AccessRanges)[];
PVOID Reserved;
UCHAR NumberOfBuses;
CCHAR InitiatorBusId[8];
BOOLEAN ScatterGather;
BOOLEAN Master;
BOOLEAN CachesData;
BOOLEAN AdapterScansDown;
BOOLEAN AtdiskPrimaryClaimed;
BOOLEAN AtdiskSecondaryClaimed;
BOOLEAN Dma32BitAddresses;
BOOLEAN DemandMode;
UCHAR MapBuffers;
BOOLEAN NeedPhysicalAddresses;
BOOLEAN TaggedQueuing;
BOOLEAN AutoRequestSense;
BOOLEAN MultipleRequestPerLu;
BOOLEAN ReceiveEvent;
BOOLEAN RealModeInitialized;
BOOLEAN BufferAccessScsiPortControlled;
UCHAR MaximumNumberOfTargets;
UCHAR ReservedUchars[2];
ULONG SlotNumber;
ULONG BusInterruptLevel2;
ULONG BusInterruptVector2;
KINTERRUPT_MODE InterruptMode2;
ULONG DmaChannel2;
ULONG DmaPort2;
DMA_WIDTH DmaWidth2;
DMA_SPEED DmaSpeed2;
ULONG DeviceExtensionSize;
ULONG SpecificLuExtensionSize;
ULONG SrbExtensionSize;
UCHAR Dma64BitAddresses;
BOOLEAN ResetTargetSupported;
UCHAR MaximumNumberOfLogicalUnits;
BOOLEAN WmiDataProvider;
STOR_SYNCHRONIZATION_MODEL SynchronizationModel;
} PORT_CONFIGURATION_INFORMATION, *PPORT_CONFIGURATION_INFORMATION;
typedef struct _STOR_SCATTER_GATHER_ELEMENT
{
STOR_PHYSICAL_ADDRESS PhysicalAddress;
ULONG Length;
ULONG_PTR Reserved;
} STOR_SCATTER_GATHER_ELEMENT, *PSTOR_SCATTER_GATHER_ELEMENT;
typedef struct _STOR_SCATTER_GATHER_LIST
{
ULONG NumberOfElements;
ULONG_PTR Reserved;
STOR_SCATTER_GATHER_ELEMENT List[];
} STOR_SCATTER_GATHER_LIST, *PSTOR_SCATTER_GATHER_LIST;
typedef struct _DPC_BUFFER
{
CSHORT Type;
UCHAR Number;
UCHAR Importance;
struct
{
PVOID F;
PVOID B;
};
PVOID DeferredRoutine;
PVOID DeferredContext;
PVOID SystemArgument1;
PVOID SystemArgument2;
PVOID DpcData;
} DPC_BUFFER;
typedef struct _STOR_DPC
{
DPC_BUFFER Dpc;
ULONG_PTR Lock;
} STOR_DPC, *PSTOR_DPC;
typedef struct _STOR_LOCK_HANDLE
{
STOR_SPINLOCK Lock;
struct
{
struct
{
PVOID Next;
PVOID Lock;
} LockQueue;
KIRQL OldIrql;
} Context;
} STOR_LOCK_HANDLE, *PSTOR_LOCK_HANDLE;
typedef struct _STOR_LOG_EVENT_DETAILS
{
ULONG InterfaceRevision;
ULONG Size;
ULONG Flags;
STOR_EVENT_ASSOCIATION_ENUM EventAssociation;
ULONG PathId;
ULONG TargetId;
ULONG LunId;
BOOLEAN StorportSpecificErrorCode;
ULONG ErrorCode;
ULONG UniqueId;
ULONG DumpDataSize;
PVOID DumpData;
ULONG StringCount;
PWSTR *StringList;
} STOR_LOG_EVENT_DETAILS, *PSTOR_LOG_EVENT_DETAILS;
typedef struct _PERF_CONFIGURATION_DATA
{
ULONG Version;
ULONG Size;
ULONG Flags;
ULONG ConcurrentChannels;
ULONG FirstRedirectionMessageNumber;
ULONG LastRedirectionMessageNumber;
ULONG DeviceNode;
ULONG Reserved;
PGROUP_AFFINITY MessageTargets;
} PERF_CONFIGURATION_DATA, *PPERF_CONFIGURATION_DATA;
typedef struct _STARTIO_PERFORMANCE_PARAMETERS
{
ULONG Version;
ULONG Size;
ULONG MessageNumber;
ULONG ChannelNumber;
} STARTIO_PERFORMANCE_PARAMETERS, *PSTARTIO_PERFORMANCE_PARAMETERS;
typedef struct _MESSAGE_INTERRUPT_INFORMATION
{
ULONG MessageId;
ULONG MessageData;
STOR_PHYSICAL_ADDRESS MessageAddress;
ULONG InterruptVector;
ULONG InterruptLevel;
KINTERRUPT_MODE InterruptMode;
} MESSAGE_INTERRUPT_INFORMATION, *PMESSAGE_INTERRUPT_INFORMATION;
typedef
BOOLEAN
(NTAPI *PHW_INITIALIZE)(
_In_ PVOID DeviceExtension);
typedef
BOOLEAN
(NTAPI *PHW_BUILDIO)(
_In_ PVOID DeviceExtension,
_In_ PSCSI_REQUEST_BLOCK Srb);
typedef
BOOLEAN
(NTAPI *PHW_STARTIO)(
_In_ PVOID DeviceExtension,
_In_ PSCSI_REQUEST_BLOCK Srb);
typedef
BOOLEAN
(NTAPI *PHW_INTERRUPT)(
_In_ PVOID DeviceExtension);
typedef
VOID
(NTAPI *PHW_TIMER)(
_In_ PVOID DeviceExtension);
typedef
VOID
(NTAPI *PHW_DMA_STARTED)(
_In_ PVOID DeviceExtension);
typedef
ULONG
(NTAPI *PHW_FIND_ADAPTER)(
IN PVOID DeviceExtension,
IN PVOID HwContext,
IN PVOID BusInformation,
IN PCHAR ArgumentString,
IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
OUT PBOOLEAN Again);
typedef
BOOLEAN
(NTAPI *PHW_RESET_BUS)(
IN PVOID DeviceExtension,
IN ULONG PathId);
typedef
BOOLEAN
(NTAPI *PHW_ADAPTER_STATE)(
IN PVOID DeviceExtension,
IN PVOID Context,
IN BOOLEAN SaveState);
typedef
SCSI_ADAPTER_CONTROL_STATUS
(NTAPI *PHW_ADAPTER_CONTROL)(
IN PVOID DeviceExtension,
IN SCSI_ADAPTER_CONTROL_TYPE ControlType,
IN PVOID Parameters);
typedef
BOOLEAN
(*PHW_PASSIVE_INITIALIZE_ROUTINE)(
_In_ PVOID DeviceExtension);
typedef
VOID
(*PHW_DPC_ROUTINE)(
_In_ PSTOR_DPC Dpc,
_In_ PVOID HwDeviceExtension,
_In_ PVOID SystemArgument1,
_In_ PVOID SystemArgument2);
typedef
BOOLEAN
(NTAPI STOR_SYNCHRONIZED_ACCESS)(
_In_ PVOID HwDeviceExtension,
_In_ PVOID Context);
typedef STOR_SYNCHRONIZED_ACCESS *PSTOR_SYNCHRONIZED_ACCESS;
typedef
VOID
(NTAPI *PpostScaterGatherExecute)(
_In_ PVOID *DeviceObject,
_In_ PVOID *Irp,
_In_ PSTOR_SCATTER_GATHER_LIST ScatterGather,
_In_ PVOID Context);
typedef
BOOLEAN
(NTAPI *PStorPortGetMessageInterruptInformation)(
_In_ PVOID HwDeviceExtension,
_In_ ULONG MessageId,
_Out_ PMESSAGE_INTERRUPT_INFORMATION InterruptInfo);
typedef
VOID
(NTAPI *PStorPortPutScatterGatherList)(
_In_ PVOID HwDeviceExtension,
_In_ PSTOR_SCATTER_GATHER_LIST ScatterGatherList,
_In_ BOOLEAN WriteToDevice);
typedef
GETSGSTATUS
(NTAPI *PStorPortBuildScatterGatherList)(
_In_ PVOID HwDeviceExtension,
_In_ PVOID Mdl,
_In_ PVOID CurrentVa,
_In_ ULONG Length,
_In_ PpostScaterGatherExecute ExecutionRoutine,
_In_ PVOID Context,
_In_ BOOLEAN WriteToDevice,
_Inout_ PVOID ScatterGatherBuffer,
_In_ ULONG ScatterGatherBufferLength);
typedef
VOID
(NTAPI *PStorPortFreePool)(
_In_ PVOID PMemory,
_In_ PVOID HwDeviceExtension,
_In_opt_ PVOID PMdl);
typedef
PVOID
(NTAPI *PStorPortAllocatePool)(
_In_ ULONG NumberOfBytes,
_In_ ULONG Tag,
_In_ PVOID HwDeviceExtension,
_Out_ PVOID *PMdl);
typedef
PVOID
(NTAPI *PStorPortGetSystemAddress)(
_In_ PSCSI_REQUEST_BLOCK Srb);
typedef struct _STORPORT_EXTENDED_FUNCTIONS
{
ULONG Version;
PStorPortGetMessageInterruptInformation GetMessageInterruptInformation;
PStorPortPutScatterGatherList PutScatterGatherList;
PStorPortBuildScatterGatherList BuildScatterGatherList;
PStorPortFreePool FreePool;
PStorPortAllocatePool AllocatePool;
PStorPortGetSystemAddress GetSystemAddress;
} STORPORT_EXTENDED_FUNCTIONS, *PSTORPORT_EXTENDED_FUNCTIONS;
typedef struct _HW_INITIALIZATION_DATA
{
ULONG HwInitializationDataSize;
INTERFACE_TYPE AdapterInterfaceType;
PHW_INITIALIZE HwInitialize;
PHW_STARTIO HwStartIo;
PHW_INTERRUPT HwInterrupt;
PHW_FIND_ADAPTER HwFindAdapter;
PHW_RESET_BUS HwResetBus;
PHW_DMA_STARTED HwDmaStarted;
PHW_ADAPTER_STATE HwAdapterState;
ULONG DeviceExtensionSize;
ULONG SpecificLuExtensionSize;
ULONG SrbExtensionSize;
ULONG NumberOfAccessRanges;
PVOID Reserved;
UCHAR MapBuffers;
BOOLEAN NeedPhysicalAddresses;
BOOLEAN TaggedQueuing;
BOOLEAN AutoRequestSense;
BOOLEAN MultipleRequestPerLu;
BOOLEAN ReceiveEvent;
USHORT VendorIdLength;
PVOID VendorId;
USHORT ReservedUshort;
USHORT DeviceIdLength;
PVOID DeviceId;
PHW_ADAPTER_CONTROL HwAdapterControl;
PHW_BUILDIO HwBuildIo;
} HW_INITIALIZATION_DATA, *PHW_INITIALIZATION_DATA;
#define REVERSE_BYTES_QUAD(Destination, Source) { \
PEIGHT_BYTE d = (PEIGHT_BYTE)(Destination); \
PEIGHT_BYTE s = (PEIGHT_BYTE)(Source); \
d->Byte7 = s->Byte0; \
d->Byte6 = s->Byte1; \
d->Byte5 = s->Byte2; \
d->Byte4 = s->Byte3; \
d->Byte3 = s->Byte4; \
d->Byte2 = s->Byte5; \
d->Byte1 = s->Byte6; \
d->Byte0 = s->Byte7; \
}
#define REVERSE_BYTES(Destination, Source) { \
PFOUR_BYTE d = (PFOUR_BYTE)(Destination); \
PFOUR_BYTE s = (PFOUR_BYTE)(Source); \
d->Byte3 = s->Byte0; \
d->Byte2 = s->Byte1; \
d->Byte1 = s->Byte2; \
d->Byte0 = s->Byte3; \
}
#define REVERSE_BYTES_SHORT(Destination, Source) { \
PTWO_BYTE d = (PTWO_BYTE)(Destination); \
PTWO_BYTE s = (PTWO_BYTE)(Source); \
d->Byte1 = s->Byte0; \
d->Byte0 = s->Byte1; \
}
#define StorPortCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
STORPORT_API
PUCHAR
NTAPI
StorPortAllocateRegistryBuffer(
_In_ PVOID HwDeviceExtension,
_In_ PULONG Length);
STORPORT_API
BOOLEAN
NTAPI
StorPortBusy(
_In_ PVOID HwDeviceExtension,
_In_ ULONG RequestsToComplete);
STORPORT_API
VOID
NTAPI
StorPortCompleteRequest(
_In_ PVOID HwDeviceExtension,
_In_ UCHAR PathId,
_In_ UCHAR TargetId,
_In_ UCHAR Lun,
_In_ UCHAR SrbStatus);
STORPORT_API
ULONG64
NTAPI
StorPortConvertPhysicalAddressToUlong64(
_In_ STOR_PHYSICAL_ADDRESS Address);
STORPORT_API
STOR_PHYSICAL_ADDRESS
NTAPI
StorPortConvertUlong64ToPhysicalAddress(
_In_ ULONG64 UlongAddress);
STORPORT_API
VOID
__cdecl
StorPortDebugPrint(
_In_ ULONG DebugPrintLevel,
_In_ PCCHAR DebugMessage,
...);
STORPORT_API
BOOLEAN
NTAPI
StorPortDeviceBusy(
_In_ PVOID HwDeviceExtension,
_In_ UCHAR PathId,
_In_ UCHAR TargetId,
_In_ UCHAR Lun,
_In_ ULONG RequestsToComplete);
STORPORT_API
BOOLEAN
NTAPI
StorPortDeviceReady(
_In_ PVOID HwDeviceExtension,
_In_ UCHAR PathId,
_In_ UCHAR TargetId,
_In_ UCHAR Lun);
STORPORT_API
VOID
NTAPI
StorPortFreeDeviceBase(
_In_ PVOID HwDeviceExtension,
_In_ PVOID MappedAddress);
STORPORT_API
VOID
NTAPI
StorPortFreeRegistryBuffer(
_In_ PVOID HwDeviceExtension,
_In_ PUCHAR Buffer);
STORPORT_API
ULONG
NTAPI
StorPortGetBusData(
_In_ PVOID DeviceExtension,
_In_ ULONG BusDataType,
_In_ ULONG SystemIoBusNumber,
_In_ ULONG SlotNumber,
_Out_ _When_(Length != 0, _Out_writes_bytes_(Length)) PVOID Buffer,
_In_ ULONG Length);
STORPORT_API
PVOID
NTAPI
StorPortGetDeviceBase(
_In_ PVOID HwDeviceExtension,
_In_ INTERFACE_TYPE BusType,
_In_ ULONG SystemIoBusNumber,
_In_ STOR_PHYSICAL_ADDRESS IoAddress,
_In_ ULONG NumberOfBytes,
_In_ BOOLEAN InIoSpace);
STORPORT_API
PVOID
NTAPI
StorPortGetLogicalUnit(
_In_ PVOID HwDeviceExtension,
_In_ UCHAR PathId,
_In_ UCHAR TargetId,
_In_ UCHAR Lun);
STORPORT_API
STOR_PHYSICAL_ADDRESS
NTAPI
StorPortGetPhysicalAddress(
_In_ PVOID HwDeviceExtension,
_In_opt_ PSCSI_REQUEST_BLOCK Srb,
_In_ PVOID VirtualAddress,
_Out_ ULONG *Length);
STORPORT_API
PSTOR_SCATTER_GATHER_LIST
NTAPI
StorPortGetScatterGatherList(
_In_ PVOID DeviceExtension,
_In_ PSCSI_REQUEST_BLOCK Srb);
STORPORT_API
PSCSI_REQUEST_BLOCK
NTAPI
StorPortGetSrb(
_In_ PVOID DeviceExtension,
_In_ UCHAR PathId,
_In_ UCHAR TargetId,
_In_ UCHAR Lun,
_In_ LONG QueueTag);
STORPORT_API
PVOID
NTAPI
StorPortGetUncachedExtension(
_In_ PVOID HwDeviceExtension,
_In_ PPORT_CONFIGURATION_INFORMATION ConfigInfo,
_In_ ULONG NumberOfBytes);
STORPORT_API
PVOID
NTAPI
StorPortGetVirtualAddress(
_In_ PVOID HwDeviceExtension,
_In_ STOR_PHYSICAL_ADDRESS PhysicalAddress);
STORPORT_API
ULONG
NTAPI
StorPortInitialize(
_In_ PVOID Argument1,
_In_ PVOID Argument2,
_In_ PHW_INITIALIZATION_DATA HwInitializationData,
_In_opt_ PVOID Unused);
STORPORT_API
VOID
NTAPI
StorPortLogError(
_In_ PVOID HwDeviceExtension,
_In_opt_ PSCSI_REQUEST_BLOCK Srb,
_In_ UCHAR PathId,
_In_ UCHAR TargetId,
_In_ UCHAR Lun,
_In_ ULONG ErrorCode,
_In_ ULONG UniqueId);
STORPORT_API
VOID
NTAPI
StorPortMoveMemory(
_Out_writes_bytes_(Length) PVOID WriteBuffer,
_In_reads_bytes_(Length) PVOID ReadBuffer,
_In_ ULONG Length);
STORPORT_API
VOID
__cdecl
StorPortNotification(
_In_ SCSI_NOTIFICATION_TYPE NotificationType,
_In_ PVOID HwDeviceExtension,
...);
STORPORT_API
VOID
NTAPI
StorPortQuerySystemTime(
_Out_ PLARGE_INTEGER CurrentTime);
STORPORT_API
BOOLEAN
NTAPI
StorPortPause(
_In_ PVOID HwDeviceExtension,
_In_ ULONG TimeOut);
STORPORT_API
BOOLEAN
NTAPI
StorPortPauseDevice(
_In_ PVOID HwDeviceExtension,
_In_ UCHAR PathId,
_In_ UCHAR TargetId,
_In_ UCHAR Lun,
_In_ ULONG TimeOut);
STORPORT_API
VOID
NTAPI
StorPortReadPortBufferUchar(
_In_ PVOID HwDeviceExtension,
_In_ PUCHAR Port,
_In_ PUCHAR Buffer,
_In_ ULONG Count);
STORPORT_API
VOID
NTAPI
StorPortReadPortBufferUlong(
_In_ PVOID HwDeviceExtension,
_In_ PULONG Port,
_In_ PULONG Buffer,
_In_ ULONG Count);
STORPORT_API
VOID
NTAPI
StorPortReadPortBufferUshort(
_In_ PVOID HwDeviceExtension,
_In_ PUSHORT Port,
_In_ PUSHORT Buffer,
_In_ ULONG Count);
STORPORT_API
UCHAR
NTAPI
StorPortReadPortUchar(
_In_ PVOID HwDeviceExtension,
_In_ PUCHAR Port);
STORPORT_API
ULONG
NTAPI
StorPortReadPortUlong(
_In_ PVOID HwDeviceExtension,
_In_ PULONG Port);
STORPORT_API
USHORT
NTAPI
StorPortReadPortUshort(
_In_ PVOID HwDeviceExtension,
_In_ PUSHORT Port);
STORPORT_API
VOID
NTAPI
StorPortReadRegisterBufferUchar(
_In_ PVOID HwDeviceExtension,
_In_ PUCHAR Register,
_In_ PUCHAR Buffer,
_In_ ULONG Count);
STORPORT_API
VOID
NTAPI
StorPortReadRegisterBufferUlong(
_In_ PVOID HwDeviceExtension,
_In_ PULONG Register,
_In_ PULONG Buffer,
_In_ ULONG Count);
STORPORT_API
VOID
NTAPI
StorPortReadRegisterBufferUshort(
_In_ PVOID HwDeviceExtension,
_In_ PUSHORT Register,
_In_ PUSHORT Buffer,
_In_ ULONG Count);
STORPORT_API
UCHAR
NTAPI
StorPortReadRegisterUchar(
_In_ PVOID HwDeviceExtension,
_In_ PUCHAR Register);
STORPORT_API
ULONG
NTAPI
StorPortReadRegisterUlong(
_In_ PVOID HwDeviceExtension,
_In_ PULONG Register);
STORPORT_API
USHORT
NTAPI
StorPortReadRegisterUshort(
_In_ PVOID HwDeviceExtension,
_In_ PUSHORT Register);
STORPORT_API
BOOLEAN
NTAPI
StorPortReady(
_In_ PVOID HwDeviceExtension);
STORPORT_API
BOOLEAN
NTAPI
StorPortRegistryRead(
_In_ PVOID HwDeviceExtension,
_In_ PUCHAR ValueName,
_In_ ULONG Global,
_In_ ULONG Type,
_In_ PUCHAR Buffer,
_In_ PULONG BufferLength);
STORPORT_API
BOOLEAN
NTAPI
StorPortRegistryWrite(
_In_ PVOID HwDeviceExtension,
_In_ PUCHAR ValueName,
_In_ ULONG Global,
_In_ ULONG Type,
_In_ PUCHAR Buffer,
_In_ ULONG BufferLength);
STORPORT_API
BOOLEAN
NTAPI
StorPortResume(
_In_ PVOID HwDeviceExtension);
STORPORT_API
BOOLEAN
NTAPI
StorPortResumeDevice(
_In_ PVOID HwDeviceExtension,
_In_ UCHAR PathId,
_In_ UCHAR TargetId,
_In_ UCHAR Lun);
STORPORT_API
ULONG
NTAPI
StorPortSetBusDataByOffset(
_In_ PVOID DeviceExtension,
_In_ ULONG BusDataType,
_In_ ULONG SystemIoBusNumber,
_In_ ULONG SlotNumber,
_In_reads_bytes_(Length) PVOID Buffer,
_In_ ULONG Offset,
_In_ ULONG Length);
STORPORT_API
BOOLEAN
NTAPI
StorPortSetDeviceQueueDepth(
_In_ PVOID HwDeviceExtension,
_In_ UCHAR PathId,
_In_ UCHAR TargetId,
_In_ UCHAR Lun,
_In_ ULONG Depth);
STORPORT_API
VOID
NTAPI
StorPortStallExecution(
_In_ ULONG Delay);
STORPORT_API
VOID
NTAPI
StorPortSynchronizeAccess(
_In_ PVOID HwDeviceExtension,
_In_ PSTOR_SYNCHRONIZED_ACCESS SynchronizedAccessRoutine,
_In_opt_ PVOID Context);
STORPORT_API
BOOLEAN
NTAPI
StorPortValidateRange(
_In_ PVOID HwDeviceExtension,
_In_ INTERFACE_TYPE BusType,
_In_ ULONG SystemIoBusNumber,
_In_ STOR_PHYSICAL_ADDRESS IoAddress,
_In_ ULONG NumberOfBytes,
_In_ BOOLEAN InIoSpace);
STORPORT_API
VOID
NTAPI
StorPortWritePortBufferUchar(
_In_ PVOID HwDeviceExtension,
_In_ PUCHAR Port,
_In_ PUCHAR Buffer,
_In_ ULONG Count);
STORPORT_API
VOID
NTAPI
StorPortWritePortBufferUlong(
_In_ PVOID HwDeviceExtension,
_In_ PULONG Port,
_In_ PULONG Buffer,
_In_ ULONG Count);
STORPORT_API
VOID
NTAPI
StorPortWritePortBufferUshort(
_In_ PVOID HwDeviceExtension,
_In_ PUSHORT Port,
_In_ PUSHORT Buffer,
_In_ ULONG Count);
STORPORT_API
VOID
NTAPI
StorPortWritePortUchar(
_In_ PVOID HwDeviceExtension,
_In_ PUCHAR Port,
_In_ UCHAR Value);
STORPORT_API
VOID
NTAPI
StorPortWritePortUlong(
_In_ PVOID HwDeviceExtension,
_In_ PULONG Port,
_In_ ULONG Value);
STORPORT_API
VOID
NTAPI
StorPortWritePortUshort(
_In_ PVOID HwDeviceExtension,
_In_ PUSHORT Port,
_In_ USHORT Value);
STORPORT_API
VOID
NTAPI
StorPortWriteRegisterBufferUchar(
_In_ PVOID HwDeviceExtension,
_In_ PUCHAR Register,
_In_ PUCHAR Buffer,
_In_ ULONG Count);
STORPORT_API
VOID
NTAPI
StorPortWriteRegisterBufferUlong(
_In_ PVOID HwDeviceExtension,
_In_ PULONG Register,
_In_ PULONG Buffer,
_In_ ULONG Count);
STORPORT_API
VOID
NTAPI
StorPortWriteRegisterBufferUshort(
_In_ PVOID HwDeviceExtension,
_In_ PUSHORT Register,
_In_ PUSHORT Buffer,
_In_ ULONG Count);
STORPORT_API
VOID
NTAPI
StorPortWriteRegisterUchar(
_In_ PVOID HwDeviceExtension,
_In_ PUCHAR Register,
_In_ UCHAR Value);
STORPORT_API
VOID
NTAPI
StorPortWriteRegisterUlong(
_In_ PVOID HwDeviceExtension,
_In_ PULONG Register,
_In_ ULONG Value);
STORPORT_API
VOID
NTAPI
StorPortWriteRegisterUshort(
_In_ PVOID HwDeviceExtension,
_In_ PUSHORT Register,
_In_ USHORT Value);
FORCEINLINE
BOOLEAN
StorPortEnablePassiveInitialization(
_In_ PVOID DeviceExtension,
_In_ PHW_PASSIVE_INITIALIZE_ROUTINE HwPassiveInitializeRoutine)
{
LONG Succ;
Succ = FALSE;
StorPortNotification(EnablePassiveInitialization,
DeviceExtension,
HwPassiveInitializeRoutine,
&Succ);
return (BOOLEAN)Succ;
}
FORCEINLINE
VOID
StorPortInitializeDpc(
_In_ PVOID DeviceExtension,
_Out_ PSTOR_DPC Dpc,
_In_ PHW_DPC_ROUTINE HwDpcRoutine)
{
StorPortNotification(InitializeDpc,
DeviceExtension,
Dpc,
HwDpcRoutine);
}
FORCEINLINE
BOOLEAN
StorPortIssueDpc(
_In_ PVOID DeviceExtension,
_In_ PSTOR_DPC Dpc,
_In_ PVOID SystemArgument1,
_In_ PVOID SystemArgument2)
{
LONG Succ;
Succ = FALSE;
StorPortNotification(IssueDpc,
DeviceExtension,
Dpc,
SystemArgument1,
SystemArgument2,
&Succ);
return (BOOLEAN)Succ;
}
FORCEINLINE
VOID
StorPortAcquireSpinLock(
_In_ PVOID DeviceExtension,
_In_ STOR_SPINLOCK SpinLock,
_In_ PVOID LockContext,
_Inout_ PSTOR_LOCK_HANDLE LockHandle)
{
StorPortNotification(AcquireSpinLock,
DeviceExtension,
SpinLock,
LockContext,
LockHandle);
}
FORCEINLINE
VOID
StorPortReleaseSpinLock(
_In_ PVOID DeviceExtension,
_Inout_ PSTOR_LOCK_HANDLE LockHandle)
{
StorPortNotification(ReleaseSpinLock,
DeviceExtension,
LockHandle);
}
STORPORT_API
ULONG
StorPortExtendedFunction(
_In_ STORPORT_FUNCTION_CODE FunctionCode,
_In_ PVOID HwDeviceExtension,
...);
FORCEINLINE
ULONG
StorPortAllocatePool(
_In_ PVOID HwDeviceExtension,
_In_ ULONG NumberOfBytes,
_In_ ULONG Tag,
_Out_ PVOID *BufferPointer
)
{
return StorPortExtendedFunction(ExtFunctionAllocatePool,
HwDeviceExtension,
NumberOfBytes,
Tag,
BufferPointer);
}
FORCEINLINE
ULONG
StorPortFreePool(
_In_ PVOID HwDeviceExtension,
_In_ PVOID BufferPointer)
{
return StorPortExtendedFunction(ExtFunctionFreePool,
HwDeviceExtension,
BufferPointer);
}
FORCEINLINE
ULONG
StorPortAllocateMdl(
_In_ PVOID HwDeviceExtension,
_In_ PVOID BufferPointer,
_In_ ULONG NumberOfBytes,
_Out_ PVOID *Mdl)
{
return StorPortExtendedFunction(ExtFunctionAllocateMdl,
HwDeviceExtension,
BufferPointer,
NumberOfBytes,
Mdl);
}
FORCEINLINE
ULONG
StorPortFreeMdl(
_In_ PVOID HwDeviceExtension,
_In_ PVOID Mdl)
{
return StorPortExtendedFunction(ExtFunctionFreeMdl,
HwDeviceExtension,
Mdl);
}
FORCEINLINE
ULONG
StorPortBuildMdlForNonPagedPool(
_In_ PVOID HwDeviceExtension,
_Inout_ PVOID Mdl)
{
return StorPortExtendedFunction(ExtFunctionBuildMdlForNonPagedPool,
HwDeviceExtension,
Mdl);
}
FORCEINLINE
ULONG
StorPortGetSystemAddress(
_In_ PVOID HwDeviceExtension,
_In_ PSCSI_REQUEST_BLOCK Srb,
_Out_ PVOID *SystemAddress)
{
return StorPortExtendedFunction(ExtFunctionGetSystemAddress,
HwDeviceExtension,
Srb,
SystemAddress);
}
FORCEINLINE
ULONG
StorPortGetOriginalMdl(
_In_ PVOID HwDeviceExtension,
_In_ PSCSI_REQUEST_BLOCK Srb,
_Out_ PVOID *Mdl)
{
return StorPortExtendedFunction(ExtFunctionGetOriginalMdl,
HwDeviceExtension,
Srb,
Mdl);
}
FORCEINLINE
ULONG
StorPortCompleteServiceIrp(
_In_ PVOID HwDeviceExtension,
_In_ PVOID Irp)
{
return StorPortExtendedFunction(ExtFunctionCompleteServiceIrp,
HwDeviceExtension,
Irp);
}
FORCEINLINE
ULONG
StorPortGetDeviceObjects(
_In_ PVOID HwDeviceExtension,
_Out_ PVOID *AdapterDeviceObject,
_Out_ PVOID *PhysicalDeviceObject,
_Out_ PVOID *LowerDeviceObject)
{
return StorPortExtendedFunction(ExtFunctionGetDeviceObjects,
HwDeviceExtension,
AdapterDeviceObject,
PhysicalDeviceObject,
LowerDeviceObject);
}
FORCEINLINE
ULONG
StorPortBuildScatterGatherList(
_In_ PVOID HwDeviceExtension,
_In_ PVOID Mdl,
_In_ PVOID CurrentVa,
_In_ ULONG Length,
_In_ PpostScaterGatherExecute ExecutionRoutine,
_In_ PVOID Context,
_In_ BOOLEAN WriteToDevice,
_Inout_ PVOID ScatterGatherBuffer,
_In_ ULONG ScatterGatherBufferLength)
{
return StorPortExtendedFunction(ExtFunctionBuildScatterGatherList,
HwDeviceExtension,
Mdl,
CurrentVa,
Length,
ExecutionRoutine,
Context,
WriteToDevice,
ScatterGatherBuffer,
ScatterGatherBufferLength);
}
FORCEINLINE
ULONG
StorPortPutScatterGatherList(
_In_ PVOID HwDeviceExtension,
_In_ PSTOR_SCATTER_GATHER_LIST ScatterGatherList,
_In_ BOOLEAN WriteToDevice)
{
return StorPortExtendedFunction(ExtFunctionPutScatterGatherList,
HwDeviceExtension,
ScatterGatherList,
WriteToDevice);
}
FORCEINLINE
ULONG
StorPortAcquireMSISpinLock(
_In_ PVOID HwDeviceExtension,
_In_ ULONG MessageId,
_In_ PULONG OldIrql)
{
return StorPortExtendedFunction(ExtFunctionAcquireMSISpinLock,
HwDeviceExtension,
MessageId,
OldIrql);
}
FORCEINLINE
ULONG
StorPortReleaseMSISpinLock(
_In_ PVOID HwDeviceExtension,
_In_ ULONG MessageId,
_In_ ULONG OldIrql)
{
return StorPortExtendedFunction(ExtFunctionReleaseMSISpinLock,
HwDeviceExtension,
MessageId,
OldIrql);
}
FORCEINLINE
ULONG
StorPortGetMSIInfo(
_In_ PVOID HwDeviceExtension,
_In_ ULONG MessageId,
_Out_ PMESSAGE_INTERRUPT_INFORMATION InterruptInfo)
{
return StorPortExtendedFunction(ExtFunctionGetMessageInterruptInformation,
HwDeviceExtension,
MessageId,
InterruptInfo);
}
FORCEINLINE
ULONG
StorPortInitializePerfOpts(
_In_ PVOID HwDeviceExtension,
_In_ BOOLEAN Query,
_Inout_ PPERF_CONFIGURATION_DATA PerfConfigData)
{
return StorPortExtendedFunction(ExtFunctionInitializePerformanceOptimizations,
HwDeviceExtension,
Query,
PerfConfigData);
}
FORCEINLINE
ULONG
StorPortGetStartIoPerfParams(
_In_ PVOID HwDeviceExtension,
_In_ PSCSI_REQUEST_BLOCK Srb,
_Inout_ PSTARTIO_PERFORMANCE_PARAMETERS StartIoPerfParams)
{
return StorPortExtendedFunction(ExtFunctionGetStartIoPerformanceParameters,
HwDeviceExtension,
Srb,
StartIoPerfParams);
}
FORCEINLINE
ULONG
StorPortLogSystemEvent(
_In_ PVOID HwDeviceExtension,
_Inout_ PSTOR_LOG_EVENT_DETAILS LogDetails,
_Inout_ PULONG MaximumSize)
{
return StorPortExtendedFunction(ExtFunctionLogSystemEvent,
HwDeviceExtension,
LogDetails,
MaximumSize);
}
#if DBG
#define DebugPrint(x) StorPortDebugPrint x
#else
#define DebugPrint(x)
#endif
#ifdef __cplusplus
}
#endif
#endif /* _NTSTORPORT_ */