




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
windows sdk编程系列文章 - 遍历USB设备,获取扫描仪序列号之一2008-08-08 16:33理论: 对于USB接口的设备,现在越来越多了。本篇我们就通过获取一个USB扫描仪设备中的序列号,来介绍如何获取usb设备的一些硬件信息。对于usb设备都是采用HCD0,HCD1,HCD2,HCD3等符号描述的。如下图:因此,有了这个名字,我们就可以使用CreateFile来打开usb设备。然后使用DeviceIoControl函数与usb设备通讯了。HCD是host controller driver的简写。需要了解详情的,还要仔细的阅读usb协议。usb的通讯基本步骤如下:Host Controllers- Usb root hub - usb function(device)基本步骤: 1)打开HCD%X 2) 得到上面的USB root hub 3) 遍历usb root hub上连接的usb 设备。获取信息 4)如果有多个usb口,循环前3步。下面介绍通讯用的几个IOCTL:1)USB_HCD_DRIVERKEY_NAME ,用于获取USB设备驱动在注册表中的键名。相应的一个结构体是:typedef struct _USB_HCD_DRIVERKEY_NAME ULONG ActualLength; WCHAR DriverKeyName1; USB_HCD_DRIVERKEY_NAME, *PUSB_HCD_DRIVERKEY_NAME;2)IOCTL_USB_GET_ROOT_HUB_NAME,用于获取root hub 键名。使用的结构体,跟上面一样。typedef struct _USB_ROOT_HUB_NAME ULONG ActualLength; WCHAR RootHubName1; USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME;3)IOCTL_USB_GET_NODE_INFORMATION,用于获取连接在root hub上的节点设备信息。也就是我们接在usb口上的所有usb设备的信息,对应的结构体:typedef struct _USB_NODE_INFORMATION USB_HUB_NODE NodeType; union USB_HUB_INFORMATION HubInformation; USB_MI_PARENT_INFORMATION MiParentInformation; u; USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION;typedef struct _USB_MI_PARENT_INFORMATION ULONG NumberOfInterfaces; USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION;typedef struct _USB_HUB_INFORMATION USB_HUB_DESCRIPTOR HubDescriptor; BOOLEAN HubIsBusPowered; USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION;typedef struct _USB_HUB_DESCRIPTOR UCHAR bDescriptorLength; / Length of this descriptor UCHAR bDescriptorType; / Hub configuration type UCHAR bNumberOfPorts; / number of ports on this hub USHORT wHubCharacteristics; / Hub Charateristics UCHAR bPowerOnToPowerGood; / port power on till power good in 2ms UCHAR bHubControlCurrent; / max current in mA / / room for 255 ports power control and removable bitmask UCHAR bRemoveAndPowerMask64; USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR;4) IOCTL_USB_GET_NODE_CONNECTION_INFORMATION, 用于获取接在usb口上的单个usb设备的信息,对应的结构体:typedef struct _USB_NODE_CONNECTION_INFORMATION ULONG ConnectionIndex; USB_DEVICE_DESCRIPTOR DeviceDescriptor; UCHAR CurrentConfigurationValue; BOOLEAN LowSpeed; BOOLEAN DeviceIsHub; USHORT DeviceAddress; ULONG NumberOfOpenPipes; USB_CONNECTION_STATUS ConnectionStatus; USB_PIPE_INFO PipeList0; USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION;4)IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, 用于获取usb设备的描述信息。typedef struct _USB_DEVICE_DESCRIPTOR UCHAR bLength; UCHAR bDescriptorType; USHORT bcdUSB; UCHAR bDeviceClass; UCHAR bDeviceSubClass; UCHAR bDeviceProtocol; UCHAR bMaxPacketSize0; USHORT idVendor; USHORT idProduct; USHORT bcdDevice; UCHAR iManufacturer; UCHAR iProduct; UCHAR iSerialNumber; UCHAR bNumConfigurations; USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;typedef struct _USB_DEVICE_DESCRIPTOR UCHAR bLength; UCHAR bDescriptorType; USHORT bcdUSB; UCHAR bDeviceClass; UCHAR bDeviceSubClass; UCHAR bDeviceProtocol; UCHAR bMaxPacketSize0; USHORT idVendor; USHORT idProduct; USHORT bcdDevice; UCHAR iManufacturer; UCHAR iProduct; UCHAR iSerialNumber; UCHAR bNumConfigurations; USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;typedef enum _USB_CONNECTION_STATUS NoDeviceConnected, DeviceConnected, /* failure codes, these map to fail reasons */ DeviceFailedEnumeration, DeviceGeneralFailure, DeviceCausedOvercurrent, DeviceNotEnoughPower, DeviceNotEnoughBandwidth, DeviceHubNestedTooDeeply, DeviceInLegacyHub USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS;typedef struct _USB_PIPE_INFO USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; ULONG ScheduleOffset; USB_PIPE_INFO, *PUSB_PIPE_INFO;typedef struct _USB_ENDPOINT_DESCRIPTOR UCHAR bLength; UCHAR bDescriptorType; UCHAR bEndpointAddress; UCHAR bmAttributes; USHORT wMaxPacketSize; UCHAR bInterval; USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;需要注意一点,如果要得到pid,vid,则直接从USB_DEVICE_DESCRIPTOR结构中取出idVendor,idProduct这两项的值就行了。如果要得到序列号,则不是取出 iSerialNumber就可以的。这里的 iSerialNumber仅仅是一个索引值。如果想得到序列号,就需要定义一个结构,然后给设备发送个请求。代码参照GetStringDescriptor函数。可以根据iSerialNumber偏移,取出其对应的字符串,存放在上图USB_STRING_DESCRIPTOR结构中。【转帖】windows sdk编程系列文章 - 遍历USB设备,获取扫描仪序列号之二网上的好文章 2009-08-13 18:36 阅读33评论0 字号: 大大 中中 小小 #include windows.h#include PlkUsbIo.h#include #define NUM_HCS_TO_CHECK 10/*/bool EnumUsbDevice();PCHAR GetDriverKeyName(HANDLE Hub, ULONG ConnectionIndex);PCHAR GetHCDDriverKeyName(HANDLE HCD);PCHAR GetRootHubName(HANDLE HostController);PCHAR WideStrToMultiStr(PWCHAR WideStr);bool GetStringDescriptor ( HANDLE hHubDevice, ULONG ConnectionIndex, UCHAR DescriptorIndex , CHAR * outBuff); /*/int main(int argc, char* argv) EnumUsbDevice(); return 0;bool EnumUsbDevice() char HCName16; int HCNum; HANDLE hHCDev; PCHAR rootHubName; ULONG index; BOOL success; PUSB_NODE_CONNECTION_INFORMATION connectionInfo; HANDLE hHubDevice; for (HCNum = 0; HCNum u.HubInformation.HubDescriptor.bNumberOfPorts; for (index=1; index ConnectionIndex = index; success = DeviceIoControl(hHubDevice, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION, connectionInfo, nBytes, connectionInfo, nBytes, &nBytes, NULL); if (!success) free(connectionInfo); goto end; deviceDesc = NULL; if (connectionInfo-ConnectionStatus != NoDeviceConnected) driverKeyName = GetDriverKeyName(hHubDevice, index); if (driverKeyName) free(driverKeyName); if (connectionInfo-ConnectionStatus = DeviceConnected) /取出序列号索引 UCHAR nSerialno = connectionInfo-DeviceDescriptor.iSerialNumber; CHAR OutBuff20 = 0; GetStringDescriptor(hHubDevice,connectionInfo-ConnectionIndex,nSerialno,OutBuff); /判断序列号是否有效 if(序列号是否有效) CloseHandle(hHubDevice); CloseHandle(hHCDev); return true; end:; CloseHandle(hHubDevice); CloseHandle(hHCDev); return false;PCHAR GetDriverKeyName(HANDLE Hub, ULONG ConnectionIndex) BOOL success; ULONG nBytes; USB_NODE_CONNECTION_DRIVERKEY_NAME driverKeyName; PUSB_NODE_CONNECTION_DRIVERKEY_NAME driverKeyNameW; PCHAR driverKeyNameA; 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) goto GetDriverKeyNameError; nBytes = driverKeyName.ActualLength; if (nBytes ConnectionIndex = ConnectionIndex; success = DeviceIoControl(Hub, IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, driverKeyNameW, nBytes, driverKeyNameW, nBytes, &nBytes, NULL); if (!success) goto GetDriverKeyNameError; driverKeyNameA = WideStrToMultiStr(driverKeyNameW-DriverKeyName); free(driverKeyNameW); return driverKeyNameA;GetDriverKeyNameError: if (driverKeyNameW != NULL) free(driverKeyNameW); driverKeyNameW = NULL; return NULL;PCHAR GetRootHubName(HANDLE HostController) BOOL success; ULONG nBytes; USB_ROOT_HUB_NAME rootHubName; PUSB_ROOT_HUB_NAME rootHubNameW; PCHAR rootHubNameA; rootHubNameW = NULL; rootHubNameA = NULL; success = DeviceIoControl(HostController, IOCTL_USB_GET_ROOT_HUB_NAME, 0, 0, &rootHubName, sizeof(rootHubName), &nBytes, NULL); if (!success) goto GetRootHubNameError; nBytes = rootHubName.ActualLength; rootHubNameW =(PUSB_ROOT_HUB_NAME) malloc(nBytes); if (rootHubNameW = NULL) goto GetRootHubNameError; success = DeviceIoControl(HostController, IOCTL_USB_GET_ROOT_HUB_NAME, NULL, 0, rootHubNameW, nBytes, &nBytes, NULL); if (!success) goto GetRootHubNameError; rootHubNameA = WideStrToMultiStr(rootHubNameW-RootHubName); free(rootHubNameW); return rootHubNameA;GetRootHubNameError: if (rootHubNameW != NULL) free(rootHubNameW); rootHubNameW = NULL; return NULL;PCHAR GetHCDDriverKeyName(HANDLE HCD) BOOL success; ULONG nBytes; USB_HCD_DRIVERKEY_NAME driverKeyName; PUSB_HCD_DRIVERKEY_NAME driverKeyNameW; PCHAR driverKeyNameA; driverKeyNameW = NULL; driverKeyNameA = NULL; success = DeviceIoControl(HCD, IOCTL_GET_HCD_DRIVERKEY_NAME, &driverKeyName, sizeof(driverKeyName), &driverKeyName, sizeof(driverKeyName), &nBytes, NULL); if (!success) goto GetHCDDriverKeyNameError; nBytes = driverKeyName.ActualLength; if (nBytes DriverKeyName); free(driverKeyNameW); return driverKeyNameA;GetHCDDriverKeyNameError: if (driverKeyNameW != NULL) free(driverKeyNameW); driverKeyNameW = NULL; return NULL;PCHAR WideStrToMultiStr(PWCHAR WideStr) ULONG nBytes; PCHAR MultiStr; nBytes = WideCharToMultiByte( CP_ACP, 0, WideStr, -1, NULL, 0, NULL, NULL); if (nBytes = 0) return NULL; MultiStr =(PCHAR) malloc(nBytes); if (MultiStr = NULL) return NULL; nBytes = WideCharToMultiByte( CP_ACP, 0, WideStr, -1, MultiStr, nBytes, NULL, NULL); if (nBytes = 0) free(MultiStr); return NULL; return MultiStr;bool GetStringDescriptor ( HANDLE hHubDevice, ULONG ConnectionIndex, UCHAR DescriptorIndex , CHAR * outBuff ) BOOL success; ULONG nBytes; ULONG nBytesReturned; UCHAR stringDescReqBufsizeof(USB_DESCRIPTOR_REQUEST) + MAXIMUM_USB_STRING_LENGTH; PUSB_DESCRIPTOR_REQUEST stringDescReq; PUSB_STRING_DESCRIPTOR stringDesc; nBytes = sizeof(stringDescReqBuf); stringDescReq = (PUSB_DESCRIPTOR_REQUEST)stringDescReqBuf; stringDesc = (PUSB_STRING_DESCRIPTOR)(stringDescReq+1); :ZeroMemory(stringDescReq,nBytes); stringDescReq-ConnectionIndex = ConnectionIndex; stringDescReq-SetupPacket.wValue = (USB_STRING_DESCRIPTOR_TYPE SetupPacket.wIndex = GetSystemDefaultLangID(); stringDescReq-SetupPacket.wLength = (USHORT)(nBytes - sizeof(USB_DESCRIPTOR_REQUEST); success = DeviceIoControl(hHubDevice,IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, stringDescReq,nBytes, stringDescReq,nBytes, &nBytesReturned,NULL); if (!success | nBytesReturned bDescriptorType != USB_STRING_DESCRIPTOR_TYPE) return false; if (stringDesc-bLength != nBytesReturned - si
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中西医结合影像学CT与MRI检查的对比分析测试答案及解析
- 2025年孕产科学科先兆流产护理操作技能考核答案及解析
- 发电机组安装施工全过程规范
- 新能源光伏电站项目管理标准
- 登记资料规范管理办法
- 高考英语写作专项训练计划
- 红白喜事卫生管理办法
- 物资合同管理办法细则
- 国标轴承规格参数对照表
- 甘肃农村道路管理办法
- GB/T 4623-2006环形混凝土电杆
- GB/T 36572-2018电力监控系统网络安全防护导则
- 甲状腺危象教学课件
- GB/T 11275-2007表面活性剂含水量的测定
- GA/T 970-2011危险化学品泄漏事故处置行动要则
- 外科学-第三章-水、电解质代谢紊乱和酸碱平衡失调课件
- PICC置管后常见并发症的处理教育课件
- 督查督办培训课件
- 2023全国大学生数学建模竞赛D题
- PCB常见不良品图片及改善措施汇总
- 开学第一课铸牢中华民族共同体意识课件
评论
0/150
提交评论