master
  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#ifndef _INC_VIRTDISK
  7#define _INC_VIRTDISK
  8
  9#if (_WIN32_WINNT >= 0x0601)
 10#ifdef __cplusplus
 11extern "C" {
 12#endif
 13
 14#define VIRTDISKAPI DECLSPEC_IMPORT
 15
 16#define VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN     0
 17#define VIRTUAL_STORAGE_TYPE_DEVICE_ISO         1
 18#define VIRTUAL_STORAGE_TYPE_DEVICE_VHD         2
 19#if (_WIN32_WINNT >= 0x0A00)
 20#define VIRTUAL_STORAGE_TYPE_DEVICE_VHDX        3
 21#endif /* _WIN32_WINNT >= 0x0A00 */
 22
 23typedef enum _ATTACH_VIRTUAL_DISK_FLAG {
 24  ATTACH_VIRTUAL_DISK_FLAG_NONE                 = 0x00000000,
 25  ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY            = 0x00000001,
 26  ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER      = 0x00000002,
 27  ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME   = 0x00000004,
 28  ATTACH_VIRTUAL_DISK_FLAG_NO_LOCAL_HOST        = 0x00000008 
 29} ATTACH_VIRTUAL_DISK_FLAG;
 30
 31typedef enum _ATTACH_VIRTUAL_DISK_VERSION {
 32  ATTACH_VIRTUAL_DISK_VERSION_UNSPECIFIED   = 0,
 33  ATTACH_VIRTUAL_DISK_VERSION_1             = 1 
 34} ATTACH_VIRTUAL_DISK_VERSION;
 35
 36typedef enum _COMPACT_VIRTUAL_DISK_FLAG {
 37  COMPACT_VIRTUAL_DISK_FLAG_NONE   = 0x00000000 
 38} COMPACT_VIRTUAL_DISK_FLAG;
 39
 40typedef enum _COMPACT_VIRTUAL_DISK_VERSION {
 41  COMPACT_VIRTUAL_DISK_VERSION_UNSPECIFIED   = 0,
 42  COMPACT_VIRTUAL_DISK_VERSION_1             = 1 
 43} COMPACT_VIRTUAL_DISK_VERSION;
 44
 45typedef enum _CREATE_VIRTUAL_DISK_FLAG {
 46  CREATE_VIRTUAL_DISK_FLAG_NONE                       = 0x00000000,
 47  CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION   = 0x00000001
 48#if (_WIN32_WINNT >= 0x0602)
 49  ,
 50  CREATE_VIRTUAL_DISK_FLAG_PREVENT_WRITES_TO_SOURCE_DISK     = 0x2,
 51  CREATE_VIRTUAL_DISK_FLAG_DO_NOT_COPY_METADATA_FROM_PARENT  = 0x4
 52#endif /* _WIN32_WINNT >= 0x0602 */
 53} CREATE_VIRTUAL_DISK_FLAG;
 54
 55typedef enum _CREATE_VIRTUAL_DISK_VERSION {
 56  CREATE_VIRTUAL_DISK_VERSION_UNSPECIFIED   = 0,
 57  CREATE_VIRTUAL_DISK_VERSION_1             = 1
 58#if (_WIN32_WINNT >= 0x0602)
 59  ,
 60  CREATE_VIRTUAL_DISK_VERSION_2             = 2
 61#endif /* _WIN32_WINNT >= 0x0602 */
 62} CREATE_VIRTUAL_DISK_VERSION;
 63
 64typedef enum _DEPENDENT_DISK_FLAG {
 65  DEPENDENT_DISK_FLAG_NONE                   = 0x00000000,
 66  DEPENDENT_DISK_FLAG_MULT_BACKING_FILES     = 0x00000001,
 67  DEPENDENT_DISK_FLAG_FULLY_ALLOCATED        = 0x00000002,
 68  DEPENDENT_DISK_FLAG_READ_ONLY              = 0x00000004,
 69  DEPENDENT_DISK_FLAG_REMOTE                 = 0x00000008,
 70  DEPENDENT_DISK_FLAG_SYSTEM_VOLUME          = 0x00000010,
 71  DEPENDENT_DISK_FLAG_SYSTEM_VOLUME_PARENT   = 0x00000020,
 72  DEPENDENT_DISK_FLAG_REMOVABLE              = 0x00000040,
 73  DEPENDENT_DISK_FLAG_NO_DRIVE_LETTER        = 0x00000080,
 74  DEPENDENT_DISK_FLAG_PARENT                 = 0x00000100,
 75  DEPENDENT_DISK_FLAG_NO_HOST_DISK           = 0x00000200,
 76  DEPENDENT_DISK_FLAG_PERMANENT_LIFETIME     = 0x00000400 
 77} DEPENDENT_DISK_FLAG;
 78
 79typedef enum _EXPAND_VIRTUAL_DISK_VERSION {
 80  EXPAND_VIRTUAL_DISK_VERSION_UNSPECIFIED   = 0,
 81  EXPAND_VIRTUAL_DISK_VERSION_1             = 1 
 82} EXPAND_VIRTUAL_DISK_VERSION;
 83
 84typedef enum _DETACH_VIRTUAL_DISK_FLAG {
 85  DETACH_VIRTUAL_DISK_FLAG_NONE   = 0x00000000 
 86} DETACH_VIRTUAL_DISK_FLAG;
 87
 88typedef enum _EXPAND_VIRTUAL_DISK_FLAG {
 89  EXPAND_VIRTUAL_DISK_FLAG_NONE   = 0x00000000 
 90} EXPAND_VIRTUAL_DISK_FLAG;
 91
 92typedef enum _GET_STORAGE_DEPENDENCY_FLAG {
 93  GET_STORAGE_DEPENDENCY_FLAG_NONE           = 0x00000000,
 94  GET_STORAGE_DEPENDENCY_FLAG_HOST_VOLUMES   = 0x00000001,
 95  GET_STORAGE_DEPENDENCY_FLAG_DISK_HANDLE    = 0x00000002 
 96} GET_STORAGE_DEPENDENCY_FLAG;
 97
 98typedef enum _GET_VIRTUAL_DISK_INFO_VERSION {
 99  GET_VIRTUAL_DISK_INFO_UNSPECIFIED            = 0,
100  GET_VIRTUAL_DISK_INFO_SIZE                   = 1,
101  GET_VIRTUAL_DISK_INFO_IDENTIFIER             = 2,
102  GET_VIRTUAL_DISK_INFO_PARENT_LOCATION        = 3,
103  GET_VIRTUAL_DISK_INFO_PARENT_IDENTIFIER      = 4,
104  GET_VIRTUAL_DISK_INFO_PARENT_TIMESTAMP       = 5,
105  GET_VIRTUAL_DISK_INFO_VIRTUAL_STORAGE_TYPE   = 6,
106  GET_VIRTUAL_DISK_INFO_PROVIDER_SUBTYPE       = 7
107#if (_WIN32_WINNT >= 0x0602)
108  ,
109  GET_VIRTUAL_DISK_INFO_IS_4K_ALIGNED               = 8,
110  GET_VIRTUAL_DISK_INFO_PHYSICAL_DISK               = 9,
111  GET_VIRTUAL_DISK_INFO_VHD_PHYSICAL_SECTOR_SIZE    = 10,
112  GET_VIRTUAL_DISK_INFO_SMALLEST_SAFE_VIRTUAL_SIZE  = 11,
113  GET_VIRTUAL_DISK_INFO_FRAGMENTATION               = 12
114#endif /* _WIN32_WINNT >= 0x0602 */
115#if (_WIN32_WINNT >= 0x0603)
116  ,
117  GET_VIRTUAL_DISK_INFO_IS_LOADED                   = 13,
118  GET_VIRTUAL_DISK_INFO_VIRTUAL_DISK_ID             = 14
119#endif /* _WIN32_WINNT >= 0x0603 */
120#if (_WIN32_WINNT >= 0x0A00)
121  ,
122  GET_VIRTUAL_DISK_INFO_CHANGE_TRACKING_STATE       = 15
123#endif /* _WIN32_WINNT >= 0x0A00 */
124} GET_VIRTUAL_DISK_INFO_VERSION;
125
126typedef enum _MIRROR_VIRTUAL_DISK_FLAG {
127  MIRROR_VIRTUAL_DISK_FLAG_NONE           = 0x00000000,
128  MIRROR_VIRTUAL_DISK_FLAG_EXISTING_FILE  = 0x00000001
129} MIRROR_VIRTUAL_DISK_FLAG;
130
131typedef enum _MIRROR_VIRTUAL_DISK_VERSION {
132  MIRROR_VIRTUAL_DISK_VERSION_UNSPECIFIED  = 0,
133  MIRROR_VIRTUAL_DISK_VERSION_1            = 1
134} MIRROR_VIRTUAL_DISK_VERSION;
135
136typedef enum _MERGE_VIRTUAL_DISK_FLAG {
137  MERGE_VIRTUAL_DISK_FLAG_NONE   = 0x00000000 
138} MERGE_VIRTUAL_DISK_FLAG;
139
140typedef enum _MERGE_VIRTUAL_DISK_VERSION {
141  MERGE_VIRTUAL_DISK_VERSION_UNSPECIFIED   = 0,
142  MERGE_VIRTUAL_DISK_VERSION_1             = 1
143#if (_WIN32_WINNT >= 0x0602)
144  ,
145  MERGE_VIRTUAL_DISK_VERSION_2             = 2
146#endif /* _WIN32_WINNT >= 0x0A00 */
147} MERGE_VIRTUAL_DISK_VERSION;
148
149typedef enum _OPEN_VIRTUAL_DISK_FLAG {
150  OPEN_VIRTUAL_DISK_FLAG_NONE         = 0x00000000,
151  OPEN_VIRTUAL_DISK_FLAG_NO_PARENTS   = 0x00000001,
152  OPEN_VIRTUAL_DISK_FLAG_BLANK_FILE   = 0x00000002,
153  OPEN_VIRTUAL_DISK_FLAG_BOOT_DRIVE   = 0x00000004
154#if (_WIN32_WINNT >= 0x0602)
155  ,
156  OPEN_VIRTUAL_DISK_FLAG_CACHED_IO          = 0x00000008,
157  OPEN_VIRTUAL_DISK_FLAG_CUSTOM_DIFF_CHAIN  = 0x00000010
158#endif /* _WIN32_WINNT >= 0x0602 */
159} OPEN_VIRTUAL_DISK_FLAG;
160
161typedef enum _OPEN_VIRTUAL_DISK_VERSION {
162  OPEN_VIRTUAL_DISK_VERSION_UNSPECIFIED   = 0,
163  OPEN_VIRTUAL_DISK_VERSION_1             = 1
164#if (_WIN32_WINNT >= 0x0602)
165  ,
166  OPEN_VIRTUAL_DISK_VERSION_2             = 2
167#endif /* _WIN32_WINNT >= 0x0602 */
168} OPEN_VIRTUAL_DISK_VERSION;
169
170typedef enum _SET_VIRTUAL_DISK_INFO_VERSION {
171  SET_VIRTUAL_DISK_INFO_UNSPECIFIED   = 0,
172  SET_VIRTUAL_DISK_INFO_PARENT_PATH   = 1,
173  SET_VIRTUAL_DISK_INFO_IDENTIFIER    = 2
174#if (_WIN32_WINNT >= 0x0602)
175  ,
176  SET_VIRTUAL_DISK_INFO_PARENT_PATH_WITH_DEPTH  = 3,
177  SET_VIRTUAL_DISK_INFO_PHYSICAL_SECTOR_SIZE    = 4
178#endif /* (_WIN32_WINNT >= 0x0602) */
179#if (_WIN32_WINNT >= 0x0603)
180  ,
181  SET_VIRTUAL_DISK_INFO_VIRTUAL_DISK_ID         = 5
182#endif /* (_WIN32_WINNT >= 0x0603) */
183#if (_WIN32_WINNT >= 0x0A00)
184  ,
185  SET_VIRTUAL_DISK_INFO_CHANGE_TRACKING_STATE   = 6,
186  SET_VIRTUAL_DISK_INFO_PARENT_LOCATOR          = 7
187#endif /* (_WIN32_WINNT >= 0x0A00) */
188} SET_VIRTUAL_DISK_INFO_VERSION;
189
190typedef enum _STORAGE_DEPENDENCY_INFO_VERSION {
191  STORAGE_DEPENDENCY_INFO_VERSION_UNSPECIFIED   = 0,
192  STORAGE_DEPENDENCY_INFO_VERSION_1             = 1,
193  STORAGE_DEPENDENCY_INFO_VERSION_2             = 2 
194} STORAGE_DEPENDENCY_INFO_VERSION;
195
196typedef enum _VIRTUAL_DISK_ACCESS_MASK {
197  VIRTUAL_DISK_ACCESS_NONE        = 0x00000000,
198  VIRTUAL_DISK_ACCESS_ATTACH_RO   = 0x00010000,
199  VIRTUAL_DISK_ACCESS_ATTACH_RW   = 0x00020000,
200  VIRTUAL_DISK_ACCESS_DETACH      = 0x00040000,
201  VIRTUAL_DISK_ACCESS_GET_INFO    = 0x00080000,
202  VIRTUAL_DISK_ACCESS_CREATE      = 0x00100000,
203  VIRTUAL_DISK_ACCESS_METAOPS     = 0x00200000,
204  VIRTUAL_DISK_ACCESS_READ        = 0x000d0000,
205  VIRTUAL_DISK_ACCESS_ALL         = 0x003f0000,
206  VIRTUAL_DISK_ACCESS_WRITABLE    = 0x00320000 
207} VIRTUAL_DISK_ACCESS_MASK;
208
209#if (_WIN32_WINNT >= 0x0602)
210
211typedef enum _RESIZE_VIRTUAL_DISK_FLAG {
212  RESIZE_VIRTUAL_DISK_FLAG_NONE                                  = 0x0,
213  RESIZE_VIRTUAL_DISK_FLAG_ALLOW_UNSAFE_VIRTUAL_SIZE             = 0x1,
214  RESIZE_VIRTUAL_DISK_FLAG_RESIZE_TO_SMALLEST_SAFE_VIRTUAL_SIZE  = 0x2
215} RESIZE_VIRTUAL_DISK_FLAG;
216
217typedef enum _RESIZE_VIRTUAL_DISK_VERSION {
218  RESIZE_VIRTUAL_DISK_VERSION_UNSPECIFIED  = 0,
219  RESIZE_VIRTUAL_DISK_VERSION_1            = 1
220} RESIZE_VIRTUAL_DISK_VERSION;
221
222#endif /* (_WIN32_WINNT >= 0x0602) */
223#if (_WIN32_WINNT >= 0x0A00)
224
225typedef enum _APPLY_SNAPSHOT_VHDSET_FLAG {
226  APPLY_SNAPSHOT_VHDSET_FLAG_NONE       = 0x00000000,
227  APPLY_SNAPSHOT_VHDSET_FLAG_WRITEABLE  = 0x00000001
228} APPLY_SNAPSHOT_VHDSET_FLAG, *PAPPLY_SNAPSHOT_VHDSET_FLAG;
229
230typedef enum _APPLY_SNAPSHOT_VHDSET_VERSION {
231  APPLY_SNAPSHOT_VHDSET_VERSION_UNSPECIFIED   = 0,
232  APPLY_SNAPSHOT_VHDSET_VERSION_1             = 1
233} APPLY_SNAPSHOT_VHDSET_VERSION;
234
235typedef enum _DELETE_SNAPSHOT_VHDSET_FLAG {
236  DELETE_SNAPSHOT_VHDSET_FLAG_NONE         = 0x00000000,
237  DELETE_SNAPSHOT_VHDSET_FLAG_PERSIST_RCT  = 0x00000001
238} DELETE_SNAPSHOT_VHDSET_FLAG, *PDELETE_SNAPSHOT_VHDSET_FLAG;
239
240typedef enum _DELETE_SNAPSHOT_VHDSET_VERSION {
241  DELETE_SNAPSHOT_VHDSET_VERSION_UNSPECIFIED  = 0x00000000,
242  DELETE_SNAPSHOT_VHDSET_VERSION_1            = 0x00000001
243} DELETE_SNAPSHOT_VHDSET_VERSION, *PDELETE_SNAPSHOT_VHDSET_VERSION;
244
245typedef enum _MODIFY_VHDSET_FLAG {
246  MODIFY_VHDSET_FLAG_NONE  = 0x00000000
247} MODIFY_VHDSET_FLAG, *PMODIFY_VHDSET_FLAG;
248
249typedef enum _MODIFY_VHDSET_VERSION {
250  MODIFY_VHDSET_UNSPECIFIED            = 0,
251  MODIFY_VHDSET_SNAPSHOT_PATH          = 1,
252  MODIFY_VHDSET_REMOVE_SNAPSHOT        = 2,
253  MODIFY_VHDSET_DEFAULT_SNAPSHOT_PATH  = 3
254} MODIFY_VHDSET_VERSION, *PMODIFY_VHDSET_VERSION;
255
256typedef enum _QUERY_CHANGES_VIRTUAL_DISK_FLAG {
257  QUERY_CHANGES_VIRTUAL_DISK_FLAG_NONE = 0x00000000
258} QUERY_CHANGES_VIRTUAL_DISK_FLAG;
259
260typedef enum _TAKE_SNAPSHOT_VHDSET_FLAG {
261   TAKE_SNAPSHOT_VHDSET_FLAG_NONE  = 0x00000000
262} TAKE_SNAPSHOT_VHDSET_FLAG, *PTAKE_SNAPSHOT_VHDSET_FLAG;
263
264typedef enum _TAKE_SNAPSHOT_VHDSET_VERSION {
265  TAKE_SNAPSHOT_VHDSET_VERSION_UNSPECIFIED  = 0,
266   TAKE_SNAPSHOT_VHDSET_VERSION_1           = 1
267} TAKE_SNAPSHOT_VHDSET_VERSION;
268
269#endif /* _WIN32_WINNT >= 0x0A00 */
270
271typedef struct _VIRTUAL_STORAGE_TYPE {
272  ULONG DeviceId;
273  GUID  VendorId;
274} VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;
275
276typedef struct _ATTACH_VIRTUAL_DISK_PARAMETERS {
277  ATTACH_VIRTUAL_DISK_VERSION Version;
278  __C89_NAMELESS union {
279    struct {
280      ULONG Reserved;
281    } Version1;
282  } DUMMYUNIONNAME;
283} ATTACH_VIRTUAL_DISK_PARAMETERS, *PATTACH_VIRTUAL_DISK_PARAMETERS;
284
285typedef struct _COMPACT_VIRTUAL_DISK_PARAMETERS {
286  COMPACT_VIRTUAL_DISK_VERSION Version;
287  __C89_NAMELESS union {
288    struct {
289      ULONG Reserved;
290    } Version1;
291  } DUMMYUNIONNAME;
292} COMPACT_VIRTUAL_DISK_PARAMETERS, *PCOMPACT_VIRTUAL_DISK_PARAMETERS;
293
294typedef struct _CREATE_VIRTUAL_DISK_PARAMETERS {
295  CREATE_VIRTUAL_DISK_VERSION Version;
296  __C89_NAMELESS union {
297    struct {
298      GUID      UniqueId;
299      ULONGLONG MaximumSize;
300      ULONG     BlockSizeInBytes;
301      ULONG     SectorSizeInBytes;
302      PCWSTR    ParentPath;
303      PCWSTR    SourcePath;
304    } Version1;
305#if (_WIN32_WINNT >= 0x0602)
306    struct {
307      GUID                   UniqueId;
308      ULONGLONG              MaximumSize;
309      ULONG                  BlockSizeInBytes;
310      ULONG                  SectorSizeInBytes;
311      ULONG                  PhysicalSectorSizeInBytes;
312      PCWSTR                 ParentPath;
313      PCWSTR                 SourcePath;
314      OPEN_VIRTUAL_DISK_FLAG OpenFlags;
315      VIRTUAL_STORAGE_TYPE   ParentVirtualStorageType;
316      VIRTUAL_STORAGE_TYPE   SourceVirtualStorageType;
317      GUID                   ResiliencyGuid;
318    } Version2;
319#endif /* _WIN32_WINNT >= 0x0602 */
320  } DUMMYUNIONNAME;
321} CREATE_VIRTUAL_DISK_PARAMETERS, *PCREATE_VIRTUAL_DISK_PARAMETERS;
322
323typedef struct _EXPAND_VIRTUAL_DISK_PARAMETERS {
324  EXPAND_VIRTUAL_DISK_VERSION Version;
325  __C89_NAMELESS union {
326    struct {
327      ULONGLONG NewSize;
328    } Version1;
329  } DUMMYUNIONNAME;
330} EXPAND_VIRTUAL_DISK_PARAMETERS, *PEXPAND_VIRTUAL_DISK_PARAMETERS;
331
332typedef struct _GET_VIRTUAL_DISK_INFO {
333  GET_VIRTUAL_DISK_INFO_VERSION Version;
334  __C89_NAMELESS union {
335    struct {
336      ULONGLONG VirtualSize;
337      ULONGLONG PhysicalSize;
338      ULONG     BlockSize;
339      ULONG     SectorSize;
340    } Size;
341    GUID                 Identifier;
342    struct {
343      WINBOOL  ParentResolved;
344      WCHAR ParentLocationBuffer[1];
345    } ParentLocation;
346    GUID                 ParentIdentifier;
347    ULONG                ParentTimestamp;
348    VIRTUAL_STORAGE_TYPE VirtualStorageType;
349    ULONG                ProviderSubtype;
350#if (_WIN32_WINNT >= 0x0602)
351    WINBOOL              Is4kAligned;
352    WINBOOL              IsLoaded;
353    struct {
354      ULONG LogicalSectorSize;
355      ULONG PhysicalSectorSize;
356      WINBOOL  IsRemote;
357    } PhysicalDisk;
358    ULONG                VhdPhysicalSectorSize;
359    ULONGLONG            SmallestSafeVirtualSize;
360    ULONG                FragmentationPercentage;
361#endif /* _WIN32_WINNT >= 0x0602 */
362#if (_WIN32_WINNT >= 0x0603)
363    GUID                 VirtualDiskId;
364    struct {
365      WINBOOL Enabled;
366      WINBOOL NewerChanges;
367      WCHAR MostRecentId[1];
368    } ChangeTrackingState;
369#endif /* _WIN32_WINNT >= 0x0603 */
370  } DUMMYUNIONNAME;
371} GET_VIRTUAL_DISK_INFO, *PGET_VIRTUAL_DISK_INFO;
372
373typedef struct _MERGE_VIRTUAL_DISK_PARAMETERS {
374  MERGE_VIRTUAL_DISK_VERSION Version;
375  __C89_NAMELESS union {
376    struct {
377      ULONG MergeDepth;
378    } Version1;
379#if (_WIN32_WINNT >= 0x0602)
380    struct {
381      ULONG MergeSourceDepth;
382      ULONG MergeTargetDepth;
383    } Version2;
384#endif /* _WIN32_WINNT >= 0x0602 */
385  } DUMMYUNIONNAME;
386} MERGE_VIRTUAL_DISK_PARAMETERS, *PMERGE_VIRTUAL_DISK_PARAMETERS;
387
388typedef struct _OPEN_VIRTUAL_DISK_PARAMETERS {
389  OPEN_VIRTUAL_DISK_VERSION Version;
390  __C89_NAMELESS union {
391    struct {
392      ULONG RWDepth;
393    } Version1;
394#if (_WIN32_WINNT >= 0x0602)
395    struct {
396      WINBOOL GetInfoOnly;
397      WINBOOL ReadOnly;
398      GUID ResiliencyGuid;
399    } Version2;
400#endif /* _WIN32_WINNT >= 0x0602 */
401  } DUMMYUNIONNAME;
402} OPEN_VIRTUAL_DISK_PARAMETERS, *POPEN_VIRTUAL_DISK_PARAMETERS;
403
404typedef struct _SET_VIRTUAL_DISK_INFO {
405  SET_VIRTUAL_DISK_INFO_VERSION Version;
406  __C89_NAMELESS union {
407    PCWSTR ParentFilePath;
408    GUID   UniqueIdentifier;
409#if (_WIN32_WINNT >= 0x0602)
410    struct {
411      ULONG  ChildDepth;
412      PCWSTR ParentFilePath;
413    } ParentPathWithDepthInfo;
414    ULONG  VhdPhysicalSectorSize;
415    GUID   VirtualDiskId;
416#endif /* _WIN32_WINNT >= 0x0602 */
417#if (_WIN32_WINNT >= 0x0603)
418    WINBOOL ChangeTrackingEnabled;
419    struct {
420      GUID   LinkageId;
421      PCWSTR ParentFilePath;
422    } ParentLocator;
423#endif /* _WIN32_WINNT >= 0x0603 */
424  } DUMMYUNIONNAME;
425} SET_VIRTUAL_DISK_INFO, *PSET_VIRTUAL_DISK_INFO;
426
427typedef struct _STORAGE_DEPENDENCY_INFO_TYPE_1 {
428  DEPENDENT_DISK_FLAG  DependencyTypeFlags;
429  ULONG                ProviderSpecificFlags;
430  VIRTUAL_STORAGE_TYPE VirtualStorageType;
431} STORAGE_DEPENDENCY_INFO_TYPE_1, *PSTORAGE_DEPENDENCY_INFO_TYPE_1;
432
433typedef struct _STORAGE_DEPENDENCY_INFO_TYPE_2 {
434  DEPENDENT_DISK_FLAG  DependencyTypeFlags;
435  ULONG                ProviderSpecificFlags;
436  VIRTUAL_STORAGE_TYPE VirtualStorageType;
437  ULONG                AncestorLevel;
438  PWSTR                DependencyDeviceName;
439  PWSTR                HostVolumeName;
440  PWSTR                DependentVolumeName;
441  PWSTR                DependentVolumeRelativePath;
442} STORAGE_DEPENDENCY_INFO_TYPE_2, *PSTORAGE_DEPENDENCY_INFO_TYPE_2;
443
444/* Fixme: Suppress GCC errors about "error: flexible array member in union" */
445
446typedef struct _STORAGE_DEPENDENCY_INFO {
447  STORAGE_DEPENDENCY_INFO_VERSION Version;
448  ULONG                           NumberEntries;
449  __C89_NAMELESS union {
450    STORAGE_DEPENDENCY_INFO_TYPE_1 Version1Entries[1];
451    STORAGE_DEPENDENCY_INFO_TYPE_2 Version2Entries[1];
452  } DUMMYUNIONNAME;
453} STORAGE_DEPENDENCY_INFO, *PSTORAGE_DEPENDENCY_INFO;
454
455typedef struct _VIRTUAL_DISK_PROGRESS {
456  DWORD     OperationStatus;
457  ULONGLONG CurrentValue;
458  ULONGLONG CompletionValue;
459} VIRTUAL_DISK_PROGRESS, *PVIRTUAL_DISK_PROGRESS;
460
461#if (_WIN32_WINNT >= 0x0602)
462
463typedef struct _MIRROR_VIRTUAL_DISK_PARAMETERS {
464  MIRROR_VIRTUAL_DISK_VERSION Version;
465  __C89_NAMELESS union {
466    struct {
467      PCWSTR MirrorVirtualDiskPath;
468    } Version1;
469  } DUMMYUNIONNAME;
470} MIRROR_VIRTUAL_DISK_PARAMETERS, *PMIRROR_VIRTUAL_DISK_PARAMETERS;
471
472typedef struct _RESIZE_VIRTUAL_DISK_PARAMETERS {
473  RESIZE_VIRTUAL_DISK_VERSION Version;
474  __C89_NAMELESS union {
475    struct {
476      ULONGLONG NewSize;
477    } Version1;
478  } DUMMYUNIONNAME;
479} RESIZE_VIRTUAL_DISK_PARAMETERS, *PRESIZE_VIRTUAL_DISK_PARAMETERS;
480
481#endif /* _WIN32_WINNT >= 0x0602 */
482
483#if (_WIN32_WINNT >= 0x0A00)
484
485typedef struct _APPLY_SNAPSHOT_VHDSET_PARAMETERS {
486  APPLY_SNAPSHOT_VHDSET_VERSION Version;
487  __C89_NAMELESS union {
488    struct {
489      GUID  SnapshotId;
490      GUID  LeafSnapshotId;
491    } Version1;
492  } DUMMYUNIONNAME;
493} APPLY_SNAPSHOT_VHDSET_PARAMETERS, *PAPPLY_SNAPSHOT_VHDSET_PARAMETERS;
494
495typedef struct _DELETE_SNAPSHOT_VHDSET_PARAMETERS {
496  DELETE_SNAPSHOT_VHDSET_VERSION Version;
497  __C89_NAMELESS union {
498    struct {
499      GUID SnapshotId;
500    } Version1;
501  } DUMMYUNIONNAME;
502} DELETE_SNAPSHOT_VHDSET_PARAMETERS, *PDELETE_SNAPSHOT_VHDSET_PARAMETERS;
503
504typedef struct _MODIFY_VHDSET_PARAMETERS {
505  MODIFY_VHDSET_VERSION Version;
506  __C89_NAMELESS union {
507    struct {
508      GUID   SnapshotId;
509      PCWSTR SnapshotFilePath;
510    } SnapshotPath;
511    GUID   SnapshotId;
512    PCWSTR DefaultFilePath;
513  } DUMMYUNIONNAME;
514} MODIFY_VHDSET_PARAMETERS, *PMODIFY_VHDSET_PARAMETERS;
515
516typedef struct _QUERY_CHANGES_VIRTUAL_DISK_RANGE {
517  ULONG64 ByteOffset;
518  ULONG64 ByteLength;
519  ULONG64 Reserved;
520} QUERY_CHANGES_VIRTUAL_DISK_RANGE, *PQUERY_CHANGES_VIRTUAL_DISK_RANGE;
521
522typedef struct _TAKE_SNAPSHOT_VHDSET_PARAMETERS {
523  TAKE_SNAPSHOT_VHDSET_VERSION Version;
524  __C89_NAMELESS union {
525    struct {
526      GUID SnapshotId;
527    } Version1;
528  } DUMMYUNIONNAME;
529} TAKE_SNAPSHOT_VHDSET_PARAMETERS, *PTAKE_SNAPSHOT_VHDSET_PARAMETERS;
530
531#endif /* _WIN32_WINNT >= 0x0A00 */
532
533DEFINE_GUID(VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN,0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
534DEFINE_GUID(VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT,0xEC984AEC,0xA0F9,0x47e9,0x90,0x1F,0x71,0x41,0x5A,0x66,0x34,0x5B);
535
536VIRTDISKAPI DWORD WINAPI AttachVirtualDisk(HANDLE VirtualDiskHandle, PSECURITY_DESCRIPTOR SecurityDescriptor, ATTACH_VIRTUAL_DISK_FLAG Flags, ULONG ProviderSpecificFlags, PATTACH_VIRTUAL_DISK_PARAMETERS Parameters, LPOVERLAPPED Overlapped);
537VIRTDISKAPI DWORD WINAPI CompactVirtualDisk(HANDLE VirtualDiskHandle, COMPACT_VIRTUAL_DISK_FLAG Flags, PCOMPACT_VIRTUAL_DISK_PARAMETERS Parameters, LPOVERLAPPED Overlapped);
538VIRTDISKAPI DWORD WINAPI CreateVirtualDisk(PVIRTUAL_STORAGE_TYPE VirtualStorageType, PCWSTR Path, VIRTUAL_DISK_ACCESS_MASK VirtualDiskAccessMask, PSECURITY_DESCRIPTOR SecurityDescriptor, CREATE_VIRTUAL_DISK_FLAG Flags, ULONG ProviderSpecificFlags, PCREATE_VIRTUAL_DISK_PARAMETERS Parameters, LPOVERLAPPED Overlapped, PHANDLE Handle);
539VIRTDISKAPI DWORD WINAPI DetachVirtualDisk(HANDLE VirtualDiskHandle, DETACH_VIRTUAL_DISK_FLAG Flags, ULONG ProviderSpecificFlags);
540VIRTDISKAPI DWORD WINAPI ExpandVirtualDisk(HANDLE VirtualDiskHandle, EXPAND_VIRTUAL_DISK_FLAG Flags, PEXPAND_VIRTUAL_DISK_PARAMETERS Parameters, LPOVERLAPPED Overlapped);
541VIRTDISKAPI DWORD WINAPI GetStorageDependencyInformation(HANDLE ObjectHandle, GET_STORAGE_DEPENDENCY_FLAG Flags, ULONG StorageDependencyInfoSize, PSTORAGE_DEPENDENCY_INFO StorageDependencyInfo, PULONG SizeUsed);
542VIRTDISKAPI DWORD WINAPI GetVirtualDiskInformation(HANDLE VirtualDiskHandle, PULONG VirtualDiskInfoSize, PGET_VIRTUAL_DISK_INFO VirtualDiskInfo, PULONG SizeUsed);
543VIRTDISKAPI DWORD WINAPI GetVirtualDiskOperationProgress(HANDLE VirtualDiskHandle, LPOVERLAPPED Overlapped, PVIRTUAL_DISK_PROGRESS Progress);
544VIRTDISKAPI DWORD WINAPI GetVirtualDiskPhysicalPath(HANDLE VirtualDiskHandle, PULONG DiskPathSizeInBytes, PWSTR DiskPath);
545VIRTDISKAPI DWORD WINAPI MergeVirtualDisk(HANDLE VirtualDiskHandle, MERGE_VIRTUAL_DISK_FLAG Flags, PMERGE_VIRTUAL_DISK_PARAMETERS Parameters, LPOVERLAPPED Overlapped);
546VIRTDISKAPI DWORD WINAPI OpenVirtualDisk(PVIRTUAL_STORAGE_TYPE VirtualStorageType, PCWSTR Path, VIRTUAL_DISK_ACCESS_MASK VirtualDiskAccessMask, OPEN_VIRTUAL_DISK_FLAG Flags, POPEN_VIRTUAL_DISK_PARAMETERS Parameters, PHANDLE Handle);
547VIRTDISKAPI DWORD WINAPI SetVirtualDiskInformation(HANDLE VirtualDiskHandle, PSET_VIRTUAL_DISK_INFO VirtualDiskInfo);
548
549#if (_WIN32_WINNT >= 0x0602)
550
551VIRTDISKAPI DWORD WINAPI AddVirtualDiskParent(HANDLE VirtualDiskHandle, PCWSTR ParentPath);
552VIRTDISKAPI DWORD WINAPI BreakMirrorVirtualDisk(HANDLE VirtualDiskHandle);
553VIRTDISKAPI DWORD WINAPI DeleteVirtualDiskMetadata(HANDLE VirtualDiskHandle, LPGUID Item);
554VIRTDISKAPI DWORD WINAPI EnumerateVirtualDiskMetadata(HANDLE VirtualDiskHandle, PULONG NumberOfItems, GUID *Items);
555VIRTDISKAPI DWORD WINAPI GetVirtualDiskMetadata(HANDLE VirtualDiskHandle, LPGUID Item, PULONG MetaDataSize, PVOID MetaData);
556VIRTDISKAPI DWORD WINAPI MirrorVirtualDisk(HANDLE VirtualDiskHandle, MIRROR_VIRTUAL_DISK_FLAG Flags, PMIRROR_VIRTUAL_DISK_PARAMETERS Parameters, LPOVERLAPPED Overlapped);
557VIRTDISKAPI DWORD WINAPI ResizeVirtualDisk(HANDLE VirtualDiskHandle, RESIZE_VIRTUAL_DISK_FLAG Flags, PRESIZE_VIRTUAL_DISK_PARAMETERS Parameters, LPOVERLAPPED Overlapped);
558VIRTDISKAPI DWORD WINAPI SetVirtualDiskMetadata(HANDLE VirtualDiskHandle, LPGUID Item, ULONG MetaDataSize, PVOID MetaData);
559
560#endif /* _WIN32_WINNT >= 0x0602 */
561
562#if (_WIN32_WINNT >= 0x0A00)
563
564VIRTDISKAPI DWORD WINAPI ApplySnapshotVhdSet(HANDLE VirtualDiskHandle, const PAPPLY_SNAPSHOT_VHDSET_PARAMETERS Parameters, APPLY_SNAPSHOT_VHDSET_FLAG Flags);
565VIRTDISKAPI DWORD WINAPI DeleteSnapshotVhdSet(HANDLE VirtualDiskHandle, const PDELETE_SNAPSHOT_VHDSET_PARAMETERS Parameters, DELETE_SNAPSHOT_VHDSET_FLAG Flags);
566VIRTDISKAPI DWORD WINAPI ModifyVhdSet(HANDLE VirtualDiskHandle, const PMODIFY_VHDSET_PARAMETERS Parameters, MODIFY_VHDSET_FLAG Flags);
567VIRTDISKAPI DWORD WINAPI QueryChangesVirtualDisk(HANDLE VirtualDiskHandle, PCWSTR ChangeTrackingId, ULONG64 ByteOffset, ULONG64 ByteLength, QUERY_CHANGES_VIRTUAL_DISK_FLAG Flags, PQUERY_CHANGES_VIRTUAL_DISK_RANGE Ranges, PULONG RangeCount, PULONG64 ProcessedLength);
568VIRTDISKAPI WINAPI DWORD TakeSnapshotVhdSet(HANDLE VirtualDiskHandle, const PTAKE_SNAPSHOT_VHDSET_PARAMETERS Parameters, TAKE_SNAPSHOT_VHDSET_FLAG Flags);
569
570#endif /* _WIN32_WINNT >= 0x0A00 */
571#ifdef __cplusplus
572}
573#endif
574#endif /*(_WIN32_WINNT >= 0x0601)*/
575#endif /*_INC_VIRTDISK*/