介紹
詳細介紹了在visual studio平台下,通過建立makefile專案,啟用ddk build命令列程式構造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巨集指定要編譯的檔案列表。
原作者姓名 曲揚
介紹詳細介紹了在visual studio平台下,通過建立makefile專案,啟用ddk build命令列程式構造wdm裝置驅動程式的方法。
正文3.2 makefile檔案
makefile檔案啟用ddk inc目錄中的標準構造檔案makefile.def。wdmtest專案的makefile檔案如下:
!include $(ntmakeenv)/makefile.def
3.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
%2cd %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
3.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兩個環境變數 。
----------------------------------------
3.5 驅動程式的構造與編譯
驅動程式編輯完成後,在visual c++中直接執行「編譯」選單中的「構造 wdmtest」即可進行編譯構造驅動程式。
若有錯誤,則雙擊錯誤提示項即可迅速回到源**中修改。若無錯誤,則產生驅動程式wdm test.sys存放在自由或檢查構造目錄中。
4 結束語
綜上所述,介紹了在visual studio中,通過建立makefile專案,啟用「ddk build」命令列實用程式構造wdm驅動程式的方法。這種方法使我們可以通過改變vc++的設定,從visual studio直接構造wdm驅動程式,從而提高驅動程式的開發效率,簡化驅動程式的構造過程。
Visual Studio 技巧(備忘)
快捷鍵 1.ctrl 向下箭頭 游標不動,螢幕顯示內容向下滾 2.f8 將游標移動到下一項,如 任務列表 視窗中的任務或 查詢結果 視窗中的搜尋匹配項。每按一次 f8 鍵,就移動到列表中的下乙個項。alt f8 格式化源 alt f7 開啟project properties對話方塊 ctrl 游標...
visual studio除錯技巧
講的是windows除錯技巧,學習了。自認為學的不錯了,還有這些技巧呢 巧用vc監視進行 除錯的三個技巧 author zhangguanshi 1 如果要檢視系統函式的最後錯誤,可以在監視中輸入 err,然後使用vc的工具error lookup,輸入監視中的右邊的數字,就能查出最後出的是什麼錯了...
Visual Studio 路徑巨集
說明 remotemachine 設定為 除錯 屬性頁上 遠端計算機 屬性的值。有關更多資訊,請參見更改用於 c c 除錯配置的專案設定。references 以分號分隔的引用列表被新增到專案中。configurationname 當前專案配置的名稱 例如 debug platformname 當前...