VC 中構建WDM開發環境

2021-04-25 05:43:37 字數 4087 閱讀 1204

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

%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

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驅動程式,從而提高驅動程式的開發效率,簡化驅動程式的構造過程。

開發環境構建

無線路由器目前已經可以做很多的功能了,相應的擴充套件資源也越來越多。其中大部分都是直接基於openwrt平台直接進行開發的。筆者之前一直介紹的都是一些協議的理論知識,目前也更新一些筆者關於sdwn software defined wireless networking 的實現中,所總結的一些實戰類...

WDM驅動程式開發之環境配置篇

乙個星期前郭老師給我布置了一項任務 開發我們自己設計的一塊板子的pci裝置驅動,並給我指出了方向,具體說就是 三步走 戰略 1 入門。熟悉基於driverstudio開發環境的裝置驅動開發,同時側面了解pci裝置驅動程式的相關知識。2 高階。運用純ddk進行驅動開發,著重於學習別人的例項,並能熟練進...

VC的DDK編譯環境構建

2 在debug中建立check版的驅動 注 wxp 為windows xp 3 在release中建立free版驅動 4 匯入檔案 5 編譯工程 6 生成結果 生成objchk i386中的usbview.exe 說白了原理與在dos編譯一樣 如下為dos編譯方法 setenv即為setenv.b...