Trying To work With VirtDisk.dll For attaching ISO And VHD(X)
Unfortunately receiving errorcode 87 And 6
Doesn't accept Params
Thanx For any hint
Code: Select all
; https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/dd323700(v=vs.85)
; https://docs.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-takesnapshotvhdset
;{ Constants
Enumeration ;{ APPLY_SNAPSHOT_VHDSET_FLAG
#APPLY_SNAPSHOT_VHDSET_FLAG_NONE = 0
#APPLY_SNAPSHOT_VHDSET_FLAG_WRITEABLE = 1
EndEnumeration
Macro APPLY_SNAPSHOT_VHDSET_FLAG
Long
EndMacro
*PAPPLY_SNAPSHOT_VHDSET_FLAG.APPLY_SNAPSHOT_VHDSET_FLAG;}
Enumeration ;{ APPLY_SNAPSHOT_VHDSET_VERSION
#APPLY_SNAPSHOT_VHDSET_VERSION_UNSPECIFIED = 0
#APPLY_SNAPSHOT_VHDSET_VERSION_1 = 1 ;Indicates that the snapshot to be applied was created as a writeable snapshot type.
EndEnumeration
Macro APPLY_SNAPSHOT_VHDSET_VERSION
Long
EndMacro
;}
Enumeration ;{ ATTACH_VIRTUAL_DISK_FLAG
#ATTACH_VIRTUAL_DISK_FLAG_NONE ;No flags. Use system defaults, Not supported For ISO virtual disks. ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY must be specified.
#ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY ;Attach as read-only. Win7 & WinServer2K8R2: This flag is Not supported For opening ISO virtual disks Until Windows 8 And Windows Server 2012.
#ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER ;No drive letters are assigned to the disk's volumes. Windows 7 And Windows Server 2008 R2: This flag is Not supported For opening ISO virtual disks Until Windows 8 And Windows Server 2012.
#ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME ;Will decouple the virtual disk lifetime from that of the VirtualDiskHandle. The virtual disk will be attached until the DetachVirtualDisk function is called, even if all open handles to the virtual disk are closed. Windows 7 and Windows Server 2008 R2: This flag is not supported for opening ISO virtual disks until Windows 8 and Windows Server 2012.
#ATTACH_VIRTUAL_DISK_FLAG_NO_LOCAL_HOST ;Reserved. This flag is Not supported For ISO virtual disks.
#ATTACH_VIRTUAL_DISK_FLAG_NO_SECURITY_DESCRIPTOR
#ATTACH_VIRTUAL_DISK_FLAG_BYPASS_DEFAULT_ENCRYPTION_POLICY
#ATTACH_VIRTUAL_DISK_FLAG_NON_PNP
#ATTACH_VIRTUAL_DISK_FLAG_RESTRICTED_RANGE
#ATTACH_VIRTUAL_DISK_FLAG_SINGLE_PARTITION
#ATTACH_VIRTUAL_DISK_FLAG_REGISTER_VOLUME
EndEnumeration
Macro ATTACH_VIRTUAL_DISK_FLAG
Long
EndMacro
;}
Enumeration ;{ ATTACH_VIRTUAL_DISK_VERSION
#ATTACH_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0
#ATTACH_VIRTUAL_DISK_VERSION_1 = 1
#ATTACH_VIRTUAL_DISK_VERSION_2 = 2
EndEnumeration
Macro ATTACH_VIRTUAL_DISK_VERSION
Long
EndMacro
;}
Enumeration ;{ COMPACT_VIRTUAL_DISK_FLAG
#COMPACT_VIRTUAL_DISK_FLAG_NONE
#COMPACT_VIRTUAL_DISK_FLAG_NO_ZERO_SCAN
#COMPACT_VIRTUAL_DISK_FLAG_NO_BLOCK_MOVES
EndEnumeration
Macro COMPACT_VIRTUAL_DISK_FLAG
Long
EndMacro
;}
Enumeration ;{ COMPACT_VIRTUAL_DISK_VERSION
#COMPACT_VIRTUAL_DISK_VERSION_UNSPECIFIED
#COMPACT_VIRTUAL_DISK_VERSION_1
EndEnumeration
Macro COMPACT_VIRTUAL_DISK_VERSION
Long
EndMacro
;}
Enumeration ;{ CREATE_VIRTUAL_DISK_FLAG
; The CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION flag is used For the creation of a fixed VHD.
#CREATE_VIRTUAL_DISK_FLAG_NONE ;No special creation conditions; system defaults are used.
#CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION ;Pre-allocate all physical space necessary for the size of the virtual disk.
#CREATE_VIRTUAL_DISK_FLAG_PREVENT_WRITES_TO_SOURCE_DISK ;Take ownership of the source disk during create from source disk, to insure the source disk does not change during the create operation. The source disk must also already be offline or read-only (or both). Ownership is released when create is done. This also has a side-effect of disallowing concurrent create from same source disk. Create will fail if ownership cannot be obtained or if the source disk is not already offline or read-only. This flag is optional, but highly recommended for creates from source disk. No effect for other types of create (no effect for create from source VHD; no effect for create without SourcePath). Windows 7 and Windows Server 2008 R2: This flag is not supported for opening ISO virtual disks until Windows 8 and Windows Server 2012.
#CREATE_VIRTUAL_DISK_FLAG_DO_NOT_COPY_METADATA_FROM_PARENT ;Do not copy initial virtual disk metadata or block states from the parent VHD; this is useful if the parent VHD is a stand-in file and the real parent will be explicitly set later. Windows 7 and Windows Server 2008 R2: This flag is not supported for opening ISO virtual disks until Windows 8 and Windows Server 2012.
#CREATE_VIRTUAL_DISK_FLAG_CREATE_BACKING_STORAGE ;
#CREATE_VIRTUAL_DISK_FLAG_USE_CHANGE_TRACKING_SOURCE_LIMIT
#CREATE_VIRTUAL_DISK_FLAG_PRESERVE_PARENT_CHANGE_TRACKING_STATE
#CREATE_VIRTUAL_DISK_FLAG_VHD_SET_USE_ORIGINAL_BACKING_STORAGE
#CREATE_VIRTUAL_DISK_FLAG_SPARSE_FILE
#CREATE_VIRTUAL_DISK_FLAG_PMEM_COMPATIBLE
EndEnumeration
Macro CREATE_VIRTUAL_DISK_FLAG
Long
EndMacro
;}
Enumeration ;{ CREATE_VIRTUAL_DISK_VERSION
#CREATE_VIRTUAL_DISK_VERSION_UNSPECIFIED
#CREATE_VIRTUAL_DISK_VERSION_1
#CREATE_VIRTUAL_DISK_VERSION_2
#CREATE_VIRTUAL_DISK_VERSION_3
#CREATE_VIRTUAL_DISK_VERSION_4
EndEnumeration
Macro CREATE_VIRTUAL_DISK_VERSION
Long
EndMacro
;}
Enumeration ;{ DELETE_SNAPSHOT_VHDSET_FLAG
#DELETE_SNAPSHOT_VHDSET_FLAG_NONE
#DELETE_SNAPSHOT_VHDSET_FLAG_PERSIST_RCT
EndEnumeration
Macro DELETE_SNAPSHOT_VHDSET_FLAG
Long
EndMacro
;}
Enumeration ;{ DELETE_SNAPSHOT_VHDSET_VERSION
#DELETE_SNAPSHOT_VHDSET_VERSION_UNSPECIFIED
#DELETE_SNAPSHOT_VHDSET_VERSION_1
EndEnumeration
Macro DELETE_SNAPSHOT_VHDSET_VERSION
Long
EndMacro
;}
Enumeration ;{ DEPENDENT_DISK_FLAG
#DEPENDENT_DISK_FLAG_NONE
#DEPENDENT_DISK_FLAG_MULT_BACKING_FILES
#DEPENDENT_DISK_FLAG_FULLY_ALLOCATED
#DEPENDENT_DISK_FLAG_READ_ONLY
#DEPENDENT_DISK_FLAG_REMOTE
#DEPENDENT_DISK_FLAG_SYSTEM_VOLUME
#DEPENDENT_DISK_FLAG_SYSTEM_VOLUME_PARENT
#DEPENDENT_DISK_FLAG_REMOVABLE
#DEPENDENT_DISK_FLAG_NO_DRIVE_LETTER
#DEPENDENT_DISK_FLAG_PARENT
#DEPENDENT_DISK_FLAG_NO_HOST_DISK
#DEPENDENT_DISK_FLAG_PERMANENT_LIFETIME
EndEnumeration
Macro DEPENDENT_DISK_FLAG
Long
EndMacro
;}
Enumeration ;{ DETACH_VIRTUAL_DISK_FLAG
#DETACH_VIRTUAL_DISK_FLAG_NONE
EndEnumeration
Macro DETACH_VIRTUAL_DISK_FLAG
Long
EndMacro
;}
Enumeration ;{ EXPAND_VIRTUAL_DISK_FLAG
#EXPAND_VIRTUAL_DISK_FLAG_NONE
EndEnumeration
Macro EXPAND_VIRTUAL_DISK_FLAG
Long
EndMacro
;}
Enumeration ;{ EXPAND_VIRTUAL_DISK_VERSION
#EXPAND_VIRTUAL_DISK_VERSION_UNSPECIFIED
#EXPAND_VIRTUAL_DISK_VERSION_1
EndEnumeration
Macro EXPAND_VIRTUAL_DISK_VERSION
Long
EndMacro
;}
Enumeration ;{ GET_STORAGE_DEPENDENCY_FLAG
#GET_STORAGE_DEPENDENCY_FLAG_NONE
#GET_STORAGE_DEPENDENCY_FLAG_HOST_VOLUMES
#GET_STORAGE_DEPENDENCY_FLAG_DISK_HANDLE
EndEnumeration
Macro GET_STORAGE_DEPENDENCY_FLAG
Long
EndMacro
;}
Enumeration ;{ GET_VIRTUAL_DISK_INFO_VERSION
#GET_VIRTUAL_DISK_INFO_UNSPECIFIED
#GET_VIRTUAL_DISK_INFO_SIZE
#GET_VIRTUAL_DISK_INFO_IDENTIFIER
#GET_VIRTUAL_DISK_INFO_PARENT_LOCATION
#GET_VIRTUAL_DISK_INFO_PARENT_IDENTIFIER
#GET_VIRTUAL_DISK_INFO_PARENT_TIMESTAMP
#GET_VIRTUAL_DISK_INFO_VIRTUAL_STORAGE_TYPE
#GET_VIRTUAL_DISK_INFO_PROVIDER_SUBTYPE
#GET_VIRTUAL_DISK_INFO_IS_4K_ALIGNED
#GET_VIRTUAL_DISK_INFO_PHYSICAL_DISK
#GET_VIRTUAL_DISK_INFO_VHD_PHYSICAL_SECTOR_SIZE
#GET_VIRTUAL_DISK_INFO_SMALLEST_SAFE_VIRTUAL_SIZE
#GET_VIRTUAL_DISK_INFO_FRAGMENTATION
#GET_VIRTUAL_DISK_INFO_IS_LOADED
#GET_VIRTUAL_DISK_INFO_VIRTUAL_DISK_ID
#GET_VIRTUAL_DISK_INFO_CHANGE_TRACKING_STATE
EndEnumeration
Macro GET_VIRTUAL_DISK_INFO_VERSION
Long
EndMacro
;}
Enumeration ;{ MERGE_VIRTUAL_DISK_FLAG
#MERGE_VIRTUAL_DISK_FLAG_NONE
EndEnumeration
Macro MERGE_VIRTUAL_DISK_FLAG
Long
EndMacro
;}
Enumeration ;{ MERGE_VIRTUAL_DISK_VERSION
#MERGE_VIRTUAL_DISK_VERSION_UNSPECIFIED
#MERGE_VIRTUAL_DISK_VERSION_1
#MERGE_VIRTUAL_DISK_VERSION_2
EndEnumeration
Macro MERGE_VIRTUAL_DISK_VERSION
Long
EndMacro
;}
Enumeration ;{ MIRROR_VIRTUAL_DISK_FLAG
#MIRROR_VIRTUAL_DISK_FLAG_NONE
#MIRROR_VIRTUAL_DISK_FLAG_EXISTING_FILE
#MIRROR_VIRTUAL_DISK_FLAG_SKIP_MIRROR_ACTIVATION
EndEnumeration
Macro MIRROR_VIRTUAL_DISK_FLAG
Long
EndMacro
;}
Enumeration ;{ MIRROR_VIRTUAL_DISK_VERSION
#MIRROR_VIRTUAL_DISK_VERSION_UNSPECIFIED
#MIRROR_VIRTUAL_DISK_VERSION_1
EndEnumeration
Macro MIRROR_VIRTUAL_DISK_VERSION
Long
EndMacro
;}
Enumeration ;{ MODIFY_VHDSET_FLAG
#MODIFY_VHDSET_FLAG_NONE
#MODIFY_VHDSET_FLAG_WRITEABLE_SNAPSHOT
EndEnumeration
Macro MODIFY_VHDSET_FLAG
Long
EndMacro
;}
Enumeration ;{ MODIFY_VHDSET_VERSION
#MODIFY_VHDSET_UNSPECIFIED
#MODIFY_VHDSET_SNAPSHOT_PATH
#MODIFY_VHDSET_REMOVE_SNAPSHOT
#MODIFY_VHDSET_DEFAULT_SNAPSHOT_PATH
EndEnumeration
Macro MODIFY_VHDSET_VERSION
Long
EndMacro
;}
Enumeration ;{ OPEN_VIRTUAL_DISK_FLAG
#OPEN_VIRTUAL_DISK_FLAG_NONE
#OPEN_VIRTUAL_DISK_FLAG_NO_PARENTS
#OPEN_VIRTUAL_DISK_FLAG_BLANK_FILE
#OPEN_VIRTUAL_DISK_FLAG_BOOT_DRIVE
#OPEN_VIRTUAL_DISK_FLAG_CACHED_IO
#OPEN_VIRTUAL_DISK_FLAG_CUSTOM_DIFF_CHAIN
#OPEN_VIRTUAL_DISK_FLAG_PARENT_CACHED_IO
#OPEN_VIRTUAL_DISK_FLAG_VHDSET_FILE_ONLY
#OPEN_VIRTUAL_DISK_FLAG_IGNORE_RELATIVE_PARENT_LOCATOR
#OPEN_VIRTUAL_DISK_FLAG_NO_WRITE_HARDENING
EndEnumeration
Macro OPEN_VIRTUAL_DISK_FLAG
Long
EndMacro
;}
Enumeration ;{ OPEN_VIRTUAL_DISK_VERSION
#OPEN_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0
#OPEN_VIRTUAL_DISK_VERSION_1 = 1
#OPEN_VIRTUAL_DISK_VERSION_2 = 2
#OPEN_VIRTUAL_DISK_VERSION_3 = 3
EndEnumeration
Macro OPEN_VIRTUAL_DISK_VERSION
Long
EndMacro
;}
Enumeration ;{ RAW_SCSI_VIRTUAL_DISK_FLAG
#RAW_SCSI_VIRTUAL_DISK_FLAG_NONE
EndEnumeration
Macro RAW_SCSI_VIRTUAL_DISK_FLAG
Long
EndMacro
;}
Enumeration ;{ RAW_SCSI_VIRTUAL_DISK_VERSION
#RAW_SCSI_VIRTUAL_DISK_VERSION_UNSPECIFIED
#RAW_SCSI_VIRTUAL_DISK_VERSION_1
EndEnumeration
Macro RAW_SCSI_VIRTUAL_DISK_VERSION
Long
EndMacro
;}
Enumeration ;{ RESIZE_VIRTUAL_DISK_FLAG
#RESIZE_VIRTUAL_DISK_FLAG_NONE
#RESIZE_VIRTUAL_DISK_FLAG_ALLOW_UNSAFE_VIRTUAL_SIZE
#RESIZE_VIRTUAL_DISK_FLAG_RESIZE_TO_SMALLEST_SAFE_VIRTUAL_SIZE
EndEnumeration
Macro RESIZE_VIRTUAL_DISK_FLAG
Long
EndMacro
;}
Enumeration ;{ RESIZE_VIRTUAL_DISK_VERSION
#RESIZE_VIRTUAL_DISK_VERSION_UNSPECIFIED
#RESIZE_VIRTUAL_DISK_VERSION_1
EndEnumeration
Macro RESIZE_VIRTUAL_DISK_VERSION
Long
EndMacro
;}
Enumeration ;{ SET_VIRTUAL_DISK_INFO_VERSION
#SET_VIRTUAL_DISK_INFO_UNSPECIFIED
#SET_VIRTUAL_DISK_INFO_PARENT_PATH
#SET_VIRTUAL_DISK_INFO_IDENTIFIER
#SET_VIRTUAL_DISK_INFO_PARENT_PATH_WITH_DEPTH
#SET_VIRTUAL_DISK_INFO_PHYSICAL_SECTOR_SIZE
#SET_VIRTUAL_DISK_INFO_VIRTUAL_DISK_ID
#SET_VIRTUAL_DISK_INFO_CHANGE_TRACKING_STATE
#SET_VIRTUAL_DISK_INFO_PARENT_LOCATOR
EndEnumeration
Macro SET_VIRTUAL_DISK_INFO_VERSION
Long
EndMacro
;}
Enumeration ;{ TAKE_SNAPSHOT_VHDSET_FLAG
#TAKE_SNAPSHOT_VHDSET_FLAG_NONE
#TAKE_SNAPSHOT_VHDSET_FLAG_WRITEABLE
EndEnumeration
Macro TAKE_SNAPSHOT_VHDSET_FLAG
Long
EndMacro
;}
Enumeration ;{ STORAGE_DEPENDENCY_INFO_VERSION
#STORAGE_DEPENDENCY_INFO_VERSION_UNSPECIFIED
#STORAGE_DEPENDENCY_INFO_VERSION_1
#STORAGE_DEPENDENCY_INFO_VERSION_2
EndEnumeration
Macro STORAGE_DEPENDENCY_INFO_VERSION
Long
EndMacro
;}
Enumeration ;{ TAKE_SNAPSHOT_VHDSET_VERSION
#TAKE_SNAPSHOT_VHDSET_VERSION_UNSPECIFIED
#TAKE_SNAPSHOT_VHDSET_VERSION_1
EndEnumeration
Macro TAKE_SNAPSHOT_VHDSET_VERSION
Long
EndMacro
;}
Enumeration ;{ VIRTUAL_DISK_ACCESS_MASK
#VIRTUAL_DISK_ACCESS_NONE
#VIRTUAL_DISK_ACCESS_ATTACH_RO
#VIRTUAL_DISK_ACCESS_ATTACH_RW
#VIRTUAL_DISK_ACCESS_DETACH
#VIRTUAL_DISK_ACCESS_GET_INFO
#VIRTUAL_DISK_ACCESS_CREATE
#VIRTUAL_DISK_ACCESS_METAOPS
#VIRTUAL_DISK_ACCESS_READ
#VIRTUAL_DISK_ACCESS_ALL
#VIRTUAL_DISK_ACCESS_WRITABLE
EndEnumeration
Macro VIRTUAL_DISK_ACCESS_MASK
Long
EndMacro
;}
Enumeration ;{ QUERY_CHANGES_VIRTUAL_DISK_FLAG
#QUERY_CHANGES_VIRTUAL_DISK_FLAG_NONE
EndEnumeration
Macro QUERY_CHANGES_VIRTUAL_DISK_FLAG
Long
EndMacro
;}
Enumeration ;{ VIRTUAL_STORAGE_TYPE_DEVICE
#VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN
#VIRTUAL_STORAGE_TYPE_DEVICE_ISO
#VIRTUAL_STORAGE_TYPE_DEVICE_VHD
#VIRTUAL_STORAGE_TYPE_DEVICE_VHDX
EndEnumeration
;}
;}
;{ Structures
Structure VIRTUAL_STORAGE_TYPE;{
DeviceId.l
VendorId.GUID
EndStructure
*PVIRTUAL_STORAGE_TYPE.VIRTUAL_STORAGE_TYPE;}
Structure APPLY_SNAPSHOT_VHDSET_PARAMETERS_Version1;{ APPLY_SNAPSHOT_VHDSET_PARAMETERS
SnapshotId.GUID
LeafSnapshotId.GUID
EndStructure
Structure APPLY_SNAPSHOT_VHDSET_PARAMETERS
Version.APPLY_SNAPSHOT_VHDSET_VERSION
StructureUnion
Version1.APPLY_SNAPSHOT_VHDSET_PARAMETERS_Version1
EndStructureUnion
EndStructure
*PAPPLY_SNAPSHOT_VHDSET_PARAMETERS.APPLY_SNAPSHOT_VHDSET_PARAMETERS;}
Structure COMPACT_VIRTUAL_DISK_PARAMETERS_Version1;{ COMPACT_VIRTUAL_DISK_PARAMETERS
Reserved.l
EndStructure
Structure COMPACT_VIRTUAL_DISK_PARAMETERS
Version.COMPACT_VIRTUAL_DISK_VERSION
StructureUnion
Version1.COMPACT_VIRTUAL_DISK_PARAMETERS_Version1
EndStructureUnion
EndStructure
*PCOMPACT_VIRTUAL_DISK_PARAMETERS.COMPACT_VIRTUAL_DISK_PARAMETERS;}
Structure ATTACH_VIRTUAL_DISK_PARAMETERS_Version1;{ ATTACH_VIRTUAL_DISK_PARAMETERS
Reserved.l
EndStructure
Structure ATTACH_VIRTUAL_DISK_PARAMETERS_Version2
RestrictedOffset.q
RestrictedLength.q
EndStructure
Structure ATTACH_VIRTUAL_DISK_PARAMETERS
Version.ATTACH_VIRTUAL_DISK_VERSION
StructureUnion
Version1.ATTACH_VIRTUAL_DISK_PARAMETERS_Version1
Version2.ATTACH_VIRTUAL_DISK_PARAMETERS_Version2
EndStructureUnion
EndStructure
*PATTACH_VIRTUAL_DISK_PARAMETERS.ATTACH_VIRTUAL_DISK_PARAMETERS;}
Structure CREATE_VIRTUAL_DISK_PARAMETERS_Version1;{ CREATE_VIRTUAL_DISK_PARAMETERS
UniqueId.GUID
MaximumSize.q
BlockSizeInBytes.l
SectorSizeInBytes.l
*ParentPath
*SourcePath
EndStructure
Structure CREATE_VIRTUAL_DISK_PARAMETERS_Version2
UniqueId.GUID
MaximumSize.q
BlockSizeInBytes.l
SectorSizeInBytes.l
PhysicalSectorSizeInBytes.l
*ParentPath
*SourcePath
OpenFlags.OPEN_VIRTUAL_DISK_FLAG
ParentVirtualStorageType.VIRTUAL_STORAGE_TYPE;
SourceVirtualStorageType.VIRTUAL_STORAGE_TYPE
ResiliencyGuid.GUID
EndStructure
Structure CREATE_VIRTUAL_DISK_PARAMETERS_Version3
UniqueId.GUID
MaximumSize.q
BlockSizeInBytes.l
SectorSizeInBytes.l
PhysicalSectorSizeInBytes.l
*ParentPath
*SourcePath
OpenFlags.OPEN_VIRTUAL_DISK_FLAG
ParentVirtualStorageType.VIRTUAL_STORAGE_TYPE
SourceVirtualStorageType.VIRTUAL_STORAGE_TYPE
ResiliencyGuid.GUID
*SourceLimitPath
BackingStorageType.VIRTUAL_STORAGE_TYPE
EndStructure
Structure CREATE_VIRTUAL_DISK_PARAMETERS_Version4
UniqueId.GUID
MaximumSize.q
BlockSizeInBytes.l
SectorSizeInBytes.l
PhysicalSectorSizeInBytes.l
*ParentPath
*SourcePath
OpenFlags.OPEN_VIRTUAL_DISK_FLAG
ParentVirtualStorageType.VIRTUAL_STORAGE_TYPE
SourceVirtualStorageType.VIRTUAL_STORAGE_TYPE
ResiliencyGuid.GUID
*SourceLimitPath
BackingStorageType.VIRTUAL_STORAGE_TYPE
PmemAddressAbstractionType.GUID
DataAlignment.q
EndStructure
Structure CREATE_VIRTUAL_DISK_PARAMETERS
Version.CREATE_VIRTUAL_DISK_VERSION
StructureUnion
Version1.CREATE_VIRTUAL_DISK_PARAMETERS_Version1
Version2.CREATE_VIRTUAL_DISK_PARAMETERS_Version2
Version3.CREATE_VIRTUAL_DISK_PARAMETERS_Version3
Version4.CREATE_VIRTUAL_DISK_PARAMETERS_Version4
EndStructureUnion
EndStructure
*PCREATE_VIRTUAL_DISK_PARAMETERS.CREATE_VIRTUAL_DISK_PARAMETERS;}
Structure DELETE_SNAPSHOT_VHDSET_PARAMETERS_Version1;{ DELETE_SNAPSHOT_VHDSET_PARAMETERS
SnapshotId.GUID
EndStructure
Structure DELETE_SNAPSHOT_VHDSET_PARAMETERS
Version.DELETE_SNAPSHOT_VHDSET_VERSION
StructureUnion
Version1.DELETE_SNAPSHOT_VHDSET_PARAMETERS_Version1
EndStructureUnion
EndStructure
*PDELETE_SNAPSHOT_VHDSET_PARAMETERS.DELETE_SNAPSHOT_VHDSET_PARAMETERS;}
Structure EXPAND_VIRTUAL_DISK_PARAMETERS_Version1;{ EXPAND_VIRTUAL_DISK_PARAMETERS
NewSize.q
EndStructure
Structure EXPAND_VIRTUAL_DISK_PARAMETERS
Version.EXPAND_VIRTUAL_DISK_VERSION
StructureUnion
Version1.EXPAND_VIRTUAL_DISK_PARAMETERS_Version1
EndStructureUnion
EndStructure
*PEXPAND_VIRTUAL_DISK_PARAMETERS.EXPAND_VIRTUAL_DISK_PARAMETERS;}
Structure GET_VIRTUAL_DISK_INFO_Size;{ GET_VIRTUAL_DISK_INFO
VirtualSize.q
PhysicalSize.q
BlockSize.l
SectorSize.l
EndStructure
Structure GET_VIRTUAL_DISK_INFO_ParentLocation
ParentResolved.l
ParentLocationBuffer.w[1]
EndStructure
Structure GET_VIRTUAL_DISK_INFO_PhysicalDisk
LogicalSectorSize.l
PhysicalSectorSize.l
IsRemote.l
EndStructure
Structure GET_VIRTUAL_DISK_INFO_ChangeTrackingState
Enabled.l
NewerChanges.l
MostRecentId.w[1]
EndStructure
Structure GET_VIRTUAL_DISK_INFO
Version.GET_VIRTUAL_DISK_INFO_VERSION
StructureUnion
Size.GET_VIRTUAL_DISK_INFO_Size
Identifier.GUID
ParentLocation.GET_VIRTUAL_DISK_INFO_ParentLocation
ParentIdentifier.GUID
ParentTimestamp.l
VirtualStorageType.VIRTUAL_STORAGE_TYPE
ProviderSubtype.l
Is4kAligned.l
IsLoaded.l
PhysicalDisk.GET_VIRTUAL_DISK_INFO_PhysicalDisk
VhdPhysicalSectorSize.l
SmallestSafeVirtualSize.q
FragmentationPercentage.l
VirtualDiskId.GUID
ChangeTrackingState.GET_VIRTUAL_DISK_INFO_ChangeTrackingState
EndStructureUnion
EndStructure
*PGET_VIRTUAL_DISK_INFO.GET_VIRTUAL_DISK_INFO;}
Structure MERGE_VIRTUAL_DISK_PARAMETERS_Version1;{ MERGE_VIRTUAL_DISK_PARAMETERS
MergeDepth.l
EndStructure
Structure MERGE_VIRTUAL_DISK_PARAMETERS_Version2
MergeSourceDepth.l
MergeTargetDepth.l
EndStructure
Structure MERGE_VIRTUAL_DISK_PARAMETERS
Version.MERGE_VIRTUAL_DISK_VERSION
StructureUnion
Version1.MERGE_VIRTUAL_DISK_PARAMETERS_Version1
Version2.MERGE_VIRTUAL_DISK_PARAMETERS_Version2
EndStructureUnion
EndStructure
*PMERGE_VIRTUAL_DISK_PARAMETERS.MERGE_VIRTUAL_DISK_PARAMETERS;}
Structure MIRROR_VIRTUAL_DISK_PARAMETERS_Version1;{ MIRROR_VIRTUAL_DISK_PARAMETERS
*MirrorVirtualDiskPath
EndStructure
Structure MIRROR_VIRTUAL_DISK_PARAMETERS
Version.MIRROR_VIRTUAL_DISK_VERSION
StructureUnion
Version1.MIRROR_VIRTUAL_DISK_PARAMETERS_Version1
EndStructureUnion
EndStructure
*PMIRROR_VIRTUAL_DISK_PARAMETERS.MIRROR_VIRTUAL_DISK_PARAMETERS;}
Structure MODIFY_VHDSET_PARAMETERS_SnapshotPath;{ MODIFY_VHDSET_PARAMETERS
SnapshotId.GUID
*SnapshotFilePath;
EndStructure
Structure MODIFY_VHDSET_PARAMETERS
Version.MODIFY_VHDSET_VERSION
StructureUnion
SnapshotPath.MODIFY_VHDSET_PARAMETERS_SnapshotPath
SnapshotId.GUID
*DefaultFilePath
EndStructureUnion
EndStructure
*PMODIFY_VHDSET_PARAMETERS.MODIFY_VHDSET_PARAMETERS;}
Structure OPEN_VIRTUAL_DISK_PARAMETERS_Version1;{ OPEN_VIRTUAL_DISK_PARAMETERS
RWDepth.l
EndStructure
Structure OPEN_VIRTUAL_DISK_PARAMETERS_Version2
GetInfoOnly.l
ReadOnly.l
ResiliencyGuid.GUID
EndStructure
Structure OPEN_VIRTUAL_DISK_PARAMETERS_Version3
GetInfoOnly.l
ReadOnly.l
ResiliencyGuid.GUID
SnapshotId.GUID
EndStructure
Structure OPEN_VIRTUAL_DISK_PARAMETERS
Version.OPEN_VIRTUAL_DISK_VERSION
StructureUnion
Version1.OPEN_VIRTUAL_DISK_PARAMETERS_Version1
Version2.OPEN_VIRTUAL_DISK_PARAMETERS_Version2
Version3.OPEN_VIRTUAL_DISK_PARAMETERS_Version3
EndStructureUnion
EndStructure
*POPEN_VIRTUAL_DISK_PARAMETERS.OPEN_VIRTUAL_DISK_PARAMETERS;}
Structure QUERY_CHANGES_VIRTUAL_DISK_RANGE;{ QUERY_CHANGES_VIRTUAL_DISK_RANGE
ByteOffset.q
ByteLength.q
Reserved.q
EndStructure
*PQUERY_CHANGES_VIRTUAL_DISK_RANGE.QUERY_CHANGES_VIRTUAL_DISK_RANGE;}
Structure RAW_SCSI_VIRTUAL_DISK_PARAMETERS_Version1;{ RAW_SCSI_VIRTUAL_DISK_PARAMETERS
RSVDHandle.l
DataIn.a
CdbLength.a
SenseInfoLength.a
SrbFlags.l
DataTransferLength.l
*DataBuffer;
*SenseInfo;
*Cdb;
EndStructure
Structure RAW_SCSI_VIRTUAL_DISK_PARAMETERS
Version.RAW_SCSI_VIRTUAL_DISK_VERSION
StructureUnion
Version1.RAW_SCSI_VIRTUAL_DISK_PARAMETERS_Version1
EndStructureUnion
EndStructure
*PRAW_SCSI_VIRTUAL_DISK_PARAMETERS.RAW_SCSI_VIRTUAL_DISK_PARAMETERS;}
Structure RAW_SCSI_VIRTUAL_DISK_RESPONSE_Version1;{ RAW_SCSI_VIRTUAL_DISK_RESPONSE
ScsiStatus.a
SenseInfoLength.a
DataTransferLength.l
EndStructure
Structure RAW_SCSI_VIRTUAL_DISK_RESPONSE
Version.RAW_SCSI_VIRTUAL_DISK_VERSION
StructureUnion
Version1.RAW_SCSI_VIRTUAL_DISK_RESPONSE_Version1
EndStructureUnion
EndStructure
*PRAW_SCSI_VIRTUAL_DISK_RESPONSE.RAW_SCSI_VIRTUAL_DISK_RESPONSE;}
Structure RESIZE_VIRTUAL_DISK_PARAMETERS_Version1;{ RESIZE_VIRTUAL_DISK_PARAMETERS
NewSize.q
EndStructure
Structure RESIZE_VIRTUAL_DISK_PARAMETERS
Version.RESIZE_VIRTUAL_DISK_VERSION
StructureUnion
Version1.RESIZE_VIRTUAL_DISK_PARAMETERS_Version1
EndStructureUnion
EndStructure
*PRESIZE_VIRTUAL_DISK_PARAMETERS.RESIZE_VIRTUAL_DISK_PARAMETERS;}
Structure SET_VIRTUAL_DISK_INFO_ParentPathWithDepthInfo;{ SET_VIRTUAL_DISK_INFO
ChildDepth.l
*ParentFilePath
EndStructure
Structure SET_VIRTUAL_DISK_INFO_ParentLocator
LinkageId.GUID
*ParentFilePath
EndStructure
Structure SET_VIRTUAL_DISK_INFO
Version.SET_VIRTUAL_DISK_INFO_VERSION
StructureUnion
*ParentFilePath
UniqueIdentifier.GUID
ParentPathWithDepthInfo.SET_VIRTUAL_DISK_INFO_ParentPathWithDepthInfo
VhdPhysicalSectorSize.l
VirtualDiskId.GUID
ChangeTrackingEnabled.l
ParentLocator.SET_VIRTUAL_DISK_INFO_ParentLocator
EndStructureUnion
EndStructure
*PSET_VIRTUAL_DISK_INFO.SET_VIRTUAL_DISK_INFO;}
Structure STORAGE_DEPENDENCY_INFO_TYPE_1;{ STORAGE_DEPENDENCY_INFO_TYPE_1
DependencyTypeFlags.DEPENDENT_DISK_FLAG
ProviderSpecificFlags.l
VirtualStorageType.VIRTUAL_STORAGE_TYPE
EndStructure
*PSTORAGE_DEPENDENCY_INFO_TYPE_1.STORAGE_DEPENDENCY_INFO_TYPE_1;}
Structure STORAGE_DEPENDENCY_INFO_TYPE_2;{ STORAGE_DEPENDENCY_INFO_TYPE_2
DependencyTypeFlags.DEPENDENT_DISK_FLAG
ProviderSpecificFlags.l
VirtualStorageType.VIRTUAL_STORAGE_TYPE
AncestorLevel.l
*DependencyDeviceName
*HostVolumeName
*DependentVolumeName
*DependentVolumeRelativePath
EndStructure
*PSTORAGE_DEPENDENCY_INFO_TYPE_2.STORAGE_DEPENDENCY_INFO_TYPE_2;}
Structure STORAGE_DEPENDENCY_INFO;{ STORAGE_DEPENDENCY_INFO
Version.STORAGE_DEPENDENCY_INFO_VERSION
NumberEntries.l
StructureUnion
Version1Entries.STORAGE_DEPENDENCY_INFO_TYPE_1[64]
Version2Entries.STORAGE_DEPENDENCY_INFO_TYPE_2[64]
EndStructureUnion
EndStructure
*PSTORAGE_DEPENDENCY_INFO.STORAGE_DEPENDENCY_INFO;}
Structure TAKE_SNAPSHOT_VHDSET_PARAMETERS_Version1;{ TAKE_SNAPSHOT_VHDSET_PARAMETERS
SnapshotId.GUID
EndStructure
Structure TAKE_SNAPSHOT_VHDSET_PARAMETERS
Version.TAKE_SNAPSHOT_VHDSET_VERSION
StructureUnion
Version1.TAKE_SNAPSHOT_VHDSET_PARAMETERS_Version1
EndStructureUnion
EndStructure
*PTAKE_SNAPSHOT_VHDSET_PARAMETERS.TAKE_SNAPSHOT_VHDSET_PARAMETERS;}
Structure VIRTUAL_DISK_PROGRESS;{ VIRTUAL_DISK_PROGRESS
OperationStatus.l
CurrentValue.q
CompletionValue.q
EndStructure
*PVIRTUAL_DISK_PROGRESS.VIRTUAL_DISK_PROGRESS;}
;}
;{ Proto
Prototype.l AddVirtualDiskParent(hVirtualDiskHandle.l, *ParentPath);
Global AddVirtualDiskParent.AddVirtualDiskParent
Prototype.l ApplySnapshotVhdSet(hVirtualDiskHandle.l,
*Parameters.APPLY_SNAPSHOT_VHDSET_PARAMETERS,
*Flags.APPLY_SNAPSHOT_VHDSET_FLAG);
Global ApplySnapshotVhdSet.ApplySnapshotVhdSet
Prototype.l AttachVirtualDisk(hVirtualDiskHandle.l,
*SecurityDescriptor.SECURITY_DESCRIPTOR,
*Flags.ATTACH_VIRTUAL_DISK_FLAG,
ProviderSpecificFlags.l,
*Parameters.ATTACH_VIRTUAL_DISK_PARAMETERS,
*LPOVERLAPPED.OVERLAPPED)
Global AttachVirtualDisk.AttachVirtualDisk
Prototype.l BreakMirrorVirtualDisk(hVirtualDiskHandle.l);
Global BreakMirrorVirtualDisk.BreakMirrorVirtualDisk
Prototype.l CompactVirtualDisk(hVirtualDiskHandle.l,
*Flags.COMPACT_VIRTUAL_DISK_FLAG,
*Parameters.COMPACT_VIRTUAL_DISK_PARAMETERS,
*LPOVERLAPPED.OVERLAPPED);
Global CompactVirtualDisk.CompactVirtualDisk
Prototype.l CreateVirtualDisk(*pVirtualStorageType,
*Path,
*VirtualDiskAccessMask.VIRTUAL_DISK_ACCESS_MASK,
*SecurityDescriptor.SECURITY_DESCRIPTOR,
*Flags.CREATE_VIRTUAL_DISK_FLAG,
ProviderSpecificFlags.l,
*Parameters.CREATE_VIRTUAL_DISK_PARAMETERS,
*LPOVERLAPPED.OVERLAPPED,
*hHandle);
Global CreateVirtualDisk.CreateVirtualDisk
Prototype.l DeleteSnapshotVhdSet(hVirtualDiskHandle,
*Parameters.DELETE_SNAPSHOT_VHDSET_PARAMETERS,
*Flags.DELETE_SNAPSHOT_VHDSET_FLAG);
Global DeleteSnapshotVhdSet.DeleteSnapshotVhdSet
Prototype.l DeleteVirtualDiskMetadata(hVirtualDiskHandle.l,
*Item.GUID);
Global DeleteVirtualDiskMetadata.DeleteVirtualDiskMetadata
Prototype.l DetachVirtualDisk(hVirtualDiskHandle.l,
*Flags.DETACH_VIRTUAL_DISK_FLAG,
ProviderSpecificFlags.l);
Global DetachVirtualDisk.DetachVirtualDisk
Prototype.l EnumerateVirtualDiskMetadata(hVirtualDiskHandle.l,
*NumberOfItems.Long,
*Items.GUID);
Global EnumerateVirtualDiskMetadata.EnumerateVirtualDiskMetadata
Prototype.l ExpandVirtualDisk(hVirtualDiskHandle.l,
*Flags.EXPAND_VIRTUAL_DISK_FLAG,
*Parameters.EXPAND_VIRTUAL_DISK_PARAMETERS,
*LPOVERLAPPED.OVERLAPPED);
Global ExpandVirtualDisk.ExpandVirtualDisk
Prototype.l GetStorageDependencyInformation(hObjectHandle.l,
*Flags.GET_STORAGE_DEPENDENCY_FLAG,
StorageDependencyInfoSize.l,
*StorageDependencyInfo.STORAGE_DEPENDENCY_INFO,
*SizeUsed.Long);
Global GetStorageDependencyInformation.GetStorageDependencyInformation
Prototype.l GetVirtualDiskInformation(hVirtualDiskHandle.l,
*VirtualDiskInfoSize.Long,
*VirtualDiskInfo.GET_VIRTUAL_DISK_INFO,
*SizeUsed.Long);
Global GetVirtualDiskInformation.GetVirtualDiskInformation
Prototype.l GetVirtualDiskMetadata(hVirtualDiskHandle.l,
*Item.GUID,
*MetaDataSize.Long,
*MetaData);
Global GetVirtualDiskMetadata.GetVirtualDiskMetadata
Prototype.l GetVirtualDiskOperationProgress(hVirtualDiskHandle.l,
*LPOVERLAPPED.OVERLAPPED,
*Progress.VIRTUAL_DISK_PROGRESS);
Global GetVirtualDiskOperationProgress.GetVirtualDiskOperationProgress
Prototype.l GetVirtualDiskPhysicalPath(hVirtualDiskHandle.l,
*DiskPathSizeInBytes.Long,
*DiskPath);
Global GetVirtualDiskPhysicalPath.GetVirtualDiskPhysicalPath
Prototype.l MergeVirtualDisk(hVirtualDiskHandle.l,
*Flags.MERGE_VIRTUAL_DISK_FLAG,
*Parameters.MERGE_VIRTUAL_DISK_PARAMETERS,
*LPOVERLAPPED.OVERLAPPED);
Global MergeVirtualDisk.MergeVirtualDisk
Prototype.l MirrorVirtualDisk(hVirtualDiskHandle.l,
*Flags.MIRROR_VIRTUAL_DISK_FLAG,
*Parameters.MIRROR_VIRTUAL_DISK_PARAMETERS,
*LPOVERLAPPED.OVERLAPPED);
Global MirrorVirtualDisk.MirrorVirtualDisk
Prototype.l ModifyVhdSet(hVirtualDiskHandle.l,
*Parameters.MODIFY_VHDSET_PARAMETERS,
*Flags.MODIFY_VHDSET_FLAG);
Global ModifyVhdSet.ModifyVhdSet
Prototype.l OpenVirtualDisk(*VirtualStorageType.VIRTUAL_STORAGE_TYPE,
*Path,
*VirtualDiskAccessMask.VIRTUAL_DISK_ACCESS_MASK,
*Flags.OPEN_VIRTUAL_DISK_FLAG,
*Parameters.OPEN_VIRTUAL_DISK_PARAMETERS,
*hHandle);
Global OpenVirtualDisk.OpenVirtualDisk
Prototype.l QueryChangesVirtualDisk(hVirtualDiskHandle.l,
*ChangeTrackingId,
ByteOffset.q,
ByteLength.q,
*Flags.QUERY_CHANGES_VIRTUAL_DISK_FLAG,
*Ranges.QUERY_CHANGES_VIRTUAL_DISK_RANGE,
*RangeCount.Long,
*ProcessedLength.Quad);
Global QueryChangesVirtualDisk.QueryChangesVirtualDisk
Prototype.l RawSCSIVirtualDisk(hVirtualDiskHandle.l,
*Parameters.RAW_SCSI_VIRTUAL_DISK_PARAMETERS,
*Flags.RAW_SCSI_VIRTUAL_DISK_FLAG,
*Response.RAW_SCSI_VIRTUAL_DISK_RESPONSE);
Global RawSCSIVirtualDisk.RawSCSIVirtualDisk
Prototype.l ResizeVirtualDisk(hVirtualDiskHandle.l,
*Flags.RESIZE_VIRTUAL_DISK_FLAG,
*Parameters.RESIZE_VIRTUAL_DISK_PARAMETERS,
*LPOVERLAPPED.OVERLAPPED);
Global ResizeVirtualDisk.ResizeVirtualDisk
Prototype.l SetVirtualDiskInformation(hVirtualDiskHandle.l,
*VirtualDiskInfo.SET_VIRTUAL_DISK_INFO);
Global SetVirtualDiskInformation.SetVirtualDiskInformation
Prototype.l SetVirtualDiskMetadata(hVirtualDiskHandle.l,
*Item.GUID,
MetaDataSize.l,
*MetaData);
Global SetVirtualDiskMetadata.SetVirtualDiskMetadata
Prototype.l TakeSnapshotVhdSet(hVirtualDiskHandle.l,
*Parameters.TAKE_SNAPSHOT_VHDSET_PARAMETERS,
*Flags.TAKE_SNAPSHOT_VHDSET_FLAG);
Global TakeSnapshotVhdSet.TakeSnapshotVhdSet
;}
;{ Define_Guid
Macro DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
name.GUID
name\Data1 = l
name\Data2 = w1
name\Data3 = w2
name\Data4[0] = b1
name\Data4[1] = b2
name\Data4[2] = b3
name\Data4[3] = b4
name\Data4[4] = b5
name\Data4[5] = b6
name\Data4[6] = b7
name\Data4[7] = b8
EndMacro
Macro SET_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
name\Data1 = l
name\Data2 = w1
name\Data3 = w2
name\Data4[0] = b1
name\Data4[1] = b2
name\Data4[2] = b3
name\Data4[3] = b4
name\Data4[4] = b5
name\Data4[5] = b6
name\Data4[6] = b7
name\Data4[7] = b8
EndMacro
;}
;{ OpenVirtualDisk
Procedure initVirtDisk()
Protected initVirtDisk = OpenLibrary(#PB_Any, "VirtDisk.dll")
If IsLibrary(initVirtDisk)
AttachVirtualDisk=GetFunction(initVirtDisk,"AttachVirtualDisk"):Debug AttachVirtualDisk
CompactVirtualDisk=GetFunction(initVirtDisk,"CompactVirtualDisk"):Debug CompactVirtualDisk
CreateVirtualDisk=GetFunction(initVirtDisk,"CreateVirtualDisk"):Debug CreateVirtualDisk
DetachVirtualDisk=GetFunction(initVirtDisk,"DetachVirtualDisk"):Debug DetachVirtualDisk
ExpandVirtualDisk=GetFunction(initVirtDisk,"ExpandVirtualDisk"):Debug ExpandVirtualDisk
GetStorageDependencyInformation=GetFunction(initVirtDisk,"GetStorageDependencyInformation"):Debug GetStorageDependencyInformation
GetVirtualDiskInformation=GetFunction(initVirtDisk,"GetVirtualDiskInformation"):Debug GetVirtualDiskInformation
GetVirtualDiskOperationProgress=GetFunction(initVirtDisk,"GetVirtualDiskOperationProgress"):Debug GetVirtualDiskOperationProgress
GetVirtualDiskPhysicalPath=GetFunction(initVirtDisk,"GetVirtualDiskPhysicalPath"):Debug GetVirtualDiskPhysicalPath
MergeVirtualDisk=GetFunction(initVirtDisk,"MergeVirtualDisk"):Debug MergeVirtualDisk
OpenVirtualDisk=GetFunction(initVirtDisk,"OpenVirtualDisk"):Debug OpenVirtualDisk
SetVirtualDiskInformation=GetFunction(initVirtDisk,"SetVirtualDiskInformation"):Debug SetVirtualDiskInformation
ProcedureReturn initVirtDisk
EndIf
ProcedureReturn 0
EndProcedure
Procedure finitVirtDisk(libVirtDisk)
If IsLibrary(libVirtDisk)
CloseLibrary(initVirtDisk)
EndIf
EndProcedure
Define libVirt=initVirtDisk()
Debug libVirt
;}
Define vstorType.VIRTUAL_STORAGE_TYPE
vstorType\DeviceId = #VIRTUAL_STORAGE_TYPE_DEVICE_ISO
SET_GUID(vstorType\VendorId, $ec984aec, $a0f9, $47e9, $90, $1f, $71, $41, $5a, $66, $34, $5b)
Define openParams.OPEN_VIRTUAL_DISK_PARAMETERS
PokeL(openParams\Version, #OPEN_VIRTUAL_DISK_VERSION_1)
openParams\Version1\RWDepth = 0
Define HANDLE.l = 0
DW = OpenVirtualDisk(vstorType, @"c:\temp\nec_2t.iso",
#VIRTUAL_DISK_ACCESS_READ,
#OPEN_VIRTUAL_DISK_FLAG_NONE,
openParams, @HANDLE)
Debug DW
Define attachParams.ATTACH_VIRTUAL_DISK_PARAMETERS
PokeL(attachParams\Version, #ATTACH_VIRTUAL_DISK_VERSION_1)
attachParams\Version1\Reserved = 0
DW = AttachVirtualDisk(@HANDLE, 0, #ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY, 0, attachParams, 0);
Debug DW
DW = DetachVirtualDisk(HANDLE, #DETACH_VIRTUAL_DISK_FLAG_NONE, 0);
Debug DW