WINCE 获取设备ID

原文:http://blog.csdn.net/norains/article/details/1866736

//========================================================================
//TITLE:
//    WinCE获取设备ID
//AUTHOR:
//    norains
//DATE:
//    Sunday  4-November-2007
//Environment:
//        EVC4.0 + Windows CE 5.0 Standard SDK
//========================================================================

    在Wince下获取设备ID(Device ID)并不困难,只要简单地调用KernelIoControl即可.不过至于能否获得设备ID,并且获得的ID属于什么类型,则关系到驱动层的实现.而设备ID的实现,在不同的平台有不同,比如在夏普的LH71404的开发板中,设备ID位于platform.c中.不过本文目的不关注如何设置或编写设备ID,而仅仅是通过函数调用获得该设备ID而已.
   
    首先我们来看看设备ID在winCE下的定义:

    typedef  struct  _DEVICE_ID {
    DWORD   dwSize;
    DWORD   dwPresetIDOffset;
    DWORD   dwPresetIDBytes;
    DWORD   dwPlatformIDOffset;
    DWORD   dwPlatformIDBytes;
} DEVICE_ID, 
* PDEVICE_ID;

     结构清晰明了,而我们所要关注的仅仅是这两个字段:dwPlatformIDOffset和dwPlatformIDBytes.
   
    现在假设我们有一个平台,该平台的设备ID为一个字符串:"MyDeviceId",那么我们可以通过下面一个简单的例子获得该设备ID:

     char  szBuf[MAX_PATH]  =  { 0 };
    DEVICE_ID devID 
=  { 0 };
    GetDeviceID((BYTE 
* )szBuf,MAX_PATH, & devID);
    
char  szDeviceID[MAX_PATH]  =  { 0 };
    strcpy(szDeviceID,szBuf 
+  devID.dwPlatformIDOffset);

    此时szDeviceID中存储的字符串就是"MyDeviceId".
   
    代码中的GetDeviceID是自己写的一个获取ID函数,该代码如下:
    DWORD GetDeviceID(BYTE  * pOutBuf,DWORD dwBufSize,DEVICE_ID  * pDeviceID)
        {
            DWORD dwRead 
=   0 ;
            
if (KernelIoControl(IOCTL_HAL_GET_DEVICEID, NULL,  0 , pOutBuf, dwBufSize,  & dwRead)  ==  FALSE)
            {
                
return   0 ;
            }
        
            pDeviceID 
=  (PDEVICE_ID)pOutBuf;
        
            
return  dwRead;
        }

  pOutBuf是传入的存储缓冲区,dwBufSize是缓冲区大小,pDeviceID是接受设备ID的结构信息,函数返回值是读取的字节数,当为0的时候,很可能是函数读设备ID失败.调用方法很简单,可参考上文的例子.
  
  代码中出现的IOCTL_HAL_GET_DEVICEID是WinCE下定义的宏,专注于获取设备ID,该宏的定义如下:
   #define  IOCTL_HAL_GET_DEVICEID      CTL_CODE(FILE_DEVICE_HAL, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)

  
  最后需要说的是,要使该段代码工作正常,尚且需要包含该头文件:Pkfuncs.h

你可能感兴趣的:(WinCE)