1 /* $Id: class2.h 49129 2010-10-12 20:17:55Z pschweitzer $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: services/storage/include/class2.h
6 * PURPOSE: SCSI class driver definitions
7 * PROGRAMMER: Eric Kohl
15 #define MAXIMUM_RETRIES 15
16 #define RETRY_WAIT 2000000 /* 200 ms in units of 100 ns */
19 // Indicates that the device has write caching enabled.
22 #define DEV_WRITE_CACHE 0x00000001
26 // Build SCSI 1 or SCSI 2 CDBs
29 #define DEV_USE_SCSI1 0x00000002
32 // Indicates whether is is safe to send StartUnit commands
33 // to this device. It will only be off for some removeable devices.
36 #define DEV_SAFE_START_UNIT 0x00000004
39 // Indicates whether it is unsafe to send SCSIOP_MECHANISM_STATUS commands to
40 // this device. Some devices don't like these 12 byte commands
43 #define DEV_NO_12BYTE_CDB 0x00000008
46 struct _CLASS_INIT_DATA
;
49 (NTAPI
*PCLASS_ERROR
)(IN PDEVICE_OBJECT DeviceObject
,
50 IN PSCSI_REQUEST_BLOCK Srb
,
51 IN OUT NTSTATUS
*Status
,
52 IN OUT BOOLEAN
*Retry
);
55 (NTAPI
*PCLASS_DEVICE_CALLBACK
)(IN PINQUIRYDATA
);
58 (NTAPI
*PCLASS_READ_WRITE
)(IN PDEVICE_OBJECT DeviceObject
,
62 (NTAPI
*PCLASS_FIND_DEVICES
)(IN PDRIVER_OBJECT DriverObject
,
63 IN PUNICODE_STRING RegistryPath
,
64 IN
struct _CLASS_INIT_DATA
*InitializationData
,
65 IN PDEVICE_OBJECT PortDeviceObject
,
69 (NTAPI
*PCLASS_DEVICE_CONTROL
)(IN PDEVICE_OBJECT DeviceObject
,
73 (NTAPI
*PCLASS_SHUTDOWN_FLUSH
)(IN PDEVICE_OBJECT DeviceObject
,
77 (NTAPI
*PCLASS_CREATE_CLOSE
)(IN PDEVICE_OBJECT DeviceObject
,
81 typedef struct _CLASS_INIT_DATA
83 ULONG InitializationDataSize
;
84 ULONG DeviceExtensionSize
;
85 DEVICE_TYPE DeviceType
;
86 ULONG DeviceCharacteristics
;
87 PCLASS_ERROR ClassError
;
88 PCLASS_READ_WRITE ClassReadWriteVerification
;
89 PCLASS_DEVICE_CALLBACK ClassFindDeviceCallBack
;
90 PCLASS_FIND_DEVICES ClassFindDevices
;
91 PCLASS_DEVICE_CONTROL ClassDeviceControl
;
92 PCLASS_SHUTDOWN_FLUSH ClassShutdownFlush
;
93 PCLASS_CREATE_CLOSE ClassCreateClose
;
94 PDRIVER_STARTIO ClassStartIo
;
95 } CLASS_INIT_DATA
, *PCLASS_INIT_DATA
;
98 typedef struct _DEVICE_EXTENSION
100 PDEVICE_OBJECT DeviceObject
;
101 PDEVICE_OBJECT PortDeviceObject
;
102 LARGE_INTEGER PartitionLength
;
103 LARGE_INTEGER StartingOffset
;
107 PCLASS_ERROR ClassError
;
108 PCLASS_READ_WRITE ClassReadWriteVerification
;
109 PCLASS_FIND_DEVICES ClassFindDevices
;
110 PCLASS_DEVICE_CONTROL ClassDeviceControl
;
111 PCLASS_SHUTDOWN_FLUSH ClassShutdownFlush
;
112 PCLASS_CREATE_CLOSE ClassCreateClose
;
113 PDRIVER_STARTIO ClassStartIo
;
114 PIO_SCSI_CAPABILITIES PortCapabilities
;
115 PDISK_GEOMETRY_EX DiskGeometry
;
116 PDEVICE_OBJECT PhysicalDevice
;
117 PSENSE_DATA SenseData
;
122 KSPIN_LOCK SplitRequestSpinLock
;
123 NPAGED_LOOKASIDE_LIST SrbLookasideListHead
;
132 PKEVENT MediaChangeEvent
;
133 HANDLE MediaChangeEventHandle
;
134 BOOLEAN MediaChangeNoMedia
;
135 ULONG MediaChangeCount
;
136 } DEVICE_EXTENSION
, *PDEVICE_EXTENSION
;
139 typedef struct _COMPLETION_CONTEXT
141 PDEVICE_OBJECT DeviceObject
;
142 SCSI_REQUEST_BLOCK Srb
;
143 } COMPLETION_CONTEXT
, *PCOMPLETION_CONTEXT
;
146 /* FUNCTIONS ****************************************************************/
148 IO_COMPLETION_ROUTINE ScsiClassAsynchronousCompletion
;
150 ScsiClassAsynchronousCompletion(IN PDEVICE_OBJECT DeviceObject
,
155 ScsiClassBuildRequest(IN PDEVICE_OBJECT DeviceObject
,
159 ScsiClassClaimDevice(IN PDEVICE_OBJECT PortDeviceObject
,
160 IN PSCSI_INQUIRY_DATA LunInfo
,
162 OUT PDEVICE_OBJECT
*NewPortDeviceObject OPTIONAL
);
165 ScsiClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject
,
166 IN PCCHAR ObjectNameBuffer
,
167 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL
,
168 IN OUT PDEVICE_OBJECT
*DeviceObject
,
169 IN PCLASS_INIT_DATA InitializationData
);
172 ScsiClassDeviceControl(IN PDEVICE_OBJECT DeviceObject
,
176 ScsiClassFindModePage(IN PCHAR ModeSenseBuffer
,
179 IN BOOLEAN Use6Byte
);
182 ScsiClassFindUnclaimedDevices(IN PCLASS_INIT_DATA InitializationData
,
183 OUT PSCSI_ADAPTER_BUS_INFO AdapterInformation
);
186 ScsiClassGetCapabilities(IN PDEVICE_OBJECT PortDeviceObject
,
187 OUT PIO_SCSI_CAPABILITIES
*PortCapabilities
);
190 ScsiClassGetInquiryData(IN PDEVICE_OBJECT PortDeviceObject
,
191 OUT PSCSI_ADAPTER_BUS_INFO
*ConfigInfo
);
194 ScsiClassInitialize(IN PVOID Argument1
,
196 IN PCLASS_INIT_DATA InitializationData
);
199 ScsiClassInitializeSrbLookasideList(IN PDEVICE_EXTENSION DeviceExtension
,
200 IN ULONG NumberElements
);
203 ScsiClassInternalIoControl(IN PDEVICE_OBJECT DeviceObject
,
207 ScsiClassInterpretSenseInfo(IN PDEVICE_OBJECT DeviceObject
,
208 IN PSCSI_REQUEST_BLOCK Srb
,
209 IN UCHAR MajorFunctionCode
,
210 IN ULONG IoDeviceCode
,
212 OUT NTSTATUS
*Status
);
215 ScsiClassIoComplete(IN PDEVICE_OBJECT DeviceObject
,
220 ScsiClassIoCompleteAssociated(IN PDEVICE_OBJECT DeviceObject
,
225 ScsiClassModeSense(IN PDEVICE_OBJECT DeviceObject
,
226 IN PCHAR ModeSenseBuffer
,
231 ScsiClassQueryTimeOutRegistryValue(IN PUNICODE_STRING RegistryPath
);
234 ScsiClassReadDriveCapacity(IN PDEVICE_OBJECT DeviceObject
);
237 ScsiClassReleaseQueue(IN PDEVICE_OBJECT DeviceObject
);
240 ScsiClassSendSrbAsynchronous(PDEVICE_OBJECT DeviceObject
,
241 PSCSI_REQUEST_BLOCK Srb
,
245 BOOLEAN WriteToDevice
);
248 ScsiClassSendSrbSynchronous(PDEVICE_OBJECT DeviceObject
,
249 PSCSI_REQUEST_BLOCK Srb
,
252 BOOLEAN WriteToDevice
);
255 ScsiClassSplitRequest(IN PDEVICE_OBJECT DeviceObject
,
257 IN ULONG MaximumBytes
);
261 ScsiClassCheckVerifyComplete(
262 IN PDEVICE_OBJECT DeviceObject
,