/// <summary>
        /// <para>Compares this <see cref="StorageDisk"/> with another object</para>
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public override bool Equals(object obj)
        {
            StorageDisk that = obj as StorageDisk;

            if (that == null)
            {
                return(false);
            }

            return(this.Type == that.Type && this.Name == that.Name);
        }
        /// <summary>
        /// <para>Pretty print the disk.</para>
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            StringBuilder builder = new StringBuilder();

            builder.Append(this.DriveLetter);
            builder.Append(": ");
            builder.Append(this.Name);
            builder.Append(" (");
            builder.Append(StorageDisk.FormatByte(this.FreeSpace));
            builder.Append(" free of ");
            builder.Append(StorageDisk.FormatByte(this.Size));
            builder.Append(")");
            return(builder.ToString());
        }
        /// <summary>
        /// <para>Gets all available disks of the specified <paramref name="Type"/></para>
        /// </summary>
        /// <param name="Type"></param>
        /// <returns></returns>
        public static List <StorageDisk> GetAvailableDisks(DeviceType Type)
        {
            string query = "SELECT * FROM Win32_DiskDrive";

            if (Type != DeviceType.Any)
            {
                query += " WHERE InterfaceType = '" + Type.ToString() + "'";
            }
            ManagementObjectCollection drives = new ManagementObjectSearcher(query).Get();


            List <StorageDisk> disks = new List <StorageDisk>();

            foreach (ManagementObject drive in drives)                  // browse all queried WMI physical disks
            {
                StorageDisk diskDrive = CreateStorageDiskFromDrive(drive);
                disks.Add(diskDrive);

                ManagementObjectCollection partitions = new ManagementObjectSearcher(String.Format("ASSOCIATORS OF {{Win32_DiskDrive.DeviceID='{0}'}} WHERE AssocClass = Win32_DiskDriveToDiskPartition", drive["DeviceID"])).Get();                     // associate physical disks with partitions

                foreach (ManagementObject partition in partitions)
                {
                    ManagementObjectCollection logicals = new ManagementObjectSearcher(String.Format("ASSOCIATORS OF {{Win32_DiskPartition.DeviceID='{0}'}} WHERE AssocClass = Win32_LogicalDiskToPartition", partition["DeviceID"])).Get();                      // associate partitions with logical disks (drive letter volumes)

                    foreach (ManagementObject logical in logicals)
                    {
                        ManagementObjectCollection volumes = new ManagementObjectSearcher(String.Format("SELECT * FROM Win32_LogicalDisk WHERE Name='{0}'", logical["Name"])).Get();
                        if (volumes.Count == 0)
                        {
                            diskDrive.AddPartition(new Partition(logical));
                        }
                        else
                        {
                            foreach (ManagementObject volume in volumes)
                            {
                                diskDrive.AddPartition(new Partition(volume));
                                break;
                            }
                        }
                    }
                }
            }

            return(disks);
        }
        /// <summary>
        /// <para>Pretty print the disk.</para>
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            StringBuilder builder = new StringBuilder();

            builder.Append(this.Type.ToString());
            builder.Append(": ");
            builder.Append(this.Model);
            builder.Append(" (");
            builder.Append(StorageDisk.FormatByte(this.Size));
            builder.Append(" in ");
            builder.Append(this.Partitions.Count);
            builder.Append(" partition");
            if (this.Partitions.Count != 1)
            {
                builder.Append("s");
            }
            builder.Append(")");
            return(builder.ToString());
        }
        /// <summary>
        /// <para>Creates a new <see cref="StorageDisk"/> from the specified <paramref name="UnitMask"/></para>
        /// </summary>
        /// <param name="UnitMask"></param>
        /// <returns></returns>
        internal static StorageDisk FromUnitMask(int UnitMask)
        {
            if (UnitMask == 0)
            {
                return(new StorageDisk(null, null, null));
            }

            char        Letter = FirstDriveFromMask(UnitMask);
            StorageDisk sd     = null;

            ManagementObjectCollection partitions = new ManagementObjectSearcher(String.Format("ASSOCIATORS OF {{Win32_LogicalDisk.DeviceID='{0}:'}} WHERE AssocClass = Win32_LogicalDiskToPartition", Letter)).Get();

            foreach (ManagementObject partition in partitions)
            {
                ManagementObjectCollection disks = new ManagementObjectSearcher(String.Format("ASSOCIATORS OF {{Win32_DiskPartition.DeviceID='{0}'}} WHERE AssocClass = Win32_DiskDriveToDiskPartition", partition["DeviceID"])).Get();
                foreach (ManagementObject disk in disks)
                {
                    sd = CreateStorageDiskFromDrive(disk);
                    break;
                }
            }
            if (sd == null)
            {
                ManagementObjectCollection cdroms = new ManagementObjectSearcher(String.Format("SELECT * FROM Win32_CdRomDrive WHERE Drive = '{0}:\'", Letter)).Get();
                foreach (ManagementObject cdrom in cdroms)
                {
                    sd = new CdRomDrive(cdrom);
                    break;
                }
            }

            ManagementObjectCollection volumes = new ManagementObjectSearcher(String.Format("SELECT * FROM Win32_LogicalDisk WHERE DeviceID = '{0}:'", Letter)).Get();

            foreach (ManagementObject volume in volumes)
            {
                sd.AddPartition(new Partition(volume));
                break;
            }
            return(sd);
        }