1. 程式人生 > >菜鳥WDF驅動開發系列(2):除錯第一個KMDF驅動程式

菜鳥WDF驅動開發系列(2):除錯第一個KMDF驅動程式

根據系列上一篇的內容,已經基本作好了驅動除錯環境的配置,現在著手開始試一下怎麼用WinDBG除錯。每一位新手在開始學習驅動開發的時候相信總會看大量的資料,如我第一篇提到的幾本書的確是不錯的,但名著總有一個問題就是,開篇一開始總是會鋪陳太多的基本理論,這會讓我們覺得手足無措,更不知如何下手。個人的經驗是,直接從例程入手,理論要逐步瞭解——我說這話的主要原因是:我對驅動開發的理論一點也不清楚。反正,先從除錯第一個驅動程式開始吧,這其中涉及驅動的安裝、windbg的使用相關知識,慢慢來吧。

(1)驅動程式的安裝

先不管什麼HelloWorld吧,反正個人覺得做那種例程也就是Ctrl+C、Ctrl+V,意義不大。大家先從

http://down.51cto.com/data/457277這裡下載本篇涉及到的驅動程式,其中CharSample檔案裡是要用到的驅動程式,裡面包含原始檔與編譯好的sys驅動檔案,這是個KMDF驅動,那個UMDFSample的資料夾裡的是UMDF驅動的原始檔,暫時不用到,因為相關所以一併放在一起,至於KMDF與UMDF的概念大家儘量度娘吧。CharSample驅動是從武安河老師的書裡拷出來的,其主要用途是將輸入0~9的CHAR字元轉成零~玖的CHAR[2]中文字元,本來武老師一併有應用程式來呼叫驅動的,但由於鄙人對控制檯程式極度不感冒,而且用起來有問題,於是自己修改出了一個對話方塊應用程式用於測試,就是那個CharSampleWin.exe,編譯環境是VS2010(都什麼年代了,還是放棄VC6吧)。

先將CharSample資料夾拷到虛擬機器的XP系統下,開啟控制面板,選擇“新增硬體”——選“我已經連線此硬體”——選“新增新的硬體裝置”——手動安裝,最後定位到CharSample\sys\objchk_wxp_x86\i386目錄,選指定的inf檔案,然後就可以安裝成功了,你可以進入裝置管理器,裡面會新增一項CharSample的驅動,表明安裝驅動成功。(注:如果提示缺少WdfCoInstaller01007.dll,請諸位自行Google加到目錄下,在Win7下好像要用WdfCoInstaller01009.dll的)

(2)測試驅動是否正常工作

將CharSampleWin.exe拷到虛擬機器中,雙擊開啟,先點選“開啟驅動KMDf”,提示驅動開啟OK後,再點“隨機轉換KMDF”,如果如下圖將數字成功轉成中文,那表示驅動工作狀態很好,如下圖。這裡的隨機數我用的是偽隨機數,測試而已就不需要太糾結了。

圖1

(3)WinDBG的相關設定

開啟上一篇已經配置好的WinDBG的快捷方式,如果成功與虛擬機器連線成功,會在Waiting to reconnect...的文字後面列出一大串的東西,如下圖所示,我是已經配置好的,所以可能與大家呈現出來的東西不一樣。在File的標題欄中,設定Symbol Serch Path的內容為“E:\CharSample\sys\objchk_wxp_x86\i386;”,設定Source Serch Path的內容為“E:\CharSample\sys;”,注意路徑與要大家自己放的目錄一致。Symbol File是所謂的符號檔案,具體作用我還真一知半解,大概是驅動與原始碼之間的一個橋樑關係,否則,Soure File自然是用來斷點除錯的啦。(此處的路徑是指本機的,並非目標虛擬機器裡的)

(4)進行斷點

好了,當WinDBG與虛擬機器連線成功之後,估計虛擬機器就死在那裡不動了,在命令視窗的命令列中敲入“g”,按回車,命令視窗底下提示Debuggee is running...,目標系統正常運作了,你再在WinDBG的標題欄選Debug--Break,系統又掛了,這大概是進入了除錯模式,這兩個操作蠻有趣的,也最常用。

在Break後,在命令列敲入:.reload,載入核心的符號,提示如下:

鍵入:lm l,顯示系統的驅動符號檔案列表(大概這樣表述吧),如下圖所示,其中有一行顯示的是驅動CharSample的符號是本地,這已經是成功的一大半了。

鍵入:ld charsample,將CharSample驅動程序附加到WinDBG中,表示我們可針對其作我們自己想作的除錯,如下圖所示:

圖5

在File--Open Source File,開啟E:\CharSample\sys下的queue.c檔案,這是驅動的主要工作程式碼,數字的轉換就在這裡進行操作的。將游標移至原始碼的可斷點的某處,鍵入:bp,則該處紅色高亮顯示,表示在此處設定好斷點。

這時回到目標系統,點選“隨機轉換KMDF”,則目標系統宕機,WinDBG程式碼斷點處紫色高亮顯示,就是驅動程式執行到此處停止了,斷點成功,如下圖顯示。剩下怎麼看變數的狀態,要麼看下一篇,要麼自行尋找WinDBG的相關教程唄。