WDK_VidPidQuery.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "stdafx.h"
  2. #include <winioctl.h>
  3. #include <setupapi.h>
  4. #include "WDK_VidPidQuery.h"
  5. #pragma comment (lib, "Setupapi.lib")
  6. #define DeviceInstanceIdSize 256 // 设备实例ID最大长度
  7. // 获取系统的VID和PID集合
  8. INT WINAPI WDK_WhoAllVidPid( HIDD_VIDPID* pVidPid, INT iCapacity, const GUID* SetupClassGuid, const GUID* InterfaceClassGuid )
  9. {
  10. // 检测入口参数
  11. if (pVidPid == NULL || iCapacity <= 0) return 0;
  12. // 根据设备安装类GUID创建空的设备信息集合
  13. HDEVINFO DeviceInfoSet = SetupDiCreateDeviceInfoList( SetupClassGuid, NULL );
  14. if (DeviceInfoSet == INVALID_HANDLE_VALUE) return -1;
  15. // 根据设备安装类GUID获取设备信息集合
  16. HDEVINFO hDevInfo;
  17. if(InterfaceClassGuid == NULL)
  18. hDevInfo = SetupDiGetClassDevsEx( NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_DEVICEINTERFACE | DIGCF_PRESENT, DeviceInfoSet, NULL, NULL );
  19. else
  20. hDevInfo = SetupDiGetClassDevsEx( InterfaceClassGuid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT, DeviceInfoSet, NULL, NULL );
  21. if (hDevInfo == INVALID_HANDLE_VALUE) return -1;
  22. // 存储得到的VID和PID数目
  23. INT iTotal = 0;
  24. // 存储设备实例ID
  25. TCHAR DeviceInstanceId[DeviceInstanceIdSize];
  26. // 存储设备信息数据
  27. SP_DEVINFO_DATA DeviceInfoData;
  28. DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
  29. // 获取设备信息数据
  30. DWORD DeviceIndex = 0;
  31. while (SetupDiEnumDeviceInfo( hDevInfo, DeviceIndex++, &DeviceInfoData))
  32. {
  33. // 获取设备实例ID
  34. if (SetupDiGetDeviceInstanceId(hDevInfo, &DeviceInfoData, DeviceInstanceId, DeviceInstanceIdSize, NULL))
  35. {
  36. // 从设备实例ID中提取VID和PID
  37. TCHAR* pVidIndex = _tcsstr(DeviceInstanceId, TEXT("VID_"));
  38. if (pVidIndex == NULL) continue;
  39. TCHAR* pPidIndex = _tcsstr(pVidIndex + 4, TEXT("PID_"));
  40. if (pPidIndex == NULL) continue;
  41. USHORT VendorID = _tcstoul(pVidIndex + 4, NULL, 16);
  42. USHORT ProductID = _tcstoul(pPidIndex + 4, NULL, 16);
  43. // 剔除重复的VID和PID
  44. if (!WDK_isExistVidPid( VendorID, ProductID, pVidPid, iTotal ))
  45. {
  46. pVidPid[iTotal].VendorID = VendorID;
  47. pVidPid[iTotal].ProductID = ProductID;
  48. if (++iTotal >= iCapacity) break;
  49. }
  50. }
  51. }
  52. return iTotal;
  53. }
  54. // 判断VID和PID是否已经存在
  55. BOOL WINAPI WDK_isExistVidPid( USHORT VendorID, USHORT ProductID, const HIDD_VIDPID* pVidPid, INT iSize )
  56. {
  57. if (pVidPid != NULL)
  58. {
  59. for (INT i = 0; i < iSize; i++)
  60. {
  61. if (pVidPid[i].VendorID == VendorID && pVidPid[i].ProductID == ProductID)
  62. return TRUE;
  63. }
  64. }
  65. return FALSE;
  66. }