UMDF驅動程序快速上手


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

 

基本過程

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

 

1,  首先使用VS按照UMDF驅動的向導創建一個新的驅動,創建過程不再細述,按照向導的步驟執行即可。這樣我們就有了一個驅動的基本框架。它應該可以編譯通過並安裝,如果在編譯和安裝過程中有問題,請先檢查VS的開發環境。

2,  添加自己的代碼。這樣創建的驅動其Read/Write函數是否有,及如何調用我還真沒有明白,我只知道IoControl函數,及添加相應的代碼。

 

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

__in IWDFIoRequest *FxRequest,我們可以訪問的數據結構都在它里面。

__in ULONG ControlCode,是控制碼,我們應該根據不同的控制碼去執行對應的代碼。

         其它的參數都沒有用。

        

         分別得到輸出和輸出Buffer:

                  FxRequest->GetInputMemory( &pInMem );

                  FxRequest->GetOutputMemory( &pOutMem );

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

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

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

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

         最后通知調用者給它傳出了多少數據:

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

 

3,   

注意事項

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

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

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

4,  關於運行權限的一些概念:

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

5,   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM