1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
4 // This file was released under the GPLv2 on June 2015.
5 ////////////////////////////////////////////////////////////////////
14 This is the include file that defines all constants and types for
15 accessing the SCSI port adapters.
22 #ifndef __SCSI_PORT_H__
23 #define __SCSI_PORT_H__
33 // Device Name - this string is the name of the device. It is the name
34 // that should be passed to NtOpenFile when accessing the device.
36 // Note: For devices that support multiple units, it should be suffixed
37 // with the Ascii representation of the unit number.
39 #define IOCTL_SCSI_BASE FILE_DEVICE_CONTROLLER
41 #define DD_SCSI_DEVICE_NAME "\\Device\\ScsiPort"
44 // NtDeviceIoControlFile IoControlCode values for this device.
46 // Warning: Remember that the low two bits of the code specify how the
47 // buffers are passed to the driver!
49 #define IOCTL_SCSI_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
50 #define IOCTL_SCSI_MINIPORT CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
51 #define IOCTL_SCSI_GET_INQUIRY_DATA CTL_CODE(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS)
52 #define IOCTL_SCSI_GET_CAPABILITIES CTL_CODE(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS)
53 #define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
54 #define IOCTL_SCSI_GET_ADDRESS CTL_CODE(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS)
55 #define IOCTL_SCSI_RESCAN_BUS CTL_CODE(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS)
56 #define IOCTL_SCSI_GET_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE, 0x0408, METHOD_BUFFERED, FILE_ANY_ACCESS)
58 // Define the SCSI pass through structure.
60 typedef struct _SCSI_PASS_THROUGH
{
67 UCHAR SenseInfoLength
;
69 ULONG DataTransferLength
;
71 ULONG DataBufferOffset
;
72 ULONG SenseInfoOffset
;
74 }SCSI_PASS_THROUGH
, *PSCSI_PASS_THROUGH
;
76 // Define the SCSI pass through direct structure.
78 typedef struct _SCSI_PASS_THROUGH_DIRECT
{
85 UCHAR SenseInfoLength
;
87 ULONG DataTransferLength
;
90 ULONG SenseInfoOffset
;
92 }SCSI_PASS_THROUGH_DIRECT
, *PSCSI_PASS_THROUGH_DIRECT
;
94 // Define SCSI information.
95 // Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL.
97 typedef struct _SCSI_BUS_DATA
{
98 UCHAR NumberOfLogicalUnits
;
100 ULONG InquiryDataOffset
;
101 }SCSI_BUS_DATA
, *PSCSI_BUS_DATA
;
103 // Define SCSI adapter bus information structure..
104 // Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL.
106 typedef struct _SCSI_ADAPTER_BUS_INFO
{
108 SCSI_BUS_DATA BusData
[1];
109 } SCSI_ADAPTER_BUS_INFO
, *PSCSI_ADAPTER_BUS_INFO
;
111 // Define SCSI adapter bus information.
112 // Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL.
114 typedef struct _SCSI_INQUIRY_DATA
{
118 BOOLEAN DeviceClaimed
;
119 ULONG InquiryDataLength
;
120 ULONG NextInquiryDataOffset
;
121 UCHAR InquiryData
[1];
122 }SCSI_INQUIRY_DATA
, *PSCSI_INQUIRY_DATA
;
124 // Define header for I/O control SRB.
126 typedef struct _SRB_IO_CONTROL
{
133 } SRB_IO_CONTROL
, *PSRB_IO_CONTROL
;
135 // SCSI port driver capabilities structure.
137 typedef struct _IO_SCSI_CAPABILITIES
{
138 ULONG Length
; // Length of this structure
139 ULONG MaximumTransferLength
; // Maximum transfer size in single SRB (obsolete)
140 ULONG MaximumPhysicalPages
; // Maximum number of physical pages per data buffer
141 ULONG SupportedAsynchronousEvents
; // Async calls from port to class
142 ULONG AlignmentMask
; // Alignment mask for data transfers.
143 BOOLEAN TaggedQueuing
; // Supports tagged queuing
144 BOOLEAN AdapterScansDown
; // Host adapter scans down for bios devices.
145 BOOLEAN AdapterUsesPio
; // The host adapter uses programmed I/O.
146 } IO_SCSI_CAPABILITIES
, *PIO_SCSI_CAPABILITIES
;
148 typedef struct _SCSI_ADDRESS
{
154 }SCSI_ADDRESS
, *PSCSI_ADDRESS
;
156 // Define structure for returning crash dump pointers.
158 struct _ADAPTER_OBJECT
;
160 typedef struct _DUMP_POINTERS
{
161 struct _ADAPTER_OBJECT
*AdapterObject
;
162 PVOID MappedRegisterBase
;
163 PVOID PortConfiguration
;
164 PVOID CommonBufferVa
;
165 LARGE_INTEGER CommonBufferPa
;
166 ULONG CommonBufferSize
;
167 } DUMP_POINTERS
, *PDUMP_POINTERS
;
172 // Define values for pass-through DataIn field.
174 #define SCSI_IOCTL_DATA_OUT 0
175 #define SCSI_IOCTL_DATA_IN 1
176 #define SCSI_IOCTL_DATA_UNSPECIFIED 2
178 #define CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK 0x00000020
183 extern NTSTATUS
ScsiClassGetInquiryData(IN PDEVICE_OBJECT PortDeviceObject
,
184 IN PSCSI_ADAPTER_BUS_INFO
*ConfigInfo
);
185 extern NTSTATUS
ScsiClassReadDeviceInquiryData(IN PDEVICE_OBJECT DeviceObject
,
186 IN BOOLEAN DirectAccess
);
187 extern NTSTATUS
ScsiClassReadDriveCapacity(IN PDEVICE_OBJECT DeviceObject
);
191 // Class dll routines called by class drivers
193 extern NTSTATUS
ScsiClassGetCapabilities(IN PDEVICE_OBJECT PortDeviceObject
,
194 OUT PIO_SCSI_CAPABILITIES
*PortCapabilities
);
195 extern NTSTATUS
ScsiClassGetAddress(IN PDEVICE_OBJECT ClassDeviceObject
,
196 OUT PSCSI_ADDRESS Address
);
197 extern VOID
ScsiClassReleaseQueue(IN PDEVICE_OBJECT DeviceObject
);
198 extern NTSTATUS
ScsiClassRemoveDevice(IN PDEVICE_OBJECT PortDeviceObject
, IN UCHAR PathId
,
199 IN UCHAR TargetId
, IN UCHAR Lun
);
200 extern NTSTATUS
ScsiClassClaimDevice(IN PDEVICE_OBJECT PortDeviceObject
,
201 IN PSCSI_INQUIRY_DATA LunInfo
, IN BOOLEAN Release
,
202 OUT PDEVICE_OBJECT
*NewPortDeviceObject OPTIONAL
);
203 extern NTSTATUS
ScsiClassInternalIoControl (IN PDEVICE_OBJECT DeviceObject
, IN PIRP Irp
);
204 extern NTSTATUS
ScsiClassIoCompletion(IN PDEVICE_OBJECT DeviceObject
, IN PIRP Irp
,
206 extern NTSTATUS
ScsiClassSendSrbSynchronous(IN PDEVICE_OBJECT TargetDeviceObject
,
207 IN PSCSI_REQUEST_BLOCK _srb
,
212 extern VOID
ScsiClassInitSrbBusAddr(PSCSI_REQUEST_BLOCK Srb
,
213 PVOID DeviceExtension
);
216 DbgWaitForSingleObject_(
218 IN PLARGE_INTEGER Timeout OPTIONAL
222 #endif //__SCSI_PORT_H__