因為某家配合的圖資廠,需要有 DEVICE_ID 這個東西 (MSDN) 來幫忙鎖機子,所以只好從 BSP 下手。
他們會用 KernelIoControl() 帶 IOCTL_HAL_GET_DEVICEID 這個 io control code 來取得機子上的 DEVICE_ID;而該 ID 是由 Preset ID 和 Platform ID 所組成。
在 MSDN 裡面看呀看,一開始實在看不懂到底是在幹麼的,因為從 code 來追,追到後來 DEVICE_ID 只是一個 struct,用來描述 Preset ID 和 Platform ID 的大小而已。
typedef struct _DEVICE_ID {
DWORD dwSize;
DWORD dwPresetIDOffset;
DWORD dwPresetIDBytes;
DWORD dwPlatformIDOffset;
DWORD dwPlatformIDBytes;
} DEVICE_ID, *PDEVICE_ID;
找不到他是在哪裡存 Preset ID 和 Platform ID... MSDN 根本沒有寫得很清楚。
後來一直 Trace 到後來,並把
%WINCEROOT%\platform\common\src\common\ioctl\deviceid.c
讀了又讀以後才看懂...
原來 AP 在呼叫 KernelIoControl() 以後會帶一個 *pOutBuffer 下來,而這個 buffer 在執行完後會放的內容有:
第一塊是 DEVICE_ID;第二塊是 Preset ID 的內容;第三塊是 Platform ID 的內容。也就是說,AP 會透過 DEVICE_ID 這個 struct 得知 Preset ID 及 Platform ID 的長度,並透過 offset 移到 sizeof(DEVICE_ID) 之後來讀這兩個 ID。
而且 AP 通常都會重新呼叫兩次這個 KernelIoControl() ,以便取得要放多少 buffer size。
最後, MSDN 對 OEM 廠使用 Preset ID 和 Platform ID 的建議如下:
- Preset ID
identify one unique device type from another - Platform ID
identify one unique hardware platform from another
For example, two PDAs from the same manufacturer have two different Platform identifiers, but they have the same Preset identifier.
沒有留言:
張貼留言