WindowsEmbedded::Touch panel driver

在 windows CE 6.0,GWES 從 .exe 改成了 .dll,並且被放進了 kernel 中。主要的考量點是效能的問題,如此每當使用 GWES 提供的 servier 時 context switch 的次數會減少一次,在 kernel 中只要直接執行一次 function call 即可,不需要再將 request 轉出至另一個 service procee 了。

不過,相對應的,GWES 用到的 driver 也就必須要一起被放進 kernel space 中,例如: touch.dll

為了減少 load-time relocation 的時間,windows CE 6.0 在 .bib 檔的 flag 新增了一個 'K' flag,意思是在 build image 時就會將這些後面有 K 的 module relocation 到 kernel 適用的 address 上。

如果你今天拿到了一個 driver 並且想將之放進 kernel space 中執行,如果沒有加上 'K' flag 的話,會出現以下訊息

OSAXST1: >>> Loading Module 'busenum.dll' (0x8DF7221C) at address 0xC0460000-0xC046B000 in Process 'NK.EXE' (0x8D67DAA0)
DEVICE!RegReadActivationValues RegQueryValueEx(Drivers\BuiltIn\UTLDRV\BusPrefix) returned 2
!!!ERROR! Trying to load DLL 'UTLDRV.DLL' fixed-up to user address into Kernel.
!!!ERROR! MUST SPECIFY 'K' FLAG BIB FILE.
DEVICE!CreateDevice: couldn't load 'UTLDRV.DLL' -- error 193
CreateDevice: creation of type 'UTL', index 0, lib 'UTLDRV.DLL' returning 0x00000000, error code 2
DEVICE!I_ActivateDeviceEx: couldn't activate: prefix UTL, index 0, dll UTLDRV.DLL, context 0x1
DeviceFolder::LoadDevice(Drivers\BuiltIn\UTLDRV) last 116 TicksDEVICE!RegReadActivationValues RegQueryValueEx(Drivers\BuiltIn\FlashDrv\BusPrefix) returned 2

解決之道就是在你的 platfrom.bib 中加入該 module 的地方放上 'K' flag。

如果說,有一個 dll 是同時會被 user space & kernel space 的程式使用,可以 'D' flag 取代,這樣 image 中就會自動產生 K. 開頭及沒有 K. 的版本,如

  • touch.dll
  • k.touch.dll

其中 k. 開頭的是給 kenrel space 使用的版本