1use shared::basetsd::{ULONG32, ULONG_PTR};
8use shared::minwindef::{UCHAR, ULONG, USHORT};
9use shared::ntdef::{LARGE_INTEGER, LONG, LONGLONG, PVOID, ULONGLONG, VOID, WCHAR};
10use um::winioctl::{
11 DEVICE_TYPE, FILE_ANY_ACCESS, FILE_DEVICE_CONTROLLER, FILE_READ_ACCESS,
12 FILE_WRITE_ACCESS, METHOD_BUFFERED
13};
14use um::winnt::{ANYSIZE_ARRAY, BOOLEAN, PBOOLEAN};
15DEFINE_GUID!{ScsiRawInterfaceGuid,
16 0x53f56309, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b}
17DEFINE_GUID!{WmiScsiAddressGuid,
18 0x53f5630f, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b}
19pub const IOCTL_SCSI_BASE: DEVICE_TYPE = FILE_DEVICE_CONTROLLER;
20pub const FILE_DEVICE_SCSI: ULONG = 0x0000001;
21pub const DD_SCSI_DEVICE_NAME: &'static str = "\\Device\\ScsiPort";
22pub const IOCTL_SCSI_PASS_THROUGH: ULONG =
23 CTL_CODE!(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
24pub const IOCTL_SCSI_MINIPORT: ULONG =
25 CTL_CODE!(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
26pub const IOCTL_SCSI_GET_INQUIRY_DATA: ULONG =
27 CTL_CODE!(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS);
28pub const IOCTL_SCSI_GET_CAPABILITIES: ULONG =
29 CTL_CODE!(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS);
30pub const IOCTL_SCSI_PASS_THROUGH_DIRECT: ULONG =
31 CTL_CODE!(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
32pub const IOCTL_SCSI_GET_ADDRESS: ULONG =
33 CTL_CODE!(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS);
34pub const IOCTL_SCSI_RESCAN_BUS: ULONG =
35 CTL_CODE!(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS);
36pub const IOCTL_SCSI_GET_DUMP_POINTERS: ULONG =
37 CTL_CODE!(IOCTL_SCSI_BASE, 0x0408, METHOD_BUFFERED, FILE_ANY_ACCESS);
38pub const IOCTL_SCSI_FREE_DUMP_POINTERS: ULONG =
39 CTL_CODE!(IOCTL_SCSI_BASE, 0x0409, METHOD_BUFFERED, FILE_ANY_ACCESS);
40pub const IOCTL_IDE_PASS_THROUGH: ULONG =
41 CTL_CODE!(IOCTL_SCSI_BASE, 0x040a, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
42pub const IOCTL_ATA_PASS_THROUGH: ULONG =
43 CTL_CODE!(IOCTL_SCSI_BASE, 0x040b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
44pub const IOCTL_ATA_PASS_THROUGH_DIRECT: ULONG =
45 CTL_CODE!(IOCTL_SCSI_BASE, 0x040c, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
46pub const IOCTL_ATA_MINIPORT: ULONG =
47 CTL_CODE!(IOCTL_SCSI_BASE, 0x040d, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
48pub const IOCTL_MINIPORT_PROCESS_SERVICE_IRP: ULONG =
49 CTL_CODE!(IOCTL_SCSI_BASE, 0x040e, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
50pub const IOCTL_MPIO_PASS_THROUGH_PATH: ULONG =
51 CTL_CODE!(IOCTL_SCSI_BASE, 0x040f, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
52pub const IOCTL_MPIO_PASS_THROUGH_PATH_DIRECT: ULONG =
53 CTL_CODE!(IOCTL_SCSI_BASE, 0x0410, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
54pub const IOCTL_SCSI_PASS_THROUGH_EX: ULONG =
55 CTL_CODE!(IOCTL_SCSI_BASE, 0x0411, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
56pub const IOCTL_SCSI_PASS_THROUGH_DIRECT_EX: ULONG =
57 CTL_CODE!(IOCTL_SCSI_BASE, 0x0412, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
58pub const IOCTL_MPIO_PASS_THROUGH_PATH_EX: ULONG =
59 CTL_CODE!(IOCTL_SCSI_BASE, 0x0413, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
60pub const IOCTL_MPIO_PASS_THROUGH_PATH_DIRECT_EX: ULONG =
61 CTL_CODE!(IOCTL_SCSI_BASE, 0x0414, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS);
62pub const IOCTL_SCSI_MINIPORT_NVCACHE: ULONG = (FILE_DEVICE_SCSI << 16) + 0x0600;
63pub const IOCTL_SCSI_MINIPORT_HYBRID: ULONG = (FILE_DEVICE_SCSI << 16) + 0x0620;
64pub const IOCTL_SCSI_MINIPORT_FIRMWARE: ULONG = (FILE_DEVICE_SCSI << 16) + 0x0780;
65STRUCT!{struct SCSI_PASS_THROUGH {
66 Length: USHORT,
67 ScsiStatus: UCHAR,
68 PathId: UCHAR,
69 TargetId: UCHAR,
70 Lun: UCHAR,
71 CdbLength: UCHAR,
72 SenseInfoLength: UCHAR,
73 DataIn: UCHAR,
74 DataTransferLength: ULONG,
75 TimeOutValue: ULONG,
76 DataBufferOffset: ULONG_PTR,
77 SenseInfoOffset: ULONG,
78 Cdb: [UCHAR; 16],
79}}
80pub type PSCSI_PASS_THROUGH = *mut SCSI_PASS_THROUGH;
81STRUCT!{struct SCSI_PASS_THROUGH_DIRECT {
82 Length: USHORT,
83 ScsiStatus: UCHAR,
84 PathId: UCHAR,
85 TargetId: UCHAR,
86 Lun: UCHAR,
87 CdbLength: UCHAR,
88 SenseInfoLength: UCHAR,
89 DataIn: UCHAR,
90 DataTransferLength: ULONG,
91 TimeOutValue: ULONG,
92 DataBuffer: PVOID,
93 SenseInfoOffset: ULONG,
94 Cdb: [UCHAR; 16],
95}}
96pub type PSCSI_PASS_THROUGH_DIRECT = *mut SCSI_PASS_THROUGH_DIRECT;
97STRUCT!{struct SCSI_PASS_THROUGH32 {
98 Length: USHORT,
99 ScsiStatus: UCHAR,
100 PathId: UCHAR,
101 TargetId: UCHAR,
102 Lun: UCHAR,
103 CdbLength: UCHAR,
104 SenseInfoLength: UCHAR,
105 DataIn: UCHAR,
106 DataTransferLength: ULONG,
107 TimeOutValue: ULONG,
108 DataBufferOffset: ULONG32,
109 SenseInfoOffset: ULONG,
110 Cdb: [UCHAR; 16],
111}}
112#[cfg(target_arch = "x86_64")]
113IFDEF!{
114pub type PSCSI_PASS_THROUGH32 = *mut SCSI_PASS_THROUGH32;
115STRUCT!{struct SCSI_PASS_THROUGH_DIRECT32 {
116 Length: USHORT,
117 ScsiStatus: UCHAR,
118 PathId: UCHAR,
119 TargetId: UCHAR,
120 Lun: UCHAR,
121 CdbLength: UCHAR,
122 SenseInfoLength: UCHAR,
123 DataIn: UCHAR,
124 DataTransferLength: ULONG,
125 TimeOutValue: ULONG,
126 DataBuffer: ULONG32, SenseInfoOffset: ULONG,
128 Cdb: [UCHAR; 16],
129}}
130pub type PSCSI_PASS_THROUGH_DIRECT32 = *mut SCSI_PASS_THROUGH_DIRECT32;
131}
132STRUCT!{struct SCSI_PASS_THROUGH_EX {
133 Version: ULONG,
134 Length: ULONG,
135 CdbLength: ULONG,
136 StorAddressLength: ULONG,
137 ScsiStatus: UCHAR,
138 SenseInfolength: UCHAR,
139 DataDirection: UCHAR,
140 Reserved: UCHAR,
141 TimeOutValue: ULONG,
142 StorAddressOffset: ULONG,
143 SenseInfoOffset: ULONG,
144 DataOutTransferLength: ULONG,
145 DataInTransferLength: ULONG,
146 DataOutBufferOffset: ULONG_PTR,
147 DataInBufferOffset: ULONG_PTR,
148 Cdb: [UCHAR; ANYSIZE_ARRAY],
149}}
150pub type PSCSI_PASS_THROUGH_EX = *mut SCSI_PASS_THROUGH_EX;
151STRUCT!{struct SCSI_PASS_THROUGH_DIRECT_EX {
152 Version: ULONG,
153 Length: ULONG,
154 CdbLength: ULONG,
155 StorAddressLength: ULONG,
156 ScsiStatus: UCHAR,
157 SenseInfolength: UCHAR,
158 DataDirection: UCHAR,
159 Reserved: UCHAR,
160 TimeOutValue: ULONG,
161 StorAddressOffset: ULONG,
162 SenseInfoOffset: ULONG,
163 DataOutTransferLength: ULONG,
164 DataInTransferLength: ULONG,
165 DataOutBuffer: *mut VOID,
166 DataInBuffer: *mut VOID,
167 Cdb: [UCHAR; ANYSIZE_ARRAY],
168}}
169pub type PSCSI_PASS_THROUGH_DIRECT_EX = *mut SCSI_PASS_THROUGH_DIRECT_EX;
170#[cfg(target_arch = "x86_64")]
171IFDEF!{
172STRUCT!{struct SCSI_PASS_THROUGH32_EX {
173 Version: ULONG,
174 Length: ULONG,
175 CdbLength: ULONG,
176 StorAddressLength: ULONG,
177 ScsiStatus: UCHAR,
178 SenseInfolength: UCHAR,
179 DataDirection: UCHAR,
180 Reserved: UCHAR,
181 TimeOutValue: ULONG,
182 StorAddressOffset: ULONG,
183 SenseInfoOffset: ULONG,
184 DataOutTransferLength: ULONG,
185 DataInTransferLength: ULONG,
186 DataOutBufferOffset: ULONG32,
187 DataInBufferOffset: ULONG32,
188 Cdb: [UCHAR; ANYSIZE_ARRAY],
189}}
190pub type PSCSI_PASS_THROUGH32_EX = *mut SCSI_PASS_THROUGH32_EX;
191STRUCT!{struct SCSI_PASS_THROUGH_DIRECT32_EX {
192 Version: ULONG,
193 Length: ULONG,
194 CdbLength: ULONG,
195 StorAddressLength: ULONG,
196 ScsiStatus: UCHAR,
197 SenseInfolength: UCHAR,
198 DataDirection: UCHAR,
199 Reserved: UCHAR,
200 TimeOutValue: ULONG,
201 StorAddressOffset: ULONG,
202 SenseInfoOffset: ULONG,
203 DataOutTransferLength: ULONG,
204 DataInTransferLength: ULONG,
205 DataOutBuffer: ULONG32,
206 DataInBuffer: ULONG32,
207 Cdb: [UCHAR; ANYSIZE_ARRAY],
208}}
209pub type PSCSI_PASS_THROUGH_DIRECT32_EX = *mut SCSI_PASS_THROUGH_DIRECT32_EX;
210}
211STRUCT!{struct ATA_PASS_THROUGH_EX {
212 Length: USHORT,
213 AtaFlags: USHORT,
214 PathId: UCHAR,
215 TargetId: UCHAR,
216 Lun: UCHAR,
217 ReservedAsUchar: UCHAR,
218 DataTransferLength: ULONG,
219 TimeOutValue: ULONG,
220 ReservedAsUlong: ULONG,
221 DataBufferOffset: ULONG_PTR,
222 PreviousTaskFile: [UCHAR; 8],
223 CurrentTaskFile: [UCHAR; 8],
224}}
225pub type PATA_PASS_THROUGH_EX = *mut ATA_PASS_THROUGH_EX;
226STRUCT!{struct ATA_PASS_THROUGH_DIRECT {
227 Length: USHORT,
228 AtaFlags: USHORT,
229 PathId: UCHAR,
230 TargetId: UCHAR,
231 Lun: UCHAR,
232 ReservedAsUchar: UCHAR,
233 DataTransferLength: ULONG,
234 TimeOutValue: ULONG,
235 ReservedAsUlong: ULONG,
236 DataBuffer: PVOID,
237 PreviousTaskFile: [UCHAR; 8],
238 CurrentTaskFile: [UCHAR; 8],
239}}
240pub type PATA_PASS_THROUGH_DIRECT = *mut ATA_PASS_THROUGH_DIRECT;
241#[cfg(target_arch = "x86_64")]
242IFDEF!{
243STRUCT!{struct ATA_PASS_THROUGH_EX32 {
244 Length: USHORT,
245 AtaFlags: USHORT,
246 PathId: UCHAR,
247 TargetId: UCHAR,
248 Lun: UCHAR,
249 ReservedAsUchar: UCHAR,
250 DataTransferLength: ULONG,
251 TimeOutValue: ULONG,
252 ReservedAsUlong: ULONG,
253 DataBufferOffset: ULONG32,
254 PreviousTaskFile: [UCHAR; 8],
255 CurrentTaskFile: [UCHAR; 8],
256}}
257pub type PATA_PASS_THROUGH_EX32 = *mut ATA_PASS_THROUGH_EX32;
258STRUCT!{struct ATA_PASS_THROUGH_DIRECT32 {
259 Length: USHORT,
260 AtaFlags: USHORT,
261 PathId: UCHAR,
262 TargetId: UCHAR,
263 Lun: UCHAR,
264 ReservedAsUchar: UCHAR,
265 DataTransferLength: ULONG,
266 TimeOutValue: ULONG,
267 ReservedAsUlong: ULONG,
268 DataBuffer: ULONG32,
269 PreviousTaskFile: [UCHAR; 8],
270 CurrentTaskFile: [UCHAR; 8],
271}}
272pub type PATA_PASS_THROUGH_DIRECT32 = *mut ATA_PASS_THROUGH_DIRECT32;
273}
274pub const ATA_FLAGS_DRDY_REQUIRED: USHORT = 1 << 0;
275pub const ATA_FLAGS_DATA_IN: USHORT = 1 << 1;
276pub const ATA_FLAGS_DATA_OUT: USHORT = 1 << 2;
277pub const ATA_FLAGS_48BIT_COMMAND: USHORT = 1 << 3;
278pub const ATA_FLAGS_USE_DMA: USHORT = 1 << 4;
279pub const ATA_FLAGS_NO_MULTIPLE: USHORT = 1 << 5;
280STRUCT!{struct IDE_IO_CONTROL {
281 HeaderLength: ULONG,
282 Signature: [UCHAR; 8],
283 Timeout: ULONG,
284 ControlCode: ULONG,
285 ReturnStatus: ULONG,
286 DataLength: ULONG,
287}}
288pub type PIDE_IO_CONTROL = *mut IDE_IO_CONTROL;
289STRUCT!{struct MPIO_PASS_THROUGH_PATH {
290 PassThrough: SCSI_PASS_THROUGH,
291 Version: ULONG,
292 Length: USHORT,
293 Flags: UCHAR,
294 PortNumber: UCHAR,
295 MpioPathId: ULONGLONG,
296}}
297pub type PMPIO_PASS_THROUGH_PATH = *mut MPIO_PASS_THROUGH_PATH;
298STRUCT!{struct MPIO_PASS_THROUGH_PATH_DIRECT {
299 PassThrough: SCSI_PASS_THROUGH_DIRECT,
300 Version: ULONG,
301 Length: USHORT,
302 Flags: UCHAR,
303 PortNumber: UCHAR,
304 MpioPathId: ULONGLONG,
305}}
306pub type PMPIO_PASS_THROUGH_PATH_DIRECT = *mut MPIO_PASS_THROUGH_PATH_DIRECT;
307STRUCT!{struct MPIO_PASS_THROUGH_PATH_EX {
308 PassThroughOffset: ULONG,
309 Version: ULONG,
310 Length: USHORT,
311 Flags: UCHAR,
312 PortNumber: UCHAR,
313 MpioPathId: ULONGLONG,
314}}
315pub type PMPIO_PASS_THROUGH_PATH_EX = *mut MPIO_PASS_THROUGH_PATH_EX;
316STRUCT!{struct MPIO_PASS_THROUGH_PATH_DIRECT_EX {
317 PassThroughOffset: ULONG,
318 Version: ULONG,
319 Length: USHORT,
320 Flags: UCHAR,
321 PortNumber: UCHAR,
322 MpioPathId: ULONGLONG,
323}}
324pub type PMPIO_PASS_THROUGH_PATH_DIRECT_EX = *mut MPIO_PASS_THROUGH_PATH_DIRECT_EX;
325#[cfg(target_arch = "x86_64")]
326IFDEF!{
327STRUCT!{struct MPIO_PASS_THROUGH_PATH32 {
328 PassThrough: SCSI_PASS_THROUGH32,
329 Version: ULONG,
330 Length: USHORT,
331 Flags: UCHAR,
332 PortNumber: UCHAR,
333 MpioPathId: ULONGLONG,
334}}
335pub type PMPIO_PASS_THROUGH_PATH32 = *mut MPIO_PASS_THROUGH_PATH32;
336STRUCT!{struct MPIO_PASS_THROUGH_PATH_DIRECT32 {
337 PassThrough: SCSI_PASS_THROUGH_DIRECT32,
338 Version: ULONG,
339 Length: USHORT,
340 Flags: UCHAR,
341 PortNumber: UCHAR,
342 MpioPathId: ULONGLONG,
343}}
344pub type PMPIO_PASS_THROUGH_PATH_DIRECT32 = *mut MPIO_PASS_THROUGH_PATH_DIRECT32;
345STRUCT!{struct MPIO_PASS_THROUGH_PATH32_EX {
346 PassThroughOffset: ULONG,
347 Version: ULONG,
348 Length: USHORT,
349 Flags: UCHAR,
350 PortNumber: UCHAR,
351 MpioPathId: ULONGLONG,
352}}
353pub type PMPIO_PASS_THROUGH_PATH32_EX = *mut MPIO_PASS_THROUGH_PATH32_EX;
354STRUCT!{struct MPIO_PASS_THROUGH_PATH_DIRECT32_EX {
355 PassThroughOffset: ULONG,
356 Version: ULONG,
357 Length: USHORT,
358 Flags: UCHAR,
359 PortNumber: UCHAR,
360 MpioPathId: ULONGLONG,
361}}
362pub type PMPIO_PASS_THROUGH_PATH_DIRECT32_EX = *mut MPIO_PASS_THROUGH_PATH_DIRECT32_EX;
363}
364STRUCT!{struct SCSI_BUS_DATA {
365 NumberOfLogicalUnits: UCHAR,
366 InitiatorBusId: UCHAR,
367 InquiryDataOffset: ULONG,
368}}
369pub type PSCSI_BUS_DATA = *mut SCSI_BUS_DATA;
370STRUCT!{struct SCSI_ADAPTER_BUS_INFO {
371 NumberOfBuses: UCHAR,
372 BusData: [SCSI_BUS_DATA; 1],
373}}
374pub type PSCSI_ADAPTER_BUS_INFO = *mut SCSI_ADAPTER_BUS_INFO;
375STRUCT!{struct SCSI_INQUIRY_DATA {
376 PathId: UCHAR,
377 TargetId: UCHAR,
378 Lun: UCHAR,
379 DeviceClaimed: BOOLEAN,
380 InquiryDataLength: ULONG,
381 NextInquiryDataOffset: ULONG,
382 InquiryData: [UCHAR; 1],
383}}
384pub type PSCSI_INQUIRY_DATA = *mut SCSI_INQUIRY_DATA;
385pub const IOCTL_MINIPORT_SIGNATURE_SCSIDISK: &'static str = "SCSIDISK";
386pub const IOCTL_MINIPORT_SIGNATURE_HYBRDISK: &'static str = "HYBRDISK";
387pub const IOCTL_MINIPORT_SIGNATURE_DSM_NOTIFICATION: &'static str = "MPDSM ";
388pub const IOCTL_MINIPORT_SIGNATURE_DSM_GENERAL: &'static str = "MPDSMGEN";
389pub const IOCTL_MINIPORT_SIGNATURE_FIRMWARE: &'static str = "FIRMWARE";
390pub const IOCTL_MINIPORT_SIGNATURE_QUERY_PROTOCOL: &'static str = "PROTOCOL";
391pub const IOCTL_MINIPORT_SIGNATURE_QUERY_TEMPERATURE: &'static str = "TEMPERAT";
392pub const IOCTL_MINIPORT_SIGNATURE_SET_TEMPERATURE_THRESHOLD: &'static str = "SETTEMPT";
393pub const IOCTL_MINIPORT_SIGNATURE_QUERY_PHYSICAL_TOPOLOGY: &'static str = "TOPOLOGY";
394STRUCT!{struct SRB_IO_CONTROL {
395 HeaderLength: ULONG,
396 Signature: [UCHAR; 8],
397 Timeout: ULONG,
398 ControlCode: ULONG,
399 ReturnCode: ULONG,
400 Length: ULONG,
401}}
402pub type PSRB_IO_CONTROL = *mut SRB_IO_CONTROL;
403STRUCT!{struct NVCACHE_REQUEST_BLOCK {
404 NRBSize: ULONG,
405 Function: USHORT,
406 NRBFlags: ULONG,
407 NRBStatus: ULONG,
408 Count: ULONG,
409 LBA: ULONGLONG,
410 DataBufSize: ULONG,
411 NVCacheStatus: ULONG,
412 NVCacheSubStatus: ULONG,
413}}
414pub type PNVCACHE_REQUEST_BLOCK = *mut NVCACHE_REQUEST_BLOCK;
415pub const NRB_FUNCTION_NVCACHE_INFO: USHORT = 0xEC;
416pub const NRB_FUNCTION_SPINDLE_STATUS: USHORT = 0xE5;
417pub const NRB_FUNCTION_NVCACHE_POWER_MODE_SET: USHORT = 0x00;
418pub const NRB_FUNCTION_NVCACHE_POWER_MODE_RETURN: USHORT = 0x01;
419pub const NRB_FUNCTION_FLUSH_NVCACHE: USHORT = 0x14;
420pub const NRB_FUNCTION_QUERY_PINNED_SET: USHORT = 0x12;
421pub const NRB_FUNCTION_QUERY_CACHE_MISS: USHORT = 0x13;
422pub const NRB_FUNCTION_ADD_LBAS_PINNED_SET: USHORT = 0x10;
423pub const NRB_FUNCTION_REMOVE_LBAS_PINNED_SET: USHORT = 0x11;
424pub const NRB_FUNCTION_QUERY_ASCENDER_STATUS: USHORT = 0xD0;
425pub const NRB_FUNCTION_QUERY_HYBRID_DISK_STATUS: USHORT = 0xD1;
426pub const NRB_FUNCTION_PASS_HINT_PAYLOAD: USHORT = 0xE0;
427pub const NRB_FUNCTION_NVSEPARATED_INFO: USHORT = 0xc0;
428pub const NRB_FUNCTION_NVSEPARATED_FLUSH: USHORT = 0xc1;
429pub const NRB_FUNCTION_NVSEPARATED_WB_DISABLE: USHORT = 0xc2;
430pub const NRB_FUNCTION_NVSEPARATED_WB_REVERT_DEFAULT: USHORT = 0xc3;
431pub const NRB_SUCCESS: ULONG = 0;
432pub const NRB_ILLEGAL_REQUEST: ULONG = 1;
433pub const NRB_INVALID_PARAMETER: ULONG = 2;
434pub const NRB_INPUT_DATA_OVERRUN: ULONG = 3;
435pub const NRB_INPUT_DATA_UNDERRUN: ULONG = 4;
436pub const NRB_OUTPUT_DATA_OVERRUN: ULONG = 5;
437pub const NRB_OUTPUT_DATA_UNDERRUN: ULONG = 6;
438STRUCT!{struct NV_FEATURE_PARAMETER {
439 NVPowerModeEnabled: USHORT,
440 NVParameterReserv1: USHORT,
441 NVCmdEnabled: USHORT,
442 NVParameterReserv2: USHORT,
443 NVPowerModeVer: USHORT,
444 NVCmdVer: USHORT,
445 NVSize: ULONG,
446 NVReadSpeed: USHORT,
447 NVWrtSpeed: USHORT,
448 DeviceSpinUpTime: ULONG,
449}}
450pub type PNV_FEATURE_PARAMETER = *mut NV_FEATURE_PARAMETER;
451STRUCT!{struct NVCACHE_HINT_PAYLOAD {
452 Command: UCHAR,
453 Feature7_0: UCHAR,
454 Feature15_8: UCHAR,
455 Count15_8: UCHAR,
456 LBA7_0: UCHAR,
457 LBA15_8: UCHAR,
458 LBA23_16: UCHAR,
459 LBA31_24: UCHAR,
460 LBA39_32: UCHAR,
461 LBA47_40: UCHAR,
462 Auxiliary7_0: UCHAR,
463 Auxiliary23_16: UCHAR,
464 Reserved: [UCHAR; 4],
465}}
466pub type PNVCACHE_HINT_PAYLOAD = *mut NVCACHE_HINT_PAYLOAD;
467STRUCT!{struct NV_SEP_CACHE_PARAMETER {
468 Version: ULONG,
469 Size: ULONG,
470 Flags: NV_SEP_CACHE_PARAMETER_Flags,
471 WriteCacheType: UCHAR,
472 WriteCacheTypeEffective: UCHAR,
473 ParameterReserve1: [UCHAR; 3],
474}}
475pub type PNV_SEP_CACHE_PARAMETER = *mut NV_SEP_CACHE_PARAMETER;
476UNION!{union NV_SEP_CACHE_PARAMETER_Flags {
477 [u8; 1],
478 CacheFlags CacheFlags_mut: NV_SEP_CACHE_PARAMETER_Flags_CacheFlags,
479 CacheFlagsSet CacheFlagsSet_mut: UCHAR,
480}}
481STRUCT!{struct NV_SEP_CACHE_PARAMETER_Flags_CacheFlags {
482 Bitfield: UCHAR,
483}}
484BITFIELD!{NV_SEP_CACHE_PARAMETER_Flags_CacheFlags Bitfield: UCHAR [
485 WriteCacheEnabled set_WriteCacheEnabled[0..1],
486 WriteCacheChangeable set_WriteCacheChangeable[1..2],
487 WriteThroughIOSupported set_WriteThroughIOSupported[2..3],
488 FlushCacheSupported set_FlushCacheSupported[3..4],
489 ReservedBits set_ReservedBits[4..8],
490]}
491pub const NV_SEP_CACHE_PARAMETER_VERSION_1: ULONG = 1;
492pub const NV_SEP_CACHE_PARAMETER_VERSION: ULONG = NV_SEP_CACHE_PARAMETER_VERSION_1;
493ENUM!{enum NV_SEP_WRITE_CACHE_TYPE {
494 NVSEPWriteCacheTypeUnknown = 0,
495 NVSEPWriteCacheTypeNone = 1,
496 NVSEPWriteCacheTypeWriteBack = 2,
497 NVSEPWriteCacheTypeWriteThrough = 3,
498}}
499pub type PNV_SEP_WRITE_CACHE_TYPE = *mut NV_SEP_WRITE_CACHE_TYPE;
500STRUCT!{struct MP_DEVICE_DATA_SET_RANGE {
501 StartingOffset: LONGLONG,
502 LengthInBytes: ULONGLONG,
503}}
504pub type PMP_DEVICE_DATA_SET_RANGE = *mut MP_DEVICE_DATA_SET_RANGE;
505STRUCT!{struct DSM_NOTIFICATION_REQUEST_BLOCK {
506 Size: ULONG,
507 Version: ULONG,
508 NotifyFlags: ULONG,
509 DataSetProfile: ULONG,
510 Reserved: [ULONG; 3],
511 DataSetRangesCount: ULONG,
512 DataSetRanges: [MP_DEVICE_DATA_SET_RANGE; ANYSIZE_ARRAY],
513}}
514pub type PDSM_NOTIFICATION_REQUEST_BLOCK = *mut DSM_NOTIFICATION_REQUEST_BLOCK;
515pub const MINIPORT_DSM_NOTIFICATION_VERSION_1: ULONG = 1;
516pub const MINIPORT_DSM_NOTIFICATION_VERSION: ULONG = MINIPORT_DSM_NOTIFICATION_VERSION_1;
517pub const MINIPORT_DSM_PROFILE_UNKNOWN: ULONG = 0;
518pub const MINIPORT_DSM_PROFILE_PAGE_FILE: ULONG = 1;
519pub const MINIPORT_DSM_PROFILE_HIBERNATION_FILE: ULONG = 2;
520pub const MINIPORT_DSM_PROFILE_CRASHDUMP_FILE: ULONG = 3;
521pub const MINIPORT_DSM_NOTIFY_FLAG_BEGIN: ULONG = 0x00000001;
522pub const MINIPORT_DSM_NOTIFY_FLAG_END: ULONG = 0x00000002;
523pub const HYBRID_FUNCTION_GET_INFO: ULONG = 0x01;
524pub const HYBRID_FUNCTION_DISABLE_CACHING_MEDIUM: ULONG = 0x10;
525pub const HYBRID_FUNCTION_ENABLE_CACHING_MEDIUM: ULONG = 0x11;
526pub const HYBRID_FUNCTION_SET_DIRTY_THRESHOLD: ULONG = 0x12;
527pub const HYBRID_FUNCTION_DEMOTE_BY_SIZE: ULONG = 0x13;
528pub const HYBRID_STATUS_SUCCESS: ULONG = 0x0;
529pub const HYBRID_STATUS_ILLEGAL_REQUEST: ULONG = 0x1;
530pub const HYBRID_STATUS_INVALID_PARAMETER: ULONG = 0x2;
531pub const HYBRID_STATUS_OUTPUT_BUFFER_TOO_SMALL: ULONG = 0x3;
532pub const HYBRID_STATUS_ENABLE_REFCOUNT_HOLD: ULONG = 0x10;
533pub const HYBRID_REQUEST_BLOCK_STRUCTURE_VERSION: ULONG = 0x1;
534STRUCT!{struct HYBRID_REQUEST_BLOCK {
535 Version: ULONG,
536 Size: ULONG,
537 Function: ULONG,
538 Flags: ULONG,
539 DataBufferOffset: ULONG,
540 DataBufferLength: ULONG,
541}}
542pub type PHYBRID_REQUEST_BLOCK = *mut HYBRID_REQUEST_BLOCK;
543ENUM!{enum NVCACHE_TYPE {
544 NvCacheTypeUnknown = 0,
545 NvCacheTypeNone = 1,
546 NvCacheTypeWriteBack = 2,
547 NvCacheTypeWriteThrough = 3,
548}}
549ENUM!{enum NVCACHE_STATUS {
550 NvCacheStatusUnknown = 0,
551 NvCacheStatusDisabling = 1,
552 NvCacheStatusDisabled = 2,
553 NvCacheStatusEnabled = 3,
554}}
555STRUCT!{struct NVCACHE_PRIORITY_LEVEL_DESCRIPTOR {
556 PriorityLevel: UCHAR,
557 Reserved0: [UCHAR; 3],
558 ConsumedNVMSizeFraction: ULONG,
559 ConsumedMappingResourcesFraction: ULONG,
560 ConsumedNVMSizeForDirtyDataFraction: ULONG,
561 ConsumedMappingResourcesForDirtyDataFraction: ULONG,
562 Reserved1: ULONG,
563}}
564pub type PNVCACHE_PRIORITY_LEVEL_DESCRIPTOR = *mut NVCACHE_PRIORITY_LEVEL_DESCRIPTOR;
565pub const HYBRID_REQUEST_INFO_STRUCTURE_VERSION: ULONG = 1;
566STRUCT!{struct HYBRID_INFORMATION {
567 Version: ULONG,
568 Size: ULONG,
569 HybridSupported: BOOLEAN,
570 Status: NVCACHE_STATUS,
571 CacheTypeEffective: NVCACHE_TYPE,
572 CacheTypeDefault: NVCACHE_TYPE,
573 FractionBase: ULONG,
574 CacheSize: ULONGLONG,
575 Attributes: HYBRID_INFORMATION_Attributes,
576 Priorities: HYBRID_INFORMATION_Priorities,
577}}
578pub type PHYBRID_INFORMATION = *mut HYBRID_INFORMATION;
579STRUCT!{struct HYBRID_INFORMATION_Attributes {
580 Bitfield: ULONG,
581}}
582BITFIELD!{HYBRID_INFORMATION_Attributes Bitfield: ULONG [
583 WriteCacheChangeable set_WriteCacheChangeable[0..1],
584 WriteThroughIoSupported set_WriteThroughIoSupported[1..2],
585 FlushCacheSupported set_FlushCacheSupported[2..3],
586 Removable set_Removable[3..4],
587 ReservedBits set_ReservedBits[4..32],
588]}
589STRUCT!{struct HYBRID_INFORMATION_Priorities {
590 PriorityLevelCount: UCHAR,
591 MaxPriorityBehavior: BOOLEAN,
592 OptimalWriteGranularity: UCHAR,
593 Reserved: UCHAR,
594 DirtyThresholdLow: ULONG,
595 DirtyThresholdHigh: ULONG,
596 SupportedCommands: HYBRID_INFORMATION_Priorities_SupportedCommands,
597 Priority: [NVCACHE_PRIORITY_LEVEL_DESCRIPTOR; 0],
598}}
599STRUCT!{struct HYBRID_INFORMATION_Priorities_SupportedCommands {
600 Bitfield: ULONG,
601 MaxEvictCommands: ULONG,
602 MaxLbaRangeCountForEvict: ULONG,
603 MaxLbaRangeCountForChangeLba: ULONG,
604}}
605BITFIELD!{HYBRID_INFORMATION_Priorities_SupportedCommands Bitfield: ULONG [
606 CacheDisable set_CacheDisable[0..1],
607 SetDirtyThreshold set_SetDirtyThreshold[1..2],
608 PriorityDemoteBySize set_PriorityDemoteBySize[2..3],
609 PriorityChangeByLbaRange set_PriorityChangeByLbaRange[3..4],
610 Evict set_Evict[4..5],
611 ReservedBits set_ReservedBits[5..32],
612]}
613STRUCT!{struct HYBRID_DIRTY_THRESHOLDS {
614 Version: ULONG,
615 Size: ULONG,
616 DirtyLowThreshold: ULONG,
617 DirtyHighThreshold: ULONG,
618}}
619pub type PHYBRID_DIRTY_THRESHOLDS = *mut HYBRID_DIRTY_THRESHOLDS;
620STRUCT!{struct HYBRID_DEMOTE_BY_SIZE {
621 Version: ULONG,
622 Size: ULONG,
623 SourcePriority: UCHAR,
624 TargetPriority: UCHAR,
625 Reserved0: USHORT,
626 Reserved1: ULONG,
627 LbaCount: ULONGLONG,
628}}
629pub type PHYBRID_DEMOTE_BY_SIZE = *mut HYBRID_DEMOTE_BY_SIZE;
630pub const FIRMWARE_FUNCTION_GET_INFO: ULONG = 0x01;
631pub const FIRMWARE_FUNCTION_DOWNLOAD: ULONG = 0x02;
632pub const FIRMWARE_FUNCTION_ACTIVATE: ULONG = 0x03;
633pub const FIRMWARE_STATUS_SUCCESS: ULONG = 0x0;
634pub const FIRMWARE_STATUS_ERROR: ULONG = 0x1;
635pub const FIRMWARE_STATUS_ILLEGAL_REQUEST: ULONG = 0x2;
636pub const FIRMWARE_STATUS_INVALID_PARAMETER: ULONG = 0x3;
637pub const FIRMWARE_STATUS_INPUT_BUFFER_TOO_BIG: ULONG = 0x4;
638pub const FIRMWARE_STATUS_OUTPUT_BUFFER_TOO_SMALL: ULONG = 0x5;
639pub const FIRMWARE_STATUS_INVALID_SLOT: ULONG = 0x6;
640pub const FIRMWARE_STATUS_INVALID_IMAGE: ULONG = 0x7;
641pub const FIRMWARE_STATUS_CONTROLLER_ERROR: ULONG = 0x10;
642pub const FIRMWARE_STATUS_POWER_CYCLE_REQUIRED: ULONG = 0x20;
643pub const FIRMWARE_STATUS_DEVICE_ERROR: ULONG = 0x40;
644pub const FIRMWARE_STATUS_INTERFACE_CRC_ERROR: ULONG = 0x80;
645pub const FIRMWARE_STATUS_UNCORRECTABLE_DATA_ERROR: ULONG = 0x81;
646pub const FIRMWARE_STATUS_MEDIA_CHANGE: ULONG = 0x82;
647pub const FIRMWARE_STATUS_ID_NOT_FOUND: ULONG = 0x83;
648pub const FIRMWARE_STATUS_MEDIA_CHANGE_REQUEST: ULONG = 0x84;
649pub const FIRMWARE_STATUS_COMMAND_ABORT: ULONG = 0x85;
650pub const FIRMWARE_STATUS_END_OF_MEDIA: ULONG = 0x86;
651pub const FIRMWARE_STATUS_ILLEGAL_LENGTH: ULONG = 0x87;
652pub const FIRMWARE_REQUEST_BLOCK_STRUCTURE_VERSION: ULONG = 0x1;
653STRUCT!{struct FIRMWARE_REQUEST_BLOCK {
654 Version: ULONG,
655 Size: ULONG,
656 Function: ULONG,
657 Flags: ULONG,
658 DataBufferOffset: ULONG,
659 DataBufferLength: ULONG,
660}}
661pub type PFIRMWARE_REQUEST_BLOCK = *mut FIRMWARE_REQUEST_BLOCK;
662pub const FIRMWARE_REQUEST_FLAG_CONTROLLER: ULONG = 0x00000001;
663pub const FIRMWARE_REQUEST_FLAG_LAST_SEGMENT: ULONG = 0x00000002;
664pub const FIRMWARE_REQUEST_FLAG_SWITCH_TO_EXISTING_FIRMWARE: ULONG = 0x80000000;
665pub const STORAGE_FIRMWARE_INFO_STRUCTURE_VERSION: ULONG = 0x1;
666pub const STORAGE_FIRMWARE_INFO_STRUCTURE_VERSION_V2: ULONG = 0x2;
667pub const STORAGE_FIRMWARE_INFO_INVALID_SLOT: UCHAR = 0xFF;
668STRUCT!{struct STORAGE_FIRMWARE_SLOT_INFO {
669 SlotNumber: UCHAR,
670 ReadOnly: BOOLEAN,
671 Reserved: [UCHAR; 6],
672 Revision: STORAGE_FIRMWARE_SLOT_INFO_Revision,
673}}
674pub type PSTORAGE_FIRMWARE_SLOT_INFO = *mut STORAGE_FIRMWARE_SLOT_INFO;
675UNION!{union STORAGE_FIRMWARE_SLOT_INFO_Revision {
676 [u64; 1],
677 Info Info_mut: [UCHAR; 8],
678 AsUlonglong AsUlonglong_mut: ULONGLONG,
679}}
680pub const STORAGE_FIRMWARE_SLOT_INFO_V2_REVISION_LENGTH: usize = 16;
681STRUCT!{struct STORAGE_FIRMWARE_SLOT_INFO_V2 {
682 SlotNumber: UCHAR,
683 ReadOnly: BOOLEAN,
684 Reserved: [UCHAR; 6],
685 Revision: [UCHAR; STORAGE_FIRMWARE_SLOT_INFO_V2_REVISION_LENGTH],
686}}
687pub type PSTORAGE_FIRMWARE_SLOT_INFO_V2 = *mut STORAGE_FIRMWARE_SLOT_INFO_V2;
688STRUCT!{struct STORAGE_FIRMWARE_INFO {
689 Version: ULONG,
690 Size: ULONG,
691 UpgradeSupport: BOOLEAN,
692 SlotCount: UCHAR,
693 ActiveSlot: UCHAR,
694 PendingActivateSlot: UCHAR,
695 Reserved: ULONG,
696 Slot: [STORAGE_FIRMWARE_SLOT_INFO; 0],
697}}
698pub type PSTORAGE_FIRMWARE_INFO = *mut STORAGE_FIRMWARE_INFO;
699STRUCT!{struct STORAGE_FIRMWARE_INFO_V2 {
700 Version: ULONG,
701 Size: ULONG,
702 UpgradeSupport: BOOLEAN,
703 SlotCount: UCHAR,
704 ActiveSlot: UCHAR,
705 PendingActivateSlot: UCHAR,
706 FirmwareShared: BOOLEAN,
707 Reserved: [UCHAR; 3],
708 ImagePayloadAlignment: ULONG,
709 ImagePayloadMaxSize: ULONG,
710 Slot: [STORAGE_FIRMWARE_SLOT_INFO_V2; 0],
711}}
712pub type PSTORAGE_FIRMWARE_INFO_V2 = *mut STORAGE_FIRMWARE_INFO_V2;
713pub const STORAGE_FIRMWARE_DOWNLOAD_STRUCTURE_VERSION: ULONG = 0x1;
714pub const STORAGE_FIRMWARE_DOWNLOAD_STRUCTURE_VERSION_V2: ULONG = 0x2;
715STRUCT!{struct STORAGE_FIRMWARE_DOWNLOAD {
716 Version: ULONG,
717 Size: ULONG,
718 Offset: ULONGLONG,
719 BufferSize: ULONGLONG,
720 ImageBuffer: [UCHAR; 0],
721}}
722pub type PSTORAGE_FIRMWARE_DOWNLOAD = *mut STORAGE_FIRMWARE_DOWNLOAD;
723STRUCT!{struct STORAGE_FIRMWARE_DOWNLOAD_V2 {
724 Version: ULONG,
725 Size: ULONG,
726 Offset: ULONGLONG,
727 BufferSize: ULONGLONG,
728 Slot: UCHAR,
729 Reserved: [UCHAR; 7],
730 ImageBuffer: [UCHAR; 0],
731}}
732pub type PSTORAGE_FIRMWARE_DOWNLOAD_V2 = *mut STORAGE_FIRMWARE_DOWNLOAD_V2;
733pub const STORAGE_FIRMWARE_ACTIVATE_STRUCTURE_VERSION: ULONG = 0x1;
734STRUCT!{struct STORAGE_FIRMWARE_ACTIVATE {
735 Version: ULONG,
736 Size: ULONG,
737 SlotToActivate: UCHAR,
738 Reserved0: [UCHAR; 3],
739}}
740pub type PSTORAGE_FIRMWARE_ACTIVATE = *mut STORAGE_FIRMWARE_ACTIVATE;
741STRUCT!{struct IO_SCSI_CAPABILITIES {
742 Length: ULONG,
743 MaximumTransferLength: ULONG,
744 MaximumPhysicalPages: ULONG,
745 SupportedAsynchronousEvents: ULONG,
746 AlignmentMask: ULONG,
747 TaggedQueuing: BOOLEAN,
748 AdapterScansDown: BOOLEAN,
749 AdapterUsesPio: BOOLEAN,
750}}
751pub type PIO_SCSI_CAPABILITIES = *mut IO_SCSI_CAPABILITIES;
752STRUCT!{struct SCSI_ADDRESS {
753 Length: ULONG,
754 PortNumber: UCHAR,
755 PathId: UCHAR,
756 TargetId: UCHAR,
757 Lun: UCHAR,
758}}
759pub type PSCSI_ADDRESS = *mut SCSI_ADDRESS;
760pub const DUMP_POINTERS_VERSION_1: ULONG = 1;
761pub const DUMP_POINTERS_VERSION_2: ULONG = 2;
762pub const DUMP_POINTERS_VERSION_3: ULONG = 3;
763pub const DUMP_POINTERS_VERSION_4: ULONG = 4;
764pub const DUMP_DRIVER_NAME_LENGTH: usize = 15;
765FN!{cdecl DUMP_DEVICE_POWERON_ROUTINE(
766 Context: PVOID,
767) -> LONG}
768pub type PDUMP_DEVICE_POWERON_ROUTINE = *mut DUMP_DEVICE_POWERON_ROUTINE;
769STRUCT!{struct DUMP_POINTERS_VERSION {
770 Version: ULONG,
771 Size: ULONG,
772}}
773pub type PDUMP_POINTERS_VERSION = *mut DUMP_POINTERS_VERSION;
774STRUCT!{struct DUMP_POINTERS {
775 AdapterObject: PVOID, MappedRegisterBase: PVOID,
777 DumpData: PVOID,
778 CommonBufferVa: PVOID,
779 CommonBufferPa: LARGE_INTEGER,
780 CommonBufferSize: ULONG,
781 AllocateCommonBuffers: BOOLEAN,
782 UseDiskDump: BOOLEAN,
783 Spare1: [UCHAR; 2],
784 DeviceObject: PVOID,
785}}
786pub type PDUMP_POINTERS = *mut DUMP_POINTERS;
787STRUCT!{struct DUMP_POINTERS_EX {
788 Header: DUMP_POINTERS_VERSION,
789 DumpData: PVOID,
790 CommonBufferVa: PVOID,
791 CommonBufferSize: ULONG,
792 AllocateCommonBuffers: BOOLEAN,
793 DeviceObject: PVOID,
794 DriverList: PVOID,
795 dwPortFlags: ULONG,
796 MaxDeviceDumpSectionSize: ULONG,
797 MaxDeviceDumpLevel: ULONG,
798 MaxTransferSize: ULONG,
799 AdapterObject: PVOID,
800 MappedRegisterBase: PVOID,
801 DeviceReady: PBOOLEAN,
802 DumpDevicePowerOn: PDUMP_DEVICE_POWERON_ROUTINE,
803 DumpDevicePowerOnContext: PVOID,
804}}
805pub type PDUMP_POINTERS_EX = *mut DUMP_POINTERS_EX;
806#[cfg(target_pointer_width = "32")]
808IFDEF!{
809pub const DUMP_POINTERS_EX_V2_SIZE: ULONG = 32;
810pub const DUMP_POINTERS_EX_V3_SIZE: ULONG = 60;
811pub const DUMP_POINTERS_EX_V4_SIZE: ULONG = 68;
812}
813#[cfg(target_pointer_width = "64")]
814IFDEF!{
815pub const DUMP_POINTERS_EX_V2_SIZE: ULONG = 48;
816pub const DUMP_POINTERS_EX_V3_SIZE: ULONG = 88;
817pub const DUMP_POINTERS_EX_V4_SIZE: ULONG = 104;
818}
819pub const DUMP_EX_FLAG_SUPPORT_64BITMEMORY: ULONG = 0x00000001;
820pub const DUMP_EX_FLAG_SUPPORT_DD_TELEMETRY: ULONG = 0x00000002;
821pub const DUMP_EX_FLAG_RESUME_SUPPORT: ULONG = 0x00000004;
822STRUCT!{struct DUMP_DRIVER {
823 DumpDriverList: PVOID,
824 DriverName: [WCHAR; DUMP_DRIVER_NAME_LENGTH],
825 BaseName: [WCHAR; DUMP_DRIVER_NAME_LENGTH],
826}}
827pub type PDUMP_DRIVER = *mut DUMP_DRIVER;
828pub const SCSI_IOCTL_DATA_OUT: UCHAR = 0;
829pub const SCSI_IOCTL_DATA_IN: UCHAR = 1;
830pub const SCSI_IOCTL_DATA_UNSPECIFIED: UCHAR = 2;
831pub const SCSI_IOCTL_DATA_BIDIRECTIONAL: UCHAR = 3;
832pub const MPIO_IOCTL_FLAG_USE_PATHID: UCHAR = 1;
833pub const MPIO_IOCTL_FLAG_USE_SCSIADDRESS: UCHAR = 2;
834pub const MPIO_IOCTL_FLAG_INVOLVE_DSM: UCHAR = 4;