VirtDisk Error 87 and 6

Just starting out? Need help? Post your questions and find answers here.
LiK137
Enthusiast
Enthusiast
Posts: 282
Joined: Wed Jun 23, 2010 5:13 pm

VirtDisk Error 87 and 6

Post by LiK137 »

Hi,
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

fryquez
Enthusiast
Enthusiast
Posts: 367
Joined: Mon Dec 21, 2015 8:12 pm

Re: VirtDisk Error 87 and 6

Post by fryquez »

Your VIRTUAL_DISK_ACCESS_MASK enumeration is wrong, also check structure alignment.
LiK137
Enthusiast
Enthusiast
Posts: 282
Joined: Wed Jun 23, 2010 5:13 pm

Re: VirtDisk Error 87 and 6

Post by LiK137 »

I don't think enumeration is wrong:
;{ typedef enum _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
;} VIRTUAL_DISK_ACCESS_MASK;

Tried alignment, same result.
The problem is OpenVirtualDisk parameters mismatch.
fryquez
Enthusiast
Enthusiast
Posts: 367
Joined: Mon Dec 21, 2015 8:12 pm

Re: VirtDisk Error 87 and 6

Post by fryquez »

https://msdn.microsoft.com/en-us/window ... p/dd323702

typedef enum _VIRTUAL_DISK_ACCESS_MASK {
VIRTUAL_DISK_ACCESS_NONE = 0x00000000,
VIRTUAL_DISK_ACCESS_ATTACH_RO = 0x00010000,
VIRTUAL_DISK_ACCESS_ATTACH_RW = 0x00020000,
VIRTUAL_DISK_ACCESS_DETACH = 0x00040000,
VIRTUAL_DISK_ACCESS_GET_INFO = 0x00080000,
VIRTUAL_DISK_ACCESS_CREATE = 0x00100000,
VIRTUAL_DISK_ACCESS_METAOPS = 0x00200000,
VIRTUAL_DISK_ACCESS_READ = 0x000d0000,
VIRTUAL_DISK_ACCESS_ALL = 0x003f0000,
VIRTUAL_DISK_ACCESS_WRITABLE = 0x00320000
} VIRTUAL_DISK_ACCESS_MASK;
LiK137
Enthusiast
Enthusiast
Posts: 282
Joined: Wed Jun 23, 2010 5:13 pm

Re: VirtDisk Error 87 and 6

Post by LiK137 »

You are right, with Your constants successfully opened but I don't know why in my Microsoft link enumeration differs.
Strange...

Thank You very much.

let me check remaining constants and comeback again.
LiK137
Enthusiast
Enthusiast
Posts: 282
Joined: Wed Jun 23, 2010 5:13 pm

Re: VirtDisk Error 87 and 6

Post by LiK137 »

Open successful but Create still gives errCode: 87

Code: Select all

  Structure      VIRTUAL_STORAGE_TYPE;{ VIRTUAL_STORAGE_TYPE
    DeviceId.l
    VendorId.GUID
  EndStructure ;}
  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.l
    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.l
    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.l
    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.l
    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 ;}
  
