遍历USB设备获取USB序列号.docx

上传人:b****5 文档编号:5220856 上传时间:2022-12-14 格式:DOCX 页数:26 大小:36.36KB
下载 相关 举报
遍历USB设备获取USB序列号.docx_第1页
第1页 / 共26页
遍历USB设备获取USB序列号.docx_第2页
第2页 / 共26页
遍历USB设备获取USB序列号.docx_第3页
第3页 / 共26页
遍历USB设备获取USB序列号.docx_第4页
第4页 / 共26页
遍历USB设备获取USB序列号.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

遍历USB设备获取USB序列号.docx

《遍历USB设备获取USB序列号.docx》由会员分享,可在线阅读,更多相关《遍历USB设备获取USB序列号.docx(26页珍藏版)》请在冰豆网上搜索。

遍历USB设备获取USB序列号.docx

遍历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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1