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 則留言:

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

    回覆刪除
  2. ? 6.0 ? 我也還沒開使用。

    有空 ?

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

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

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

    回覆刪除
  4. 這...我應該不知道是什麼問題。

    asm code 是bootloader 的部份 ?
    dram 已經configur好了?
    kernel image 已經load到dram中了 ?

    你是在porting ce 6.0 to new hardware ?

    你的debug port 是用 chip 的serial port 嗎? 有沒有規劃好?

    還是你是CEPC ?

    這個...我應該不知道答案 :P

    回覆刪除
  5. 我是由wince5.0移上6.0,所以debug port已在5.0是已規劃好了
    我是用mainstoneIII(ARMV4I)的platform,還未上kernel,因為bootloader內的main.c還未成功移置

    回覆刪除
  6. 所以是在porting eboot ?

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

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

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

    回覆刪除