设为首页 加入收藏

TOP

根据USB设备硬件信息获取Android设备型号(一)
2014-11-24 11:25:12 来源: 作者: 【 】 浏览:2
Tags:根据 USB 设备 硬件 信息 获取 Android 型号

其中为了解决设备和型号的对应关系,用于区分当前接入系统的设备是USB设备,并且是Android设备而不是通常的USB设备或者其他的手机设备。


故需要获得设备的硬件设备序号,根据硬件信息特征码来和Android特征码数据库进行匹配,来取得设备的型号。


首先根据硬件的GUID获取USB类设备集句柄


//USB设备的GUID
static const GUID GUID_DEVINTERFACE_USB_DEVICE =
{ 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
//磁盘的GUID
const GUID* szDiskClassGuid = &GUID_DEVINTERFACE_DISK; //磁盘类
const GUID* volumeGuid_ = &GUID_DEVINTERFACE_VOLUME; //卷类



//获取USB类设备集句柄
int CusbDeviceInfo::EnumUsbDeviceSet()
{
// Get device interface info set handle for all devices attached to system
hDevInfo = NULL;
hDevInfo = SetupDiGetClassDevs(
szDiskClassGuid, /* CONST GUID * ClassGuid - USB class GUID */
NULL, /* PCTSTR Enumerator */
NULL, /* HWND hwndParent */
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE/* DWORD Flags */);


if(hDevInfo == INVALID_HANDLE_VALUE)
{
DWORD err = GetLastError();
qDebug()<<"EnumUsbDeviceSet= "< return -1;
}


//获取可移动分区
bool Rv = GetAllRemovablePartitions();
//if (Rv)
//{
int ret = EnumUsbDeviceInfo();
return ret;
//}
//else
//{
// return -1;
//}
}



//获取枚举的设备信息
SP_DEVINFO_DATA devInfoData = {sizeof(SP_DEVINFO_DATA)};
bRet = SetupDiEnumDeviceInfo(hDevInfo,dwIndex,&devInfoData);
if(!bRet)
{
DWORD err = GetLastError();
SetupDiDestroyDeviceInfoList(hDevInfo);
break;
}


DWORD nSize=0 ;
TCHAR DevInstanceId[MAX_PATH];
if(SetupDiGetDeviceInstanceId(hDevInfo, &devInfoData, DevInstanceId, sizeof(DevInstanceId), &nSize))
{
QString DeviceId = QString::fromWCharArray(DevInstanceId);
//m_DeviceIdVector.append(DeviceId);
if (DeviceId.left(3).toUpper() == "USB")
{
qDebug()<<"DeviceId = "< }

}
else
{
DWORD err = GetLastError();
continue;
}


//
//获取设备接口数据集
SP_DEVICE_INTERFACE_DATA devInterfaceData;
BYTE buffer[BUFFER_SIZE];
DWORD RequiredSize;
TCHAR buf[BUFFER_SIZE];
DEVINST devInstParent;


ZeroMemory(&devInterfaceData, sizeof(devInterfaceData));
devInterfaceData.cbSize = sizeof(devInterfaceData);
if(!SetupDiEnumDeviceInterfaces(hDevInfo,NULL,szDiskClassGuid,dwIndex,&devInterfaceData))
{
qDebug()<<"SetupDiEnumDeviceInterfaces error ";
DWORD err = GetLastError();
continue;
}


//获取设备接口细节信息
ZeroMemory(&devInfoData, sizeof(devInfoData));
devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetail;
pDevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer;
pDevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);


bool ret = SetupDiGetDeviceInterfaceDetail(hDevInfo, &devInterfaceData,
pDevDetail, BUFFER_SIZE, &RequiredSize, &devInfoData);
if(!ret)
{
qDebug()<<"SetupDiGetDeviceInterfaceDetail error ";
DWORD err = GetLastError();
continue;
}



//获取设备状态
CM_Get_Device_ID(devInfoData.DevInst, buf, sizeof(buf),0);
QString str = QString::fromStdWString(buf);

if (str.left(3).toUpper() == "USB")
{
qDebug()<<"CM_GET_DEVICE_ID_1 = "< m_DeviceVectorID_1.append(QString::fromStdWString(buf));
}


CM_Get_Parent(&devInstParent,devInfoData.DevInst, 0);
CM_Get_Device_ID(devInstParent, buf, sizeof(buf),0);
str = QString::fromStdWString(buf);


//根据以下方法取得设备SDN id
HANDLE hDrive = CreateFile(pDevDetail->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);


同时可根据系统中移动分区各个盘符取得对应的磁盘以及磁盘SDN id

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux内核驱动之I/O内存 下一篇Android的数据存储与IO - 手势

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python 数据分析与可 (2025-12-26 21:51:20)
·从零开始学Python之 (2025-12-26 21:51:17)
·超长干货:Python实 (2025-12-26 21:51:14)
·为什么 Java 社区至 (2025-12-26 21:19:10)
·Java多线程阻塞队列 (2025-12-26 21:19:07)