/*++ BUILD Version: 0001 // Increment this if a change has global effects Copyright (c) Microsoft Corporation. All rights reserved. Module Name: ntddscsi.h Abstract: This is the include file that defines all constants and types for accessing the SCSI port adapters. --*/ // // Interface GUIDs // // need these GUIDs outside conditional includes so that user can // #include in precompiled header // #include in a single source file // #include in that source file a second time to instantiate the GUIDs // #ifdef DEFINE_GUID // // Make sure FAR is defined... // #ifndef FAR #ifdef _WIN32 #define FAR #else #define FAR _far #endif #endif DEFINE_GUID(ScsiRawInterfaceGuid, 0x53f56309L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); DEFINE_GUID(WmiScsiAddressGuid, 0x53f5630fL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b); #endif #ifndef _NTDDSCSIH_ #define _NTDDSCSIH_ #ifdef __cplusplus extern "C" { #endif // // Device Name - this string is the name of the device. It is the name // that should be passed to NtOpenFile when accessing the device. // // Note: For devices that support multiple units, it should be suffixed // with the Ascii representation of the unit number. // #define IOCTL_SCSI_BASE FILE_DEVICE_CONTROLLER #define FILE_DEVICE_SCSI 0x0000001b #define DD_SCSI_DEVICE_NAME "\\Device\\ScsiPort" // // NtDeviceIoControlFile IoControlCode values for this device. // // Warning: Remember that the low two bits of the code specify how the // buffers are passed to the driver! // #define IOCTL_SCSI_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_SCSI_MINIPORT CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_SCSI_GET_INQUIRY_DATA CTL_CODE(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_SCSI_GET_CAPABILITIES CTL_CODE(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_SCSI_GET_ADDRESS CTL_CODE(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_SCSI_RESCAN_BUS CTL_CODE(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_SCSI_GET_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE, 0x0408, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_SCSI_FREE_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE, 0x0409, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_IDE_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x040a, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_ATA_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x040b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_ATA_PASS_THROUGH_DIRECT CTL_CODE(IOCTL_SCSI_BASE, 0x040c, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_ATA_MINIPORT CTL_CODE(IOCTL_SCSI_BASE, 0x040d, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_MINIPORT_PROCESS_SERVICE_IRP CTL_CODE(IOCTL_SCSI_BASE, 0x040e, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_MPIO_PASS_THROUGH_PATH CTL_CODE(IOCTL_SCSI_BASE, 0x040f, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) #define IOCTL_MPIO_PASS_THROUGH_PATH_DIRECT CTL_CODE(IOCTL_SCSI_BASE, 0x0410, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) // // Non Volatile Cache support // #define IOCTL_SCSI_MINIPORT_NVCACHE ((FILE_DEVICE_SCSI << 16) + 0x0600) // // Define the SCSI pass through structure. // typedef struct _SCSI_PASS_THROUGH { USHORT Length; UCHAR ScsiStatus; UCHAR PathId; UCHAR TargetId; UCHAR Lun; UCHAR CdbLength; UCHAR SenseInfoLength; UCHAR DataIn; ULONG DataTransferLength; ULONG TimeOutValue; ULONG_PTR DataBufferOffset; ULONG SenseInfoOffset; UCHAR Cdb[16]; }SCSI_PASS_THROUGH, *PSCSI_PASS_THROUGH; // // Define the SCSI pass through direct structure. // typedef struct _SCSI_PASS_THROUGH_DIRECT { USHORT Length; UCHAR ScsiStatus; UCHAR PathId; UCHAR TargetId; UCHAR Lun; UCHAR CdbLength; UCHAR SenseInfoLength; UCHAR DataIn; ULONG DataTransferLength; ULONG TimeOutValue; PVOID DataBuffer; ULONG SenseInfoOffset; UCHAR Cdb[16]; }SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT; // // Define the SCSI pass through direct structure for Win64 (thunking). // #if defined(_WIN64) typedef struct _SCSI_PASS_THROUGH32 { USHORT Length; UCHAR ScsiStatus; UCHAR PathId; UCHAR TargetId; UCHAR Lun; UCHAR CdbLength; UCHAR SenseInfoLength; UCHAR DataIn; ULONG DataTransferLength; ULONG TimeOutValue; ULONG32 DataBufferOffset; ULONG SenseInfoOffset; UCHAR Cdb[16]; }SCSI_PASS_THROUGH32, *PSCSI_PASS_THROUGH32; // // Define the SCSI pass through direct structure. // typedef struct _SCSI_PASS_THROUGH_DIRECT32 { USHORT Length; UCHAR ScsiStatus; UCHAR PathId; UCHAR TargetId; UCHAR Lun; UCHAR CdbLength; UCHAR SenseInfoLength; UCHAR DataIn; ULONG DataTransferLength; ULONG TimeOutValue; VOID * POINTER_32 DataBuffer; ULONG SenseInfoOffset; UCHAR Cdb[16]; }SCSI_PASS_THROUGH_DIRECT32, *PSCSI_PASS_THROUGH_DIRECT32; #endif // // ATA pass through structure // typedef struct _ATA_PASS_THROUGH_EX { USHORT Length; USHORT AtaFlags; UCHAR PathId; UCHAR TargetId; UCHAR Lun; UCHAR ReservedAsUchar; ULONG DataTransferLength; ULONG TimeOutValue; ULONG ReservedAsUlong; ULONG_PTR DataBufferOffset; UCHAR PreviousTaskFile[8]; UCHAR CurrentTaskFile[8]; } ATA_PASS_THROUGH_EX, *PATA_PASS_THROUGH_EX; // // ATA pass through direct structure. // typedef struct _ATA_PASS_THROUGH_DIRECT { USHORT Length; USHORT AtaFlags; UCHAR PathId; UCHAR TargetId; UCHAR Lun; UCHAR ReservedAsUchar; ULONG DataTransferLength; ULONG TimeOutValue; ULONG ReservedAsUlong; PVOID DataBuffer; UCHAR PreviousTaskFile[8]; UCHAR CurrentTaskFile[8]; } ATA_PASS_THROUGH_DIRECT, *PATA_PASS_THROUGH_DIRECT; // // Define the ATA pass through direct structure for Win64 (thunking). // #if defined(_WIN64) typedef struct _ATA_PASS_THROUGH_EX32 { USHORT Length; USHORT AtaFlags; UCHAR PathId; UCHAR TargetId; UCHAR Lun; UCHAR ReservedAsUchar; ULONG DataTransferLength; ULONG TimeOutValue; ULONG ReservedAsUlong; ULONG32 DataBufferOffset; UCHAR PreviousTaskFile[8]; UCHAR CurrentTaskFile[8]; } ATA_PASS_THROUGH_EX32, *PATA_PASS_THROUGH_EX32; // // ATA pass through direct structure. // typedef struct _ATA_PASS_THROUGH_DIRECT32 { USHORT Length; USHORT AtaFlags; UCHAR PathId; UCHAR TargetId; UCHAR Lun; UCHAR ReservedAsUchar; ULONG DataTransferLength; ULONG TimeOutValue; ULONG ReservedAsUlong; VOID * POINTER_32 DataBuffer; UCHAR PreviousTaskFile[8]; UCHAR CurrentTaskFile[8]; } ATA_PASS_THROUGH_DIRECT32, *PATA_PASS_THROUGH_DIRECT32; #endif // // ATA Pass Through Flags // #define ATA_FLAGS_DRDY_REQUIRED (1 << 0) #define ATA_FLAGS_DATA_IN (1 << 1) #define ATA_FLAGS_DATA_OUT (1 << 2) #define ATA_FLAGS_48BIT_COMMAND (1 << 3) #define ATA_FLAGS_USE_DMA (1 << 4) #define ATA_FLAGS_NO_MULTIPLE (1 << 5) // // Define header for IOCTL_ATA_MINIPORT // typedef struct _IDE_IO_CONTROL { ULONG HeaderLength; UCHAR Signature[8]; ULONG Timeout; ULONG ControlCode; ULONG ReturnStatus; ULONG DataLength; } IDE_IO_CONTROL, *PIDE_IO_CONTROL; // // Define the structure for IOCTL_MPIO_PASS_THROUGH_PATH. // typedef struct _MPIO_PASS_THROUGH_PATH { SCSI_PASS_THROUGH PassThrough; ULONG Version; USHORT Length; UCHAR Flags; UCHAR PortNumber; ULONGLONG MpioPathId; } MPIO_PASS_THROUGH_PATH, *PMPIO_PASS_THROUGH_PATH; // // Define the structure for IOCTL_MPIO_PASS_THROUGH_PATH_DIRECT. // typedef struct _MPIO_PASS_THROUGH_PATH_DIRECT { SCSI_PASS_THROUGH_DIRECT PassThrough; ULONG Version; USHORT Length; UCHAR Flags; UCHAR PortNumber; ULONGLONG MpioPathId; } MPIO_PASS_THROUGH_PATH_DIRECT, *PMPIO_PASS_THROUGH_PATH_DIRECT; // // Define the IOCTL_MPIO_PASS_THROUGH_PATH structure for Win64 (thunking). // #if defined(_WIN64) typedef struct _MPIO_PASS_THROUGH_PATH32 { SCSI_PASS_THROUGH32 PassThrough; ULONG Version; USHORT Length; UCHAR Flags; UCHAR PortNumber; ULONGLONG MpioPathId; } MPIO_PASS_THROUGH_PATH32, *PMPIO_PASS_THROUGH_PATH32; // // Define the IOCTL_MPIO_PASS_THROUGH_PATH_DIRECT structure for Win64 (thunking). // typedef struct _MPIO_PASS_THROUGH_PATH_DIRECT32 { SCSI_PASS_THROUGH_DIRECT32 PassThrough; ULONG Version; USHORT Length; UCHAR Flags; UCHAR PortNumber; ULONGLONG MpioPathId; } MPIO_PASS_THROUGH_PATH_DIRECT32, *PMPIO_PASS_THROUGH_PATH_DIRECT32; #endif // // Define SCSI information. // Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL. // typedef struct _SCSI_BUS_DATA { UCHAR NumberOfLogicalUnits; UCHAR InitiatorBusId; ULONG InquiryDataOffset; }SCSI_BUS_DATA, *PSCSI_BUS_DATA; // // Define SCSI adapter bus information structure.. // Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL. // typedef struct _SCSI_ADAPTER_BUS_INFO { UCHAR NumberOfBuses; SCSI_BUS_DATA BusData[1]; } SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO; // // Define SCSI adapter bus information. // Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL. // typedef struct _SCSI_INQUIRY_DATA { UCHAR PathId; UCHAR TargetId; UCHAR Lun; BOOLEAN DeviceClaimed; ULONG InquiryDataLength; ULONG NextInquiryDataOffset; UCHAR InquiryData[1]; }SCSI_INQUIRY_DATA, *PSCSI_INQUIRY_DATA; // // Define header for I/O control SRB. // typedef struct _SRB_IO_CONTROL { ULONG HeaderLength; UCHAR Signature[8]; ULONG Timeout; ULONG ControlCode; ULONG ReturnCode; ULONG Length; } SRB_IO_CONTROL, *PSRB_IO_CONTROL; typedef struct _NVCACHE_REQUEST_BLOCK { ULONG NRBSize; USHORT Function; ULONG NRBFlags; ULONG NRBStatus; ULONG Count; ULONGLONG LBA; ULONG DataBufSize; ULONG NVCacheStatus; ULONG NVCacheSubStatus; } NVCACHE_REQUEST_BLOCK, *PNVCACHE_REQUEST_BLOCK; #define NRB_FUNCTION_NVCACHE_INFO 0xEC #define NRB_FUNCTION_SPINDLE_STATUS 0xE5 #define NRB_FUNCTION_NVCACHE_POWER_MODE_SET 0x00 #define NRB_FUNCTION_NVCACHE_POWER_MODE_RETURN 0x01 #define NRB_FUNCTION_FLUSH_NVCACHE 0x14 #define NRB_FUNCTION_QUERY_PINNED_SET 0x12 #define NRB_FUNCTION_QUERY_CACHE_MISS 0x13 #define NRB_FUNCTION_ADD_LBAS_PINNED_SET 0x10 #define NRB_FUNCTION_REMOVE_LBAS_PINNED_SET 0x11 #define NRB_FUNCTION_QUERY_ASCENDER_STATUS 0xD0 #define NRB_FUNCTION_QUERY_HYBRID_DISK_STATUS 0xD1 #define NRB_SUCCESS 0 #define NRB_ILLEGAL_REQUEST 1 #define NRB_INVALID_PARAMETER 2 #define NRB_INPUT_DATA_OVERRUN 3 #define NRB_INPUT_DATA_UNDERRUN 4 #define NRB_OUTPUT_DATA_OVERRUN 5 #define NRB_OUTPUT_DATA_UNDERRUN 6 typedef struct _NV_FEATURE_PARAMETER{ USHORT NVPowerModeEnabled; USHORT NVParameterReserv1; USHORT NVCmdEnabled; USHORT NVParameterReserv2; USHORT NVPowerModeVer; USHORT NVCmdVer; ULONG NVSize; // in number of LBA USHORT NVReadSpeed; // in MB/s USHORT NVWrtSpeed; ULONG DeviceSpinUpTime; // in second } NV_FEATURE_PARAMETER, *PNV_FEATURE_PARAMETER; // // SCSI port driver capabilities structure. // typedef struct _IO_SCSI_CAPABILITIES { // // Length of this structure // ULONG Length; // // Maximum transfer size in single SRB // ULONG MaximumTransferLength; // // Maximum number of physical pages per data buffer // ULONG MaximumPhysicalPages; // // Async calls from port to class // ULONG SupportedAsynchronousEvents; // // Alignment mask for data transfers. // ULONG AlignmentMask; // // Supports tagged queuing // BOOLEAN TaggedQueuing; // // Host adapter scans down for bios devices. // BOOLEAN AdapterScansDown; // // The host adapter uses programmed I/O. // BOOLEAN AdapterUsesPio; } IO_SCSI_CAPABILITIES, *PIO_SCSI_CAPABILITIES; typedef struct _SCSI_ADDRESS { ULONG Length; UCHAR PortNumber; UCHAR PathId; UCHAR TargetId; UCHAR Lun; }SCSI_ADDRESS, *PSCSI_ADDRESS; // // Define structure for returning crash dump pointers. // struct _ADAPTER_OBJECT; #define DUMP_POINTERS_VERSION_1 1 #define DUMP_POINTERS_VERSION_2 2 #define DUMP_DRIVER_NAME_LENGTH 15 typedef struct _DUMP_POINTERS_VERSION { // // Dump pointers structure version // ULONG Version; // // Dump pointers structure size // ULONG Size; } DUMP_POINTERS_VERSION, *PDUMP_POINTERS_VERSION; typedef struct _DUMP_POINTERS { struct _ADAPTER_OBJECT *AdapterObject; PVOID MappedRegisterBase; PVOID DumpData; PVOID CommonBufferVa; LARGE_INTEGER CommonBufferPa; ULONG CommonBufferSize; BOOLEAN AllocateCommonBuffers; #if (NTDDI_VERSION < NTDDI_WINXP) UCHAR Spare1[3]; #else BOOLEAN UseDiskDump; UCHAR Spare1[2]; #endif PVOID DeviceObject; } DUMP_POINTERS, *PDUMP_POINTERS; typedef struct _DUMP_POINTERS_EX { DUMP_POINTERS_VERSION Header; PVOID DumpData; PVOID CommonBufferVa; ULONG CommonBufferSize; BOOLEAN AllocateCommonBuffers; PVOID DeviceObject; PVOID DriverList; } DUMP_POINTERS_EX, *PDUMP_POINTERS_EX; typedef struct _DUMP_DRIVER { // // Dump driver list from port driver // PVOID DumpDriverList; // // Name of the driver to be loaded // WCHAR DriverName[DUMP_DRIVER_NAME_LENGTH]; // // Driver base name // WCHAR BaseName[DUMP_DRIVER_NAME_LENGTH]; } DUMP_DRIVER, *PDUMP_DRIVER; // // Define values for pass-through DataIn field. // #define SCSI_IOCTL_DATA_OUT 0 #define SCSI_IOCTL_DATA_IN 1 #define SCSI_IOCTL_DATA_UNSPECIFIED 2 // // Define values for MPIO-pass-through-path Flags field. // #define MPIO_IOCTL_FLAG_USE_PATHID 1 #define MPIO_IOCTL_FLAG_USE_SCSIADDRESS 2 #define MPIO_IOCTL_FLAG_INVOLVE_DSM 4 #ifdef __cplusplus } #endif #endif