1*44704f69SBart Van Assche #ifndef SG_PT_WIN32_H 2*44704f69SBart Van Assche #define SG_PT_WIN32_H 3*44704f69SBart Van Assche /* 4*44704f69SBart Van Assche * The information in this file was obtained from scsi-wnt.h by 5*44704f69SBart Van Assche * Richard Stemmer, [email protected] . He in turn gives credit to 6*44704f69SBart Van Assche * Jay A. Key (for scsipt.c). 7*44704f69SBart Van Assche * The plscsi program (by Pat LaVarre <[email protected]>) has 8*44704f69SBart Van Assche * also been used as a reference. 9*44704f69SBart Van Assche * Much of the information in this header can also be obtained 10*44704f69SBart Van Assche * from msdn.microsoft.com . 11*44704f69SBart Van Assche * Updated for cygwin version 1.7.17 changes 20121026 12*44704f69SBart Van Assche */ 13*44704f69SBart Van Assche 14*44704f69SBart Van Assche /* WIN32_LEAN_AND_MEAN may be required to prevent inclusion of <winioctl.h> */ 15*44704f69SBart Van Assche #define WIN32_LEAN_AND_MEAN 16*44704f69SBart Van Assche #include <windows.h> 17*44704f69SBart Van Assche 18*44704f69SBart Van Assche #ifdef __cplusplus 19*44704f69SBart Van Assche extern "C" { 20*44704f69SBart Van Assche #endif 21*44704f69SBart Van Assche 22*44704f69SBart Van Assche #define SCSI_MAX_SENSE_LEN 64 23*44704f69SBart Van Assche #define SCSI_MAX_CDB_LEN 16 24*44704f69SBart Van Assche #define SCSI_MAX_INDIRECT_DATA 16384 25*44704f69SBart Van Assche 26*44704f69SBart Van Assche typedef struct { 27*44704f69SBart Van Assche USHORT Length; 28*44704f69SBart Van Assche UCHAR ScsiStatus; 29*44704f69SBart Van Assche UCHAR PathId; 30*44704f69SBart Van Assche UCHAR TargetId; 31*44704f69SBart Van Assche UCHAR Lun; 32*44704f69SBart Van Assche UCHAR CdbLength; 33*44704f69SBart Van Assche UCHAR SenseInfoLength; 34*44704f69SBart Van Assche UCHAR DataIn; 35*44704f69SBart Van Assche ULONG DataTransferLength; 36*44704f69SBart Van Assche ULONG TimeOutValue; 37*44704f69SBart Van Assche ULONG_PTR DataBufferOffset; /* was ULONG; problem in 64 bit */ 38*44704f69SBart Van Assche ULONG SenseInfoOffset; 39*44704f69SBart Van Assche UCHAR Cdb[SCSI_MAX_CDB_LEN]; 40*44704f69SBart Van Assche } SCSI_PASS_THROUGH, *PSCSI_PASS_THROUGH; 41*44704f69SBart Van Assche 42*44704f69SBart Van Assche 43*44704f69SBart Van Assche typedef struct { 44*44704f69SBart Van Assche USHORT Length; 45*44704f69SBart Van Assche UCHAR ScsiStatus; 46*44704f69SBart Van Assche UCHAR PathId; 47*44704f69SBart Van Assche UCHAR TargetId; 48*44704f69SBart Van Assche UCHAR Lun; 49*44704f69SBart Van Assche UCHAR CdbLength; 50*44704f69SBart Van Assche UCHAR SenseInfoLength; 51*44704f69SBart Van Assche UCHAR DataIn; 52*44704f69SBart Van Assche ULONG DataTransferLength; 53*44704f69SBart Van Assche ULONG TimeOutValue; 54*44704f69SBart Van Assche PVOID DataBuffer; 55*44704f69SBart Van Assche ULONG SenseInfoOffset; 56*44704f69SBart Van Assche UCHAR Cdb[SCSI_MAX_CDB_LEN]; 57*44704f69SBart Van Assche } SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT; 58*44704f69SBart Van Assche 59*44704f69SBart Van Assche 60*44704f69SBart Van Assche typedef struct { 61*44704f69SBart Van Assche SCSI_PASS_THROUGH spt; 62*44704f69SBart Van Assche /* plscsi shows a follow on 16 bytes allowing 32 byte cdb */ 63*44704f69SBart Van Assche ULONG Filler; 64*44704f69SBart Van Assche UCHAR ucSenseBuf[SCSI_MAX_SENSE_LEN]; 65*44704f69SBart Van Assche UCHAR ucDataBuf[SCSI_MAX_INDIRECT_DATA]; 66*44704f69SBart Van Assche } SCSI_PASS_THROUGH_WITH_BUFFERS, *PSCSI_PASS_THROUGH_WITH_BUFFERS; 67*44704f69SBart Van Assche 68*44704f69SBart Van Assche 69*44704f69SBart Van Assche typedef struct { 70*44704f69SBart Van Assche SCSI_PASS_THROUGH_DIRECT spt; 71*44704f69SBart Van Assche ULONG Filler; 72*44704f69SBart Van Assche UCHAR ucSenseBuf[SCSI_MAX_SENSE_LEN]; 73*44704f69SBart Van Assche } SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, *PSCSI_PASS_THROUGH_DIRECT_WITH_BUFFER; 74*44704f69SBart Van Assche 75*44704f69SBart Van Assche 76*44704f69SBart Van Assche 77*44704f69SBart Van Assche typedef struct { 78*44704f69SBart Van Assche UCHAR NumberOfLogicalUnits; 79*44704f69SBart Van Assche UCHAR InitiatorBusId; 80*44704f69SBart Van Assche ULONG InquiryDataOffset; 81*44704f69SBart Van Assche } SCSI_BUS_DATA, *PSCSI_BUS_DATA; 82*44704f69SBart Van Assche 83*44704f69SBart Van Assche 84*44704f69SBart Van Assche typedef struct { 85*44704f69SBart Van Assche UCHAR NumberOfBusses; 86*44704f69SBart Van Assche SCSI_BUS_DATA BusData[1]; 87*44704f69SBart Van Assche } SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO; 88*44704f69SBart Van Assche 89*44704f69SBart Van Assche 90*44704f69SBart Van Assche typedef struct { 91*44704f69SBart Van Assche UCHAR PathId; 92*44704f69SBart Van Assche UCHAR TargetId; 93*44704f69SBart Van Assche UCHAR Lun; 94*44704f69SBart Van Assche BOOLEAN DeviceClaimed; 95*44704f69SBart Van Assche ULONG InquiryDataLength; 96*44704f69SBart Van Assche ULONG NextInquiryDataOffset; 97*44704f69SBart Van Assche UCHAR InquiryData[1]; 98*44704f69SBart Van Assche } SCSI_INQUIRY_DATA, *PSCSI_INQUIRY_DATA; 99*44704f69SBart Van Assche 100*44704f69SBart Van Assche 101*44704f69SBart Van Assche typedef struct { 102*44704f69SBart Van Assche ULONG Length; 103*44704f69SBart Van Assche UCHAR PortNumber; 104*44704f69SBart Van Assche UCHAR PathId; 105*44704f69SBart Van Assche UCHAR TargetId; 106*44704f69SBart Van Assche UCHAR Lun; 107*44704f69SBart Van Assche } SCSI_ADDRESS, *PSCSI_ADDRESS; 108*44704f69SBart Van Assche 109*44704f69SBart Van Assche /* 110*44704f69SBart Van Assche * Standard IOCTL define 111*44704f69SBart Van Assche */ 112*44704f69SBart Van Assche #ifndef CTL_CODE 113*44704f69SBart Van Assche #define CTL_CODE(DevType, Function, Method, Access) \ 114*44704f69SBart Van Assche (((DevType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) 115*44704f69SBart Van Assche #endif 116*44704f69SBart Van Assche 117*44704f69SBart Van Assche /* 118*44704f69SBart Van Assche * file access values 119*44704f69SBart Van Assche */ 120*44704f69SBart Van Assche #ifndef FILE_ANY_ACCESS 121*44704f69SBart Van Assche #define FILE_ANY_ACCESS 0 122*44704f69SBart Van Assche #endif 123*44704f69SBart Van Assche #ifndef FILE_READ_ACCESS 124*44704f69SBart Van Assche #define FILE_READ_ACCESS 0x0001 125*44704f69SBart Van Assche #endif 126*44704f69SBart Van Assche #ifndef FILE_WRITE_ACCESS 127*44704f69SBart Van Assche #define FILE_WRITE_ACCESS 0x0002 128*44704f69SBart Van Assche #endif 129*44704f69SBart Van Assche 130*44704f69SBart Van Assche // IOCTL_STORAGE_QUERY_PROPERTY 131*44704f69SBart Van Assche 132*44704f69SBart Van Assche #define FILE_DEVICE_MASS_STORAGE 0x0000002d 133*44704f69SBart Van Assche #define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE 134*44704f69SBart Van Assche #define FILE_ANY_ACCESS 0 135*44704f69SBart Van Assche 136*44704f69SBart Van Assche // #define METHOD_BUFFERED 0 137*44704f69SBart Van Assche 138*44704f69SBart Van Assche #define IOCTL_STORAGE_QUERY_PROPERTY \ 139*44704f69SBart Van Assche CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS) 140*44704f69SBart Van Assche 141*44704f69SBart Van Assche 142*44704f69SBart Van Assche #ifndef _DEVIOCTL_ 143*44704f69SBart Van Assche typedef enum _STORAGE_BUS_TYPE { 144*44704f69SBart Van Assche BusTypeUnknown = 0x00, 145*44704f69SBart Van Assche BusTypeScsi = 0x01, 146*44704f69SBart Van Assche BusTypeAtapi = 0x02, 147*44704f69SBart Van Assche BusTypeAta = 0x03, 148*44704f69SBart Van Assche BusType1394 = 0x04, 149*44704f69SBart Van Assche BusTypeSsa = 0x05, 150*44704f69SBart Van Assche BusTypeFibre = 0x06, 151*44704f69SBart Van Assche BusTypeUsb = 0x07, 152*44704f69SBart Van Assche BusTypeRAID = 0x08, 153*44704f69SBart Van Assche BusTypeiScsi = 0x09, 154*44704f69SBart Van Assche BusTypeSas = 0x0A, 155*44704f69SBart Van Assche BusTypeSata = 0x0B, 156*44704f69SBart Van Assche BusTypeSd = 0x0C, 157*44704f69SBart Van Assche BusTypeMmc = 0x0D, 158*44704f69SBart Van Assche BusTypeVirtual = 0xE, 159*44704f69SBart Van Assche BusTypeFileBackedVirtual = 0xF, 160*44704f69SBart Van Assche BusTypeSpaces = 0x10, 161*44704f69SBart Van Assche BusTypeNvme = 0x11, 162*44704f69SBart Van Assche BusTypeSCM = 0x12, 163*44704f69SBart Van Assche BusTypeUfs = 0x13, 164*44704f69SBart Van Assche BusTypeMax = 0x14, 165*44704f69SBart Van Assche BusTypeMaxReserved = 0x7F 166*44704f69SBart Van Assche } STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE; 167*44704f69SBart Van Assche 168*44704f69SBart Van Assche typedef enum _STORAGE_PROTOCOL_TYPE { 169*44704f69SBart Van Assche ProtocolTypeUnknown = 0, 170*44704f69SBart Van Assche ProtocolTypeScsi, 171*44704f69SBart Van Assche ProtocolTypeAta, 172*44704f69SBart Van Assche ProtocolTypeNvme, 173*44704f69SBart Van Assche ProtocolTypeSd 174*44704f69SBart Van Assche } STORAGE_PROTOCOL_TYPE; 175*44704f69SBart Van Assche 176*44704f69SBart Van Assche typedef enum _STORAGE_PROTOCOL_NVME_DATA_TYPE { 177*44704f69SBart Van Assche NVMeDataTypeUnknown = 0, 178*44704f69SBart Van Assche NVMeDataTypeIdentify, 179*44704f69SBart Van Assche NVMeDataTypeLogPage, 180*44704f69SBart Van Assche NVMeDataTypeFeature 181*44704f69SBart Van Assche } STORAGE_PROTOCOL_NVME_DATA_TYPE; 182*44704f69SBart Van Assche 183*44704f69SBart Van Assche typedef struct _STORAGE_PROTOCOL_SPECIFIC_DATA { 184*44704f69SBart Van Assche STORAGE_PROTOCOL_TYPE ProtocolType; 185*44704f69SBart Van Assche ULONG DataType; 186*44704f69SBart Van Assche ULONG ProtocolDataRequestValue; 187*44704f69SBart Van Assche ULONG ProtocolDataRequestSubValue; 188*44704f69SBart Van Assche ULONG ProtocolDataOffset; 189*44704f69SBart Van Assche ULONG ProtocolDataLength; 190*44704f69SBart Van Assche ULONG FixedProtocolReturnData; 191*44704f69SBart Van Assche ULONG Reserved[3]; 192*44704f69SBart Van Assche } STORAGE_PROTOCOL_SPECIFIC_DATA; 193*44704f69SBart Van Assche 194*44704f69SBart Van Assche 195*44704f69SBart Van Assche typedef struct _STORAGE_DEVICE_DESCRIPTOR { 196*44704f69SBart Van Assche ULONG Version; 197*44704f69SBart Van Assche ULONG Size; 198*44704f69SBart Van Assche UCHAR DeviceType; 199*44704f69SBart Van Assche UCHAR DeviceTypeModifier; 200*44704f69SBart Van Assche BOOLEAN RemovableMedia; 201*44704f69SBart Van Assche BOOLEAN CommandQueueing; 202*44704f69SBart Van Assche ULONG VendorIdOffset; /* 0 if not available */ 203*44704f69SBart Van Assche ULONG ProductIdOffset; /* 0 if not available */ 204*44704f69SBart Van Assche ULONG ProductRevisionOffset;/* 0 if not available */ 205*44704f69SBart Van Assche ULONG SerialNumberOffset; /* -1 if not available ?? */ 206*44704f69SBart Van Assche STORAGE_BUS_TYPE BusType; 207*44704f69SBart Van Assche ULONG RawPropertiesLength; 208*44704f69SBart Van Assche UCHAR RawDeviceProperties[1]; 209*44704f69SBart Van Assche } STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR; 210*44704f69SBart Van Assche 211*44704f69SBart Van Assche #define STORAGE_PROTOCOL_STRUCTURE_VERSION 0x1 212*44704f69SBart Van Assche 213*44704f69SBart Van Assche #define IOCTL_STORAGE_PROTOCOL_COMMAND \ 214*44704f69SBart Van Assche CTL_CODE(IOCTL_STORAGE_BASE, 0x04F0, METHOD_BUFFERED, \ 215*44704f69SBart Van Assche FILE_READ_ACCESS | FILE_WRITE_ACCESS) 216*44704f69SBart Van Assche 217*44704f69SBart Van Assche typedef struct _STORAGE_PROTOCOL_COMMAND { 218*44704f69SBart Van Assche DWORD Version; /* STORAGE_PROTOCOL_STRUCTURE_VERSION */ 219*44704f69SBart Van Assche DWORD Length; 220*44704f69SBart Van Assche STORAGE_PROTOCOL_TYPE ProtocolType; 221*44704f69SBart Van Assche DWORD Flags; 222*44704f69SBart Van Assche DWORD ReturnStatus; 223*44704f69SBart Van Assche DWORD ErrorCode; 224*44704f69SBart Van Assche DWORD CommandLength; 225*44704f69SBart Van Assche DWORD ErrorInfoLength; 226*44704f69SBart Van Assche DWORD DataToDeviceTransferLength; 227*44704f69SBart Van Assche DWORD DataFromDeviceTransferLength; 228*44704f69SBart Van Assche DWORD TimeOutValue; 229*44704f69SBart Van Assche DWORD ErrorInfoOffset; 230*44704f69SBart Van Assche DWORD DataToDeviceBufferOffset; 231*44704f69SBart Van Assche DWORD DataFromDeviceBufferOffset; 232*44704f69SBart Van Assche DWORD CommandSpecific; 233*44704f69SBart Van Assche DWORD Reserved0; 234*44704f69SBart Van Assche DWORD FixedProtocolReturnData; 235*44704f69SBart Van Assche DWORD Reserved1[3]; 236*44704f69SBart Van Assche BYTE Command[1]; /* has CommandLength elements */ 237*44704f69SBart Van Assche } STORAGE_PROTOCOL_COMMAND, *PSTORAGE_PROTOCOL_COMMAND; 238*44704f69SBart Van Assche 239*44704f69SBart Van Assche #endif /* _DEVIOCTL_ */ 240*44704f69SBart Van Assche 241*44704f69SBart Van Assche typedef struct _STORAGE_DEVICE_UNIQUE_IDENTIFIER { 242*44704f69SBart Van Assche ULONG Version; 243*44704f69SBart Van Assche ULONG Size; 244*44704f69SBart Van Assche ULONG StorageDeviceIdOffset; 245*44704f69SBart Van Assche ULONG StorageDeviceOffset; 246*44704f69SBart Van Assche ULONG DriveLayoutSignatureOffset; 247*44704f69SBart Van Assche } STORAGE_DEVICE_UNIQUE_IDENTIFIER, *PSTORAGE_DEVICE_UNIQUE_IDENTIFIER; 248*44704f69SBart Van Assche 249*44704f69SBart Van Assche // Use CompareStorageDuids(PSTORAGE_DEVICE_UNIQUE_IDENTIFIER duid1, duid2) 250*44704f69SBart Van Assche // to test for equality 251*44704f69SBart Van Assche 252*44704f69SBart Van Assche #ifndef _DEVIOCTL_ 253*44704f69SBart Van Assche typedef enum _STORAGE_QUERY_TYPE { 254*44704f69SBart Van Assche PropertyStandardQuery = 0, 255*44704f69SBart Van Assche PropertyExistsQuery, 256*44704f69SBart Van Assche PropertyMaskQuery, 257*44704f69SBart Van Assche PropertyQueryMaxDefined 258*44704f69SBart Van Assche } STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE; 259*44704f69SBart Van Assche 260*44704f69SBart Van Assche typedef enum _STORAGE_PROPERTY_ID { 261*44704f69SBart Van Assche StorageDeviceProperty = 0, 262*44704f69SBart Van Assche StorageAdapterProperty, 263*44704f69SBart Van Assche StorageDeviceIdProperty, 264*44704f69SBart Van Assche StorageDeviceUniqueIdProperty, 265*44704f69SBart Van Assche StorageDeviceWriteCacheProperty, 266*44704f69SBart Van Assche StorageMiniportProperty, 267*44704f69SBart Van Assche StorageAccessAlignmentProperty, 268*44704f69SBart Van Assche /* Identify controller goes to adapter; Identify namespace to device */ 269*44704f69SBart Van Assche StorageAdapterProtocolSpecificProperty = 49, 270*44704f69SBart Van Assche StorageDeviceProtocolSpecificProperty = 50 271*44704f69SBart Van Assche } STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID; 272*44704f69SBart Van Assche 273*44704f69SBart Van Assche typedef struct _STORAGE_PROPERTY_QUERY { 274*44704f69SBart Van Assche STORAGE_PROPERTY_ID PropertyId; 275*44704f69SBart Van Assche STORAGE_QUERY_TYPE QueryType; 276*44704f69SBart Van Assche UCHAR AdditionalParameters[1]; 277*44704f69SBart Van Assche } STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY; 278*44704f69SBart Van Assche 279*44704f69SBart Van Assche typedef struct _STORAGE_PROTOCOL_DATA_DESCRIPTOR { 280*44704f69SBart Van Assche DWORD Version; 281*44704f69SBart Van Assche DWORD Size; 282*44704f69SBart Van Assche STORAGE_PROTOCOL_SPECIFIC_DATA ProtocolSpecificData; 283*44704f69SBart Van Assche } STORAGE_PROTOCOL_DATA_DESCRIPTOR, *PSTORAGE_PROTOCOL_DATA_DESCRIPTOR; 284*44704f69SBart Van Assche 285*44704f69SBart Van Assche // Command completion status 286*44704f69SBart Van Assche // The "Phase Tag" field and "Status Field" are separated in spec. We define 287*44704f69SBart Van Assche // them in the same data structure to ease the memory access from software. 288*44704f69SBart Van Assche // 289*44704f69SBart Van Assche typedef union { 290*44704f69SBart Van Assche struct { 291*44704f69SBart Van Assche USHORT P : 1; // Phase Tag (P) 292*44704f69SBart Van Assche 293*44704f69SBart Van Assche USHORT SC : 8; // Status Code (SC) 294*44704f69SBart Van Assche USHORT SCT : 3; // Status Code Type (SCT) 295*44704f69SBart Van Assche USHORT Reserved : 2; 296*44704f69SBart Van Assche USHORT M : 1; // More (M) 297*44704f69SBart Van Assche USHORT DNR : 1; // Do Not Retry (DNR) 298*44704f69SBart Van Assche } DUMMYSTRUCTNAME; 299*44704f69SBart Van Assche USHORT AsUshort; 300*44704f69SBart Van Assche } NVME_COMMAND_STATUS, *PNVME_COMMAND_STATUS; 301*44704f69SBart Van Assche 302*44704f69SBart Van Assche // Information of log: NVME_LOG_PAGE_ERROR_INFO. Size: 64 bytes 303*44704f69SBart Van Assche // 304*44704f69SBart Van Assche typedef struct { 305*44704f69SBart Van Assche ULONGLONG ErrorCount; 306*44704f69SBart Van Assche USHORT SQID; // Submission Queue ID 307*44704f69SBart Van Assche USHORT CMDID; // Command ID 308*44704f69SBart Van Assche NVME_COMMAND_STATUS Status; // Status Field: This field indicates the 309*44704f69SBart Van Assche // Status Field for the command that 310*44704f69SBart Van Assche // completed. The Status Field is located in 311*44704f69SBart Van Assche // bits 15:01, bit 00 corresponds to the Phase 312*44704f69SBart Van Assche // Tag posted for the command. 313*44704f69SBart Van Assche struct { 314*44704f69SBart Van Assche USHORT Byte : 8; // Byte in command that contained error 315*44704f69SBart Van Assche USHORT Bit : 3; // Bit in command that contained error 316*44704f69SBart Van Assche USHORT Reserved : 5; 317*44704f69SBart Van Assche } ParameterErrorLocation; 318*44704f69SBart Van Assche 319*44704f69SBart Van Assche ULONGLONG Lba; // LBA: This field indicates the first LBA 320*44704f69SBart Van Assche // that experienced the error condition, if 321*44704f69SBart Van Assche // applicable. 322*44704f69SBart Van Assche ULONG NameSpace; // Namespace: This field indicates the nsid 323*44704f69SBart Van Assche // that the error is associated with, if 324*44704f69SBart Van Assche // applicable. 325*44704f69SBart Van Assche UCHAR VendorInfoAvailable; // Vendor Specific Information Available 326*44704f69SBart Van Assche UCHAR Reserved0[3]; 327*44704f69SBart Van Assche ULONGLONG CommandSpecificInfo; // This field contains command specific 328*44704f69SBart Van Assche // information. If used, the command 329*44704f69SBart Van Assche // definition specifies the information 330*44704f69SBart Van Assche // returned. 331*44704f69SBart Van Assche UCHAR Reserved1[24]; 332*44704f69SBart Van Assche } NVME_ERROR_INFO_LOG, *PNVME_ERROR_INFO_LOG; 333*44704f69SBart Van Assche 334*44704f69SBart Van Assche typedef struct { 335*44704f69SBart Van Assche 336*44704f69SBart Van Assche ULONG DW0; 337*44704f69SBart Van Assche ULONG Reserved; 338*44704f69SBart Van Assche 339*44704f69SBart Van Assche union { 340*44704f69SBart Van Assche struct { 341*44704f69SBart Van Assche USHORT SQHD; // SQ Head Pointer (SQHD) 342*44704f69SBart Van Assche USHORT SQID; // SQ Identifier (SQID) 343*44704f69SBart Van Assche } DUMMYSTRUCTNAME; 344*44704f69SBart Van Assche 345*44704f69SBart Van Assche ULONG AsUlong; 346*44704f69SBart Van Assche } DW2; 347*44704f69SBart Van Assche 348*44704f69SBart Van Assche union { 349*44704f69SBart Van Assche struct { 350*44704f69SBart Van Assche USHORT CID; // Command Identifier (CID) 351*44704f69SBart Van Assche NVME_COMMAND_STATUS Status; 352*44704f69SBart Van Assche } DUMMYSTRUCTNAME; 353*44704f69SBart Van Assche 354*44704f69SBart Van Assche ULONG AsUlong; 355*44704f69SBart Van Assche } DW3; 356*44704f69SBart Van Assche 357*44704f69SBart Van Assche } NVME_COMPLETION_ENTRY, *PNVME_COMPLETION_ENTRY; 358*44704f69SBart Van Assche 359*44704f69SBart Van Assche 360*44704f69SBart Van Assche // Bit-mask values for STORAGE_PROTOCOL_COMMAND - "Flags" field. 361*44704f69SBart Van Assche // 362*44704f69SBart Van Assche // Flag indicates the request targeting to adapter instead of device. 363*44704f69SBart Van Assche #define STORAGE_PROTOCOL_COMMAND_FLAG_ADAPTER_REQUEST 0x80000000 364*44704f69SBart Van Assche 365*44704f69SBart Van Assche // 366*44704f69SBart Van Assche // Status values for STORAGE_PROTOCOL_COMMAND - "ReturnStatus" field. 367*44704f69SBart Van Assche // 368*44704f69SBart Van Assche #define STORAGE_PROTOCOL_STATUS_PENDING 0x0 369*44704f69SBart Van Assche #define STORAGE_PROTOCOL_STATUS_SUCCESS 0x1 370*44704f69SBart Van Assche #define STORAGE_PROTOCOL_STATUS_ERROR 0x2 371*44704f69SBart Van Assche #define STORAGE_PROTOCOL_STATUS_INVALID_REQUEST 0x3 372*44704f69SBart Van Assche #define STORAGE_PROTOCOL_STATUS_NO_DEVICE 0x4 373*44704f69SBart Van Assche #define STORAGE_PROTOCOL_STATUS_BUSY 0x5 374*44704f69SBart Van Assche #define STORAGE_PROTOCOL_STATUS_DATA_OVERRUN 0x6 375*44704f69SBart Van Assche #define STORAGE_PROTOCOL_STATUS_INSUFFICIENT_RESOURCES 0x7 376*44704f69SBart Van Assche 377*44704f69SBart Van Assche #define STORAGE_PROTOCOL_STATUS_NOT_SUPPORTED 0xFF 378*44704f69SBart Van Assche 379*44704f69SBart Van Assche // Command Length for Storage Protocols. 380*44704f69SBart Van Assche // 381*44704f69SBart Van Assche // NVMe commands are always 64 bytes. 382*44704f69SBart Van Assche #define STORAGE_PROTOCOL_COMMAND_LENGTH_NVME 0x40 383*44704f69SBart Van Assche 384*44704f69SBart Van Assche // Command Specific Information for Storage Protocols - CommandSpecific field 385*44704f69SBart Van Assche // 386*44704f69SBart Van Assche #define STORAGE_PROTOCOL_SPECIFIC_NVME_ADMIN_COMMAND 0x01 387*44704f69SBart Van Assche #define STORAGE_PROTOCOL_SPECIFIC_NVME_NVM_COMMAND 0x02 388*44704f69SBart Van Assche 389*44704f69SBart Van Assche #endif /* _DEVIOCTL_ */ 390*44704f69SBart Van Assche 391*44704f69SBart Van Assche 392*44704f69SBart Van Assche // NVME_PASS_THROUGH 393*44704f69SBart Van Assche 394*44704f69SBart Van Assche #ifndef STB_IO_CONTROL 395*44704f69SBart Van Assche typedef struct _SRB_IO_CONTROL { 396*44704f69SBart Van Assche ULONG HeaderLength; 397*44704f69SBart Van Assche UCHAR Signature[8]; 398*44704f69SBart Van Assche ULONG Timeout; 399*44704f69SBart Van Assche ULONG ControlCode; 400*44704f69SBart Van Assche ULONG ReturnCode; 401*44704f69SBart Van Assche ULONG Length; 402*44704f69SBart Van Assche } SRB_IO_CONTROL, *PSRB_IO_CONTROL; 403*44704f69SBart Van Assche #endif 404*44704f69SBart Van Assche 405*44704f69SBart Van Assche #ifndef NVME_PASS_THROUGH_SRB_IO_CODE 406*44704f69SBart Van Assche 407*44704f69SBart Van Assche #define NVME_SIG_STR "NvmeMini" 408*44704f69SBart Van Assche #define NVME_STORPORT_DRIVER 0xe000 409*44704f69SBart Van Assche 410*44704f69SBart Van Assche #define NVME_PASS_THROUGH_SRB_IO_CODE \ 411*44704f69SBart Van Assche CTL_CODE(NVME_STORPORT_DRIVER, 0x0800, METHOD_BUFFERED, FILE_ANY_ACCESS) 412*44704f69SBart Van Assche 413*44704f69SBart Van Assche #pragma pack(1) 414*44704f69SBart Van Assche 415*44704f69SBart Van Assche /* Following is pre-Win10; used with DeviceIoControl(IOCTL_SCSI_MINIPORT), 416*44704f69SBart Van Assche * in Win10 need DeviceIoControl(IOCTL_STORAGE_PROTOCOL_COMMAND) for pure 417*44704f69SBart Van Assche * pass-through. Win10 also has "Protocol specific queries" for things like 418*44704f69SBart Van Assche * Identify and Get feature. */ 419*44704f69SBart Van Assche typedef struct _NVME_PASS_THROUGH_IOCTL 420*44704f69SBart Van Assche { 421*44704f69SBart Van Assche SRB_IO_CONTROL SrbIoCtrl; 422*44704f69SBart Van Assche ULONG VendorSpecific[6]; 423*44704f69SBart Van Assche ULONG NVMeCmd[16]; /* Command DW[0...15] */ 424*44704f69SBart Van Assche ULONG CplEntry[4]; /* Completion DW[0...3] */ 425*44704f69SBart Van Assche ULONG Direction; /* 0=None, 1=Out, 2=In, 3=I/O */ 426*44704f69SBart Van Assche ULONG QueueId; /* 0=AdminQ */ 427*44704f69SBart Van Assche ULONG DataBufferLen; /* sizeof(DataBuffer) if Data In */ 428*44704f69SBart Van Assche ULONG MetaDataLen; 429*44704f69SBart Van Assche ULONG ReturnBufferLen; /* offsetof(DataBuffer), plus 430*44704f69SBart Van Assche * sizeof(DataBuffer) if Data Out */ 431*44704f69SBart Van Assche UCHAR DataBuffer[1]; 432*44704f69SBart Van Assche } NVME_PASS_THROUGH_IOCTL; 433*44704f69SBart Van Assche #pragma pack() 434*44704f69SBart Van Assche 435*44704f69SBart Van Assche #endif // NVME_PASS_THROUGH_SRB_IO_CODE 436*44704f69SBart Van Assche 437*44704f69SBart Van Assche 438*44704f69SBart Van Assche /* 439*44704f69SBart Van Assche * method codes 440*44704f69SBart Van Assche */ 441*44704f69SBart Van Assche #define METHOD_BUFFERED 0 442*44704f69SBart Van Assche #define METHOD_IN_DIRECT 1 443*44704f69SBart Van Assche #define METHOD_OUT_DIRECT 2 444*44704f69SBart Van Assche #define METHOD_NEITHER 3 445*44704f69SBart Van Assche 446*44704f69SBart Van Assche 447*44704f69SBart Van Assche #define IOCTL_SCSI_BASE 0x00000004 448*44704f69SBart Van Assche 449*44704f69SBart Van Assche /* 450*44704f69SBart Van Assche * constants for DataIn member of SCSI_PASS_THROUGH* structures 451*44704f69SBart Van Assche */ 452*44704f69SBart Van Assche #define SCSI_IOCTL_DATA_OUT 0 453*44704f69SBart Van Assche #define SCSI_IOCTL_DATA_IN 1 454*44704f69SBart Van Assche #define SCSI_IOCTL_DATA_UNSPECIFIED 2 455*44704f69SBart Van Assche 456*44704f69SBart Van Assche #define IOCTL_SCSI_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x0401, \ 457*44704f69SBart Van Assche METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 458*44704f69SBart Van Assche #define IOCTL_SCSI_MINIPORT CTL_CODE(IOCTL_SCSI_BASE, 0x0402, \ 459*44704f69SBart Van Assche METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 460*44704f69SBart Van Assche #define IOCTL_SCSI_GET_INQUIRY_DATA CTL_CODE(IOCTL_SCSI_BASE, 0x0403, \ 461*44704f69SBart Van Assche METHOD_BUFFERED, FILE_ANY_ACCESS) 462*44704f69SBart Van Assche #define IOCTL_SCSI_GET_CAPABILITIES CTL_CODE(IOCTL_SCSI_BASE, 0x0404, \ 463*44704f69SBart Van Assche METHOD_BUFFERED, FILE_ANY_ACCESS) 464*44704f69SBart Van Assche #define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE(IOCTL_SCSI_BASE, 0x0405, \ 465*44704f69SBart Van Assche METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) 466*44704f69SBart Van Assche #define IOCTL_SCSI_GET_ADDRESS CTL_CODE(IOCTL_SCSI_BASE, 0x0406, \ 467*44704f69SBart Van Assche METHOD_BUFFERED, FILE_ANY_ACCESS) 468*44704f69SBart Van Assche 469*44704f69SBart Van Assche #ifdef __cplusplus 470*44704f69SBart Van Assche } 471*44704f69SBart Van Assche #endif 472*44704f69SBart Van Assche 473*44704f69SBart Van Assche #endif /* SG_PT_WIN32_H */ 474