xref: /reactos/sdk/include/psdk/ntddstor.h (revision e1605243)
1 /*
2  * ntddstor.h
3  *
4  * Storage class IOCTL interface.
5  *
6  * This file is part of the w32api package.
7  *
8  * Contributors:
9  *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10  *
11  * THIS SOFTWARE IS NOT COPYRIGHTED
12  *
13  * This source code is offered for use in the public domain. You may
14  * use, modify or distribute it freely.
15  *
16  * This code is distributed in the hope that it will be useful but
17  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18  * DISCLAIMED. This includes but is not limited to warranties of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20  *
21  */
22 
23 #ifndef _NTDDSTOR_H_
24 #define _NTDDSTOR_H_
25 
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29 
30 #if defined(DEFINE_GUID)
31 
32 DEFINE_GUID(GUID_DEVINTERFACE_DISK,
33   0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
34 
35 DEFINE_GUID(GUID_DEVINTERFACE_CDROM,
36   0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
37 
38 DEFINE_GUID(GUID_DEVINTERFACE_PARTITION,
39   0x53f5630aL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
40 
41 DEFINE_GUID(GUID_DEVINTERFACE_TAPE,
42   0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
43 
44 DEFINE_GUID(GUID_DEVINTERFACE_WRITEONCEDISK,
45   0x53f5630cL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
46 
47 DEFINE_GUID(GUID_DEVINTERFACE_VOLUME,
48   0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
49 
50 DEFINE_GUID(GUID_DEVINTERFACE_MEDIUMCHANGER,
51   0x53f56310L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
52 
53 DEFINE_GUID(GUID_DEVINTERFACE_FLOPPY,
54   0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
55 
56 DEFINE_GUID(GUID_DEVINTERFACE_CDCHANGER,
57   0x53f56312L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
58 
59 DEFINE_GUID(GUID_DEVINTERFACE_STORAGEPORT,
60   0x2accfe60L, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
61 
62 DEFINE_GUID(GUID_DEVINTERFACE_HIDDEN_VOLUME,
63   0x7f108a28L, 0x9833, 0x4b3b, 0xb7, 0x80, 0x2c, 0x6b, 0x5f, 0xa5, 0xc0, 0x62);
64 
65 #define WDI_STORAGE_PREDICT_FAILURE_DPS_GUID \
66   {0xe9f2d03aL, 0x747c, 0x41c2, {0xbb, 0x9a, 0x02, 0xc6, 0x2b, 0x6d, 0x5f, 0xcb}};
67 
68 /* Aliases for storage guids */
69 #define DiskClassGuid               GUID_DEVINTERFACE_DISK
70 #define CdRomClassGuid              GUID_DEVINTERFACE_CDROM
71 #define PartitionClassGuid          GUID_DEVINTERFACE_PARTITION
72 #define TapeClassGuid               GUID_DEVINTERFACE_TAPE
73 #define WriteOnceDiskClassGuid      GUID_DEVINTERFACE_WRITEONCEDISK
74 #define VolumeClassGuid             GUID_DEVINTERFACE_VOLUME
75 #define MediumChangerClassGuid      GUID_DEVINTERFACE_MEDIUMCHANGER
76 #define FloppyClassGuid             GUID_DEVINTERFACE_FLOPPY
77 #define CdChangerClassGuid          GUID_DEVINTERFACE_CDCHANGER
78 #define StoragePortClassGuid        GUID_DEVINTERFACE_STORAGEPORT
79 #define HiddenVolumeClassGuid       GUID_DEVINTERFACE_HIDDEN_VOLUME
80 
81 #endif /* defined(DEFINE_GUID) */
82 
83 #ifndef _WINIOCTL_
84 
85 #define IOCTL_STORAGE_BASE                FILE_DEVICE_MASS_STORAGE
86 
87 #define IOCTL_STORAGE_CHECK_VERIFY \
88   CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
89 
90 #define IOCTL_STORAGE_CHECK_VERIFY2 \
91   CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS)
92 
93 #define IOCTL_STORAGE_MEDIA_REMOVAL \
94   CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
95 
96 #define IOCTL_STORAGE_EJECT_MEDIA \
97   CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
98 
99 #define IOCTL_STORAGE_LOAD_MEDIA \
100   CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
101 
102 #define IOCTL_STORAGE_LOAD_MEDIA2 \
103   CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS)
104 
105 #define IOCTL_STORAGE_RESERVE \
106   CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
107 
108 #define IOCTL_STORAGE_RELEASE \
109   CTL_CODE(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)
110 
111 #define IOCTL_STORAGE_FIND_NEW_DEVICES \
112   CTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
113 
114 #define IOCTL_STORAGE_EJECTION_CONTROL \
115   CTL_CODE(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS)
116 
117 #define IOCTL_STORAGE_MCN_CONTROL \
118   CTL_CODE(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS)
119 
120 #define IOCTL_STORAGE_GET_MEDIA_TYPES \
121   CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
122 
123 #define IOCTL_STORAGE_GET_MEDIA_TYPES_EX \
124   CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS)
125 
126 #define IOCTL_STORAGE_RESET_BUS \
127   CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS)
128 
129 #define IOCTL_STORAGE_RESET_DEVICE \
130   CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS)
131 
132 #define IOCTL_STORAGE_GET_DEVICE_NUMBER \
133   CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS)
134 
135 #define IOCTL_STORAGE_PREDICT_FAILURE \
136   CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS)
137 
138 #endif /* _WINIOCTL_ */
139 
140 #define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER \
141   CTL_CODE(IOCTL_STORAGE_BASE, 0x0304, METHOD_BUFFERED, FILE_ANY_ACCESS)
142 
143 #define IOCTL_STORAGE_GET_HOTPLUG_INFO \
144   CTL_CODE(IOCTL_STORAGE_BASE, 0x0305, METHOD_BUFFERED, FILE_ANY_ACCESS)
145 
146 #define IOCTL_STORAGE_SET_HOTPLUG_INFO \
147   CTL_CODE(IOCTL_STORAGE_BASE, 0x0306, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
148 
149 #define OBSOLETE_IOCTL_STORAGE_RESET_BUS \
150   CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
151 
152 #define OBSOLETE_IOCTL_STORAGE_RESET_DEVICE \
153   CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
154 
155 #define IOCTL_STORAGE_BREAK_RESERVATION \
156   CTL_CODE(IOCTL_STORAGE_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS)
157 
158 #define IOCTL_STORAGE_PERSISTENT_RESERVE_IN \
159   CTL_CODE(IOCTL_STORAGE_BASE, 0x0406, METHOD_BUFFERED, FILE_READ_ACCESS)
160 
161 #define IOCTL_STORAGE_PERSISTENT_RESERVE_OUT \
162   CTL_CODE(IOCTL_STORAGE_BASE, 0x0407, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
163 
164 #define IOCTL_STORAGE_READ_CAPACITY \
165   CTL_CODE(IOCTL_STORAGE_BASE, 0x0450, METHOD_BUFFERED, FILE_READ_ACCESS)
166 
167 #define IOCTL_STORAGE_QUERY_PROPERTY \
168   CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
169 
170 #define IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES \
171   CTL_CODE(IOCTL_STORAGE_BASE, 0x0501, METHOD_BUFFERED, FILE_WRITE_ACCESS)
172 
173 #define IOCTL_STORAGE_GET_LB_PROVISIONING_MAP_RESOURCES \
174   CTL_CODE(IOCTL_STORAGE_BASE, 0x0502, METHOD_BUFFERED, FILE_READ_ACCESS)
175 
176 #define IOCTL_STORAGE_GET_BC_PROPERTIES \
177   CTL_CODE(IOCTL_STORAGE_BASE, 0x0600, METHOD_BUFFERED, FILE_READ_ACCESS)
178 
179 #define IOCTL_STORAGE_ALLOCATE_BC_STREAM \
180   CTL_CODE(IOCTL_STORAGE_BASE, 0x0601, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
181 
182 #define IOCTL_STORAGE_FREE_BC_STREAM \
183   CTL_CODE(IOCTL_STORAGE_BASE, 0x0602, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
184 
185 #define IOCTL_STORAGE_CHECK_PRIORITY_HINT_SUPPORT \
186   CTL_CODE(IOCTL_STORAGE_BASE, 0x0620, METHOD_BUFFERED, FILE_ANY_ACCESS)
187 
188 #define IOCTL_STORAGE_START_DATA_INTEGRITY_CHECK \
189   CTL_CODE(IOCTL_STORAGE_BASE, 0x0621, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
190 
191 #define IOCTL_STORAGE_STOP_DATA_INTEGRITY_CHECK  \
192   CTL_CODE(IOCTL_STORAGE_BASE, 0x0622, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
193 
194 #define IOCTL_STORAGE_FIRMWARE_GET_INFO \
195   CTL_CODE(IOCTL_STORAGE_BASE, 0x0700, METHOD_BUFFERED, FILE_ANY_ACCESS)
196 
197 #define IOCTL_STORAGE_FIRMWARE_DOWNLOAD \
198   CTL_CODE(IOCTL_STORAGE_BASE, 0x0701, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
199 
200 #define IOCTL_STORAGE_FIRMWARE_ACTIVATE \
201   CTL_CODE(IOCTL_STORAGE_BASE, 0x0702, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
202 
203 #define IOCTL_STORAGE_ENABLE_IDLE_POWER \
204   CTL_CODE(IOCTL_STORAGE_BASE, 0x0720, METHOD_BUFFERED, FILE_ANY_ACCESS)
205 
206 #define IOCTL_STORAGE_GET_IDLE_POWERUP_REASON \
207   CTL_CODE(IOCTL_STORAGE_BASE, 0x0721, METHOD_BUFFERED, FILE_ANY_ACCESS)
208 
209 #define IOCTL_STORAGE_POWER_ACTIVE \
210   CTL_CODE(IOCTL_STORAGE_BASE, 0x0722, METHOD_BUFFERED, FILE_ANY_ACCESS)
211 
212 #define IOCTL_STORAGE_POWER_IDLE \
213   CTL_CODE(IOCTL_STORAGE_BASE, 0x0723, METHOD_BUFFERED, FILE_ANY_ACCESS)
214 
215 #define IOCTL_STORAGE_EVENT_NOTIFICATION \
216   CTL_CODE(IOCTL_STORAGE_BASE, 0x0724, METHOD_BUFFERED, FILE_ANY_ACCESS)
217 
218 #define IOCTL_STORAGE_DEVICE_POWER_CAP \
219   CTL_CODE(IOCTL_STORAGE_BASE, 0x0725, METHOD_BUFFERED, FILE_ANY_ACCESS)
220 
221 #define IOCTL_STORAGE_RPMB_COMMAND \
222   CTL_CODE(IOCTL_STORAGE_BASE, 0x0726, METHOD_BUFFERED, FILE_ANY_ACCESS)
223 
224 #define IOCTL_STORAGE_ATTRIBUTE_MANAGEMENT \
225   CTL_CODE(IOCTL_STORAGE_BASE, 0x0727, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
226 
227 #define IOCTL_STORAGE_DIAGNOSTIC \
228   CTL_CODE(IOCTL_STORAGE_BASE, 0x0728, METHOD_BUFFERED, FILE_ANY_ACCESS)
229 
230 #define IOCTL_STORAGE_GET_PHYSICAL_ELEMENT_STATUS \
231   CTL_CODE(IOCTL_STORAGE_BASE, 0x0729, METHOD_BUFFERED, FILE_ANY_ACCESS)
232 
233 #define IOCTL_STORAGE_REMOVE_ELEMENT_AND_TRUNCATE \
234   CTL_CODE(IOCTL_STORAGE_BASE, 0x0730, METHOD_BUFFERED, FILE_ANY_ACCESS)
235 
236 #define IOCTL_STORAGE_GET_DEVICE_INTERNAL_LOG \
237   CTL_CODE(IOCTL_STORAGE_BASE, 0x0731, METHOD_BUFFERED, FILE_ANY_ACCESS)
238 
239 #define RECOVERED_WRITES_VALID         0x00000001
240 #define UNRECOVERED_WRITES_VALID       0x00000002
241 #define RECOVERED_READS_VALID          0x00000004
242 #define UNRECOVERED_READS_VALID        0x00000008
243 #define WRITE_COMPRESSION_INFO_VALID   0x00000010
244 #define READ_COMPRESSION_INFO_VALID    0x00000020
245 
246 #define TAPE_RETURN_STATISTICS         0L
247 #define TAPE_RETURN_ENV_INFO           1L
248 #define TAPE_RESET_STATISTICS          2L
249 
250 /* DEVICE_MEDIA_INFO.DeviceSpecific.DiskInfo.MediaCharacteristics constants */
251 #define MEDIA_ERASEABLE                   0x00000001
252 #define MEDIA_WRITE_ONCE                  0x00000002
253 #define MEDIA_READ_ONLY                   0x00000004
254 #define MEDIA_READ_WRITE                  0x00000008
255 #define MEDIA_WRITE_PROTECTED             0x00000100
256 #define MEDIA_CURRENTLY_MOUNTED           0x80000000
257 
258 #define StorageIdTypeNAA StorageIdTypeFCPHName
259 
260 #define DeviceDsmActionFlag_NonDestructive  0x80000000
261 
262 #define IsDsmActionNonDestructive(_Action) ((BOOLEAN)((_Action & DeviceDsmActionFlag_NonDestructive) != 0))
263 
264 #define DeviceDsmAction_None                    0x0u
265 #define DeviceDsmAction_Trim                    0x1u
266 #define DeviceDsmAction_Notification            (0x00000002u | DeviceDsmActionFlag_NonDestructive)
267 #define DeviceDsmAction_OffloadRead             (0x00000003u | DeviceDsmActionFlag_NonDestructive)
268 #define DeviceDsmAction_OffloadWrite            (0x00000004u)
269 #define DeviceDsmAction_Allocation              (0x00000005u | DeviceDsmActionFlag_NonDestructive)
270 #define DeviceDsmAction_Repair                  (0x00000006u | DeviceDsmActionFlag_NonDestructive)
271 #define DeviceDsmAction_Scrub                   (0x00000007u | DeviceDsmActionFlag_NonDestructive)
272 #define DeviceDsmAction_DrtQuery                (0x00000008u | DeviceDsmActionFlag_NonDestructive)
273 #define DeviceDsmAction_DrtClear                (0x00000009u | DeviceDsmActionFlag_NonDestructive)
274 #define DeviceDsmAction_DrtDisable              (0x0000000Au | DeviceDsmActionFlag_NonDestructive)
275 #define DeviceDsmAction_TieringQuery            (0x0000000Bu | DeviceDsmActionFlag_NonDestructive)
276 #define DeviceDsmAction_Map                     (0x0000000Cu | DeviceDsmActionFlag_NonDestructive)
277 #define DeviceDsmAction_RegenerateParity        (0x0000000Du | DeviceDsmActionFlag_NonDestructive)
278 #define DeviceDsmAction_NvCache_Change_Priority (0x0000000Eu | DeviceDsmActionFlag_NonDestructive)
279 #define DeviceDsmAction_NvCache_Evict           (0x0000000Fu | DeviceDsmActionFlag_NonDestructive)
280 #define DeviceDsmAction_TopologyIdQuery         (0x00000010u | DeviceDsmActionFlag_NonDestructive)
281 #define DeviceDsmAction_GetPhysicalAddresses    (0x00000011u | DeviceDsmActionFlag_NonDestructive)
282 #define DeviceDsmAction_ScopeRegen              (0x00000012u | DeviceDsmActionFlag_NonDestructive)
283 #define DeviceDsmAction_ReportZones             (0x00000013u | DeviceDsmActionFlag_NonDestructive)
284 #define DeviceDsmAction_OpenZone                (0x00000014u | DeviceDsmActionFlag_NonDestructive)
285 #define DeviceDsmAction_FinishZone              (0x00000015u | DeviceDsmActionFlag_NonDestructive)
286 #define DeviceDsmAction_CloseZone               (0x00000016u | DeviceDsmActionFlag_NonDestructive)
287 #define DeviceDsmAction_ResetWritePointer       (0x00000017u)
288 #define DeviceDsmAction_GetRangeErrorInfo       (0x00000018u | DeviceDsmActionFlag_NonDestructive)
289 #define DeviceDsmAction_WriteZeroes             (0x00000019u)
290 #define DeviceDsmAction_LostQuery               (0x0000001Au | DeviceDsmActionFlag_NonDestructive)
291 #define DeviceDsmAction_GetFreeSpace            (0x0000001Bu | DeviceDsmActionFlag_NonDestructive)
292 #define DeviceDsmAction_ConversionQuery         (0x0000001Cu | DeviceDsmActionFlag_NonDestructive)
293 #define DeviceDsmAction_VdtSet                  (0x0000001Du)
294 
295 #define DEVICE_DSM_FLAG_ENTIRE_DATA_SET_RANGE    0x00000001
296 
297 #define DEVICE_DSM_NOTIFY_FLAG_BEGIN             0x00000001
298 #define DEVICE_DSM_NOTIFY_FLAG_END               0x00000002
299 
300 #define IOCTL_STORAGE_BC_VERSION                 1
301 
302 #define STORAGE_PRIORITY_HINT_SUPPORTED          0x0001
303 
304 typedef struct _STORAGE_HOTPLUG_INFO {
305   ULONG Size;
306   BOOLEAN MediaRemovable;
307   BOOLEAN MediaHotplug;
308   BOOLEAN DeviceHotplug;
309   BOOLEAN WriteCacheEnableOverride;
310 } STORAGE_HOTPLUG_INFO, *PSTORAGE_HOTPLUG_INFO;
311 
312 typedef struct _STORAGE_DEVICE_NUMBER {
313   DEVICE_TYPE DeviceType;
314   ULONG DeviceNumber;
315   ULONG PartitionNumber;
316 } STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER;
317 
318 typedef struct _STORAGE_BUS_RESET_REQUEST {
319   UCHAR PathId;
320 } STORAGE_BUS_RESET_REQUEST, *PSTORAGE_BUS_RESET_REQUEST;
321 
322 typedef struct _STORAGE_BREAK_RESERVATION_REQUEST {
323   ULONG Length;
324   UCHAR _unused;
325   UCHAR PathId;
326   UCHAR TargetId;
327   UCHAR Lun;
328 } STORAGE_BREAK_RESERVATION_REQUEST, *PSTORAGE_BREAK_RESERVATION_REQUEST;
329 
330 #ifndef _WINIOCTL_
331 typedef struct _PREVENT_MEDIA_REMOVAL {
332   BOOLEAN PreventMediaRemoval;
333 } PREVENT_MEDIA_REMOVAL, *PPREVENT_MEDIA_REMOVAL;
334 #endif
335 
336 typedef struct _CLASS_MEDIA_CHANGE_CONTEXT {
337   ULONG MediaChangeCount;
338   ULONG NewState;
339 } CLASS_MEDIA_CHANGE_CONTEXT, *PCLASS_MEDIA_CHANGE_CONTEXT;
340 
341 typedef struct _TAPE_STATISTICS {
342   ULONG Version;
343   ULONG Flags;
344   LARGE_INTEGER RecoveredWrites;
345   LARGE_INTEGER UnrecoveredWrites;
346   LARGE_INTEGER RecoveredReads;
347   LARGE_INTEGER UnrecoveredReads;
348   UCHAR CompressionRatioReads;
349   UCHAR CompressionRatioWrites;
350 } TAPE_STATISTICS, *PTAPE_STATISTICS;
351 
352 typedef struct _TAPE_GET_STATISTICS {
353   ULONG Operation;
354 } TAPE_GET_STATISTICS, *PTAPE_GET_STATISTICS;
355 
356 typedef enum _STORAGE_MEDIA_TYPE {
357   DDS_4mm = 0x20,
358   MiniQic,
359   Travan,
360   QIC,
361   MP_8mm,
362   AME_8mm,
363   AIT1_8mm,
364   DLT,
365   NCTP,
366   IBM_3480,
367   IBM_3490E,
368   IBM_Magstar_3590,
369   IBM_Magstar_MP,
370   STK_DATA_D3,
371   SONY_DTF,
372   DV_6mm,
373   DMI,
374   SONY_D2,
375   CLEANER_CARTRIDGE,
376   CD_ROM,
377   CD_R,
378   CD_RW,
379   DVD_ROM,
380   DVD_R,
381   DVD_RW,
382   MO_3_RW,
383   MO_5_WO,
384   MO_5_RW,
385   MO_5_LIMDOW,
386   PC_5_WO,
387   PC_5_RW,
388   PD_5_RW,
389   ABL_5_WO,
390   PINNACLE_APEX_5_RW,
391   SONY_12_WO,
392   PHILIPS_12_WO,
393   HITACHI_12_WO,
394   CYGNET_12_WO,
395   KODAK_14_WO,
396   MO_NFR_525,
397   NIKON_12_RW,
398   IOMEGA_ZIP,
399   IOMEGA_JAZ,
400   SYQUEST_EZ135,
401   SYQUEST_EZFLYER,
402   SYQUEST_SYJET,
403   AVATAR_F2,
404   MP2_8mm,
405   DST_S,
406   DST_M,
407   DST_L,
408   VXATape_1,
409   VXATape_2,
410 #if (NTDDI_VERSION < NTDDI_WINXP)
411   STK_EAGLE,
412 #else
413   STK_9840,
414 #endif
415   LTO_Ultrium,
416   LTO_Accelis,
417   DVD_RAM,
418   AIT_8mm,
419   ADR_1,
420   ADR_2,
421   STK_9940,
422   SAIT,
423   VXATape
424 } STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
425 
426 typedef enum _STORAGE_BUS_TYPE {
427   BusTypeUnknown = 0x00,
428   BusTypeScsi,
429   BusTypeAtapi,
430   BusTypeAta,
431   BusType1394,
432   BusTypeSsa,
433   BusTypeFibre,
434   BusTypeUsb,
435   BusTypeRAID,
436   BusTypeiScsi,
437   BusTypeSas,
438   BusTypeSata,
439   BusTypeSd,
440   BusTypeMmc,
441   BusTypeVirtual,
442   BusTypeFileBackedVirtual,
443   BusTypeMax,
444   BusTypeMaxReserved = 0x7F
445 } STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
446 
447 typedef struct _DEVICE_MEDIA_INFO {
448   union {
449     struct {
450       LARGE_INTEGER Cylinders;
451       STORAGE_MEDIA_TYPE MediaType;
452       ULONG TracksPerCylinder;
453       ULONG SectorsPerTrack;
454       ULONG BytesPerSector;
455       ULONG NumberMediaSides;
456       ULONG MediaCharacteristics;
457     } DiskInfo;
458     struct {
459       LARGE_INTEGER Cylinders;
460       STORAGE_MEDIA_TYPE MediaType;
461       ULONG TracksPerCylinder;
462       ULONG SectorsPerTrack;
463       ULONG BytesPerSector;
464       ULONG NumberMediaSides;
465       ULONG MediaCharacteristics;
466     } RemovableDiskInfo;
467     struct {
468       STORAGE_MEDIA_TYPE MediaType;
469       ULONG MediaCharacteristics;
470       ULONG CurrentBlockSize;
471       STORAGE_BUS_TYPE BusType;
472       union {
473         struct {
474           UCHAR MediumType;
475           UCHAR DensityCode;
476         } ScsiInformation;
477       } BusSpecificData;
478     } TapeInfo;
479   } DeviceSpecific;
480 } DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;
481 
482 typedef struct _GET_MEDIA_TYPES {
483   ULONG DeviceType;
484   ULONG MediaInfoCount;
485   DEVICE_MEDIA_INFO MediaInfo[1];
486 } GET_MEDIA_TYPES, *PGET_MEDIA_TYPES;
487 
488 typedef struct _STORAGE_PREDICT_FAILURE {
489   ULONG PredictFailure;
490   UCHAR VendorSpecific[512];
491 } STORAGE_PREDICT_FAILURE, *PSTORAGE_PREDICT_FAILURE;
492 
493 typedef enum _STORAGE_QUERY_TYPE {
494   PropertyStandardQuery = 0,
495   PropertyExistsQuery,
496   PropertyMaskQuery,
497   PropertyQueryMaxDefined
498 } STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
499 
500 typedef enum _STORAGE_PROPERTY_ID {
501   StorageDeviceProperty = 0,
502   StorageAdapterProperty,
503   StorageDeviceIdProperty,
504   StorageDeviceUniqueIdProperty,
505   StorageDeviceWriteCacheProperty,
506   StorageMiniportProperty,
507   StorageAccessAlignmentProperty,
508   StorageDeviceSeekPenaltyProperty,
509   StorageDeviceTrimProperty,
510   StorageDeviceWriteAggregationProperty,
511   StorageDeviceDeviceTelemetryProperty,
512   StorageDeviceLBProvisioningProperty,
513   StorageDevicePowerProperty,
514   StorageDeviceCopyOffloadProperty,
515   StorageDeviceResiliencyProperty,
516   StorageDeviceMediumProductType,
517   StorageAdapterRpmbProperty,
518   StorageAdapterCryptoProperty,
519   StorageDeviceTieringProperty,
520   StorageDeviceFaultDomainProperty,
521   StorageDeviceClusportProperty,
522   StorageDeviceDependantDevicesProperty,
523   StorageDeviceIoCapabilityProperty = 48,
524   StorageAdapterProtocolSpecificProperty,
525   StorageDeviceProtocolSpecificProperty,
526   StorageAdapterTemperatureProperty,
527   StorageDeviceTemperatureProperty,
528   StorageAdapterPhysicalTopologyProperty,
529   StorageDevicePhysicalTopologyProperty,
530   StorageDeviceAttributesProperty,
531   StorageDeviceManagementStatus,
532   StorageAdapterSerialNumberProperty,
533   StorageDeviceLocationProperty,
534   StorageDeviceNumaProperty,
535   StorageDeviceZonedDeviceProperty,
536   StorageDeviceUnsafeShutdownCount,
537   StorageDeviceEnduranceProperty,
538 } STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
539 
540 typedef struct _STORAGE_PROPERTY_QUERY {
541   STORAGE_PROPERTY_ID PropertyId;
542   STORAGE_QUERY_TYPE QueryType;
543   UCHAR AdditionalParameters[1];
544 } STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
545 
546 typedef _Struct_size_bytes_(Size) struct _STORAGE_DESCRIPTOR_HEADER {
547   ULONG Version;
548   ULONG Size;
549 } STORAGE_DESCRIPTOR_HEADER, *PSTORAGE_DESCRIPTOR_HEADER;
550 
551 typedef _Struct_size_bytes_(Size) struct _STORAGE_DEVICE_DESCRIPTOR {
552   ULONG Version;
553   ULONG Size;
554   UCHAR DeviceType;
555   UCHAR DeviceTypeModifier;
556   BOOLEAN RemovableMedia;
557   BOOLEAN CommandQueueing;
558   ULONG VendorIdOffset;
559   ULONG ProductIdOffset;
560   ULONG ProductRevisionOffset;
561   ULONG SerialNumberOffset;
562   STORAGE_BUS_TYPE BusType;
563   ULONG RawPropertiesLength;
564   UCHAR RawDeviceProperties[1];
565 } STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
566 
567 typedef _Struct_size_bytes_(Size) struct _STORAGE_ADAPTER_DESCRIPTOR {
568   ULONG Version;
569   ULONG Size;
570   ULONG MaximumTransferLength;
571   ULONG MaximumPhysicalPages;
572   ULONG AlignmentMask;
573   BOOLEAN AdapterUsesPio;
574   BOOLEAN AdapterScansDown;
575   BOOLEAN CommandQueueing;
576   BOOLEAN AcceleratedTransfer;
577 #if (NTDDI_VERSION < NTDDI_WINXP)
578   BOOLEAN BusType;
579 #else
580   UCHAR BusType;
581 #endif
582   USHORT BusMajorVersion;
583   USHORT BusMinorVersion;
584 #if (NTDDI_VERSION >= NTDDI_WIN8)
585   UCHAR SrbType;
586   UCHAR AddressType;
587 #endif
588 } STORAGE_ADAPTER_DESCRIPTOR, *PSTORAGE_ADAPTER_DESCRIPTOR;
589 
590 typedef _Struct_size_bytes_(Size) struct _STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR {
591   ULONG Version;
592   ULONG Size;
593   ULONG BytesPerCacheLine;
594   ULONG BytesOffsetForCacheAlignment;
595   ULONG BytesPerLogicalSector;
596   ULONG BytesPerPhysicalSector;
597   ULONG BytesOffsetForSectorAlignment;
598 } STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR, *PSTORAGE_ACCESS_ALIGNMENT_DESCRIPTOR;
599 
600 typedef _Struct_size_bytes_(Size) struct _STORAGE_MEDIUM_PRODUCT_TYPE_DESCRIPTOR {
601   ULONG Version;
602   ULONG Size;
603   ULONG MediumProductType;
604 } STORAGE_MEDIUM_PRODUCT_TYPE_DESCRIPTOR, *PSTORAGE_MEDIUM_PRODUCT_TYPE_DESCRIPTOR;
605 
606 typedef enum _STORAGE_PORT_CODE_SET {
607   StoragePortCodeSetReserved = 0,
608   StoragePortCodeSetStorport = 1,
609   StoragePortCodeSetSCSIport = 2,
610   StoragePortCodeSetSpaceport= 3,
611   StoragePortCodeSetATAport  = 4,
612   StoragePortCodeSetUSBport  = 5,
613   StoragePortCodeSetSBP2port = 6,
614   StoragePortCodeSetSDport   = 7
615 } STORAGE_PORT_CODE_SET, *PSTORAGE_PORT_CODE_SET;
616 
617 typedef struct _STORAGE_MINIPORT_DESCRIPTOR {
618   ULONG Version;
619   ULONG Size;
620   STORAGE_PORT_CODE_SET Portdriver;
621   BOOLEAN LUNResetSupported;
622   BOOLEAN TargetResetSupported;
623 #if (NTDDI_VERSION >= NTDDI_WIN8)
624   USHORT IoTimeoutValue;
625 #endif
626 #if (NTDDI_VERSION >= NTDDI_WINBLUE)
627   BOOLEAN ExtraIoInfoSupported;
628   UCHAR Reserved0[3];
629   ULONG Reserved1;
630 #endif
631 } STORAGE_MINIPORT_DESCRIPTOR, *PSTORAGE_MINIPORT_DESCRIPTOR;
632 
633 typedef struct _DEVICE_LB_PROVISIONING_DESCRIPTOR {
634   ULONG Version;
635   ULONG Size;
636   UCHAR ThinProvisioningEnabled:1;
637   UCHAR ThinProvisioningReadZeros:1;
638   UCHAR AnchorSupported:3;
639   UCHAR UnmapGranularityAlignmentValid:1;
640   UCHAR Reserved0:2;
641   UCHAR Reserved1[7];
642   ULONGLONG OptimalUnmapGranularity;
643   ULONGLONG UnmapGranularityAlignment;
644 #if (NTDDI_VERSION >= NTDDI_WINBLUE)
645   ULONG MaxUnmapLbaCount;
646   ULONG MaxUnmapBlockDescriptorCount;
647 #endif
648 } DEVICE_LB_PROVISIONING_DESCRIPTOR, *PDEVICE_LB_PROVISIONING_DESCRIPTOR;
649 
650 #define DEVICE_LB_PROVISIONING_DESCRIPTOR_V1_SIZE RTL_SIZEOF_THROUGH_FIELD(DEVICE_LB_PROVISIONING_DESCRIPTOR, UnmapGranularityAlignment)
651 
652 typedef struct _DEVICE_POWER_DESCRIPTOR {
653   ULONG Version;
654   ULONG Size;
655   BOOLEAN DeviceAttentionSupported;
656   BOOLEAN AsynchronousNotificationSupported;
657   BOOLEAN IdlePowerManagementEnabled;
658   BOOLEAN D3ColdEnabled;
659   BOOLEAN D3ColdSupported;
660   BOOLEAN NoVerifyDuringIdlePower;
661   UCHAR Reserved[2];
662   ULONG IdleTimeoutInMS;
663 } DEVICE_POWER_DESCRIPTOR, *PDEVICE_POWER_DESCRIPTOR;
664 
665 typedef struct _DEVICE_COPY_OFFLOAD_DESCRIPTOR {
666   ULONG Version;
667   ULONG Size;
668   ULONG MaximumTokenLifetime;
669   ULONG DefaultTokenLifetime;
670   ULONGLONG MaximumTransferSize;
671   ULONGLONG OptimalTransferCount;
672   ULONG MaximumDataDescriptors;
673   ULONG MaximumTransferLengthPerDescriptor;
674   ULONG OptimalTransferLengthPerDescriptor;
675   USHORT OptimalTransferLengthGranularity;
676   UCHAR Reserved[2];
677 } DEVICE_COPY_OFFLOAD_DESCRIPTOR, *PDEVICE_COPY_OFFLOAD_DESCRIPTOR;
678 
679 typedef _Struct_size_bytes_(Size) struct _STORAGE_DEVICE_IO_CAPABILITY_DESCRIPTOR {
680   ULONG Version;
681   ULONG Size;
682   ULONG LunMaxIoCount;
683   ULONG AdapterMaxIoCount;
684 } STORAGE_DEVICE_IO_CAPABILITY_DESCRIPTOR, *PSTORAGE_DEVICE_IO_CAPABILITY_DESCRIPTOR;
685 
686 typedef enum _STORAGE_IDENTIFIER_CODE_SET {
687   StorageIdCodeSetReserved = 0,
688   StorageIdCodeSetBinary = 1,
689   StorageIdCodeSetAscii = 2,
690   StorageIdCodeSetUtf8 = 3
691 } STORAGE_IDENTIFIER_CODE_SET, *PSTORAGE_IDENTIFIER_CODE_SET;
692 
693 typedef enum _STORAGE_IDENTIFIER_TYPE {
694   StorageIdTypeVendorSpecific = 0,
695   StorageIdTypeVendorId = 1,
696   StorageIdTypeEUI64 = 2,
697   StorageIdTypeFCPHName = 3,
698   StorageIdTypePortRelative = 4,
699   StorageIdTypeTargetPortGroup = 5,
700   StorageIdTypeLogicalUnitGroup = 6,
701   StorageIdTypeMD5LogicalUnitIdentifier = 7,
702   StorageIdTypeScsiNameString = 8
703 } STORAGE_IDENTIFIER_TYPE, *PSTORAGE_IDENTIFIER_TYPE;
704 
705 typedef enum _STORAGE_ID_NAA_FORMAT {
706   StorageIdNAAFormatIEEEExtended = 2,
707   StorageIdNAAFormatIEEERegistered = 3,
708   StorageIdNAAFormatIEEEERegisteredExtended = 5
709 } STORAGE_ID_NAA_FORMAT, *PSTORAGE_ID_NAA_FORMAT;
710 
711 typedef enum _STORAGE_ASSOCIATION_TYPE {
712   StorageIdAssocDevice = 0,
713   StorageIdAssocPort = 1,
714   StorageIdAssocTarget = 2
715 } STORAGE_ASSOCIATION_TYPE, *PSTORAGE_ASSOCIATION_TYPE;
716 
717 typedef struct _STORAGE_IDENTIFIER {
718   STORAGE_IDENTIFIER_CODE_SET CodeSet;
719   STORAGE_IDENTIFIER_TYPE Type;
720   USHORT IdentifierSize;
721   USHORT NextOffset;
722   STORAGE_ASSOCIATION_TYPE Association;
723   UCHAR Identifier[1];
724 } STORAGE_IDENTIFIER, *PSTORAGE_IDENTIFIER;
725 
726 typedef _Struct_size_bytes_(Size) struct _STORAGE_DEVICE_ID_DESCRIPTOR {
727   ULONG Version;
728   ULONG Size;
729   ULONG NumberOfIdentifiers;
730   UCHAR Identifiers[1];
731 } STORAGE_DEVICE_ID_DESCRIPTOR, *PSTORAGE_DEVICE_ID_DESCRIPTOR;
732 
733 typedef struct _DEVICE_SEEK_PENALTY_DESCRIPTOR {
734   ULONG Version;
735   ULONG Size;
736   BOOLEAN IncursSeekPenalty;
737 } DEVICE_SEEK_PENALTY_DESCRIPTOR, *PDEVICE_SEEK_PENALTY_DESCRIPTOR;
738 
739 typedef struct _DEVICE_WRITE_AGGREGATION_DESCRIPTOR {
740   ULONG Version;
741   ULONG Size;
742   BOOLEAN BenefitsFromWriteAggregation;
743 } DEVICE_WRITE_AGGREGATION_DESCRIPTOR, *PDEVICE_WRITE_AGGREGATION_DESCRIPTOR;
744 
745 typedef struct _DEVICE_TRIM_DESCRIPTOR {
746   ULONG Version;
747   ULONG Size;
748   BOOLEAN TrimEnabled;
749 } DEVICE_TRIM_DESCRIPTOR, *PDEVICE_TRIM_DESCRIPTOR;
750 
751 typedef ULONG DEVICE_DATA_MANAGEMENT_SET_ACTION;
752 
753 #define DEVICE_DSM_FLAG_TRIM_NOT_FS_ALLOCATED 0x80000000
754 
755 typedef struct _DEVICE_DATA_SET_RANGE {
756   LONGLONG StartingOffset;
757   ULONGLONG LengthInBytes;
758 } DEVICE_DATA_SET_RANGE, *PDEVICE_DATA_SET_RANGE;
759 
760 typedef struct _DEVICE_MANAGE_DATA_SET_ATTRIBUTES {
761   ULONG Size;
762   DEVICE_DATA_MANAGEMENT_SET_ACTION Action;
763   ULONG Flags;
764   ULONG ParameterBlockOffset;
765   ULONG ParameterBlockLength;
766   ULONG DataSetRangesOffset;
767   ULONG DataSetRangesLength;
768 } DEVICE_MANAGE_DATA_SET_ATTRIBUTES, *PDEVICE_MANAGE_DATA_SET_ATTRIBUTES;
769 
770 typedef struct _DEVICE_DSM_NOTIFICATION_PARAMETERS {
771   ULONG Size;
772   ULONG Flags;
773   ULONG NumFileTypeIDs;
774   GUID FileTypeID[1];
775 } DEVICE_DSM_NOTIFICATION_PARAMETERS, *PDEVICE_DSM_NOTIFICATION_PARAMETERS;
776 
777 typedef struct _STORAGE_GET_BC_PROPERTIES_OUTPUT {
778   ULONG MaximumRequestsPerPeriod;
779   ULONG MinimumPeriod;
780   ULONGLONG MaximumRequestSize;
781   ULONG EstimatedTimePerRequest;
782   ULONG NumOutStandingRequests;
783   ULONGLONG RequestSize;
784 } STORAGE_GET_BC_PROPERTIES_OUTPUT, *PSTORAGE_GET_BC_PROPERTIES_OUTPUT;
785 
786 typedef struct _STORAGE_ALLOCATE_BC_STREAM_INPUT {
787   ULONG Version;
788   ULONG RequestsPerPeriod;
789   ULONG Period;
790   BOOLEAN RetryFailures;
791   BOOLEAN Discardable;
792   BOOLEAN Reserved1[2];
793   ULONG AccessType;
794   ULONG AccessMode;
795 } STORAGE_ALLOCATE_BC_STREAM_INPUT, *PSTORAGE_ALLOCATE_BC_STREAM_INPUT;
796 
797 typedef struct _STORAGE_ALLOCATE_BC_STREAM_OUTPUT {
798   ULONGLONG RequestSize;
799   ULONG NumOutStandingRequests;
800 } STORAGE_ALLOCATE_BC_STREAM_OUTPUT, *PSTORAGE_ALLOCATE_BC_STREAM_OUTPUT;
801 
802 typedef struct _STORAGE_PRIORITY_HINT_SUPPORT {
803   ULONG SupportFlags;
804 } STORAGE_PRIORITY_HINT_SUPPORT, *PSTORAGE_PRIORITY_HINT_SUPPORT;
805 
806 #ifdef _MSC_VER
807 #pragma warning(push)
808 #pragma warning(disable:4200)
809 #endif
810 
811 #if defined(_MSC_EXTENSIONS)
812 
813 typedef struct _STORAGE_MEDIA_SERIAL_NUMBER_DATA {
814   USHORT Reserved;
815   USHORT SerialNumberLength;
816   UCHAR SerialNumber[0];
817 } STORAGE_MEDIA_SERIAL_NUMBER_DATA, *PSTORAGE_MEDIA_SERIAL_NUMBER_DATA;
818 
819 typedef struct _PERSISTENT_RESERVE_COMMAND {
820   ULONG Version;
821   ULONG Size;
822   __MINGW_EXTENSION union {
823     struct {
824       UCHAR ServiceAction:5;
825       UCHAR Reserved1:3;
826       USHORT AllocationLength;
827     } PR_IN;
828     struct {
829       UCHAR ServiceAction:5;
830       UCHAR Reserved1:3;
831       UCHAR Type:4;
832       UCHAR Scope:4;
833       UCHAR ParameterList[0];
834     } PR_OUT;
835   } DUMMYUNIONNAME;
836 } PERSISTENT_RESERVE_COMMAND, *PPERSISTENT_RESERVE_COMMAND;
837 
838 #endif /* defined(_MSC_EXTENSIONS) */
839 
840 #ifdef _MSC_VER
841 #pragma warning(pop) /* disable:4200 */
842 #endif
843 
844 typedef _Struct_size_bytes_(Size) struct _STORAGE_READ_CAPACITY {
845   ULONG Version;
846   ULONG Size;
847   ULONG BlockLength;
848   LARGE_INTEGER NumberOfBlocks;
849   LARGE_INTEGER DiskLength;
850 } STORAGE_READ_CAPACITY, *PSTORAGE_READ_CAPACITY;
851 
852 typedef enum _WRITE_CACHE_TYPE {
853   WriteCacheTypeUnknown,
854   WriteCacheTypeNone,
855   WriteCacheTypeWriteBack,
856   WriteCacheTypeWriteThrough
857 } WRITE_CACHE_TYPE;
858 
859 typedef enum _WRITE_CACHE_ENABLE {
860   WriteCacheEnableUnknown,
861   WriteCacheDisabled,
862   WriteCacheEnabled
863 } WRITE_CACHE_ENABLE;
864 
865 typedef enum _WRITE_CACHE_CHANGE {
866   WriteCacheChangeUnknown,
867   WriteCacheNotChangeable,
868   WriteCacheChangeable
869 } WRITE_CACHE_CHANGE;
870 
871 typedef enum _WRITE_THROUGH {
872   WriteThroughUnknown,
873   WriteThroughNotSupported,
874   WriteThroughSupported
875 } WRITE_THROUGH;
876 
877 typedef _Struct_size_bytes_(Size) struct _STORAGE_WRITE_CACHE_PROPERTY {
878   ULONG Version;
879   ULONG Size;
880   WRITE_CACHE_TYPE WriteCacheType;
881   WRITE_CACHE_ENABLE WriteCacheEnabled;
882   WRITE_CACHE_CHANGE WriteCacheChangeable;
883   WRITE_THROUGH WriteThroughSupported;
884   BOOLEAN FlushCacheSupported;
885   BOOLEAN UserDefinedPowerProtection;
886   BOOLEAN NVCacheEnabled;
887 } STORAGE_WRITE_CACHE_PROPERTY, *PSTORAGE_WRITE_CACHE_PROPERTY;
888 
889 typedef struct _STORAGE_LB_PROVISIONING_MAP_RESOURCES {
890   ULONG Size;
891   ULONG Version;
892   UCHAR AvailableMappingResourcesValid:1;
893   UCHAR UsedMappingResourcesValid:1;
894   UCHAR Reserved0:6;
895   UCHAR Reserved1[3];
896   UCHAR AvailableMappingResourcesScope:2;
897   UCHAR UsedMappingResourcesScope:2;
898   UCHAR Reserved2:4;
899   UCHAR Reserved3[3];
900   ULONGLONG AvailableMappingResources;
901   ULONGLONG UsedMappingResources;
902 } STORAGE_LB_PROVISIONING_MAP_RESOURCES, *PSTORAGE_LB_PROVISIONING_MAP_RESOURCES;
903 
904 typedef struct _DEVICE_MANAGE_DATA_SET_ATTRIBUTES_OUTPUT {
905   ULONG Size;
906   DEVICE_DATA_MANAGEMENT_SET_ACTION Action;
907   ULONG Flags;
908   ULONG OperationStatus;
909   ULONG ExtendedError;
910   ULONG TargetDetailedError;
911   ULONG ReservedStatus;
912   ULONG OutputBlockOffset;
913   ULONG OutputBlockLength;
914 } DEVICE_MANAGE_DATA_SET_ATTRIBUTES_OUTPUT, *PDEVICE_MANAGE_DATA_SET_ATTRIBUTES_OUTPUT;
915 
916 typedef struct _DEVICE_DATA_SET_LB_PROVISIONING_STATE {
917   ULONG Size;
918   ULONG Version;
919   ULONGLONG SlabSizeInBytes;
920   ULONG SlabOffsetDeltaInBytes;
921   ULONG SlabAllocationBitMapBitCount;
922   ULONG SlabAllocationBitMapLength;
923   ULONG SlabAllocationBitMap[ANYSIZE_ARRAY];
924 } DEVICE_DATA_SET_LB_PROVISIONING_STATE, *PDEVICE_DATA_SET_LB_PROVISIONING_STATE,
925   DEVICE_DSM_ALLOCATION_OUTPUT, *PDEVICE_DSM_ALLOCATION_OUTPUT;
926 
927 #define DEVICE_DSM_ALLOCATION_OUTPUT_V1 (sizeof(DEVICE_DSM_ALLOCATION_OUTPUT))
928 #define DEVICE_DATA_SET_LB_PROVISIONING_STATE_VERSION_V1 DEVICE_DSM_ALLOCATION_OUTPUT_V1
929 
930 typedef struct _DEVICE_DATA_SET_LB_PROVISIONING_STATE_V2 {
931   ULONG Size;
932   ULONG Version;
933   ULONGLONG SlabSizeInBytes;
934   ULONGLONG SlabOffsetDeltaInBytes;
935   ULONG SlabAllocationBitMapBitCount;
936   ULONG SlabAllocationBitMapLength;
937   ULONG SlabAllocationBitMap[ANYSIZE_ARRAY];
938 } DEVICE_DATA_SET_LB_PROVISIONING_STATE_V2, *PDEVICE_DATA_SET_LB_PROVISIONING_STATE_V2,
939   DEVICE_DSM_ALLOCATION_OUTPUT2, *PDEVICE_DSM_ALLOCATION_OUTPUT2;
940 
941 #define DEVICE_DSM_ALLOCATION_OUTPUT_V2 (sizeof(DEVICE_DSM_ALLOCATION_OUTPUT2))
942 #define DEVICE_DATA_SET_LB_PROVISIONING_STATE_VERSION_V2 DEVICE_DSM_ALLOCATION_OUTPUT_V2
943 
944 #define DeviceDsmDefinition_Allocation {DeviceDsmAction_Allocation,                  \
945                                         TRUE,                                        \
946                                         __alignof(DEVICE_DSM_ALLOCATION_PARAMETERS), \
947                                         sizeof(DEVICE_DSM_ALLOCATION_PARAMETERS),    \
948                                         TRUE,                                        \
949                                         __alignof(DEVICE_DSM_ALLOCATION_OUTPUT2),    \
950                                         sizeof(DEVICE_DSM_ALLOCATION_OUTPUT2)}
951 
952 #define DEVICE_DSM_FLAG_ALLOCATION_CONSOLIDATEABLE_ONLY 0x40000000
953 
954 typedef struct _DEVICE_DATA_SET_LBP_STATE_PARAMETERS {
955   ULONG Version;
956   ULONG Size;
957   ULONG Flags;
958   ULONG OutputVersion;
959 } DEVICE_DATA_SET_LBP_STATE_PARAMETERS, *PDEVICE_DATA_SET_LBP_STATE_PARAMETERS,
960   DEVICE_DSM_ALLOCATION_PARAMETERS, *PDEVICE_DSM_ALLOCATION_PARAMETERS;
961 
962 typedef struct _STORAGE_EVENT_NOTIFICATION {
963   ULONG Version;
964   ULONG Size;
965   ULONGLONG Events;
966 } STORAGE_EVENT_NOTIFICATION, *PSTORAGE_EVENT_NOTIFICATION;
967 
968 #define STORAGE_EVENT_NOTIFICATION_VERSION_V1 1
969 
970 #define STORAGE_EVENT_MEDIA_STATUS     0x0000000000000001
971 #define STORAGE_EVENT_DEVICE_STATUS    0x0000000000000002
972 #define STORAGE_EVENT_DEVICE_OPERATION 0x0000000000000004
973 #define STORAGE_EVENT_ALL (STORAGE_EVENT_MEDIA_STATUS | STORAGE_EVENT_DEVICE_STATUS | STORAGE_EVENT_DEVICE_OPERATION)
974 
975 #define STORAGE_OFFLOAD_MAX_TOKEN_LENGTH        512
976 #define STORAGE_OFFLOAD_TOKEN_ID_LENGTH         0x1F8
977 #define STORAGE_OFFLOAD_TOKEN_TYPE_ZERO_DATA    0xFFFF0001
978 
979 typedef struct _STORAGE_OFFLOAD_TOKEN {
980   UCHAR TokenType[4];
981   UCHAR Reserved[2];
982   UCHAR TokenIdLength[2];
983   union {
984       struct {
985           UCHAR Reserved2[STORAGE_OFFLOAD_TOKEN_ID_LENGTH];
986       } StorageOffloadZeroDataToken;
987       UCHAR Token[STORAGE_OFFLOAD_TOKEN_ID_LENGTH];
988   } DUMMYUNIONNAME;
989 } STORAGE_OFFLOAD_TOKEN, *PSTORAGE_OFFLOAD_TOKEN;
990 
991 #define MAKE_ZERO_TOKEN(T) (                                  \
992     ((PSTORAGE_OFFLOAD_TOKEN)T)->TokenType[0] = 0xFF,         \
993     ((PSTORAGE_OFFLOAD_TOKEN)T)->TokenType[1] = 0xFF,         \
994     ((PSTORAGE_OFFLOAD_TOKEN)T)->TokenType[2] = 0x00,         \
995     ((PSTORAGE_OFFLOAD_TOKEN)T)->TokenType[3] = 0x01,         \
996     ((PSTORAGE_OFFLOAD_TOKEN)T)->TokenIdLength[0] = 0x01,     \
997     ((PSTORAGE_OFFLOAD_TOKEN)T)->TokenIdLength[1] = 0xF8      \
998 )
999 
1000 #define IS_ZERO_TOKEN(T) (                                    \
1001     (((PSTORAGE_OFFLOAD_TOKEN)T)->TokenType[0] == 0xFF     && \
1002      ((PSTORAGE_OFFLOAD_TOKEN)T)->TokenType[1] == 0xFF     && \
1003      ((PSTORAGE_OFFLOAD_TOKEN)T)->TokenType[2] == 0x00     && \
1004      ((PSTORAGE_OFFLOAD_TOKEN)T)->TokenType[3] == 0x01     && \
1005      ((PSTORAGE_OFFLOAD_TOKEN)T)->TokenIdLength[0] == 0x01 && \
1006      ((PSTORAGE_OFFLOAD_TOKEN)T)->TokenIdLength[1] == 0xF8)   \
1007 )
1008 
1009 typedef struct _DEVICE_DSM_OFFLOAD_READ_PARAMETERS {
1010   ULONG Flags;
1011   ULONG TimeToLive;
1012   ULONG Reserved[2];
1013 } DEVICE_DSM_OFFLOAD_READ_PARAMETERS, *PDEVICE_DSM_OFFLOAD_READ_PARAMETERS;
1014 
1015 #define STORAGE_OFFLOAD_READ_RANGE_TRUNCATED 0x00000001
1016 
1017 typedef struct _STORAGE_OFFLOAD_READ_OUTPUT {
1018   ULONG OffloadReadFlags;
1019   ULONG Reserved;
1020   ULONGLONG LengthProtected;
1021   ULONG TokenLength;
1022   STORAGE_OFFLOAD_TOKEN Token;
1023 } STORAGE_OFFLOAD_READ_OUTPUT, *PSTORAGE_OFFLOAD_READ_OUTPUT;
1024 
1025 #define DeviceDsmDefinition_OffloadRead {DeviceDsmAction_OffloadRead,                   \
1026                                          FALSE,                                         \
1027                                          __alignof(DEVICE_DSM_OFFLOAD_READ_PARAMETERS), \
1028                                          sizeof(DEVICE_DSM_OFFLOAD_READ_PARAMETERS),    \
1029                                          FALSE,                                         \
1030                                          __alignof(STORAGE_OFFLOAD_READ_OUTPUT),        \
1031                                          sizeof(STORAGE_OFFLOAD_READ_OUTPUT)}
1032 
1033 typedef struct _DEVICE_DSM_OFFLOAD_WRITE_PARAMETERS {
1034   ULONG Flags;
1035   ULONG Reserved;
1036   ULONGLONG TokenOffset;
1037   STORAGE_OFFLOAD_TOKEN Token;
1038 } DEVICE_DSM_OFFLOAD_WRITE_PARAMETERS, *PDEVICE_DSM_OFFLOAD_WRITE_PARAMETERS;
1039 
1040 #define STORAGE_OFFLOAD_WRITE_RANGE_TRUNCATED   0x0001
1041 #define STORAGE_OFFLOAD_TOKEN_INVALID           0x0002
1042 
1043 typedef struct _STORAGE_OFFLOAD_WRITE_OUTPUT {
1044   ULONG OffloadWriteFlags;
1045   ULONG Reserved;
1046   ULONGLONG LengthCopied;
1047 } STORAGE_OFFLOAD_WRITE_OUTPUT, *PSTORAGE_OFFLOAD_WRITE_OUTPUT;
1048 
1049 #define DeviceDsmDefinition_OffloadWrite {DeviceDsmAction_OffloadWrite,                   \
1050                                           FALSE,                                          \
1051                                           __alignof(DEVICE_DSM_OFFLOAD_WRITE_PARAMETERS), \
1052                                           sizeof(DEVICE_DSM_OFFLOAD_WRITE_PARAMETERS),    \
1053                                           FALSE,                                          \
1054                                           __alignof(STORAGE_OFFLOAD_WRITE_OUTPUT),        \
1055                                           sizeof(STORAGE_OFFLOAD_WRITE_OUTPUT)}
1056 
1057 
1058 #define READ_COPY_NUMBER_KEY                    0x52434e00  //'RCN'
1059 #define READ_COPY_NUMBER_BYPASS_CACHE_FLAG      0x00000100
1060 
1061 #define IsKeyReadCopyNumber(_k)                 (((_k) & 0xFFFFFE00) == READ_COPY_NUMBER_KEY)
1062 
1063 #define IsKeyReadCopyNumberBypassCache(_k)      ((_k) & READ_COPY_NUMBER_BYPASS_CACHE_FLAG)
1064 #define SetReadCopyNumberBypassCacheToKey(_k)   ((_k) |= READ_COPY_NUMBER_BYPASS_CACHE_FLAG)
1065 
1066 #define ReadCopyNumberToKey(_c)                 (READ_COPY_NUMBER_KEY | (UCHAR)(_c))
1067 #define ReadCopyNumberFromKey(_k)               (UCHAR)((_k) & 0x000000FF)
1068 
1069 typedef struct _STORAGE_IDLE_POWER {
1070   ULONG Version;
1071   ULONG Size;
1072   ULONG WakeCapableHint:1;
1073   ULONG D3ColdSupported:1;
1074   ULONG Reserved:30;
1075   ULONG D3IdleTimeout;
1076 } STORAGE_IDLE_POWER, *PSTORAGE_IDLE_POWER;
1077 
1078 #ifdef __cplusplus
1079 }
1080 #endif
1081 
1082 #endif /* _NTDDSTOR_H_ */
1083