Prototype.l CreateVirtualDisk(*inPVirtualStorageType.VIRTUAL_STORAGE_TYPE,;{
                            inPath.p-bstr,
                            inVirtualDiskAccessMask.l,
                            *inSecurityDescriptor.SECURITY_DESCRIPTOR,
                            inFlags.l,
                            inProviderSpecificFlags.l,
                            *inParameters.CREATE_VIRTUAL_DISK_PARAMETERS,
                            *inLPOVERLAPPED.OVERLAPPED,
                            *outHandle)
Global CreateVirtualDisk.CreateVirtualDisk;}
  
  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

  Enumeration ;{ CREATE_VIRTUAL_DISK_VERSION
    #CREATE_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0
    #CREATE_VIRTUAL_DISK_VERSION_1 = 1
    #CREATE_VIRTUAL_DISK_VERSION_2 = 2
    #CREATE_VIRTUAL_DISK_VERSION_3 = 3
    #CREATE_VIRTUAL_DISK_VERSION_4 = 4
  EndEnumeration  
  
  #CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_BLOCK_SIZE = 0
  #CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_SECTOR_SIZE = $200
  
Enumeration ;{ VIRTUAL_DISK_ACCESS_MASK
  #VIRTUAL_DISK_ACCESS_NONE = $0
  #VIRTUAL_DISK_ACCESS_ATTACH_RO = $10000
  #VIRTUAL_DISK_ACCESS_ATTACH_RW = $20000
  #VIRTUAL_DISK_ACCESS_DETACH = $40000
  #VIRTUAL_DISK_ACCESS_GET_INFO = $80000
  #VIRTUAL_DISK_ACCESS_CREATE = $100000
  #VIRTUAL_DISK_ACCESS_METAOPS = $200000
  #VIRTUAL_DISK_ACCESS_READ = $D0000
  #VIRTUAL_DISK_ACCESS_ALL = $3F0000
  #VIRTUAL_DISK_ACCESS_WRITABLE = $320000
EndEnumeration  

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 = $00000000
  #CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION = $00000001
  #CREATE_VIRTUAL_DISK_FLAG_PREVENT_WRITES_TO_SOURCE_DISK = $2
  #CREATE_VIRTUAL_DISK_FLAG_DO_NOT_COPY_METADATA_FROM_PARENT = $4
  #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 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

  Procedure.l CreateDisk(virtualDiskFilePath.s, SizeInMBytes.q, *handle)
    
    hVdsk = OpenLibrary(#PB_Any, "VirtDisk.dll")    
    If hVdsk
      CreateVirtualDisk=GetFunction(hVdsk,"CreateVirtualDisk")
      
      Protected guid.GUID
      
      Define storageType.VIRTUAL_STORAGE_TYPE
  
      storageType\DeviceId = #VIRTUAL_STORAGE_TYPE_DEVICE_VHD
      SET_GUID(storageType\VendorId, $EC984AEC, $A0F9, $47e9, $90, $1F, $71, $41, $5A, $66, $34, $5B)
      
      Define parameters.CREATE_VIRTUAL_DISK_PARAMETERS
      parameters\Version = #CREATE_VIRTUAL_DISK_VERSION_1
      
  ;     If CoCreateGuid_(@guid) = #S_OK
  ;       parameters\Version1\UniqueId = guid
  ;     EndIf
      
      parameters\Version1\MaximumSize = SizeInMBytes * 1024 * 1024
      parameters\Version1\BlockSizeInBytes = #CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_BLOCK_SIZE
      parameters\Version1\SectorSizeInBytes = #CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_SECTOR_SIZE;
      parameters\Version1\SourcePath = #Null
      
      Define VDiskAccessMask.l = #VIRTUAL_DISK_ACCESS_CREATE;#VIRTUAL_DISK_ACCESS_ALL; #VIRTUAL_DISK_ACCESS_CREATE
      Define VDiskFlags.l = #CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION ;#CREATE_VIRTUAL_DISK_FLAG_NONE
      
      result = CreateVirtualDisk(@storageType,
                                 virtualDiskFilePath.s,
                                 VDiskAccessMask,
                                 #Null,
                                 VDiskFlags,
                                 0,
                                 @parameters,
                                 #Null,
                                 *handle);
      
      CloseLibrary(hVdsk)  
    EndIf
  
    ProcedureReturn result;
  EndProcedure
  
  
  Define vDskPath$ = "c:\temp\VHD\crtvhdfixed.vhd"

  If FileSize(vDskPath$) = -1
    RET = CreateDisk(vDskPath$, 100, hHandle);
    Debug "result: " + RET
  EndIf  

Have changed constants according to fryquez
fryquez
Enthusiast
Enthusiast
Posts: 367
Joined: Mon Dec 21, 2015 8:12 pm

Re: VirtDisk Error 87 and 6

Post by fryquez »

Code: Select all

Structure VIRTUAL_STORAGE_TYPE Align #PB_Structure_AlignC
  DeviceId.l
  VendorId.GUID
EndStructure

Structure CREATE_VIRTUAL_DISK_PARAMETERS_Version1 Align #PB_Structure_AlignC
  UniqueId.GUID
  MaximumSize.q
  BlockSizeInBytes.l
  SectorSizeInBytes.l
  *ParentPath
  *SourcePath
EndStructure

Structure CREATE_VIRTUAL_DISK_PARAMETERS_Version2 Align #PB_Structure_AlignC
  UniqueId.GUID
  MaximumSize.q
  BlockSizeInBytes.l
  SectorSizeInBytes.l
  PhysicalSectorSizeInBytes.l
  *ParentPath
  *SourcePath
  OpenFlags.l
  ParentVirtualStorageType.VIRTUAL_STORAGE_TYPE;
  SourceVirtualStorageType.VIRTUAL_STORAGE_TYPE
  ResiliencyGuid.GUID
EndStructure

Structure CREATE_VIRTUAL_DISK_PARAMETERS_Version3 Align #PB_Structure_AlignC
  UniqueId.GUID
  MaximumSize.q
  BlockSizeInBytes.l
  SectorSizeInBytes.l
  PhysicalSectorSizeInBytes.l
  *ParentPath
  *SourcePath
  OpenFlags.l
  ParentVirtualStorageType.VIRTUAL_STORAGE_TYPE
  SourceVirtualStorageType.VIRTUAL_STORAGE_TYPE
  ResiliencyGuid.GUID
  *SourceLimitPath
  BackingStorageType.VIRTUAL_STORAGE_TYPE
EndStructure

Structure CREATE_VIRTUAL_DISK_PARAMETERS_Version4 Align #PB_Structure_AlignC
  UniqueId.GUID
  MaximumSize.q
  BlockSizeInBytes.l
  SectorSizeInBytes.l
  PhysicalSectorSizeInBytes.l
  *ParentPath
  *SourcePath
  OpenFlags.l
  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 Align #PB_Structure_AlignC
  Version.l
  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 ;}

Prototype.l CreateVirtualDisk(*inPVirtualStorageType.VIRTUAL_STORAGE_TYPE,
                              inPath,
                              inVirtualDiskAccessMask,
                              *inSecurityDescriptor.SECURITY_DESCRIPTOR,
                              inFlags,
                              inProviderSpecificFlags,
                              *inParameters.CREATE_VIRTUAL_DISK_PARAMETERS,
                              *inLPOVERLAPPED.OVERLAPPED,
                              *outHandle)
Global CreateVirtualDisk.CreateVirtualDisk;}

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

Enumeration ;{ CREATE_VIRTUAL_DISK_VERSION
  #CREATE_VIRTUAL_DISK_VERSION_UNSPECIFIED = 0
  #CREATE_VIRTUAL_DISK_VERSION_1 = 1
  #CREATE_VIRTUAL_DISK_VERSION_2 = 2
  #CREATE_VIRTUAL_DISK_VERSION_3 = 3
  #CREATE_VIRTUAL_DISK_VERSION_4 = 4
EndEnumeration 

#CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_BLOCK_SIZE = 0
#CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_SECTOR_SIZE = $200

Enumeration ;{ VIRTUAL_DISK_ACCESS_MASK
  #VIRTUAL_DISK_ACCESS_NONE = $0
  #VIRTUAL_DISK_ACCESS_ATTACH_RO = $10000
  #VIRTUAL_DISK_ACCESS_ATTACH_RW = $20000
  #VIRTUAL_DISK_ACCESS_DETACH = $40000
  #VIRTUAL_DISK_ACCESS_GET_INFO = $80000
  #VIRTUAL_DISK_ACCESS_CREATE = $100000
  #VIRTUAL_DISK_ACCESS_METAOPS = $200000
  #VIRTUAL_DISK_ACCESS_READ = $D0000
  #VIRTUAL_DISK_ACCESS_ALL = $3F0000
  #VIRTUAL_DISK_ACCESS_WRITABLE = $320000
EndEnumeration 

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 = $00000000
  #CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION = $00000001
  #CREATE_VIRTUAL_DISK_FLAG_PREVENT_WRITES_TO_SOURCE_DISK = $2
  #CREATE_VIRTUAL_DISK_FLAG_DO_NOT_COPY_METADATA_FROM_PARENT = $4
  #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 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

Procedure.l CreateDisk(virtualDiskFilePath.s, SizeInMBytes.q, *handle)
  
  hVdsk = OpenLibrary(#PB_Any, "VirtDisk.dll")   
  If hVdsk
    CreateVirtualDisk=GetFunction(hVdsk,"CreateVirtualDisk")
    
    Protected guid.GUID
    
    Define storageType.VIRTUAL_STORAGE_TYPE
    
    storageType\DeviceId = #VIRTUAL_STORAGE_TYPE_DEVICE_VHD
    SET_GUID(storageType\VendorId, $EC984AEC, $A0F9, $47e9, $90, $1F, $71, $41, $5A, $66, $34, $5B)
    
    Define parameters.CREATE_VIRTUAL_DISK_PARAMETERS
    parameters\Version = #CREATE_VIRTUAL_DISK_VERSION_1
    
    ;     If CoCreateGuid_(@guid) = #S_OK
    ;       parameters\Version1\UniqueId = guid
    ;     EndIf
    
    parameters\Version1\MaximumSize = SizeInMBytes * 1024 * 1024
    parameters\Version1\BlockSizeInBytes = #CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_BLOCK_SIZE
    parameters\Version1\SectorSizeInBytes = #CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_SECTOR_SIZE;
    parameters\Version1\SourcePath = #Null
    
    Define VDiskAccessMask.l = #VIRTUAL_DISK_ACCESS_CREATE;#VIRTUAL_DISK_ACCESS_ALL; #VIRTUAL_DISK_ACCESS_CREATE
    Define VDiskFlags.l = #CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION ;#CREATE_VIRTUAL_DISK_FLAG_NONE
    
    
    result = CreateVirtualDisk(@storageType,
                               @virtualDiskFilePath.s,
                               VDiskAccessMask,
                               #Null,
                               VDiskFlags,
                               0,
                               @parameters,
                               #Null,
                               *handle);
    
    CloseLibrary(hVdsk) 
  EndIf
  
  ProcedureReturn result;
EndProcedure


Define vDskPath$ = "c:\temp\VHD\crtvhdfixed.vhd"

If FileSize(vDskPath$) = -1
  RET = CreateDisk(vDskPath$, 100, @hHandle);
  Debug "result: " + RET
EndIf 
LiK137
Enthusiast
Enthusiast
Posts: 282
Joined: Wed Jun 23, 2010 5:13 pm

Re: VirtDisk Error 87 and 6

Post by LiK137 »

Thanx fryquez, Works, You told me in prev replies to check structure Alignment but I didn't get that (My fault)
Incredibly Huge & enormous thanks to YOU.
(Beer) from me.
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5353
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: VirtDisk Error 87 and 6

Post by Kwai chang caine »

Waaaaooouuhh !!! i don't know this function, it's amazing :shock:
That works perfectly on W7 8)

It's exactely for this style of tips, that i read each days this great forum
For have stars in the eyes
Image

Thanks a lot at LiK137 and Fryquez for this splendid tip 8)
ImageThe happiness is a road...
Not a destination
Post Reply