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   系統設置
1.1 DDK安裝    
  編寫WDM設備驅動程序之前需要安裝Microsoft的驅動程序開發工具包DDK。
安裝DDK後,在DDK程序組下有Check和Free兩個編譯環境,Check環境用於編譯帶調試信息的驅動程序,Free則是編譯正式發佈版本的環境。
1.2 環境變量設置
    DDK安裝成功後,需要爲其設置環境變量。
    首先,設置一個叫做DDKROOT的環境變量,它指向Windows2000 DDK或Windows98 DDK的基目錄。
    然後,設置一個叫做WDMDIR的環境變量,它指向驅動程序的基目錄。
    在Windows98平臺下,把這些環境變量添加到AUTOEXEC.BAT文件中;在Windows2000平臺下,在控制面板“系統”程序的“高級”標籤中的“環境變量”中設置環境變量。
2   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項目批處理文件
    ----------------------------------------
3.  驅動程序的構造
    DDK Build命令行實用程序是構造驅動程序的主要工具,使用正確的編譯器和連接器設置,通過調用nmake實用程序來構造驅動程序。Build把構造進展的詳細信息和錯誤結果顯示到標準輸出。Build本身其實相當簡單,編譯的大部分工作實際上由Build傳遞給nmake來進行。
    由於Build使用的編譯和連接工具與Visual Studio相同,可以從Visual Studio中激活Build,因此可以設置VC++,從Visual Studio直接構造WDM驅動程序。這將使驅動程序的編輯與構造在相同的環境中進行,從而使其開發更加方便。
    採用的方法是使用一個Makefile項目,它激活Build命令行實用程序構造驅動程序。所有必要的構造文件必須正確設置,包括SOURCES文件、MakeDrvier.bat、makefile文件。
3.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宏指定要編譯的文件列表。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章