Android设备检测

前些日子,自己接手专门为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= "<<QString::number(err);
     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 = "<<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 = "<<str;
           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设备的判断。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值