背景:

  阅读新闻

  [日期:2012-07-28]

  来源:Linux社区

  作者:LUGLWQQ

  [字体:大 中 小]

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

  NULL,

  NULL,

  DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

  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

  Linux内核驱动之I/O内存

  Android的数据存储与IO - 手势

  相关资讯

  获取Android设备型号

  本文评论

  查看全部评论 (0)

  表情: 表情

  姓名:

  匿名

  字数

  同意评论声明

  评论声明

  尊重网上道德,遵守中华人民共和国的各项有关法律法规

  承担一切因您的行为而直接或间接导致的民事或刑事法律责任

  本站管理人员有权保留或删除其管辖留言中的任意内容

  本站有权在网站内转载或引用您的评论

  参与本评论即表明您已经阅读并接受上述条款

  最新资讯

  CentOS 6.4下双网卡bond配置

  CentOS6.x双网卡采用主-备份策略绑定(bond

  ORA-30036故障解决方法案例

  ORA-03114: 未连接到 ORALCE 解决方法案例

  Oracle RAC系统内存无法释放解决

  Oracle Goldengate在HP平台裸设备文件系统

  OGG升级运行ggsic报Unable to find library

  Linux vi命令大全

  VMware虚拟机主机模式下与主机互ping通

  Linux内核中container_of函数详解