//Name: GetAll //Inputs: none //Outputs: string array //Errors: This method may throw the following errors. // Failed to enumerate device tree! // Invalid handle! //Remarks: This is code I cobbled together from a number of newsgroup threads // as well as some C++ stuff I translated off of MSDN. Seems to work. // The idea is to come up with a list of devices, same as the device // manager does. Currently it uses the actual "system" names for the // hardware. It is also possible to use hardware IDs. See the docs // for SetupDiGetDeviceRegistryProperty in the MS SDK for more details. public List <DEVICE_INFO> GetAll() { List <DEVICE_INFO> HWList = new List <DEVICE_INFO>(); try { Guid myGUID = System.Guid.Empty; IntPtr hDevInfo = Native.SetupDiGetClassDevs(ref myGUID, 0, IntPtr.Zero, Native.DIGCF_ALLCLASSES | Native.DIGCF_PRESENT); if (hDevInfo.ToInt64() == Native.INVALID_HANDLE_VALUE) { throw new Exception("Invalid Handle"); } Native.SP_DEVINFO_DATA DeviceInfoData; DeviceInfoData = new Native.SP_DEVINFO_DATA(); //for 32-bit, IntPtr.Size = 4 //for 64-bit, IntPtr.Size = 8 if (IntPtr.Size == 4) { DeviceInfoData.cbSize = 28; } else if (IntPtr.Size == 8) { DeviceInfoData.cbSize = 32; } //is devices exist for class DeviceInfoData.devInst = 0; DeviceInfoData.classGuid = System.Guid.Empty; DeviceInfoData.reserved = 0; UInt32 i; StringBuilder DeviceName = new StringBuilder(""); StringBuilder DeviceFriendlyName = new StringBuilder(""); StringBuilder DeviceHardwareId = new StringBuilder(""); DeviceName.Capacity = DeviceFriendlyName.Capacity = DeviceHardwareId.Capacity = Native.MAX_DEV_LEN; for (i = 0; Native.SetupDiEnumDeviceInfo(hDevInfo, i, DeviceInfoData); i++) { DeviceName.Length = DeviceFriendlyName.Length = DeviceHardwareId.Length = 0; if (!Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_DEVICEDESC, 0, DeviceName, Native.MAX_DEV_LEN, IntPtr.Zero)) { continue; } Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_FRIENDLYNAME, 0, DeviceFriendlyName, Native.MAX_DEV_LEN, IntPtr.Zero); Native.SetupDiGetDeviceRegistryProperty(hDevInfo, DeviceInfoData, Native.SPDRP_HARDWAREID, 0, DeviceHardwareId, Native.MAX_DEV_LEN, IntPtr.Zero); UInt32 status, problem; string dstatustr = ""; DeviceStatus deviceStatus = DeviceStatus.Unknown; if (Native.CM_Get_DevNode_Status(out status, out problem, DeviceInfoData.devInst, 0) == Native.CR_SUCCESS) { deviceStatus = ((status & Native.DN_STARTED) > 0) ? DeviceStatus.Enabled : DeviceStatus.Disabled; } HWList.Add(new DEVICE_INFO { name = DeviceName.ToString(), friendlyName = DeviceFriendlyName.ToString(), hardwareId = DeviceHardwareId.ToString(), status = deviceStatus, statusstr = dstatustr }); } Native.SetupDiDestroyDeviceInfoList(hDevInfo); } catch (Exception ex) { throw new Exception("Failed to enumerate device tree!", ex); } return(HWList); }