• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 #ifdef DEFINE_GUID
7 
8 #ifndef FAR
9 #define FAR
10 #endif
11 
12 DEFINE_GUID(GUID_DEVINTERFACE_DISK,0x53f56307,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
13 DEFINE_GUID(GUID_DEVINTERFACE_CDROM,0x53f56308,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
14 DEFINE_GUID(GUID_DEVINTERFACE_PARTITION,0x53f5630a,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
15 DEFINE_GUID(GUID_DEVINTERFACE_TAPE,0x53f5630b,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
16 DEFINE_GUID(GUID_DEVINTERFACE_WRITEONCEDISK,0x53f5630c,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
17 DEFINE_GUID(GUID_DEVINTERFACE_VOLUME,0x53f5630d,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
18 DEFINE_GUID(GUID_DEVINTERFACE_MEDIUMCHANGER,0x53f56310,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
19 DEFINE_GUID(GUID_DEVINTERFACE_FLOPPY,0x53f56311,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
20 DEFINE_GUID(GUID_DEVINTERFACE_CDCHANGER,0x53f56312,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
21 DEFINE_GUID(GUID_DEVINTERFACE_STORAGEPORT,0x2accfe60,0xc130,0x11d2,0xb0,0x82,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
22 DEFINE_GUID(GUID_DEVINTERFACE_COMPORT,0x86e0d1e0,0x8089,0x11d0,0x9c,0xe4,0x08,0x00,0x3e,0x30,0x1f,0x73);
23 DEFINE_GUID(GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR,0x4D36E978,0xE325,0x11CE,0xBF,0xC1,0x08,0x00,0x2B,0xE1,0x03,0x18);
24 
25 #define DiskClassGuid GUID_DEVINTERFACE_DISK
26 #define CdRomClassGuid GUID_DEVINTERFACE_CDROM
27 #define PartitionClassGuid GUID_DEVINTERFACE_PARTITION
28 #define TapeClassGuid GUID_DEVINTERFACE_TAPE
29 #define WriteOnceDiskClassGuid GUID_DEVINTERFACE_WRITEONCEDISK
30 #define VolumeClassGuid GUID_DEVINTERFACE_VOLUME
31 #define MediumChangerClassGuid GUID_DEVINTERFACE_MEDIUMCHANGER
32 #define FloppyClassGuid GUID_DEVINTERFACE_FLOPPY
33 #define CdChangerClassGuid GUID_DEVINTERFACE_CDCHANGER
34 #define StoragePortClassGuid GUID_DEVINTERFACE_STORAGEPORT
35 #define GUID_CLASS_COMPORT GUID_DEVINTERFACE_COMPORT
36 #define GUID_SERENUM_BUS_ENUMERATOR GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR
37 #endif /* DEFINE_GUID */
38 
39 #ifndef _WINIOCTL_
40 #define _WINIOCTL_
41 
42 #ifndef _DEVIOCTL_
43 #define _DEVIOCTL_
44 
45 #ifndef DEVICE_TYPE
46 #define DEVICE_TYPE DWORD
47 #endif
48 
49 #define FILE_DEVICE_BEEP 0x00000001
50 #define FILE_DEVICE_CD_ROM 0x00000002
51 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
52 #define FILE_DEVICE_CONTROLLER 0x00000004
53 #define FILE_DEVICE_DATALINK 0x00000005
54 #define FILE_DEVICE_DFS 0x00000006
55 #define FILE_DEVICE_DISK 0x00000007
56 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
57 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
58 #define FILE_DEVICE_INPORT_PORT 0x0000000a
59 #define FILE_DEVICE_KEYBOARD 0x0000000b
60 #define FILE_DEVICE_MAILSLOT 0x0000000c
61 #define FILE_DEVICE_MIDI_IN 0x0000000d
62 #define FILE_DEVICE_MIDI_OUT 0x0000000e
63 #define FILE_DEVICE_MOUSE 0x0000000f
64 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
65 #define FILE_DEVICE_NAMED_PIPE 0x00000011
66 #define FILE_DEVICE_NETWORK 0x00000012
67 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
68 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
69 #define FILE_DEVICE_NULL 0x00000015
70 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
71 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
72 #define FILE_DEVICE_PRINTER 0x00000018
73 #define FILE_DEVICE_SCANNER 0x00000019
74 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
75 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
76 #define FILE_DEVICE_SCREEN 0x0000001c
77 #define FILE_DEVICE_SOUND 0x0000001d
78 #define FILE_DEVICE_STREAMS 0x0000001e
79 #define FILE_DEVICE_TAPE 0x0000001f
80 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
81 #define FILE_DEVICE_TRANSPORT 0x00000021
82 #define FILE_DEVICE_UNKNOWN 0x00000022
83 #define FILE_DEVICE_VIDEO 0x00000023
84 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
85 #define FILE_DEVICE_WAVE_IN 0x00000025
86 #define FILE_DEVICE_WAVE_OUT 0x00000026
87 #define FILE_DEVICE_8042_PORT 0x00000027
88 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
89 #define FILE_DEVICE_BATTERY 0x00000029
90 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
91 #define FILE_DEVICE_MODEM 0x0000002b
92 #define FILE_DEVICE_VDM 0x0000002c
93 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
94 #define FILE_DEVICE_SMB 0x0000002e
95 #define FILE_DEVICE_KS 0x0000002f
96 #define FILE_DEVICE_CHANGER 0x00000030
97 #define FILE_DEVICE_SMARTCARD 0x00000031
98 #define FILE_DEVICE_ACPI 0x00000032
99 #define FILE_DEVICE_DVD 0x00000033
100 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
101 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
102 #define FILE_DEVICE_DFS_VOLUME 0x00000036
103 #define FILE_DEVICE_SERENUM 0x00000037
104 #define FILE_DEVICE_TERMSRV 0x00000038
105 #define FILE_DEVICE_KSEC 0x00000039
106 #define FILE_DEVICE_FIPS 0x0000003A
107 #define FILE_DEVICE_INFINIBAND 0x0000003B
108 #define FILE_DEVICE_VMBUS 0x0000003E
109 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F
110 #define FILE_DEVICE_WPD 0x00000040
111 #define FILE_DEVICE_BLUETOOTH 0x00000041
112 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
113 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
114 #define FILE_DEVICE_BIOMETRIC 0x00000044
115 #define FILE_DEVICE_PMI 0x00000045
116 #define FILE_DEVICE_EHSTOR 0x00000046
117 #define FILE_DEVICE_DEVAPI 0x00000047
118 #define FILE_DEVICE_GPIO 0x00000048
119 #define FILE_DEVICE_USBEX 0x00000049
120 #define FILE_DEVICE_CONSOLE 0x00000050
121 #define FILE_DEVICE_NFP 0x00000051
122 #define FILE_DEVICE_SYSENV 0x00000052
123 #define FILE_DEVICE_VIRTUAL_BLOCK 0x00000053
124 #define FILE_DEVICE_POINT_OF_SERVICE 0x00000054
125 #define FILE_DEVICE_STORAGE_REPLICATION 0x00000055
126 #define FILE_DEVICE_TRUST_ENV 0x00000056
127 #define FILE_DEVICE_UCM 0x00000057
128 #define FILE_DEVICE_UCMTCPCI 0x00000058
129 #define FILE_DEVICE_PERSISTENT_MEMORY 0x00000059
130 #define FILE_DEVICE_NVDIMM 0x0000005a
131 #define FILE_DEVICE_HOLOGRAPHIC 0x0000005b
132 #define FILE_DEVICE_SDFXHCI 0x0000005c
133 #define FILE_DEVICE_UCMUCSI 0x0000005d
134 
135 #define CTL_CODE(DeviceType,Function,Method,Access) (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
136 
137 #define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) (((DWORD)(ctrlCode & 0xffff0000)) >> 16)
138 
139 #define METHOD_BUFFERED 0
140 #define METHOD_IN_DIRECT 1
141 #define METHOD_OUT_DIRECT 2
142 #define METHOD_NEITHER 3
143 
144 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
145 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
146 
147 #define FILE_ANY_ACCESS 0
148 #define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS)
149 #define FILE_READ_ACCESS (0x0001)
150 #define FILE_WRITE_ACCESS (0x0002)
151 
152 #endif /* _DEVIOCTL_ */
153 
154 
155 #ifndef _NTDDSTOR_H_
156 #define _NTDDSTOR_H_
157 
158 #ifdef __cplusplus
159 extern "C" {
160 #endif
161 
162 #define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE
163 
164 #define IOCTL_STORAGE_CHECK_VERIFY CTL_CODE(IOCTL_STORAGE_BASE,0x0200,METHOD_BUFFERED,FILE_READ_ACCESS)
165 #define IOCTL_STORAGE_CHECK_VERIFY2 CTL_CODE(IOCTL_STORAGE_BASE,0x0200,METHOD_BUFFERED,FILE_ANY_ACCESS)
166 #define IOCTL_STORAGE_MEDIA_REMOVAL CTL_CODE(IOCTL_STORAGE_BASE,0x0201,METHOD_BUFFERED,FILE_READ_ACCESS)
167 #define IOCTL_STORAGE_EJECT_MEDIA CTL_CODE(IOCTL_STORAGE_BASE,0x0202,METHOD_BUFFERED,FILE_READ_ACCESS)
168 #define IOCTL_STORAGE_LOAD_MEDIA CTL_CODE(IOCTL_STORAGE_BASE,0x0203,METHOD_BUFFERED,FILE_READ_ACCESS)
169 #define IOCTL_STORAGE_LOAD_MEDIA2 CTL_CODE(IOCTL_STORAGE_BASE,0x0203,METHOD_BUFFERED,FILE_ANY_ACCESS)
170 #define IOCTL_STORAGE_RESERVE CTL_CODE(IOCTL_STORAGE_BASE,0x0204,METHOD_BUFFERED,FILE_READ_ACCESS)
171 #define IOCTL_STORAGE_RELEASE CTL_CODE(IOCTL_STORAGE_BASE,0x0205,METHOD_BUFFERED,FILE_READ_ACCESS)
172 #define IOCTL_STORAGE_FIND_NEW_DEVICES CTL_CODE(IOCTL_STORAGE_BASE,0x0206,METHOD_BUFFERED,FILE_READ_ACCESS)
173 
174 #define IOCTL_STORAGE_EJECTION_CONTROL CTL_CODE(IOCTL_STORAGE_BASE,0x0250,METHOD_BUFFERED,FILE_ANY_ACCESS)
175 #define IOCTL_STORAGE_MCN_CONTROL CTL_CODE(IOCTL_STORAGE_BASE,0x0251,METHOD_BUFFERED,FILE_ANY_ACCESS)
176 
177 #define IOCTL_STORAGE_GET_MEDIA_TYPES CTL_CODE(IOCTL_STORAGE_BASE,0x0300,METHOD_BUFFERED,FILE_ANY_ACCESS)
178 #define IOCTL_STORAGE_GET_MEDIA_TYPES_EX CTL_CODE(IOCTL_STORAGE_BASE,0x0301,METHOD_BUFFERED,FILE_ANY_ACCESS)
179 #define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER CTL_CODE(IOCTL_STORAGE_BASE,0x0304,METHOD_BUFFERED,FILE_ANY_ACCESS)
180 #define IOCTL_STORAGE_GET_HOTPLUG_INFO CTL_CODE(IOCTL_STORAGE_BASE,0x0305,METHOD_BUFFERED,FILE_ANY_ACCESS)
181 #define IOCTL_STORAGE_SET_HOTPLUG_INFO CTL_CODE(IOCTL_STORAGE_BASE,0x0306,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
182 
183 #define IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE,0x0400,METHOD_BUFFERED,FILE_READ_ACCESS)
184 #define IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE,0x0401,METHOD_BUFFERED,FILE_READ_ACCESS)
185 #define IOCTL_STORAGE_BREAK_RESERVATION CTL_CODE(IOCTL_STORAGE_BASE,0x0405,METHOD_BUFFERED,FILE_READ_ACCESS)
186 
187 #define IOCTL_STORAGE_GET_DEVICE_NUMBER CTL_CODE(IOCTL_STORAGE_BASE,0x0420,METHOD_BUFFERED,FILE_ANY_ACCESS)
188 #define IOCTL_STORAGE_PREDICT_FAILURE CTL_CODE(IOCTL_STORAGE_BASE,0x0440,METHOD_BUFFERED,FILE_ANY_ACCESS)
189 #define IOCTL_STORAGE_READ_CAPACITY CTL_CODE(IOCTL_STORAGE_BASE,0x0450,METHOD_BUFFERED,FILE_READ_ACCESS)
190 
191 #define OBSOLETE_IOCTL_STORAGE_RESET_BUS CTL_CODE(IOCTL_STORAGE_BASE,0x0400,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
192 #define OBSOLETE_IOCTL_STORAGE_RESET_DEVICE CTL_CODE(IOCTL_STORAGE_BASE,0x0401,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
193 
194 typedef struct _STORAGE_READ_CAPACITY {
195   ULONG Version;
196   ULONG Size;
197   ULONG BlockLength;
198   LARGE_INTEGER NumberOfBlocks;
199   LARGE_INTEGER DiskLength;
200 } STORAGE_READ_CAPACITY, *PSTORAGE_READ_CAPACITY;
201 
202 #if (_WIN32_WINNT >= 0x0601)
203 #define IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES CTL_CODE(IOCTL_STORAGE_BASE, 0x0501, METHOD_BUFFERED, FILE_WRITE_ACCESS)
204 #define DeviceDsmActionFlag_NonDestructive 0x80000000
205 #define DeviceDsmAction_None 0
206 #define DeviceDsmAction_Trim 1
207 #define DeviceDsmAction_Notification (2 | DeviceDsmActionFlag_NonDestructive)
208 
209 #define IsDsmActionNonDestructive(x) ((BOOLEAN)(!!((x) & DeviceDsmActionFlag_NonDestructive)))
210 
211 #define DEVICE_DSM_FLAG_ENTIRE_DATA_SET_RANGE __MSABI_LONG(0x00000001)
212 
213 typedef DWORD DEVICE_DATA_MANAGEMENT_SET_ACTION;
214 typedef struct _DEVICE_MANAGE_DATA_SET_ATTRIBUTES {
215   DWORD                             Size;
216   DEVICE_DATA_MANAGEMENT_SET_ACTION Action;
217   DWORD                             Flags;
218   DWORD                             ParameterBlockOffset;
219   DWORD                             ParameterBlockLength;
220   DWORD                             DataSetRangesOffset;
221   DWORD                             DataSetRangesLength;
222 } DEVICE_MANAGE_DATA_SET_ATTRIBUTES, *PDEVICE_MANAGE_DATA_SET_ATTRIBUTES;
223 
224 typedef struct _DEVICE_DATA_SET_RANGE {
225   LONGLONG  StartingOffset;
226   DWORDLONG LengthInBytes;
227 } DEVICE_DATA_SET_RANGE, *PDEVICE_DATA_SET_RANGE;
228 
229 #endif /*(_WIN32_WINNT >= 0x0601)*/
230 
231   typedef struct _STORAGE_HOTPLUG_INFO {
232     DWORD Size;
233     BOOLEAN MediaRemovable;
234     BOOLEAN MediaHotplug;
235     BOOLEAN DeviceHotplug;
236     BOOLEAN WriteCacheEnableOverride;
237   } STORAGE_HOTPLUG_INFO,*PSTORAGE_HOTPLUG_INFO;
238 
239   typedef struct _STORAGE_DEVICE_NUMBER {
240     DEVICE_TYPE DeviceType;
241     DWORD DeviceNumber;
242     DWORD PartitionNumber;
243   } STORAGE_DEVICE_NUMBER,*PSTORAGE_DEVICE_NUMBER;
244 
245   typedef struct _STORAGE_BUS_RESET_REQUEST {
246     BYTE PathId;
247   } STORAGE_BUS_RESET_REQUEST,*PSTORAGE_BUS_RESET_REQUEST;
248 
249   typedef struct STORAGE_BREAK_RESERVATION_REQUEST {
250     DWORD Length;
251     BYTE _unused;
252     BYTE PathId;
253     BYTE TargetId;
254     BYTE Lun;
255   } STORAGE_BREAK_RESERVATION_REQUEST,*PSTORAGE_BREAK_RESERVATION_REQUEST;
256 
257   typedef struct _PREVENT_MEDIA_REMOVAL {
258     BOOLEAN PreventMediaRemoval;
259   } PREVENT_MEDIA_REMOVAL,*PPREVENT_MEDIA_REMOVAL;
260 
261   typedef struct _CLASS_MEDIA_CHANGE_CONTEXT {
262     DWORD MediaChangeCount;
263     DWORD NewState;
264   } CLASS_MEDIA_CHANGE_CONTEXT,*PCLASS_MEDIA_CHANGE_CONTEXT;
265 
266   typedef struct _TAPE_STATISTICS {
267     DWORD Version;
268     DWORD Flags;
269     LARGE_INTEGER RecoveredWrites;
270     LARGE_INTEGER UnrecoveredWrites;
271     LARGE_INTEGER RecoveredReads;
272     LARGE_INTEGER UnrecoveredReads;
273     BYTE CompressionRatioReads;
274     BYTE CompressionRatioWrites;
275   } TAPE_STATISTICS,*PTAPE_STATISTICS;
276 
277 #define RECOVERED_WRITES_VALID 0x00000001
278 #define UNRECOVERED_WRITES_VALID 0x00000002
279 #define RECOVERED_READS_VALID 0x00000004
280 #define UNRECOVERED_READS_VALID 0x00000008
281 #define WRITE_COMPRESSION_INFO_VALID 0x00000010
282 #define READ_COMPRESSION_INFO_VALID 0x00000020
283 
284   typedef struct _TAPE_GET_STATISTICS {
285     DWORD Operation;
286   } TAPE_GET_STATISTICS,*PTAPE_GET_STATISTICS;
287 
288 #define TAPE_RETURN_STATISTICS __MSABI_LONG(0)
289 #define TAPE_RETURN_ENV_INFO __MSABI_LONG(1)
290 #define TAPE_RESET_STATISTICS __MSABI_LONG(2)
291 
292   typedef enum _STORAGE_MEDIA_TYPE {
293     DDS_4mm	= 0x20,
294     MiniQic,
295     Travan,
296     QIC,
297     MP_8mm,
298     AME_8mm,
299     AIT1_8mm,
300     DLT,
301     NCTP,
302     IBM_3480,
303     IBM_3490E,
304     IBM_Magstar_3590,
305     IBM_Magstar_MP,
306     STK_DATA_D3,
307     SONY_DTF,
308     DV_6mm,
309     DMI,
310     SONY_D2,
311     CLEANER_CARTRIDGE,
312     CD_ROM,
313     CD_R,
314     CD_RW,
315     DVD_ROM,
316     DVD_R,
317     DVD_RW,
318     MO_3_RW,
319     MO_5_WO,
320     MO_5_RW,
321     MO_5_LIMDOW,
322     PC_5_WO,
323     PC_5_RW,
324     PD_5_RW,
325     ABL_5_WO,
326     PINNACLE_APEX_5_RW,
327     SONY_12_WO,
328     PHILIPS_12_WO,
329     HITACHI_12_WO,
330     CYGNET_12_WO,
331     KODAK_14_WO,
332     MO_NFR_525,
333     NIKON_12_RW,
334     IOMEGA_ZIP,
335     IOMEGA_JAZ,
336     SYQUEST_EZ135,
337     SYQUEST_EZFLYER,
338     SYQUEST_SYJET,
339     AVATAR_F2,
340     MP2_8mm,
341     DST_S,
342     DST_M,
343     DST_L,
344     VXATape_1,
345     VXATape_2,
346     STK_9840,
347     LTO_Ultrium,
348     LTO_Accelis,
349     DVD_RAM,
350     AIT_8mm,
351     ADR_1,
352     ADR_2,
353     STK_9940,
354     SAIT,
355     VXATape
356   } STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
357 
358 #define MEDIA_ERASEABLE 0x00000001
359 #define MEDIA_WRITE_ONCE 0x00000002
360 #define MEDIA_READ_ONLY 0x00000004
361 #define MEDIA_READ_WRITE 0x00000008
362 
363 #define MEDIA_WRITE_PROTECTED 0x00000100
364 #define MEDIA_CURRENTLY_MOUNTED 0x80000000
365 
366   typedef enum _STORAGE_BUS_TYPE {
367     BusTypeUnknown             = 0x00,
368     BusTypeScsi                = 0x1,
369     BusTypeAtapi               = 0x2,
370     BusTypeAta                 = 0x3,
371     BusType1394                = 0x4,
372     BusTypeSsa                 = 0x5,
373     BusTypeFibre               = 0x6,
374     BusTypeUsb                 = 0x7,
375     BusTypeRAID                = 0x8,
376 #if (_WIN32_WINNT >= 0x0600)
377     BusTypeiScsi               = 0x9,
378     BusTypeSas                 = 0xA,
379     BusTypeSata                = 0xB,
380     BusTypeSd                  = 0xC,
381     BusTypeMmc                 = 0xD,
382 #endif /*(_WIN32_WINNT >= 0x0600)*/
383 #if (_WIN32_WINNT >= 0x0601)
384     BusTypeVirtual             = 0xE,
385     BusTypeFileBackedVirtual   = 0xF,
386 #endif /*(_WIN32_WINNT >= 0x0601)*/
387     BusTypeMax,
388     BusTypeMaxReserved         = 0x7F
389   } STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
390 
391   typedef struct _DEVICE_MEDIA_INFO {
392     union {
393       struct {
394 	LARGE_INTEGER Cylinders;
395 	STORAGE_MEDIA_TYPE MediaType;
396 	DWORD TracksPerCylinder;
397 	DWORD SectorsPerTrack;
398 	DWORD BytesPerSector;
399 	DWORD NumberMediaSides;
400 	DWORD MediaCharacteristics;
401       } DiskInfo;
402       struct {
403 	LARGE_INTEGER Cylinders;
404 	STORAGE_MEDIA_TYPE MediaType;
405 	DWORD TracksPerCylinder;
406 	DWORD SectorsPerTrack;
407 	DWORD BytesPerSector;
408 	DWORD NumberMediaSides;
409 	DWORD MediaCharacteristics;
410       } RemovableDiskInfo;
411       struct {
412 	STORAGE_MEDIA_TYPE MediaType;
413 	DWORD MediaCharacteristics;
414 	DWORD CurrentBlockSize;
415 	STORAGE_BUS_TYPE BusType;
416 	union {
417 	  struct {
418 	    BYTE MediumType;
419 	    BYTE DensityCode;
420 	  } ScsiInformation;
421 	} BusSpecificData;
422       } TapeInfo;
423     } DeviceSpecific;
424   } DEVICE_MEDIA_INFO,*PDEVICE_MEDIA_INFO;
425 
426   typedef struct _GET_MEDIA_TYPES {
427     DWORD DeviceType;
428     DWORD MediaInfoCount;
429     DEVICE_MEDIA_INFO MediaInfo[1];
430   } GET_MEDIA_TYPES,*PGET_MEDIA_TYPES;
431 
432   typedef struct _STORAGE_PREDICT_FAILURE {
433     DWORD PredictFailure;
434     BYTE VendorSpecific[512];
435   } STORAGE_PREDICT_FAILURE,*PSTORAGE_PREDICT_FAILURE;
436 
437 #ifdef __cplusplus
438 }
439 #endif
440 #endif /* _NTDDSTOR_H_ */
441 
442 
443 #ifndef _NTDDDISK_H_
444 #define _NTDDDISK_H_
445 
446 #define IOCTL_DISK_BASE FILE_DEVICE_DISK
447 #define IOCTL_DISK_GET_DRIVE_GEOMETRY CTL_CODE(IOCTL_DISK_BASE,0x0000,METHOD_BUFFERED,FILE_ANY_ACCESS)
448 #define IOCTL_DISK_GET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE,0x0001,METHOD_BUFFERED,FILE_READ_ACCESS)
449 #define IOCTL_DISK_SET_PARTITION_INFO CTL_CODE(IOCTL_DISK_BASE,0x0002,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
450 #define IOCTL_DISK_GET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x0003,METHOD_BUFFERED,FILE_READ_ACCESS)
451 #define IOCTL_DISK_SET_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x0004,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
452 #define IOCTL_DISK_VERIFY CTL_CODE(IOCTL_DISK_BASE,0x0005,METHOD_BUFFERED,FILE_ANY_ACCESS)
453 #define IOCTL_DISK_FORMAT_TRACKS CTL_CODE(IOCTL_DISK_BASE,0x0006,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
454 #define IOCTL_DISK_REASSIGN_BLOCKS CTL_CODE(IOCTL_DISK_BASE,0x0007,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
455 #define IOCTL_DISK_PERFORMANCE CTL_CODE(IOCTL_DISK_BASE,0x0008,METHOD_BUFFERED,FILE_ANY_ACCESS)
456 #define IOCTL_DISK_IS_WRITABLE CTL_CODE(IOCTL_DISK_BASE,0x0009,METHOD_BUFFERED,FILE_ANY_ACCESS)
457 #define IOCTL_DISK_LOGGING CTL_CODE(IOCTL_DISK_BASE,0x000a,METHOD_BUFFERED,FILE_ANY_ACCESS)
458 #define IOCTL_DISK_FORMAT_TRACKS_EX CTL_CODE(IOCTL_DISK_BASE,0x000b,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
459 #define IOCTL_DISK_HISTOGRAM_STRUCTURE CTL_CODE(IOCTL_DISK_BASE,0x000c,METHOD_BUFFERED,FILE_ANY_ACCESS)
460 #define IOCTL_DISK_HISTOGRAM_DATA CTL_CODE(IOCTL_DISK_BASE,0x000d,METHOD_BUFFERED,FILE_ANY_ACCESS)
461 #define IOCTL_DISK_HISTOGRAM_RESET CTL_CODE(IOCTL_DISK_BASE,0x000e,METHOD_BUFFERED,FILE_ANY_ACCESS)
462 #define IOCTL_DISK_REQUEST_STRUCTURE CTL_CODE(IOCTL_DISK_BASE,0x000f,METHOD_BUFFERED,FILE_ANY_ACCESS)
463 #define IOCTL_DISK_REQUEST_DATA CTL_CODE(IOCTL_DISK_BASE,0x0010,METHOD_BUFFERED,FILE_ANY_ACCESS)
464 #define IOCTL_DISK_PERFORMANCE_OFF CTL_CODE(IOCTL_DISK_BASE,0x0018,METHOD_BUFFERED,FILE_ANY_ACCESS)
465 #define IOCTL_DISK_CONTROLLER_NUMBER CTL_CODE(IOCTL_DISK_BASE,0x0011,METHOD_BUFFERED,FILE_ANY_ACCESS)
466 
467 #define SMART_GET_VERSION CTL_CODE(IOCTL_DISK_BASE,0x0020,METHOD_BUFFERED,FILE_READ_ACCESS)
468 #define SMART_SEND_DRIVE_COMMAND CTL_CODE(IOCTL_DISK_BASE,0x0021,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
469 #define SMART_RCV_DRIVE_DATA CTL_CODE(IOCTL_DISK_BASE,0x0022,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
470 
471 #define IOCTL_DISK_GET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE,0x0012,METHOD_BUFFERED,FILE_ANY_ACCESS)
472 #define IOCTL_DISK_SET_PARTITION_INFO_EX CTL_CODE(IOCTL_DISK_BASE,0x0013,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
473 #define IOCTL_DISK_GET_DRIVE_LAYOUT_EX CTL_CODE(IOCTL_DISK_BASE,0x0014,METHOD_BUFFERED,FILE_ANY_ACCESS)
474 #define IOCTL_DISK_SET_DRIVE_LAYOUT_EX CTL_CODE(IOCTL_DISK_BASE,0x0015,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
475 #define IOCTL_DISK_CREATE_DISK CTL_CODE(IOCTL_DISK_BASE,0x0016,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
476 #define IOCTL_DISK_GET_LENGTH_INFO CTL_CODE(IOCTL_DISK_BASE,0x0017,METHOD_BUFFERED,FILE_READ_ACCESS)
477 #define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX CTL_CODE(IOCTL_DISK_BASE,0x0028,METHOD_BUFFERED,FILE_ANY_ACCESS)
478 
479 #define IOCTL_DISK_REASSIGN_BLOCKS_EX CTL_CODE(IOCTL_DISK_BASE,0x0029,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
480 #define IOCTL_DISK_UPDATE_DRIVE_SIZE CTL_CODE(IOCTL_DISK_BASE,0x0032,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
481 #define IOCTL_DISK_GROW_PARTITION CTL_CODE(IOCTL_DISK_BASE,0x0034,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
482 #define IOCTL_DISK_GET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE,0x0035,METHOD_BUFFERED,FILE_READ_ACCESS)
483 #define IOCTL_DISK_SET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE,0x0036,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
484 #define OBSOLETE_DISK_GET_WRITE_CACHE_STATE CTL_CODE(IOCTL_DISK_BASE,0x0037,METHOD_BUFFERED,FILE_READ_ACCESS)
485 #define IOCTL_DISK_DELETE_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE,0x0040,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
486 #define IOCTL_DISK_UPDATE_PROPERTIES CTL_CODE(IOCTL_DISK_BASE,0x0050,METHOD_BUFFERED,FILE_ANY_ACCESS)
487 #define IOCTL_DISK_RESET_SNAPSHOT_INFO CTL_CODE(IOCTL_DISK_BASE,0x0084,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
488 #define IOCTL_DISK_FORMAT_DRIVE CTL_CODE(IOCTL_DISK_BASE,0x00f3,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
489 #define IOCTL_DISK_SENSE_DEVICE CTL_CODE(IOCTL_DISK_BASE,0x00f8,METHOD_BUFFERED,FILE_ANY_ACCESS)
490 #define IOCTL_DISK_CHECK_VERIFY CTL_CODE(IOCTL_DISK_BASE,0x0200,METHOD_BUFFERED,FILE_READ_ACCESS)
491 #define IOCTL_DISK_MEDIA_REMOVAL CTL_CODE(IOCTL_DISK_BASE,0x0201,METHOD_BUFFERED,FILE_READ_ACCESS)
492 #define IOCTL_DISK_EJECT_MEDIA CTL_CODE(IOCTL_DISK_BASE,0x0202,METHOD_BUFFERED,FILE_READ_ACCESS)
493 #define IOCTL_DISK_LOAD_MEDIA CTL_CODE(IOCTL_DISK_BASE,0x0203,METHOD_BUFFERED,FILE_READ_ACCESS)
494 #define IOCTL_DISK_RESERVE CTL_CODE(IOCTL_DISK_BASE,0x0204,METHOD_BUFFERED,FILE_READ_ACCESS)
495 #define IOCTL_DISK_RELEASE CTL_CODE(IOCTL_DISK_BASE,0x0205,METHOD_BUFFERED,FILE_READ_ACCESS)
496 #define IOCTL_DISK_FIND_NEW_DEVICES CTL_CODE(IOCTL_DISK_BASE,0x0206,METHOD_BUFFERED,FILE_READ_ACCESS)
497 #define IOCTL_DISK_GET_MEDIA_TYPES CTL_CODE(IOCTL_DISK_BASE,0x0300,METHOD_BUFFERED,FILE_ANY_ACCESS)
498 #define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
499 
500 #define PARTITION_ENTRY_UNUSED 0x00
501 #define PARTITION_FAT_12 0x01
502 #define PARTITION_XENIX_1 0x02
503 #define PARTITION_XENIX_2 0x03
504 #define PARTITION_FAT_16 0x04
505 #define PARTITION_EXTENDED 0x05
506 #define PARTITION_HUGE 0x06
507 #define PARTITION_IFS 0x07
508 #define PARTITION_OS2BOOTMGR 0x0A
509 #define PARTITION_FAT32 0x0B
510 #define PARTITION_FAT32_XINT13 0x0C
511 #define PARTITION_XINT13 0x0E
512 #define PARTITION_XINT13_EXTENDED 0x0F
513 #define PARTITION_PREP 0x41
514 #define PARTITION_LDM 0x42
515 #define PARTITION_UNIX 0x63
516 
517 #define VALID_NTFT 0xC0
518 
519 #define PARTITION_NTFT 0x80
520 
521 #define IsRecognizedPartition(PartitionType) (((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0)==PARTITION_FAT_12)) || ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0)==PARTITION_IFS)) || ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0)==PARTITION_HUGE)) || ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0)==PARTITION_FAT32)) || ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0)==PARTITION_FAT32_XINT13)) || ((PartitionType & PARTITION_NTFT) && ((PartitionType & ~0xC0)==PARTITION_XINT13)) || ((PartitionType)==PARTITION_FAT_12) || ((PartitionType)==PARTITION_FAT_16) || ((PartitionType)==PARTITION_IFS) || ((PartitionType)==PARTITION_HUGE) || ((PartitionType)==PARTITION_FAT32) || ((PartitionType)==PARTITION_FAT32_XINT13) || ((PartitionType)==PARTITION_XINT13))
522 #define IsContainerPartition(PartitionType) ((PartitionType==PARTITION_EXTENDED) || (PartitionType==PARTITION_XINT13_EXTENDED))
523 #define IsFTPartition(PartitionType) (((PartitionType)&PARTITION_NTFT) && IsRecognizedPartition(PartitionType))
524 
525 typedef enum _MEDIA_TYPE {
526   Unknown,F5_1Pt2_512,F3_1Pt44_512,F3_2Pt88_512,F3_20Pt8_512,F3_720_512,F5_360_512,F5_320_512,F5_320_1024,F5_180_512,F5_160_512,
527   RemovableMedia,FixedMedia,F3_120M_512,F3_640_512,F5_640_512,F5_720_512,F3_1Pt2_512,F3_1Pt23_1024,F5_1Pt23_1024,F3_128Mb_512,
528   F3_230Mb_512,F8_256_128,F3_200Mb_512,F3_240M_512,F3_32M_512
529 } MEDIA_TYPE,*PMEDIA_TYPE;
530 
531 typedef struct _FORMAT_PARAMETERS {
532   MEDIA_TYPE MediaType;
533   DWORD StartCylinderNumber;
534   DWORD EndCylinderNumber;
535   DWORD StartHeadNumber;
536   DWORD EndHeadNumber;
537 } FORMAT_PARAMETERS,*PFORMAT_PARAMETERS;
538 
539 typedef WORD BAD_TRACK_NUMBER;
540 typedef WORD *PBAD_TRACK_NUMBER;
541 
542 typedef struct _FORMAT_EX_PARAMETERS {
543   MEDIA_TYPE MediaType;
544   DWORD StartCylinderNumber;
545   DWORD EndCylinderNumber;
546   DWORD StartHeadNumber;
547   DWORD EndHeadNumber;
548   WORD FormatGapLength;
549   WORD SectorsPerTrack;
550   WORD SectorNumber[1];
551 } FORMAT_EX_PARAMETERS,*PFORMAT_EX_PARAMETERS;
552 
553 typedef struct _DISK_GEOMETRY {
554   LARGE_INTEGER Cylinders;
555   MEDIA_TYPE MediaType;
556   DWORD TracksPerCylinder;
557   DWORD SectorsPerTrack;
558   DWORD BytesPerSector;
559 } DISK_GEOMETRY,*PDISK_GEOMETRY;
560 
561 #define WMI_DISK_GEOMETRY_GUID { 0x25007f51,0x57c2,0x11d1,{ 0xa5,0x28,0x0,0xa0,0xc9,0x6,0x29,0x10 } }
562 
563 typedef struct _PARTITION_INFORMATION {
564   LARGE_INTEGER StartingOffset;
565   LARGE_INTEGER PartitionLength;
566   DWORD HiddenSectors;
567   DWORD PartitionNumber;
568   BYTE PartitionType;
569   BOOLEAN BootIndicator;
570   BOOLEAN RecognizedPartition;
571   BOOLEAN RewritePartition;
572 } PARTITION_INFORMATION,*PPARTITION_INFORMATION;
573 
574 typedef struct _SET_PARTITION_INFORMATION {
575   BYTE PartitionType;
576 } SET_PARTITION_INFORMATION,*PSET_PARTITION_INFORMATION;
577 
578 typedef struct _DRIVE_LAYOUT_INFORMATION {
579   DWORD PartitionCount;
580   DWORD Signature;
581   PARTITION_INFORMATION PartitionEntry[1];
582 } DRIVE_LAYOUT_INFORMATION,*PDRIVE_LAYOUT_INFORMATION;
583 
584 typedef struct _VERIFY_INFORMATION {
585   LARGE_INTEGER StartingOffset;
586   DWORD Length;
587 } VERIFY_INFORMATION,*PVERIFY_INFORMATION;
588 
589 typedef struct _REASSIGN_BLOCKS {
590   WORD Reserved;
591   WORD Count;
592   DWORD BlockNumber[1];
593 } REASSIGN_BLOCKS,*PREASSIGN_BLOCKS;
594 
595 #include <pshpack1.h>
596 typedef struct _REASSIGN_BLOCKS_EX {
597   WORD Reserved;
598   WORD Count;
599   LARGE_INTEGER BlockNumber[1];
600 } REASSIGN_BLOCKS_EX,*PREASSIGN_BLOCKS_EX;
601 #include <poppack.h>
602 
603 typedef enum _PARTITION_STYLE {
604   PARTITION_STYLE_MBR,PARTITION_STYLE_GPT,PARTITION_STYLE_RAW
605 } PARTITION_STYLE;
606 
607 typedef struct _PARTITION_INFORMATION_GPT {
608   GUID PartitionType;
609   GUID PartitionId;
610   DWORD64 Attributes;
611   WCHAR Name [36];
612 } PARTITION_INFORMATION_GPT,*PPARTITION_INFORMATION_GPT;
613 
614 #define GPT_ATTRIBUTE_PLATFORM_REQUIRED (0x0000000000000001)
615 
616 #define GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER (0x8000000000000000)
617 #define GPT_BASIC_DATA_ATTRIBUTE_HIDDEN (0x4000000000000000)
618 #define GPT_BASIC_DATA_ATTRIBUTE_SHADOW_COPY (0x2000000000000000)
619 #define GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY (0x1000000000000000)
620 
621 typedef struct _PARTITION_INFORMATION_MBR {
622   BYTE PartitionType;
623   BOOLEAN BootIndicator;
624   BOOLEAN RecognizedPartition;
625   DWORD HiddenSectors;
626 } PARTITION_INFORMATION_MBR,*PPARTITION_INFORMATION_MBR;
627 
628 typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
629 typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
630 
631 typedef struct _SET_PARTITION_INFORMATION_EX {
632   PARTITION_STYLE PartitionStyle;
633   __C89_NAMELESS union {
634     SET_PARTITION_INFORMATION_MBR Mbr;
635     SET_PARTITION_INFORMATION_GPT Gpt;
636   } DUMMYUNIONNAME;
637 } SET_PARTITION_INFORMATION_EX,*PSET_PARTITION_INFORMATION_EX;
638 
639 typedef struct _CREATE_DISK_GPT {
640   GUID DiskId;
641   DWORD MaxPartitionCount;
642 } CREATE_DISK_GPT,*PCREATE_DISK_GPT;
643 
644 typedef struct _CREATE_DISK_MBR {
645   DWORD Signature;
646 } CREATE_DISK_MBR,*PCREATE_DISK_MBR;
647 
648 typedef struct _CREATE_DISK {
649   PARTITION_STYLE PartitionStyle;
650   __C89_NAMELESS union {
651     CREATE_DISK_MBR Mbr;
652     CREATE_DISK_GPT Gpt;
653   } DUMMYUNIONNAME;
654 } CREATE_DISK,*PCREATE_DISK;
655 
656 typedef struct _GET_LENGTH_INFORMATION {
657   LARGE_INTEGER Length;
658 } GET_LENGTH_INFORMATION,*PGET_LENGTH_INFORMATION;
659 
660 typedef struct _PARTITION_INFORMATION_EX {
661   PARTITION_STYLE PartitionStyle;
662   LARGE_INTEGER StartingOffset;
663   LARGE_INTEGER PartitionLength;
664   DWORD PartitionNumber;
665   BOOLEAN RewritePartition;
666   __C89_NAMELESS union {
667     PARTITION_INFORMATION_MBR Mbr;
668     PARTITION_INFORMATION_GPT Gpt;
669   } DUMMYUNIONNAME;
670 } PARTITION_INFORMATION_EX,*PPARTITION_INFORMATION_EX;
671 
672 typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
673   GUID DiskId;
674   LARGE_INTEGER StartingUsableOffset;
675   LARGE_INTEGER UsableLength;
676   DWORD MaxPartitionCount;
677 } DRIVE_LAYOUT_INFORMATION_GPT,*PDRIVE_LAYOUT_INFORMATION_GPT;
678 
679 typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
680   DWORD Signature;
681 } DRIVE_LAYOUT_INFORMATION_MBR,*PDRIVE_LAYOUT_INFORMATION_MBR;
682 
683 typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
684   DWORD PartitionStyle;
685   DWORD PartitionCount;
686   __C89_NAMELESS union {
687     DRIVE_LAYOUT_INFORMATION_MBR Mbr;
688     DRIVE_LAYOUT_INFORMATION_GPT Gpt;
689   } DUMMYUNIONNAME;
690   PARTITION_INFORMATION_EX PartitionEntry[1];
691 } DRIVE_LAYOUT_INFORMATION_EX,*PDRIVE_LAYOUT_INFORMATION_EX;
692 
693 typedef enum _DETECTION_TYPE {
694   DetectNone,DetectInt13,DetectExInt13
695 } DETECTION_TYPE;
696 
697 typedef struct _DISK_INT13_INFO {
698   WORD DriveSelect;
699   DWORD MaxCylinders;
700   WORD SectorsPerTrack;
701   WORD MaxHeads;
702   WORD NumberDrives;
703 } DISK_INT13_INFO,*PDISK_INT13_INFO;
704 
705 typedef struct _DISK_EX_INT13_INFO {
706   WORD ExBufferSize;
707   WORD ExFlags;
708   DWORD ExCylinders;
709   DWORD ExHeads;
710   DWORD ExSectorsPerTrack;
711   DWORD64 ExSectorsPerDrive;
712   WORD ExSectorSize;
713   WORD ExReserved;
714 } DISK_EX_INT13_INFO,*PDISK_EX_INT13_INFO;
715 
716 typedef struct _DISK_DETECTION_INFO {
717   DWORD SizeOfDetectInfo;
718   DETECTION_TYPE DetectionType;
719   __C89_NAMELESS union {
720     __C89_NAMELESS struct {
721       DISK_INT13_INFO Int13;
722       DISK_EX_INT13_INFO ExInt13;
723     } DUMMYSTRUCTNAME;
724   } DUMMYUNIONNAME;
725 } DISK_DETECTION_INFO,*PDISK_DETECTION_INFO;
726 
727 typedef struct _DISK_PARTITION_INFO {
728   DWORD SizeOfPartitionInfo;
729   PARTITION_STYLE PartitionStyle;
730   __C89_NAMELESS union {
731     struct {
732       DWORD Signature;
733       DWORD CheckSum;
734     } Mbr;
735     struct {
736       GUID DiskId;
737     } Gpt;
738   } DUMMYUNIONNAME;
739 } DISK_PARTITION_INFO,*PDISK_PARTITION_INFO;
740 
741 #define DiskGeometryGetPartition(Geometry) ((PDISK_PARTITION_INFO)((Geometry)->Data))
742 #define DiskGeometryGetDetect(Geometry) ((PDISK_DETECTION_INFO)(((DWORD_PTR)DiskGeometryGetPartition(Geometry)+ DiskGeometryGetPartition(Geometry)->SizeOfPartitionInfo)))
743 
744 typedef struct _DISK_GEOMETRY_EX {
745   DISK_GEOMETRY Geometry;
746   LARGE_INTEGER DiskSize;
747   BYTE Data[1];
748 } DISK_GEOMETRY_EX,*PDISK_GEOMETRY_EX;
749 
750 typedef struct _DISK_CONTROLLER_NUMBER {
751   DWORD ControllerNumber;
752   DWORD DiskNumber;
753 } DISK_CONTROLLER_NUMBER,*PDISK_CONTROLLER_NUMBER;
754 
755 typedef enum {
756   EqualPriority,KeepPrefetchedData,KeepReadData
757 } DISK_CACHE_RETENTION_PRIORITY;
758 
759 typedef struct _DISK_CACHE_INFORMATION {
760   BOOLEAN ParametersSavable;
761   BOOLEAN ReadCacheEnabled;
762   BOOLEAN WriteCacheEnabled;
763   DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
764   DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;
765   WORD DisablePrefetchTransferLength;
766   BOOLEAN PrefetchScalar;
767   __C89_NAMELESS union {
768     struct {
769       WORD Minimum;
770       WORD Maximum;
771       WORD MaximumBlocks;
772     } ScalarPrefetch;
773     struct {
774       WORD Minimum;
775       WORD Maximum;
776     } BlockPrefetch;
777   } DUMMYUNIONNAME;
778 } DISK_CACHE_INFORMATION,*PDISK_CACHE_INFORMATION;
779 
780 typedef struct _DISK_GROW_PARTITION {
781   DWORD PartitionNumber;
782   LARGE_INTEGER BytesToGrow;
783 } DISK_GROW_PARTITION,*PDISK_GROW_PARTITION;
784 
785 #define HIST_NO_OF_BUCKETS 24
786 
787 typedef struct _HISTOGRAM_BUCKET {
788   DWORD Reads;
789   DWORD Writes;
790 } HISTOGRAM_BUCKET,*PHISTOGRAM_BUCKET;
791 
792 #define HISTOGRAM_BUCKET_SIZE sizeof(HISTOGRAM_BUCKET)
793 
794 typedef struct _DISK_HISTOGRAM {
795   LARGE_INTEGER DiskSize;
796   LARGE_INTEGER Start;
797   LARGE_INTEGER End;
798   LARGE_INTEGER Average;
799   LARGE_INTEGER AverageRead;
800   LARGE_INTEGER AverageWrite;
801   DWORD Granularity;
802   DWORD Size;
803   DWORD ReadCount;
804   DWORD WriteCount;
805   PHISTOGRAM_BUCKET Histogram;
806 } DISK_HISTOGRAM,*PDISK_HISTOGRAM;
807 
808 #define DISK_HISTOGRAM_SIZE sizeof(DISK_HISTOGRAM)
809 
810 typedef struct _DISK_PERFORMANCE {
811   LARGE_INTEGER BytesRead;
812   LARGE_INTEGER BytesWritten;
813   LARGE_INTEGER ReadTime;
814   LARGE_INTEGER WriteTime;
815   LARGE_INTEGER IdleTime;
816   DWORD ReadCount;
817   DWORD WriteCount;
818   DWORD QueueDepth;
819   DWORD SplitCount;
820   LARGE_INTEGER QueryTime;
821   DWORD StorageDeviceNumber;
822   WCHAR StorageManagerName[8];
823 } DISK_PERFORMANCE,*PDISK_PERFORMANCE;
824 
825 typedef struct _DISK_RECORD {
826   LARGE_INTEGER ByteOffset;
827   LARGE_INTEGER StartTime;
828   LARGE_INTEGER EndTime;
829   PVOID VirtualAddress;
830   DWORD NumberOfBytes;
831   BYTE DeviceNumber;
832   BOOLEAN ReadRequest;
833 } DISK_RECORD,*PDISK_RECORD;
834 
835 typedef struct _DISK_LOGGING {
836   BYTE Function;
837   PVOID BufferAddress;
838   DWORD BufferSize;
839 } DISK_LOGGING,*PDISK_LOGGING;
840 
841 #define DISK_LOGGING_START 0
842 #define DISK_LOGGING_STOP 1
843 #define DISK_LOGGING_DUMP 2
844 #define DISK_BINNING 3
845 
846 typedef enum _BIN_TYPES {
847   RequestSize,RequestLocation
848 } BIN_TYPES;
849 
850 typedef struct _BIN_RANGE {
851   LARGE_INTEGER StartValue;
852   LARGE_INTEGER Length;
853 } BIN_RANGE,*PBIN_RANGE;
854 
855 typedef struct _PERF_BIN {
856   DWORD NumberOfBins;
857   DWORD TypeOfBin;
858   BIN_RANGE BinsRanges[1];
859 } PERF_BIN,*PPERF_BIN;
860 
861 typedef struct _BIN_COUNT {
862   BIN_RANGE BinRange;
863   DWORD BinCount;
864 } BIN_COUNT,*PBIN_COUNT;
865 
866 typedef struct _BIN_RESULTS {
867   DWORD NumberOfBins;
868   BIN_COUNT BinCounts[1];
869 } BIN_RESULTS,*PBIN_RESULTS;
870 
871 #include <pshpack1.h>
872 typedef struct _GETVERSIONINPARAMS {
873   BYTE bVersion;
874   BYTE bRevision;
875   BYTE bReserved;
876   BYTE bIDEDeviceMap;
877   DWORD fCapabilities;
878   DWORD dwReserved[4];
879 } GETVERSIONINPARAMS,*PGETVERSIONINPARAMS,*LPGETVERSIONINPARAMS;
880 #include <poppack.h>
881 
882 #define CAP_ATA_ID_CMD 1
883 #define CAP_ATAPI_ID_CMD 2
884 #define CAP_SMART_CMD 4
885 
886 #include <pshpack1.h>
887 typedef struct _IDEREGS {
888   BYTE bFeaturesReg;
889   BYTE bSectorCountReg;
890   BYTE bSectorNumberReg;
891   BYTE bCylLowReg;
892   BYTE bCylHighReg;
893   BYTE bDriveHeadReg;
894   BYTE bCommandReg;
895   BYTE bReserved;
896 } IDEREGS,*PIDEREGS,*LPIDEREGS;
897 #include <poppack.h>
898 
899 #define ATAPI_ID_CMD 0xA1
900 #define ID_CMD 0xEC
901 #define SMART_CMD 0xB0
902 
903 #define SMART_CYL_LOW 0x4F
904 #define SMART_CYL_HI 0xC2
905 
906 #include <pshpack1.h>
907 typedef struct _SENDCMDINPARAMS {
908   DWORD cBufferSize;
909   IDEREGS irDriveRegs;
910   BYTE bDriveNumber;
911   BYTE bReserved[3];
912   DWORD dwReserved[4];
913   BYTE bBuffer[1];
914 } SENDCMDINPARAMS,*PSENDCMDINPARAMS,*LPSENDCMDINPARAMS;
915 #include <poppack.h>
916 
917 #include <pshpack1.h>
918 typedef struct _DRIVERSTATUS {
919   BYTE bDriverError;
920   BYTE bIDEError;
921   BYTE bReserved[2];
922   DWORD dwReserved[2];
923 } DRIVERSTATUS,*PDRIVERSTATUS,*LPDRIVERSTATUS;
924 #include <poppack.h>
925 
926 #define SMART_NO_ERROR 0
927 #define SMART_IDE_ERROR 1
928 #define SMART_INVALID_FLAG 2
929 #define SMART_INVALID_COMMAND 3
930 #define SMART_INVALID_BUFFER 4
931 #define SMART_INVALID_DRIVE 5
932 #define SMART_INVALID_IOCTL 6
933 #define SMART_ERROR_NO_MEM 7
934 #define SMART_INVALID_REGISTER 8
935 #define SMART_NOT_SUPPORTED 9
936 #define SMART_NO_IDE_DEVICE 10
937 
938 #define SMART_OFFLINE_ROUTINE_OFFLINE 0
939 #define SMART_SHORT_SELFTEST_OFFLINE 1
940 #define SMART_EXTENDED_SELFTEST_OFFLINE 2
941 #define SMART_ABORT_OFFLINE_SELFTEST 127
942 #define SMART_SHORT_SELFTEST_CAPTIVE 129
943 #define SMART_EXTENDED_SELFTEST_CAPTIVE 130
944 
945 #include <pshpack1.h>
946 typedef struct _SENDCMDOUTPARAMS {
947   DWORD cBufferSize;
948   DRIVERSTATUS DriverStatus;
949   BYTE bBuffer[1];
950 } SENDCMDOUTPARAMS,*PSENDCMDOUTPARAMS,*LPSENDCMDOUTPARAMS;
951 #include <poppack.h>
952 
953 #define READ_ATTRIBUTE_BUFFER_SIZE 512
954 #define IDENTIFY_BUFFER_SIZE 512
955 #define READ_THRESHOLD_BUFFER_SIZE 512
956 #define SMART_LOG_SECTOR_SIZE 512
957 
958 #define READ_ATTRIBUTES 0xD0
959 #define READ_THRESHOLDS 0xD1
960 #define ENABLE_DISABLE_AUTOSAVE 0xD2
961 #define SAVE_ATTRIBUTE_VALUES 0xD3
962 #define EXECUTE_OFFLINE_DIAGS 0xD4
963 #define SMART_READ_LOG 0xD5
964 #define SMART_WRITE_LOG 0xd6
965 #define ENABLE_SMART 0xD8
966 #define DISABLE_SMART 0xD9
967 #define RETURN_SMART_STATUS 0xDA
968 #define ENABLE_DISABLE_AUTO_OFFLINE 0xDB
969 
970 #endif /* _NTDDDISK_H_ */
971 
972 
973 #define IOCTL_CHANGER_BASE FILE_DEVICE_CHANGER
974 #define IOCTL_CHANGER_GET_PARAMETERS CTL_CODE(IOCTL_CHANGER_BASE,0x0000,METHOD_BUFFERED,FILE_READ_ACCESS)
975 #define IOCTL_CHANGER_GET_STATUS CTL_CODE(IOCTL_CHANGER_BASE,0x0001,METHOD_BUFFERED,FILE_READ_ACCESS)
976 #define IOCTL_CHANGER_GET_PRODUCT_DATA CTL_CODE(IOCTL_CHANGER_BASE,0x0002,METHOD_BUFFERED,FILE_READ_ACCESS)
977 #define IOCTL_CHANGER_SET_ACCESS CTL_CODE(IOCTL_CHANGER_BASE,0x0004,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
978 #define IOCTL_CHANGER_GET_ELEMENT_STATUS CTL_CODE(IOCTL_CHANGER_BASE,0x0005,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
979 #define IOCTL_CHANGER_INITIALIZE_ELEMENT_STATUS CTL_CODE(IOCTL_CHANGER_BASE,0x0006,METHOD_BUFFERED,FILE_READ_ACCESS)
980 #define IOCTL_CHANGER_SET_POSITION CTL_CODE(IOCTL_CHANGER_BASE,0x0007,METHOD_BUFFERED,FILE_READ_ACCESS)
981 #define IOCTL_CHANGER_EXCHANGE_MEDIUM CTL_CODE(IOCTL_CHANGER_BASE,0x0008,METHOD_BUFFERED,FILE_READ_ACCESS)
982 #define IOCTL_CHANGER_MOVE_MEDIUM CTL_CODE(IOCTL_CHANGER_BASE,0x0009,METHOD_BUFFERED,FILE_READ_ACCESS)
983 #define IOCTL_CHANGER_REINITIALIZE_TRANSPORT CTL_CODE(IOCTL_CHANGER_BASE,0x000A,METHOD_BUFFERED,FILE_READ_ACCESS)
984 #define IOCTL_CHANGER_QUERY_VOLUME_TAGS CTL_CODE(IOCTL_CHANGER_BASE,0x000B,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
985 
986 #define MAX_VOLUME_ID_SIZE 36
987 #define MAX_VOLUME_TEMPLATE_SIZE 40
988 
989 #define VENDOR_ID_LENGTH 8
990 #define PRODUCT_ID_LENGTH 16
991 #define REVISION_LENGTH 4
992 #define SERIAL_NUMBER_LENGTH 32
993 
994 typedef enum _ELEMENT_TYPE {
995   AllElements,ChangerTransport,ChangerSlot,ChangerIEPort,ChangerDrive,ChangerDoor,ChangerKeypad,ChangerMaxElement
996 } ELEMENT_TYPE,*PELEMENT_TYPE;
997 
998 typedef struct _CHANGER_ELEMENT {
999   ELEMENT_TYPE ElementType;
1000   DWORD ElementAddress;
1001 } CHANGER_ELEMENT,*PCHANGER_ELEMENT;
1002 
1003 typedef struct _CHANGER_ELEMENT_LIST {
1004   CHANGER_ELEMENT Element;
1005   DWORD NumberOfElements;
1006 } CHANGER_ELEMENT_LIST ,*PCHANGER_ELEMENT_LIST;
1007 
1008 #define CHANGER_BAR_CODE_SCANNER_INSTALLED 0x00000001
1009 #define CHANGER_INIT_ELEM_STAT_WITH_RANGE 0x00000002
1010 #define CHANGER_CLOSE_IEPORT 0x00000004
1011 #define CHANGER_OPEN_IEPORT 0x00000008
1012 
1013 #define CHANGER_STATUS_NON_VOLATILE 0x00000010
1014 #define CHANGER_EXCHANGE_MEDIA 0x00000020
1015 #define CHANGER_CLEANER_SLOT 0x00000040
1016 #define CHANGER_LOCK_UNLOCK 0x00000080
1017 
1018 #define CHANGER_CARTRIDGE_MAGAZINE 0x00000100
1019 #define CHANGER_MEDIUM_FLIP 0x00000200
1020 #define CHANGER_POSITION_TO_ELEMENT 0x00000400
1021 #define CHANGER_REPORT_IEPORT_STATE 0x00000800
1022 
1023 #define CHANGER_STORAGE_DRIVE 0x00001000
1024 #define CHANGER_STORAGE_IEPORT 0x00002000
1025 #define CHANGER_STORAGE_SLOT 0x00004000
1026 #define CHANGER_STORAGE_TRANSPORT 0x00008000
1027 
1028 #define CHANGER_DRIVE_CLEANING_REQUIRED 0x00010000
1029 
1030 #define CHANGER_PREDISMOUNT_EJECT_REQUIRED 0x00020000
1031 
1032 #define CHANGER_CLEANER_ACCESS_NOT_VALID 0x00040000
1033 #define CHANGER_PREMOUNT_EJECT_REQUIRED 0x00080000
1034 
1035 #define CHANGER_VOLUME_IDENTIFICATION 0x00100000
1036 #define CHANGER_VOLUME_SEARCH 0x00200000
1037 #define CHANGER_VOLUME_ASSERT 0x00400000
1038 #define CHANGER_VOLUME_REPLACE 0x00800000
1039 #define CHANGER_VOLUME_UNDEFINE 0x01000000
1040 
1041 #define CHANGER_SERIAL_NUMBER_VALID 0x04000000
1042 
1043 #define CHANGER_DEVICE_REINITIALIZE_CAPABLE 0x08000000
1044 #define CHANGER_KEYPAD_ENABLE_DISABLE 0x10000000
1045 #define CHANGER_DRIVE_EMPTY_ON_DOOR_ACCESS 0x20000000
1046 
1047 #define CHANGER_RESERVED_BIT 0x80000000
1048 
1049 #define CHANGER_PREDISMOUNT_ALIGN_TO_SLOT 0x80000001
1050 #define CHANGER_PREDISMOUNT_ALIGN_TO_DRIVE 0x80000002
1051 #define CHANGER_CLEANER_AUTODISMOUNT 0x80000004
1052 #define CHANGER_TRUE_EXCHANGE_CAPABLE 0x80000008
1053 #define CHANGER_SLOTS_USE_TRAYS 0x80000010
1054 #define CHANGER_RTN_MEDIA_TO_ORIGINAL_ADDR 0x80000020
1055 #define CHANGER_CLEANER_OPS_NOT_SUPPORTED 0x80000040
1056 #define CHANGER_IEPORT_USER_CONTROL_OPEN 0x80000080
1057 #define CHANGER_IEPORT_USER_CONTROL_CLOSE 0x80000100
1058 #define CHANGER_MOVE_EXTENDS_IEPORT 0x80000200
1059 #define CHANGER_MOVE_RETRACTS_IEPORT 0x80000400
1060 
1061 #define CHANGER_TO_TRANSPORT 0x01
1062 #define CHANGER_TO_SLOT 0x02
1063 #define CHANGER_TO_IEPORT 0x04
1064 #define CHANGER_TO_DRIVE 0x08
1065 
1066 #define LOCK_UNLOCK_IEPORT 0x01
1067 #define LOCK_UNLOCK_DOOR 0x02
1068 #define LOCK_UNLOCK_KEYPAD 0x04
1069 
1070 typedef struct _GET_CHANGER_PARAMETERS {
1071   DWORD Size;
1072   WORD NumberTransportElements;
1073   WORD NumberStorageElements;
1074   WORD NumberCleanerSlots;
1075   WORD NumberIEElements;
1076   WORD NumberDataTransferElements;
1077   WORD NumberOfDoors;
1078   WORD FirstSlotNumber;
1079   WORD FirstDriveNumber;
1080   WORD FirstTransportNumber;
1081   WORD FirstIEPortNumber;
1082   WORD FirstCleanerSlotAddress;
1083   WORD MagazineSize;
1084   DWORD DriveCleanTimeout;
1085   DWORD Features0;
1086   DWORD Features1;
1087   BYTE MoveFromTransport;
1088   BYTE MoveFromSlot;
1089   BYTE MoveFromIePort;
1090   BYTE MoveFromDrive;
1091   BYTE ExchangeFromTransport;
1092   BYTE ExchangeFromSlot;
1093   BYTE ExchangeFromIePort;
1094   BYTE ExchangeFromDrive;
1095   BYTE LockUnlockCapabilities;
1096   BYTE PositionCapabilities;
1097   BYTE Reserved1[2];
1098   DWORD Reserved2[2];
1099 } GET_CHANGER_PARAMETERS,*PGET_CHANGER_PARAMETERS;
1100 
1101 typedef struct _CHANGER_PRODUCT_DATA {
1102   BYTE VendorId[VENDOR_ID_LENGTH];
1103   BYTE ProductId[PRODUCT_ID_LENGTH];
1104   BYTE Revision[REVISION_LENGTH];
1105   BYTE SerialNumber[SERIAL_NUMBER_LENGTH];
1106   BYTE DeviceType;
1107 } CHANGER_PRODUCT_DATA,*PCHANGER_PRODUCT_DATA;
1108 
1109 #define LOCK_ELEMENT 0
1110 #define UNLOCK_ELEMENT 1
1111 #define EXTEND_IEPORT 2
1112 #define RETRACT_IEPORT 3
1113 
1114 typedef struct _CHANGER_SET_ACCESS {
1115   CHANGER_ELEMENT Element;
1116   DWORD Control;
1117 } CHANGER_SET_ACCESS,*PCHANGER_SET_ACCESS;
1118 
1119 typedef struct _CHANGER_READ_ELEMENT_STATUS {
1120   CHANGER_ELEMENT_LIST ElementList;
1121   BOOLEAN VolumeTagInfo;
1122 } CHANGER_READ_ELEMENT_STATUS,*PCHANGER_READ_ELEMENT_STATUS;
1123 
1124 typedef struct _CHANGER_ELEMENT_STATUS {
1125   CHANGER_ELEMENT Element;
1126   CHANGER_ELEMENT SrcElementAddress;
1127   DWORD Flags;
1128   DWORD ExceptionCode;
1129   BYTE TargetId;
1130   BYTE Lun;
1131   WORD Reserved;
1132   BYTE PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
1133   BYTE AlternateVolumeID[MAX_VOLUME_ID_SIZE];
1134 } CHANGER_ELEMENT_STATUS,*PCHANGER_ELEMENT_STATUS;
1135 
1136 typedef struct _CHANGER_ELEMENT_STATUS_EX {
1137   CHANGER_ELEMENT Element;
1138   CHANGER_ELEMENT SrcElementAddress;
1139   DWORD Flags;
1140   DWORD ExceptionCode;
1141   BYTE TargetId;
1142   BYTE Lun;
1143   WORD Reserved;
1144   BYTE PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
1145   BYTE AlternateVolumeID[MAX_VOLUME_ID_SIZE];
1146   BYTE VendorIdentification[VENDOR_ID_LENGTH];
1147   BYTE ProductIdentification[PRODUCT_ID_LENGTH];
1148   BYTE SerialNumber[SERIAL_NUMBER_LENGTH];
1149 } CHANGER_ELEMENT_STATUS_EX,*PCHANGER_ELEMENT_STATUS_EX;
1150 
1151 #define ELEMENT_STATUS_FULL 0x00000001
1152 #define ELEMENT_STATUS_IMPEXP 0x00000002
1153 #define ELEMENT_STATUS_EXCEPT 0x00000004
1154 #define ELEMENT_STATUS_ACCESS 0x00000008
1155 #define ELEMENT_STATUS_EXENAB 0x00000010
1156 #define ELEMENT_STATUS_INENAB 0x00000020
1157 
1158 #define ELEMENT_STATUS_PRODUCT_DATA 0x00000040
1159 
1160 #define ELEMENT_STATUS_LUN_VALID 0x00001000
1161 #define ELEMENT_STATUS_ID_VALID 0x00002000
1162 #define ELEMENT_STATUS_NOT_BUS 0x00008000
1163 #define ELEMENT_STATUS_INVERT 0x00400000
1164 #define ELEMENT_STATUS_SVALID 0x00800000
1165 
1166 #define ELEMENT_STATUS_PVOLTAG 0x10000000
1167 #define ELEMENT_STATUS_AVOLTAG 0x20000000
1168 
1169 #define ERROR_LABEL_UNREADABLE 0x00000001
1170 #define ERROR_LABEL_QUESTIONABLE 0x00000002
1171 #define ERROR_SLOT_NOT_PRESENT 0x00000004
1172 #define ERROR_DRIVE_NOT_INSTALLED 0x00000008
1173 #define ERROR_TRAY_MALFUNCTION 0x00000010
1174 #define ERROR_INIT_STATUS_NEEDED 0x00000011
1175 #define ERROR_UNHANDLED_ERROR 0xFFFFFFFF
1176 
1177 typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS {
1178   CHANGER_ELEMENT_LIST ElementList;
1179   BOOLEAN BarCodeScan;
1180 } CHANGER_INITIALIZE_ELEMENT_STATUS,*PCHANGER_INITIALIZE_ELEMENT_STATUS;
1181 
1182 typedef struct _CHANGER_SET_POSITION {
1183   CHANGER_ELEMENT Transport;
1184   CHANGER_ELEMENT Destination;
1185   BOOLEAN Flip;
1186 } CHANGER_SET_POSITION,*PCHANGER_SET_POSITION;
1187 
1188 typedef struct _CHANGER_EXCHANGE_MEDIUM {
1189   CHANGER_ELEMENT Transport;
1190   CHANGER_ELEMENT Source;
1191   CHANGER_ELEMENT Destination1;
1192   CHANGER_ELEMENT Destination2;
1193   BOOLEAN Flip1;
1194   BOOLEAN Flip2;
1195 } CHANGER_EXCHANGE_MEDIUM,*PCHANGER_EXCHANGE_MEDIUM;
1196 
1197 typedef struct _CHANGER_MOVE_MEDIUM {
1198   CHANGER_ELEMENT Transport;
1199   CHANGER_ELEMENT Source;
1200   CHANGER_ELEMENT Destination;
1201   BOOLEAN Flip;
1202 } CHANGER_MOVE_MEDIUM,*PCHANGER_MOVE_MEDIUM;
1203 
1204 typedef struct _CHANGER_SEND_VOLUME_TAG_INFORMATION {
1205   CHANGER_ELEMENT StartingElement;
1206   DWORD ActionCode;
1207   BYTE VolumeIDTemplate[MAX_VOLUME_TEMPLATE_SIZE];
1208 } CHANGER_SEND_VOLUME_TAG_INFORMATION,*PCHANGER_SEND_VOLUME_TAG_INFORMATION;
1209 
1210 typedef struct _READ_ELEMENT_ADDRESS_INFO {
1211   DWORD NumberOfElements;
1212   CHANGER_ELEMENT_STATUS ElementStatus[1];
1213 } READ_ELEMENT_ADDRESS_INFO,*PREAD_ELEMENT_ADDRESS_INFO;
1214 
1215 #define SEARCH_ALL 0x0
1216 #define SEARCH_PRIMARY 0x1
1217 #define SEARCH_ALTERNATE 0x2
1218 #define SEARCH_ALL_NO_SEQ 0x4
1219 #define SEARCH_PRI_NO_SEQ 0x5
1220 #define SEARCH_ALT_NO_SEQ 0x6
1221 
1222 #define ASSERT_PRIMARY 0x8
1223 #define ASSERT_ALTERNATE 0x9
1224 
1225 #define REPLACE_PRIMARY 0xA
1226 #define REPLACE_ALTERNATE 0xB
1227 
1228 #define UNDEFINE_PRIMARY 0xC
1229 #define UNDEFINE_ALTERNATE 0xD
1230 
1231 typedef enum _CHANGER_DEVICE_PROBLEM_TYPE {
1232   DeviceProblemNone,DeviceProblemHardware,DeviceProblemCHMError,DeviceProblemDoorOpen,DeviceProblemCalibrationError,DeviceProblemTargetFailure,
1233   DeviceProblemCHMMoveError,DeviceProblemCHMZeroError,DeviceProblemCartridgeInsertError,DeviceProblemPositionError,DeviceProblemSensorError,
1234   DeviceProblemCartridgeEjectError,DeviceProblemGripperError,DeviceProblemDriveError
1235 } CHANGER_DEVICE_PROBLEM_TYPE,*PCHANGER_DEVICE_PROBLEM_TYPE;
1236 
1237 #define IOCTL_SERIAL_LSRMST_INSERT CTL_CODE(FILE_DEVICE_SERIAL_PORT,31,METHOD_BUFFERED,FILE_ANY_ACCESS)
1238 
1239 #define IOCTL_SERENUM_EXPOSE_HARDWARE CTL_CODE(FILE_DEVICE_SERENUM,128,METHOD_BUFFERED,FILE_ANY_ACCESS)
1240 #define IOCTL_SERENUM_REMOVE_HARDWARE CTL_CODE(FILE_DEVICE_SERENUM,129,METHOD_BUFFERED,FILE_ANY_ACCESS)
1241 #define IOCTL_SERENUM_PORT_DESC CTL_CODE(FILE_DEVICE_SERENUM,130,METHOD_BUFFERED,FILE_ANY_ACCESS)
1242 #define IOCTL_SERENUM_GET_PORT_NAME CTL_CODE(FILE_DEVICE_SERENUM,131,METHOD_BUFFERED,FILE_ANY_ACCESS)
1243 
1244 #define SERIAL_LSRMST_ESCAPE ((BYTE)0x00)
1245 
1246 #define SERIAL_LSRMST_LSR_DATA ((BYTE)0x01)
1247 
1248 #define SERIAL_LSRMST_LSR_NODATA ((BYTE)0x02)
1249 
1250 #define SERIAL_LSRMST_MST ((BYTE)0x03)
1251 
1252 #define SERIAL_IOC_FCR_FIFO_ENABLE ((DWORD)0x00000001)
1253 #define SERIAL_IOC_FCR_RCVR_RESET ((DWORD)0x00000002)
1254 #define SERIAL_IOC_FCR_XMIT_RESET ((DWORD)0x00000004)
1255 #define SERIAL_IOC_FCR_DMA_MODE ((DWORD)0x00000008)
1256 #define SERIAL_IOC_FCR_RES1 ((DWORD)0x00000010)
1257 #define SERIAL_IOC_FCR_RES2 ((DWORD)0x00000020)
1258 #define SERIAL_IOC_FCR_RCVR_TRIGGER_LSB ((DWORD)0x00000040)
1259 #define SERIAL_IOC_FCR_RCVR_TRIGGER_MSB ((DWORD)0x00000080)
1260 
1261 #define SERIAL_IOC_MCR_DTR ((DWORD)0x00000001)
1262 #define SERIAL_IOC_MCR_RTS ((DWORD)0x00000002)
1263 #define SERIAL_IOC_MCR_OUT1 ((DWORD)0x00000004)
1264 #define SERIAL_IOC_MCR_OUT2 ((DWORD)0x00000008)
1265 #define SERIAL_IOC_MCR_LOOP ((DWORD)0x00000010)
1266 
1267 #ifndef _FILESYSTEMFSCTL_
1268 #define _FILESYSTEMFSCTL_
1269 
1270 #define FSCTL_REQUEST_OPLOCK_LEVEL_1 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,0,METHOD_BUFFERED,FILE_ANY_ACCESS)
1271 #define FSCTL_REQUEST_OPLOCK_LEVEL_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,1,METHOD_BUFFERED,FILE_ANY_ACCESS)
1272 #define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,2,METHOD_BUFFERED,FILE_ANY_ACCESS)
1273 #define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,3,METHOD_BUFFERED,FILE_ANY_ACCESS)
1274 #define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM,4,METHOD_BUFFERED,FILE_ANY_ACCESS)
1275 #define FSCTL_OPLOCK_BREAK_NOTIFY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,5,METHOD_BUFFERED,FILE_ANY_ACCESS)
1276 #define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,6,METHOD_BUFFERED,FILE_ANY_ACCESS)
1277 #define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,7,METHOD_BUFFERED,FILE_ANY_ACCESS)
1278 #define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,8,METHOD_BUFFERED,FILE_ANY_ACCESS)
1279 
1280 #define FSCTL_IS_VOLUME_MOUNTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,10,METHOD_BUFFERED,FILE_ANY_ACCESS)
1281 #define FSCTL_IS_PATHNAME_VALID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,11,METHOD_BUFFERED,FILE_ANY_ACCESS)
1282 #define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,12,METHOD_BUFFERED,FILE_ANY_ACCESS)
1283 
1284 #define FSCTL_QUERY_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,14,METHOD_NEITHER,FILE_ANY_ACCESS)
1285 #define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,15,METHOD_BUFFERED,FILE_ANY_ACCESS)
1286 #define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,16,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA)
1287 
1288 #define FSCTL_MARK_AS_SYSTEM_HIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,19,METHOD_NEITHER,FILE_ANY_ACCESS)
1289 #define FSCTL_OPLOCK_BREAK_ACK_NO_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,20,METHOD_BUFFERED,FILE_ANY_ACCESS)
1290 #define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,21,METHOD_BUFFERED,FILE_ANY_ACCESS)
1291 #define FSCTL_QUERY_FAT_BPB CTL_CODE(FILE_DEVICE_FILE_SYSTEM,22,METHOD_BUFFERED,FILE_ANY_ACCESS)
1292 #define FSCTL_REQUEST_FILTER_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,23,METHOD_BUFFERED,FILE_ANY_ACCESS)
1293 #define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,24,METHOD_BUFFERED,FILE_ANY_ACCESS)
1294 #define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,25,METHOD_BUFFERED,FILE_ANY_ACCESS)
1295 #define FSCTL_GET_NTFS_FILE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM,26,METHOD_BUFFERED,FILE_ANY_ACCESS)
1296 #define FSCTL_GET_VOLUME_BITMAP CTL_CODE(FILE_DEVICE_FILE_SYSTEM,27,METHOD_NEITHER,FILE_ANY_ACCESS)
1297 #define FSCTL_GET_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM,28,METHOD_NEITHER,FILE_ANY_ACCESS)
1298 #define FSCTL_MOVE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,29,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
1299 #define FSCTL_IS_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM,30,METHOD_BUFFERED,FILE_ANY_ACCESS)
1300 #define FSCTL_ALLOW_EXTENDED_DASD_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,32,METHOD_NEITHER,FILE_ANY_ACCESS)
1301 #define FSCTL_FIND_FILES_BY_SID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,35,METHOD_NEITHER,FILE_ANY_ACCESS)
1302 #define FSCTL_SET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,38,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
1303 #define FSCTL_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,39,METHOD_BUFFERED,FILE_ANY_ACCESS)
1304 #define FSCTL_DELETE_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,40,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
1305 #define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,41,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
1306 #define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,42,METHOD_BUFFERED,FILE_ANY_ACCESS)
1307 #define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,43,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
1308 #define FSCTL_ENUM_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,44,METHOD_NEITHER,FILE_ANY_ACCESS)
1309 #define FSCTL_SECURITY_ID_CHECK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,45,METHOD_NEITHER,FILE_READ_DATA)
1310 #define FSCTL_READ_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,46,METHOD_NEITHER,FILE_ANY_ACCESS)
1311 #define FSCTL_SET_OBJECT_ID_EXTENDED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,47,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
1312 #define FSCTL_CREATE_OR_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM,48,METHOD_BUFFERED,FILE_ANY_ACCESS)
1313 #define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,49,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
1314 #define FSCTL_SET_ZERO_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,50,METHOD_BUFFERED,FILE_WRITE_DATA)
1315 #define FSCTL_QUERY_ALLOCATED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,51,METHOD_NEITHER,FILE_READ_DATA)
1316 #define FSCTL_SET_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,53,METHOD_NEITHER,FILE_ANY_ACCESS)
1317 #define FSCTL_ENCRYPTION_FSCTL_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,54,METHOD_NEITHER,FILE_ANY_ACCESS)
1318 #define FSCTL_WRITE_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,55,METHOD_NEITHER,FILE_SPECIAL_ACCESS)
1319 #define FSCTL_READ_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM,56,METHOD_NEITHER,FILE_SPECIAL_ACCESS)
1320 #define FSCTL_CREATE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,57,METHOD_NEITHER,FILE_ANY_ACCESS)
1321 #define FSCTL_READ_FILE_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,58,METHOD_NEITHER,FILE_ANY_ACCESS)
1322 #define FSCTL_WRITE_USN_CLOSE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM,59,METHOD_NEITHER,FILE_ANY_ACCESS)
1323 #define FSCTL_EXTEND_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS)
1324 #define FSCTL_QUERY_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,61,METHOD_BUFFERED,FILE_ANY_ACCESS)
1325 #define FSCTL_DELETE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM,62,METHOD_BUFFERED,FILE_ANY_ACCESS)
1326 #define FSCTL_MARK_HANDLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,63,METHOD_BUFFERED,FILE_ANY_ACCESS)
1327 #define FSCTL_SIS_COPYFILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,64,METHOD_BUFFERED,FILE_ANY_ACCESS)
1328 #define FSCTL_SIS_LINK_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM,65,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA)
1329 #define FSCTL_HSM_MSG CTL_CODE(FILE_DEVICE_FILE_SYSTEM,66,METHOD_BUFFERED,FILE_READ_DATA | FILE_WRITE_DATA)
1330 #define FSCTL_HSM_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM,68,METHOD_NEITHER,FILE_READ_DATA | FILE_WRITE_DATA)
1331 #define FSCTL_RECALL_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,69,METHOD_NEITHER,FILE_ANY_ACCESS)
1332 #define FSCTL_READ_FROM_PLEX CTL_CODE(FILE_DEVICE_FILE_SYSTEM,71,METHOD_OUT_DIRECT,FILE_READ_DATA)
1333 #define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM,72,METHOD_BUFFERED,FILE_SPECIAL_ACCESS)
1334 
1335 typedef struct _PATHNAME_BUFFER {
1336   DWORD PathNameLength;
1337   WCHAR Name[1];
1338 } PATHNAME_BUFFER,*PPATHNAME_BUFFER;
1339 
1340 typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
1341   BYTE First0x24BytesOfBootSector[0x24];
1342 } FSCTL_QUERY_FAT_BPB_BUFFER,*PFSCTL_QUERY_FAT_BPB_BUFFER;
1343 
1344 typedef struct {
1345   LARGE_INTEGER VolumeSerialNumber;
1346   LARGE_INTEGER NumberSectors;
1347   LARGE_INTEGER TotalClusters;
1348   LARGE_INTEGER FreeClusters;
1349   LARGE_INTEGER TotalReserved;
1350   DWORD BytesPerSector;
1351   DWORD BytesPerCluster;
1352   DWORD BytesPerFileRecordSegment;
1353   DWORD ClustersPerFileRecordSegment;
1354   LARGE_INTEGER MftValidDataLength;
1355   LARGE_INTEGER MftStartLcn;
1356   LARGE_INTEGER Mft2StartLcn;
1357   LARGE_INTEGER MftZoneStart;
1358   LARGE_INTEGER MftZoneEnd;
1359 } NTFS_VOLUME_DATA_BUFFER,*PNTFS_VOLUME_DATA_BUFFER;
1360 
1361 typedef struct {
1362   DWORD ByteCount;
1363   WORD MajorVersion;
1364   WORD MinorVersion;
1365 } NTFS_EXTENDED_VOLUME_DATA,*PNTFS_EXTENDED_VOLUME_DATA;
1366 
1367 typedef struct {
1368   LARGE_INTEGER StartingLcn;
1369 } STARTING_LCN_INPUT_BUFFER,*PSTARTING_LCN_INPUT_BUFFER;
1370 
1371 typedef struct {
1372   LARGE_INTEGER StartingLcn;
1373   LARGE_INTEGER BitmapSize;
1374   BYTE Buffer[1];
1375 } VOLUME_BITMAP_BUFFER,*PVOLUME_BITMAP_BUFFER;
1376 
1377 typedef struct {
1378   LARGE_INTEGER StartingVcn;
1379 } STARTING_VCN_INPUT_BUFFER,*PSTARTING_VCN_INPUT_BUFFER;
1380 
1381 typedef struct RETRIEVAL_POINTERS_BUFFER {
1382   DWORD ExtentCount;
1383   LARGE_INTEGER StartingVcn;
1384   struct {
1385     LARGE_INTEGER NextVcn;
1386     LARGE_INTEGER Lcn;
1387   } Extents[1];
1388 } RETRIEVAL_POINTERS_BUFFER,*PRETRIEVAL_POINTERS_BUFFER;
1389 
1390 typedef struct {
1391   LARGE_INTEGER FileReferenceNumber;
1392 } NTFS_FILE_RECORD_INPUT_BUFFER,*PNTFS_FILE_RECORD_INPUT_BUFFER;
1393 
1394 typedef struct {
1395   LARGE_INTEGER FileReferenceNumber;
1396   DWORD FileRecordLength;
1397   BYTE FileRecordBuffer[1];
1398 } NTFS_FILE_RECORD_OUTPUT_BUFFER,*PNTFS_FILE_RECORD_OUTPUT_BUFFER;
1399 
1400 typedef struct {
1401   HANDLE FileHandle;
1402   LARGE_INTEGER StartingVcn;
1403   LARGE_INTEGER StartingLcn;
1404   DWORD ClusterCount;
1405 } MOVE_FILE_DATA,*PMOVE_FILE_DATA;
1406 
1407 #ifdef _WIN64
1408 typedef struct _MOVE_FILE_DATA32 {
1409   UINT32 FileHandle;
1410   LARGE_INTEGER StartingVcn;
1411   LARGE_INTEGER StartingLcn;
1412   DWORD ClusterCount;
1413 } MOVE_FILE_DATA32,*PMOVE_FILE_DATA32;
1414 #endif
1415 
1416 typedef struct {
1417   DWORD Restart;
1418   SID Sid;
1419 } FIND_BY_SID_DATA,*PFIND_BY_SID_DATA;
1420 
1421 typedef struct {
1422   DWORD NextEntryOffset;
1423   DWORD FileIndex;
1424   DWORD FileNameLength;
1425   WCHAR FileName[1];
1426 } FIND_BY_SID_OUTPUT,*PFIND_BY_SID_OUTPUT;
1427 
1428 typedef struct {
1429   DWORDLONG StartFileReferenceNumber;
1430   USN LowUsn;
1431   USN HighUsn;
1432 } MFT_ENUM_DATA,*PMFT_ENUM_DATA;
1433 
1434 typedef struct {
1435   DWORDLONG MaximumSize;
1436   DWORDLONG AllocationDelta;
1437 } CREATE_USN_JOURNAL_DATA,*PCREATE_USN_JOURNAL_DATA;
1438 
1439 typedef struct {
1440   USN StartUsn;
1441   DWORD ReasonMask;
1442   DWORD ReturnOnlyOnClose;
1443   DWORDLONG Timeout;
1444   DWORDLONG BytesToWaitFor;
1445   DWORDLONG UsnJournalID;
1446 } READ_USN_JOURNAL_DATA,*PREAD_USN_JOURNAL_DATA;
1447 
1448 typedef struct {
1449   DWORD RecordLength;
1450   WORD MajorVersion;
1451   WORD MinorVersion;
1452   DWORDLONG FileReferenceNumber;
1453   DWORDLONG ParentFileReferenceNumber;
1454   USN Usn;
1455   LARGE_INTEGER TimeStamp;
1456   DWORD Reason;
1457   DWORD SourceInfo;
1458   DWORD SecurityId;
1459   DWORD FileAttributes;
1460   WORD FileNameLength;
1461   WORD FileNameOffset;
1462   WCHAR FileName[1];
1463 } USN_RECORD,*PUSN_RECORD;
1464 
1465 #define USN_PAGE_SIZE (0x1000)
1466 
1467 #define USN_REASON_DATA_OVERWRITE (0x00000001)
1468 #define USN_REASON_DATA_EXTEND (0x00000002)
1469 #define USN_REASON_DATA_TRUNCATION (0x00000004)
1470 #define USN_REASON_NAMED_DATA_OVERWRITE (0x00000010)
1471 #define USN_REASON_NAMED_DATA_EXTEND (0x00000020)
1472 #define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040)
1473 #define USN_REASON_FILE_CREATE (0x00000100)
1474 #define USN_REASON_FILE_DELETE (0x00000200)
1475 #define USN_REASON_EA_CHANGE (0x00000400)
1476 #define USN_REASON_SECURITY_CHANGE (0x00000800)
1477 #define USN_REASON_RENAME_OLD_NAME (0x00001000)
1478 #define USN_REASON_RENAME_NEW_NAME (0x00002000)
1479 #define USN_REASON_INDEXABLE_CHANGE (0x00004000)
1480 #define USN_REASON_BASIC_INFO_CHANGE (0x00008000)
1481 #define USN_REASON_HARD_LINK_CHANGE (0x00010000)
1482 #define USN_REASON_COMPRESSION_CHANGE (0x00020000)
1483 #define USN_REASON_ENCRYPTION_CHANGE (0x00040000)
1484 #define USN_REASON_OBJECT_ID_CHANGE (0x00080000)
1485 #define USN_REASON_REPARSE_POINT_CHANGE (0x00100000)
1486 #define USN_REASON_STREAM_CHANGE (0x00200000)
1487 
1488 #define USN_REASON_CLOSE (0x80000000)
1489 
1490 typedef struct {
1491   DWORDLONG UsnJournalID;
1492   USN FirstUsn;
1493   USN NextUsn;
1494   USN LowestValidUsn;
1495   USN MaxUsn;
1496   DWORDLONG MaximumSize;
1497   DWORDLONG AllocationDelta;
1498 } USN_JOURNAL_DATA,*PUSN_JOURNAL_DATA;
1499 
1500 typedef struct {
1501   DWORDLONG UsnJournalID;
1502   DWORD DeleteFlags;
1503 } DELETE_USN_JOURNAL_DATA,*PDELETE_USN_JOURNAL_DATA;
1504 
1505 #define USN_DELETE_FLAG_DELETE (0x00000001)
1506 #define USN_DELETE_FLAG_NOTIFY (0x00000002)
1507 
1508 #define USN_DELETE_VALID_FLAGS (0x00000003)
1509 
1510 typedef struct {
1511   DWORD UsnSourceInfo;
1512   HANDLE VolumeHandle;
1513   DWORD HandleInfo;
1514 } MARK_HANDLE_INFO,*PMARK_HANDLE_INFO;
1515 
1516 #ifdef _WIN64
1517 
1518 typedef struct {
1519   DWORD UsnSourceInfo;
1520   UINT32 VolumeHandle;
1521   DWORD HandleInfo;
1522 
1523 } MARK_HANDLE_INFO32,*PMARK_HANDLE_INFO32;
1524 #endif
1525 
1526 #define USN_SOURCE_DATA_MANAGEMENT (0x00000001)
1527 #define USN_SOURCE_AUXILIARY_DATA (0x00000002)
1528 #define USN_SOURCE_REPLICATION_MANAGEMENT (0x00000004)
1529 
1530 #define MARK_HANDLE_PROTECT_CLUSTERS (0x00000001)
1531 #define MARK_HANDLE_TXF_SYSTEM_LOG (0x00000004)
1532 #define MARK_HANDLE_NOT_TXF_SYSTEM_LOG (0x00000008)
1533 #define MARK_HANDLE_REALTIME (0x00000020)
1534 #define MARK_HANDLE_NOT_REALTIME (0x00000040)
1535 
1536 typedef struct {
1537   ACCESS_MASK DesiredAccess;
1538   DWORD SecurityIds[1];
1539 } BULK_SECURITY_TEST_DATA,*PBULK_SECURITY_TEST_DATA;
1540 
1541 #define VOLUME_IS_DIRTY (0x00000001)
1542 #define VOLUME_UPGRADE_SCHEDULED (0x00000002)
1543 
1544 typedef struct _FILE_PREFETCH {
1545   DWORD Type;
1546   DWORD Count;
1547   DWORDLONG Prefetch[1];
1548 } FILE_PREFETCH,*PFILE_PREFETCH;
1549 
1550 #define FILE_PREFETCH_TYPE_FOR_CREATE 0x1
1551 
1552 typedef struct _FILESYSTEM_STATISTICS {
1553   WORD FileSystemType;
1554   WORD Version;
1555   DWORD SizeOfCompleteStructure;
1556   DWORD UserFileReads;
1557   DWORD UserFileReadBytes;
1558   DWORD UserDiskReads;
1559   DWORD UserFileWrites;
1560   DWORD UserFileWriteBytes;
1561   DWORD UserDiskWrites;
1562   DWORD MetaDataReads;
1563   DWORD MetaDataReadBytes;
1564   DWORD MetaDataDiskReads;
1565   DWORD MetaDataWrites;
1566   DWORD MetaDataWriteBytes;
1567   DWORD MetaDataDiskWrites;
1568 } FILESYSTEM_STATISTICS,*PFILESYSTEM_STATISTICS;
1569 
1570 #define FILESYSTEM_STATISTICS_TYPE_NTFS 1
1571 #define FILESYSTEM_STATISTICS_TYPE_FAT 2
1572 
1573 typedef struct _FAT_STATISTICS {
1574   DWORD CreateHits;
1575   DWORD SuccessfulCreates;
1576   DWORD FailedCreates;
1577   DWORD NonCachedReads;
1578   DWORD NonCachedReadBytes;
1579   DWORD NonCachedWrites;
1580   DWORD NonCachedWriteBytes;
1581   DWORD NonCachedDiskReads;
1582   DWORD NonCachedDiskWrites;
1583 } FAT_STATISTICS,*PFAT_STATISTICS;
1584 
1585 typedef struct _EXFAT_STATISTICS {
1586   DWORD CreateHits;
1587   DWORD SuccessfulCreates;
1588   DWORD FailedCreates;
1589   DWORD NonCachedReads;
1590   DWORD NonCachedReadBytes;
1591   DWORD NonCachedWrites;
1592   DWORD NonCachedWriteBytes;
1593   DWORD NonCachedDiskReads;
1594   DWORD NonCachedDiskWrites;
1595 } EXFAT_STATISTICS, *PEXFAT_STATISTICS;
1596 
1597 typedef struct _NTFS_STATISTICS {
1598   DWORD LogFileFullExceptions;
1599   DWORD OtherExceptions;
1600   DWORD MftReads;
1601   DWORD MftReadBytes;
1602   DWORD MftWrites;
1603   DWORD MftWriteBytes;
1604   struct {
1605     WORD Write;
1606     WORD Create;
1607     WORD SetInfo;
1608     WORD Flush;
1609   } MftWritesUserLevel;
1610   WORD MftWritesFlushForLogFileFull;
1611   WORD MftWritesLazyWriter;
1612   WORD MftWritesUserRequest;
1613   DWORD Mft2Writes;
1614   DWORD Mft2WriteBytes;
1615   struct {
1616     WORD Write;
1617     WORD Create;
1618     WORD SetInfo;
1619     WORD Flush;
1620   } Mft2WritesUserLevel;
1621   WORD Mft2WritesFlushForLogFileFull;
1622   WORD Mft2WritesLazyWriter;
1623   WORD Mft2WritesUserRequest;
1624   DWORD RootIndexReads;
1625   DWORD RootIndexReadBytes;
1626   DWORD RootIndexWrites;
1627   DWORD RootIndexWriteBytes;
1628   DWORD BitmapReads;
1629   DWORD BitmapReadBytes;
1630   DWORD BitmapWrites;
1631   DWORD BitmapWriteBytes;
1632   WORD BitmapWritesFlushForLogFileFull;
1633   WORD BitmapWritesLazyWriter;
1634   WORD BitmapWritesUserRequest;
1635   struct {
1636     WORD Write;
1637     WORD Create;
1638     WORD SetInfo;
1639   } BitmapWritesUserLevel;
1640   DWORD MftBitmapReads;
1641   DWORD MftBitmapReadBytes;
1642   DWORD MftBitmapWrites;
1643   DWORD MftBitmapWriteBytes;
1644   WORD MftBitmapWritesFlushForLogFileFull;
1645   WORD MftBitmapWritesLazyWriter;
1646   WORD MftBitmapWritesUserRequest;
1647   struct {
1648     WORD Write;
1649     WORD Create;
1650     WORD SetInfo;
1651     WORD Flush;
1652   } MftBitmapWritesUserLevel;
1653   DWORD UserIndexReads;
1654   DWORD UserIndexReadBytes;
1655   DWORD UserIndexWrites;
1656   DWORD UserIndexWriteBytes;
1657   DWORD LogFileReads;
1658   DWORD LogFileReadBytes;
1659   DWORD LogFileWrites;
1660   DWORD LogFileWriteBytes;
1661   struct {
1662     DWORD Calls;
1663     DWORD Clusters;
1664     DWORD Hints;
1665     DWORD RunsReturned;
1666     DWORD HintsHonored;
1667     DWORD HintsClusters;
1668     DWORD Cache;
1669     DWORD CacheClusters;
1670     DWORD CacheMiss;
1671     DWORD CacheMissClusters;
1672   } Allocate;
1673 } NTFS_STATISTICS,*PNTFS_STATISTICS;
1674 
1675 typedef struct _FILE_OBJECTID_BUFFER {
1676   BYTE ObjectId[16];
1677   __C89_NAMELESS union {
1678     __C89_NAMELESS struct {
1679       BYTE BirthVolumeId[16];
1680       BYTE BirthObjectId[16];
1681       BYTE DomainId[16];
1682     } DUMMYSTRUCTNAME;
1683     BYTE ExtendedInfo[48];
1684   } DUMMYUNIONNAME;
1685 } FILE_OBJECTID_BUFFER,*PFILE_OBJECTID_BUFFER;
1686 
1687 typedef struct _FILE_SET_SPARSE_BUFFER {
1688   BOOLEAN SetSparse;
1689 } FILE_SET_SPARSE_BUFFER,*PFILE_SET_SPARSE_BUFFER;
1690 
1691 typedef struct _FILE_ZERO_DATA_INFORMATION {
1692   LARGE_INTEGER FileOffset;
1693   LARGE_INTEGER BeyondFinalZero;
1694 } FILE_ZERO_DATA_INFORMATION,*PFILE_ZERO_DATA_INFORMATION;
1695 
1696 typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
1697   LARGE_INTEGER FileOffset;
1698   LARGE_INTEGER Length;
1699 } FILE_ALLOCATED_RANGE_BUFFER,*PFILE_ALLOCATED_RANGE_BUFFER;
1700 
1701 typedef struct _ENCRYPTION_BUFFER {
1702   DWORD EncryptionOperation;
1703   BYTE Private[1];
1704 } ENCRYPTION_BUFFER,*PENCRYPTION_BUFFER;
1705 
1706 #define FILE_SET_ENCRYPTION 0x00000001
1707 #define FILE_CLEAR_ENCRYPTION 0x00000002
1708 #define STREAM_SET_ENCRYPTION 0x00000003
1709 #define STREAM_CLEAR_ENCRYPTION 0x00000004
1710 
1711 #define MAXIMUM_ENCRYPTION_VALUE 0x00000004
1712 
1713 typedef struct _DECRYPTION_STATUS_BUFFER {
1714   BOOLEAN NoEncryptedStreams;
1715 } DECRYPTION_STATUS_BUFFER,*PDECRYPTION_STATUS_BUFFER;
1716 
1717 #define ENCRYPTION_FORMAT_DEFAULT (0x01)
1718 #define COMPRESSION_FORMAT_SPARSE (0x4000)
1719 
1720 typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
1721   LONGLONG FileOffset;
1722   DWORD Length;
1723 } REQUEST_RAW_ENCRYPTED_DATA,*PREQUEST_RAW_ENCRYPTED_DATA;
1724 
1725 typedef struct _ENCRYPTED_DATA_INFO {
1726   DWORDLONG StartingFileOffset;
1727   DWORD OutputBufferOffset;
1728   DWORD BytesWithinFileSize;
1729   DWORD BytesWithinValidDataLength;
1730   WORD CompressionFormat;
1731   BYTE DataUnitShift;
1732   BYTE ChunkShift;
1733   BYTE ClusterShift;
1734   BYTE EncryptionFormat;
1735   WORD NumberOfDataBlocks;
1736   DWORD DataBlockSize[ANYSIZE_ARRAY];
1737 } ENCRYPTED_DATA_INFO;
1738 typedef ENCRYPTED_DATA_INFO *PENCRYPTED_DATA_INFO;
1739 
1740 typedef struct _PLEX_READ_DATA_REQUEST {
1741   LARGE_INTEGER ByteOffset;
1742   DWORD ByteLength;
1743   DWORD PlexNumber;
1744 } PLEX_READ_DATA_REQUEST,*PPLEX_READ_DATA_REQUEST;
1745 
1746 typedef struct _SI_COPYFILE {
1747   DWORD SourceFileNameLength;
1748   DWORD DestinationFileNameLength;
1749   DWORD Flags;
1750   WCHAR FileNameBuffer[1];
1751 } SI_COPYFILE,*PSI_COPYFILE;
1752 
1753 #define COPYFILE_SIS_LINK 0x0001
1754 #define COPYFILE_SIS_REPLACE 0x0002
1755 #define COPYFILE_SIS_FLAGS 0x0003
1756 
1757 typedef struct _STORAGE_DESCRIPTOR_HEADER {
1758   DWORD Version;
1759   DWORD Size;
1760 } STORAGE_DESCRIPTOR_HEADER, *PSTORAGE_DESCRIPTOR_HEADER;
1761 
1762 typedef enum _STORAGE_PROPERTY_ID {
1763   StorageDeviceProperty              = 0,
1764   StorageAdapterProperty             = 1,
1765   StorageDeviceIdProperty            = 2,
1766   StorageDeviceUniqueIdProperty      = 3,
1767   StorageDeviceWriteCacheProperty    = 4,
1768   StorageMiniportProperty            = 5,
1769   StorageAccessAlignmentProperty     = 6,
1770   StorageDeviceSeekPenaltyProperty   = 7,
1771   StorageDeviceTrimProperty          = 8
1772 } STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
1773 
1774 typedef enum _STORAGE_QUERY_TYPE {
1775   PropertyStandardQuery     = 0,
1776   PropertyExistsQuery       = 1,
1777   PropertyMaskQuery         = 2,
1778   PropertyQueryMaxDefined   = 3
1779 } STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
1780 
1781 typedef struct _STORAGE_PROPERTY_QUERY {
1782   STORAGE_PROPERTY_ID PropertyId;
1783   STORAGE_QUERY_TYPE  QueryType;
1784   BYTE                AdditionalParameters[1];
1785 } STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
1786 
1787 typedef struct _STORAGE_DEVICE_DESCRIPTOR {
1788   DWORD            Version;
1789   DWORD            Size;
1790   BYTE             DeviceType;
1791   BYTE             DeviceTypeModifier;
1792   BOOLEAN          RemovableMedia;
1793   BOOLEAN          CommandQueueing;
1794   DWORD            VendorIdOffset;
1795   DWORD            ProductIdOffset;
1796   DWORD            ProductRevisionOffset;
1797   DWORD            SerialNumberOffset;
1798   STORAGE_BUS_TYPE BusType;
1799   DWORD            RawPropertiesLength;
1800   BYTE             RawDeviceProperties[1];
1801 } STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
1802 
1803 typedef struct _STORAGE_ADAPTER_DESCRIPTOR {
1804   DWORD   Version;
1805   DWORD   Size;
1806   DWORD   MaximumTransferLength;
1807   DWORD   MaximumPhysicalPages;
1808   DWORD   AlignmentMask;
1809   BOOLEAN AdapterUsesPio;
1810   BOOLEAN AdapterScansDown;
1811   BOOLEAN CommandQueueing;
1812   BOOLEAN AcceleratedTransfer;
1813   BYTE    BusType;
1814   WORD    BusMajorVersion;
1815   WORD    BusMinorVersion;
1816 } STORAGE_ADAPTER_DESCRIPTOR, *PSTORAGE_ADAPTER_DESCRIPTOR;
1817 
1818 typedef struct _STORAGE_DEVICE_ID_DESCRIPTOR {
1819   DWORD Version;
1820   DWORD Size;
1821   DWORD NumberOfIdentifiers;
1822   BYTE  Identifiers[1];
1823 } STORAGE_DEVICE_ID_DESCRIPTOR, *PSTORAGE_DEVICE_ID_DESCRIPTOR;
1824 
1825 typedef struct _VOLUME_GET_GPT_ATTRIBUTES_INFORMATION {
1826   ULONGLONG GptAttributes;
1827 } VOLUME_GET_GPT_ATTRIBUTES_INFORMATION, *PVOLUME_GET_GPT_ATTRIBUTES_INFORMATION;
1828 
1829 #if (_WIN32_WINNT >= 0x0600)
1830 #define FSCTL_MAKE_MEDIA_COMPATIBLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 76, METHOD_BUFFERED, FILE_WRITE_DATA)
1831 #define FSCTL_SET_DEFECT_MANAGEMENT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 77, METHOD_BUFFERED, FILE_WRITE_DATA)
1832 #define FSCTL_QUERY_SPARING_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 78, METHOD_BUFFERED, FILE_ANY_ACCESS)
1833 #define FSCTL_QUERY_ON_DISK_VOLUME_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 79, METHOD_BUFFERED, FILE_ANY_ACCESS)
1834 #define FSCTL_SET_VOLUME_COMPRESSION_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,80, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
1835 #define FSCTL_TXFS_MODIFY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM,81, METHOD_BUFFERED, FILE_WRITE_DATA)
1836 #define FSCTL_TXFS_QUERY_RM_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,82, METHOD_BUFFERED, FILE_READ_DATA)
1837 #define FSCTL_TXFS_ROLLFORWARD_REDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,84, METHOD_BUFFERED, FILE_WRITE_DATA)
1838 #define FSCTL_TXFS_ROLLFORWARD_UNDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,85, METHOD_BUFFERED, FILE_WRITE_DATA)
1839 #define FSCTL_TXFS_START_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM,86, METHOD_BUFFERED, FILE_WRITE_DATA)
1840 #define FSCTL_TXFS_SHUTDOWN_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 87, METHOD_BUFFERED, FILE_WRITE_DATA)
1841 #define FSCTL_TXFS_READ_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,88, METHOD_BUFFERED, FILE_READ_DATA)
1842 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,89, METHOD_BUFFERED, FILE_WRITE_DATA)
1843 #define FSCTL_TXFS_CREATE_SECONDARY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM,90,METHOD_BUFFERED, FILE_WRITE_DATA)
1844 #define FSCTL_TXFS_GET_METADATA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,91, METHOD_BUFFERED, FILE_READ_DATA)
1845 #define FSCTL_TXFS_GET_TRANSACTED_VERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,92, METHOD_BUFFERED, FILE_READ_DATA)
1846 #define FSCTL_TXFS_SAVEPOINT_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,94, METHOD_BUFFERED, FILE_WRITE_DATA)
1847 #define FSCTL_TXFS_CREATE_MINIVERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 95, METHOD_BUFFERED, FILE_WRITE_DATA)
1848 #define FSCTL_TXFS_TRANSACTION_ACTIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,99, METHOD_BUFFERED, FILE_READ_DATA)
1849 #define FSCTL_SET_ZERO_ON_DEALLOCATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,101, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
1850 #define FSCTL_SET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 102, METHOD_BUFFERED, FILE_ANY_ACCESS)
1851 #define FSCTL_GET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 103, METHOD_BUFFERED, FILE_ANY_ACCESS)
1852 #define FSCTL_WAIT_FOR_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 104, METHOD_BUFFERED, FILE_ANY_ACCESS)
1853 #define FSCTL_INITIATE_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 106, METHOD_BUFFERED, FILE_ANY_ACCESS)
1854 #define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS)
1855 #define FSCTL_SHRINK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 108, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
1856 #define FSCTL_SET_SHORT_NAME_BEHAVIOR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 109, METHOD_BUFFERED, FILE_ANY_ACCESS)
1857 #define FSCTL_DFSR_SET_GHOST_HANDLE_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 110, METHOD_BUFFERED, FILE_ANY_ACCESS)
1858 #define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_READ_DATA)
1859 #define FSCTL_TXFS_LIST_TRANSACTIONS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 121, METHOD_BUFFERED, FILE_READ_DATA)
1860 #define FSCTL_QUERY_PAGEFILE_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 122, METHOD_BUFFERED, FILE_ANY_ACCESS)
1861 #define FSCTL_RESET_VOLUME_ALLOCATION_HINTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 123, METHOD_BUFFERED, FILE_ANY_ACCESS)
1862 #define FSCTL_TXFS_READ_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 126, METHOD_BUFFERED, FILE_ANY_ACCESS)
1863 
1864 #define SET_REPAIR_ENABLED 0x00000001
1865 #define SET_REPAIR_VOLUME_BITMAP_SCAN 0x00000002
1866 #define SET_REPAIR_DELETE_CROSSLINK 0x00000004
1867 #define SET_REPAIR_WARN_ABOUT_DATA_LOSS 0x00000008
1868 #define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT 0x00000010
1869 
1870 typedef struct _FILE_MAKE_COMPATIBLE_BUFFER {
1871   BOOLEAN CloseDisc;
1872 } FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER;
1873 
1874 typedef struct _FILE_SET_DEFECT_MGMT_BUFFER {
1875   BOOLEAN Disable;
1876 } FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER;
1877 
1878 typedef struct _FILE_QUERY_SPARING_BUFFER {
1879   ULONG   SparingUnitBytes;
1880   BOOLEAN SoftwareSparing;
1881   ULONG   TotalSpareBlocks;
1882   ULONG   FreeSpareBlocks;
1883 } FILE_QUERY_SPARING_BUFFER, *PFILE_QUERY_SPARING_BUFFER;
1884 
1885 typedef struct _FILE_QUERY_ON_DISK_VOL_INFO_BUFFER {
1886   LARGE_INTEGER DirectoryCount;
1887   LARGE_INTEGER FileCount;
1888   WORD          FsFormatMajVersion;
1889   WORD          FsFormatMinVersion;
1890   WCHAR         FsFormatName[12];
1891   LARGE_INTEGER FormatTime;
1892   LARGE_INTEGER LastUpdateTime;
1893   WCHAR         CopyrightInfo[34];
1894   WCHAR         AbstractInfo[34];
1895   WCHAR         FormattingImplementationInfo[34];
1896   WCHAR         LastModifyingImplementationInfo[34];
1897 } FILE_QUERY_ON_DISK_VOL_INFO_BUFFER, *PFILE_QUERY_ON_DISK_VOL_INFO_BUFFER;
1898 
1899 #define SET_REPAIR_ENABLED                          0x00000001
1900 #define SET_REPAIR_VOLUME_BITMAP_SCAN               0x00000002
1901 #define SET_REPAIR_DELETE_CROSSLINK                 0x00000004
1902 #define SET_REPAIR_WARN_ABOUT_DATA_LOSS             0x00000008
1903 #define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT 0x00000010
1904 #define SET_REPAIR_VALID_MASK                       0x0000001F
1905 
1906 typedef enum _SHRINK_VOLUME_REQUEST_TYPES {
1907   ShrinkPrepare,
1908   ShrinkCommit,
1909   ShrinkAbort
1910 } SHRINK_VOLUME_REQUEST_TYPES;
1911 
1912 typedef struct _SHRINK_VOLUME_INFORMATION {
1913   SHRINK_VOLUME_REQUEST_TYPES ShrinkRequestType;
1914   DWORDLONG                   Flags;
1915   LONGLONG                    NewNumberOfSectors;
1916 } SHRINK_VOLUME_INFORMATION, *PSHRINK_VOLUME_INFORMATION;
1917 
1918 #define TXFS_RM_FLAG_LOGGING_MODE 0x00000001
1919 #define TXFS_RM_FLAG_RENAME_RM 0x00000002
1920 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000004
1921 #define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000008
1922 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000010
1923 #define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000020
1924 #define TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000040
1925 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000080
1926 #define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000100
1927 #define TXFS_RM_FLAG_GROW_LOG 0x00000400
1928 #define TXFS_RM_FLAG_SHRINK_LOG 0x00000800
1929 #define TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE 0x00001000
1930 #define TXFS_RM_FLAG_PRESERVE_CHANGES 0x00002000
1931 #define TXFS_RM_FLAG_RESET_RM_AT_NEXT_START 0x00004000
1932 #define TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START 0x00008000
1933 #define TXFS_RM_FLAG_PREFER_CONSISTENCY 0x00010000
1934 #define TXFS_RM_FLAG_PREFER_AVAILABILITY 0x00020000
1935 
1936 #define TXFS_LOGGING_MODE_SIMPLE 1
1937 #define TXFS_LOGGING_MODE_FULL 2
1938 
1939 #define TXFS_TRANSACTION_STATE_NONE      0
1940 #define TXFS_TRANSACTION_STATE_ACTIVE    1
1941 #define TXFS_TRANSACTION_STATE_PREPARED  2
1942 #define TXFS_TRANSACTION_STATE_NOTACTIVE 3
1943 
1944 #define TXFS_MODIFY_RM_VALID_FLAGS (TXFS_RM_FLAG_LOGGING_MODE                        | \
1945                                     TXFS_RM_FLAG_RENAME_RM                           | \
1946                                     TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX             | \
1947                                     TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN             | \
1948                                     TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
1949                                     TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        | \
1950                                     TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          | \
1951                                     TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX          | \
1952                                     TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN          | \
1953                                     TXFS_RM_FLAG_SHRINK_LOG                          | \
1954                                     TXFS_RM_FLAG_GROW_LOG                            | \
1955                                     TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE                | \
1956                                     TXFS_RM_FLAG_PRESERVE_CHANGES                    | \
1957                                     TXFS_RM_FLAG_RESET_RM_AT_NEXT_START              | \
1958                                     TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START       | \
1959                                     TXFS_RM_FLAG_PREFER_CONSISTENCY                  | \
1960                                     TXFS_RM_FLAG_PREFER_AVAILABILITY)
1961 
1962 typedef struct _TXFS_MODIFY_RM {
1963   ULONG     Flags;
1964   ULONG     LogContainerCountMax;
1965   ULONG     LogContainerCountMin;
1966   ULONG     LogContainerCount;
1967   ULONG     LogGrowthIncrement;
1968   ULONG     LogAutoShrinkPercentage;
1969   ULONGLONG Reserved;
1970   USHORT    LoggingMode;
1971 } TXFS_MODIFY_RM, *PTXFS_MODIFY_RM;
1972 
1973 #define TXFS_RM_STATE_NOT_STARTED 0
1974 #define TXFS_RM_STATE_STARTING 1
1975 #define TXFS_RM_STATE_ACTIVE 3
1976 #define TXFS_RM_STATE_SHUTTING_DOWN 4
1977 
1978 #define TXFS_QUERY_RM_INFORMATION_VALID_FLAGS                           \
1979                 (TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS   |   \
1980                  TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT          |   \
1981                  TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX            |   \
1982                  TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN            |   \
1983                  TXFS_RM_FLAG_RESET_RM_AT_NEXT_START                |   \
1984                  TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START         |   \
1985                  TXFS_RM_FLAG_PREFER_CONSISTENCY                    |   \
1986                  TXFS_RM_FLAG_PREFER_AVAILABILITY)
1987 
1988 typedef struct _TXFS_QUERY_RM_INFORMATION {
1989   ULONG         BytesRequired;
1990   ULONGLONG     TailLsn;
1991   ULONGLONG     CurrentLsn;
1992   ULONGLONG     ArchiveTailLsn;
1993   ULONGLONG     LogContainerSize;
1994   LARGE_INTEGER HighestVirtualClock;
1995   ULONG         LogContainerCount;
1996   ULONG         LogContainerCountMax;
1997   ULONG         LogContainerCountMin;
1998   ULONG         LogGrowthIncrement;
1999   ULONG         LogAutoShrinkPercentage;
2000   ULONG         Flags;
2001   USHORT        LoggingMode;
2002   USHORT        Reserved;
2003   ULONG         RmState;
2004   ULONGLONG     LogCapacity;
2005   ULONGLONG     LogFree;
2006   ULONGLONG     TopsSize;
2007   ULONGLONG     TopsUsed;
2008   ULONGLONG     TransactionCount;
2009   ULONGLONG     OnePCCount;
2010   ULONGLONG     TwoPCCount;
2011   ULONGLONG     NumberLogFileFull;
2012   ULONGLONG     OldestTransactionAge;
2013   GUID          RMName;
2014   ULONG         TmLogPathOffset;
2015 } TXFS_QUERY_RM_INFORMATION, *PTXFS_QUERY_RM_INFORMATION;
2016 
2017 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN 0x01
2018 #define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK 0x02
2019 
2020 #define TXFS_ROLLFORWARD_REDO_VALID_FLAGS                               \
2021                 (TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN |         \
2022                  TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK)
2023 
2024 typedef struct _TXFS_ROLLFORWARD_REDO_INFORMATION {
2025   LARGE_INTEGER LastVirtualClock;
2026   ULONGLONG     LastRedoLsn;
2027   ULONGLONG     HighestRecoveryLsn;
2028   ULONG         Flags;
2029 } TXFS_ROLLFORWARD_REDO_INFORMATION, *PTXFS_ROLLFORWARD_REDO_INFORMATION;
2030 
2031 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000001
2032 #define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000002
2033 #define TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE 0x00000004
2034 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000008
2035 #define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000010
2036 #define TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000020
2037 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000040
2038 #define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000080
2039 #define TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT 0x00000200
2040 #define TXFS_START_RM_FLAG_LOGGING_MODE 0x00000400
2041 #define TXFS_START_RM_FLAG_PRESERVE_CHANGES 0x00000800
2042 #define TXFS_START_RM_FLAG_PREFER_CONSISTENCY 0x00001000
2043 #define TXFS_START_RM_FLAG_PREFER_AVAILABILITY 0x00002000
2044 
2045 #define TXFS_START_RM_VALID_FLAGS                                           \
2046                 (TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX             |   \
2047                  TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN             |   \
2048                  TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE                  |   \
2049                  TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS |   \
2050                  TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT        |   \
2051                  TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE          |   \
2052                  TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT                 |   \
2053                  TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX          |   \
2054                  TXFS_START_RM_FLAG_LOGGING_MODE                        |   \
2055                  TXFS_START_RM_FLAG_PRESERVE_CHANGES                    |   \
2056                  TXFS_START_RM_FLAG_PREFER_CONSISTENCY                  |   \
2057                  TXFS_START_RM_FLAG_PREFER_AVAILABILITY)
2058 
2059 typedef struct _TXFS_START_RM_INFORMATION {
2060   ULONG     Flags;
2061   ULONGLONG LogContainerSize;
2062   ULONG     LogContainerCountMin;
2063   ULONG     LogContainerCountMax;
2064   ULONG     LogGrowthIncrement;
2065   ULONG     LogAutoShrinkPercentage;
2066   ULONG     TmLogPathOffset;
2067   USHORT    TmLogPathLength;
2068   USHORT    LoggingMode;
2069   USHORT    LogPathLength;
2070   USHORT    Reserved;
2071   WCHAR     LogPath[1];
2072 } TXFS_START_RM_INFORMATION, *PTXFS_START_RM_INFORMATION;
2073 
2074 typedef struct _TXFS_GET_METADATA_INFO_OUT {
2075   struct {
2076     LONGLONG LowPart;
2077     LONGLONG HighPart;
2078   } TxfFileId;
2079   GUID      LockingTransaction;
2080   ULONGLONG LastLsn;
2081   ULONG     TransactionState;
2082 } TXFS_GET_METADATA_INFO_OUT, *PTXFS_GET_METADATA_INFO_OUT;
2083 
2084 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_CREATED 0x00000001
2085 #define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_DELETED 0x000000012
2086 
2087 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY {
2088   ULONGLONG Offset;
2089   ULONG     NameFlags;
2090   LONGLONG  FileId;
2091   ULONG     Reserved1;
2092   ULONG     Reserved2;
2093   LONGLONG  Reserved3;
2094   WCHAR     FileName[1];
2095 } TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY, *PTXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY;
2096 
2097 typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES {
2098   GUID      KtmTransaction;
2099   ULONGLONG NumberOfFiles;
2100   ULONGLONG BufferSizeRequired;
2101   ULONGLONG Offset;
2102 } TXFS_LIST_TRANSACTION_LOCKED_FILES, *PTXFS_LIST_TRANSACTION_LOCKED_FILES;
2103 
2104 typedef struct _TXFS_LIST_TRANSACTIONS_ENTRY {
2105   GUID     TransactionId;
2106   ULONG    TransactionState;
2107   ULONG    Reserved1;
2108   ULONG    Reserved2;
2109   LONGLONG Reserved3;
2110 } TXFS_LIST_TRANSACTIONS_ENTRY, *PTXFS_LIST_TRANSACTIONS_ENTRY;
2111 
2112 typedef struct _TXFS_LIST_TRANSACTIONS {
2113   ULONGLONG NumberOfTransactions;
2114   ULONGLONG BufferSizeRequired;
2115 } TXFS_LIST_TRANSACTIONS, *PTXFS_LIST_TRANSACTIONS;
2116 
2117 typedef struct _TXFS_READ_BACKUP_INFORMATION_OUT {
2118   __C89_NAMELESS union {
2119     ULONG BufferLength;
2120     UCHAR Buffer;
2121   } DUMMYUNIONNAME;
2122 } TXFS_READ_BACKUP_INFORMATION_OUT, *PTXFS_READ_BACKUP_INFORMATION_OUT;
2123 
2124 typedef struct _TXFS_WRITE_BACKUP_INFORMATION {
2125   UCHAR Buffer;
2126 } TXFS_WRITE_BACKUP_INFORMATION, *PTXFS_WRITE_BACKUP_INFORMATION;
2127 
2128 #define TXFS_TRANSACTED_VERSION_NONTRANSACTED 0xFFFFFFFE
2129 #define TXFS_TRANSACTED_VERSION_UNCOMMITTED 0xFFFFFFFF
2130 
2131 typedef struct _TXFS_GET_TRANSACTED_VERSION {
2132   ULONG  ThisBaseVersion;
2133   ULONG  LatestVersion;
2134   USHORT ThisMiniVersion;
2135   USHORT FirstMiniVersion;
2136   USHORT LatestMiniVersion;
2137 } TXFS_GET_TRANSACTED_VERSION, *PTXFS_GET_TRANSACTED_VERSION;
2138 
2139 #define TXFS_SAVEPOINT_SET 1
2140 #define TXFS_SAVEPOINT_ROLLBACK 2
2141 #define TXFS_SAVEPOINT_CLEAR 4
2142 #define TXFS_SAVEPOINT_CLEAR_ALL 16
2143 
2144 typedef struct _TXFS_SAVEPOINT_INFORMATION {
2145   HANDLE KtmTransaction;
2146   ULONG  ActionCode;
2147   ULONG  SavepointId;
2148 } TXFS_SAVEPOINT_INFORMATION, *PTXFS_SAVEPOINT_INFORMATION;
2149 
2150 typedef struct _TXFS_CREATE_MINIVERSION_INFO {
2151   USHORT StructureVersion;
2152   USHORT StructureLength;
2153   ULONG  BaseVersion;
2154   USHORT MiniVersion;
2155 } TXFS_CREATE_MINIVERSION_INFO, *PTXFS_CREATE_MINIVERSION_INFO;
2156 
2157 typedef struct _TXFS_TRANSACTION_ACTIVE_INFO {
2158   WINBOOL TransactionsActiveAtSnapshot;
2159 } TXFS_TRANSACTION_ACTIVE_INFO, *PTXFS_TRANSACTION_ACTIVE_INFO;
2160 
2161 typedef enum _WRITE_CACHE_TYPE {
2162   WriteCacheTypeUnknown        = 0,
2163   WriteCacheTypeNone           = 1,
2164   WriteCacheTypeWriteBack      = 2,
2165   WriteCacheTypeWriteThrough   = 3
2166 } WRITE_CACHE_TYPE;
2167 
2168 typedef enum _WRITE_CACHE_ENABLE {
2169   WriteCacheEnableUnknown   = 0,
2170   WriteCacheDisabled        = 1,
2171   WriteCacheEnabled         = 2
2172 } WRITE_CACHE_ENABLE;
2173 
2174 typedef enum _WRITE_CACHE_CHANGE {
2175   WriteCacheChangeUnknown   = 0,
2176   WriteCacheNotChangeable   = 1,
2177   WriteCacheChangeable      = 2
2178 } WRITE_CACHE_CHANGE;
2179 
2180 typedef enum _WRITE_THROUGH {
2181   WriteThroughUnknown        = 0,
2182   WriteThroughNotSupported   = 1,
2183   WriteThroughSupported      = 2
2184 } WRITE_THROUGH;
2185 
2186 typedef struct _STORAGE_WRITE_CACHE_PROPERTY {
2187   DWORD              Version;
2188   DWORD              Size;
2189   WRITE_CACHE_TYPE   WriteCacheType;
2190   WRITE_CACHE_ENABLE WriteCacheEnabled;
2191   WRITE_CACHE_CHANGE WriteCacheChangeable;
2192   WRITE_THROUGH      WriteThroughSupported;
2193   BOOLEAN            FlushCacheSupported;
2194   BOOLEAN            UserDefinedPowerProtection;
2195   BOOLEAN            NVCacheEnabled;
2196 } STORAGE_WRITE_CACHE_PROPERTY, *PSTORAGE_WRITE_CACHE_PROPERTY;
2197 
2198 typedef enum _STORAGE_PORT_CODE_SET {
2199   StoragePortCodeSetReserved   = 0,
2200   StoragePortCodeSetStorport   = 1,
2201   StoragePortCodeSetSCSIport   = 2
2202 } STORAGE_PORT_CODE_SET, *PSTORAGE_PORT_CODE_SET;
2203 
2204 typedef struct _STORAGE_MINIPORT_DESCRIPTOR {
2205   DWORD                 Version;
2206   DWORD                 Size;
2207   STORAGE_PORT_CODE_SET Portdriver;
2208   BOOLEAN               LUNResetSupported;
2209   BOOLEAN               TargetResetSupported;
2210 } STORAGE_MINIPORT_DESCRIPTOR, *PSTORAGE_MINIPORT_DESCRIPTOR;
2211 
2212 typedef struct _STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR {
2213   DWORD Version;
2214   DWORD Size;
2215   DWORD BytesPerCacheLine;
2216   DWORD BytesOffsetForCacheAlignment;
2217   DWORD BytesPerLogicalSector;
2218   DWORD BytesPerPhysicalSector;
2219   DWORD BytesOffsetForSectorAlignment;
2220 } STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR, *PSTORAGE_ACCESS_ALIGNMENT_DESCRIPTOR;
2221 #endif /*(_WIN32_WINNT >= 0x0600)*/
2222 
2223 #if (_WIN32_WINNT >= 0x0601)
2224 typedef struct _DEVICE_SEEK_PENALTY_DESCRIPTOR {
2225   DWORD   Version;
2226   DWORD   Size;
2227   BOOLEAN IncursSeekPenalty;
2228 } DEVICE_SEEK_PENALTY_DESCRIPTOR, *PDEVICE_SEEK_PENALTY_DESCRIPTOR;
2229 
2230 typedef struct _DEVICE_TRIM_DESCRIPTOR {
2231   DWORD   Version;
2232   DWORD   Size;
2233   BOOLEAN TrimEnabled;
2234 } DEVICE_TRIM_DESCRIPTOR, *PDEVICE_TRIM_DESCRIPTOR;
2235 
2236 typedef struct _REQUEST_OPLOCK_INPUT_BUFFER {
2237   WORD  StructureVersion;
2238   WORD  StructureLength;
2239   DWORD RequestedOplockLevel;
2240   DWORD Flags;
2241 } REQUEST_OPLOCK_INPUT_BUFFER, *PREQUEST_OPLOCK_INPUT_BUFFER;
2242 
2243 typedef struct _REQUEST_OPLOCK_OUTPUT_BUFFER {
2244   WORD        StructureVersion;
2245   WORD        StructureLength;
2246   DWORD       OriginalOplockLevel;
2247   DWORD       NewOplockLevel;
2248   DWORD       Flags;
2249   ACCESS_MASK AccessMode;
2250   WORD        ShareMode;
2251 } REQUEST_OPLOCK_OUTPUT_BUFFER, *PREQUEST_OPLOCK_OUTPUT_BUFFER;
2252 
2253 typedef struct _BOOT_AREA_INFO {
2254   ULONG BootSectorCount;
2255   struct {
2256     LARGE_INTEGER Offset;
2257   } BootSectors[2];
2258 } BOOT_AREA_INFO, *PBOOT_AREA_INFO;
2259 
2260 typedef struct _RETRIEVAL_POINTER_BASE {
2261   LARGE_INTEGER FileAreaOffset;
2262 } RETRIEVAL_POINTER_BASE, *PRETRIEVAL_POINTER_BASE;
2263 
2264 typedef struct _FILE_SYSTEM_RECOGNITION_INFORMATION {
2265   CHAR FileSystem[9];
2266 } FILE_SYSTEM_RECOGNITION_INFORMATION, *PFILE_SYSTEM_RECOGNITION_INFORMATION;
2267 
2268 typedef struct _FILE_SYSTEM_RECOGNITION_STRUCTURE {
2269   UCHAR  Jmp[3];
2270   UCHAR  FsName[8];
2271   UCHAR  MustBeZero[5];
2272   ULONG  Identifier;
2273   USHORT Length;
2274   USHORT Checksum;
2275 } FILE_SYSTEM_RECOGNITION_STRUCTURE;
2276 
2277 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_INPUT {
2278   DWORD         Flags;
2279   DWORD         NumberOfClusters;
2280   LARGE_INTEGER Cluster[1];
2281 } LOOKUP_STREAM_FROM_CLUSTER_INPUT, *PLOOKUP_STREAM_FROM_CLUSTER_INPUT;
2282 
2283 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_OUTPUT {
2284   DWORD Offset;
2285   DWORD NumberOfMatches;
2286   DWORD BufferSizeRequired;
2287 } LOOKUP_STREAM_FROM_CLUSTER_OUTPUT, *PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT;
2288 
2289 typedef struct _LOOKUP_STREAM_FROM_CLUSTER_ENTRY {
2290   DWORD         OffsetToNext;
2291   DWORD         Flags;
2292   LARGE_INTEGER Reserved;
2293   LARGE_INTEGER Cluster;
2294   WCHAR         FileName[1];
2295 } LOOKUP_STREAM_FROM_CLUSTER_ENTRY, *PLOOKUP_STREAM_FROM_CLUSTER_ENTRY;
2296 
2297 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_MASK 0xff000000
2298 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_PAGE_FILE 0x00000001
2299 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_DENY_DEFRAG_SET 0x00000002
2300 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_FS_SYSTEM_FILE 0x00000004
2301 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_TXF_SYSTEM_FILE 0x00000008
2302 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_DATA 0x01000000
2303 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_INDEX 0x02000000
2304 #define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_SYSTEM 0x03000000
2305 
2306 #define FSCTL_QUERY_DEPENDENT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,124, METHOD_BUFFERED, FILE_ANY_ACCESS)
2307 #define FSCTL_SD_GLOBAL_CHANGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,125, METHOD_BUFFERED, FILE_ANY_ACCESS)
2308 #define FSCTL_LOOKUP_STREAM_FROM_CLUSTER CTL_CODE(FILE_DEVICE_FILE_SYSTEM,127, METHOD_BUFFERED, FILE_ANY_ACCESS)
2309 #define FSCTL_TXFS_WRITE_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM,128, METHOD_BUFFERED, FILE_ANY_ACCESS)
2310 #define FSCTL_FILE_TYPE_NOTIFICATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,129, METHOD_BUFFERED, FILE_ANY_ACCESS)
2311 #define FSCTL_GET_BOOT_AREA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM,140, METHOD_BUFFERED, FILE_ANY_ACCESS)
2312 #define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM,141, METHOD_BUFFERED, FILE_ANY_ACCESS)
2313 #define FSCTL_SET_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS)
2314 #define FSCTL_QUERY_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 143, METHOD_BUFFERED, FILE_ANY_ACCESS)
2315 #define FSCTL_REQUEST_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM,144,METHOD_BUFFERED,FILE_ANY_ACCESS)
2316 #define FSCTL_CSV_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 145, METHOD_BUFFERED, FILE_ANY_ACCESS)
2317 #define FSCTL_IS_CSV_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 146, METHOD_BUFFERED, FILE_ANY_ACCESS)
2318 #define FSCTL_QUERY_FILE_SYSTEM_RECOGNITION CTL_CODE(FILE_DEVICE_FILE_SYSTEM,147, METHOD_BUFFERED, FILE_ANY_ACCESS)
2319 #define FSCTL_CSV_GET_VOLUME_PATH_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM,148, METHOD_BUFFERED, FILE_ANY_ACCESS)
2320 #define FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 149, METHOD_BUFFERED, FILE_ANY_ACCESS)
2321 #define FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 150, METHOD_BUFFERED, FILE_ANY_ACCESS)
2322 #define FSCTL_IS_FILE_ON_CSV_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 151, METHOD_BUFFERED, FILE_ANY_ACCESS)
2323 
2324 #endif /*(_WIN32_WINNT >= 0x0601)*/
2325 
2326 #endif /* _FILESYSTEMFSCTL_ */
2327 
2328 
2329 #define IOCTL_VOLUME_BASE ((DWORD) 'V')
2330 
2331 #define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS CTL_CODE(IOCTL_VOLUME_BASE,0,METHOD_BUFFERED,FILE_ANY_ACCESS)
2332 #define IOCTL_VOLUME_SUPPORTS_ONLINE_OFFLINE CTL_CODE(IOCTL_VOLUME_BASE,1,METHOD_BUFFERED,FILE_ANY_ACCESS)
2333 #define IOCTL_VOLUME_ONLINE                  CTL_CODE(IOCTL_VOLUME_BASE,2,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
2334 #define IOCTL_VOLUME_OFFLINE                 CTL_CODE(IOCTL_VOLUME_BASE,3,METHOD_BUFFERED,FILE_READ_ACCESS | FILE_WRITE_ACCESS)
2335 #define IOCTL_VOLUME_IS_OFFLINE              CTL_CODE(IOCTL_VOLUME_BASE,4,METHOD_BUFFERED, FILE_ANY_ACCESS)
2336 #define IOCTL_VOLUME_IS_IO_CAPABLE           CTL_CODE(IOCTL_VOLUME_BASE,5,METHOD_BUFFERED,FILE_ANY_ACCESS)
2337 #define IOCTL_VOLUME_QUERY_FAILOVER_SET      CTL_CODE(IOCTL_VOLUME_BASE,6,METHOD_BUFFERED,FILE_ANY_ACCESS)
2338 #define IOCTL_VOLUME_QUERY_VOLUME_NUMBER     CTL_CODE(IOCTL_VOLUME_BASE,7,METHOD_BUFFERED,FILE_ANY_ACCESS)
2339 #define IOCTL_VOLUME_LOGICAL_TO_PHYSICAL     CTL_CODE(IOCTL_VOLUME_BASE,8,METHOD_BUFFERED,FILE_ANY_ACCESS)
2340 #define IOCTL_VOLUME_PHYSICAL_TO_LOGICAL     CTL_CODE(IOCTL_VOLUME_BASE,9,METHOD_BUFFERED,FILE_ANY_ACCESS)
2341 #define IOCTL_VOLUME_IS_CLUSTERED            CTL_CODE(IOCTL_VOLUME_BASE,12,METHOD_BUFFERED,FILE_ANY_ACCESS)
2342 #define IOCTL_VOLUME_GET_GPT_ATTRIBUTES      CTL_CODE(IOCTL_VOLUME_BASE,14,METHOD_BUFFERED,FILE_ANY_ACCESS)
2343 
2344 typedef struct _DISK_EXTENT {
2345   DWORD DiskNumber;
2346   LARGE_INTEGER StartingOffset;
2347   LARGE_INTEGER ExtentLength;
2348 } DISK_EXTENT,*PDISK_EXTENT;
2349 
2350 typedef struct _VOLUME_DISK_EXTENTS {
2351   DWORD NumberOfDiskExtents;
2352   DISK_EXTENT Extents[1];
2353 } VOLUME_DISK_EXTENTS,*PVOLUME_DISK_EXTENTS;
2354 
2355 #endif /* _WINIOCTL_ */
2356 
2357