1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 #ifdef DEFINE_GUID
7 
8 #ifndef FAR
9 #define FAR
10 #endif
11 
12 DEFINE_GUID(ScsiRawInterfaceGuid,0x53f56309,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
13 DEFINE_GUID(WmiScsiAddressGuid,0x53f5630f,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
14 #endif /* DEFINE_GUID */
15 
16 #ifndef _NTDDSCSIH_
17 #define _NTDDSCSIH_
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 #define IOCTL_SCSI_BASE		FILE_DEVICE_CONTROLLER
24 
25 #define DD_SCSI_DEVICE_NAME	"\\Device\\ScsiPort"
26 #define DD_SCSI_DEVICE_NAME_U  L"\\Device\\ScsiPort"
27 
28 #define IOCTL_SCSI_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE,0x0401,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
29 #define IOCTL_SCSI_MINIPORT CTL_CODE(IOCTL_SCSI_BASE,0x0402,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
30 #define IOCTL_SCSI_GET_INQUIRY_DATA CTL_CODE(IOCTL_SCSI_BASE,0x0403,METHOD_BUFFERED,FILE_ANY_ACCESS)
31 #define IOCTL_SCSI_GET_CAPABILITIES CTL_CODE(IOCTL_SCSI_BASE,0x0404,METHOD_BUFFERED,FILE_ANY_ACCESS)
32 #define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE(IOCTL_SCSI_BASE,0x0405,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
33 #define IOCTL_SCSI_GET_ADDRESS CTL_CODE(IOCTL_SCSI_BASE,0x0406,METHOD_BUFFERED,FILE_ANY_ACCESS)
34 #define IOCTL_SCSI_RESCAN_BUS CTL_CODE(IOCTL_SCSI_BASE,0x0407,METHOD_BUFFERED,FILE_ANY_ACCESS)
35 #define IOCTL_SCSI_GET_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE,0x0408,METHOD_BUFFERED,FILE_ANY_ACCESS)
36 #define IOCTL_SCSI_FREE_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE,0x0409,METHOD_BUFFERED,FILE_ANY_ACCESS)
37 #define IOCTL_IDE_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE,0x040a,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
38 #define IOCTL_ATA_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE,0x040b,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
39 #define IOCTL_ATA_PASS_THROUGH_DIRECT CTL_CODE(IOCTL_SCSI_BASE,0x040c,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
40 
41   typedef struct _SCSI_PASS_THROUGH {
42     USHORT Length;
43     UCHAR ScsiStatus;
44     UCHAR PathId;
45     UCHAR TargetId;
46     UCHAR Lun;
47     UCHAR CdbLength;
48     UCHAR SenseInfoLength;
49     UCHAR DataIn;
50     ULONG DataTransferLength;
51     ULONG TimeOutValue;
52     ULONG_PTR DataBufferOffset;
53     ULONG SenseInfoOffset;
54     UCHAR Cdb[16];
55   }SCSI_PASS_THROUGH,*PSCSI_PASS_THROUGH;
56 
57   typedef struct _SCSI_PASS_THROUGH_DIRECT {
58     USHORT Length;
59     UCHAR ScsiStatus;
60     UCHAR PathId;
61     UCHAR TargetId;
62     UCHAR Lun;
63     UCHAR CdbLength;
64     UCHAR SenseInfoLength;
65     UCHAR DataIn;
66     ULONG DataTransferLength;
67     ULONG TimeOutValue;
68     PVOID DataBuffer;
69     ULONG SenseInfoOffset;
70     UCHAR Cdb[16];
71   }SCSI_PASS_THROUGH_DIRECT,*PSCSI_PASS_THROUGH_DIRECT;
72 
73 #if defined(_WIN64)
74   typedef struct _SCSI_PASS_THROUGH32 {
75     USHORT Length;
76     UCHAR ScsiStatus;
77     UCHAR PathId;
78     UCHAR TargetId;
79     UCHAR Lun;
80     UCHAR CdbLength;
81     UCHAR SenseInfoLength;
82     UCHAR DataIn;
83     ULONG DataTransferLength;
84     ULONG TimeOutValue;
85     ULONG32 DataBufferOffset;
86     ULONG SenseInfoOffset;
87     UCHAR Cdb[16];
88   } SCSI_PASS_THROUGH32,*PSCSI_PASS_THROUGH32;
89 
90   typedef struct _SCSI_PASS_THROUGH_DIRECT32 {
91     USHORT Length;
92     UCHAR ScsiStatus;
93     UCHAR PathId;
94     UCHAR TargetId;
95     UCHAR Lun;
96     UCHAR CdbLength;
97     UCHAR SenseInfoLength;
98     UCHAR DataIn;
99     ULONG DataTransferLength;
100     ULONG TimeOutValue;
101     VOID *DataBuffer;
102     ULONG SenseInfoOffset;
103     UCHAR Cdb[16];
104   } SCSI_PASS_THROUGH_DIRECT32,*PSCSI_PASS_THROUGH_DIRECT32;
105 #endif /* _WIN64 */
106 
107   typedef struct _ATA_PASS_THROUGH_EX {
108     USHORT Length;
109     USHORT AtaFlags;
110     UCHAR PathId;
111     UCHAR TargetId;
112     UCHAR Lun;
113     UCHAR ReservedAsUchar;
114     ULONG DataTransferLength;
115     ULONG TimeOutValue;
116     ULONG ReservedAsUlong;
117     ULONG_PTR DataBufferOffset;
118     UCHAR PreviousTaskFile[8];
119     UCHAR CurrentTaskFile[8];
120   } ATA_PASS_THROUGH_EX,*PATA_PASS_THROUGH_EX;
121 
122   typedef struct _ATA_PASS_THROUGH_DIRECT {
123     USHORT Length;
124     USHORT AtaFlags;
125     UCHAR PathId;
126     UCHAR TargetId;
127     UCHAR Lun;
128     UCHAR ReservedAsUchar;
129     ULONG DataTransferLength;
130     ULONG TimeOutValue;
131     ULONG ReservedAsUlong;
132     PVOID DataBuffer;
133     UCHAR PreviousTaskFile[8];
134     UCHAR CurrentTaskFile[8];
135   } ATA_PASS_THROUGH_DIRECT,*PATA_PASS_THROUGH_DIRECT;
136 
137 #if defined(_WIN64)
138 
139   typedef struct _ATA_PASS_THROUGH_EX32 {
140     USHORT Length;
141     USHORT AtaFlags;
142     UCHAR PathId;
143     UCHAR TargetId;
144     UCHAR Lun;
145     UCHAR ReservedAsUchar;
146     ULONG DataTransferLength;
147     ULONG TimeOutValue;
148     ULONG ReservedAsUlong;
149     ULONG32 DataBufferOffset;
150     UCHAR PreviousTaskFile[8];
151     UCHAR CurrentTaskFile[8];
152   } ATA_PASS_THROUGH_EX32,*PATA_PASS_THROUGH_EX32;
153 
154   typedef struct _ATA_PASS_THROUGH_DIRECT32 {
155     USHORT Length;
156     USHORT AtaFlags;
157     UCHAR PathId;
158     UCHAR TargetId;
159     UCHAR Lun;
160     UCHAR ReservedAsUchar;
161     ULONG DataTransferLength;
162     ULONG TimeOutValue;
163     ULONG ReservedAsUlong;
164     VOID *DataBuffer;
165     UCHAR PreviousTaskFile[8];
166     UCHAR CurrentTaskFile[8];
167   } ATA_PASS_THROUGH_DIRECT32,*PATA_PASS_THROUGH_DIRECT32;
168 #endif /* _WIN64 */
169 
170 #define ATA_FLAGS_DRDY_REQUIRED (1 << 0)
171 #define ATA_FLAGS_DATA_IN (1 << 1)
172 #define ATA_FLAGS_DATA_OUT (1 << 2)
173 #define ATA_FLAGS_48BIT_COMMAND (1 << 3)
174 #define ATA_FLAGS_USE_DMA (1 << 4)
175 
176   typedef struct _SCSI_BUS_DATA {
177     UCHAR NumberOfLogicalUnits;
178     UCHAR InitiatorBusId;
179     ULONG InquiryDataOffset;
180   }SCSI_BUS_DATA,*PSCSI_BUS_DATA;
181 
182   typedef struct _SCSI_ADAPTER_BUS_INFO {
183     UCHAR NumberOfBuses;
184     SCSI_BUS_DATA BusData[1];
185   } SCSI_ADAPTER_BUS_INFO,*PSCSI_ADAPTER_BUS_INFO;
186 
187   typedef struct _SCSI_INQUIRY_DATA {
188     UCHAR PathId;
189     UCHAR TargetId;
190     UCHAR Lun;
191     BOOLEAN DeviceClaimed;
192     ULONG InquiryDataLength;
193     ULONG NextInquiryDataOffset;
194     UCHAR InquiryData[1];
195   }SCSI_INQUIRY_DATA,*PSCSI_INQUIRY_DATA;
196 
197   typedef struct _SRB_IO_CONTROL {
198     ULONG HeaderLength;
199     UCHAR Signature[8];
200     ULONG Timeout;
201     ULONG ControlCode;
202     ULONG ReturnCode;
203     ULONG Length;
204   } SRB_IO_CONTROL,*PSRB_IO_CONTROL;
205 
206   typedef struct _IO_SCSI_CAPABILITIES {
207     ULONG Length;
208     ULONG MaximumTransferLength;
209     ULONG MaximumPhysicalPages;
210     ULONG SupportedAsynchronousEvents;
211     ULONG AlignmentMask;
212     BOOLEAN TaggedQueuing;
213     BOOLEAN AdapterScansDown;
214     BOOLEAN AdapterUsesPio;
215   } IO_SCSI_CAPABILITIES,*PIO_SCSI_CAPABILITIES;
216 
217   typedef struct _SCSI_ADDRESS {
218     ULONG Length;
219     UCHAR PortNumber;
220     UCHAR PathId;
221     UCHAR TargetId;
222     UCHAR Lun;
223   } SCSI_ADDRESS,*PSCSI_ADDRESS;
224 
225   struct _ADAPTER_OBJECT;
226 
227   typedef struct _DUMP_POINTERS {
228     struct _ADAPTER_OBJECT *AdapterObject;
229     PVOID MappedRegisterBase;
230     PVOID DumpData;
231     PVOID CommonBufferVa;
232     LARGE_INTEGER CommonBufferPa;
233     ULONG CommonBufferSize;
234     BOOLEAN AllocateCommonBuffers;
235     BOOLEAN UseDiskDump;
236     UCHAR Spare1[2];
237     PVOID DeviceObject;
238   } DUMP_POINTERS,*PDUMP_POINTERS;
239 
240 #define SCSI_IOCTL_DATA_OUT 0
241 #define SCSI_IOCTL_DATA_IN 1
242 #define SCSI_IOCTL_DATA_UNSPECIFIED 2
243 
244 #ifdef __cplusplus
245 }
246 #endif
247 
248 #endif /* _NTDDSCSIH_ */
249 
250