具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式做进一步地详细描述。
实施例1
本发明实施例提供了一种定位设备所连接的USB端口的方法,具体地,在本实施例中以HID设备为例进行说明,HID设备通过USB HUB连接到上位机上,其中连接在上位机与HID设备之间的USB HUB可以是一个或多个。
参见图1,一种定位HID设备所连接的USB端口的方法,具体实现步骤如下:
步骤101:上位机读取连接在自身上的HID设备的HID路径;
其中,与上位机相连的HID设备可以是一个或多个,当有多个HID设备时,则上位机读取所有HID设备的HID路径,具体地,在本实施例中以一个HID设备为例进行说明;
进一步地,HID路径可以从WM_DEVICECHANGE消息传入的参数中读取,也可以通过调用SetupDiGetDeviceInterfaceDetail来枚举已连接的HID设备,获取其HID路径;
具体地,读取得到的HID路径为\\?\hid#vid_096e&pid_0304#7&2c7bc087&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}。
步骤102:上位机对主控制器进行查询,获取主控制器上连接的根USB HUB的名称;
在本实施例中,上位机具体通过对主控制器发送IOCTL_USB_GET_ROOT_HUB_NAME请求,获取连接在主控制器上的根USBHUB的名称。
步骤103:上位机打开当前USB HUB,并对该当前USB HUB进行查询,获得当前USB HUB的端口数目;
在本实施例中,当是第一次对该主控制器上连接的设备进行查询时,则该主控制器上连接的根USB HUB即是当前USB HUB;
具体地,对当前USB HUB进行查询的方法为:
上位机向当前USB HUB发送IOCTL_USB_GET_NODE_INFORMATION请求,获取当前USB HUB的端口数目。
步骤104:上位机对当前USB HUB的当前端口进行查询,获取当前端口上的设备连接信息;
在本实施例中,当是第一次对此当前USB HUB进行查询时,则此当前USBHUB的第一端口则为当前端口;
其中,对当前USB HUB的当前端口进行查询的方法为:
上位机向当前USB HUB的当前端口发送IOCTL_USB_GET_NODE_CONNECTION_INFORMATION请求,获取该端口上的设备连接信息,其中设备连接信息中具体包括连接状态标志位、HUB标志位、厂家标识符信息和设备标识符信息等信息;
具体地,获得的其中一个设备连接信息为:
USB_NODE_CONNECTION_INFORMATION connectionInfo
connectionInfo.connectionIndex=0x00000003
connectionInfo.DeviceDescriptor.blength=0x12
connectionInfo.DeviceDescriptor.bDescriptorType=0x01
connectionInfo.DeviceDescriptor.bcdUSB=0x0110
connectionInfo.DeviceDescriptor.bDeviceClass=0x00
connectionInfo.DeviceDescriptor.bDeviceSubClass=0x00
connectionInfo.DeviceDescriptor.bDeviceProtocol=0x00
connectionInfo.DeviceDescriptor.bMaxPacketSize0=0x10
connectionInfo.DeviceDescriptor.idVendor=0x096e
connectionInfo.DeviceDescriptor.idProduct=0x0304
connectionInfo.DeviceDescriptor.bcdDevice=0x0104
connectionInfo.DeviceDescriptor.iManufacturer=0x01
connectionInfo.DeviceDescriptor.iProduct=0x02
connectionInfo.DeviceDescriptor.iSerialNumber=0x00
connectionInfo.DeviceDescriptor.bNumConfigurations=0x01
connectionInfo.CurrentConfigurationValue=0x01
connectionInfo.LowSpeed=0x00
connectionInfo.DeviceIsHub=0x00
connectionInfo.DeviceAddress=0x0002
connectionInfo.NumberOfOpenPipes=0x00000002
connectionInfo.ConnectionStatus=0x00000001
connectionInfo.PipeList=0x00150f33。
步骤105:根据获得的设备连接信息对当前端口进行判断,若判断得到当前端口上没有连接设备,则执行步骤106,若判断得到当前端口上连接的是USBHUB,则执行步骤111,若判断得到当前端口上连接的是普通USB设备,则执行步骤112;
在本实施例中,根据获得的设备连接信息对当前端口进行判断的方法具体如下:
先对设备连接信息中的连接状态标志位connectionInfo.ConnectionStatus进行判断,当判断得到连接状态标志位connectionInfo.ConnectionStatus为0x00000001时,则表示该当前端口上连接了设备,当判断得到连接状态标志位connectionInfo.ConnectionStatus为0x00000000时,则表示该当前端口上没有连接设备;
进一步地,当判断得到连接状态标志位connectionInfo.ConnectionStatus为0x00000001时,还需要判断设备连接信息中的HUB标志位connectionInfo.DeviceIsHub是为0x00还是为0x01,当判断得到HUB标志位connectionInfo.DeviceIsHub为0x01,则表示该当前端口上连接的是USB HUB,当判断得到HUB标志位connectionInfo.DeviceIsHub为0x00,则表示该当前端口上连接的是普通USB设备。
步骤106:上位机判断是否已查询完当前USB HUB的所有端口,若是,则执行步骤107,若否,则执行步骤110;
在本实施例中,上位机具体根据步骤103中所获得的当前USB HUB的端口数目来判断是否已查询完当前USB HUB的所有端口。
步骤107:判断当前USB HUB是否存在上一级USB HUB,若是,则执行步骤108,若否,则执行步骤109;
步骤108:将当前USB HUB的上一级USB HUB作为当前USB HUB,然后返回到步骤106;
步骤109:上位机判断是否已查询完所有的主控制器,若是,则结束操作,并提示无法对步骤101中的HID设备进行定位,若否,则返回到步骤102对下一个主控制器进行查询;
在本实施例中,判断是否已查询完所有的主控制器的方法具体为:
上位机预先通过遍历硬件设备管理器可以知道主控制器的个数,当上位机查询完一个主控制器后则接着查询下一个主控制器,直到查询的主控制器的个数与上述遍历得到的主控制器的个数相等时,则表示已查询完所有的主控制器,当预先知道主控制器的个数为1时,则查询完一个主控制器后则直接结束操作,并提示无法对步骤101中的HID设备进行定位;
或者,
上位机依次打开设备名称开头为HDC的设备,如HDC1、HDC2、HDC3、......,若打开成功,则说明还存在没有查询过的主控制器,若打开失败,则说明已查询完所有的主控制器;
具体以上位机上包含多个主控制器为例进行说明,当查询完一个主控制器,及该主控制器所连接的所有设备后,上位机继续查询下一个主控制器,以及该主控制器所连接的所有设备,直到所有的主控制器都查询完毕;
或者,在本实施例中,当上位机包含多个主控制器时,查询的方法还可以为:上位机先查询一个主控制器,得到该主控制器上连接的根USB HUB的名称,然后不接着继续查询该根USB HUB,而是开始查询下一个主控制器,直到所有的主控制器都查询完毕,再开始查询主控制器上所连接的各个根USB HUB;
进一步地,在实际应用过程中,上位机上也有可能只含有一个主控制器,此时本实施例中则不需要再执行步骤109,直接查询该主控制器上连接的根USBHUB,以及根USB HUB上连接的设备即可。
步骤110:将当前USB HUB的当前端口的下一个端口作为当前端口,并返回到步骤104;
步骤111:将连接的USB HUB作为当前USB HUB,然后返回到步骤103;
步骤112:上位机获取该普通USB设备在驱动程序下面的路径DriverKeyName;
具体地,由于在实际应用过程中,上位机上可能连接了多个相同类型的设备,如多个HID设备,因此仅凭步骤104获得的设备连接信息中的厂家标识符信息VID和设备标识符信息PID并不能正确定位到该HID设备所连接的端口,所以本实施例中还需要利用DriverKeyName;
在本实施例中,获取DriverKeyName的具体方法为:
上位机向该普通USB设备发送IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME请求,接收该普通USB设备返回的相关信息,其中返回的信息包括参数DriverKeyName,并且返回的信息的结构具体定义为USB_NODE_CONNECTION_DRIVERKEY_NAME;
其中,获取DriverKeyName的实现代码如下:
具体地,本实施例中获取得到的DriverKeyName为:{745A17A0-74D3-11D0-B6FE-00A0C90F57DA}\0120
步骤113:根据步骤104获得的设备连接信息中的VID和PID,在该普通USB设备的注册表路径下查找Driver键值的数据与driverKeyName匹配的子项;
在本实施例中,步骤104获得的设备连接信息中的VID和PID分别为0x096e和0x0304;
查找Driver键值的数据与driverKeyName匹配的子项的方法具体为:
查找该普通USB设备的注册表路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_096e&Pid_0304下面的所有子项,找到Driver键值的数据与driverKeyName匹配的子项,即找到Driver键值的数据为{745A17A0-74D3-11D0-B6FE-00A0C90F57DA}\0120的子项;
具体地,在本实施例中找到的子项为6&c195ce&0&3。
步骤114:读取查找到的子项下的ParentIdPrefix键值的数据;
具体地,在本实施例中,读取得到的ParentIdPrefix键值的数据为7&2c7bc087&0。
步骤115:判断步骤101读取得到的HID路径中是否包含步骤114读取得到ParentIdPrefix键值的数据,若否,则返回到步骤106,若是,则表示目标HID设备即连接在该当前端口上,执行步骤116;
在本实施例中,具体为判断HID路径\\?\hid#vid_096e&pid_0304#7&2c7bc087&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}中是否包含ParentIdPrefix键值的数据7&2c7bc087&0,由此可知,步骤101HID路径中包含ParentIdPrefix键值的数据,因此表示目标HID设备即连接在该USB端口上,执行步骤116。
步骤116:上位机将步骤101中的HID设备的HID路径与上述当前端口进行关联,定位该HID设备所连接的当前端口。
进一步地,在本实施例中,步骤105至步骤111还可以通过如下步骤实现:
步骤105’:根据获取的设备连接信息对当前端口进行判断,若判断得到当前端口上没有连接设备,则执行步骤106’,若判断得到当前端口上连接的是USBHUB,则执行步骤111’,若判断得到当前端口上连接的是普通USB设备,则执行步骤步骤112;
步骤106’:上位机判断是否已查询完当前USB HUB的所有端口,若否,则执行步骤107’,若是,则执行步骤108’;
步骤107’:将当前USB HUB的当前端口的下一个端口作为当前端口,并返回到步骤104;
步骤108’:判断是否存在已编号且未查询过的USB HUB,若是,则执行步骤109’,若否,则执行步骤110’;
步骤109’:将编号最前面的USB HUB作为当前USB HUB,并返回到步骤103;
步骤110’:上位机判断是否已查询完所有的主控制器,若是,则结束操作,并提示无法对步骤101中的HID设备进行定位,若否,则返回步骤102对下一个主控制器进行查询;
步骤111’:上位机判断是否存在已经编号的USB HUB,若否,则将此连接的USB HUB编号为第一USB HUB,返回到步骤106’,若是,则接着已存在的编号继续对此连接的USB HUB进行编号,返回到步骤106’。
本实施例提供了一种定位HID设备所连接的USB端口的方法,通过本实施例提供的方法就可以定位HID设备所连接的USB端口。
实施例2
本发明实施例提供了一种定位设备所连接的USB端口的方法,具体地,在本实施例中以CCID设备为例进行说明,CCID设备通过USB HUB连接到上位机上,其中连接在上位机与CCID设备之间的USB HUB可以是一个或多个。
参见图2,一种定位CCID设备所连接的USB端口的方法,具体实现步骤如下:
步骤201:上位机读取连接在自身上的CCID设备的USB路径;
其中,与上位机相连的CCID设备可以是一个或多个,当有多个CCID设备时,则上位机读取所有CCID设备的USB路径,具体地,在本实施例中以一个CCID设备为例进行说明;
进一步地,CCID设备的USB路径可以从WM_DEVICECHANGE消息传入的参数中读取,也可以通过调用SetupDiGetDeviceInterfaceDetail来枚举已连接的CCID设备,获取其USB路径;
具体地,在本实施例中,读取得到的CCID设备的USB路径为\\?\usb#vid_096e&pid_070f#6&c195ce&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
步骤202:上位机对主控制器进行查询,获取主控制器上连接的根USB HUB的名称;
在本实施例中,上位机具体通过对主控制器发送IOCTL_USB_GET_ROOT_HUB_NAME请求,获取连接在主控制器上的根USBHUB的名称。
步骤203:上位机打开当前USB HUB,并对该当前USB HUB进行查询,获得该当前USB HUB的端口数目;
在本实施例中,当是第一次对该主控制器上连接的设备进行查询时,则主控制器上连接的根USB HUB即是当前USB HUB;
并且,对当前USB HUB进行查询的方法具体为:
上位机向当前USB HUB发送IOCTL_USB_GET_NODE_INFORMATION请求,获得该当前USB HUB的端口数目。
步骤204:上位机对当前USB HUB的当前端口进行查询,获取当前端口上的设备连接信息;
在本实施例中,当是第一次对此当前USB HUB进行查询时,则此当前USBHUB的第一端口即为当前端口;
其中,对当前USB HUB的当前端口进行查询的方法为:
上位机向当前USB HUB的当前端口发送IOCTL_USB_GET_NODE_CONNECTION_INFORMATION请求,获取该当前端口上的设备连接信息,其中设备连接信息中具体包括连接状态标志位、HUB标志位、厂家标识符信息和设备标识符信息等信息;
具体地,本实施例中获得的其中一个设备连接信息为:
USB_NODE_CONNECTION_INFORMATION connectionInfo;
connectionInfo.ConnectionIndex=0x00000002;
connectionInfo.DeviceDescriptor.bLength=0x12;
connectionInfo.DeviceDescriptor.bDescriptorType=0x01;
connectionInfo.DeviceDescriptor.bcdUSB=0x0110
connectionInfo.DeviceDescriptor.bDeviceClass=0x00
connectionInfo.DeviceDescriptor.bDeviceSubClass=0x00
connectionInfo.DeviceDescriptor.bDeviceProtocol=0x00
connectionInfo.DeviceDescriptor.bMaxPacketSize0=0x08
connectionInfo.DeviceDescriptor.idVendor=0x096e
connectionInfo.DeviceDescriptor.idProduct=0x070f
connectionInfo.DeviceDescriptor.bcdDevice=0x2100
connectionInfo.DeviceDescriptor.iManufacturer=0x01
connectionInfo.DeviceDescriptor.iProduct=0x02
connectionInfo.DeviceDescriptor.iSerialNumber=0x00
connectionInfo.DeviceDescriptor.bNumConfigurations=0x01
connectionInfo.CurrentConfigurationValue=0x01
connectionInfo.LowSpeed=0x00
connectionInfo.DeviceIsHub=0x00
connectionInfo.DeviceAddress=0x0002
connectionInfo.NumberOfOpenPipes=0x00000002
connectionInfo.ConnectionStatus=0x00000001
connectionInfo.PipeList=0x00170093
步骤205:根据获得的设备连接信息对当前端口进行判断,若判断得到当前端口上没有连接设备,则执行步骤206,若判断得到当前端口上连接的是USBHUB,则执行步骤210,若判断得到当前端口上连接的是普通USB设备,则执行步骤211;
在本实施例中,根据获得的设备连接信息对当前端口进行判断的方法具体如下:
先对设备连接信息中的连接状态标志位connectionInfo.ConnectionStatus进行判断,当判断得到连接状态标志位connectionInfo.ConnectionStatus为0x00000001时,则表示该当前端口上连接了设备,当判断得到连接状态标志位connectionInfo.ConnectionStatus为0x00000000时,则表示该当前端口上没有连接设备;
进一步地,当判断得到连接状态标志位connectionInfo.ConnectionStatus为0x00000001时,还需要判断设备连接信息中的HUB标志位connectionInfo.DeviceIsHub是为0x00还是为0x01,当判断得到HUB标志位connectionInfo.DeviceIsHub为0x01,则表示该当前端口上连接的是USB HUB,当判断得到HUB标志位connectionInfo.DeviceIsHub为0x00,则表示该当前端口上连接的是普通USB设备。
步骤206:上位机判断是否已查询完当前USB HUB的所有端口,若是,则执行步骤207,若否,则执行步骤209;
在本实施例中,上位机具体根据步骤203中所获得的当前USB HUB的端口数目来判断是否已查询完当前USB HUB的所有端口。
步骤207:判断当前USB HUB是否存在上一级USB HUB,若是,则执行步骤208,若否,则结束操作,并提示无法对步骤201中的CCID设备进行定位;
步骤208:将当前USB HUB的上一级USB HUB作为当前USB HUB,然后返回到步骤206;
步骤209:将当前USB HUB的当前端口的下一个端口作为当前端口,并返回到步骤204;
步骤210:将连接的USB HUB作为当前USB HUB,然后返回到步骤203;
步骤211:上位机获取该普通USB设备在驱动程序下面的路径DriverKeyName;
具体地,由于在实际应用过程中,上位机上可能连接了多个相同类型的设备,如多个CCID设备,因此仅凭步骤204获得的设备连接信息中的厂家标识符信息VID和设备标识符信息PID并不能正确定位到步骤201中所说的CCID设备所连接的端口,所以本实施例中还需要利用DriverKeyName;
在本实施例中,获取DriverKeyName的方法具体为:上位机向该普通USB设备发送IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME请求,接收上述普通USB设备返回的相关信息,其中返回的信息包括参数DriverKeyName,并且返回的信息的结构具体定义为USB_NODE_CONNECTION_DRIVERKEY_NAME);
具体地,本实施例中获取得到的DriverKeyName为:{50dd5230-ba8a-11d1-bf5d-0000f805f530}\0005。
步骤212:根据步骤204获得的设备连接信息中的VID和PID,在上述普通USB设备的注册表路径下查找Driver键值的数据与driverKeyName匹配的子项;
在本实施例中,步骤204获得的设备连接信息中的VID和PID分别为0x096e和0x070f;
查找Driver键值的数据与driverKeyName匹配的子项的方法为:在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_096e&Pid_070f路径下面查找Driver键值的数据为{50dd5230-ba8a-11d1-bf5d-0000f805f530}\0005的子项,具体地,在本实施例中找到的子项为6&c195ce&0&2。
步骤213:判断步骤201读取得到的CCID路径中是否包含步骤212查找得到的子项的名称,若否,则返回到步骤206,若是,则表示步骤201中所说的CCID设备即连接在该当前端口上,执行步骤214;
在本实施例中,具体为判断CCID路径\\?\usb#vid_096e&pid_070f#6&c195ce&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}中是否包含子项的名称6&c195ce&0&2,由此可知,CCID路径中包含子项的名称,因此表示步骤201中所说的CCID设备即连接在该当前端口上,执行步骤214。
步骤214:上位机将步骤201中所说的CCID设备路径与当前端口进行关联,定位该CCID设备所连接的USB端口。
在本实施例中,具体以上位机只包含一个主控制器为例进行说明,因此本实施例中当步骤207判断当前USB HUB不存在上一级USB HUB时,则直接结束操作,并提示无法对步骤301中的CCID设备进行定位,不需要再去查询下一个主控制器;
或者,本实施例中还可以和实施例1一样,上位机包含多个主控制器,则上位机需要对这多个主控制器进行查询,查询方法与实施例1中所描述的查询方法相同,具体为:当本实施例步骤207判断当前USB HUB不存在上一级USBHUB时,则上位机继续判断是否已查询完所有的主控制器,若是,则结束操作,并提示无法对步骤201中的CCID设备进行定位,若否,则返回到步骤202继续对下一个主控制器进行查询,直到所有的主控制器都查询完毕;
查询的方法还可以为:上位机先查询一个主控制器,得到该主控制器上连接的根USB HUB的名称,然后不接着继续查询该根USB HUB,而是开始查询下一个主控制器,直到所有的主控制器都查询完毕,再开始查询主控制器上所连接的各个根USB HUB。
本实施例提供了一种定位CCID设备所连接的USB端口的方法,通过本实施例提供的方法就可以定位CCID设备所连接的USB端口。
进一步地,本实施例提供的是一种定位CCID设备所连接的USB端口的方法,并且本实施例只以一种方法来进行说明,而在实际应用过程中存在多种定位方法,具体在本发明中,实施例1提供的另一种定位HID设备所连接的USB端口的方法也适用于本实施例所说的定位CCID设备所连接的USB端口,且实现步骤与其相似,因此在此不再重复。
实施例3
本发明实施例提供了一种定位设备所连接的USB端口的方法,具体地,在本实施例中以SCSI设备为例进行说明,SCSI设备通过USB HUB连接到上位机上,其中连接在上位机与SCSI设备之间的USB HUB可以是一个或多个。
参见图3,一种定位SCSI设备所连接的USB端口的方法,具体实现步骤如下:
步骤301:上位机读取连接在自身上的SCSI设备的SCSI路径;
其中,与上位机相连的SCSI设备可以是一个或多个,当有多个SCSI设备时,则上位机读取所有SCSI设备的SCSI路径,具体地,在本实施例中以一个SCSI设备为例进行说明;
进一步地,读取SCSI设备的SCSI路径可以从WM_DEVICECHANGE消息传入的参数中读取,也可以通过调用SetupDiGetDeviceInterfaceDetail来枚举已连接的SCSI设备,获取其SCSI路径;
具体地,在本实施例中,读取得到的SCSI路径为\\?\usbstor#cdrom&ven_usb&prod_token_2000auto&rev_1.00#7&b4952b9&0#{53f56308-b6bf-11d0-94f2-00a0c91efb8b}
步骤302:上位机对主控制器进行查询,获取主控制器上连接的根USB HUB的名称;
在本实施例中,上位机具体通过对主控制器发送IOCTL_USB_GET_ROOT_HUB_NAME请求,获取连接在主控制器上的根USBHUB的名称。
步骤303:上位机打开当前USB HUB,并对该当前USB HUB进行查询,获得该当前USB HUB的端口数目;
在本实施例中,当是第一次对该主控制器上连接的设备进行查询时,则主控制器上连接的根USB HUB即是当前USB HUB;
并且,对当前USB HUB进行查询的方法具体为:
上位机向当前USB HUB发送IOCTL_USB_GET_NODE_INFORMATION请求,获得该当前USB HUB的端口数目。
步骤304:上位机对当前USB HUB的当前端口进行查询,获取当前端口上的设备连接信息;
在本实施例中,当是第一次对此当前USB HUB进行查询时,则此当前USBHUB的第一端口即为当前端口;
其中,对当前USB HUB的当前端口进行查询的方法为:
上位机向当前USB HUB的当前端口发送IOCTL_USB_GET_NODE_CONNECTION_INFORMATION请求,获取该当前端口上的设备连接信息,其中设备连接信息中具体包括连接状态标志位、HUB标志位、厂家标识符信息和设备标识符信息等信息;
具体地,本实施例中获得的某个端口的设备连接信息为:
USB_NODE_CONNECTION_INFORMATION connectionInfo;
connectionInfo.ConnectionIndex=0x00000004;
connectionInfo.DeviceDescriptor.bLength=0x12;
connectionInfo.DeviceDescriptor.bDescriptorType=0x01;
connectionInfo.DeviceDescriptor.bcdUSB=0x0110
connectionInfo.DeviceDescriptor.bDeviceClass=0x00
connectionInfo.DeviceDescriptor.bDeviceSubClass=0x00
connectionInfo.DeviceDescriptor.bDeviceProtocol=0x00
connectionInfo.DeviceDescriptor.bMaxPacketSize0=0x08
connectionInfo.DeviceDescriptor.idVendor=0x096e
connectionInfo.DeviceDescriptor.idProduct=0x0305
connectionInfo.DeviceDescriptor.bcdDevice=0x2007
connectionInfo.DeviceDescriptor.iManufacturer=0x01
connectionInfo.DeviceDescriptor.iProduct=0x02
connectionInfo.DeviceDescriptor.iSerialNumber=0x00
connectionInfo.DeviceDescriptor.bNumConfigurations=0x01
connectionInfo.CurrentConfigurationValue=0x01
connectionInfo.LowSpeed=0x00
connectionInfo.DeviceIsHub=0x00
connectionInfo.DeviceAddress=0x0002
connectionInfo.NumberOfOpenPipes=0x00000002
connectionInfo.ConnectionStatus=0x00000001
connectionInfo.PipeList=0x001704b3
步骤305:上位机根据设备连接信息对当前端口进行判断,若判断得到当前端口上没有连接设备,则执行步骤306,若判断得到当前端口上连接的为USBHUB,执行步骤310,若判断得到当前端口上连接的是普通USB设备,则执行步骤311;
在本实施例中,根据设备连接信息对当前端口进行判断的方法具体为:
对设备连接信息中的连接状态标志位connectionInfo.ConnectionStatus进行判断,当连接状态标志位connectionInfo.ConnectionStatus为0x00000001时,则表示当前端口上连接了设备,当连接状态标志位connectionInfo.ConnectionStatus为0x00000000时,则表示当前端口上没有连接设备;
进一步地,当连接状态标志位connectionInfo.ConnectionStatus为0x00000001时,还需要进一步地判断设备连接信息中的HUB标志位connectionInfo.DeviceIsHub是为0x00还是为0x01,若connectionInfo.DeviceIsHub为0x01,则表示该当前端口上连接的是USB HUB,若connectionInfo.DeviceIsHub为0x00,则表示该当前端口上连接的是普通USB设备。
步骤306:上位机判断是否已查询完当前USB HUB的所有端口,若否,则执行步骤307,若是,则执行步骤308;
在本实施例中,上位机具体根据步骤303中所获得的当前USB HUB的端口数目来判断是否已查询完当前USB HUB的所有端口。
步骤307:将当前USB HUB的当前端口的下一个端口作为当前端口,并返回到步骤304;
步骤308:判断是否存在已编号且未查询过的USB HUB,若否,则结束操作,并提示无法对步骤301中的SCSI设备进行定位,若是,则执行步骤309;
步骤309:将编号最前面的USB HUB作为当前USB HUB,并返回到步骤303;
步骤310:上位机判断是否存在已经编号的USB HUB,若否,则将此连接的USB HUB编号为第一USB HUB,然后返回到步骤306,若是,则接着已存在的编号继续对此连接的USB HUB进行编号,然后返回到步骤306;
步骤311:上位机获取该普通USB设备在驱动程序下面的路径DriverKeyName;
具体地,由于在实际应用过程中,上位机上可能连接了多个相同类型的设备,如多个SCSI设备,因此仅凭步骤304获得的设备连接信息中的厂家标识符信息VID和设备标识符信息PID并不能正确定位到该SCSI设备所在的端口,所以本实施例中还需要利用DriverKeyName;
在本实施例中,获取DriverKeyName的方法具体为上位机向该普通USB设备发送IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME请求,接收该普通USB设备返回的相关信息,其中返回的信息包括参数DriverKeyName,并且返回的信息的结构具体定义为USB_NODE_CONNECTION_DRIVERKEY_NAME);
具体地,本实施例中获取得到的DriverKeyName为:{36fc9e60-c465-11cf-8056-444553540000}\0120。
步骤312:根据步骤304获得的设备连接信息中的VID和PID,在上述普通USB设备的注册表路径下查找Driver键值的数据与driverKeyName匹配的子项;
在本实施例中,步骤304获得的设备连接信息中的VID和PID分别为0x096e和0x0305;
查找Driver键值的数据与driverKeyName匹配的子项的方法为:在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_096e&Pid_0305下面查找Driver键值的数据为{36fc9e60-c465-11cf-8056-444553540000}\0120的子项,具体查找到的子项为6&c195ce&0&4。
步骤313:读取查找到的子项下的ParentIdPrefix键值的数据;
在本实施例中,读取得到的ParentIdPrefix键值的数据为7&b4952b9&0
步骤314:判断步骤301读取得到的SCSI路径中是否包含步骤313读取得到ParentIdPrefix键值的数据,若否,则返回到步骤306,若是,则表示步骤301中所说的SCSI设备即连接在该当前端口上,执行步骤315;
在本实施例中,具体为判断SCSI路径\\?\usb#vid_096e&pid_070f#6&c195ce&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}中是否包含子项的名称6&c195ce&0&2,由此可知,SCSI路径中包含子项的名称,因此表示步骤301中所说的SCSI设备即连接在该当前端口上,执行步骤315。
步骤315:上位机将步骤301中所说的SCSI设备路径与上述当前端口进行关联,定位该SCSI设备所连接的USB端口。
在本实施例中,具体以上位机只包含一个主控制器为例进行说明,因此本实施例中当步骤308判断得到不存在已编号且未查询过的USB HUB时,则直接结束操作,并提示无法对步骤401中的SCSI设备进行定位,不需要再去查询下一个主控制器;
或者,本实施例中还可以和实施例1一样,上位机包含多个主控制器,则上位机需要对这多个主控制器进行查询,查询方法与实施例1中所描述的查询方法相同,具体为:当本实施例步骤308判断得到不存在已编号且未查询过的USB HUB时,则上位机继续判断是否已查询完所有的主控制器,若是,则结束操作,并提示无法对步骤301中的SCSI设备进行定位,若否,则返回到步骤302继续对下一个主控制器进行查询,直到所有的主控制器都查询完毕;
查询的方法还可以为:上位机先查询一个主控制器,得到该主控制器上连接的根USB HUB的名称,然后不接着继续查询该根USB HUB,而是开始查询下一个主控制器,直到所有的主控制器都查询完毕,再开始查询主控制器上所连接的各个根USB HUB。
本实施例提供了一种定位SCSI设备所连接的USB端口的方法,通过本实施例提供的方法就可以定位SCSI设备所连接的USB端口。
进一步地,本实施例提供的是一种定位SCSI设备所连接的USB端口的方法,并且本实施例只以一种方法来进行说明,而在实际应用过程中存在多种定位方法,具体在本发明中,实施例1提供的另一种定位HID设备所连接的USB端口的方法也适用于本实施例所说的定位SCSI设备所连接的USB端口,且实现步骤与其相似,因此在此不再重复。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。