在Windows Embedded中獲取設(shè)備ID
在WinCE下獲取設(shè)備ID(Device ID)并不困難,只要簡(jiǎn)單地調(diào)用KernelIoControl即可.不過(guò)至于能否獲得設(shè)備ID,并且獲得的ID屬于什么類(lèi)型,則關(guān)系到驅(qū)動(dòng)層的實(shí)現(xiàn).而設(shè)備ID的實(shí)現(xiàn),在不同的平臺(tái)有不同,比如在夏普的LH71404的開(kāi)發(fā)板中,設(shè)備ID位于platform.c中.不過(guò)本文目的不關(guān)注如何設(shè)置或編寫(xiě)設(shè)備ID,而僅僅是通過(guò)函數(shù)調(diào)用獲得該設(shè)備ID而已.
首先我們來(lái)看看設(shè)備ID在WinCE下的定義:
- typedef struct _DEVICE_ID {
- DWORD dwSize;
- DWORD dwPresetIDOffset;
- DWORD dwPresetIDBytes;
- DWORD dwPlatformIDOffset;
- DWORD dwPlatformIDBytes;
- } DEVICE_ID, *PDEVICE_ID;
結(jié)構(gòu)清晰明了,而我們所要關(guān)注的僅僅是這兩個(gè)字段:dwPlatformIDOffset和dwPlatformIDBytes.
現(xiàn)在假設(shè)我們有一個(gè)平臺(tái),該平臺(tái)的設(shè)備ID為一個(gè)字符串:"MyDeviceId",那么我們可以通過(guò)下面一個(gè)簡(jiǎn)單的例子獲得該設(shè)備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);
此時(shí)szDeviceID中存儲(chǔ)的字符串就是"MyDeviceId".
代碼中的GetDeviceID是自己寫(xiě)的一個(gè)獲取ID函數(shù),該代碼如下:
- 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是傳入的存儲(chǔ)緩沖區(qū),dwBufSize是緩沖區(qū)大小,pDeviceID是接受設(shè)備ID的結(jié)構(gòu)信息,函數(shù)返回值是讀取的字節(jié)數(shù),當(dāng)為0的時(shí)候,很可能是函數(shù)讀設(shè)備ID失敗.調(diào)用方法很簡(jiǎn)單,可參考上文的例子.
代碼中出現(xiàn)的IOCTL_HAL_GET_DEVICEID是WinCE下定義的宏,專(zhuān)注于獲取設(shè)備ID,該宏的定義如下:
- #define IOCTL_HAL_GET_DEVICEID CTL_CODE(FILE_DEVICE_HAL, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
最后需要說(shuō)的是,要使該段代碼工作正常,尚且需要包含該頭文件:Pkfuncs.h。
【編輯推薦】