// Expects a CIM_USBDevice object // http://msdn.microsoft.com/en-us/library/aa388649%28v=vs.85%29.aspx internal UsbDevice(ManagementObject o) { Uuid = o.Str("DeviceID"); UsbDevice = this; // Parse the vendor and product IDs out; best way I could find; patches welcome VendorId = Int32.Parse(Uuid.Substring(Uuid.IndexOf("VID_") + 4, 4), NumberStyles.HexNumber); ProductId = Int32.Parse(Uuid.Substring(Uuid.IndexOf("PID_") + 4, 4), NumberStyles.HexNumber); }
// Expects a Win32_DiskDrive object // http://msdn.microsoft.com/en-us/library/aa394132%28v=VS.85%29.aspx internal Volume(ManagementObject o) { if (o.ClassPath.ClassName != "Win32_DiskDrive") { throw new ArgumentException(o.ClassPath.ClassName, "o"); } Uuid = o.Str("PNPDeviceID"); Name = o.Str("Caption"); // Get USB vendor/product ids from the associated CIM_USBDevice // This way of associating them (via a substring of the PNPDeviceID) is quite a hack; patches welcome var match = regex.Match(Uuid); if (match.Success) { string query = String.Format("SELECT * FROM CIM_USBDevice WHERE DeviceID LIKE '%{0}'", match.Groups[1].Captures[0].Value); UsbDevice = HardwareManager.Query(query).Select(u => new UsbDevice(u)).FirstOrDefault(); } // Get MountPoint and more from the associated LogicalDisk // FIXME this assumes one partition for the device foreach (ManagementObject partition in o.GetRelated("Win32_DiskPartition")) { foreach (ManagementObject disk in partition.GetRelated("Win32_LogicalDisk")) { //IsMounted = (bool)ld.GetPropertyValue ("Automount") == true; //IsReadOnly = (ushort) ld.GetPropertyValue ("Access") == 1; MountPoint = disk.Str("Name") + "/"; FileSystem = disk.Str("FileSystem"); Capacity = (ulong)disk.GetPropertyValue("Size"); Available = (long)(ulong)disk.GetPropertyValue("FreeSpace"); return; } } }