Device Driver Code要使用到另一個Device Driver,和一般Applicaiton 一樣
- CreateFile( ) 取得要使用的Driver的hadle。
- DeviceIoControl( ) 對該Driver 進行控制。
- Device Driver 退出時(unload, deinit...) CloseHandle( )
另一種方法(Auron's Way):
利用所有Device Driver都在DEVICE.EXE 的address space的這個特性,各device driver 間的記憶體不經轉換,可以直接呼叫。
所以 另一個作法就是在callie driver 中implement 一個iocontrol,將所有funciton pointer 放在talble中傳遞出來。
這樣同在DEVICE.EXE中的所有driver都可以利用這個 IoControl 取得那個driver 的function pointer,直接呼叫。 (減少不必要的kernel-user space 轉換的overhead)。
為了防止不當呼叫,Callie 的IoControl中該function code implement時,會check..
if (GetCallerProcess( ) != self->hProc )其中self->hProc 會是DEVICE.EXE
Error..
Auron 發現這樣的code,雖然是在同一個 process space,但是呼叫時,參數傳遞不可以用local variable (in stack)。否則會發生"access violation"。
所以要呼叫時,傳遞pointer參數一定要指向global variable。
7 則留言:
我有一些關於wince6.0 的問題想問你,請問你有空嗎?
? 6.0 ? 我也還沒開使用。
有空 ?
如果沒有保密問題的話,可以寫出來看看。.....
我也不知道自己知不知道答案..
我想問有關wince6.0 eboot問題,我已成功由asm code to main,但 c code還未init debug port就當機了...
我的email is suzanne_chan@yahoo.com
麻煩你了
這...我應該不知道是什麼問題。
asm code 是bootloader 的部份 ?
dram 已經configur好了?
kernel image 已經load到dram中了 ?
你是在porting ce 6.0 to new hardware ?
你的debug port 是用 chip 的serial port 嗎? 有沒有規劃好?
還是你是CEPC ?
這個...我應該不知道答案 :P
我是由wince5.0移上6.0,所以debug port已在5.0是已規劃好了
我是用mainstoneIII(ARMV4I)的platform,還未上kernel,因為bootloader內的main.c還未成功移置
所以是在porting eboot ?
這麼厲害。我都還沒看過6.0 的eboot code呢。
該叫你一聲"大姊"才對...
已解決了,說實話,厲害就不會用太多時間就能解決!
有機會再切磋!
張貼留言