xref: /reactos/sdk/include/psdk/ntdddisk.h (revision c8d07514)
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 /* Actually it should be > 0x0500, since this is not present in Windows 2000;
360  * however we keep >= 0x0500 for compatibility with MS PSDK. */
361 
362 #define GPT_ATTRIBUTE_PLATFORM_REQUIRED          0x00000001
363 #define GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY       0x10000000
364 #define GPT_BASIC_DATA_ATTRIBUTE_SHADOW_COPY     0x20000000
365 #define GPT_BASIC_DATA_ATTRIBUTE_HIDDEN          0x40000000
366 #define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER 0x80000000
367 #endif
368 
369 #define WMI_DISK_GEOMETRY_GUID \
370   {0x25007f51, 0x57c2, 0x11d1, {0xa5, 0x28, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0x10}}
371 
372 typedef USHORT BAD_TRACK_NUMBER;
373 typedef USHORT *PBAD_TRACK_NUMBER;
374 
375 typedef enum _MEDIA_TYPE {
376   Unknown,
377   F5_1Pt2_512,
378   F3_1Pt44_512,
379   F3_2Pt88_512,
380   F3_20Pt8_512,
381   F3_720_512,
382   F5_360_512,
383   F5_320_512,
384   F5_320_1024,
385   F5_180_512,
386   F5_160_512,
387   RemovableMedia,
388   FixedMedia,
389   F3_120M_512,
390   F3_640_512,
391   F5_640_512,
392   F5_720_512,
393   F3_1Pt2_512,
394   F3_1Pt23_1024,
395   F5_1Pt23_1024,
396   F3_128Mb_512,
397   F3_230Mb_512,
398   F8_256_128,
399   F3_200Mb_512,
400   F3_240M_512,
401   F3_32M_512
402 } MEDIA_TYPE, *PMEDIA_TYPE;
403 
404 typedef struct _DISK_GEOMETRY {
405   LARGE_INTEGER  Cylinders;
406   MEDIA_TYPE  MediaType;
407   ULONG  TracksPerCylinder;
408   ULONG  SectorsPerTrack;
409   ULONG  BytesPerSector;
410 } DISK_GEOMETRY, *PDISK_GEOMETRY;
411 
412 typedef struct _PARTITION_INFORMATION {
413   LARGE_INTEGER  StartingOffset;
414   LARGE_INTEGER  PartitionLength;
415   ULONG  HiddenSectors;
416   ULONG  PartitionNumber;
417   UCHAR  PartitionType;
418   BOOLEAN  BootIndicator;
419   BOOLEAN  RecognizedPartition;
420   BOOLEAN  RewritePartition;
421 } PARTITION_INFORMATION, *PPARTITION_INFORMATION;
422 
423 typedef struct _DRIVE_LAYOUT_INFORMATION {
424   ULONG  PartitionCount;
425   ULONG  Signature;
426   PARTITION_INFORMATION  PartitionEntry[1];
427 } DRIVE_LAYOUT_INFORMATION, *PDRIVE_LAYOUT_INFORMATION;
428 
429 typedef struct _SET_PARTITION_INFORMATION {
430   UCHAR  PartitionType;
431 } SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION;
432 
433 #if (_WIN32_WINNT >= 0x0500)
434 /* Actually it should be > 0x0500, since this is not present in Windows 2000;
435  * however we keep >= 0x0500 for compatibility with MS PSDK. */
436 
437 typedef enum _PARTITION_STYLE {
438   PARTITION_STYLE_MBR,
439   PARTITION_STYLE_GPT,
440   PARTITION_STYLE_RAW,
441 #ifdef __REACTOS__
442   /* ReactOS custom partition handlers */
443   PARTITION_STYLE_BRFR = 128 /* Xbox-BRFR partitioning scheme */
444 #endif
445 } PARTITION_STYLE;
446 
447 typedef struct _CREATE_DISK_GPT
448 {
449   GUID DiskId;
450   ULONG MaxPartitionCount;
451 } CREATE_DISK_GPT, *PCREATE_DISK_GPT;
452 
453 typedef struct _CREATE_DISK_MBR
454 {
455   ULONG Signature;
456 } CREATE_DISK_MBR, *PCREATE_DISK_MBR;
457 
458 typedef struct _CREATE_DISK
459 {
460   PARTITION_STYLE PartitionStyle;
461   union {
462     CREATE_DISK_MBR Mbr;
463     CREATE_DISK_GPT Gpt;
464   };
465 } CREATE_DISK, *PCREATE_DISK;
466 
467 typedef enum _DETECTION_TYPE {
468   DetectNone,
469   DetectInt13,
470   DetectExInt13
471 } DETECTION_TYPE;
472 
473 typedef struct _DISK_INT13_INFO {
474   USHORT  DriveSelect;
475   ULONG  MaxCylinders;
476   USHORT  SectorsPerTrack;
477   USHORT  MaxHeads;
478   USHORT  NumberDrives;
479 } DISK_INT13_INFO, *PDISK_INT13_INFO;
480 
481 typedef struct _DISK_EX_INT13_INFO {
482   USHORT  ExBufferSize;
483   USHORT  ExFlags;
484   ULONG  ExCylinders;
485   ULONG  ExHeads;
486   ULONG  ExSectorsPerTrack;
487   ULONG64  ExSectorsPerDrive;
488   USHORT  ExSectorSize;
489   USHORT  ExReserved;
490 } DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO;
491 
492 typedef struct _DISK_DETECTION_INFO {
493   ULONG  SizeOfDetectInfo;
494   DETECTION_TYPE  DetectionType;
495   _ANONYMOUS_UNION union {
496     _ANONYMOUS_STRUCT struct {
497       DISK_INT13_INFO  Int13;
498       DISK_EX_INT13_INFO  ExInt13;
499     } DUMMYSTRUCTNAME;
500   } DUMMYUNIONNAME;
501 } DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;
502 
503 typedef struct _DISK_PARTITION_INFO {
504   ULONG  SizeOfPartitionInfo;
505   PARTITION_STYLE  PartitionStyle;
506   _ANONYMOUS_UNION union {
507     struct {
508       ULONG  Signature;
509       ULONG  CheckSum;
510     } Mbr;
511     struct {
512       GUID  DiskId;
513     } Gpt;
514   } DUMMYUNIONNAME;
515 } DISK_PARTITION_INFO, *PDISK_PARTITION_INFO;
516 
517 typedef struct _DISK_GEOMETRY_EX {
518   DISK_GEOMETRY  Geometry;
519   LARGE_INTEGER  DiskSize;
520   UCHAR  Data[1];
521 } DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;
522 
523 #if (NTDDI_VERSION < NTDDI_WS03)
524 #define DiskGeometryGetPartition(Geometry) \
525    ((PDISK_PARTITION_INFO)((Geometry) + 1))
526 
527 #define DiskGeometryGetDetect(Geometry)\
528  ((PDISK_DETECTION_INFO)(((PBYTE)DiskGeometryGetPartition(Geometry) + \
529   DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
530 #else
531 #define DiskGeometryGetPartition(Geometry) \
532    ((PDISK_PARTITION_INFO)((Geometry)->Data))
533 
534 #define DiskGeometryGetDetect(Geometry)\
535  ((PDISK_DETECTION_INFO)(((ULONG_PTR)DiskGeometryGetPartition(Geometry) + \
536   DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
537 #endif
538 
539 typedef struct _PARTITION_INFORMATION_GPT {
540   GUID  PartitionType;
541   GUID  PartitionId;
542   ULONG64  Attributes;
543   WCHAR Name  [36];
544 } PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;
545 
546 typedef struct _PARTITION_INFORMATION_MBR {
547   UCHAR  PartitionType;
548   BOOLEAN  BootIndicator;
549   BOOLEAN  RecognizedPartition;
550   ULONG  HiddenSectors;
551 } PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
552 
553 typedef struct _PARTITION_INFORMATION_EX {
554   PARTITION_STYLE  PartitionStyle;
555   LARGE_INTEGER  StartingOffset;
556   LARGE_INTEGER  PartitionLength;
557   ULONG  PartitionNumber;
558   BOOLEAN  RewritePartition;
559 #if (NTDDI_VERSION >= NTDDI_WIN10_RS3)
560   BOOLEAN  IsServicePartition;
561 #endif
562   _ANONYMOUS_UNION union {
563     PARTITION_INFORMATION_MBR  Mbr;
564     PARTITION_INFORMATION_GPT  Gpt;
565   } DUMMYUNIONNAME;
566 } PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;
567 
568 typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
569   GUID  DiskId;
570   LARGE_INTEGER  StartingUsableOffset;
571   LARGE_INTEGER  UsableLength;
572   ULONG  MaxPartitionCount;
573 } DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;
574 
575 typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
576   ULONG  Signature;
577 #if (NTDDI_VERSION >= NTDDI_WIN10_RS1)
578   ULONG CheckSum;
579 #endif
580 } DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;
581 
582 typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
583   ULONG  PartitionStyle;
584   ULONG  PartitionCount;
585   __GNU_EXTENSION union {
586     DRIVE_LAYOUT_INFORMATION_MBR  Mbr;
587     DRIVE_LAYOUT_INFORMATION_GPT  Gpt;
588   };
589   PARTITION_INFORMATION_EX  PartitionEntry[1];
590 } DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX;
591 
592 typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
593 typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
594 
595 typedef struct _SET_PARTITION_INFORMATION_EX {
596   PARTITION_STYLE  PartitionStyle;
597   _ANONYMOUS_UNION union {
598     SET_PARTITION_INFORMATION_MBR  Mbr;
599     SET_PARTITION_INFORMATION_GPT  Gpt;
600   } DUMMYUNIONNAME;
601 } SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX;
602 
603 #endif // (_WIN32_WINNT >= 0x0500)
604 
605 typedef struct _DISK_PERFORMANCE {
606   LARGE_INTEGER  BytesRead;
607   LARGE_INTEGER  BytesWritten;
608   LARGE_INTEGER  ReadTime;
609   LARGE_INTEGER  WriteTime;
610   LARGE_INTEGER  IdleTime;
611   ULONG  ReadCount;
612   ULONG  WriteCount;
613   ULONG  QueueDepth;
614   ULONG  SplitCount;
615   LARGE_INTEGER  QueryTime;
616   ULONG  StorageDeviceNumber;
617   WCHAR  StorageManagerName[8];
618 } DISK_PERFORMANCE, *PDISK_PERFORMANCE;
619 
620 typedef struct _FORMAT_EX_PARAMETERS {
621   MEDIA_TYPE  MediaType;
622   ULONG  StartCylinderNumber;
623   ULONG  EndCylinderNumber;
624   ULONG  StartHeadNumber;
625   ULONG  EndHeadNumber;
626   USHORT  FormatGapLength;
627   USHORT  SectorsPerTrack;
628   USHORT  SectorNumber[1];
629 } FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS;
630 
631 typedef struct _FORMAT_PARAMETERS {
632   MEDIA_TYPE  MediaType;
633   ULONG  StartCylinderNumber;
634   ULONG  EndCylinderNumber;
635   ULONG  StartHeadNumber;
636   ULONG  EndHeadNumber;
637 } FORMAT_PARAMETERS, *PFORMAT_PARAMETERS;
638 
639 typedef struct _GET_LENGTH_INFORMATION {
640   LARGE_INTEGER  Length;
641 } GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;
642 
643 typedef struct _REASSIGN_BLOCKS {
644   USHORT  Reserved;
645   USHORT  Count;
646   ULONG  BlockNumber[1];
647 } REASSIGN_BLOCKS, *PREASSIGN_BLOCKS;
648 
649 typedef struct _REASSIGN_BLOCKS_EX {
650   USHORT Reserved;
651   USHORT Count;
652   LARGE_INTEGER BlockNumber[1];
653 } REASSIGN_BLOCKS_EX, *PREASSIGN_BLOCKS_EX;
654 
655 typedef struct _VERIFY_INFORMATION {
656   LARGE_INTEGER  StartingOffset;
657   ULONG  Length;
658 } VERIFY_INFORMATION, *PVERIFY_INFORMATION;
659 
660 /* GETVERSIONINPARAMS.fCapabilities constants */
661 #define CAP_ATA_ID_CMD                    1
662 #define CAP_ATAPI_ID_CMD                  2
663 #define CAP_SMART_CMD                     4
664 
665 typedef struct _GETVERSIONINPARAMS {
666     UCHAR  bVersion;
667     UCHAR  bRevision;
668     UCHAR  bReserved;
669     UCHAR  bIDEDeviceMap;
670     ULONG  fCapabilities;
671     ULONG  dwReserved[4];
672 } GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS;
673 
674 /* IDEREGS.bCommandReg constants */
675 #define ATAPI_ID_CMD                      0xA1
676 #define ID_CMD                            0xEC
677 #define SMART_CMD                         0xB0
678 
679 #define SMART_CYL_LOW                     0x4F
680 #define SMART_CYL_HI                      0xC2
681 
682 typedef struct _IDEREGS {
683     UCHAR  bFeaturesReg;
684     UCHAR  bSectorCountReg;
685     UCHAR  bSectorNumberReg;
686     UCHAR  bCylLowReg;
687     UCHAR  bCylHighReg;
688     UCHAR  bDriveHeadReg;
689     UCHAR  bCommandReg;
690     UCHAR  bReserved;
691 } IDEREGS, *PIDEREGS, *LPIDEREGS;
692 
693 #include <pshpack1.h>
694 typedef struct _SENDCMDINPARAMS {
695     ULONG  cBufferSize;
696     IDEREGS  irDriveRegs;
697     UCHAR  bDriveNumber;
698     UCHAR  bReserved[3];
699     ULONG  dwReserved[4];
700     UCHAR  bBuffer[1];
701 } SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
702 #include <poppack.h>
703 
704 /* DRIVERSTATUS.bDriverError constants */
705 #define SMART_NO_ERROR                    0
706 #define SMART_IDE_ERROR                   1
707 #define SMART_INVALID_FLAG                2
708 #define SMART_INVALID_COMMAND             3
709 #define SMART_INVALID_BUFFER              4
710 #define SMART_INVALID_DRIVE               5
711 #define SMART_INVALID_IOCTL               6
712 #define SMART_ERROR_NO_MEM                7
713 #define SMART_INVALID_REGISTER            8
714 #define SMART_NOT_SUPPORTED               9
715 #define SMART_NO_IDE_DEVICE               10
716 
717 #define SMART_OFFLINE_ROUTINE_OFFLINE     0
718 #define SMART_SHORT_SELFTEST_OFFLINE      1
719 #define SMART_EXTENDED_SELFTEST_OFFLINE   2
720 #define SMART_ABORT_OFFLINE_SELFTEST      127
721 #define SMART_SHORT_SELFTEST_CAPTIVE      129
722 #define SMART_EXTENDED_SELFTEST_CAPTIVE   130
723 
724 typedef struct _DRIVERSTATUS {
725     UCHAR  bDriverError;
726     UCHAR  bIDEError;
727     UCHAR  bReserved[2];
728     ULONG  dwReserved[2];
729 } DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
730 
731 #define READ_ATTRIBUTE_BUFFER_SIZE        512
732 #define IDENTIFY_BUFFER_SIZE              512
733 #define READ_THRESHOLD_BUFFER_SIZE        512
734 #define SMART_LOG_SECTOR_SIZE             512
735 
736 #include <pshpack1.h>
737 typedef struct _SENDCMDOUTPARAMS {
738     ULONG  cBufferSize;
739     DRIVERSTATUS  DriverStatus;
740     UCHAR  bBuffer[1];
741 } SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;
742 #include <poppack.h>
743 
744 #define READ_ATTRIBUTES                   0xD0
745 #define READ_THRESHOLDS                   0xD1
746 #define ENABLE_DISABLE_AUTOSAVE           0xD2
747 #define SAVE_ATTRIBUTE_VALUES             0xD3
748 #define EXECUTE_OFFLINE_DIAGS             0xD4
749 #define SMART_READ_LOG                    0xD5
750 #define SMART_WRITE_LOG                   0xd6
751 #define ENABLE_SMART                      0xD8
752 #define DISABLE_SMART                     0xD9
753 #define RETURN_SMART_STATUS               0xDA
754 #define ENABLE_DISABLE_AUTO_OFFLINE       0xDB
755 
756 typedef struct _MAPPED_ADDRESS {
757     struct _MAPPED_ADDRESS *NextMappedAddress;
758     PVOID MappedAddress;
759     ULONG NumberOfBytes;
760     LARGE_INTEGER IoAddress;
761     ULONG BusNumber;
762 } MAPPED_ADDRESS, *PMAPPED_ADDRESS;
763 
764 
765 #if (_WIN32_WINNT >= 0x0500)
766 
767 typedef enum {
768     EqualPriority,
769     KeepPrefetchedData,
770     KeepReadData
771 } DISK_CACHE_RETENTION_PRIORITY;
772 
773 typedef enum _DISK_WRITE_CACHE_STATE {
774     DiskWriteCacheNormal,
775     DiskWriteCacheForceDisable,
776     DiskWriteCacheDisableNotSupported
777 } DISK_WRITE_CACHE_STATE, *PDISK_WRITE_CACHE_STATE;
778 
779 
780 typedef struct _DISK_CACHE_INFORMATION
781 {
782     BOOLEAN ParametersSavable;
783     BOOLEAN ReadCacheEnabled;
784     BOOLEAN WriteCacheEnabled;
785     DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
786     DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;
787     USHORT DisablePrefetchTransferLength;
788     BOOLEAN PrefetchScalar;
789     union {
790         struct {
791             USHORT Minimum;
792             USHORT Maximum;
793             USHORT MaximumBlocks;
794         } ScalarPrefetch;
795 
796         struct {
797             USHORT Minimum;
798             USHORT Maximum;
799         } BlockPrefetch;
800     };
801 
802 } DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION;
803 
804 typedef struct _DISK_GROW_PARTITION {
805     ULONG PartitionNumber;
806     LARGE_INTEGER BytesToGrow;
807 } DISK_GROW_PARTITION, *PDISK_GROW_PARTITION;
808 #endif
809 
810 // for IOCTL_DISK_CONTROLLER_NUMBER
811 
812 typedef struct _DISK_CONTROLLER_NUMBER {
813   ULONG  ControllerNumber;
814   ULONG  DiskNumber;
815 } DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER;
816 
817 // for IOCTL_DISK_COPY_DATA
818 
819 typedef struct _DISK_COPY_DATA_PARAMETERS {
820   LARGE_INTEGER   SourceOffset;
821   LARGE_INTEGER   DestinationOffset;
822   LARGE_INTEGER   CopyLength;
823   ULONGLONG       Reserved;
824 } DISK_COPY_DATA_PARAMETERS, *PDISK_COPY_DATA_PARAMETERS;
825 
826 // for IOCTL_DISK_GET_CACHE_SETTING and IOCTL_DISK_SET_CACHE_SETTING
827 
828 typedef enum _DISK_CACHE_STATE {
829   DiskCacheNormal,
830   DiskCacheWriteThroughNotSupported,
831   DiskCacheModifyUnsuccessful
832 } DISK_CACHE_STATE, *PDISK_CACHE_STATE;
833 
834 typedef struct _DISK_CACHE_SETTING {
835   ULONG Version;
836   DISK_CACHE_STATE State;
837   BOOLEAN IsPowerProtected;
838 } DISK_CACHE_SETTING, *PDISK_CACHE_SETTING;
839 
840 #if (NTDDI_VERSION >= NTDDI_VISTA)
841 
842 // for IOCTL_DISK_GET_PARTITION_ATTRIBUTES and IOCTL_DISK_SET_PARTITION_ATTRIBUTES
843 
844 typedef struct _GET_PARTITION_ATTRIBUTES {
845   ULONG Version;
846   ULONG Reserved1;
847   ULONGLONG Attributes;
848 } GET_PARTITION_ATTRIBUTES, *PGET_PARTITION_ATTRIBUTES;
849 
850 typedef struct _SET_PARTITION_ATTRIBUTES {
851   ULONG Version;
852   BOOLEAN Persist;
853   BOOLEAN Reserved1[3];
854   ULONGLONG Attributes;
855   ULONGLONG AttributesMask;
856 } SET_PARTITION_ATTRIBUTES, *PSET_PARTITION_ATTRIBUTES;
857 
858 // for IOCTL_DISK_GET_DISK_ATTRIBUTES and IOCTL_DISK_SET_DISK_ATTRIBUTES
859 
860 #define DISK_ATTRIBUTE_OFFLINE              0x0000000000000001
861 #define DISK_ATTRIBUTE_READ_ONLY            0x0000000000000002
862 #define DISK_ATTRIBUTE_HIDDEN               0x0000000000000004
863 #define DISK_ATTRIBUTE_MAINTENANCE          0x0000000000000008
864 #define DISK_ATTRIBUTE_SPACES_BYPASS        0x0000000000000010
865 
866 typedef struct _GET_DISK_ATTRIBUTES {
867   ULONG Version;
868   ULONG Reserved1;
869   ULONGLONG Attributes;
870 } GET_DISK_ATTRIBUTES, *PGET_DISK_ATTRIBUTES;
871 
872 typedef struct _SET_DISK_ATTRIBUTES {
873   ULONG Version;
874   BOOLEAN Persist;
875   BOOLEAN RelinquishOwnership;
876   BOOLEAN Reserved1[2];
877   ULONGLONG Attributes;
878   ULONGLONG AttributesMask;
879   GUID Owner;
880 } SET_DISK_ATTRIBUTES, *PSET_DISK_ATTRIBUTES;
881 
882 
883 // for IOCTL_DISK_GET_SAN_SETTINGS and IOCTL_DISK_SET_SAN_SETTINGS
884 
885 typedef enum _DISK_SAN_POLICY {
886   DiskSanPolicyUnknown,
887   DiskSanPolicyOnline,
888   DiskSanPolicyOfflineShared,
889   DiskSanPolicyOffline,
890   DiskSanPolicyOfflineInternal,
891   DiskSanPolicyMax
892 } DISK_SAN_POLICY, *PDISK_SAN_POLICY;
893 
894 typedef struct _DISK_SAN_SETTINGS {
895   ULONG Version;
896   DISK_SAN_POLICY SanPolicy;
897 } DISK_SAN_SETTINGS, *PDISK_SAN_SETTINGS;
898 
899 // for IOCTL_DISK_GET_SNAPSHOT_INFO and IOCTL_DISK_SET_SNAPSHOT_INFO
900 typedef enum _DISK_SNAPSHOT_STATE {
901   DiskSnapshotNormalDisk,
902   DiskSnapshotSnapshotCheckRequired,
903   DiskSnapshotPreSnapshot,
904   DiskSnapshotSnapshotDisk
905 } DISK_SNAPSHOT_STATE, *PDISK_SNAPSHOT_STATE;
906 
907 typedef struct _DISK_SNAPSHOT_INFO {
908   ULONG Version;
909   DISK_SNAPSHOT_STATE State;
910   GUID SnapshotSetId;
911   GUID SnapshotId;
912   GUID LunId;
913   LARGE_INTEGER CreationTimeStamp;
914   ULONG ImportCount;
915   ULONG Flags;
916   ULONG AdditionalDataSize;
917   UCHAR AdditionalData[ANYSIZE_ARRAY];
918 } DISK_SNAPSHOT_INFO, *PDISK_SNAPSHOT_INFO;
919 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
920 
921 #if (NTDDI_VERSION >= NTDDI_WIN8)
922 
923 // for IOCTL_DISK_GET_CLUSTER_INFO and IOCTL_DISK_SET_CLUSTER_INFO
924 
925 #define DISK_CLUSTER_FLAG_ENABLED              0x0000000000000001
926 #define DISK_CLUSTER_FLAG_CSV                  0x0000000000000002
927 #define DISK_CLUSTER_FLAG_IN_MAINTENANCE       0x0000000000000004
928 #define DISK_CLUSTER_FLAG_PNP_ARRIVAL_COMPLETE 0x0000000000000008
929 
930 typedef struct _DISK_CLUSTER_INFO {
931   ULONG Version;
932   ULONGLONG Flags;
933   ULONGLONG FlagsMask;
934   BOOLEAN Notify;
935 } DISK_CLUSTER_INFO, *PDISK_CLUSTER_INFO;
936 
937 // for IOCTL_DISK_GET_PERFORMANCE_INFO
938 
939 typedef enum _DISK_PERFORMANCE_TYPE {
940   DiskPerformanceTypeAllPriority,
941   DiskPerformanceTypeNonLowPriority,
942   DiskPerformanceTypeMax
943 } DISK_PERFORMANCE_TYPE, *PDISK_PERFORMANCE_TYPE;
944 
945 typedef struct _DISK_PERFORMANCE_PARAMETERS {
946   ULONG Version;
947   DISK_PERFORMANCE_TYPE Type;
948 } DISK_PERFORMANCE_PARAMETERS, *PDISK_PERFORMANCE_PARAMETERS;
949 
950 typedef struct _DISK_PERFORMANCE_INFO {
951   ULONG Version;
952   DISK_PERFORMANCE_TYPE Type;
953   LARGE_INTEGER QueryTime;
954   LARGE_INTEGER BytesRead;
955   LARGE_INTEGER BytesWritten;
956   LARGE_INTEGER ReadTime;
957   LARGE_INTEGER WriteTime;
958   LARGE_INTEGER FlushTime;
959   LARGE_INTEGER IdleTime;
960   ULONG ReadCount;
961   ULONG WriteCount;
962   ULONG FlushCount;
963   ULONG QueueDepth;
964   ULONG SplitCount;
965 } DISK_PERFORMANCE_INFO, *PDISK_PERFORMANCE_INFO;
966 
967 #endif /* NTDDI_VERSION >= NTDDI_WIN8 */
968 
969 
970 #ifdef __cplusplus
971 }
972 #endif
973 
974 #endif /* _NTDDDISK_H_ */
975