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