/// <summary> /// Retrieve device paths that can be opened from a specific device interface guid. /// todo: Make this friendlier & query some more data about the devices being returned. /// </summary> /// <param name="deviceInterface">Guid uniquely identifying the interface to search for</param> /// <returns>List of device paths that can be opened with CreateFile</returns> public static EnumeratedDevice[] EnumerateDevicesByInterface(Guid deviceInterface) { // Horribe horrible things have to be done with SetupDI here. These travesties must never leave this class. List <EnumeratedDevice> outputPaths = new List <EnumeratedDevice>(); IntPtr devInfo = SetupDiGetClassDevs(ref deviceInterface, null, IntPtr.Zero, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); if (devInfo == INVALID_HANDLE_VALUE) { throw new Exception("SetupDiGetClassDevs failed. " + (new Win32Exception()).ToString()); } try { uint deviceIndex = 0; SP_DEVICE_INTERFACE_DATA interfaceData = new SP_DEVICE_INTERFACE_DATA(); bool success = true; for (deviceIndex = 0; ; deviceIndex++) { interfaceData.cbSize = (uint)Marshal.SizeOf(interfaceData); success = SetupDiEnumDeviceInterfaces(devInfo, IntPtr.Zero, ref deviceInterface, deviceIndex, ref interfaceData); if (!success) { if (Marshal.GetLastWin32Error() != ERROR_NO_MORE_ITEMS) { throw new Exception("SetupDiEnumDeviceInterfaces failed " + (new Win32Exception()).ToString()); } // We have reached the end of the list of devices. break; } // This is a valid interface, retrieve its path EnumeratedDevice dev = new EnumeratedDevice() { DevicePath = RetrieveDeviceInstancePath(devInfo, interfaceData), InterfaceGuid = deviceInterface }; // Todo: debug. Not working correctly. /* * dev.DeviceDescription = RetrieveDeviceInstancePropertyString(devInfo, interfaceData, DEVPROPKEY.Device_DeviceDesc); * dev.Manufacturer = RetrieveDeviceInstancePropertyString(devInfo, interfaceData, DEVPROPKEY.Device_Manufacturer); * dev.FriendlyName = RetrieveDeviceInstancePropertyString(devInfo, interfaceData, DEVPROPKEY.Device_FriendlyName); */ outputPaths.Add(dev); } } finally { SetupDiDestroyDeviceInfoList(devInfo); } return(outputPaths.ToArray()); }
internal WinUSBEnumeratedDevice(EnumeratedDevice enumDev) { DevicePath = enumDev.DevicePath; EnumeratedData = enumDev; Match m = Regex.Match(DevicePath, @"vid_([\da-f]{4})"); if (m.Success) { VendorID = Convert.ToUInt16(m.Groups[1].Value, 16); } m = Regex.Match(DevicePath, @"pid_([\da-f]{4})"); if (m.Success) { ProductID = Convert.ToUInt16(m.Groups[1].Value, 16); } m = Regex.Match(DevicePath, @"mi_([\da-f]{2})"); if (m.Success) { UsbInterface = Convert.ToByte(m.Groups[1].Value, 16); } }
/// <summary> /// Retrieve device paths that can be opened from a specific device interface guid. /// todo: Make this friendlier & query some more data about the devices being returned. /// </summary> /// <param name="deviceInterface">Guid uniquely identifying the interface to search for</param> /// <returns>List of device paths that can be opened with CreateFile</returns> public static EnumeratedDevice[] EnumerateDevicesByInterface(Guid deviceInterface) { // Horribe horrible things have to be done with SetupDI here. These travesties must never leave this class. List<EnumeratedDevice> outputPaths = new List<EnumeratedDevice>(); IntPtr devInfo = SetupDiGetClassDevs(ref deviceInterface, null, IntPtr.Zero, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); if(devInfo == INVALID_HANDLE_VALUE) { throw new Exception("SetupDiGetClassDevs failed. " + (new Win32Exception()).ToString()); } try { uint deviceIndex = 0; SP_DEVICE_INTERFACE_DATA interfaceData = new SP_DEVICE_INTERFACE_DATA(); bool success = true; for (deviceIndex = 0; ; deviceIndex++) { interfaceData.cbSize = (uint)Marshal.SizeOf(interfaceData); success = SetupDiEnumDeviceInterfaces(devInfo, IntPtr.Zero, ref deviceInterface, deviceIndex, ref interfaceData); if (!success) { if (Marshal.GetLastWin32Error() != ERROR_NO_MORE_ITEMS) { throw new Exception("SetupDiEnumDeviceInterfaces failed " + (new Win32Exception()).ToString()); } // We have reached the end of the list of devices. break; } // This is a valid interface, retrieve its path EnumeratedDevice dev = new EnumeratedDevice() { DevicePath = RetrieveDeviceInstancePath(devInfo, interfaceData), InterfaceGuid = deviceInterface }; // Todo: debug. Not working correctly. /* dev.DeviceDescription = RetrieveDeviceInstancePropertyString(devInfo, interfaceData, DEVPROPKEY.Device_DeviceDesc); dev.Manufacturer = RetrieveDeviceInstancePropertyString(devInfo, interfaceData, DEVPROPKEY.Device_Manufacturer); dev.FriendlyName = RetrieveDeviceInstancePropertyString(devInfo, interfaceData, DEVPROPKEY.Device_FriendlyName); */ outputPaths.Add(dev); } } finally { SetupDiDestroyDeviceInfoList(devInfo); } return outputPaths.ToArray(); }