风过无痕,生命如烟

每个人生下来都是天使,不过这个世界上也存在着恶魔。恶魔是天使变的,因为这个世界充满了诱惑。

导航

Windows下获取android设备的序列号(转)

本文转自:http://kb.cnblogs.com/a/2283253/

在使用android设备时,通过adb devices命令可以枚举出当前连接的设备,枚举的内容中前面的一串字符串即为android设备的序列号。adb和fastboot通过该序列号唯一标识一个设备。

    android的序列号本 质上是USB设备的序列号,在USB的规范中可以找到相关的定义。设备厂商通过某种算法或依赖设备的硬件ID产生这个序列号。序列好一经确定不在改变,是 USB设备的唯一标识。但是这个序列号不是硬性规定,有的同一型号的设备使用相同的序列号,此时序列号不能唯一标识设备。

    在windows下编程得到此序列号有几种方法,其实本质上就是第三种方法,1、2两种是使用adb的封装:

(1)直接使用adb命令,采用重定向的方式得到该序列号,使用管道重定向的方法在网上的文章很多,不再多说了。

(2) 使用adb所所提供的库文件,在adb的目录下有AdbWinApi.dll、AdbWinUsbApi.dll两个文件,我们可以通过 AdbWinApi.dll导出的接口来获取设备的序列号,其中AdbWinUsbApi.dll是使用winusb接口的实现,在legacy驱动时不 需要此动态库。

(3)在以上两种方法中使用的都SetupAPI和WinUSB来获取序列号的。根据不同的驱动使用的不同方法来获取,

对于legacy驱动,如下代码:

HANDLE usb_device_handle = CreateFile(p->DevicePath, //通过SetupAPI得到设备路径
            GENERIC_READ,
            FILE_SHARE_READ | FILE_SHARE_WRITE,
            NULL,
            OPEN_EXISTING,
            0,
            NULL);

if (INVALID_HANDLE_VALUE == usb_device_handle)

{
            return NULL;
}

WCHAR serial_number[512];

        // Send IOCTL
DWORD ret_bytes = 0;
BOOL ret = DeviceIoControl(usb_device_handle,
            ADB_IOCTL_GET_SERIAL_NUMBER,
            NULL, 0,
            serial_number, sizeof(serial_number),
            &ret_bytes,
            NULL)

对于支持winusb的驱动

CHandle hAdbDev(CreateFile(p->DevicePath,

         GENERIC_READ|GENERIC_WRITE,

         FILE_SHARE_READ|FILE_SHARE_WRITE,

         NULL, OPEN_EXISTING,

         FILE_FLAG_OVERLAPPED, //注意这的区别,使用Winusb必须以OVERLAPPED方式打开设备

         NULL));

if (WinUsb_Initialize(hAdbDev, &hUsb))
{
         USB_DEVICE_DESCRIPTOR desc;
         ZeroMemory(&desc, sizeof(desc));
         if (WinUsb_GetDescriptor(hUsb, USB_DEVICE_DESCRIPTOR_TYPE, 0, 0, (PUCHAR)&desc, sizeof(desc), &nRetLen))
         {
                ZeroMemory(buf, sizeof(buf));
                if (WinUsb_GetDescriptor(hUsb, USB_STRING_DESCRIPTOR_TYPE, desc.iSerialNumber, 0x0409, buf, sizeof(buf), &nRetLen))
                {
                      if (0 != nRetLen)
                      {
                            PUSB_STRING_DESCRIPTOR pTmp = (PUSB_STRING_DESCRIPTOR)buf;
                            pTmp->bString; //序列号
                      }
                 }
          }
          WinUsb_Free(hUsb);

}

在adb的源码中,首先使用控制字方式获取序列号,如果失败则使用winusb方式获取。

 

posted on 2012-02-04 13:12  hyamw  阅读(1007)  评论(1)    收藏  举报