comparison win32/winioctl.d @ 1:4a9dcbd9e54f

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