12.26.2006

Device Driver 呼叫另一個Device Driver

這個是 Auron 發現,先說明一般使用方法:

Device Driver Code要使用到另一個Device Driver,和一般Applicaiton 一樣
  • CreateFile( ) 取得要使用的Driver的hadle。
  • DeviceIoControl( ) 對該Driver 進行控制。
  • Device Driver 退出時(unload, deinit...) CloseHandle( )
當然,Create後,使用一般的File Operation (Read, Write, Open..)也可以。

另一種方法(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 )
Error..
其中self->hProc 會是DEVICE.EXE

Auron 發現這樣的code,雖然是在同一個 process space,但是呼叫時,參數傳遞不可以用local variable (in stack)。否則會發生"access violation"。
所以要呼叫時,傳遞pointer參數一定要指向global variable。

7 則留言:

素珊 提到...

我有一些關於wince6.0 的問題想問你,請問你有空嗎?

checko 提到...

? 6.0 ? 我也還沒開使用。

有空 ?

如果沒有保密問題的話,可以寫出來看看。.....

我也不知道自己知不知道答案..

素珊 提到...

我想問有關wince6.0 eboot問題,我已成功由asm code to main,但 c code還未init debug port就當機了...
我的email is suzanne_chan@yahoo.com
麻煩你了

checko 提到...

這...我應該不知道是什麼問題。

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還未成功移置

checko 提到...

所以是在porting eboot ?

這麼厲害。我都還沒看過6.0 的eboot code呢。

該叫你一聲"大姊"才對...

素珊 提到...

已解決了,說實話,厲害就不會用太多時間就能解決!
有機會再切磋!