/// <summary> /// Gets a list of WinUSB device paths for the specified interface guid. /// </summary> /// <param name="deviceInterfaceGuid">The DeviceInterfaceGUID to search for.</param> /// <param name="devicePathList">A list of device paths associated with the <paramref name="deviceInterfaceGuid"/>.</param> /// <returns>True of one or more device paths was found.</returns> /// <remarks> /// Each device path string in the <paramref name="devicePathList"/> represents a seperate WinUSB device (interface). /// </remarks> /// <seealso cref="GetWinUsbRegistryList"/> public static bool GetDevicePathList(Guid deviceInterfaceGuid, out List<String> devicePathList) { devicePathList = new List<string>(); int devicePathIndex = 0; SetupApi.SP_DEVICE_INTERFACE_DATA interfaceData = SetupApi.SP_DEVICE_INTERFACE_DATA.Empty; SetupApi.DeviceInterfaceDetailHelper detailHelper; IntPtr deviceInfo = SetupApi.SetupDiGetClassDevs(ref deviceInterfaceGuid, null, IntPtr.Zero, SetupApi.DIGCF.PRESENT | SetupApi.DIGCF.DEVICEINTERFACE); if (deviceInfo != IntPtr.Zero) { while ((SetupApi.SetupDiEnumDeviceInterfaces(deviceInfo, null, ref deviceInterfaceGuid, devicePathIndex, ref interfaceData))) { int length = 1024; detailHelper = new SetupApi.DeviceInterfaceDetailHelper(length); bool bResult = SetupApi.SetupDiGetDeviceInterfaceDetail(deviceInfo, ref interfaceData, detailHelper.Handle, length, out length, null); if (bResult) devicePathList.Add(detailHelper.DevicePath); devicePathIndex++; } } if (devicePathIndex == 0) UsbError.Error(ErrorCode.Win32Error, Marshal.GetLastWin32Error(), "GetDevicePathList", typeof(SetupApi)); if (deviceInfo != IntPtr.Zero) SetupApi.SetupDiDestroyDeviceInfoList(deviceInfo); return (devicePathIndex > 0); }
private static bool HidUsbRegistryCallBack(IntPtr DeviceInfoSet, int deviceIndex, ref SetupApi.SP_DEVINFO_DATA DeviceInfoData, object classEnumeratorCallbackParam1) { List<WinHidRegistry> deviceList = (List<WinHidRegistry>)classEnumeratorCallbackParam1; Guid hid = GetHidGuid(); int devicePathIndex = 0; SetupApi.SP_DEVICE_INTERFACE_DATA interfaceData = SetupApi.SP_DEVICE_INTERFACE_DATA.Empty; SetupApi.DeviceInterfaceDetailHelper detailHelper; SetupApi.SP_DEVINFO_DATA devInfoData = SetupApi.SP_DEVINFO_DATA.Empty; // [1] IntPtr deviceInfo = SetupApi.SetupDiGetClassDevs(ref hid, null, IntPtr.Zero, SetupApi.DIGCF.PRESENT | SetupApi.DIGCF.DEVICEINTERFACE); if (deviceInfo != IntPtr.Zero) { while ((SetupApi.SetupDiEnumDeviceInterfaces(deviceInfo, null, ref hid, devicePathIndex, ref interfaceData))) { int length = 1024; detailHelper = new SetupApi.DeviceInterfaceDetailHelper(length); bool bResult = SetupApi.SetupDiGetDeviceInterfaceDetail(deviceInfo, ref interfaceData, detailHelper.Handle, length, out length, ref devInfoData); if (bResult) { WinHidRegistry regInfo = new WinHidRegistry(); SetupApi.getSPDRPProperties(deviceInfo, ref devInfoData, regInfo.mDeviceProperties); // Use the actual winusb device path for SYMBOLIC_NAME_KEY. This will be used to open the device. regInfo.mDeviceProperties.Add(SYMBOLIC_NAME_KEY, detailHelper.DevicePath); // Debug.WriteLine(detailHelper.DevicePath); regInfo.mDeviceInterfaceGuids = new Guid[] { hid }; StringBuilder sbDeviceID = new StringBuilder(1024); if (SetupApi.CM_Get_Device_ID(devInfoData.DevInst, sbDeviceID, sbDeviceID.Capacity, 0) == SetupApi.CR.SUCCESS) { regInfo.mDeviceProperties[DEVICE_ID_KEY] = sbDeviceID.ToString(); } deviceList.Add(regInfo); } devicePathIndex++; } } if (devicePathIndex == 0) UsbError.Error(ErrorCode.Win32Error, Marshal.GetLastWin32Error(), "GetDevicePathList", typeof(SetupApi)); if (deviceInfo != IntPtr.Zero) SetupApi.SetupDiDestroyDeviceInfoList(deviceInfo); return (devicePathIndex > 0); }