internal static int MountVirtualDisk(string vhdfile) { var handle = IntPtr.Zero; // open disk handle var openParameters = new NativeMethods.OPEN_VIRTUAL_DISK_PARAMETERS(); openParameters.Version = NativeMethods.OPEN_VIRTUAL_DISK_VERSION.OPEN_VIRTUAL_DISK_VERSION_1; openParameters.Version1.RWDepth = NativeMethods.OPEN_VIRTUAL_DISK_RW_DEPTH_DEFAULT; var openStorageType = new NativeMethods.VIRTUAL_STORAGE_TYPE(); openStorageType.DeviceId = NativeMethods.VIRTUAL_STORAGE_TYPE_DEVICE_VHD; openStorageType.VendorId = NativeMethods.VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT; var openResult = NativeMethods.OpenVirtualDisk(ref openStorageType, vhdfile, NativeMethods.VIRTUAL_DISK_ACCESS_MASK.VIRTUAL_DISK_ACCESS_ALL, NativeMethods.OPEN_VIRTUAL_DISK_FLAG.OPEN_VIRTUAL_DISK_FLAG_NONE, ref openParameters, ref handle); if (openResult != NativeMethods.ERROR_SUCCESS) { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Native error {0}.", openResult)); } // attach disk - permanently var attachParameters = new NativeMethods.ATTACH_VIRTUAL_DISK_PARAMETERS(); attachParameters.Version = NativeMethods.ATTACH_VIRTUAL_DISK_VERSION.ATTACH_VIRTUAL_DISK_VERSION_1; var attachResult = NativeMethods.AttachVirtualDisk(handle, IntPtr.Zero, NativeMethods.ATTACH_VIRTUAL_DISK_FLAG.ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME | NativeMethods.ATTACH_VIRTUAL_DISK_FLAG.ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER, 0, ref attachParameters, IntPtr.Zero); if (attachResult != NativeMethods.ERROR_SUCCESS) { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Native error {0}.", attachResult)); } var num = _findVhdPhysicalDriveNumber(handle); // close handle to disk NativeMethods.CloseHandle(handle); return(num); }
internal static void DismountVirtualDisk(string vhdfile) { var handle = IntPtr.Zero; // open disk handle var openParameters = new NativeMethods.OPEN_VIRTUAL_DISK_PARAMETERS(); openParameters.Version = NativeMethods.OPEN_VIRTUAL_DISK_VERSION.OPEN_VIRTUAL_DISK_VERSION_1; openParameters.Version1.RWDepth = NativeMethods.OPEN_VIRTUAL_DISK_RW_DEPTH_DEFAULT; var openStorageType = new NativeMethods.VIRTUAL_STORAGE_TYPE(); openStorageType.DeviceId = NativeMethods.VIRTUAL_STORAGE_TYPE_DEVICE_VHD; openStorageType.VendorId = NativeMethods.VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT; var openResult = NativeMethods.OpenVirtualDisk(ref openStorageType, vhdfile, NativeMethods.VIRTUAL_DISK_ACCESS_MASK.VIRTUAL_DISK_ACCESS_ALL, NativeMethods.OPEN_VIRTUAL_DISK_FLAG.OPEN_VIRTUAL_DISK_FLAG_NONE, ref openParameters, ref handle); if (openResult != NativeMethods.ERROR_SUCCESS) { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Native error {0}.", openResult)); } // detach disk var detachResult = NativeMethods.DetachVirtualDisk(handle, NativeMethods.DETACH_VIRTUAL_DISK_FLAG.DETACH_VIRTUAL_DISK_FLAG_NONE, 0); if (detachResult != NativeMethods.ERROR_SUCCESS) { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Native error {0}.", detachResult)); } // close handle to disk NativeMethods.CloseHandle(handle); }