| // Licensed under the Apache License, Version 2.0 |
| // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license |
| // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option. |
| // All files in the project carrying such notice may not be copied, modified, or distributed |
| // except according to those terms. |
| //! Constants and types for accessing SCSI port adapters. |
| use shared::basetsd::{ULONG32, ULONG_PTR}; |
| use shared::minwindef::{UCHAR, ULONG, USHORT}; |
| use shared::ntdef::{LARGE_INTEGER, LONG, LONGLONG, PVOID, ULONGLONG, VOID, WCHAR}; |
| use um::winioctl::{ |
| DEVICE_TYPE, FILE_ANY_ACCESS, FILE_DEVICE_CONTROLLER, FILE_READ_ACCESS, |
| FILE_WRITE_ACCESS, METHOD_BUFFERED |
| }; |
| use um::winnt::{ANYSIZE_ARRAY, BOOLEAN, PBOOLEAN}; |
| DEFINE_GUID!{ScsiRawInterfaceGuid, |
| 0x53f56309, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b} |
| DEFINE_GUID!{WmiScsiAddressGuid, |
| 0x53f5630f, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b} |
| pub const IOCTL_SCSI_BASE: DEVICE_TYPE = FILE_DEVICE_CONTROLLER; |
| pub const FILE_DEVICE_SCSI: ULONG = 0x0000001; |
| pub const DD_SCSI_DEVICE_NAME: &'static str = "\\Device\\ScsiPort"; |
| pub const IOCTL_SCSI_PASS_THROUGH: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_SCSI_MINIPORT: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_SCSI_GET_INQUIRY_DATA: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS); |
| pub const IOCTL_SCSI_GET_CAPABILITIES: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS); |
| pub const IOCTL_SCSI_PASS_THROUGH_DIRECT: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_SCSI_GET_ADDRESS: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS); |
| pub const IOCTL_SCSI_RESCAN_BUS: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS); |
| pub const IOCTL_SCSI_GET_DUMP_POINTERS: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0408, METHOD_BUFFERED, FILE_ANY_ACCESS); |
| pub const IOCTL_SCSI_FREE_DUMP_POINTERS: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0409, METHOD_BUFFERED, FILE_ANY_ACCESS); |
| pub const IOCTL_IDE_PASS_THROUGH: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x040a, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_ATA_PASS_THROUGH: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x040b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_ATA_PASS_THROUGH_DIRECT: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x040c, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_ATA_MINIPORT: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x040d, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_MINIPORT_PROCESS_SERVICE_IRP: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x040e, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_MPIO_PASS_THROUGH_PATH: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x040f, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_MPIO_PASS_THROUGH_PATH_DIRECT: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0410, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_SCSI_PASS_THROUGH_EX: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0411, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_SCSI_PASS_THROUGH_DIRECT_EX: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0412, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_MPIO_PASS_THROUGH_PATH_EX: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0413, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_MPIO_PASS_THROUGH_PATH_DIRECT_EX: ULONG = |
| CTL_CODE!(IOCTL_SCSI_BASE, 0x0414, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS); |
| pub const IOCTL_SCSI_MINIPORT_NVCACHE: ULONG = (FILE_DEVICE_SCSI << 16) + 0x0600; |
| pub const IOCTL_SCSI_MINIPORT_HYBRID: ULONG = (FILE_DEVICE_SCSI << 16) + 0x0620; |
| pub const IOCTL_SCSI_MINIPORT_FIRMWARE: ULONG = (FILE_DEVICE_SCSI << 16) + 0x0780; |
| STRUCT!{struct SCSI_PASS_THROUGH { |
| Length: USHORT, |
| ScsiStatus: UCHAR, |
| PathId: UCHAR, |
| TargetId: UCHAR, |
| Lun: UCHAR, |
| CdbLength: UCHAR, |
| SenseInfoLength: UCHAR, |
| DataIn: UCHAR, |
| DataTransferLength: ULONG, |
| TimeOutValue: ULONG, |
| DataBufferOffset: ULONG_PTR, |
| SenseInfoOffset: ULONG, |
| Cdb: [UCHAR; 16], |
| }} |
| pub type PSCSI_PASS_THROUGH = *mut SCSI_PASS_THROUGH; |
| STRUCT!{struct SCSI_PASS_THROUGH_DIRECT { |
| Length: USHORT, |
| ScsiStatus: UCHAR, |
| PathId: UCHAR, |
| TargetId: UCHAR, |
| Lun: UCHAR, |
| CdbLength: UCHAR, |
| SenseInfoLength: UCHAR, |
| DataIn: UCHAR, |
| DataTransferLength: ULONG, |
| TimeOutValue: ULONG, |
| DataBuffer: PVOID, |
| SenseInfoOffset: ULONG, |
| Cdb: [UCHAR; 16], |
| }} |
| pub type PSCSI_PASS_THROUGH_DIRECT = *mut SCSI_PASS_THROUGH_DIRECT; |
| STRUCT!{struct SCSI_PASS_THROUGH32 { |
| Length: USHORT, |
| ScsiStatus: UCHAR, |
| PathId: UCHAR, |
| TargetId: UCHAR, |
| Lun: UCHAR, |
| CdbLength: UCHAR, |
| SenseInfoLength: UCHAR, |
| DataIn: UCHAR, |
| DataTransferLength: ULONG, |
| TimeOutValue: ULONG, |
| DataBufferOffset: ULONG32, |
| SenseInfoOffset: ULONG, |
| Cdb: [UCHAR; 16], |
| }} |
| #[cfg(target_arch = "x86_64")] |
| IFDEF!{ |
| pub type PSCSI_PASS_THROUGH32 = *mut SCSI_PASS_THROUGH32; |
| STRUCT!{struct SCSI_PASS_THROUGH_DIRECT32 { |
| Length: USHORT, |
| ScsiStatus: UCHAR, |
| PathId: UCHAR, |
| TargetId: UCHAR, |
| Lun: UCHAR, |
| CdbLength: UCHAR, |
| SenseInfoLength: UCHAR, |
| DataIn: UCHAR, |
| DataTransferLength: ULONG, |
| TimeOutValue: ULONG, |
| DataBuffer: ULONG32, // Rust doesn't have anything like __ptr32 |
| SenseInfoOffset: ULONG, |
| Cdb: [UCHAR; 16], |
| }} |
| pub type PSCSI_PASS_THROUGH_DIRECT32 = *mut SCSI_PASS_THROUGH_DIRECT32; |
| } |
| STRUCT!{struct SCSI_PASS_THROUGH_EX { |
| Version: ULONG, |
| Length: ULONG, |
| CdbLength: ULONG, |
| StorAddressLength: ULONG, |
| ScsiStatus: UCHAR, |
| SenseInfolength: UCHAR, |
| DataDirection: UCHAR, |
| Reserved: UCHAR, |
| TimeOutValue: ULONG, |
| StorAddressOffset: ULONG, |
| SenseInfoOffset: ULONG, |
| DataOutTransferLength: ULONG, |
| DataInTransferLength: ULONG, |
| DataOutBufferOffset: ULONG_PTR, |
| DataInBufferOffset: ULONG_PTR, |
| Cdb: [UCHAR; ANYSIZE_ARRAY], |
| }} |
| pub type PSCSI_PASS_THROUGH_EX = *mut SCSI_PASS_THROUGH_EX; |
| STRUCT!{struct SCSI_PASS_THROUGH_DIRECT_EX { |
| Version: ULONG, |
| Length: ULONG, |
| CdbLength: ULONG, |
| StorAddressLength: ULONG, |
| ScsiStatus: UCHAR, |
| SenseInfolength: UCHAR, |
| DataDirection: UCHAR, |
| Reserved: UCHAR, |
| TimeOutValue: ULONG, |
| StorAddressOffset: ULONG, |
| SenseInfoOffset: ULONG, |
| DataOutTransferLength: ULONG, |
| DataInTransferLength: ULONG, |
| DataOutBuffer: *mut VOID, |
| DataInBuffer: *mut VOID, |
| Cdb: [UCHAR; ANYSIZE_ARRAY], |
| }} |
| pub type PSCSI_PASS_THROUGH_DIRECT_EX = *mut SCSI_PASS_THROUGH_DIRECT_EX; |
| #[cfg(target_arch = "x86_64")] |
| IFDEF!{ |
| STRUCT!{struct SCSI_PASS_THROUGH32_EX { |
| Version: ULONG, |
| Length: ULONG, |
| CdbLength: ULONG, |
| StorAddressLength: ULONG, |
| ScsiStatus: UCHAR, |
| SenseInfolength: UCHAR, |
| DataDirection: UCHAR, |
| Reserved: UCHAR, |
| TimeOutValue: ULONG, |
| StorAddressOffset: ULONG, |
| SenseInfoOffset: ULONG, |
| DataOutTransferLength: ULONG, |
| DataInTransferLength: ULONG, |
| DataOutBufferOffset: ULONG32, |
| DataInBufferOffset: ULONG32, |
| Cdb: [UCHAR; ANYSIZE_ARRAY], |
| }} |
| pub type PSCSI_PASS_THROUGH32_EX = *mut SCSI_PASS_THROUGH32_EX; |
| STRUCT!{struct SCSI_PASS_THROUGH_DIRECT32_EX { |
| Version: ULONG, |
| Length: ULONG, |
| CdbLength: ULONG, |
| StorAddressLength: ULONG, |
| ScsiStatus: UCHAR, |
| SenseInfolength: UCHAR, |
| DataDirection: UCHAR, |
| Reserved: UCHAR, |
| TimeOutValue: ULONG, |
| StorAddressOffset: ULONG, |
| SenseInfoOffset: ULONG, |
| DataOutTransferLength: ULONG, |
| DataInTransferLength: ULONG, |
| DataOutBuffer: ULONG32, |
| DataInBuffer: ULONG32, |
| Cdb: [UCHAR; ANYSIZE_ARRAY], |
| }} |
| pub type PSCSI_PASS_THROUGH_DIRECT32_EX = *mut SCSI_PASS_THROUGH_DIRECT32_EX; |
| } |
| STRUCT!{struct ATA_PASS_THROUGH_EX { |
| Length: USHORT, |
| AtaFlags: USHORT, |
| PathId: UCHAR, |
| TargetId: UCHAR, |
| Lun: UCHAR, |
| ReservedAsUchar: UCHAR, |
| DataTransferLength: ULONG, |
| TimeOutValue: ULONG, |
| ReservedAsUlong: ULONG, |
| DataBufferOffset: ULONG_PTR, |
| PreviousTaskFile: [UCHAR; 8], |
| CurrentTaskFile: [UCHAR; 8], |
| }} |
| pub type PATA_PASS_THROUGH_EX = *mut ATA_PASS_THROUGH_EX; |
| STRUCT!{struct ATA_PASS_THROUGH_DIRECT { |
| Length: USHORT, |
| AtaFlags: USHORT, |
| PathId: UCHAR, |
| TargetId: UCHAR, |
| Lun: UCHAR, |
| ReservedAsUchar: UCHAR, |
| DataTransferLength: ULONG, |
| TimeOutValue: ULONG, |
| ReservedAsUlong: ULONG, |
| DataBuffer: PVOID, |
| PreviousTaskFile: [UCHAR; 8], |
| CurrentTaskFile: [UCHAR; 8], |
| }} |
| pub type PATA_PASS_THROUGH_DIRECT = *mut ATA_PASS_THROUGH_DIRECT; |
| #[cfg(target_arch = "x86_64")] |
| IFDEF!{ |
| STRUCT!{struct ATA_PASS_THROUGH_EX32 { |
| Length: USHORT, |
| AtaFlags: USHORT, |
| PathId: UCHAR, |
| TargetId: UCHAR, |
| Lun: UCHAR, |
| ReservedAsUchar: UCHAR, |
| DataTransferLength: ULONG, |
| TimeOutValue: ULONG, |
| ReservedAsUlong: ULONG, |
| DataBufferOffset: ULONG32, |
| PreviousTaskFile: [UCHAR; 8], |
| CurrentTaskFile: [UCHAR; 8], |
| }} |
| pub type PATA_PASS_THROUGH_EX32 = *mut ATA_PASS_THROUGH_EX32; |
| STRUCT!{struct ATA_PASS_THROUGH_DIRECT32 { |
| Length: USHORT, |
| AtaFlags: USHORT, |
| PathId: UCHAR, |
| TargetId: UCHAR, |
| Lun: UCHAR, |
| ReservedAsUchar: UCHAR, |
| DataTransferLength: ULONG, |
| TimeOutValue: ULONG, |
| ReservedAsUlong: ULONG, |
| DataBuffer: ULONG32, |
| PreviousTaskFile: [UCHAR; 8], |
| CurrentTaskFile: [UCHAR; 8], |
| }} |
| pub type PATA_PASS_THROUGH_DIRECT32 = *mut ATA_PASS_THROUGH_DIRECT32; |
| } |
| pub const ATA_FLAGS_DRDY_REQUIRED: USHORT = 1 << 0; |
| pub const ATA_FLAGS_DATA_IN: USHORT = 1 << 1; |
| pub const ATA_FLAGS_DATA_OUT: USHORT = 1 << 2; |
| pub const ATA_FLAGS_48BIT_COMMAND: USHORT = 1 << 3; |
| pub const ATA_FLAGS_USE_DMA: USHORT = 1 << 4; |
| pub const ATA_FLAGS_NO_MULTIPLE: USHORT = 1 << 5; |
| STRUCT!{struct IDE_IO_CONTROL { |
| HeaderLength: ULONG, |
| Signature: [UCHAR; 8], |
| Timeout: ULONG, |
| ControlCode: ULONG, |
| ReturnStatus: ULONG, |
| DataLength: ULONG, |
| }} |
| pub type PIDE_IO_CONTROL = *mut IDE_IO_CONTROL; |
| STRUCT!{struct MPIO_PASS_THROUGH_PATH { |
| PassThrough: SCSI_PASS_THROUGH, |
| Version: ULONG, |
| Length: USHORT, |
| Flags: UCHAR, |
| PortNumber: UCHAR, |
| MpioPathId: ULONGLONG, |
| }} |
| pub type PMPIO_PASS_THROUGH_PATH = *mut MPIO_PASS_THROUGH_PATH; |
| STRUCT!{struct MPIO_PASS_THROUGH_PATH_DIRECT { |
| PassThrough: SCSI_PASS_THROUGH_DIRECT, |
| Version: ULONG, |
| Length: USHORT, |
| Flags: UCHAR, |
| PortNumber: UCHAR, |
| MpioPathId: ULONGLONG, |
| }} |
| pub type PMPIO_PASS_THROUGH_PATH_DIRECT = *mut MPIO_PASS_THROUGH_PATH_DIRECT; |
| STRUCT!{struct MPIO_PASS_THROUGH_PATH_EX { |
| PassThroughOffset: ULONG, |
| Version: ULONG, |
| Length: USHORT, |
| Flags: UCHAR, |
| PortNumber: UCHAR, |
| MpioPathId: ULONGLONG, |
| }} |
| pub type PMPIO_PASS_THROUGH_PATH_EX = *mut MPIO_PASS_THROUGH_PATH_EX; |
| STRUCT!{struct MPIO_PASS_THROUGH_PATH_DIRECT_EX { |
| PassThroughOffset: ULONG, |
| Version: ULONG, |
| Length: USHORT, |
| Flags: UCHAR, |
| PortNumber: UCHAR, |
| MpioPathId: ULONGLONG, |
| }} |
| pub type PMPIO_PASS_THROUGH_PATH_DIRECT_EX = *mut MPIO_PASS_THROUGH_PATH_DIRECT_EX; |
| #[cfg(target_arch = "x86_64")] |
| IFDEF!{ |
| STRUCT!{struct MPIO_PASS_THROUGH_PATH32 { |
| PassThrough: SCSI_PASS_THROUGH32, |
| Version: ULONG, |
| Length: USHORT, |
| Flags: UCHAR, |
| PortNumber: UCHAR, |
| MpioPathId: ULONGLONG, |
| }} |
| pub type PMPIO_PASS_THROUGH_PATH32 = *mut MPIO_PASS_THROUGH_PATH32; |
| STRUCT!{struct MPIO_PASS_THROUGH_PATH_DIRECT32 { |
| PassThrough: SCSI_PASS_THROUGH_DIRECT32, |
| Version: ULONG, |
| Length: USHORT, |
| Flags: UCHAR, |
| PortNumber: UCHAR, |
| MpioPathId: ULONGLONG, |
| }} |
| pub type PMPIO_PASS_THROUGH_PATH_DIRECT32 = *mut MPIO_PASS_THROUGH_PATH_DIRECT32; |
| STRUCT!{struct MPIO_PASS_THROUGH_PATH32_EX { |
| PassThroughOffset: ULONG, |
| Version: ULONG, |
| Length: USHORT, |
| Flags: UCHAR, |
| PortNumber: UCHAR, |
| MpioPathId: ULONGLONG, |
| }} |
| pub type PMPIO_PASS_THROUGH_PATH32_EX = *mut MPIO_PASS_THROUGH_PATH32_EX; |
| STRUCT!{struct MPIO_PASS_THROUGH_PATH_DIRECT32_EX { |
| PassThroughOffset: ULONG, |
| Version: ULONG, |
| Length: USHORT, |
| Flags: UCHAR, |
| PortNumber: UCHAR, |
| MpioPathId: ULONGLONG, |
| }} |
| pub type PMPIO_PASS_THROUGH_PATH_DIRECT32_EX = *mut MPIO_PASS_THROUGH_PATH_DIRECT32_EX; |
| } |
| STRUCT!{struct SCSI_BUS_DATA { |
| NumberOfLogicalUnits: UCHAR, |
| InitiatorBusId: UCHAR, |
| InquiryDataOffset: ULONG, |
| }} |
| pub type PSCSI_BUS_DATA = *mut SCSI_BUS_DATA; |
| STRUCT!{struct SCSI_ADAPTER_BUS_INFO { |
| NumberOfBuses: UCHAR, |
| BusData: [SCSI_BUS_DATA; 1], |
| }} |
| pub type PSCSI_ADAPTER_BUS_INFO = *mut SCSI_ADAPTER_BUS_INFO; |
| STRUCT!{struct SCSI_INQUIRY_DATA { |
| PathId: UCHAR, |
| TargetId: UCHAR, |
| Lun: UCHAR, |
| DeviceClaimed: BOOLEAN, |
| InquiryDataLength: ULONG, |
| NextInquiryDataOffset: ULONG, |
| InquiryData: [UCHAR; 1], |
| }} |
| pub type PSCSI_INQUIRY_DATA = *mut SCSI_INQUIRY_DATA; |
| pub const IOCTL_MINIPORT_SIGNATURE_SCSIDISK: &'static str = "SCSIDISK"; |
| pub const IOCTL_MINIPORT_SIGNATURE_HYBRDISK: &'static str = "HYBRDISK"; |
| pub const IOCTL_MINIPORT_SIGNATURE_DSM_NOTIFICATION: &'static str = "MPDSM "; |
| pub const IOCTL_MINIPORT_SIGNATURE_DSM_GENERAL: &'static str = "MPDSMGEN"; |
| pub const IOCTL_MINIPORT_SIGNATURE_FIRMWARE: &'static str = "FIRMWARE"; |
| pub const IOCTL_MINIPORT_SIGNATURE_QUERY_PROTOCOL: &'static str = "PROTOCOL"; |
| pub const IOCTL_MINIPORT_SIGNATURE_QUERY_TEMPERATURE: &'static str = "TEMPERAT"; |
| pub const IOCTL_MINIPORT_SIGNATURE_SET_TEMPERATURE_THRESHOLD: &'static str = "SETTEMPT"; |
| pub const IOCTL_MINIPORT_SIGNATURE_QUERY_PHYSICAL_TOPOLOGY: &'static str = "TOPOLOGY"; |
| STRUCT!{struct SRB_IO_CONTROL { |
| HeaderLength: ULONG, |
| Signature: [UCHAR; 8], |
| Timeout: ULONG, |
| ControlCode: ULONG, |
| ReturnCode: ULONG, |
| Length: ULONG, |
| }} |
| pub type PSRB_IO_CONTROL = *mut SRB_IO_CONTROL; |
| STRUCT!{struct NVCACHE_REQUEST_BLOCK { |
| NRBSize: ULONG, |
| Function: USHORT, |
| NRBFlags: ULONG, |
| NRBStatus: ULONG, |
| Count: ULONG, |
| LBA: ULONGLONG, |
| DataBufSize: ULONG, |
| NVCacheStatus: ULONG, |
| NVCacheSubStatus: ULONG, |
| }} |
| pub type PNVCACHE_REQUEST_BLOCK = *mut NVCACHE_REQUEST_BLOCK; |
| pub const NRB_FUNCTION_NVCACHE_INFO: USHORT = 0xEC; |
| pub const NRB_FUNCTION_SPINDLE_STATUS: USHORT = 0xE5; |
| pub const NRB_FUNCTION_NVCACHE_POWER_MODE_SET: USHORT = 0x00; |
| pub const NRB_FUNCTION_NVCACHE_POWER_MODE_RETURN: USHORT = 0x01; |
| pub const NRB_FUNCTION_FLUSH_NVCACHE: USHORT = 0x14; |
| pub const NRB_FUNCTION_QUERY_PINNED_SET: USHORT = 0x12; |
| pub const NRB_FUNCTION_QUERY_CACHE_MISS: USHORT = 0x13; |
| pub const NRB_FUNCTION_ADD_LBAS_PINNED_SET: USHORT = 0x10; |
| pub const NRB_FUNCTION_REMOVE_LBAS_PINNED_SET: USHORT = 0x11; |
| pub const NRB_FUNCTION_QUERY_ASCENDER_STATUS: USHORT = 0xD0; |
| pub const NRB_FUNCTION_QUERY_HYBRID_DISK_STATUS: USHORT = 0xD1; |
| pub const NRB_FUNCTION_PASS_HINT_PAYLOAD: USHORT = 0xE0; |
| pub const NRB_FUNCTION_NVSEPARATED_INFO: USHORT = 0xc0; |
| pub const NRB_FUNCTION_NVSEPARATED_FLUSH: USHORT = 0xc1; |
| pub const NRB_FUNCTION_NVSEPARATED_WB_DISABLE: USHORT = 0xc2; |
| pub const NRB_FUNCTION_NVSEPARATED_WB_REVERT_DEFAULT: USHORT = 0xc3; |
| pub const NRB_SUCCESS: ULONG = 0; |
| pub const NRB_ILLEGAL_REQUEST: ULONG = 1; |
| pub const NRB_INVALID_PARAMETER: ULONG = 2; |
| pub const NRB_INPUT_DATA_OVERRUN: ULONG = 3; |
| pub const NRB_INPUT_DATA_UNDERRUN: ULONG = 4; |
| pub const NRB_OUTPUT_DATA_OVERRUN: ULONG = 5; |
| pub const NRB_OUTPUT_DATA_UNDERRUN: ULONG = 6; |
| STRUCT!{struct NV_FEATURE_PARAMETER { |
| NVPowerModeEnabled: USHORT, |
| NVParameterReserv1: USHORT, |
| NVCmdEnabled: USHORT, |
| NVParameterReserv2: USHORT, |
| NVPowerModeVer: USHORT, |
| NVCmdVer: USHORT, |
| NVSize: ULONG, |
| NVReadSpeed: USHORT, |
| NVWrtSpeed: USHORT, |
| DeviceSpinUpTime: ULONG, |
| }} |
| pub type PNV_FEATURE_PARAMETER = *mut NV_FEATURE_PARAMETER; |
| STRUCT!{struct NVCACHE_HINT_PAYLOAD { |
| Command: UCHAR, |
| Feature7_0: UCHAR, |
| Feature15_8: UCHAR, |
| Count15_8: UCHAR, |
| LBA7_0: UCHAR, |
| LBA15_8: UCHAR, |
| LBA23_16: UCHAR, |
| LBA31_24: UCHAR, |
| LBA39_32: UCHAR, |
| LBA47_40: UCHAR, |
| Auxiliary7_0: UCHAR, |
| Auxiliary23_16: UCHAR, |
| Reserved: [UCHAR; 4], |
| }} |
| pub type PNVCACHE_HINT_PAYLOAD = *mut NVCACHE_HINT_PAYLOAD; |
| STRUCT!{struct NV_SEP_CACHE_PARAMETER { |
| Version: ULONG, |
| Size: ULONG, |
| Flags: NV_SEP_CACHE_PARAMETER_Flags, |
| WriteCacheType: UCHAR, |
| WriteCacheTypeEffective: UCHAR, |
| ParameterReserve1: [UCHAR; 3], |
| }} |
| pub type PNV_SEP_CACHE_PARAMETER = *mut NV_SEP_CACHE_PARAMETER; |
| UNION!{union NV_SEP_CACHE_PARAMETER_Flags { |
| [u8; 1], |
| CacheFlags CacheFlags_mut: NV_SEP_CACHE_PARAMETER_Flags_CacheFlags, |
| CacheFlagsSet CacheFlagsSet_mut: UCHAR, |
| }} |
| STRUCT!{struct NV_SEP_CACHE_PARAMETER_Flags_CacheFlags { |
| Bitfield: UCHAR, |
| }} |
| BITFIELD!{NV_SEP_CACHE_PARAMETER_Flags_CacheFlags Bitfield: UCHAR [ |
| WriteCacheEnabled set_WriteCacheEnabled[0..1], |
| WriteCacheChangeable set_WriteCacheChangeable[1..2], |
| WriteThroughIOSupported set_WriteThroughIOSupported[2..3], |
| FlushCacheSupported set_FlushCacheSupported[3..4], |
| ReservedBits set_ReservedBits[4..8], |
| ]} |
| pub const NV_SEP_CACHE_PARAMETER_VERSION_1: ULONG = 1; |
| pub const NV_SEP_CACHE_PARAMETER_VERSION: ULONG = NV_SEP_CACHE_PARAMETER_VERSION_1; |
| ENUM!{enum NV_SEP_WRITE_CACHE_TYPE { |
| NVSEPWriteCacheTypeUnknown = 0, |
| NVSEPWriteCacheTypeNone = 1, |
| NVSEPWriteCacheTypeWriteBack = 2, |
| NVSEPWriteCacheTypeWriteThrough = 3, |
| }} |
| pub type PNV_SEP_WRITE_CACHE_TYPE = *mut NV_SEP_WRITE_CACHE_TYPE; |
| STRUCT!{struct MP_DEVICE_DATA_SET_RANGE { |
| StartingOffset: LONGLONG, |
| LengthInBytes: ULONGLONG, |
| }} |
| pub type PMP_DEVICE_DATA_SET_RANGE = *mut MP_DEVICE_DATA_SET_RANGE; |
| STRUCT!{struct DSM_NOTIFICATION_REQUEST_BLOCK { |
| Size: ULONG, |
| Version: ULONG, |
| NotifyFlags: ULONG, |
| DataSetProfile: ULONG, |
| Reserved: [ULONG; 3], |
| DataSetRangesCount: ULONG, |
| DataSetRanges: [MP_DEVICE_DATA_SET_RANGE; ANYSIZE_ARRAY], |
| }} |
| pub type PDSM_NOTIFICATION_REQUEST_BLOCK = *mut DSM_NOTIFICATION_REQUEST_BLOCK; |
| pub const MINIPORT_DSM_NOTIFICATION_VERSION_1: ULONG = 1; |
| pub const MINIPORT_DSM_NOTIFICATION_VERSION: ULONG = MINIPORT_DSM_NOTIFICATION_VERSION_1; |
| pub const MINIPORT_DSM_PROFILE_UNKNOWN: ULONG = 0; |
| pub const MINIPORT_DSM_PROFILE_PAGE_FILE: ULONG = 1; |
| pub const MINIPORT_DSM_PROFILE_HIBERNATION_FILE: ULONG = 2; |
| pub const MINIPORT_DSM_PROFILE_CRASHDUMP_FILE: ULONG = 3; |
| pub const MINIPORT_DSM_NOTIFY_FLAG_BEGIN: ULONG = 0x00000001; |
| pub const MINIPORT_DSM_NOTIFY_FLAG_END: ULONG = 0x00000002; |
| pub const HYBRID_FUNCTION_GET_INFO: ULONG = 0x01; |
| pub const HYBRID_FUNCTION_DISABLE_CACHING_MEDIUM: ULONG = 0x10; |
| pub const HYBRID_FUNCTION_ENABLE_CACHING_MEDIUM: ULONG = 0x11; |
| pub const HYBRID_FUNCTION_SET_DIRTY_THRESHOLD: ULONG = 0x12; |
| pub const HYBRID_FUNCTION_DEMOTE_BY_SIZE: ULONG = 0x13; |
| pub const HYBRID_STATUS_SUCCESS: ULONG = 0x0; |
| pub const HYBRID_STATUS_ILLEGAL_REQUEST: ULONG = 0x1; |
| pub const HYBRID_STATUS_INVALID_PARAMETER: ULONG = 0x2; |
| pub const HYBRID_STATUS_OUTPUT_BUFFER_TOO_SMALL: ULONG = 0x3; |
| pub const HYBRID_STATUS_ENABLE_REFCOUNT_HOLD: ULONG = 0x10; |
| pub const HYBRID_REQUEST_BLOCK_STRUCTURE_VERSION: ULONG = 0x1; |
| STRUCT!{struct HYBRID_REQUEST_BLOCK { |
| Version: ULONG, |
| Size: ULONG, |
| Function: ULONG, |
| Flags: ULONG, |
| DataBufferOffset: ULONG, |
| DataBufferLength: ULONG, |
| }} |
| pub type PHYBRID_REQUEST_BLOCK = *mut HYBRID_REQUEST_BLOCK; |
| ENUM!{enum NVCACHE_TYPE { |
| NvCacheTypeUnknown = 0, |
| NvCacheTypeNone = 1, |
| NvCacheTypeWriteBack = 2, |
| NvCacheTypeWriteThrough = 3, |
| }} |
| ENUM!{enum NVCACHE_STATUS { |
| NvCacheStatusUnknown = 0, |
| NvCacheStatusDisabling = 1, |
| NvCacheStatusDisabled = 2, |
| NvCacheStatusEnabled = 3, |
| }} |
| STRUCT!{struct NVCACHE_PRIORITY_LEVEL_DESCRIPTOR { |
| PriorityLevel: UCHAR, |
| Reserved0: [UCHAR; 3], |
| ConsumedNVMSizeFraction: ULONG, |
| ConsumedMappingResourcesFraction: ULONG, |
| ConsumedNVMSizeForDirtyDataFraction: ULONG, |
| ConsumedMappingResourcesForDirtyDataFraction: ULONG, |
| Reserved1: ULONG, |
| }} |
| pub type PNVCACHE_PRIORITY_LEVEL_DESCRIPTOR = *mut NVCACHE_PRIORITY_LEVEL_DESCRIPTOR; |
| pub const HYBRID_REQUEST_INFO_STRUCTURE_VERSION: ULONG = 1; |
| STRUCT!{struct HYBRID_INFORMATION { |
| Version: ULONG, |
| Size: ULONG, |
| HybridSupported: BOOLEAN, |
| Status: NVCACHE_STATUS, |
| CacheTypeEffective: NVCACHE_TYPE, |
| CacheTypeDefault: NVCACHE_TYPE, |
| FractionBase: ULONG, |
| CacheSize: ULONGLONG, |
| Attributes: HYBRID_INFORMATION_Attributes, |
| Priorities: HYBRID_INFORMATION_Priorities, |
| }} |
| pub type PHYBRID_INFORMATION = *mut HYBRID_INFORMATION; |
| STRUCT!{struct HYBRID_INFORMATION_Attributes { |
| Bitfield: ULONG, |
| }} |
| BITFIELD!{HYBRID_INFORMATION_Attributes Bitfield: ULONG [ |
| WriteCacheChangeable set_WriteCacheChangeable[0..1], |
| WriteThroughIoSupported set_WriteThroughIoSupported[1..2], |
| FlushCacheSupported set_FlushCacheSupported[2..3], |
| Removable set_Removable[3..4], |
| ReservedBits set_ReservedBits[4..32], |
| ]} |
| STRUCT!{struct HYBRID_INFORMATION_Priorities { |
| PriorityLevelCount: UCHAR, |
| MaxPriorityBehavior: BOOLEAN, |
| OptimalWriteGranularity: UCHAR, |
| Reserved: UCHAR, |
| DirtyThresholdLow: ULONG, |
| DirtyThresholdHigh: ULONG, |
| SupportedCommands: HYBRID_INFORMATION_Priorities_SupportedCommands, |
| Priority: [NVCACHE_PRIORITY_LEVEL_DESCRIPTOR; 0], |
| }} |
| STRUCT!{struct HYBRID_INFORMATION_Priorities_SupportedCommands { |
| Bitfield: ULONG, |
| MaxEvictCommands: ULONG, |
| MaxLbaRangeCountForEvict: ULONG, |
| MaxLbaRangeCountForChangeLba: ULONG, |
| }} |
| BITFIELD!{HYBRID_INFORMATION_Priorities_SupportedCommands Bitfield: ULONG [ |
| CacheDisable set_CacheDisable[0..1], |
| SetDirtyThreshold set_SetDirtyThreshold[1..2], |
| PriorityDemoteBySize set_PriorityDemoteBySize[2..3], |
| PriorityChangeByLbaRange set_PriorityChangeByLbaRange[3..4], |
| Evict set_Evict[4..5], |
| ReservedBits set_ReservedBits[5..32], |
| ]} |
| STRUCT!{struct HYBRID_DIRTY_THRESHOLDS { |
| Version: ULONG, |
| Size: ULONG, |
| DirtyLowThreshold: ULONG, |
| DirtyHighThreshold: ULONG, |
| }} |
| pub type PHYBRID_DIRTY_THRESHOLDS = *mut HYBRID_DIRTY_THRESHOLDS; |
| STRUCT!{struct HYBRID_DEMOTE_BY_SIZE { |
| Version: ULONG, |
| Size: ULONG, |
| SourcePriority: UCHAR, |
| TargetPriority: UCHAR, |
| Reserved0: USHORT, |
| Reserved1: ULONG, |
| LbaCount: ULONGLONG, |
| }} |
| pub type PHYBRID_DEMOTE_BY_SIZE = *mut HYBRID_DEMOTE_BY_SIZE; |
| pub const FIRMWARE_FUNCTION_GET_INFO: ULONG = 0x01; |
| pub const FIRMWARE_FUNCTION_DOWNLOAD: ULONG = 0x02; |
| pub const FIRMWARE_FUNCTION_ACTIVATE: ULONG = 0x03; |
| pub const FIRMWARE_STATUS_SUCCESS: ULONG = 0x0; |
| pub const FIRMWARE_STATUS_ERROR: ULONG = 0x1; |
| pub const FIRMWARE_STATUS_ILLEGAL_REQUEST: ULONG = 0x2; |
| pub const FIRMWARE_STATUS_INVALID_PARAMETER: ULONG = 0x3; |
| pub const FIRMWARE_STATUS_INPUT_BUFFER_TOO_BIG: ULONG = 0x4; |
| pub const FIRMWARE_STATUS_OUTPUT_BUFFER_TOO_SMALL: ULONG = 0x5; |
| pub const FIRMWARE_STATUS_INVALID_SLOT: ULONG = 0x6; |
| pub const FIRMWARE_STATUS_INVALID_IMAGE: ULONG = 0x7; |
| pub const FIRMWARE_STATUS_CONTROLLER_ERROR: ULONG = 0x10; |
| pub const FIRMWARE_STATUS_POWER_CYCLE_REQUIRED: ULONG = 0x20; |
| pub const FIRMWARE_STATUS_DEVICE_ERROR: ULONG = 0x40; |
| pub const FIRMWARE_STATUS_INTERFACE_CRC_ERROR: ULONG = 0x80; |
| pub const FIRMWARE_STATUS_UNCORRECTABLE_DATA_ERROR: ULONG = 0x81; |
| pub const FIRMWARE_STATUS_MEDIA_CHANGE: ULONG = 0x82; |
| pub const FIRMWARE_STATUS_ID_NOT_FOUND: ULONG = 0x83; |
| pub const FIRMWARE_STATUS_MEDIA_CHANGE_REQUEST: ULONG = 0x84; |
| pub const FIRMWARE_STATUS_COMMAND_ABORT: ULONG = 0x85; |
| pub const FIRMWARE_STATUS_END_OF_MEDIA: ULONG = 0x86; |
| pub const FIRMWARE_STATUS_ILLEGAL_LENGTH: ULONG = 0x87; |
| pub const FIRMWARE_REQUEST_BLOCK_STRUCTURE_VERSION: ULONG = 0x1; |
| STRUCT!{struct FIRMWARE_REQUEST_BLOCK { |
| Version: ULONG, |
| Size: ULONG, |
| Function: ULONG, |
| Flags: ULONG, |
| DataBufferOffset: ULONG, |
| DataBufferLength: ULONG, |
| }} |
| pub type PFIRMWARE_REQUEST_BLOCK = *mut FIRMWARE_REQUEST_BLOCK; |
| pub const FIRMWARE_REQUEST_FLAG_CONTROLLER: ULONG = 0x00000001; |
| pub const FIRMWARE_REQUEST_FLAG_LAST_SEGMENT: ULONG = 0x00000002; |
| pub const FIRMWARE_REQUEST_FLAG_SWITCH_TO_EXISTING_FIRMWARE: ULONG = 0x80000000; |
| pub const STORAGE_FIRMWARE_INFO_STRUCTURE_VERSION: ULONG = 0x1; |
| pub const STORAGE_FIRMWARE_INFO_STRUCTURE_VERSION_V2: ULONG = 0x2; |
| pub const STORAGE_FIRMWARE_INFO_INVALID_SLOT: UCHAR = 0xFF; |
| STRUCT!{struct STORAGE_FIRMWARE_SLOT_INFO { |
| SlotNumber: UCHAR, |
| ReadOnly: BOOLEAN, |
| Reserved: [UCHAR; 6], |
| Revision: STORAGE_FIRMWARE_SLOT_INFO_Revision, |
| }} |
| pub type PSTORAGE_FIRMWARE_SLOT_INFO = *mut STORAGE_FIRMWARE_SLOT_INFO; |
| UNION!{union STORAGE_FIRMWARE_SLOT_INFO_Revision { |
| [u64; 1], |
| Info Info_mut: [UCHAR; 8], |
| AsUlonglong AsUlonglong_mut: ULONGLONG, |
| }} |
| pub const STORAGE_FIRMWARE_SLOT_INFO_V2_REVISION_LENGTH: usize = 16; |
| STRUCT!{struct STORAGE_FIRMWARE_SLOT_INFO_V2 { |
| SlotNumber: UCHAR, |
| ReadOnly: BOOLEAN, |
| Reserved: [UCHAR; 6], |
| Revision: [UCHAR; STORAGE_FIRMWARE_SLOT_INFO_V2_REVISION_LENGTH], |
| }} |
| pub type PSTORAGE_FIRMWARE_SLOT_INFO_V2 = *mut STORAGE_FIRMWARE_SLOT_INFO_V2; |
| STRUCT!{struct STORAGE_FIRMWARE_INFO { |
| Version: ULONG, |
| Size: ULONG, |
| UpgradeSupport: BOOLEAN, |
| SlotCount: UCHAR, |
| ActiveSlot: UCHAR, |
| PendingActivateSlot: UCHAR, |
| Reserved: ULONG, |
| Slot: [STORAGE_FIRMWARE_SLOT_INFO; 0], |
| }} |
| pub type PSTORAGE_FIRMWARE_INFO = *mut STORAGE_FIRMWARE_INFO; |
| STRUCT!{struct STORAGE_FIRMWARE_INFO_V2 { |
| Version: ULONG, |
| Size: ULONG, |
| UpgradeSupport: BOOLEAN, |
| SlotCount: UCHAR, |
| ActiveSlot: UCHAR, |
| PendingActivateSlot: UCHAR, |
| FirmwareShared: BOOLEAN, |
| Reserved: [UCHAR; 3], |
| ImagePayloadAlignment: ULONG, |
| ImagePayloadMaxSize: ULONG, |
| Slot: [STORAGE_FIRMWARE_SLOT_INFO_V2; 0], |
| }} |
| pub type PSTORAGE_FIRMWARE_INFO_V2 = *mut STORAGE_FIRMWARE_INFO_V2; |
| pub const STORAGE_FIRMWARE_DOWNLOAD_STRUCTURE_VERSION: ULONG = 0x1; |
| pub const STORAGE_FIRMWARE_DOWNLOAD_STRUCTURE_VERSION_V2: ULONG = 0x2; |
| STRUCT!{struct STORAGE_FIRMWARE_DOWNLOAD { |
| Version: ULONG, |
| Size: ULONG, |
| Offset: ULONGLONG, |
| BufferSize: ULONGLONG, |
| ImageBuffer: [UCHAR; 0], |
| }} |
| pub type PSTORAGE_FIRMWARE_DOWNLOAD = *mut STORAGE_FIRMWARE_DOWNLOAD; |
| STRUCT!{struct STORAGE_FIRMWARE_DOWNLOAD_V2 { |
| Version: ULONG, |
| Size: ULONG, |
| Offset: ULONGLONG, |
| BufferSize: ULONGLONG, |
| Slot: UCHAR, |
| Reserved: [UCHAR; 7], |
| ImageBuffer: [UCHAR; 0], |
| }} |
| pub type PSTORAGE_FIRMWARE_DOWNLOAD_V2 = *mut STORAGE_FIRMWARE_DOWNLOAD_V2; |
| pub const STORAGE_FIRMWARE_ACTIVATE_STRUCTURE_VERSION: ULONG = 0x1; |
| STRUCT!{struct STORAGE_FIRMWARE_ACTIVATE { |
| Version: ULONG, |
| Size: ULONG, |
| SlotToActivate: UCHAR, |
| Reserved0: [UCHAR; 3], |
| }} |
| pub type PSTORAGE_FIRMWARE_ACTIVATE = *mut STORAGE_FIRMWARE_ACTIVATE; |
| STRUCT!{struct IO_SCSI_CAPABILITIES { |
| Length: ULONG, |
| MaximumTransferLength: ULONG, |
| MaximumPhysicalPages: ULONG, |
| SupportedAsynchronousEvents: ULONG, |
| AlignmentMask: ULONG, |
| TaggedQueuing: BOOLEAN, |
| AdapterScansDown: BOOLEAN, |
| AdapterUsesPio: BOOLEAN, |
| }} |
| pub type PIO_SCSI_CAPABILITIES = *mut IO_SCSI_CAPABILITIES; |
| STRUCT!{struct SCSI_ADDRESS { |
| Length: ULONG, |
| PortNumber: UCHAR, |
| PathId: UCHAR, |
| TargetId: UCHAR, |
| Lun: UCHAR, |
| }} |
| pub type PSCSI_ADDRESS = *mut SCSI_ADDRESS; |
| pub const DUMP_POINTERS_VERSION_1: ULONG = 1; |
| pub const DUMP_POINTERS_VERSION_2: ULONG = 2; |
| pub const DUMP_POINTERS_VERSION_3: ULONG = 3; |
| pub const DUMP_POINTERS_VERSION_4: ULONG = 4; |
| pub const DUMP_DRIVER_NAME_LENGTH: usize = 15; |
| FN!{cdecl DUMP_DEVICE_POWERON_ROUTINE( |
| Context: PVOID, |
| ) -> LONG} |
| pub type PDUMP_DEVICE_POWERON_ROUTINE = *mut DUMP_DEVICE_POWERON_ROUTINE; |
| STRUCT!{struct DUMP_POINTERS_VERSION { |
| Version: ULONG, |
| Size: ULONG, |
| }} |
| pub type PDUMP_POINTERS_VERSION = *mut DUMP_POINTERS_VERSION; |
| STRUCT!{struct DUMP_POINTERS { |
| AdapterObject: PVOID, // struct _ADAPTER_OBJECT * |
| MappedRegisterBase: PVOID, |
| DumpData: PVOID, |
| CommonBufferVa: PVOID, |
| CommonBufferPa: LARGE_INTEGER, |
| CommonBufferSize: ULONG, |
| AllocateCommonBuffers: BOOLEAN, |
| UseDiskDump: BOOLEAN, |
| Spare1: [UCHAR; 2], |
| DeviceObject: PVOID, |
| }} |
| pub type PDUMP_POINTERS = *mut DUMP_POINTERS; |
| STRUCT!{struct DUMP_POINTERS_EX { |
| Header: DUMP_POINTERS_VERSION, |
| DumpData: PVOID, |
| CommonBufferVa: PVOID, |
| CommonBufferSize: ULONG, |
| AllocateCommonBuffers: BOOLEAN, |
| DeviceObject: PVOID, |
| DriverList: PVOID, |
| dwPortFlags: ULONG, |
| MaxDeviceDumpSectionSize: ULONG, |
| MaxDeviceDumpLevel: ULONG, |
| MaxTransferSize: ULONG, |
| AdapterObject: PVOID, |
| MappedRegisterBase: PVOID, |
| DeviceReady: PBOOLEAN, |
| DumpDevicePowerOn: PDUMP_DEVICE_POWERON_ROUTINE, |
| DumpDevicePowerOnContext: PVOID, |
| }} |
| pub type PDUMP_POINTERS_EX = *mut DUMP_POINTERS_EX; |
| // TODO: Revisit these definitions when const size_of and offset_of! arrive. |
| #[cfg(target_pointer_width = "32")] |
| IFDEF!{ |
| pub const DUMP_POINTERS_EX_V2_SIZE: ULONG = 32; |
| pub const DUMP_POINTERS_EX_V3_SIZE: ULONG = 60; |
| pub const DUMP_POINTERS_EX_V4_SIZE: ULONG = 68; |
| } |
| #[cfg(target_pointer_width = "64")] |
| IFDEF!{ |
| pub const DUMP_POINTERS_EX_V2_SIZE: ULONG = 48; |
| pub const DUMP_POINTERS_EX_V3_SIZE: ULONG = 88; |
| pub const DUMP_POINTERS_EX_V4_SIZE: ULONG = 104; |
| } |
| pub const DUMP_EX_FLAG_SUPPORT_64BITMEMORY: ULONG = 0x00000001; |
| pub const DUMP_EX_FLAG_SUPPORT_DD_TELEMETRY: ULONG = 0x00000002; |
| pub const DUMP_EX_FLAG_RESUME_SUPPORT: ULONG = 0x00000004; |
| STRUCT!{struct DUMP_DRIVER { |
| DumpDriverList: PVOID, |
| DriverName: [WCHAR; DUMP_DRIVER_NAME_LENGTH], |
| BaseName: [WCHAR; DUMP_DRIVER_NAME_LENGTH], |
| }} |
| pub type PDUMP_DRIVER = *mut DUMP_DRIVER; |
| pub const SCSI_IOCTL_DATA_OUT: UCHAR = 0; |
| pub const SCSI_IOCTL_DATA_IN: UCHAR = 1; |
| pub const SCSI_IOCTL_DATA_UNSPECIFIED: UCHAR = 2; |
| pub const SCSI_IOCTL_DATA_BIDIRECTIONAL: UCHAR = 3; |
| pub const MPIO_IOCTL_FLAG_USE_PATHID: UCHAR = 1; |
| pub const MPIO_IOCTL_FLAG_USE_SCSIADDRESS: UCHAR = 2; |
| pub const MPIO_IOCTL_FLAG_INVOLVE_DSM: UCHAR = 4; |