Пример #1
0
 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
     );
Пример #2
0
        /// <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);
                }
            }
        }
Пример #3
0
 public void Open(VirtualDiskAccessMask fileAccess)
 {
     this.Open(fileAccess, VirtualDiskType.AutoDetect);
 }
Пример #4
0
 public static extern Int32 OpenVirtualDisk(ref VirtualStorageType virtualStorageType, string path, VirtualDiskAccessMask virtualDiskAccessMask, OpenVirtualDiskFlag flags, ref OpenVirtualDiskParameters parameters, ref IntPtr handle);
Пример #5
0
 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
     );