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