1*c2c66affSColin Finck ////////////////////////////////////////////////////////////////////
2*c2c66affSColin Finck // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3*c2c66affSColin Finck // All rights reserved
4*c2c66affSColin Finck // This file was released under the GPLv2 on June 2015.
5*c2c66affSColin Finck ////////////////////////////////////////////////////////////////////
6*c2c66affSColin Finck /*
7*c2c66affSColin Finck 
8*c2c66affSColin Finck Module Name:
9*c2c66affSColin Finck 
10*c2c66affSColin Finck     scsi_port.h
11*c2c66affSColin Finck 
12*c2c66affSColin Finck Abstract:
13*c2c66affSColin Finck 
14*c2c66affSColin Finck     This is the include file that defines all constants and types for
15*c2c66affSColin Finck     accessing the SCSI port adapters.
16*c2c66affSColin Finck 
17*c2c66affSColin Finck Environment:
18*c2c66affSColin Finck 
19*c2c66affSColin Finck     kernel mode only
20*c2c66affSColin Finck  */
21*c2c66affSColin Finck 
22*c2c66affSColin Finck #ifndef __SCSI_PORT_H__
23*c2c66affSColin Finck #define __SCSI_PORT_H__
24*c2c66affSColin Finck 
25*c2c66affSColin Finck #include "srb.h"
26*c2c66affSColin Finck 
27*c2c66affSColin Finck #ifdef SCSIPORT_API
28*c2c66affSColin Finck #undef SCSIPORT_API
29*c2c66affSColin Finck #endif
30*c2c66affSColin Finck 
31*c2c66affSColin Finck // Device Name - this string is the name of the device.  It is the name
32*c2c66affSColin Finck // that should be passed to NtOpenFile when accessing the device.
33*c2c66affSColin Finck //
34*c2c66affSColin Finck // Note:  For devices that support multiple units, it should be suffixed
35*c2c66affSColin Finck //        with the Ascii representation of the unit number.
36*c2c66affSColin Finck 
37*c2c66affSColin Finck #define IOCTL_SCSI_BASE                 FILE_DEVICE_CONTROLLER
38*c2c66affSColin Finck 
39*c2c66affSColin Finck #define DD_SCSI_DEVICE_NAME "\\Device\\ScsiPort"
40*c2c66affSColin Finck 
41*c2c66affSColin Finck 
42*c2c66affSColin Finck // NtDeviceIoControlFile IoControlCode values for this device.
43*c2c66affSColin Finck //
44*c2c66affSColin Finck // Warning:  Remember that the low two bits of the code specify how the
45*c2c66affSColin Finck //           buffers are passed to the driver!
46*c2c66affSColin Finck 
47*c2c66affSColin Finck #define IOCTL_SCSI_PASS_THROUGH         CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
48*c2c66affSColin Finck #define IOCTL_SCSI_MINIPORT             CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
49*c2c66affSColin Finck #define IOCTL_SCSI_GET_INQUIRY_DATA     CTL_CODE(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS)
50*c2c66affSColin Finck #define IOCTL_SCSI_GET_CAPABILITIES     CTL_CODE(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS)
51*c2c66affSColin Finck #define IOCTL_SCSI_PASS_THROUGH_DIRECT  CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
52*c2c66affSColin Finck #define IOCTL_SCSI_GET_ADDRESS          CTL_CODE(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS)
53*c2c66affSColin Finck #define IOCTL_SCSI_RESCAN_BUS           CTL_CODE(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS)
54*c2c66affSColin Finck #define IOCTL_SCSI_GET_DUMP_POINTERS    CTL_CODE(IOCTL_SCSI_BASE, 0x0408, METHOD_BUFFERED, FILE_ANY_ACCESS)
55*c2c66affSColin Finck 
56*c2c66affSColin Finck // Define the SCSI pass through structure.
57*c2c66affSColin Finck 
58*c2c66affSColin Finck typedef struct _SCSI_PASS_THROUGH {
59*c2c66affSColin Finck     USHORT Length;
60*c2c66affSColin Finck     UCHAR ScsiStatus;
61*c2c66affSColin Finck     UCHAR PathId;
62*c2c66affSColin Finck     UCHAR TargetId;
63*c2c66affSColin Finck     UCHAR Lun;
64*c2c66affSColin Finck     UCHAR CdbLength;
65*c2c66affSColin Finck     UCHAR SenseInfoLength;
66*c2c66affSColin Finck     UCHAR DataIn;
67*c2c66affSColin Finck     ULONG DataTransferLength;
68*c2c66affSColin Finck     ULONG TimeOutValue;
69*c2c66affSColin Finck     ULONG DataBufferOffset;
70*c2c66affSColin Finck     ULONG SenseInfoOffset;
71*c2c66affSColin Finck     UCHAR Cdb[16];
72*c2c66affSColin Finck }SCSI_PASS_THROUGH, *PSCSI_PASS_THROUGH;
73*c2c66affSColin Finck 
74*c2c66affSColin Finck // Define the SCSI pass through direct structure.
75*c2c66affSColin Finck 
76*c2c66affSColin Finck typedef struct _SCSI_PASS_THROUGH_DIRECT {
77*c2c66affSColin Finck     USHORT Length;
78*c2c66affSColin Finck     UCHAR ScsiStatus;
79*c2c66affSColin Finck     UCHAR PathId;
80*c2c66affSColin Finck     UCHAR TargetId;
81*c2c66affSColin Finck     UCHAR Lun;
82*c2c66affSColin Finck     UCHAR CdbLength;
83*c2c66affSColin Finck     UCHAR SenseInfoLength;
84*c2c66affSColin Finck     UCHAR DataIn;
85*c2c66affSColin Finck     ULONG DataTransferLength;
86*c2c66affSColin Finck     ULONG TimeOutValue;
87*c2c66affSColin Finck     PVOID DataBuffer;
88*c2c66affSColin Finck     ULONG SenseInfoOffset;
89*c2c66affSColin Finck     UCHAR Cdb[16];
90*c2c66affSColin Finck }SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT;
91*c2c66affSColin Finck 
92*c2c66affSColin Finck // Define SCSI information.
93*c2c66affSColin Finck // Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL.
94*c2c66affSColin Finck 
95*c2c66affSColin Finck typedef struct _SCSI_BUS_DATA {
96*c2c66affSColin Finck     UCHAR NumberOfLogicalUnits;
97*c2c66affSColin Finck     UCHAR InitiatorBusId;
98*c2c66affSColin Finck     ULONG InquiryDataOffset;
99*c2c66affSColin Finck }SCSI_BUS_DATA, *PSCSI_BUS_DATA;
100*c2c66affSColin Finck 
101*c2c66affSColin Finck // Define SCSI adapter bus information structure..
102*c2c66affSColin Finck // Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL.
103*c2c66affSColin Finck 
104*c2c66affSColin Finck typedef struct _SCSI_ADAPTER_BUS_INFO {
105*c2c66affSColin Finck     UCHAR NumberOfBuses;
106*c2c66affSColin Finck     SCSI_BUS_DATA BusData[1];
107*c2c66affSColin Finck } SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO;
108*c2c66affSColin Finck 
109*c2c66affSColin Finck // Define SCSI adapter bus information.
110*c2c66affSColin Finck // Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL.
111*c2c66affSColin Finck 
112*c2c66affSColin Finck typedef struct _SCSI_INQUIRY_DATA {
113*c2c66affSColin Finck     UCHAR PathId;
114*c2c66affSColin Finck     UCHAR TargetId;
115*c2c66affSColin Finck     UCHAR Lun;
116*c2c66affSColin Finck     BOOLEAN DeviceClaimed;
117*c2c66affSColin Finck     ULONG InquiryDataLength;
118*c2c66affSColin Finck     ULONG NextInquiryDataOffset;
119*c2c66affSColin Finck     UCHAR InquiryData[1];
120*c2c66affSColin Finck }SCSI_INQUIRY_DATA, *PSCSI_INQUIRY_DATA;
121*c2c66affSColin Finck 
122*c2c66affSColin Finck // Define header for I/O control SRB.
123*c2c66affSColin Finck 
124*c2c66affSColin Finck typedef struct _SRB_IO_CONTROL {
125*c2c66affSColin Finck         ULONG HeaderLength;
126*c2c66affSColin Finck         UCHAR Signature[8];
127*c2c66affSColin Finck         ULONG Timeout;
128*c2c66affSColin Finck         ULONG ControlCode;
129*c2c66affSColin Finck         ULONG ReturnCode;
130*c2c66affSColin Finck         ULONG Length;
131*c2c66affSColin Finck } SRB_IO_CONTROL, *PSRB_IO_CONTROL;
132*c2c66affSColin Finck 
133*c2c66affSColin Finck // SCSI port driver capabilities structure.
134*c2c66affSColin Finck 
135*c2c66affSColin Finck typedef struct _IO_SCSI_CAPABILITIES {
136*c2c66affSColin Finck     ULONG Length;    // Length of this structure
137*c2c66affSColin Finck     ULONG MaximumTransferLength;    // Maximum transfer size in single SRB (obsolete)
138*c2c66affSColin Finck     ULONG MaximumPhysicalPages;    // Maximum number of physical pages per data buffer
139*c2c66affSColin Finck     ULONG SupportedAsynchronousEvents;    // Async calls from port to class
140*c2c66affSColin Finck     ULONG AlignmentMask;    // Alignment mask for data transfers.
141*c2c66affSColin Finck     BOOLEAN TaggedQueuing;    // Supports tagged queuing
142*c2c66affSColin Finck     BOOLEAN AdapterScansDown;    // Host adapter scans down for bios devices.
143*c2c66affSColin Finck     BOOLEAN AdapterUsesPio;    // The host adapter uses programmed I/O.
144*c2c66affSColin Finck } IO_SCSI_CAPABILITIES, *PIO_SCSI_CAPABILITIES;
145*c2c66affSColin Finck 
146*c2c66affSColin Finck typedef struct _SCSI_ADDRESS {
147*c2c66affSColin Finck     ULONG Length;
148*c2c66affSColin Finck     UCHAR PortNumber;
149*c2c66affSColin Finck     UCHAR PathId;
150*c2c66affSColin Finck     UCHAR TargetId;
151*c2c66affSColin Finck     UCHAR Lun;
152*c2c66affSColin Finck }SCSI_ADDRESS, *PSCSI_ADDRESS;
153*c2c66affSColin Finck 
154*c2c66affSColin Finck // Define structure for returning crash dump pointers.
155*c2c66affSColin Finck 
156*c2c66affSColin Finck struct _ADAPTER_OBJECT;
157*c2c66affSColin Finck 
158*c2c66affSColin Finck typedef struct _DUMP_POINTERS {
159*c2c66affSColin Finck     struct _ADAPTER_OBJECT *AdapterObject;
160*c2c66affSColin Finck     PVOID MappedRegisterBase;
161*c2c66affSColin Finck     PVOID PortConfiguration;
162*c2c66affSColin Finck     PVOID CommonBufferVa;
163*c2c66affSColin Finck     LARGE_INTEGER CommonBufferPa;
164*c2c66affSColin Finck     ULONG CommonBufferSize;
165*c2c66affSColin Finck } DUMP_POINTERS, *PDUMP_POINTERS;
166*c2c66affSColin Finck 
167*c2c66affSColin Finck 
168*c2c66affSColin Finck 
169*c2c66affSColin Finck // Define values for pass-through DataIn field.
170*c2c66affSColin Finck 
171*c2c66affSColin Finck #define SCSI_IOCTL_DATA_OUT          0
172*c2c66affSColin Finck #define SCSI_IOCTL_DATA_IN           1
173*c2c66affSColin Finck #define SCSI_IOCTL_DATA_UNSPECIFIED  2
174*c2c66affSColin Finck 
175*c2c66affSColin Finck #define CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK     0x00000020
176*c2c66affSColin Finck 
177*c2c66affSColin Finck #define SCSIPORT_API
178*c2c66affSColin Finck 
179*c2c66affSColin Finck #ifndef USER_MODE
180*c2c66affSColin Finck extern NTSTATUS ScsiClassGetInquiryData(IN PDEVICE_OBJECT PortDeviceObject,
181*c2c66affSColin Finck                                         IN PSCSI_ADAPTER_BUS_INFO *ConfigInfo);
182*c2c66affSColin Finck extern NTSTATUS ScsiClassReadDeviceInquiryData(IN PDEVICE_OBJECT DeviceObject,
183*c2c66affSColin Finck                                                IN BOOLEAN DirectAccess);
184*c2c66affSColin Finck extern NTSTATUS ScsiClassReadDriveCapacity(IN PDEVICE_OBJECT DeviceObject);
185*c2c66affSColin Finck 
186*c2c66affSColin Finck #ifndef CDRW_W32
187*c2c66affSColin Finck 
188*c2c66affSColin Finck // Class dll routines called by class drivers
189*c2c66affSColin Finck 
190*c2c66affSColin Finck extern NTSTATUS ScsiClassGetCapabilities(IN PDEVICE_OBJECT PortDeviceObject,
191*c2c66affSColin Finck                                          OUT PIO_SCSI_CAPABILITIES *PortCapabilities);
192*c2c66affSColin Finck extern NTSTATUS ScsiClassGetAddress(IN PDEVICE_OBJECT ClassDeviceObject,
193*c2c66affSColin Finck                                     OUT PSCSI_ADDRESS Address);
194*c2c66affSColin Finck extern VOID     ScsiClassReleaseQueue(IN PDEVICE_OBJECT DeviceObject);
195*c2c66affSColin Finck extern NTSTATUS ScsiClassRemoveDevice(IN PDEVICE_OBJECT PortDeviceObject, IN UCHAR PathId,
196*c2c66affSColin Finck                                       IN UCHAR TargetId, IN UCHAR Lun);
197*c2c66affSColin Finck extern NTSTATUS ScsiClassClaimDevice(IN PDEVICE_OBJECT PortDeviceObject,
198*c2c66affSColin Finck                                      IN PSCSI_INQUIRY_DATA LunInfo, IN BOOLEAN Release,
199*c2c66affSColin Finck                                      OUT PDEVICE_OBJECT *NewPortDeviceObject OPTIONAL);
200*c2c66affSColin Finck extern NTSTATUS ScsiClassInternalIoControl (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
201*c2c66affSColin Finck extern NTSTATUS ScsiClassIoCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp,
202*c2c66affSColin Finck                                       IN PVOID Context);
203*c2c66affSColin Finck extern NTSTATUS ScsiClassSendSrbSynchronous(IN PDEVICE_OBJECT TargetDeviceObject,
204*c2c66affSColin Finck                                             IN PSCSI_REQUEST_BLOCK _srb,
205*c2c66affSColin Finck                                             IN PKEVENT event);
206*c2c66affSColin Finck 
207*c2c66affSColin Finck #endif //CDRW_W32
208*c2c66affSColin Finck 
209*c2c66affSColin Finck extern VOID     ScsiClassInitSrbBusAddr(PSCSI_REQUEST_BLOCK Srb,
210*c2c66affSColin Finck                                         PVOID DeviceExtension);
211*c2c66affSColin Finck 
212*c2c66affSColin Finck extern NTSTATUS
213*c2c66affSColin Finck DbgWaitForSingleObject_(
214*c2c66affSColin Finck     IN PVOID Object,
215*c2c66affSColin Finck     IN PLARGE_INTEGER Timeout OPTIONAL
216*c2c66affSColin Finck     );
217*c2c66affSColin Finck #endif //USER_MODE
218*c2c66affSColin Finck 
219*c2c66affSColin Finck #endif //__SCSI_PORT_H__
220