winapi_ui_automation/shared/
ntddscsi.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6//! Constants and types for accessing SCSI port adapters.
7use 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, // Rust doesn't have anything like __ptr32
127    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, // struct _ADAPTER_OBJECT *
776    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// TODO: Revisit these definitions when const size_of and offset_of! arrive.
807#[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;