驅動程式是通過裝置控制代碼來控制裝置的,應用程式要控制裝置,也需要獲得裝置控制代碼,然後使用驅動程式體提供的deviceiocontrol介面來控制裝置。那麼應用程式是如何獲得裝置控制代碼的呢?
通常流介面驅動程式會使用兩個結構體,驅動上下文結構體和裝置上下文結構體。裝置控制代碼會儲存在裝置上下文結構體中,驅動上下文結構體會儲存裝置上下文結構體的位址。這樣通過驅動上下文結構體就能夠得到裝置控制代碼。下面我定義乙個驅動上下文指標dwdrivercontext來說明這個指標是如何被傳遞的。
1、 在執行usbdeviceattach的函式中,函式activatedevice用來啟用流介面,它將dwdrivercontext的值寫入登錄檔中。
2、 當dwdrivercontext被寫入登錄檔後,裝置管理器會呼叫cam_init 函式。cam_init 函式執行後會從登錄檔取得dwdrivercontext的值。
3、 應用程式使用creatfile這個api時,驅動程式中的cam_open函式會被呼叫,cam_open執行時會獲得cam_init 函式的到的dwdrivercontext。creatfile會得到cam_open返回的dwdrivercontext。在應用程式中,dwdrivercontext會以控制代碼的形式出現,這時應用程式就可以通過creatfile返回的控制代碼來控制裝置了。
4、 應用程式使用deviceiocontrol時會把creatfile返回的控制代碼(其實就是dwdrivercontext)傳回給驅動程式的cam_iocontrol函式。
以上就是裝置控制代碼在驅動程式與應用程式之間的傳遞過程。
WINCE流驅動介面函式引數詳解
dword init dword dwcontext,lpcvoid lpvbuscontext dwcontext 指向登錄檔的指標,說明流驅動的活動鍵的路徑。lpvbuscontext 作為activedevice的第四個引數傳遞程序對映的指標。返回值 若此函式執行成功,則返回乙個裝置上下文控制...
WinCE流驅動載入的控制
前段時間整理了 wince下除錯串列埠的動態復用 基本實現了除錯串列埠與普通功能串列埠之間的動態切換。其中實現的方法有點欠缺,在重新燒錄或者公升級系統後,導致系統無法正常啟動。這算是個bug。該功能加上才幾天,就陸續有好幾個同事碰到。本來想著使用方便的,沒想到反而增添了一些麻煩。這個問題在實現時曾考...
Linux裝置驅動 字元裝置驅動介面函式
核心提供了三個函式來註冊一組字元裝置編號,這三個函式分別是register chrdev region alloc chrdev region 和register chrdev 在linux2.6核心以前註冊字元裝置的函式介面是register chrdev,登出字元裝置介面函式是unregiste...