USB00*端口的背景
插入USB端口的打印机,安装打印机驱动,在控制面板设备与打印机处的打印机对象上右击,可以看到打印机端口。对于不少型号,这个端口是USB001
或USB002
之类的。
经观察,这些USB00*
端口并不是打印机驱动所创建的。即使不安装打印机驱动,插入此型号的打印机也会创建或者复用USB00*
端口。从setupapi.dev.log
中可知,端口是在C:\Windows\INF\usbprint.inf
的指示下创建的。所谓复用,指的是,若USB001端口已存在并且没有关联上打印机,那么此时插入相关型号打印机,此打印机设备会跟USB001端口绑定起来。
在设备管理器中可以看到USB00*
端口和设备的对应关系。这里的USB打印支持的设备还具有硬件ID属性
vid、pid。若vid、pid均相同,我认为它们都是同一型号的打印机。
USB00*端口的背景
插入USB端口的打印机,安装打印机驱动,在控制面板设备与打印机处的打印机对象上右击,可以看到打印机端口。对于不少型号,这个端口是USB001
或USB002
之类的。
经观察,这些USB00*
端口并不是打印机驱动所创建的。即使不安装打印机驱动,插入此型号的打印机也会创建或者复用USB00*
端口。从setupapi.dev.log
中可知,端口是在C:\Windows\INF\usbprint.inf
的指示下创建的。所谓复用,指的是,若USB001端口已存在并且没有关联上打印机,那么此时插入相关型号打印机,此打印机设备会跟USB001端口绑定起来。
在设备管理器中可以看到USB00*
端口和设备的对应关系。这里的USB打印支持的设备还具有硬件ID属性
vid、pid。若vid、pid均相同,我认为它们都是同一型号的打印机。
c++代码寻找USB00*所在的设备
类似于设备管理器,本节的目标是:遍历设备管理器里的设备大类,再找每一个设备,再找设备里的各种属性。直到找到我们关注的vid、pid,然后查看其总线关系
里的USB00*
编号。
相关概念
-
设备安装类:
HKLM\SYSTEM\CurrentControlSet\Control\Class
里的每一个key都是设备安装类。其中的{36fc9e60-c465-11cf-8056-444553540000}
就是设备管理器中的通用串行总线控制器
。 -
设备接口类:
HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses
里的每一个key都是设备接口类。 -
获取设备属性的两类api:一类是
SetupDiGetDeviceRegistryProperty
,参数一来自SetupDiGetClassDevs
。一类是CM_Get_DevNode_PropertyW
,参数三来自SetupDiEnumDeviceInfo
。我们关注的总线关系
需通过CM_Get_DevNode_PropertyW
获取。
c++ demo
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <Cfgmgr32.h>
#pragma comment(lib, "Cfgmgr32.lib")
#include <SetupAPI.h>
#pragma comment