public static VirtualHardDisk Open(string filename,
            VirtualDiskAccessMasks accessMask = VirtualDiskAccessMasks.All,
            OpenVirtualDiskFlags flag = OpenVirtualDiskFlags.None, uint rwDepth = 0)
        {
            var storageType = new VirtualStorageType();

            var parameters = new OpenVirtualDiskParameters
            {
                Version = OpenVirtualDiskVersions.Version1,
                Version1 = new OpenVirtualDiskParametersVersion1 { RWDepth = rwDepth}
            };

            var handle = VirtualDiskCore.OpenVirtualDisk(storageType, filename, accessMask, flag, parameters);

            var vhd = new VirtualHardDisk(filename, handle);

            // ReSharper disable once InvertIf
            if (vhd.VirtualStorageType.DeviceId == VirtualStorageDeviceTypes.Iso)
            {
                vhd.Dispose();
                throw new NotSupportedException("This class does not support ISO files.");
            }

            return vhd;
        }
        static void Main(string[] args)
        {
            VirtualStorageType storageType = new VirtualStorageType();

            storageType.DeviceId = VirtualStorageDeviceTypes.Vhdx;
            storageType.VendorId = VirtualStorageType.VendorIdMicrosoft;

            VirtualDiskSafeHandle diskHandle = new VirtualDiskSafeHandle();

            string filename = @"C:\temp\test.vhdx";

            OpenVirtualDiskParameters readParameters = new OpenVirtualDiskParameters();

            readParameters.Version  = OpenVirtualDiskVersions.Version2;
            readParameters.Version2 = new OpenVirtualDiskParametersVersion2()
            {
                GetInfoOnly    = false,
                ReadOnly       = false,
                ResiliencyGuid = Guid.Empty,
            };

            uint result = VirtualDiskApi.OpenVirtualDisk(storageType,
                                                         filename,
                                                         VirtualDiskAccessMasks.None,
                                                         OpenVirtualDiskFlags.None,
                                                         readParameters,
                                                         diskHandle);

            RawSecurityDescriptor       descriptor = new RawSecurityDescriptor("O:BAG:BAD:(A;;GA;;;WD)");
            AttachVirtualDiskParameters parameters = new AttachVirtualDiskParameters();

            parameters.Version = AttachVirtualDiskVersions.Version1;

            result = VirtualDiskApi.AttachVirtualDisk(diskHandle, descriptor, AttachVirtualDiskFlags.PermanentLifetime, 0, parameters, null);



            diskHandle.Close();
            diskHandle = null;
        }
        public static VirtualHardDisk2 Open(string filename, OpenVirtualDiskFlags flag = OpenVirtualDiskFlags.None,
            bool getInfoOnly = false, bool readOnly = false, Guid resiliencyGuid = default(Guid))
        {
            var storageType = new VirtualStorageType();

            var parameters = new OpenVirtualDiskParameters
            {
                Version = OpenVirtualDiskVersions.Version2,
                Version2 =
                    new OpenVirtualDiskParametersVersion2
                    {
                        GetInfoOnly = getInfoOnly,
                        ReadOnly = readOnly,
                        ResiliencyGuid = resiliencyGuid
                    }
            };

            // When using OpenVirtulaDiskVersions.Version2, VirtualDiskAccessMasks *must* be set to None
            var handle = VirtualDiskCore.OpenVirtualDisk(storageType, filename, VirtualDiskAccessMasks.None, flag, parameters);

            var vhd = new VirtualHardDisk2(filename, handle);

            // ReSharper disable once InvertIf
            if (vhd.VirtualStorageType.DeviceId == VirtualStorageDeviceTypes.Iso)
            {
                vhd.Dispose();
                throw new NotSupportedException("This class does not support ISO files.");
            }

            return vhd;
        }