2007年11月2日

DEVICE_ID in Windows CE

因為某家配合的圖資廠,需要有 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 在執行完後會放的內容有:

image

第一塊是 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.

沒有留言: