xref: /reactos/sdk/include/psdk/ntdddisk.h (revision 62c4b828)
1 /*
2  * ntdddisk.h
3  *
4  * Disk 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 _NTDDDISK_H_
24 #define _NTDDDISK_H_
25 
26 /* Helper macro to enable gcc's extension.  */
27 #ifndef __GNU_EXTENSION
28 #ifdef __GNUC__
29 #define __GNU_EXTENSION __extension__
30 #else
31 #define __GNU_EXTENSION
32 #endif
33 #endif
34 
35 #include "ntddstor.h"
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 #define DD_DISK_DEVICE_NAME               "\\Device\\UNKNOWN"
42 #define DD_DISK_DEVICE_NAME_U             L"\\Device\\UNKNOWN"
43 
44 #define IOCTL_DISK_BASE                   FILE_DEVICE_DISK
45 
46 #define IOCTL_DISK_ARE_VOLUMES_READY \
47   CTL_CODE(IOCTL_DISK_BASE, 0x0087, METHOD_BUFFERED, FILE_READ_ACCESS)
48 
49 #define IOCTL_DISK_CHECK_VERIFY \
50   CTL_CODE(IOCTL_DISK_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
51 
52 #define IOCTL_DISK_CONTROLLER_NUMBER \
53   CTL_CODE(IOCTL_DISK_BASE, 0x0011, METHOD_BUFFERED, FILE_ANY_ACCESS)
54 
55 #define IOCTL_DISK_CREATE_DISK \
56   CTL_CODE(IOCTL_DISK_BASE, 0x0016, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
57 
58 #define IOCTL_DISK_DELETE_DRIVE_LAYOUT \
59   CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
60 
61 #define IOCTL_DISK_FIND_NEW_DEVICES \
62   CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
63 
64 #define IOCTL_DISK_FORMAT_DRIVE \
65   CTL_CODE(IOCTL_DISK_BASE, 0x00f3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
66 
67 #define IOCTL_DISK_FORMAT_TRACKS \
68   CTL_CODE(IOCTL_DISK_BASE, 0x0006, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
69 
70 #define IOCTL_DISK_FORMAT_TRACKS_EX \
71   CTL_CODE(IOCTL_DISK_BASE, 0x000b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
72 
73 #define IOCTL_DISK_GET_CACHE_INFORMATION \
74   CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS)
75 
76 #define IOCTL_DISK_GET_CACHE_SETTING \
77   CTL_CODE(IOCTL_DISK_BASE, 0x0038, METHOD_BUFFERED, FILE_READ_ACCESS)
78 
79 #define IOCTL_DISK_GET_CLUSTER_INFO \
80   CTL_CODE(IOCTL_DISK_BASE, 0x0085, METHOD_BUFFERED, FILE_ANY_ACCESS)
81 
82 #define IOCTL_DISK_GET_DISK_ATTRIBUTES \
83   CTL_CODE(IOCTL_DISK_BASE, 0x003c, METHOD_BUFFERED, FILE_ANY_ACCESS)
84 
85 #define IOCTL_DISK_GET_DRIVE_GEOMETRY \
86   CTL_CODE(IOCTL_DISK_BASE, 0x0000, METHOD_BUFFERED, FILE_ANY_ACCESS)
87 
88 #define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX \
89   CTL_CODE(IOCTL_DISK_BASE, 0x0028, METHOD_BUFFERED, FILE_ANY_ACCESS)
90 
91 #define IOCTL_DISK_GET_DRIVE_LAYOUT \
92   CTL_CODE(IOCTL_DISK_BASE, 0x0003, METHOD_BUFFERED, FILE_READ_ACCESS)
93 
94 #define IOCTL_DISK_GET_DRIVE_LAYOUT_EX \
95   CTL_CODE(IOCTL_DISK_BASE, 0x0014, METHOD_BUFFERED, FILE_ANY_ACCESS)
96 
97 #define IOCTL_DISK_GET_MEDIA_TYPES \
98   CTL_CODE(IOCTL_DISK_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
99 
100 #define IOCTL_DISK_GET_LENGTH_INFO \
101   CTL_CODE(IOCTL_DISK_BASE, 0x0017, METHOD_BUFFERED, FILE_READ_ACCESS)
102 
103 #define IOCTL_DISK_GET_PARTITION_ATTRIBUTES \
104  CTL_CODE(IOCTL_DISK_BASE, 0x003a, METHOD_BUFFERED, FILE_ANY_ACCESS)
105 
106 #define IOCTL_DISK_GET_PARTITION_INFO \
107   CTL_CODE(IOCTL_DISK_BASE, 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS)
108 
109 #define IOCTL_DISK_GET_PARTITION_INFO_EX \
110   CTL_CODE(IOCTL_DISK_BASE, 0x0012, METHOD_BUFFERED, FILE_ANY_ACCESS)
111 
112 #define IOCTL_DISK_GET_PERFORMANCE_INFO \
113   CTL_CODE(IOCTL_DISK_BASE, 0x0089, METHOD_BUFFERED, FILE_ANY_ACCESS)
114 
115 #define IOCTL_DISK_GET_SAN_SETTINGS \
116   CTL_CODE(IOCTL_DISK_BASE, 0x0080, METHOD_BUFFERED, FILE_READ_ACCESS)
117 
118 #define IOCTL_DISK_GET_SNAPSHOT_INFO \
119   CTL_CODE(IOCTL_DISK_BASE, 0x0082, METHOD_BUFFERED, FILE_READ_ACCESS)
120 
121 #define IOCTL_DISK_GROW_PARTITION \
122   CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
123 
124 #define IOCTL_DISK_HISTOGRAM_STRUCTURE \
125   CTL_CODE(IOCTL_DISK_BASE, 0x000c, METHOD_BUFFERED, FILE_ANY_ACCESS)
126 
127 #define IOCTL_DISK_HISTOGRAM_DATA \
128   CTL_CODE(IOCTL_DISK_BASE, 0x000d, METHOD_BUFFERED, FILE_ANY_ACCESS)
129 
130 #define IOCTL_DISK_HISTOGRAM_RESET \
131   CTL_CODE(IOCTL_DISK_BASE, 0x000e, METHOD_BUFFERED, FILE_ANY_ACCESS)
132 
133 #define IOCTL_DISK_INTERNAL_CLEAR_VERIFY \
134   CTL_CODE(IOCTL_DISK_BASE, 0x0101, METHOD_NEITHER, FILE_ANY_ACCESS)
135 
136 #define IOCTL_DISK_INTERNAL_SET_VERIFY \
137   CTL_CODE(IOCTL_DISK_BASE, 0x0100, METHOD_NEITHER, FILE_ANY_ACCESS)
138 
139 #define IOCTL_DISK_INTERNAL_SET_NOTIFY \
140   CTL_CODE(IOCTL_DISK_BASE, 0x0102, METHOD_BUFFERED, FILE_ANY_ACCESS)
141 
142 #define IOCTL_DISK_IS_CLUSTERED \
143   CTL_CODE(IOCTL_DISK_BASE, 0x003e, METHOD_BUFFERED, FILE_ANY_ACCESS)
144 
145 #define IOCTL_DISK_IS_WRITABLE \
146   CTL_CODE(IOCTL_DISK_BASE, 0x0009, METHOD_BUFFERED, FILE_ANY_ACCESS)
147 
148 #define IOCTL_DISK_LOGGING \
149   CTL_CODE(IOCTL_DISK_BASE, 0x000a, METHOD_BUFFERED, FILE_ANY_ACCESS)
150 
151 #define IOCTL_DISK_PERFORMANCE \
152   CTL_CODE(IOCTL_DISK_BASE, 0x0008, METHOD_BUFFERED, FILE_ANY_ACCESS)
153 
154 #define IOCTL_DISK_PERFORMANCE_OFF \
155   CTL_CODE(IOCTL_DISK_BASE, 0x0018, METHOD_BUFFERED, FILE_ANY_ACCESS)
156 
157 #define IOCTL_DISK_REASSIGN_BLOCKS \
158   CTL_CODE(IOCTL_DISK_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
159 
160 #define IOCTL_DISK_REQUEST_DATA \
161   CTL_CODE(IOCTL_DISK_BASE, 0x0010, METHOD_BUFFERED, FILE_ANY_ACCESS)
162 
163 #define IOCTL_DISK_REQUEST_STRUCTURE \
164   CTL_CODE(IOCTL_DISK_BASE, 0x000f, METHOD_BUFFERED, FILE_ANY_ACCESS)
165 
166 #define IOCTL_DISK_RESET_SNAPSHOT_INFO \
167   CTL_CODE(IOCTL_DISK_BASE, 0x0084, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
168 
169 #define IOCTL_DISK_MEDIA_REMOVAL \
170   CTL_CODE(IOCTL_DISK_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
171 
172 #define IOCTL_DISK_EJECT_MEDIA \
173   CTL_CODE(IOCTL_DISK_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
174 
175 #define IOCTL_DISK_LOAD_MEDIA \
176   CTL_CODE(IOCTL_DISK_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
177 
178 #define IOCTL_DISK_REASSIGN_BLOCKS_EX \
179   CTL_CODE(IOCTL_DISK_BASE, 0x0029, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
180 
181 #define IOCTL_DISK_RESERVE \
182   CTL_CODE(IOCTL_DISK_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
183 
184 #define IOCTL_DISK_RELEASE \
185   CTL_CODE(IOCTL_DISK_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)
186 
187 #define IOCTL_DISK_FIND_NEW_DEVICES \
188   CTL_CODE(IOCTL_DISK_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
189 
190 #define IOCTL_DISK_SENSE_DEVICE \
191   CTL_CODE(IOCTL_DISK_BASE, 0x00f8, METHOD_BUFFERED, FILE_ANY_ACCESS)
192 
193 #define IOCTL_DISK_SET_CACHE_INFORMATION \
194   CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
195 
196 #define IOCTL_DISK_SET_CACHE_SETTING \
197   CTL_CODE(IOCTL_DISK_BASE, 0x0039, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
198 
199 #define IOCTL_DISK_SET_CLUSTER_INFO \
200   CTL_CODE(IOCTL_DISK_BASE, 0x0086, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
201 
202 #define IOCTL_DISK_SET_DISK_ATTRIBUTES \
203   CTL_CODE(IOCTL_DISK_BASE, 0x003d, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
204 
205 #define IOCTL_DISK_SET_DRIVE_LAYOUT \
206   CTL_CODE(IOCTL_DISK_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
207 
208 #define IOCTL_DISK_SET_DRIVE_LAYOUT_EX \
209   CTL_CODE(IOCTL_DISK_BASE, 0x0015, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
210 
211 #define IOCTL_DISK_SET_PARTITION_ATTRIBUTES \
212   CTL_CODE(IOCTL_DISK_BASE, 0x003b, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
213 
214 #define IOCTL_DISK_SET_PARTITION_INFO \
215   CTL_CODE(IOCTL_DISK_BASE, 0x0002, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
216 
217 #define IOCTL_DISK_SET_PARTITION_INFO_EX \
218   CTL_CODE(IOCTL_DISK_BASE, 0x0013, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
219 
220 #define IOCTL_DISK_SET_SAN_SETTINGS \
221   CTL_CODE(IOCTL_DISK_BASE, 0x0081, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
222 
223 #define IOCTL_DISK_SET_SNAPSHOT_INFO \
224   CTL_CODE(IOCTL_DISK_BASE, 0x0083, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
225 
226 //
227 // NTDDI_WIN2003 was an older define used in the early beta builds, which
228 // Microsoft forgot to fix in a few headers.
229 // NTDDI_WS03 is the correct term.
230 //
231 #if (NTDDI_VERSION < NTDDI_WS03)
232 #define IOCTL_DISK_GET_WRITE_CACHE_STATE \
233   CTL_CODE(IOCTL_DISK_BASE, 0x0037, METHOD_BUFFERED, FILE_READ_ACCESS)
234 #else
235 #define OBSOLETE_DISK_GET_WRITE_CACHE_STATE \
236   CTL_CODE(IOCTL_DISK_BASE, 0x0037, METHOD_BUFFERED, FILE_READ_ACCESS)
237 #endif
238 
239 #define IOCTL_DISK_UPDATE_DRIVE_SIZE \
240   CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
241 
242 #define IOCTL_DISK_UPDATE_PROPERTIES \
243   CTL_CODE(IOCTL_DISK_BASE, 0x0050, METHOD_BUFFERED, FILE_ANY_ACCESS)
244 
245 #define IOCTL_DISK_VERIFY \
246   CTL_CODE(IOCTL_DISK_BASE, 0x0005, METHOD_BUFFERED, FILE_ANY_ACCESS)
247 
248 #define IOCTL_DISK_VOLUMES_ARE_READY \
249   CTL_CODE(IOCTL_DISK_BASE, 0x0088, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
250 
251 #define IOCTL_DISK_COPY_DATA \
252   CTL_CODE(IOCTL_DISK_BASE, 0x0019, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
253 
254 #define IOCTL_DISK_SIMBAD \
255   CTL_CODE(IOCTL_DISK_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
256 
257 #define SMART_GET_VERSION \
258   CTL_CODE(IOCTL_DISK_BASE, 0x0020, METHOD_BUFFERED, FILE_READ_ACCESS)
259 
260 #define SMART_RCV_DRIVE_DATA \
261   CTL_CODE(IOCTL_DISK_BASE, 0x0022, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
262 
263 #define SMART_SEND_DRIVE_COMMAND \
264   CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
265 
266 #define PARTITION_ENTRY_UNUSED            0x00
267 #define PARTITION_FAT_12                  0x01
268 #define PARTITION_XENIX_1                 0x02
269 #define PARTITION_XENIX_2                 0x03
270 #define PARTITION_FAT_16                  0x04
271 #define PARTITION_EXTENDED                0x05
272 #define PARTITION_HUGE                    0x06
273 #define PARTITION_IFS                     0x07
274 #define PARTITION_OS2BOOTMGR              0x0A
275 #define PARTITION_FAT32                   0x0B
276 #define PARTITION_FAT32_XINT13            0x0C
277 #define PARTITION_XINT13                  0x0E
278 #define PARTITION_XINT13_EXTENDED         0x0F
279 #define PARTITION_MSFT_RECOVERY           0x27
280 #define PARTITION_MAIN_OS                 0x28
281 #define PARTIITON_OS_DATA                 0x29
282 #define PARTITION_PRE_INSTALLED           0x2a
283 #define PARTITION_BSP                     0x2b
284 #define PARTITION_DPP                     0x2c
285 #define PARTITION_WINDOWS_SYSTEM          0x2d
286 #define PARTITION_PREP                    0x41
287 #define PARTITION_LDM                     0x42
288 #define PARTITION_DM                      0x54
289 #define PARTITION_EZDRIVE                 0x55
290 #define PARTITION_UNIX                    0x63
291 #define PARTITION_SPACES_DATA             0xD7
292 #define PARTITION_SPACES                  0xE7
293 #define PARTITION_GPT                     0xEE
294 #define PARTITION_SYSTEM                  0xEF
295 
296 #define VALID_NTFT                        0xC0
297 #define PARTITION_NTFT                    0x80
298 #ifdef __REACTOS__
299 #define PARTITION_OLD_LINUX               0x43
300 #define PARTITION_LINUX                   0x83
301 #define PARTITION_ISO9660                 0x96
302 #define PARTITION_FREEBSD                 0xA5
303 #define PARTITION_OPENBSD                 0xA6
304 #define PARTITION_NETBSD                  0xA9
305 #endif
306 
307 #define IsFTPartition( PartitionType ) \
308   (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT_12)) || \
309   (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_HUGE)) || \
310   (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_IFS)) || \
311   (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32)) || \
312   (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32_XINT13)) || \
313   (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_XINT13))
314 
315 
316 #define IsContainerPartition(PartitionType) \
317   (((PartitionType) == PARTITION_EXTENDED) || \
318   ((PartitionType) == PARTITION_XINT13_EXTENDED))
319 
320 #ifdef __REACTOS__
321 #define IsRecognizedPartition(PartitionType) ( \
322     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT_12)) || \
323     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_HUGE)) || \
324     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_IFS)) || \
325     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32)) || \
326     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32_XINT13)) || \
327     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_XINT13)) || \
328     ((PartitionType) == PARTITION_FAT_12) || \
329     ((PartitionType) == PARTITION_FAT_16) || \
330     ((PartitionType) == PARTITION_HUGE) || \
331     ((PartitionType) == PARTITION_IFS) || \
332     ((PartitionType) == PARTITION_FAT32) || \
333     ((PartitionType) == PARTITION_FAT32_XINT13) || \
334     ((PartitionType) == PARTITION_XINT13) || \
335     ((PartitionType) == PARTITION_LINUX) || \
336     ((PartitionType) == PARTITION_OLD_LINUX) || \
337     ((PartitionType) == PARTITION_ISO9660) || \
338     ((PartitionType) == PARTITION_FREEBSD) || \
339     ((PartitionType) == PARTITION_OPENBSD) || \
340     ((PartitionType) == PARTITION_NETBSD))
341 #else
342 #define IsRecognizedPartition(PartitionType) ( \
343     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT_12)) || \
344     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_HUGE)) || \
345     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_IFS)) || \
346     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32)) || \
347     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_FAT32_XINT13)) || \
348     (((PartitionType) & PARTITION_NTFT) && (((PartitionType) & ~0xC0) == PARTITION_XINT13)) || \
349     ((PartitionType) == PARTITION_FAT_12) || \
350     ((PartitionType) == PARTITION_FAT_16) || \
351     ((PartitionType) == PARTITION_HUGE) || \
352     ((PartitionType) == PARTITION_IFS) || \
353     ((PartitionType) == PARTITION_FAT32) || \
354     ((PartitionType) == PARTITION_FAT32_XINT13) || \
355     ((PartitionType) == PARTITION_XINT13))
356 #endif
357 
358 #if(_WIN32_WINNT >= 0x0500)
359 #define GPT_ATTRIBUTE_PLATFORM_REQUIRED          0x00000001
360 #define GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY       0x10000000
361 #define GPT_BASIC_DATA_ATTRIBUTE_SHADOW_COPY     0x20000000
362 #define GPT_BASIC_DATA_ATTRIBUTE_HIDDEN          0x40000000
363 #define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER 0x80000000
364 #endif
365 
366 #define WMI_DISK_GEOMETRY_GUID \
367   {0x25007f51, 0x57c2, 0x11d1, {0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10}}
368 
369 typedef USHORT BAD_TRACK_NUMBER;
370 typedef USHORT *PBAD_TRACK_NUMBER;
371 
372 typedef enum _MEDIA_TYPE {
373   Unknown,
374   F5_1Pt2_512,
375   F3_1Pt44_512,
376   F3_2Pt88_512,
377   F3_20Pt8_512,
378   F3_720_512,
379   F5_360_512,
380   F5_320_512,
381   F5_320_1024,
382   F5_180_512,
383   F5_160_512,
384   RemovableMedia,
385   FixedMedia,
386   F3_120M_512,
387   F3_640_512,
388   F5_640_512,
389   F5_720_512,
390   F3_1Pt2_512,
391   F3_1Pt23_1024,
392   F5_1Pt23_1024,
393   F3_128Mb_512,
394   F3_230Mb_512,
395   F8_256_128,
396   F3_200Mb_512,
397   F3_240M_512,
398   F3_32M_512
399 } MEDIA_TYPE, *PMEDIA_TYPE;
400 
401 typedef enum _DETECTION_TYPE {
402   DetectNone,
403   DetectInt13,
404   DetectExInt13
405 } DETECTION_TYPE;
406 
407 typedef struct _DISK_INT13_INFO {
408   USHORT  DriveSelect;
409   ULONG  MaxCylinders;
410   USHORT  SectorsPerTrack;
411   USHORT  MaxHeads;
412   USHORT  NumberDrives;
413 } DISK_INT13_INFO, *PDISK_INT13_INFO;
414 
415 typedef struct _DISK_EX_INT13_INFO {
416   USHORT  ExBufferSize;
417   USHORT  ExFlags;
418   ULONG  ExCylinders;
419   ULONG  ExHeads;
420   ULONG  ExSectorsPerTrack;
421   ULONG64  ExSectorsPerDrive;
422   USHORT  ExSectorSize;
423   USHORT  ExReserved;
424 } DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO;
425 
426 typedef struct _DISK_DETECTION_INFO {
427   ULONG  SizeOfDetectInfo;
428   DETECTION_TYPE  DetectionType;
429   _ANONYMOUS_UNION union {
430     _ANONYMOUS_STRUCT struct {
431       DISK_INT13_INFO  Int13;
432       DISK_EX_INT13_INFO  ExInt13;
433     } DUMMYSTRUCTNAME;
434   } DUMMYUNIONNAME;
435 } DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;
436 
437 typedef struct _DISK_GEOMETRY {
438   LARGE_INTEGER  Cylinders;
439   MEDIA_TYPE  MediaType;
440   ULONG  TracksPerCylinder;
441   ULONG  SectorsPerTrack;
442   ULONG  BytesPerSector;
443 } DISK_GEOMETRY, *PDISK_GEOMETRY;
444 
445 typedef struct _DISK_GEOMETRY_EX {
446   DISK_GEOMETRY  Geometry;
447   LARGE_INTEGER  DiskSize;
448   UCHAR  Data[1];
449 } DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;
450 
451 #if (NTDDI_VERSION < NTDDI_WS03)
452 #define DiskGeometryGetPartition(Geometry) \
453    ((PDISK_PARTITION_INFO)((Geometry) + 1))
454 
455 #define DiskGeometryGetDetect(Geometry)\
456  ((PDISK_DETECTION_INFO)(((PBYTE)DiskGeometryGetPartition(Geometry) + \
457   DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
458 #else
459 #define DiskGeometryGetPartition(Geometry) \
460    ((PDISK_PARTITION_INFO)((Geometry)->Data))
461 
462 #define DiskGeometryGetDetect(Geometry)\
463  ((PDISK_DETECTION_INFO)(((ULONG_PTR)DiskGeometryGetPartition(Geometry) + \
464   DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
465 #endif
466 
467 typedef struct _PARTITION_INFORMATION {
468   LARGE_INTEGER  StartingOffset;
469   LARGE_INTEGER  PartitionLength;
470   ULONG  HiddenSectors;
471   ULONG  PartitionNumber;
472   UCHAR  PartitionType;
473   BOOLEAN  BootIndicator;
474   BOOLEAN  RecognizedPartition;
475   BOOLEAN  RewritePartition;
476 } PARTITION_INFORMATION, *PPARTITION_INFORMATION;
477 
478 typedef struct _PARTITION_INFORMATION_GPT {
479   GUID  PartitionType;
480   GUID  PartitionId;
481   ULONG64  Attributes;
482   WCHAR Name  [36];
483 } PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;
484 
485 typedef enum _PARTITION_STYLE {
486   PARTITION_STYLE_MBR,
487   PARTITION_STYLE_GPT,
488   PARTITION_STYLE_RAW,
489 #ifdef __REACTOS__
490   /* ReactOS custom partition handlers */
491   PARTITION_STYLE_BRFR = 128 /* Xbox-BRFR partitioning scheme */
492 #endif
493 } PARTITION_STYLE;
494 
495 typedef struct _DISK_PARTITION_INFO {
496   ULONG  SizeOfPartitionInfo;
497   PARTITION_STYLE  PartitionStyle;
498   _ANONYMOUS_UNION union {
499     struct {
500       ULONG  Signature;
501       ULONG  CheckSum;
502     } Mbr;
503     struct {
504       GUID  DiskId;
505     } Gpt;
506   } DUMMYUNIONNAME;
507 } DISK_PARTITION_INFO, *PDISK_PARTITION_INFO;
508 
509 typedef struct _DISK_PERFORMANCE {
510   LARGE_INTEGER  BytesRead;
511   LARGE_INTEGER  BytesWritten;
512   LARGE_INTEGER  ReadTime;
513   LARGE_INTEGER  WriteTime;
514   LARGE_INTEGER  IdleTime;
515   ULONG  ReadCount;
516   ULONG  WriteCount;
517   ULONG  QueueDepth;
518   ULONG  SplitCount;
519   LARGE_INTEGER  QueryTime;
520   ULONG  StorageDeviceNumber;
521   WCHAR  StorageManagerName[8];
522 } DISK_PERFORMANCE, *PDISK_PERFORMANCE;
523 
524 typedef struct _PARTITION_INFORMATION_MBR {
525   UCHAR  PartitionType;
526   BOOLEAN  BootIndicator;
527   BOOLEAN  RecognizedPartition;
528   ULONG  HiddenSectors;
529 } PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
530 
531 typedef struct _PARTITION_INFORMATION_EX {
532   PARTITION_STYLE  PartitionStyle;
533   LARGE_INTEGER  StartingOffset;
534   LARGE_INTEGER  PartitionLength;
535   ULONG  PartitionNumber;
536   BOOLEAN  RewritePartition;
537 #if (NTDDI_VERSION >= NTDDI_WIN10_RS3)
538   BOOLEAN  IsServicePartition;
539 #endif
540   _ANONYMOUS_UNION union {
541     PARTITION_INFORMATION_MBR  Mbr;
542     PARTITION_INFORMATION_GPT  Gpt;
543   } DUMMYUNIONNAME;
544 } PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;
545 
546 typedef struct _DRIVE_LAYOUT_INFORMATION {
547   ULONG  PartitionCount;
548   ULONG  Signature;
549   PARTITION_INFORMATION  PartitionEntry[1];
550 } DRIVE_LAYOUT_INFORMATION, *PDRIVE_LAYOUT_INFORMATION;
551 
552 typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
553   ULONG  Signature;
554 #if (NTDDI_VERSION >= NTDDI_WIN10_RS1)
555     ULONG CheckSum;
556 #endif
557 } DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;
558 
559 typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
560   GUID  DiskId;
561   LARGE_INTEGER  StartingUsableOffset;
562   LARGE_INTEGER  UsableLength;
563   ULONG  MaxPartitionCount;
564 } DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;
565 
566 typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
567   ULONG  PartitionStyle;
568   ULONG  PartitionCount;
569   __GNU_EXTENSION union {
570     DRIVE_LAYOUT_INFORMATION_MBR  Mbr;
571     DRIVE_LAYOUT_INFORMATION_GPT  Gpt;
572   };
573   PARTITION_INFORMATION_EX  PartitionEntry[1];
574 } DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX;
575 
576 typedef struct _FORMAT_EX_PARAMETERS {
577   MEDIA_TYPE  MediaType;
578   ULONG  StartCylinderNumber;
579   ULONG  EndCylinderNumber;
580   ULONG  StartHeadNumber;
581   ULONG  EndHeadNumber;
582   USHORT  FormatGapLength;
583   USHORT  SectorsPerTrack;
584   USHORT  SectorNumber[1];
585 } FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS;
586 
587 typedef struct _FORMAT_PARAMETERS {
588   MEDIA_TYPE  MediaType;
589   ULONG  StartCylinderNumber;
590   ULONG  EndCylinderNumber;
591   ULONG  StartHeadNumber;
592   ULONG  EndHeadNumber;
593 } FORMAT_PARAMETERS, *PFORMAT_PARAMETERS;
594 
595 typedef struct _GET_LENGTH_INFORMATION {
596   LARGE_INTEGER  Length;
597 } GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;
598 
599 typedef struct _REASSIGN_BLOCKS {
600   USHORT  Reserved;
601   USHORT  Count;
602   ULONG  BlockNumber[1];
603 } REASSIGN_BLOCKS, *PREASSIGN_BLOCKS;
604 
605 typedef struct _REASSIGN_BLOCKS_EX {
606   USHORT Reserved;
607   USHORT Count;
608   LARGE_INTEGER BlockNumber[1];
609 } REASSIGN_BLOCKS_EX, *PREASSIGN_BLOCKS_EX;
610 
611 typedef struct _SET_PARTITION_INFORMATION {
612   UCHAR  PartitionType;
613 } SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION;
614 
615 typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
616 typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
617 
618 typedef struct _SET_PARTITION_INFORMATION_EX {
619   PARTITION_STYLE  PartitionStyle;
620   _ANONYMOUS_UNION union {
621     SET_PARTITION_INFORMATION_MBR  Mbr;
622     SET_PARTITION_INFORMATION_GPT  Gpt;
623   } DUMMYUNIONNAME;
624 } SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX;
625 
626 typedef struct _VERIFY_INFORMATION {
627   LARGE_INTEGER  StartingOffset;
628   ULONG  Length;
629 } VERIFY_INFORMATION, *PVERIFY_INFORMATION;
630 
631 /* GETVERSIONINPARAMS.fCapabilities constants */
632 #define CAP_ATA_ID_CMD                    1
633 #define CAP_ATAPI_ID_CMD                  2
634 #define CAP_SMART_CMD                     4
635 
636 typedef struct _GETVERSIONINPARAMS {
637     UCHAR  bVersion;
638     UCHAR  bRevision;
639     UCHAR  bReserved;
640     UCHAR  bIDEDeviceMap;
641     ULONG  fCapabilities;
642     ULONG  dwReserved[4];
643 } GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS;
644 
645 /* IDEREGS.bCommandReg constants */
646 #define ATAPI_ID_CMD                      0xA1
647 #define ID_CMD                            0xEC
648 #define SMART_CMD                         0xB0
649 
650 #define SMART_CYL_LOW                     0x4F
651 #define SMART_CYL_HI                      0xC2
652 
653 typedef struct _IDEREGS {
654     UCHAR  bFeaturesReg;
655     UCHAR  bSectorCountReg;
656     UCHAR  bSectorNumberReg;
657     UCHAR  bCylLowReg;
658     UCHAR  bCylHighReg;
659     UCHAR  bDriveHeadReg;
660     UCHAR  bCommandReg;
661     UCHAR  bReserved;
662 } IDEREGS, *PIDEREGS, *LPIDEREGS;
663 
664 #include <pshpack1.h>
665 typedef struct _SENDCMDINPARAMS {
666     ULONG  cBufferSize;
667     IDEREGS  irDriveRegs;
668     UCHAR  bDriveNumber;
669     UCHAR  bReserved[3];
670     ULONG  dwReserved[4];
671     UCHAR  bBuffer[1];
672 } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
673 #include <poppack.h>
674 
675 /* DRIVERSTATUS.bDriverError constants */
676 #define SMART_NO_ERROR                    0
677 #define SMART_IDE_ERROR                   1
678 #define SMART_INVALID_FLAG                2
679 #define SMART_INVALID_COMMAND             3
680 #define SMART_INVALID_BUFFER              4
681 #define SMART_INVALID_DRIVE               5
682 #define SMART_INVALID_IOCTL               6
683 #define SMART_ERROR_NO_MEM                7
684 #define SMART_INVALID_REGISTER            8
685 #define SMART_NOT_SUPPORTED               9
686 #define SMART_NO_IDE_DEVICE               10
687 
688 #define SMART_OFFLINE_ROUTINE_OFFLINE     0
689 #define SMART_SHORT_SELFTEST_OFFLINE      1
690 #define SMART_EXTENDED_SELFTEST_OFFLINE   2
691 #define SMART_ABORT_OFFLINE_SELFTEST      127
692 #define SMART_SHORT_SELFTEST_CAPTIVE      129
693 #define SMART_EXTENDED_SELFTEST_CAPTIVE   130
694 
695 typedef struct _DRIVERSTATUS {
696     UCHAR  bDriverError;
697     UCHAR  bIDEError;
698     UCHAR  bReserved[2];
699     ULONG  dwReserved[2];
700 } DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
701 
702 #define READ_ATTRIBUTE_BUFFER_SIZE        512
703 #define IDENTIFY_BUFFER_SIZE              512
704 #define READ_THRESHOLD_BUFFER_SIZE        512
705 #define SMART_LOG_SECTOR_SIZE             512
706 
707 #include <pshpack1.h>
708 typedef struct _SENDCMDOUTPARAMS {
709     ULONG  cBufferSize;
710     DRIVERSTATUS  DriverStatus;
711     UCHAR  bBuffer[1];
712 } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;
713 #include <poppack.h>
714 
715 #define READ_ATTRIBUTES                   0xD0
716 #define READ_THRESHOLDS                   0xD1
717 #define ENABLE_DISABLE_AUTOSAVE           0xD2
718 #define SAVE_ATTRIBUTE_VALUES             0xD3
719 #define EXECUTE_OFFLINE_DIAGS             0xD4
720 #define SMART_READ_LOG                    0xD5
721 #define SMART_WRITE_LOG                   0xd6
722 #define ENABLE_SMART                      0xD8
723 #define DISABLE_SMART                     0xD9
724 #define RETURN_SMART_STATUS               0xDA
725 #define ENABLE_DISABLE_AUTO_OFFLINE       0xDB
726 
727 typedef struct _MAPPED_ADDRESS {
728     struct _MAPPED_ADDRESS *NextMappedAddress;
729     PVOID MappedAddress;
730     ULONG NumberOfBytes;
731     LARGE_INTEGER IoAddress;
732     ULONG BusNumber;
733 } MAPPED_ADDRESS, *PMAPPED_ADDRESS;
734 
735 
736 
737 #if(_WIN32_WINNT >= 0x0500)
738 
739 typedef struct _CREATE_DISK_GPT
740 {
741     GUID DiskId;
742     ULONG MaxPartitionCount;
743 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
744 
745 typedef struct _CREATE_DISK_MBR
746 {
747     ULONG Signature;
748 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
749 
750 
751 typedef struct _CREATE_DISK
752 {
753     PARTITION_STYLE PartitionStyle;
754     union {
755         CREATE_DISK_MBR Mbr;
756         CREATE_DISK_GPT Gpt;
757     };
758 } CREATE_DISK, *PCREATE_DISK;
759 
760 
761 typedef enum {
762     EqualPriority,
763     KeepPrefetchedData,
764     KeepReadData
765 } DISK_CACHE_RETENTION_PRIORITY;
766 
767 typedef enum _DISK_WRITE_CACHE_STATE {
768     DiskWriteCacheNormal,
769     DiskWriteCacheForceDisable,
770     DiskWriteCacheDisableNotSupported
771 } DISK_WRITE_CACHE_STATE, *PDISK_WRITE_CACHE_STATE;
772 
773 
774 typedef struct _DISK_CACHE_INFORMATION
775 {
776     BOOLEAN ParametersSavable;
777     BOOLEAN ReadCacheEnabled;
778     BOOLEAN WriteCacheEnabled;
779     DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
780     DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;
781     USHORT DisablePrefetchTransferLength;
782     BOOLEAN PrefetchScalar;
783     union {
784         struct {
785             USHORT Minimum;
786             USHORT Maximum;
787             USHORT MaximumBlocks;
788         } ScalarPrefetch;
789 
790         struct {
791             USHORT Minimum;
792             USHORT Maximum;
793         } BlockPrefetch;
794     };
795 
796 } DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION;
797 
798 typedef struct _DISK_GROW_PARTITION {
799     ULONG PartitionNumber;
800     LARGE_INTEGER BytesToGrow;
801 } DISK_GROW_PARTITION, *PDISK_GROW_PARTITION;
802 #endif
803 
804 // for IOCTL_DISK_CONTROLLER_NUMBER
805 
806 typedef struct _DISK_CONTROLLER_NUMBER {
807   ULONG  ControllerNumber;
808   ULONG  DiskNumber;
809 } DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER;
810 
811 // for IOCTL_DISK_COPY_DATA
812 
813 typedef struct _DISK_COPY_DATA_PARAMETERS {
814   LARGE_INTEGER   SourceOffset;
815   LARGE_INTEGER   DestinationOffset;
816   LARGE_INTEGER   CopyLength;
817   ULONGLONG       Reserved;
818 } DISK_COPY_DATA_PARAMETERS, *PDISK_COPY_DATA_PARAMETERS;
819 
820 // for IOCTL_DISK_GET_CACHE_SETTING and IOCTL_DISK_SET_CACHE_SETTING
821 
822 typedef enum _DISK_CACHE_STATE {
823   DiskCacheNormal,
824   DiskCacheWriteThroughNotSupported,
825   DiskCacheModifyUnsuccessful
826 } DISK_CACHE_STATE, *PDISK_CACHE_STATE;
827 
828 typedef struct _DISK_CACHE_SETTING {
829   ULONG Version;
830   DISK_CACHE_STATE State;
831   BOOLEAN IsPowerProtected;
832 } DISK_CACHE_SETTING, *PDISK_CACHE_SETTING;
833 
834 #if (NTDDI_VERSION >= NTDDI_VISTA)
835 
836 // for IOCTL_DISK_GET_PARTITION_ATTRIBUTES and IOCTL_DISK_SET_PARTITION_ATTRIBUTES
837 
838 typedef struct _GET_PARTITION_ATTRIBUTES {
839   ULONG Version;
840   ULONG Reserved1;
841   ULONGLONG Attributes;
842 } GET_PARTITION_ATTRIBUTES, *PGET_PARTITION_ATTRIBUTES;
843 
844 typedef struct _SET_PARTITION_ATTRIBUTES {
845   ULONG Version;
846   BOOLEAN Persist;
847   BOOLEAN Reserved1[3];
848   ULONGLONG Attributes;
849   ULONGLONG AttributesMask;
850 } SET_PARTITION_ATTRIBUTES, *PSET_PARTITION_ATTRIBUTES;
851 
852 // for IOCTL_DISK_GET_DISK_ATTRIBUTES and IOCTL_DISK_SET_DISK_ATTRIBUTES
853 
854 #define DISK_ATTRIBUTE_OFFLINE              0x0000000000000001
855 #define DISK_ATTRIBUTE_READ_ONLY            0x0000000000000002
856 #define DISK_ATTRIBUTE_HIDDEN               0x0000000000000004
857 #define DISK_ATTRIBUTE_MAINTENANCE          0x0000000000000008
858 #define DISK_ATTRIBUTE_SPACES_BYPASS        0x0000000000000010
859 
860 typedef struct _GET_DISK_ATTRIBUTES {
861   ULONG Version;
862   ULONG Reserved1;
863   ULONGLONG Attributes;
864 } GET_DISK_ATTRIBUTES, *PGET_DISK_ATTRIBUTES;
865 
866 typedef struct _SET_DISK_ATTRIBUTES {
867   ULONG Version;
868   BOOLEAN Persist;
869   BOOLEAN RelinquishOwnership;
870   BOOLEAN Reserved1[2];
871   ULONGLONG Attributes;
872   ULONGLONG AttributesMask;
873   GUID Owner;
874 } SET_DISK_ATTRIBUTES, *PSET_DISK_ATTRIBUTES;
875 
876 
877 // for IOCTL_DISK_GET_SAN_SETTINGS and IOCTL_DISK_SET_SAN_SETTINGS
878 
879 typedef enum _DISK_SAN_POLICY {
880   DiskSanPolicyUnknown,
881   DiskSanPolicyOnline,
882   DiskSanPolicyOfflineShared,
883   DiskSanPolicyOffline,
884   DiskSanPolicyOfflineInternal,
885   DiskSanPolicyMax
886 } DISK_SAN_POLICY, *PDISK_SAN_POLICY;
887 
888 typedef struct _DISK_SAN_SETTINGS {
889   ULONG Version;
890   DISK_SAN_POLICY SanPolicy;
891 } DISK_SAN_SETTINGS, *PDISK_SAN_SETTINGS;
892 
893 // for IOCTL_DISK_GET_SNAPSHOT_INFO and IOCTL_DISK_SET_SNAPSHOT_INFO
894 typedef enum _DISK_SNAPSHOT_STATE {
895   DiskSnapshotNormalDisk,
896   DiskSnapshotSnapshotCheckRequired,
897   DiskSnapshotPreSnapshot,
898   DiskSnapshotSnapshotDisk
899 } DISK_SNAPSHOT_STATE, *PDISK_SNAPSHOT_STATE;
900 
901 typedef struct _DISK_SNAPSHOT_INFO {
902   ULONG Version;
903   DISK_SNAPSHOT_STATE State;
904   GUID SnapshotSetId;
905   GUID SnapshotId;
906   GUID LunId;
907   LARGE_INTEGER CreationTimeStamp;
908   ULONG ImportCount;
909   ULONG Flags;
910   ULONG AdditionalDataSize;
911   UCHAR AdditionalData[ANYSIZE_ARRAY];
912 } DISK_SNAPSHOT_INFO, *PDISK_SNAPSHOT_INFO;
913 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
914 
915 #if (NTDDI_VERSION >= NTDDI_WIN8)
916 
917 // for IOCTL_DISK_GET_CLUSTER_INFO and IOCTL_DISK_SET_CLUSTER_INFO
918 
919 #define DISK_CLUSTER_FLAG_ENABLED              0x0000000000000001
920 #define DISK_CLUSTER_FLAG_CSV                  0x0000000000000002
921 #define DISK_CLUSTER_FLAG_IN_MAINTENANCE       0x0000000000000004
922 #define DISK_CLUSTER_FLAG_PNP_ARRIVAL_COMPLETE 0x0000000000000008
923 
924 typedef struct _DISK_CLUSTER_INFO {
925   ULONG Version;
926   ULONGLONG Flags;
927   ULONGLONG FlagsMask;
928   BOOLEAN Notify;
929 } DISK_CLUSTER_INFO, *PDISK_CLUSTER_INFO;
930 
931 // for IOCTL_DISK_GET_PERFORMANCE_INFO
932 
933 typedef enum _DISK_PERFORMANCE_TYPE {
934   DiskPerformanceTypeAllPriority,
935   DiskPerformanceTypeNonLowPriority,
936   DiskPerformanceTypeMax
937 } DISK_PERFORMANCE_TYPE, *PDISK_PERFORMANCE_TYPE;
938 
939 typedef struct _DISK_PERFORMANCE_PARAMETERS {
940   ULONG Version;
941   DISK_PERFORMANCE_TYPE Type;
942 } DISK_PERFORMANCE_PARAMETERS, *PDISK_PERFORMANCE_PARAMETERS;
943 
944 typedef struct _DISK_PERFORMANCE_INFO {
945   ULONG Version;
946   DISK_PERFORMANCE_TYPE Type;
947   LARGE_INTEGER QueryTime;
948   LARGE_INTEGER BytesRead;
949   LARGE_INTEGER BytesWritten;
950   LARGE_INTEGER ReadTime;
951   LARGE_INTEGER WriteTime;
952   LARGE_INTEGER FlushTime;
953   LARGE_INTEGER IdleTime;
954   ULONG ReadCount;
955   ULONG WriteCount;
956   ULONG FlushCount;
957   ULONG QueueDepth;
958   ULONG SplitCount;
959 } DISK_PERFORMANCE_INFO, *PDISK_PERFORMANCE_INFO;
960 
961 #endif /* NTDDI_VERSION >= NTDDI_WIN8 */
962 
963 
964 #ifdef __cplusplus
965 }
966 #endif
967 
968 #endif /* _NTDDDISK_H_ */
969