xref: /aosp_15_r20/external/sg3_utils/include/sg_pt_win32.h (revision 44704f698541f6367e81f991ef8bb54ccbf3fc18)
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