Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }