西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)其它知識 → 驅(qū)動程序調(diào)用:UMDF驅(qū)動程序開發(fā)教程

驅(qū)動程序調(diào)用:UMDF驅(qū)動程序開發(fā)教程

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時間:2012/3/25 22:24:17字體大。A-A+

作者:西西點擊:73次評論:0次標簽: 驅(qū)動程序

  • 類型:硬件驅(qū)動大。1.8M語言:中文 評分:6.3
  • 標簽:
立即下載

最近的一個開發(fā)任務中,我的應用程序需要調(diào)用驅(qū)動程序去做一些事情,考慮到應用的情形,計劃使用一個UMDF驅(qū)動程序來實現(xiàn)。雖然是一名老程序員了,但對于Windows桌面系統(tǒng)的開發(fā)還是頭一次做,對于UMDF驅(qū)動更是連名字都沒有聽過。同時時間比較緊,也不可能從頭去查幫助,讀文檔,只能以最快的方式來做。前后共計在這個驅(qū)動上花了不到兩天的時間,才將UMDF驅(qū)動開發(fā)的大概流程弄懂,以下做以記錄,但愿對于后來者有所幫助。

 基本過程

既然為了趕時間,我這里自然不會去分析原理,只能涉及按照這種方法可以快速介入,在自己不熟悉的領域里快速開發(fā)。遇到難題還是得仔細閱讀幫助文檔,或者請教高手。

 1,  首先使用VS按照UMDF驅(qū)動的向?qū)?chuàng)建一個新的驅(qū)動,創(chuàng)建過程不再細述,按照向?qū)У牟襟E執(zhí)行即可。這樣我們就有了一個驅(qū)動的基本框架。它應該可以編譯通過并安裝,如果在編譯和安裝過程中有問題,請先檢查VS的開發(fā)環(huán)境。

2,  添加自己的代碼。這樣創(chuàng)建的驅(qū)動其Read/Write函數(shù)是否有,及如何調(diào)用我還真沒有明白,我只知道IoControl函數(shù),及添加相應的代碼。

 在ioQueue.cpp中的找到CMyIoQueue::OnDeviceIoControl函數(shù),它就是上層調(diào)用DeviceoControl時,會調(diào)用到驅(qū)動的函數(shù),即驅(qū)動的IoControl入口。這個函數(shù)有5個參數(shù):

__in IWDFIoRequest *FxRequest,我們可以訪問的數(shù)據(jù)結(jié)構(gòu)都在它里面。

__in ULONG ControlCode,是控制碼,我們應該根據(jù)不同的控制碼去執(zhí)行對應的代碼。

         其它的參數(shù)都沒有用。

         分別得到輸出和輸出Buffer:

                  FxRequest->GetInputMemory( &pInMem );

                  FxRequest->GetOutputMemory( &pOutMem );

         將輸入Buffer拷貝到本地的一段內(nèi)存中,我們不能直接訪問 pInMem指向的內(nèi)存,只能將其拷出來使用(是不是能讀不記得了,誰有興趣可以試一下)

                   hr=pInMem->CopyToBuffer(0x0, &localBuffer, dwSize );

         本地做完處理以后,將要傳出去的數(shù)據(jù)拷貝到pOutMem.

                   hr=pOutMem->CopyFromBuffer(0x0, &localOut, sizeof(localOut));

         最后通知調(diào)用者給它傳出了多少數(shù)據(jù):

                   FxRequest->CompleteWithInformation( hr, sizeof(localOut));

 3,   注意事項

1,  要傳出數(shù)據(jù)一定要使用OutMemory,當然寫這點文字時我用的是VS11 Beta,以后的版本是否會有改變,還需要留意,這個花了我挺長時間,一開始,我一直想把數(shù)據(jù)用InoutMemory傳回,但上層總得不到。后來想到可能它就設計成了不能通過InputMemory傳數(shù)據(jù)出去。

2,  Complete是一定要調(diào)的,有兩個函數(shù),Complete和CompleteWithInformation,前者只是表示驅(qū)動中的過程已經(jīng)做完,后者可以同時給出我們在OutMemory中放了多少字節(jié)的數(shù)據(jù)。如果不調(diào)用這個函數(shù),上層調(diào)用DeviceIoControl時,就會失敗,GetLastError會說是操作被Pending。

3,  因微軟的例子中沒有給出IO操作的代碼,我當時來網(wǎng)上到處搜別人寫的例子。當時看到有人會將FxRequest Release,如果將它Release,就會引起驅(qū)動程序出錯,而不能再使用。由此我想到:1,不能輕易相信別人的代碼,尤其是網(wǎng)頁上(包括我的,哈哈)。2,一定要時刻注意自己加入新的代碼以后程序有什么樣的新的行為,一定要及時發(fā)現(xiàn)異常,以及時介定是哪次加入的代碼有問題,這樣才會少浪費時間。

4,  關(guān)于運行權(quán)限的一些概念:

每個UMDF驅(qū)動都有一個專門的進程來加載它(程序名忘記了),其運行權(quán)限是Local Service。所以有些需要更高運行權(quán)限(如Admin)的函數(shù)無法在UMDF驅(qū)動中使用。

    萬能顯卡
    (240)萬能顯卡
    萬能顯卡驅(qū)動適用于所有顯卡安裝驅(qū)動所用,稱之為萬能顯卡驅(qū)動。顯卡驅(qū)動是硬件所對應的軟件,你裝電腦時那幫你裝電腦的人不是給了你很多碟子的嗎,那些就是驅(qū)動程序,其中必然有一張是顯卡的驅(qū)動程序。先要確定你的顯卡什么牌子型號的,如果記不得了,就打開機箱看那個豎插在主板上的較大板子一般顯卡有很大的散熱片或風扇上的型號品牌。如果是集成的顯卡在主板上看不到前面說的那樣的電路板,就看主板上的型號品牌,記下來。但是...更多>>

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字數(shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)