/// <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);
        }