1 /**
2  * @file ntddscsi.h
3  * Copyright 2012, 2013 MinGW.org project
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  */
24 /* Created by Casper S. Hornstrup <chorns@users.sourceforge.net> */
25 #ifndef __NTDDSCSI_H
26 #define __NTDDSCSI_H
27 #pragma GCC system_header
28 #include <_mingw.h>
29 
30 /*
31  * SCSI port IOCTL interface.
32  */
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #include "ntddk.h"
39 
40 #define DD_SCSI_DEVICE_NAME               "\\Device\\ScsiPort"
41 #define DD_SCSI_DEVICE_NAME_U             L"\\Device\\ScsiPort"
42 
43 #define IOCTL_SCSI_BASE                   FILE_DEVICE_CONTROLLER
44 
45 #define IOCTL_SCSI_GET_INQUIRY_DATA \
46   CTL_CODE(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS)
47 
48 #define IOCTL_SCSI_GET_CAPABILITIES \
49   CTL_CODE(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS)
50 
51 #define IOCTL_SCSI_GET_ADDRESS \
52   CTL_CODE(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS)
53 
54 #define IOCTL_SCSI_MINIPORT \
55   CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
56 
57 #define IOCTL_SCSI_PASS_THROUGH \
58   CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
59 
60 #define IOCTL_SCSI_PASS_THROUGH_DIRECT \
61   CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
62 
63 #define IOCTL_SCSI_RESCAN_BUS \
64   CTL_CODE(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS)
65 
66 
67 DEFINE_GUID(ScsiRawInterfaceGuid, \
68   0x53f56309L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
69 
70 DEFINE_GUID(WmiScsiAddressGuid, \
71   0x53f5630fL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
72 
73 typedef struct _SCSI_PASS_THROUGH {
74   USHORT  Length;
75   UCHAR  ScsiStatus;
76   UCHAR  PathId;
77   UCHAR  TargetId;
78   UCHAR  Lun;
79   UCHAR  CdbLength;
80   UCHAR  SenseInfoLength;
81   UCHAR  DataIn;
82   ULONG  DataTransferLength;
83   ULONG  TimeOutValue;
84   ULONG_PTR DataBufferOffset;
85   ULONG  SenseInfoOffset;
86   UCHAR  Cdb[16];
87 } SCSI_PASS_THROUGH, *PSCSI_PASS_THROUGH;
88 
89 typedef struct _SCSI_PASS_THROUGH_DIRECT {
90   USHORT  Length;
91   UCHAR  ScsiStatus;
92   UCHAR  PathId;
93   UCHAR  TargetId;
94   UCHAR  Lun;
95   UCHAR  CdbLength;
96   UCHAR  SenseInfoLength;
97   UCHAR  DataIn;
98   ULONG  DataTransferLength;
99   ULONG  TimeOutValue;
100   PVOID  DataBuffer;
101   ULONG  SenseInfoOffset;
102   UCHAR  Cdb[16];
103 } SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT;
104 
105 typedef struct _SRB_IO_CONTROL {
106   ULONG  HeaderLength;
107   UCHAR  Signature[8];
108   ULONG  Timeout;
109   ULONG  ControlCode;
110   ULONG  ReturnCode;
111   ULONG  Length;
112 } SRB_IO_CONTROL, *PSRB_IO_CONTROL;
113 
114 typedef struct _SCSI_ADDRESS {
115 	ULONG  Length;
116 	UCHAR  PortNumber;
117 	UCHAR  PathId;
118 	UCHAR  TargetId;
119 	UCHAR  Lun;
120 } SCSI_ADDRESS, *PSCSI_ADDRESS;
121 
122 typedef struct _SCSI_BUS_DATA {
123 	UCHAR  NumberOfLogicalUnits;
124 	UCHAR  InitiatorBusId;
125 	ULONG  InquiryDataOffset;
126 }SCSI_BUS_DATA, *PSCSI_BUS_DATA;
127 
128 typedef struct _SCSI_ADAPTER_BUS_INFO {
129 	UCHAR  NumberOfBuses;
130 	SCSI_BUS_DATA  BusData[1];
131 } SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO;
132 
133 typedef struct _IO_SCSI_CAPABILITIES {
134 	ULONG  Length;
135 	ULONG  MaximumTransferLength;
136 	ULONG  MaximumPhysicalPages;
137 	ULONG  SupportedAsynchronousEvents;
138 	ULONG  AlignmentMask;
139 	BOOLEAN  TaggedQueuing;
140 	BOOLEAN  AdapterScansDown;
141 	BOOLEAN  AdapterUsesPio;
142 } IO_SCSI_CAPABILITIES, *PIO_SCSI_CAPABILITIES;
143 
144 typedef struct _SCSI_INQUIRY_DATA {
145 	UCHAR  PathId;
146 	UCHAR  TargetId;
147 	UCHAR  Lun;
148 	BOOLEAN  DeviceClaimed;
149 	ULONG  InquiryDataLength;
150 	ULONG  NextInquiryDataOffset;
151 	UCHAR  InquiryData[1];
152 } SCSI_INQUIRY_DATA, *PSCSI_INQUIRY_DATA;
153 
154 #define SCSI_IOCTL_DATA_OUT               0
155 #define SCSI_IOCTL_DATA_IN                1
156 #define SCSI_IOCTL_DATA_UNSPECIFIED       2
157 
158 typedef struct _DUMP_POINTERS {
159 	PADAPTER_OBJECT  AdapterObject;
160 	PVOID  MappedRegisterBase;
161 	PVOID  DumpData;
162 	PVOID  CommonBufferVa;
163 	LARGE_INTEGER  CommonBufferPa;
164 	ULONG  CommonBufferSize;
165 	BOOLEAN  AllocateCommonBuffers;
166 	BOOLEAN  UseDiskDump;
167 	UCHAR  Spare1[2];
168 	PVOID  DeviceObject;
169 } DUMP_POINTERS, *PDUMP_POINTERS;
170 
171 #ifdef __cplusplus
172 }
173 #endif
174 
175 #endif /* __NTDDSCSI_H */
176