static extern int CreateVirtualDisk( [In] ref VirtualStorageType VirtualStorageType, string Path, VirtualDiskAccessMask VirtualDiskAccessMask, [In] byte[] SecurityDescriptor, CreateVirtualDiskFlag Flags, uint ProviderSpecificFlags, [In] ref CreateVirtualDiskParameters Parameters, IntPtr Overlapped, out IntPtr Handle );
/// <summary> /// Opens connection to file. /// </summary> /// <param name="fileAccess">Defines required access.</param> /// <param name="type">Disk type.</param> /// <exception cref="System.ComponentModel.Win32Exception">Native error.</exception> /// <exception cref="System.IO.FileNotFoundException">File not found.</exception> /// <exception cref="System.IO.InvalidDataException">File type not recognized.</exception> private void Open(VirtualDiskAccessMask fileAccess, VirtualDiskType type) { var parameters = new NativeMethods.OPEN_VIRTUAL_DISK_PARAMETERS(); parameters.Version = NativeMethods.OPEN_VIRTUAL_DISK_VERSION.OPEN_VIRTUAL_DISK_VERSION_1; parameters.Version1.RWDepth = NativeMethods.OPEN_VIRTUAL_DISK_RW_DEPTH_DEFAULT; var storageType = new NativeMethods.VIRTUAL_STORAGE_TYPE(); switch (type) { case VirtualDiskType.AutoDetect: if (this.FileName.EndsWith(".iso", StringComparison.OrdinalIgnoreCase)) { storageType.DeviceId = NativeMethods.VIRTUAL_STORAGE_TYPE_DEVICE_ISO; fileAccess = ((fileAccess & VirtualDiskAccessMask.GetInfo) == VirtualDiskAccessMask.GetInfo) ? VirtualDiskAccessMask.GetInfo : 0; fileAccess |= VirtualDiskAccessMask.AttachReadOnly; this.DiskType = VirtualDiskType.Iso; } else if (this.FileName.EndsWith(".vhdx", StringComparison.OrdinalIgnoreCase)) { storageType.DeviceId = NativeMethods.VIRTUAL_STORAGE_TYPE_DEVICE_VHDX; this.DiskType = VirtualDiskType.Vhdx; } else { storageType.DeviceId = NativeMethods.VIRTUAL_STORAGE_TYPE_DEVICE_VHD; this.DiskType = VirtualDiskType.Vhd; } break; case VirtualDiskType.Iso: storageType.DeviceId = NativeMethods.VIRTUAL_STORAGE_TYPE_DEVICE_ISO; fileAccess = ((fileAccess & VirtualDiskAccessMask.GetInfo) == VirtualDiskAccessMask.GetInfo) ? VirtualDiskAccessMask.GetInfo : 0; fileAccess |= VirtualDiskAccessMask.AttachReadOnly; this.DiskType = VirtualDiskType.Iso; break; case VirtualDiskType.Vhd: storageType.DeviceId = NativeMethods.VIRTUAL_STORAGE_TYPE_DEVICE_VHD; this.DiskType = VirtualDiskType.Vhd; break; case VirtualDiskType.Vhdx: storageType.DeviceId = NativeMethods.VIRTUAL_STORAGE_TYPE_DEVICE_VHDX; this.DiskType = VirtualDiskType.Vhdx; break; } storageType.VendorId = NativeMethods.VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT; int res = NativeMethods.OpenVirtualDisk(ref storageType, this.FileName, (NativeMethods.VIRTUAL_DISK_ACCESS_MASK)fileAccess, NativeMethods.OPEN_VIRTUAL_DISK_FLAG.OPEN_VIRTUAL_DISK_FLAG_NONE, ref parameters, ref _handle); if (res == NativeMethods.ERROR_SUCCESS) { } else { _handle.SetHandleAsInvalid(); if ((res == NativeMethods.ERROR_FILE_NOT_FOUND) || (res == NativeMethods.ERROR_PATH_NOT_FOUND)) { throw new FileNotFoundException("File not found."); } else if (res == NativeMethods.ERROR_ACCESS_DENIED) { throw new IOException("Access is denied."); } else if (res == NativeMethods.ERROR_FILE_CORRUPT) { throw new InvalidDataException("File type not recognized."); } else { throw new Win32Exception(res); } } }
public void Open(VirtualDiskAccessMask fileAccess) { this.Open(fileAccess, VirtualDiskType.AutoDetect); }
public static extern Int32 OpenVirtualDisk(ref VirtualStorageType virtualStorageType, string path, VirtualDiskAccessMask virtualDiskAccessMask, OpenVirtualDiskFlag flags, ref OpenVirtualDiskParameters parameters, ref IntPtr handle);