前些日子,自己接手专门为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()<

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()<

}

}

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()<

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()<

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()<

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.

根据设备获取的和通过系统中获取的移动设备进行SDN匹配就能获取设备和系统中盘符的对应关系。

同时可以根据上面获取到的设备状态和设备接口细节信息去Android SQL数据中通过正则表达式进行序列号匹配获取是否是Android设备。

以及android设备的型号。 由于安卓设备型号复杂,种类繁多,所以目前只能通过数据库匹配的方式来进行是否是Android设备的判断。

如果新出的设备,需要随时更新数据库。 不知哪位大牛有更好的方法。

linux 设备型号,根据USB设备硬件信息获取Android设备型号相关推荐

  1. android查看摄像头信息,获取Android设备上的详细的摄像头信息

    本文引用地址:http://www.eepw.com.cn/article/201610/305681.htm package=wjh.android.takepicture android:vers ...

  2. linux 查看usb驱动,linux查看硬件信息及驱动设备相关整理

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 联系我登录 首页 业界新闻 技术文章 资源分享 微语 linux查看硬件信息及驱动设备相关整理[转] 蓝猫 发布于:2014-5-30 17:48 分类: ...

  3. linux查看usb驱动版本号,linux查看硬件信息及驱动设备相关整理

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 联系我登录 首页 业界新闻 技术文章 资源分享 微语 linux查看硬件信息及驱动设备相关整理[转] 蓝猫 发布于:2014-5-30 17:48 分类: ...

  4. linux如何查看硬件驱动,linux查看硬件信息及驱动设备相关整理

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 联系我登录 首页 业界新闻 技术文章 资源分享 微语 linux查看硬件信息及驱动设备相关整理[转] 蓝猫 发布于:2014-5-30 17:48 分类: ...

  5. linux检测硬件驱动,linux查看硬件信息及驱动设备相关整理

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 联系我登录 首页 业界新闻 技术文章 资源分享 微语 linux查看硬件信息及驱动设备相关整理[转] 蓝猫 发布于:2014-5-30 17:48 分类: ...

  6. linux查看设备硬件,linux查看硬件信息及驱动设备相关整理

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 联系我登录 首页 业界新闻 技术文章 资源分享 微语 linux查看硬件信息及驱动设备相关整理[转] 蓝猫 发布于:2014-5-30 17:48 分类: ...

  7. linux查看硬盘驱动,linux查看硬件信息及驱动设备相关整理

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 联系我登录 首页 业界新闻 技术文章 资源分享 微语 linux查看硬件信息及驱动设备相关整理[转] 蓝猫 发布于:2014-5-30 17:48 分类: ...

  8. Android+usb+spi,Android设备如何使用USB的硬件接口

    你知道Android设备如何使用USB的硬件接口吗?下面将由学习啦小编带大家来解答这个疑问吧,希望对大家有所收获! 如何处理硬件接口问题 最近业界的发展显示,智能手机/便携系统与自动化系统或机械系统之 ...

  9. LINUX检测服务并自动运行,一种Linux下的开机自动检测硬件信息的方法与流程

    技术领域本发明涉及服务器开机检测技术,具体的说是一种Linux下的开机自动检测硬件信息的方法. 背景技术: 服务器产品研发初期,产品多为工程样本,问题很多,这些问题中硬件问题占较大部分.在工程验证测试 ...

最新文章

  1. 华为 日志服务器 配置文件,配置日志服务器
  2. Oracle SID爆破工具SidGuess
  3. Windows下通过VNC远程访问Linux服务器,并实现可视化
  4. c++采集声卡输出_舒尔 Shure RMCE-LTG Lightning-MMCX接口耳机线[线型声卡]测评报告 [Soomal]...
  5. redis:list的底层实现--压缩列表
  6. 2013年06月电脑公司GHOSTXPSP3装机版◆年中推荐◆
  7. webpack打包后引用cdn的js_JS逆向:Webpack打包后的代码怎么搞?猿人学爬虫比赛第十六题详细题解...
  8. java登录界面命令_Java命令行界面(第3部分):jbock
  9. 怎么更换锁定计算机的图片,Win10系统下怎样对锁定界面的背景图片进行更换
  10. ajaxsetup获取ajax的url_跨域调用接口的方法之一:$.ajaxSetup()
  11. springboot之websocket集成
  12. leetcode刷题日记-846. 一手顺子
  13. Android uses-permission 权限大全
  14. 精睿 ESS EAV 【中文商业特别版+纯净版-官方升级】【2.11更新3.0.685.0】
  15. ExecuteNonQuery()返回-1的问题及解决
  16. 京瓷1025打印机打印有底灰简单处理
  17. 和风天气API调用结果乱码
  18. 9.----------------------------------------------------------------------------------------【学成在线案例】
  19. 关于极光vip与非vip的稳定性、送达率比较
  20. UILabel行间距调整

热门文章

  1. 微信小程序halfScreenDialog的实现
  2. 指令mysql5.6卸载_Mysql5.6压缩包安装到windows 卸载命令
  3. 员工上网行为管理——一把怎样的双刃剑
  4. ENVI高分一号卫星预处理:以GF-1/WFV多光谱数据为例(含定标系数)
  5. 这一次,彻底搞懂useEffect
  6. python——输入出生和月,计算出接下来的生日距离今天还有多少天
  7. U盘或移动固态硬盘加密等功能
  8. 3DMAX 导出ogre模型,骨骼(.mesh/.skeleton)
  9. 持证支付机构重庆公众通投资控股的国通石油遭遇危机
  10. 全兼容增强版zc706单板照片