|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2006-01-27, 08:44 PM | #1 (permalink) |
榮譽會員
|
Visual Studio構造WDM設備驅動程式
Visual Studio構造WDM設備驅動程式
WDM(Win32 Driver Model),即Win32驅動程式模型,是Microsoft力推的全新驅動程式模式,旨在通過提供一種靈活的方式來簡化驅動程式的開發,在實現對新硬體支持的基礎上減少並降低所必須開發的驅動程式的數量和複雜性。 目前,用於WDM驅動程式開發的主要工具是Microsoft公司提供的DDK(Driver Development Kit),其中包含許多內核態函數及資料結構的定義;包含很多非常有用的偵錯、測試及構造工具,還提供了許多驅動程式實例和豐富的說明 我的文件。此外,開發人員通常都會在Visual Studio整合開發環境中新增、編輯設備驅動程式項目。 在Visual Studio中新增了程序的工程之後、必須經過編譯、連接才能構成程序可執行文件。但由於Visual Studio不能用於內核程序的構造,所以常常需要結束編輯環境,使用DDK中提供的專用工具Build來構造設備驅動程式。 為了提高驅動程式的開發效率,簡化驅動程式的構造程序,我們可以通過改變設定,從Visual Studio直接構造WDM驅動程式。 本文將以一個簡單的Windows設備驅動程式WdmTest為例,介紹其新增和構造程序。 系統設定 1、DDK安裝 編寫WDM設備驅動程式之前需要安裝Microsoft的驅動程式開發工具包DDK。 安裝DDK後,在DDK程序組下有Check和Free兩個編譯環境,Check環境用於編譯帶偵錯訊息的驅動程式,Free則是編譯正式發怖版本的環境。 2、環境變數設定 DDK安裝成功後,需要為其設定環境變數。 首先,設定一個叫做DDKROOT的環境變數,它指向Windows2000 DDK或Windows98 DDK的基目錄。 然後,設定一個叫做WDMDIR的環境變數,它指向驅動程式的基目錄。 在Windows98平台下,把這些環境變數增加到AUTOEXEC.BAT文件中;在Windows2000平台下,在控制台「系統」程序的「進階」標籤中的「環境變數」中設定環境變數。 WDM驅動程式組成 一個最基本的設備驅動程式應該包含2部分:驅動程式源文件和驅動程式構造文件。 表1列出了WdmTest使用的所有源文件,表2列出了WdmTest使用的所有構造件。 ----表1 WdmTest源文件---- Init.cpp 進入和卸載程式碼 Dispatch.cpp 主要的IRP分發例程 Pnp.cpp 即插即用和程式碼 Power.cpp 電源管理程式碼 WdmTest.rc 版本資源 WdmTest.h 驅動程式頭文件 GUIDs.h GUID定義 Ioctl.h IOCTL定義 resource.h 資源編輯器頭文件 ---------------------------------------- -----WdmTest構造文件----- SOURCES build指定 makefile 標準makefile MakeDrvier Makefile項目批次處理文件 ---------------------------------------- 驅動程式的構造 DDK Build指令行實用程序是構造驅動程式的主要工具,使用正確的編譯器和連接器設定,通過使用nmake實用程序來構造驅動程式。Build把構造進展的詳細資料和錯誤結果顯示到標準輸出。Build本身其實相當簡單,編譯的大部分工作實際上由Build傳送給nmake來進行。 由於Build使用的編譯和連接工具與Visual Studio相同,可以從Visual Studio中啟動Build,因此可以設定VC++,從Visual Studio直接構造WDM驅動程式。這將使驅動程式的編輯與構造在相同的環境中進行,從而使其開發更加方便。 採用的方法是使用一個Makefile項目,它啟動Build指令行實用程序構造驅動程式。所有必要的構造文件必須正確設定,包括SOURCES文件、MakeDrvier.bat、makefile文件。 1、SOURCES文件 Build在當前目錄中尋找一個叫做SOURCES的nmake巨集文件,瞭解驅動程式構造的詳細資料。WdmTest項目的SOURCES文件如下: TARGETNAME=WdmTest TARGETTYPE=DRIVER DRIVERTYPE=WDM TARGETPATH=SYS INCLUDES=$(BASEDIR)\inc; SOURCES= Init.cpp \ Dispatch.cpp \ Pnp.cpp \ Power.cpp \ WdmTest.rc TARGETNAME表示程序的目標名為WdmTest.sys;TARGETTYPE和DRIVERTYPE表示程序是一個WDM驅動程式,TARGETPATH表示程序在SYS子目錄中構造;INCLUDES表示DDK inc目錄被增加到頭文件的搜尋列表中;SOURCES巨集指定要編譯的文件列表。 2、makefile文件 makefile文件啟動DDK inc目錄中的標準構造文件makefile.def。WdmTest項目的makefile文件如下: !INCLUDE $(NTMAKEENV)\makefile.def 3、MakeDrvier.bat文件 MakeDrvier.bat是一個批次處理文件,它將使用DDK的setenv指令。setenv.bat文件存在於DDK的bin目錄中,用於設定構造程序中的環境變數,同時使用bin目錄中的其他批次處理文件。 MakeDrvier.bat至少要傳送4個參數:DDK基目錄(%1)、源驅動器(%2)、源目錄(%3)和構造檔案類型(%4)(「free」或「checked」),任何其他的參數(%5……)直接傳送給Build。 MakeDrvier.bat首先檢查setenv.bat是否存在,然後使用etenv指令為build目標正確設定環境變數,改變目錄為源驅動器和源目錄,並最後使用build。 MakeDrvier指令文件的螢幕輸出出現在Visual Studio Output視窗中。 WdmTest項目的MakeDrvier.bat文件如下: @echo off if not exist %1\bin\setenv.bat goto warning call %1\bin\setenv %1 %4 %2 cd %3 build -b -w %5 %6 %7 %8 %9 echo OK MakeDriver goto exit :warning %1 echo Warning %1\bin\setenv.bat not exist goto exit :exit 4、Makefile構造環境 當新增新的Makefile項目時,Visual Studio預設提供2個build組態:「Win32 Debug」和「Win32 Release」。為了和DDK組態對應,一般習慣通過「編譯-組態」表單移除這兩個組態,並增加2個新的組態:「Win32 Checked」和「Win32 Free」。 對於「Win32 Free」組態,按表3所顯示設定項目的設定;對於Win32 Checked」組態,在新增指令行中將「free」改為「checked」。 -----表3 Win32 Free組態設定----- 新增指令行 MakeDriver %DDKROOT% C: %WDMDIR%\WdmTest\sys free 重建全部選項 -nmake /a 輸出檔案名 WdmTest.sys 新增指令行執行MakeDrvier批次處理文件,使用DDKROOT和WDMDIR兩個環境變數 。 ---------------------------------------- 5、驅動程式的構造與編譯 驅動程式編輯完成後,在Visual C++中直接執行「編譯」表單中的「構造 WdmTest」即可進行編譯構造驅動程式。 若有錯誤,則雙按錯誤提示項即可迅速回到來源碼中修改。若無錯誤,則產生驅動程式Wdm Test.sys存放在自由或檢查構造目錄中。 結束語 綜上所述,介紹了在Visual Studio中,通過建立Makefile項目,啟動「DDK Build」指令行實用程序構造WDM驅動程式的方法。這種方法使我們可以通過改變VC++的設定,從Visual Studio直接構造WDM驅動程式,從而提高驅動程式的開發效率,簡化驅動程式的構造程序。 |
__________________ |
|
送花文章: 3,
|
向 psac 送花的會員:
|
longlie (2007-10-21)
感謝您發表一篇好文章 |