遍历USB设备获取USB序列号.docx
《遍历USB设备获取USB序列号.docx》由会员分享,可在线阅读,更多相关《遍历USB设备获取USB序列号.docx(26页珍藏版)》请在冰豆网上搜索。
![遍历USB设备获取USB序列号.docx](https://file1.bdocx.com/fileroot1/2022-12/13/f6d7fa7d-2ca7-4fdb-8950-a97a778e0a1e/f6d7fa7d-2ca7-4fdb-8950-a97a778e0a1e1.gif)
遍历USB设备获取USB序列号
遍历USB设备,获取USB序列号
windowssdk编程系列文章----遍历USB设备,获取扫描仪序列号之一2008-08-0816:
33
理论:
对于USB接口的设备,现在越来越多了。
本篇我们就通过获取一个USB扫描仪设备中的序列号,来介绍如何获取usb设备的一些硬件信息。
对于usb设备都是采用HCD0,HCD1,HCD2,HCD3等符号描述的。
如下图:
因此,有了这个名字,我们就可以使用CreateFile来打开usb设备。
然后使用DeviceIoControl函数与usb设备通讯了。
HCD是hostcontrollerdriver的简写。
需要了解详情的,还要仔细的阅读usb协议。
usb的通讯基本步骤如下:
HostControllers--->Usbroothub-->usbfunction(device)
基本步骤:
1:
打开HCD%X
2)得到上面的USBroothub
3)遍历usbroothub上连接的usb设备。
获取信息
4:
如果有多个usb口,循环前3步。
下面介绍通讯用的几个IOCTL:
1)USB_HCD_DRIVERKEY_NAME,用于获取USB设备驱动在注册表中的键名。
相应的一个结构体是:
typedefstruct_USB_HCD_DRIVERKEY_NAME
{
ULONGActualLength;
WCHARDriverKeyName[1];
}USB_HCD_DRIVERKEY_NAME,*PUSB_HCD_DRIVERKEY_NAME;
2:
IOCTL_USB_GET_ROOT_HUB_NAME,用于获取roothub键名。
使用的结构体,跟上面一样。
typedefstruct_USB_ROOT_HUB_NAME
{
ULONGActualLength;
WCHARRootHubName[1];
}USB_ROOT_HUB_NAME,*PUSB_ROOT_HUB_NAME;
3:
IOCTL_USB_GET_NODE_INFORMATION,用于获取连接在roothub上的节点设
备信息。
也就是我们接在usb口上的所有usb设备的信息,对应的结构体:
typedefstruct_USB_NODE_INFORMATION
{
USB_HUB_NODENodeType;
union{
USB_HUB_INFORMATIONHubInformation;
USB_MI_PARENT_INFORMATIONMiParentInformation;
}u;
}USB_NODE_INFORMATION,*PUSB_NODE_INFORMATION;
typedefstruct_USB_MI_PARENT_INFORMATION
{
ULONGNumberOfInterfaces;
}USB_MI_PARENT_INFORMATION,*PUSB_MI_PARENT_INFORMATION;
typedefstruct_USB_HUB_INFORMATION
{
USB_HUB_DESCRIPTORHubDescriptor;
BOOLEANHubIsBusPowered;
}USB_HUB_INFORMATION,*PUSB_HUB_INFORMATION;
typedefstruct_USB_HUB_DESCRIPTOR
{
UCHARbDescriptorLength;//Lengthofthisdescriptor
UCHARbDescriptorType;//Hubconfigurationtype
UCHARbNumberOfPorts;//numberofportsonthishub
USHORTwHubCharacteristics;//HubCharateristics
UCHARbPowerOnToPowerGood;//portpowerontillpower
goodin2ms
UCHARbHubControlCurrent;//maxcurrentinmA
//
//roomfor255portspowercontrolandremovablebitmask
UCHARbRemoveAndPowerMask[64];
}USB_HUB_DESCRIPTOR,*PUSB_HUB_DESCRIPTOR;
4)IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,用于获取接在usb口上的
单个usb设备的信息,对应的结构体:
typedefstruct_USB_NODE_CONNECTION_INFORMATION{
ULONGConnectionIndex;
USB_DEVICE_DESCRIPTORDeviceDescriptor;
UCHARCurrentConfigurationValue;
BOOLEANLowSpeed;
BOOLEANDeviceIsHub;
USHORTDeviceAddress;
ULONGNumberOfOpenPipes;
USB_CONNECTION_STATUSConnectionStatus;
USB_PIPE_INFOPipeList[0];
}USB_NODE_CONNECTION_INFORMATION,*PUSB_NODE_CONNECTION_INFORMATION;
4:
IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION,用于获取usb设备的
描述信息。
typedefstruct_USB_DEVICE_DESCRIPTOR{
UCHARbLength;
UCHARbDescriptorType;
USHORTbcdUSB;
UCHARbDeviceClass;
UCHARbDeviceSubClass;
UCHARbDeviceProtocol;
UCHARbMaxPacketSize0;
USHORTidVendor;
USHORTidProduct;
USHORTbcdDevice;
UCHARiManufacturer;
UCHARiProduct;
UCHARiSerialNumber;
UCHARbNumConfigurations;
}USB_DEVICE_DESCRIPTOR,*PUSB_DEVICE_DESCRIPTOR;
typedefstruct_USB_DEVICE_DESCRIPTOR{
UCHARbLength;
UCHARbDescriptorType;
USHORTbcdUSB;
UCHARbDeviceClass;
UCHARbDeviceSubClass;
UCHARbDeviceProtocol;
UCHARbMaxPacketSize0;
USHORTidVendor;
USHORTidProduct;
USHORTbcdDevice;
UCHARiManufacturer;
UCHARiProduct;
UCHARiSerialNumber;
UCHARbNumConfigurations;
}USB_DEVICE_DESCRIPTOR,*PUSB_DEVICE_DESCRIPTOR;
typedefenum_USB_CONNECTION_STATUS{
NoDeviceConnected,
DeviceConnected,
/*failurecodes,thesemaptofailreasons*/
DeviceFailedEnumeration,
DeviceGeneralFailure,
DeviceCausedOvercurrent,
DeviceNotEnoughPower,
DeviceNotEnoughBandwidth,
DeviceHubNestedTooDeeply,
DeviceInLegacyHub
}USB_CONNECTION_STATUS,*PUSB_CONNECTION_STATUS;
typedefstruct_USB_PIPE_INFO
{
USB_ENDPOINT_DESCRIPTOREndpointDescriptor;
ULONGScheduleOffset;
}USB_PIPE_INFO,*PUSB_PIPE_INFO;
typedefstruct_USB_ENDPOINT_DESCRIPTOR
{
UCHARbLength;
UCHARbDescriptorType;
UCHARbEndpointAddress;
UCHARbmAttributes;
USHORTwMaxPacketSize;
UCHARbInterval;
}USB_ENDPOINT_DESCRIPTOR,*PUSB_ENDPOINT_DESCRIPTOR;
需要注意一点,如果要得到pid,vid,则直接从USB_DEVICE_DESCRIPTOR结构中取出idVendor,idProduct这两项的值就行了。
如果要得到序列号,则不是取出iSerialNumber就可以的。
这里的iSerialNumber仅仅是一个索引值。
如果想得到序列号,就需要定义一个结构,然后给设备发送个请求。
代码参照GetStringDescriptor函数。
可以根据iSerialNumber偏移,取出其对应的字符串,存放在上图USB_STRING_DESCRIPTOR结构中。
【转帖】windowssdk编程系列文章----遍历USB设备,获取扫描仪序列号之二网上的好文章2009-08-1318:
36阅读33评论0
字号:
大中小
#include"windows.h"
#include"PlkUsbIo.h"
#include
#defineNUM_HCS_TO_CHECK10
/******************************************************************/
boolEnumUsbDevice();
PCHARGetDriverKeyName(HANDLEHub,ULONGConnectionIndex);
PCHARGetHCDDriverKeyName(HANDLEHCD);PCHARGetRootHubName(HANDLEHostController);PCHARWideStrToMultiStr(PWCHARWideStr);boolGetStringDescriptor(
HANDLEhHubDevice,
ULONGConnectionIndex,
UCHARDescriptorIndex,
CHAR*outBuff);
/******************************************************************/
intmain(intargc,char*argv[])
{
EnumUsbDevice();
return0;
}
boolEnumUsbDevice()
{
charHCName[16];
intHCNum;
HANDLEhHCDev;
PCHARrootHubName;
ULONGindex;
BOOLsuccess;
PUSB_NODE_CONNECTION_INFORMATIONconnectionInfo;
HANDLEhHubDevice;
for(HCNum=0;HCNum{
wsprintf(HCName,"\\\\.\\HCD%d",HCNum);
hHCDev=CreateFile(HCName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hHCDev==INVALID_HANDLE_VALUE)
break;
PCHARdriverKeyName,deviceDesc;
driverKeyName=GetHCDDriverKeyName(hHCDev);
if(driverKeyName==NULL)
gotoend;
ULONGnBytes;
rootHubName=(char*)GetRootHubName(hHCDev);
if(rootHubName==NULL)
gotoend;
PUSB_NODE_INFORMATIONHubInfo;
HubInfo=(PUSB_NODE_INFORMATION)malloc(sizeof(USB_NODE_INFORMATION));
PCHARdeviceName;
deviceName=(PCHAR)malloc(strlen(rootHubName)+sizeof("\\\\.\\"));
if(rootHubName!
=NULL)
{
strcpy(deviceName,"\\\\.\\");
strcpy(deviceName+sizeof("\\\\.\\")-1,rootHubName);
hHubDevice=CreateFile(deviceName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
free(deviceName);
if(hHubDevice==INVALID_HANDLE_VALUE)
gotoend;
success=DeviceIoControl(hHubDevice,
IOCTL_USB_GET_NODE_INFORMATION,
HubInfo,
sizeof(USB_NODE_INFORMATION),
HubInfo,
sizeof(USB_NODE_INFORMATION),
&nBytes,
NULL);
if(!
success)
gotoend;
}
intport;
port=HubInfo->u.HubInformation.HubDescriptor.bNumberOfPorts;
for(index=1;index<=port;index++)
{
ULONGnBytes;
nBytes=sizeof(USB_NODE_CONNECTION_INFORMATION)+
sizeof(USB_PIPE_INFO)*30;
connectionInfo=(PUSB_NODE_CONNECTION_INFORMATION)malloc(nBytes);
if(connectionInfo==NULL)
gotoend;
connectionInfo->ConnectionIndex=index;
success=DeviceIoControl(hHubDevice,
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
connectionInfo,
nBytes,
connectionInfo,
nBytes,
&nBytes,
NULL);
if(!
success)
{
free(connectionInfo);
gotoend;
}
deviceDesc=NULL;
if(connectionInfo->ConnectionStatus!
=NoDeviceConnected)
{
driverKeyName=GetDriverKeyName(hHubDevice,
index);
if(driverKeyName)
{
free(driverKeyName);
}
}
if(connectionInfo->ConnectionStatus==DeviceConnected)
{
//取出序列号索引
UCHARnSerialno=connectionInfo->DeviceDescriptor.iSerialNumber;
CHAROutBuff[20]={0};
GetStringDescriptor(hHubDevice,connectionInfo->ConnectionIndex,nSerialno,OutBuff);
//判断序列号是否有效
if(序列号是否有效)
{
CloseHandle(hHubDevice);
CloseHandle(hHCDev);
returntrue;
}
}
}
end:
;
}
CloseHandle(hHubDevice);
CloseHandle(hHCDev);
returnfalse;
}
PCHARGetDriverKeyName(HANDLEHub,ULONGConnectionIndex){
BOOLsuccess;
ULONGnBytes;
USB_NODE_CONNECTION_DRIVERKEY_NAMEdriverKeyName;
PUSB_NODE_CONNECTION_DRIVERKEY_NAMEdriverKeyNameW;
PCHARdriverKeyNameA;
driverKeyNameW=NULL;
driverKeyNameA=NULL;
driverKeyName.ConnectionIndex=ConnectionIndex;
success=DeviceIoControl(Hub,
IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME,
&driverKeyName,
sizeof(driverKeyName),
&driverKeyName,
sizeof(driverKeyName),
&nBytes,
NULL);
if(!
success)
{
gotoGetDriverKeyNameError;
}
nBytes=driverKeyName.ActualLength;
if(nBytes<=sizeof(driverKeyName))
{
gotoGetDriverKeyNameError;
}
driverKeyNameW=(PUSB_NODE_CONNECTION_DRIVERKEY_NAME)malloc(nBytes);
if(driverKeyNameW==NULL)
{
gotoGetDriverKeyNameError;
}
driverKeyNameW->ConnectionIndex=ConnectionIndex;
success=DeviceIoControl(Hub,
IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME,
driverKeyNameW,
nBytes,
driverKeyNameW,
nBytes,
&nBytes,
NULL);
if(!
success)
{
gotoGetDriverKeyNameError;
}
driverKeyNameA=WideStrToMultiStr(driverKeyNameW->DriverKeyName);
free(driverKeyNameW);
returndriverKeyNameA;
GetDriverKeyNameError:
if(driverKeyNameW!
=NULL)
{
free(driverKeyNameW);
driverKeyNameW=NULL;
}
returnNULL;
}
PCHARGetRootHubName(HANDLEHostController){
BOOLsuccess;
ULONGnBytes;
USB_ROOT_HUB_NAMErootHubName;
PUSB_ROOT_HUB_NAMErootHubNameW;
PCHARrootHubNameA;
rootHubNameW=NULL;
rootHubNameA=NULL;
success=DeviceIoControl(HostController,
IOCTL_USB_GET_ROOT_HUB_NAME,
0,
0,
&rootHubName,
sizeof(rootHubName),
&nBytes,
NULL);
if(!
success)
{
gotoGetRootHubNameError;
}
nBytes=rootHubName.ActualLength;
rootHubNameW=(PUSB_ROOT_HUB_NAME)malloc(nBytes);
if(rootHubNameW==NULL)
{
gotoGetRootHubNameError;
}
success=DeviceIoControl(HostController,
IOCTL_USB_GET_ROOT_HUB_NAME,
NULL,
0,
rootHubNameW,
nBytes,
&nBytes,
NULL);
if(!
success)
{
gotoGetRootHubNameError;
}
rootHubNameA=WideStrToMultiStr(rootHubNameW->RootHubName);
free(rootHubNameW);
returnrootHubNameA;
GetRootHubNameError:
if(rootHubNameW!
=NULL)
{
f