1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW Windows headers
5  *
6  * Authors: Stewart Gordon
7  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
8  * Source: $(DRUNTIMESRC core/sys/windows/_winioctl.d)
9  */
10 /// Automatically imported and edited from the druntime module
11 /// core.sys.windows.winioctl for the auto-generated win32 package.
12 module win32.winioctl;
13 //version (Windows):
14 @system:
15 
16 // FIXME: check types of some constants
17 
18 import win32.basetyps, win32.windef;
19 
20 enum size_t
21     HIST_NO_OF_BUCKETS = 24,
22     HISTOGRAM_BUCKET_SIZE = HISTOGRAM_BUCKET.sizeof,
23     DISK_HISTOGRAM_SIZE = DISK_HISTOGRAM.sizeof;
24 
25 alias DWORD DEVICE_TYPE;
26 
27 enum : DEVICE_TYPE {
28     FILE_DEVICE_BEEP               = 1,
29     FILE_DEVICE_CD_ROM,
30     FILE_DEVICE_CD_ROM_FILE_SYSTEM,
31     FILE_DEVICE_CONTROLLER,
32     FILE_DEVICE_DATALINK,
33     FILE_DEVICE_DFS,
34     FILE_DEVICE_DISK,
35     FILE_DEVICE_DISK_FILE_SYSTEM,
36     FILE_DEVICE_FILE_SYSTEM,
37     FILE_DEVICE_INPORT_PORT,
38     FILE_DEVICE_KEYBOARD,
39     FILE_DEVICE_MAILSLOT,
40     FILE_DEVICE_MIDI_IN,
41     FILE_DEVICE_MIDI_OUT,
42     FILE_DEVICE_MOUSE,
43     FILE_DEVICE_MULTI_UNC_PROVIDER,
44     FILE_DEVICE_NAMED_PIPE,
45     FILE_DEVICE_NETWORK,
46     FILE_DEVICE_NETWORK_BROWSER,
47     FILE_DEVICE_NETWORK_FILE_SYSTEM,
48     FILE_DEVICE_NULL,
49     FILE_DEVICE_PARALLEL_PORT,
50     FILE_DEVICE_PHYSICAL_NETCARD,
51     FILE_DEVICE_PRINTER,
52     FILE_DEVICE_SCANNER,
53     FILE_DEVICE_SERIAL_MOUSE_PORT,
54     FILE_DEVICE_SERIAL_PORT,
55     FILE_DEVICE_SCREEN,
56     FILE_DEVICE_SOUND,
57     FILE_DEVICE_STREAMS,
58     FILE_DEVICE_TAPE,
59     FILE_DEVICE_TAPE_FILE_SYSTEM,
60     FILE_DEVICE_TRANSPORT,
61     FILE_DEVICE_UNKNOWN,
62     FILE_DEVICE_VIDEO,
63     FILE_DEVICE_VIRTUAL_DISK,
64     FILE_DEVICE_WAVE_IN,
65     FILE_DEVICE_WAVE_OUT,
66     FILE_DEVICE_8042_PORT,
67     FILE_DEVICE_NETWORK_REDIRECTOR,
68     FILE_DEVICE_BATTERY,
69     FILE_DEVICE_BUS_EXTENDER,
70     FILE_DEVICE_MODEM,
71     FILE_DEVICE_VDM,
72     FILE_DEVICE_MASS_STORAGE,
73     FILE_DEVICE_SMB,
74     FILE_DEVICE_KS,
75     FILE_DEVICE_CHANGER,
76     FILE_DEVICE_SMARTCARD,
77     FILE_DEVICE_ACPI,
78     FILE_DEVICE_DVD,
79     FILE_DEVICE_FULLSCREEN_VIDEO,
80     FILE_DEVICE_DFS_FILE_SYSTEM,
81     FILE_DEVICE_DFS_VOLUME,
82     FILE_DEVICE_SERENUM,
83     FILE_DEVICE_TERMSRV,
84     FILE_DEVICE_KSEC            // = 57
85 }
86 
87 enum {
88     METHOD_BUFFERED,
89     METHOD_IN_DIRECT,
90     METHOD_OUT_DIRECT,
91     METHOD_NEITHER
92 }
93 
94 enum {
95     FILE_ANY_ACCESS,
96     FILE_SPECIAL_ACCESS = 0,
97     FILE_READ_ACCESS,
98     FILE_WRITE_ACCESS
99 }
100 
101 /*  Bit pattern:
102  *  tttttttt tttttttt aaffffff ffffffmm
103  */
104 /+
105 #define CTL_CODE(t, f, m, a) (((t)<<16)|((a)<<14)|((f)<<2)|(m))
106 +/
107 
108 template CTL_CODE_T(DEVICE_TYPE t, uint f, uint m, uint a) {
109 enum DWORD CTL_CODE_T = (t << 16) | (a << 14) | (f << 2) | m;
110 }
111 
112 DEVICE_TYPE DEVICE_TYPE_FROM_CTL_CODE()(DWORD c) {
113     return (c & 0xFFFF0000) >> 16;
114 }
115 
116 enum DEVICE_TYPE
117     IOCTL_STORAGE_BASE = FILE_DEVICE_MASS_STORAGE,
118     IOCTL_DISK_BASE    = FILE_DEVICE_DISK,
119     IOCTL_VOLUME_BASE  = 'V';
120 
121 enum : DWORD {
122     IOCTL_STORAGE_CHECK_VERIFY           = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS),
123     IOCTL_STORAGE_CHECK_VERIFY2          = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS),
124     IOCTL_STORAGE_MEDIA_REMOVAL          = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS),
125     IOCTL_STORAGE_EJECT_MEDIA            = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS),
126     IOCTL_STORAGE_LOAD_MEDIA             = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS),
127     IOCTL_STORAGE_LOAD_MEDIA2            = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS),
128     IOCTL_STORAGE_RESERVE                = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS),
129     IOCTL_STORAGE_RELEASE                = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS),
130     IOCTL_STORAGE_FIND_NEW_DEVICES       = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS),
131     IOCTL_STORAGE_EJECTION_CONTROL       = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS),
132     IOCTL_STORAGE_MCN_CONTROL            = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS),
133     IOCTL_STORAGE_GET_MEDIA_TYPES        = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS),
134     IOCTL_STORAGE_GET_MEDIA_TYPES_EX     = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS),
135     IOCTL_STORAGE_RESET_BUS              = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS),
136     IOCTL_STORAGE_RESET_DEVICE           = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS),
137     IOCTL_STORAGE_GET_DEVICE_NUMBER      = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS),
138     IOCTL_STORAGE_PREDICT_FAILURE        = CTL_CODE_T!(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS),
139 
140     IOCTL_DISK_GET_DRIVE_GEOMETRY        = CTL_CODE_T!(IOCTL_DISK_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS),
141     IOCTL_DISK_GET_PARTITION_INFO        = CTL_CODE_T!(IOCTL_DISK_BASE, 1, METHOD_BUFFERED, FILE_READ_ACCESS),
142     IOCTL_DISK_SET_PARTITION_INFO        = CTL_CODE_T!(IOCTL_DISK_BASE, 2, METHOD_BUFFERED, FILE_READ_ACCESS|FILE_WRITE_ACCESS),
143     IOCTL_DISK_GET_DRIVE_LAYOUT          = CTL_CODE_T!(IOCTL_DISK_BASE, 3, METHOD_BUFFERED, FILE_READ_ACCESS),
144     IOCTL_DISK_SET_DRIVE_LAYOUT          = CTL_CODE_T!(IOCTL_DISK_BASE, 4, METHOD_BUFFERED, FILE_READ_ACCESS|FILE_WRITE_ACCESS),
145     IOCTL_DISK_VERIFY                    = CTL_CODE_T!(IOCTL_DISK_BASE, 5, METHOD_BUFFERED, FILE_ANY_ACCESS),
146     IOCTL_DISK_FORMAT_TRACKS             = CTL_CODE_T!(IOCTL_DISK_BASE, 6, METHOD_BUFFERED, FILE_READ_ACCESS|FILE_WRITE_ACCESS),
147     IOCTL_DISK_REASSIGN_BLOCKS           = CTL_CODE_T!(IOCTL_DISK_BASE, 7, METHOD_BUFFERED, FILE_READ_ACCESS|FILE_WRITE_ACCESS),
148     IOCTL_DISK_PERFORMANCE               = CTL_CODE_T!(IOCTL_DISK_BASE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS),
149     IOCTL_DISK_IS_WRITABLE               = CTL_CODE_T!(IOCTL_DISK_BASE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS),
150     IOCTL_DISK_LOGGING                   = CTL_CODE_T!(IOCTL_DISK_BASE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS),
151     IOCTL_DISK_FORMAT_TRACKS_EX          = CTL_CODE_T!(IOCTL_DISK_BASE, 11, METHOD_BUFFERED, FILE_READ_ACCESS|FILE_WRITE_ACCESS),
152     IOCTL_DISK_HISTOGRAM_STRUCTURE       = CTL_CODE_T!(IOCTL_DISK_BASE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS),
153     IOCTL_DISK_HISTOGRAM_DATA            = CTL_CODE_T!(IOCTL_DISK_BASE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS),
154     IOCTL_DISK_HISTOGRAM_RESET           = CTL_CODE_T!(IOCTL_DISK_BASE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS),
155     IOCTL_DISK_REQUEST_STRUCTURE         = CTL_CODE_T!(IOCTL_DISK_BASE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS),
156     IOCTL_DISK_REQUEST_DATA              = CTL_CODE_T!(IOCTL_DISK_BASE, 16, METHOD_BUFFERED, FILE_ANY_ACCESS),
157     IOCTL_DISK_GET_PARTITION_INFO_EX     = CTL_CODE_T!(IOCTL_DISK_BASE, 0x12, METHOD_BUFFERED, FILE_ANY_ACCESS),
158     IOCTL_DISK_SET_PARTITION_INFO_EX     = CTL_CODE_T!(IOCTL_DISK_BASE, 0x13, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
159     IOCTL_DISK_GET_DRIVE_LAYOUT_EX       = CTL_CODE_T!(IOCTL_DISK_BASE, 0x14, METHOD_BUFFERED, FILE_ANY_ACCESS),
160     IOCTL_DISK_SET_DRIVE_LAYOUT_EX       = CTL_CODE_T!(IOCTL_DISK_BASE, 0x15, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
161     IOCTL_DISK_CREATE_DISK               = CTL_CODE_T!(IOCTL_DISK_BASE, 0x16, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
162     IOCTL_DISK_GET_LENGTH_INFO           = CTL_CODE_T!(IOCTL_DISK_BASE, 0x17, METHOD_BUFFERED, FILE_READ_ACCESS),
163     IOCTL_DISK_PERFORMANCE_OFF           = CTL_CODE_T!(IOCTL_DISK_BASE, 0x18, METHOD_BUFFERED, FILE_ANY_ACCESS),
164     IOCTL_DISK_GET_DRIVE_GEOMETRY_EX     = CTL_CODE_T!(IOCTL_DISK_BASE, 0x28, METHOD_BUFFERED, FILE_ANY_ACCESS),
165     IOCTL_DISK_GROW_PARTITION            = CTL_CODE_T!(IOCTL_DISK_BASE, 0x34, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
166     IOCTL_DISK_GET_CACHE_INFORMATION     = CTL_CODE_T!(IOCTL_DISK_BASE, 0x35, METHOD_BUFFERED, FILE_READ_ACCESS),
167     IOCTL_DISK_SET_CACHE_INFORMATION     = CTL_CODE_T!(IOCTL_DISK_BASE, 0x36, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
168     IOCTL_DISK_DELETE_DRIVE_LAYOUT       = CTL_CODE_T!(IOCTL_DISK_BASE, 0x40, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
169     IOCTL_DISK_UPDATE_PROPERTIES         = CTL_CODE_T!(IOCTL_DISK_BASE, 0x50, METHOD_BUFFERED, FILE_ANY_ACCESS),
170     IOCTL_DISK_CHECK_VERIFY              = CTL_CODE_T!(IOCTL_DISK_BASE, 0x200, METHOD_BUFFERED, FILE_READ_ACCESS),
171     IOCTL_DISK_MEDIA_REMOVAL             = CTL_CODE_T!(IOCTL_DISK_BASE, 0x201, METHOD_BUFFERED, FILE_READ_ACCESS),
172     IOCTL_DISK_EJECT_MEDIA               = CTL_CODE_T!(IOCTL_DISK_BASE, 0x202, METHOD_BUFFERED, FILE_READ_ACCESS),
173     IOCTL_DISK_LOAD_MEDIA                = CTL_CODE_T!(IOCTL_DISK_BASE, 0x203, METHOD_BUFFERED, FILE_READ_ACCESS),
174     IOCTL_DISK_RESERVE                   = CTL_CODE_T!(IOCTL_DISK_BASE, 0x204, METHOD_BUFFERED, FILE_READ_ACCESS),
175     IOCTL_DISK_RELEASE                   = CTL_CODE_T!(IOCTL_DISK_BASE, 0x205, METHOD_BUFFERED, FILE_READ_ACCESS),
176     IOCTL_DISK_FIND_NEW_DEVICES          = CTL_CODE_T!(IOCTL_DISK_BASE, 0x206, METHOD_BUFFERED, FILE_READ_ACCESS),
177     IOCTL_DISK_REMOVE_DEVICE             = CTL_CODE_T!(IOCTL_DISK_BASE, 0x207, METHOD_BUFFERED, FILE_READ_ACCESS),
178     IOCTL_DISK_GET_MEDIA_TYPES           = CTL_CODE_T!(IOCTL_DISK_BASE, 0x300, METHOD_BUFFERED, FILE_ANY_ACCESS),
179     IOCTL_DISK_UPDATE_DRIVE_SIZE         = CTL_CODE_T!(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS),
180     IOCTL_SERIAL_LSRMST_INSERT           = CTL_CODE_T!(FILE_DEVICE_SERIAL_PORT, 31, METHOD_BUFFERED, FILE_ANY_ACCESS),
181 
182     IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS = CTL_CODE_T!(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS),
183     IOCTL_VOLUME_IS_CLUSTERED            = CTL_CODE_T!(IOCTL_VOLUME_BASE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS),
184 
185     FSCTL_LOCK_VOLUME                    = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS),
186     FSCTL_UNLOCK_VOLUME                  = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS),
187     FSCTL_DISMOUNT_VOLUME                = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS),
188     FSCTL_MOUNT_DBLS_VOLUME              = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 13, METHOD_BUFFERED, FILE_ANY_ACCESS),
189     FSCTL_GET_COMPRESSION                = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS),
190     FSCTL_SET_COMPRESSION                = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA|FILE_WRITE_DATA),
191     FSCTL_READ_COMPRESSION               = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 17, METHOD_NEITHER, FILE_READ_DATA),
192     FSCTL_WRITE_COMPRESSION              = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 18, METHOD_NEITHER, FILE_WRITE_DATA),
193     FSCTL_GET_NTFS_VOLUME_DATA           = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS),
194     FSCTL_GET_VOLUME_BITMAP              = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER, FILE_ANY_ACCESS),
195     FSCTL_GET_RETRIEVAL_POINTERS         = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER, FILE_ANY_ACCESS),
196     FSCTL_MOVE_FILE                      = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS),
197     FSCTL_GET_REPARSE_POINT              = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS),
198     FSCTL_SET_REPARSE_POINT              = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_ANY_ACCESS),
199     FSCTL_DELETE_REPARSE_POINT           = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_ANY_ACCESS),
200     FSCTL_SET_SPARSE                     = CTL_CODE_T!(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_SPECIAL_ACCESS),
201 }
202 
203 enum : BYTE {
204     PARTITION_ENTRY_UNUSED,
205     PARTITION_FAT_12,
206     PARTITION_XENIX_1,
207     PARTITION_XENIX_2,
208     PARTITION_FAT_16,
209     PARTITION_EXTENDED,
210     PARTITION_HUGE,
211     PARTITION_IFS,         // = 0x07
212     PARTITION_FAT32           = 0x0B,
213     PARTITION_FAT32_XINT13    = 0x0C,
214     PARTITION_XINT13          = 0x0E,
215     PARTITION_XINT13_EXTENDED = 0x0F,
216     PARTITION_PREP            = 0x41,
217     PARTITION_LDM             = 0x42,
218     PARTITION_UNIX            = 0x63
219 }
220 
221 enum BYTE
222     PARTITION_NTFT = 0x80,
223     VALID_NTFT     = 0xC0;
224 
225 enum {
226     SERIAL_LSRMST_ESCAPE,
227     SERIAL_LSRMST_LSR_DATA,
228     SERIAL_LSRMST_LSR_NODATA,
229     SERIAL_LSRMST_MST
230 }
231 
232 enum {
233     DISK_LOGGING_START,
234     DISK_LOGGING_STOP,
235     DISK_LOGGING_DUMP,
236     DISK_BINNING
237 }
238 
239 alias WORD BAD_TRACK_NUMBER;
240 alias WORD* PBAD_TRACK_NUMBER;
241 
242 enum BIN_TYPES {
243     RequestSize, RequestLocation
244 }
245 
246 struct BIN_RANGE {
247     LARGE_INTEGER StartValue;
248     LARGE_INTEGER Length;
249 }
250 alias BIN_RANGE* PBIN_RANGE;
251 
252 struct BIN_COUNT {
253     BIN_RANGE BinRange;
254     DWORD     BinCount;
255 }
256 alias BIN_COUNT* PBIN_COUNT;
257 
258 struct BIN_RESULTS {
259     DWORD     NumberOfBins;
260     BIN_COUNT _BinCounts;
261 
262     BIN_COUNT* BinCounts() return { return &_BinCounts; }
263 }
264 alias BIN_RESULTS* PBIN_RESULTS;
265 
266 enum PARTITION_STYLE {
267     PARTITION_STYLE_MBR,
268     PARTITION_STYLE_GPT,
269     PARTITION_STYLE_RAW
270 }
271 
272 struct CREATE_DISK_GPT {
273     GUID  DiskId;
274     DWORD MaxPartitionCount;
275 }
276 alias CREATE_DISK_GPT* PCREATE_DISK_GPT;
277 
278 struct CREATE_DISK_MBR {
279     DWORD Signature;
280 }
281 alias CREATE_DISK_MBR* PCREATE_DISK_MBR;
282 
283 struct CREATE_DISK {
284     PARTITION_STYLE PartitionStyle;
285     union {
286         CREATE_DISK_MBR Mbr;
287         CREATE_DISK_GPT Gpt;
288     }
289 }
290 alias CREATE_DISK* PCREATE_DISK;
291 
292 enum DISK_CACHE_RETENTION_PRIORITY {
293     EqualPriority,
294     KeepPrefetchedData,
295     KeepReadData
296 }
297 
298 struct DISK_CACHE_INFORMATION {
299     BOOLEAN ParametersSavable;
300     BOOLEAN ReadCacheEnabled;
301     BOOLEAN WriteCacheEnabled;
302     DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
303     DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;
304     WORD    DisablePrefetchTransferLength;
305     BOOLEAN PrefetchScalar;
306     union {
307         struct _ScalarPrefetch {
308             WORD Minimum;
309             WORD Maximum;
310             WORD MaximumBlocks;
311         }
312         _ScalarPrefetch ScalarPrefetch;
313         struct _BlockPrefetch {
314             WORD Minimum;
315             WORD Maximum;
316         }
317         _BlockPrefetch BlockPrefetch;
318     }
319 }
320 alias DISK_CACHE_INFORMATION* PDISK_CACHE_INFORMATION;
321 
322 enum DETECTION_TYPE {
323     DetectNone,
324     DetectInt13,
325     DetectExInt13
326 }
327 
328 struct DISK_INT13_INFO {
329     WORD  DriveSelect;
330     DWORD MaxCylinders;
331     WORD  SectorsPerTrack;
332     WORD  MaxHeads;
333     WORD  NumberDrives;
334     }
335 alias DISK_INT13_INFO* PDISK_INT13_INFO;
336 
337 struct DISK_EX_INT13_INFO {
338     WORD    ExBufferSize;
339     WORD    ExFlags;
340     DWORD   ExCylinders;
341     DWORD   ExHeads;
342     DWORD   ExSectorsPerTrack;
343     DWORD64 ExSectorsPerDrive;
344     WORD    ExSectorSize;
345     WORD    ExReserved;
346 }
347 alias DISK_EX_INT13_INFO* PDISK_EX_INT13_INFO;
348 
349 struct DISK_DETECTION_INFO {
350     DWORD              SizeOfDetectInfo;
351     DETECTION_TYPE     DetectionType;
352     DISK_INT13_INFO    Int13;
353     DISK_EX_INT13_INFO ExInt13;
354 }
355 alias DISK_DETECTION_INFO* PDISK_DETECTION_INFO;
356 
357 enum MEDIA_TYPE {
358     Unknown,
359     F5_1Pt2_512,
360     F3_1Pt44_512,
361     F3_2Pt88_512,
362     F3_20Pt8_512,
363     F3_720_512,
364     F5_360_512,
365     F5_320_512,
366     F5_320_1024,
367     F5_180_512,
368     F5_160_512,
369     RemovableMedia,
370     FixedMedia,
371     F3_120M_512,
372     F3_640_512,
373     F5_640_512,
374     F5_720_512,
375     F3_1Pt2_512,
376     F3_1Pt23_1024,
377     F5_1Pt23_1024,
378     F3_128Mb_512,
379     F3_230Mb_512,
380     F8_256_128,
381     F3_200Mb_512,
382     F3_240M_512,
383     F3_32M_512
384 }
385 alias MEDIA_TYPE* PMEDIA_TYPE;
386 
387 struct DISK_GEOMETRY {
388     LARGE_INTEGER Cylinders;
389     MEDIA_TYPE    MediaType;
390     DWORD         TracksPerCylinder;
391     DWORD         SectorsPerTrack;
392     DWORD         BytesPerSector;
393 }
394 alias DISK_GEOMETRY* PDISK_GEOMETRY;
395 
396 struct DISK_GEOMETRY_EX {
397     DISK_GEOMETRY Geometry;
398     LARGE_INTEGER DiskSize;
399     BYTE          _Data;
400 
401     BYTE* Data() return { return &_Data; }
402 }
403 alias DISK_GEOMETRY_EX* PDISK_GEOMETRY_EX;
404 
405 struct DISK_GROW_PARTITION {
406     DWORD         PartitionNumber;
407     LARGE_INTEGER BytesToGrow;
408 }
409 alias DISK_GROW_PARTITION* PDISK_GROW_PARTITION;
410 
411 struct DISK_PARTITION_INFO {
412     DWORD           SizeOfPartitionInfo;
413     PARTITION_STYLE PartitionStyle;
414     union {
415         //struct {
416             DWORD Signature;
417         //} Mbr;
418         //struct {
419             GUID DiskId;
420         //} Gpt;
421     }
422 }
423 alias DISK_PARTITION_INFO* PDISK_PARTITION_INFO;
424 
425 struct DISK_PERFORMANCE {
426     LARGE_INTEGER BytesRead;
427     LARGE_INTEGER BytesWritten;
428     LARGE_INTEGER ReadTime;
429     LARGE_INTEGER WriteTime;
430     DWORD         ReadCount;
431     DWORD         WriteCount;
432     DWORD         QueueDepth;
433 }
434 alias DISK_PERFORMANCE* PDISK_PERFORMANCE;
435 
436 struct DISK_RECORD {
437     LARGE_INTEGER ByteOffset;
438     LARGE_INTEGER StartTime;
439     LARGE_INTEGER EndTime;
440     PVOID         VirtualAddress;
441     DWORD         NumberOfBytes;
442     BYTE          DeviceNumber;
443     BOOLEAN       ReadRequest;
444 }
445 alias DISK_RECORD* PDISK_RECORD;
446 
447 struct DISK_LOGGING {
448     BYTE  Function;
449     PVOID BufferAddress;
450     DWORD BufferSize;
451 }
452 alias DISK_LOGGING* PDISK_LOGGING;
453 
454 struct DISKQUOTA_USER_INFORMATION {
455     LONGLONG QuotaUsed;
456     LONGLONG QuotaThreshold;
457     LONGLONG QuotaLimit;
458 }
459 alias DISKQUOTA_USER_INFORMATION* PDISKQUOTA_USER_INFORMATION;
460 
461 struct FORMAT_PARAMETERS {
462     MEDIA_TYPE MediaType;
463     DWORD      StartCylinderNumber;
464     DWORD      EndCylinderNumber;
465     DWORD      StartHeadNumber;
466     DWORD      EndHeadNumber;
467 }
468 alias FORMAT_PARAMETERS* PFORMAT_PARAMETERS;
469 
470 struct FORMAT_EX_PARAMETERS {
471     MEDIA_TYPE MediaType;
472     DWORD      StartCylinderNumber;
473     DWORD      EndCylinderNumber;
474     DWORD      StartHeadNumber;
475     DWORD      EndHeadNumber;
476     WORD       FormatGapLength;
477     WORD       SectorsPerTrack;
478     WORD       _SectorNumber;
479 
480     WORD* SectorNumber() return { return &_SectorNumber; }
481 }
482 alias FORMAT_EX_PARAMETERS* PFORMAT_EX_PARAMETERS;
483 
484 struct GET_LENGTH_INFORMATION {
485     LARGE_INTEGER Length;
486 }
487 
488 struct HISTOGRAM_BUCKET {
489     DWORD Reads;
490     DWORD Writes;
491 }
492 alias HISTOGRAM_BUCKET* PHISTOGRAM_BUCKET;
493 
494 struct DISK_HISTOGRAM {
495     LARGE_INTEGER     DiskSize;
496     LARGE_INTEGER     Start;
497     LARGE_INTEGER     End;
498     LARGE_INTEGER     Average;
499     LARGE_INTEGER     AverageRead;
500     LARGE_INTEGER     AverageWrite;
501     DWORD             Granularity;
502     DWORD             Size;
503     DWORD             ReadCount;
504     DWORD             WriteCount;
505     PHISTOGRAM_BUCKET Histogram;
506 }
507 alias DISK_HISTOGRAM* PDISK_HISTOGRAM;
508 
509 struct DISK_EXTENT {
510     DWORD         DiskNumber;
511     LARGE_INTEGER StartingOffset;
512     LARGE_INTEGER ExtentLength;
513 }
514 alias DISK_EXTENT* PDISK_EXTENT;
515 
516 struct VOLUME_DISK_EXTENTS {
517     DWORD       NumberOfDiskExtents;
518     DISK_EXTENT _Extents;
519 
520     DISK_EXTENT* Extents() return { return &_Extents; }
521 }
522 alias VOLUME_DISK_EXTENTS* PVOLUME_DISK_EXTENTS;
523 
524 struct PARTITION_INFORMATION {
525     LARGE_INTEGER StartingOffset;
526     LARGE_INTEGER PartitionLength;
527     DWORD         HiddenSectors;
528     DWORD         PartitionNumber;
529     BYTE          PartitionType;
530     BOOLEAN       BootIndicator;
531     BOOLEAN       RecognizedPartition;
532     BOOLEAN       RewritePartition;
533 }
534 alias PARTITION_INFORMATION* PPARTITION_INFORMATION;
535 
536 struct DRIVE_LAYOUT_INFORMATION {
537     DWORD                 PartitionCount;
538     DWORD                 Signature;
539     PARTITION_INFORMATION _PartitionEntry;
540 
541     PARTITION_INFORMATION* PartitionEntry() return { return &_PartitionEntry; }
542 }
543 alias DRIVE_LAYOUT_INFORMATION* PDRIVE_LAYOUT_INFORMATION;
544 
545 struct DRIVE_LAYOUT_INFORMATION_GPT {
546     GUID          DiskId;
547     LARGE_INTEGER StartingUsableOffset;
548     LARGE_INTEGER UsableLength;
549     ULONG         MaxPartitionCount;
550 }
551 alias DRIVE_LAYOUT_INFORMATION_GPT* PDRIVE_LAYOUT_INFORMATION_GPT;
552 
553 struct DRIVE_LAYOUT_INFORMATION_MBR {
554     ULONG Signature;
555 }
556 alias DRIVE_LAYOUT_INFORMATION_MBR* PDRIVE_LAYOUT_INFORMATION_MBR;
557 
558 struct PARTITION_INFORMATION_MBR {
559     BYTE    PartitionType;
560     BOOLEAN BootIndicator;
561     BOOLEAN RecognizedPartition;
562     DWORD   HiddenSectors;
563 }
564 
565 struct PARTITION_INFORMATION_GPT {
566     GUID      PartitionType;
567     GUID      PartitionId;
568     DWORD64   Attributes;
569     WCHAR[36] Name = 0;
570 }
571 
572 struct PARTITION_INFORMATION_EX {
573     PARTITION_STYLE PartitionStyle;
574     LARGE_INTEGER   StartingOffset;
575     LARGE_INTEGER   PartitionLength;
576     DWORD           PartitionNumber;
577     BOOLEAN         RewritePartition;
578     union {
579         PARTITION_INFORMATION_MBR Mbr;
580         PARTITION_INFORMATION_GPT Gpt;
581     }
582 }
583 
584 struct DRIVE_LAYOUT_INFORMATION_EX {
585     DWORD PartitionStyle;
586     DWORD PartitionCount;
587     union {
588         DRIVE_LAYOUT_INFORMATION_MBR Mbr;
589         DRIVE_LAYOUT_INFORMATION_GPT Gpt;
590     }
591     PARTITION_INFORMATION_EX _PartitionEntry;
592 
593     PARTITION_INFORMATION_EX* PartitionEntry() return { return &_PartitionEntry; }
594 }
595 alias DRIVE_LAYOUT_INFORMATION_EX* PDRIVE_LAYOUT_INFORMATION_EX;
596 
597 struct MOVE_FILE_DATA {
598     HANDLE FileHandle;
599     LARGE_INTEGER StartingVcn;
600     LARGE_INTEGER StartingLcn;
601     DWORD ClusterCount;
602 }
603 alias MOVE_FILE_DATA* PMOVE_FILE_DATA;
604 
605 struct PERF_BIN {
606     DWORD     NumberOfBins;
607     DWORD     TypeOfBin;
608     BIN_RANGE _BinsRanges;
609 
610     BIN_RANGE* BinsRanges() return { return &_BinsRanges; }
611 }
612 alias PERF_BIN* PPERF_BIN;
613 
614 struct PREVENT_MEDIA_REMOVAL {
615     BOOLEAN PreventMediaRemoval;
616 }
617 alias PREVENT_MEDIA_REMOVAL* PPREVENT_MEDIA_REMOVAL;
618 
619 struct RETRIEVAL_POINTERS_BUFFER {
620     DWORD         ExtentCount;
621     LARGE_INTEGER StartingVcn;
622     // In MinGW, this is declared as struct { ... } Extents[1];
623     struct Extent {
624         LARGE_INTEGER NextVcn;
625         LARGE_INTEGER Lcn;
626     }
627     Extent _Extents;
628 
629     Extent* Extents() return { return &_Extents; }
630 }
631 alias RETRIEVAL_POINTERS_BUFFER* PRETRIEVAL_POINTERS_BUFFER;
632 
633 struct REASSIGN_BLOCKS {
634     WORD  Reserved;
635     WORD  Count;
636     DWORD _BlockNumber;
637 
638     DWORD* BlockNumber() return { return &_BlockNumber; }
639 }
640 alias REASSIGN_BLOCKS* PREASSIGN_BLOCKS;
641 
642 struct SET_PARTITION_INFORMATION {
643     BYTE PartitionType;
644 }
645 alias SET_PARTITION_INFORMATION* PSET_PARTITION_INFORMATION;
646 
647 struct STARTING_LCN_INPUT_BUFFER {
648     LARGE_INTEGER StartingLcn;
649 }
650 alias STARTING_LCN_INPUT_BUFFER* PSTARTING_LCN_INPUT_BUFFER;
651 
652 struct STARTING_VCN_INPUT_BUFFER {
653     LARGE_INTEGER StartingVcn;
654 }
655 alias STARTING_VCN_INPUT_BUFFER* PSTARTING_VCN_INPUT_BUFFER;
656 
657 struct VERIFY_INFORMATION {
658     LARGE_INTEGER StartingOffset;
659     DWORD         Length;
660 }
661 alias VERIFY_INFORMATION* PVERIFY_INFORMATION;
662 
663 struct VOLUME_BITMAP_BUFFER {
664     LARGE_INTEGER StartingLcn;
665     LARGE_INTEGER BitmapSize;
666     BYTE          _Buffer;
667 
668     BYTE* Buffer() return { return &_Buffer; }
669 }
670 alias VOLUME_BITMAP_BUFFER* PVOLUME_BITMAP_BUFFER;
671 
672 struct NTFS_VOLUME_DATA_BUFFER {
673     LARGE_INTEGER VolumeSerialNumber;
674     LARGE_INTEGER NumberSectors;
675     LARGE_INTEGER TotalClusters;
676     LARGE_INTEGER FreeClusters;
677     LARGE_INTEGER TotalReserved;
678     DWORD         BytesPerSector;
679     DWORD         BytesPerCluster;
680     DWORD         BytesPerFileRecordSegment;
681     DWORD         ClustersPerFileRecordSegment;
682     LARGE_INTEGER MftValidDataLength;
683     LARGE_INTEGER MftStartLcn;
684     LARGE_INTEGER Mft2StartLcn;
685     LARGE_INTEGER MftZoneStart;
686     LARGE_INTEGER MftZoneEnd;
687 }
688 alias NTFS_VOLUME_DATA_BUFFER* PNTFS_VOLUME_DATA_BUFFER;
689 
690 
691 bool IsRecognizedPartition()(BYTE t) {
692     return ((t & PARTITION_NTFT)
693       && ((t & (-1 - VALID_NTFT)) == PARTITION_FAT_12
694         || (t & (-1 - VALID_NTFT)) == PARTITION_FAT_16
695         || (t & (-1 - VALID_NTFT)) == PARTITION_IFS
696         || (t & (-1 - VALID_NTFT)) == PARTITION_HUGE
697         || (t & (-1 - VALID_NTFT)) == PARTITION_FAT32
698         || (t & (-1 - VALID_NTFT)) == PARTITION_FAT32_XINT13
699         || (t & (-1 - VALID_NTFT)) == PARTITION_XINT13))
700       || (t & (-1 - PARTITION_NTFT)) == PARTITION_FAT_12
701       || (t & (-1 - PARTITION_NTFT)) == PARTITION_FAT_16
702       || (t & (-1 - PARTITION_NTFT)) == PARTITION_IFS
703       || (t & (-1 - PARTITION_NTFT)) == PARTITION_HUGE
704       || (t & (-1 - PARTITION_NTFT)) == PARTITION_FAT32
705       || (t & (-1 - PARTITION_NTFT)) == PARTITION_FAT32_XINT13
706       || (t & (-1 - PARTITION_NTFT)) == PARTITION_XINT13;
707 }
708 
709 bool IsContainerPartition()(BYTE t) {
710     return ((t & PARTITION_NTFT)
711       && ((t & (-1 - VALID_NTFT)) == PARTITION_EXTENDED
712         || (t & (-1 - VALID_NTFT)) == PARTITION_XINT13_EXTENDED))
713       || (t & (-1 - PARTITION_NTFT)) == PARTITION_EXTENDED
714       || (t & (-1 - PARTITION_NTFT)) == PARTITION_XINT13_EXTENDED;
715 }