遍历USB设备-获取USB序列号
- 格式:doc
- 大小:55.00 KB
- 文档页数:19
读取U盘物理序列号(C++实现)// usb.cpp : 定义控制台应⽤程序的⼊⼝点。
//#include "stdafx.h"/*************************************************************Win32控制台应⽤程序编译环境:Visual Studio 2005主要功能:1). 读取U盘序列号,保存在USBSerial数组⾥。
2). 验证第⼀次运⾏程序读取U盘序列号存放在C:\Windows\system32\USBSerial.dat⽂件中以后运⾏检验读取到的U盘序列号与保存在⽂件中的是否⼀致,若相同,置 gTag 为1; 若不⼀致,置 gTag 为0;***********************************************************/#include <windows.h>#include <winioctl.h>#include <stdio.h>#include <initguid.h>#include <setupapi.h>#include <string.h>#pragma comment(lib,"setupapi.lib")wchar_t USBSerial[5][100] = {TEXT("")};int gTag = 0;#define MAX_DEVICE 256//#define USBSERIAL_PATH C:\\Windows\\system32\\USBSerial.datDEFINE_GUID(UsbClassGuid, 0xa5dcbf10L, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed);// SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义⾜够⼤#define INTERFACE_DETAIL_SIZE (1024)// IOCTL控制码#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)// 查询存储设备属性的类型/*typedef enum _STORAGE_QUERY_TYPE {PropertyStandardQuery = 0, // 读取描述PropertyExistsQuery, // 测试是否⽀持PropertyMaskQuery, // 读取指定的描述PropertyQueryMaxDefined // 验证数据} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;*/// 查询存储设备还是适配器属性//typedef enum _STORAGE_PROPERTY_ID {// StorageDeviceProperty = 0, // 查询设备属性// StorageAdapterProperty // 查询适配器属性//} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;//// 查询属性输⼊的数据结构//typedef struct _STORAGE_PROPERTY_QUERY {// STORAGE_PROPERTY_ID PropertyId; // 设备/适配器// STORAGE_QUERY_TYPE QueryType; // 查询类型// UCHAR AdditionalParameters[1]; // 额外的数据(仅定义了象征性的1个字节)//} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;//查询属性输出的数据结构//typedef struct _STORAGE_DEVICE_DESCRIPTOR {// ULONG Version; // 版本// ULONG Size; // 结构⼤⼩// UCHAR DeviceType; // 设备类型// UCHAR DeviceTypeModifier; // SCSI-2额外的设备类型// BOOLEAN RemovableMedia; // 是否可移动// BOOLEAN CommandQueueing; // 是否⽀持命令队列// ULONG VendorIdOffset; // ⼚家设定值的偏移// ULONG ProductIdOffset; // 产品ID的偏移// ULONG ProductRevisionOffset; // 产品版本的偏移// ULONG SerialNumberOffset; // 序列号的偏移// STORAGE_BUS_TYPE BusType; // 总线类型// ULONG RawPropertiesLength; // 额外的属性数据长度// UCHAR RawDeviceProperties[1]; // 额外的属性数据(仅定义了象征性的1个字节) //} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;// 根据GUID获得设备路径// lpGuid: GUID指针// pszDevicePath: 设备路径指针的指针// 返回: 成功得到的设备路径个数,可能不⽌1个int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath){HDEVINFO hDevInfoSet; //设备信息集句柄;SP_DEVICE_INTERFACE_DATA ifdata;PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;int nCount;BOOL bResult;// 取得⼀个该GUID相关的设备信息集句柄hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&UsbClassGuid, // class GUID NULL, // ⽆关键字NULL, // 不指定⽗窗⼝句柄DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // ⽬前存在的设备// 失败...if (hDevInfoSet == INVALID_HANDLE_VALUE){printf("Error!\n");// break;return 0;// 申请设备接⼝数据空间pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);nCount = 0;bResult = TRUE;// 设备序号=0,1,2... 逐⼀测试设备接⼝,到失败为⽌while (bResult){ifdata.cbSize = sizeof(ifdata);// 枚举符合该GUID的设备接⼝bResult = ::SetupDiEnumDeviceInterfaces(hDevInfoSet, // 设备信息集句柄NULL, // 不需额外的设备描述lpGuid, // GUID(ULONG)nCount, // 设备信息集⾥的设备序号&ifdata); // 设备接⼝信息if (bResult){// 取得该设备接⼝的细节(设备路径)bResult = SetupDiGetInterfaceDeviceDetail(hDevInfoSet, // 设备信息集句柄&ifdata, // 设备接⼝信息pDetail, // 设备接⼝细节(设备路径)INTERFACE_DETAIL_SIZE, // 输出缓冲区⼤⼩NULL, // 不需计算输出缓冲区⼤⼩(直接⽤设定值)NULL); // 不需额外的设备描述if (bResult){// 复制设备路径到输出缓冲区wcscpy_s(pszDevicePath[nCount],wcslen(pDetail->DevicePath)+1, pDetail->DevicePath); // 调整计数值nCount++;}}}// printf("%d\n", nCount);// printf("%s\n",pszDevicePath[1]);// 释放设备接⼝数据空间::GlobalFree(pDetail);// 关闭设备信息集句柄::SetupDiDestroyDeviceInfoList(hDevInfoSet);return nCount;}// OpenDevice(char* DevicePath)// 返回句柄 hDeviceHANDLE OpenDevice(wchar_t* DevicePath)HANDLE hDevice;hDevice = CreateFileW(DevicePath,GENERIC_READ && GENERIC_WRITE,FILE_SHARE_READ && FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);return hDevice;}int main(int argc, char *argv[]){int i, nDevice; // nDevice 表⽰有多少个USB设备int ndevice = 0; // 表⽰多少个U盘设备(可进⾏读写的设备)wchar_t* szDevicePath[MAX_DEVICE]; // 设备路径char pdg[1024] ;DWORD junk;HANDLE hDevice;BOOL bResult;// DWORD dwOutBytes; // IOCTL输出数据长度// 定义⼀个 PSTORAGE_DEVICE_DESCRIPTOR 变量,存放设备属性PSTORAGE_DEVICE_DESCRIPTOR DeviceDesc;// 变量初始化DeviceDesc=(PSTORAGE_DEVICE_DESCRIPTOR)newBYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1]; DeviceDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1;// 分配需要的空间for (i = 0; i < MAX_DEVICE; i++){szDevicePath[i] = new wchar_t[256];}// 取设备路径nDevice = ::GetDevicePath((LPGUID)&UsbClassGuid, szDevicePath);// printf("%d\n", nDevice);// for(i = 0; i< nDevice; i++)// printf("%s\n",szDevicePath[i]);// 逐⼀获取设备信息for (i = 0; i < nDevice; i++){// 打开设备hDevice = OpenDevice(szDevicePath[i]);if (hDevice != INVALID_HANDLE_VALUE){bResult = ::DeviceIoControl(hDevice, // device to be queriedIOCTL_STORAGE_GET_MEDIA_TYPES, // operation to performNULL, 0, // no input bufferpdg, 1024, // output buffer&junk, // # bytes returned(LPOVERLAPPED) NULL); // synchronous I/Ofor(int j = 0; j < 4; j++){USBSerial[ndevice][j] = szDevicePath[i][j+12];}for(int j = 4; j < 28; j++){USBSerial[ndevice][j] = szDevicePath[i][j+22];}printf("U盘序列号为:");wprintf(L"%ws\n", USBSerial[ndevice]);ndevice ++;::CloseHandle(hDevice);}}// 释放空间for (i = 0; i < MAX_DEVICE; i++){delete []szDevicePath[i];}// ⽂件操作HANDLE hFile;DWORD nBytesRead = 0, dwBytesWritten = 0;// 打开⽂件hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBSerial.dat"), // file to open GENERIC_READ | GENERIC_WRITE, // open for readingFILE_SHARE_READ | FILE_SHARE_WRITE, // share for reading NULL, // default securityOPEN_EXISTING , // existing file onlyFILE_ATTRIBUTE_NORMAL, // normal fileNULL); // no attr. templateif (hFile == INVALID_HANDLE_VALUE)// printf("1111111111111111111111111111\n");// printf("Could not open file!\n");hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBSerial.dat"), // file to create GENERIC_READ | GENERIC_WRITE, // open for writingFILE_SHARE_READ | FILE_SHARE_WRITE, // do not share NULL, // default securityCREATE_ALWAYS, // overwrite existingFILE_ATTRIBUTE_NORMAL | // normal fileFILE_ATTRIBUTE_NORMAL, // asynchronous I/ONULL);// printf("Could not open file (error %d)\n", GetLastError());}long nFileSize = GetFileSize(hFile, NULL);// printf("first:%d\n",nFileSize);wchar_t *tempbuf = new wchar_t[nFileSize] ;// 读⽂件内容if (nFileSize == 0){// 创建⽂件,并把序列号写⼊⽂件中printf("创建⽂件,并把序列号写⼊⽂件中!\n");hFile = CreateFile(TEXT("C:\\Windows\\system32\\USBSerial.dat"), // file to create GENERIC_READ | GENERIC_WRITE, // open for writingFILE_SHARE_READ | FILE_SHARE_WRITE, // do not share NULL, // default securityCREATE_ALWAYS, // overwrite existingFILE_ATTRIBUTE_NORMAL | // normal fileFILE_ATTRIBUTE_NORMAL, // asynchronous I/ONULL); // no attr. templateif (hFile == INVALID_HANDLE_VALUE){printf("Could not open file (error %d)\n", GetLastError());return 0;}// 把序列号写⼊⽂件中WriteFile(hFile,USBSerial,2*wcslen(* USBSerial),&dwBytesWritten,NULL);nFileSize = GetFileSize(hFile, NULL);// printf("second: %d\n", nFileSize);}else{// printf("third :%d\n",nFileSize);printf("进⼊⽐较序列号\n");ReadFile(hFile,tempbuf,nFileSize,&nBytesRead,NULL);// printf("实际读取到的字节数⽬:%d\n", &nBytesRead);// for (int i = 0; i< nFileSize/2; i ++)// printf("%c", tempbuf[i]);// printf("\n");// wprintf(L"%ws\n", tempbuf);// ⽐较已经有的序列号与新读的是否相等for(int i = 0; i< ndevice; i ++){for(int j = 0; j < nFileSize/2; j++){// if( wcscmp( tempbuf, USBSerial[i] ) == 0)// printf("%c,%c; ",tempbuf[j], USBSerial[i][j] );if(tempbuf[j] == USBSerial[i][j])gTag = 1;elsegTag = 0;}if(gTag == 1)break;}delete tempbuf;}printf("gTag is :%d\n", gTag);if(gTag == 1)printf("匹配成功!\n");return gTag;// 返回值 gTag,如果 gTag 为1,表⽰U盘序列号与保存在⽂件中的序列号相同,// 若 gTag 为0,表⽰U盘序列号与保存在⽂件中的不同。
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%X2) 得到上面的USB root hub3) 遍历usb root hub上连接的usb 设备。
获取信息4)如果有多个usb口,循环前3步。
下面介绍通讯用的几个IOCTL:1)USB_HCD_DRIVERKEY_NAME ,用于获取USB设备驱动在注册表中的键名。
相应的一个结构体是:typedef struct _USB_HCD_DRIVERKEY_NAME{ULONG ActualLength;WCHAR DriverKeyName[1];} 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 RootHubName[1];} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME;3)IOCTL_USB_GET_NODE_INFORMATION,用于获取连接在root hub上的节点设备信息。
Linux系统下查看USB设备名及使用USB设备[root@rhel7 ~]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0x0006c7aeDevice Boot Start End Blocks Id System/dev/sda1 * 2048 1026047 512000 83 Linux/dev/sda2 1026048 41943039 20458496 8e Linux LVMDisk /dev/sdb: 6442 MB, 6442450944 bytes, 12582912 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0xaa06e007Device Boot Start End Blocks Id System/dev/sdb1 2048 206847 102400 8e Linux LVM /dev/sdb2 206848 432127 112640 8e Linux LVM/dev/sdb3 432128 677887 122880 8e Linux LVMDisk /dev/sdc: 5368 MB, 5368709120 bytes, 10485760 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0x0c16d904Device Boot Start End Blocks Id System/dev/sdc1 2048 206847 102400 8e Linux LVM /dev/sdc2 206848 616447 204800 8e Linux LVM/dev/sdc3 616448 1026047 204800 8e Linux LVM/dev/sdc4 1026048 1538047 256000 8e Linux LVMDisk /dev/sdd: 2147 MB, 2147483648 bytes, 4194304 sectors Units = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0x3990990cDevice Boot Start End Blocks Id SystemDisk /dev/mapper/rhel-root: 18.8 GB, 187****7488bytes, 36634624 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk /dev/mapper/rhel-swap: 2147 MB, 2147483648 bytes, 4194304 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk /dev/mapper/vgdate-lvvol1: 306 MB, 306184192 bytes,598016 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk /dev/sde: 8022 MB, 8022654976 bytes, 15669248 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0xcad4ebeaDevice Boot Start End Blocks Id System/dev/sde4 * 63 15669184 7834561 7 HPFS/NT FS/exFAT[root@rhel7 ~]#。
基于usb4java的dataeventoccurred方法如何使用usb4java库中的DataEventOccurred方法进行数据事件处理[引言]USB(Universal Serial Bus)是一种常用的计算机外部设备连接标准,可用于连接各种外部设备,如打印机、摄像头和移动存储设备等。
而usb4java 是一个开源的Java库,提供了与USB设备进行通信的功能。
其中,DataEventOccurred方法是usb4java库中的一个重要方法,用于处理USB设备发送或接收数据的事件。
本文将详细介绍如何使用DataEventOccurred方法进行数据事件处理。
[第一步:导入usb4java库]在使用DataEventOccurred方法之前,首先需要将usb4java库导入到Java项目中。
可以通过在项目配置文件中添加库的依赖项,或直接将库的JAR文件放置在项目的classpath下来导入。
一旦导入成功,就可以开始使用usb4java库的功能了。
[第二步:创建UsbServices对象]在使用usb4java库进行USB设备通信之前,需要先创建一个UsbServices对象,用于管理整个USB系统。
可以通过调用UsbHostManager类的静态方法`getDefaultUsbServices()`来创建UsbServices对象。
这个方法将返回当前系统上的默认UsbServices对象。
代码示例如下:UsbServices services = UsbHostManager.getDefaultUsbServices();[第三步:获取USB设备]接下来,需要从UsbServices对象中获取需要与之通信的USB设备。
通过调用UsbServices的getRootUsbHub()方法来获取USB设备的根节点。
然后,可以遍历根节点的子节点,逐个判断是否是目标设备。
可以使用UsbDeviceDescriptor类的getVendorId()和getProductId()方法来判断设备的厂商ID和产品ID是否匹配目标设备。
JavaScript通过WMI获取根据盘符获取U盘物理序列号一:达到的效果根据UKeyTool生成的U盘文件xxxx_ey内的md5与U盘物理序列号+ xxxx_uKey+界面读取文件自由串(50*10)计算的md5对比,如果一样,则允许登录,否则不允许登录二:加密工具1 原理U盘序列号信息格式:vid_0537&pid_a703#192b0c00048a,其中192b0c00048a为U盘的物理序列号(唯一);U盘中的验证文件名为xxxx_ey;将U盘的物理序列号加工后保存在文件xxxx_ey中,使U盘和文件一一对应。
2 加密步骤1. 把U盘的物理序列号中的所有字母转换成大写,如192B0C00048A,标为串1;2. 固定串xxxx_uKey,标为串2;3. 随机生成50*10个的可见字符:ASCII范围33-126,标为串3;4. 串1、串2、串3顺序合并,计算32位MD5(字母大写);5. 创建文件ipbc_ey,写入字符串:File:xxxx_V3 USB Private key;6. 换行,写入版本号,格式:Version:1.0.0.07. 换行,写入MD5值;8. 换行,写入串3,每50个字符换行;三:JavaScript解密1 解密步骤1. 把U盘的物理序列号中的所有字母转换成大写,如192B0C00048A,标为串1;2. 固定串xxxx_uKey,标为串2;3. 打开文件xxxx_ey,读入50*10个可见字符,标为串3;4. 串1、串2、串3顺序合并,计算32位MD5(字母大写);5. 打开文件xxxx_ey,读取MD5值;6. 比较计算的和读取的MD5值是否相同,相同则通过验证,否则失败。
2 JavaScript读取U盘物理序列号(推荐方案3)准备1 读取U盘盘符/*** 判断是否有U盘并获取U盘盘符,只适用于IE?* @returns {string} 返回U盘盘符* @constructor*/function CheckUsb() {var e, x;var ForReading = 1,RorWriting = 2;var bfResult = '';try {var fso = new ActiveXObject("Scripting.FileSystemObject");} catch(err) {return bfResult;}e = new Enumerator(fso.Drives);for (; ! e.atEnd(); e.moveNext()) {x = e.item();if (x.DriveType == 1) {if (x.Path != "A:") {bfResult += x.Path + ',';}}}return bfResult;}方案1:根据WMI的Win32_USBHub读取U盘物理序列号缺陷:无法根据盘符一对一获取U盘物理序列号缺陷说明:此方法获取的intCount,及U盘迭代index跟注册表中的键对应注册表键地址:"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum\\"+(intCount+1)次部分键对应的值的注册表地址为:"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Enum\\USBSTOR\\"+值在此处可以查看U盘的物理序列号,可验证获取的是否正确。
JavaScript通过WMI获取根据盘符获取U盘物理序列号一:达到的效果根据UKeyTool生成的U盘文件xxxx_ey内的md5与U盘物理序列号+ xxxx_uKey+界面读取文件自由串(50*10)计算的md5对比,如果一样,则允许登录,否则不允许登录二:加密工具1 原理U盘序列号信息格式:vid_0537&pid_a703#192b0c00048a,其中192b0c00048a为U盘的物理序列号(唯一);U盘中的验证文件名为xxxx_ey;将U盘的物理序列号加工后保存在文件xxxx_ey中,使U盘和文件一一对应。
2 加密步骤1. 把U盘的物理序列号中的所有字母转换成大写,如192B0C00048A,标为串1;2. 固定串xxxx_uKey,标为串2;3. 随机生成50*10个的可见字符:ASCII范围33-126,标为串3;4. 串1、串2、串3顺序合并,计算32位MD5(字母大写);5. 创建文件ipbc_ey,写入字符串:File:xxxx_V3 USB Private key;6. 换行,写入版本号,格式:Version:1.0.0.07. 换行,写入MD5值;8. 换行,写入串3,每50个字符换行;三:JavaScript解密1 解密步骤1. 把U盘的物理序列号中的所有字母转换成大写,如192B0C00048A,标为串1;2. 固定串xxxx_uKey,标为串2;3. 打开文件xxxx_ey,读入50*10个可见字符,标为串3;4. 串1、串2、串3顺序合并,计算32位MD5(字母大写);5. 打开文件xxxx_ey,读取MD5值;6. 比较计算的和读取的MD5值是否相同,相同则通过验证,否则失败。
2 JavaScript读取U盘物理序列号(推荐方案3)准备1 读取U盘盘符/*** 判断是否有U盘并获取U盘盘符,只适用于IE?* @returns {string} 返回U盘盘符* @constructor*/function CheckUsb() {var e, x;var ForReading = 1,RorWriting = 2;var bfResult = '';try {var fso = new ActiveXObject("Scripting.FileSystemObject");} catch(err) {return bfResult;}e = new Enumerator(fso.Drives);for (; ! e.atEnd(); e.moveNext()) {x = e.item();if (x.DriveType == 1) {if (x.Path != "A:") {bfResult += x.Path + ',';}}}return bfResult;}方案1:根据WMI的Win32_USBHub读取U盘物理序列号缺陷:无法根据盘符一对一获取U盘物理序列号缺陷说明:此方法获取的intCount,及U盘迭代index跟注册表中的键对应注册表键地址:"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Disk\\Enum\\"+(intCount+1)次部分键对应的值的注册表地址为:"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Enum\\USBSTOR\\"+值在此处可以查看U盘的物理序列号,可验证获取的是否正确。
winusb_getdescriptor 使用的例子如何使用winusb_getdescriptor函数。
文章要包含以下内容:1. 什么是winusb_getdescriptor函数及其作用。
2. 使用winusb_getdescriptor函数的步骤。
3. 如何创建和初始化USB设备句柄。
4. 如何使用winusb_getdescriptor函数获取设备描述符。
5. 如何解析和使用设备描述符的信息。
6. 常见问题和注意事项。
标题:如何使用winusb_getdescriptor函数来获取USB设备描述符引言:USB设备描述符是一个包含设备的各种信息的结构,如设备的供应商ID、产品ID、设备的类别和子类别等。
对于开发USB驱动程序或进行USB设备相关的应用开发来说,了解和获取设备描述符信息是非常重要的。
在Windows平台下,我们可以使用WinUSB API中的winusb_getdescriptor函数来实现这一功能。
1. 什么是winusb_getdescriptor函数及其作用winusb_getdescriptor函数是WinUSB API提供的一个函数,用于获取USB设备的描述符信息。
它可以用来获取设备的各种描述符,如设备描述符、配置描述符、接口描述符等。
这些描述符中包含了设备的重要信息,比如设备的类型、功能、接口等。
winusb_getdescriptor函数的作用是向USB设备发送一个设备描述符请求,然后从设备接收相应的描述符数据。
通过这个函数,我们可以获取设备的描述符信息,用于对设备进行初始化、配置或其他后续操作。
2. 使用winusb_getdescriptor函数的步骤下面是使用winusb_getdescriptor函数来获取USB设备描述符的详细步骤:步骤1:创建和初始化USB设备句柄在使用WinUSB API之前,我们需要先创建和初始化一个USB设备句柄。
这可以通过调用一些Windows API函数来完成,如CreateFile、SetupDiGetClassDevs、SetupDiEnumDeviceInterfaces等。
python3adb获取设备序列号的实现python3 adb 获取设备序列号import subprocessdef deal_cmd(cmd):pi = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)# print(pi.stdin.read())return pi.stdout.read()def deal_result():result = deal_cmd('adb devices')result = result.decode("utf-8")if result.startswith('List of devices attached'):# 查看连接设备result = result.strip().splitlines()# 查看连接设备数量device_size = len(result)if device_size > 1:device_list = []for i in range(1, device_size):device_detail = result[1].split('\t')if device_detail[1] == 'device':device_list.append(device_detail[0])elif device_detail[1] == 'offline':print(device_detail[0])return False, '连接出现异常,设备⽆响应'elif device_detail[1] == 'unknown':print(device_detail[0])return False, '没有连接设备'return True, device_listelse:return False, "没有可⽤设备"Python 获取设备名及地址1. 查询本机的设备名及IP地址,打开Python 3.6(32-bit),输⼊:import sockethost_name = socket.gethostname()print(" Host name: %s" %host_name)print(" IP address: %s" %socket.gethostbyname(host_name))2. 查询本地的设备名及IP地址,使⽤内置的类⽅法,定义成⼀个独⽴的函数print_device_info() import socketdef print_device_info():host_name = socket.gethostname()print(" Host name: %s" %host_name)print(" IP address: %s" %socket.gethostbyname(host_name))if __name__=='__main__':print_device_info();3. 查询远程设备名及IP地址,定义⼀个函数print_device_remote_info() import socketdef print_device_remote_info():host_name = 'home.lenovo'print(" Host name: %s" %host_name)print(" IP address: %s" %socket.gethostbyname(host_name))if __name__=='__main__':print_device_remote_info();以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
LibUSB-Win32是一个用于Windows操作系统(Win98SE、WinME、Win2k和WinXP、Vista、Win7等)上的通用USB设备驱动程序。
该驱动程序允许使用者在不写任何一行核心驱动程序代码的情况下,可以访问Windows系统上的任意一个USB设备,具有以下特点: 能够与任意一个已安装的USB设备进行通信可被用作自己开发的USB设备的驱动程序支持批量和中断传输支持USB规范中定义的所有标准设备请求支持USB设备制造商的自定义请求通过使用几个函数,就可以与USB设备进行简单通信了,通信的主要流程可分为以下四步:1) 调用usb_init函数,进行初始化。
2) 打开要进行通信的USB设备的句柄。
首先依次调用usb_find_busses、usb_find_devices和usb_get_busses这三个函数,获得已找到的USB总线序列;然后通过链表遍历所有的USB设备,根据已知的要打开USB设备的ID(VID/PID),找到相应的USB设备;最后调用usb_open函数打开该USB设备(在这里假设总线上没有相同VID和PID的USB设备。
如果总线上存在着相同VID和PID的设备,还需要进行其他条件判断,比如设备名称,以保证是打开的是期望的USB设备)。
3) 与USB设备进行通信。
使用usb_control_msg函数,向USB设备读取数据或写入数据。
4) 关闭USB设备。
完成所有操作后,调用usb_close函数关闭已经打开的USB设备。
编译工具:VS2010和WINDDK,可以去官网上直接下载源码,地址是/projects/libusb-win32/files/,下载的最新版本为libusb-win32-src-1.2.6.0。
VS2010用来编译libusb-win32的动态链接库、相关工具和DEMO程序的。
我们还需要WINDDK来编译驱动,即生成libusb0.sys文件。
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 DriverKeyName[1];
} 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 RootHubName[1];
} 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 bRemoveAndPowerMask[64];
} 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 PipeList[0];
} 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;。