/// <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() { 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(); storageType.DeviceId = NativeMethods.VIRTUAL_STORAGE_TYPE_DEVICE_VHD; storageType.VendorId = NativeMethods.VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT; int res = NativeMethods.OpenVirtualDisk(ref storageType, this.FileName, NativeMethods.VIRTUAL_DISK_ACCESS_MASK.VIRTUAL_DISK_ACCESS_ALL, 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 System.IO.FileNotFoundException("File not found."); } else if (res == NativeMethods.ERROR_FILE_CORRUPT) { throw new System.IO.InvalidDataException("File format not recognized."); } else { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Native error {0}.", res)); } } }