1.【前言】
最近有很多人問我怎么樣在VC下編譯驅(qū)動程序,我嫌一個人一個人的解釋起來太麻煩,所以把有關(guān)的知識整理成一篇文章。
需要特別說明的是,這不是一篇教你怎樣寫驅(qū)動的文章,要學(xué)習(xí)驅(qū)動開發(fā),你應(yīng)該去看ArtBaker的書。
2.【索引】
1.前言
2.索引
3.編寫批處理文件build.bat
4.創(chuàng)建makefile工程
5.測試
6.常見問題
3.【編寫批處理文件build.bat】
VC開發(fā)環(huán)境下并沒有驅(qū)動程序的編譯器。編譯驅(qū)動程序的“正規(guī)”方法是使用DDK開發(fā)包中的編譯工具(它們都是基于命令行方式的)。但是VC中有一種makefile的工程,這種工程在build的時候直接根據(jù)命令行命令來編譯和創(chuàng)建程序,而且命令行的輸出信息會顯示在VC的信息框里。利用這個特性,只需要把編譯驅(qū)動程序的一系列命令做成一個批處理文件,然后讓makefile工程執(zhí)行這個批處理文件就行了。
下面我們來看看怎樣寫這個批處理文件:
#----------從這里開始copy----------------------------------------------
if"%1"==""gotoInvalidParameter
ifnotexist%1\bin\setenv.batgotoSetenvNotFound
call%1\bin\setenv.bat%1%2
%3
cd%4
build.exe-c
gotoexit
:InvalidParameter
echoInvalidParameter.
gotoexit
:SetenvNotFound
echoCan'tfoundSetenv.bat.
gotoexit
:exit
#---------到這里copy截止--------------------------------------------
把上面的內(nèi)容copy下來,paste到一個新建文件中并保存為build.bat(當(dāng)然,你也可以使用任何你喜歡的名字)。
我想并不是每個人都用過批處理文件,所以在這里我對這個批處理文件羅嗦兩句。這個批處理文件帶有4個參數(shù)%1,%2,%3和%4。%1代表DDK的安裝路徑。通常DDK在安裝后就會自動創(chuàng)建一個%DDKROOT%環(huán)境變量,這個變量就代表了DDK的安裝路徑。%2表示編譯模式,調(diào)試模式為checked,發(fā)行模式為free。%3是源代碼文件所在的驅(qū)動器名,例如C:,%4是源代碼文件所在的完整路徑,例如C:\MyDriver。
這個批處理文件首先檢查參數(shù)%1是否為空,若不為空則檢查%1\bin\setenv.bat文件是否存在,如果存在則執(zhí)行setenv.bat來設(shè)置環(huán)境和編譯模式。最后切換到源代碼所在的目錄并執(zhí)行build.exe來編譯和創(chuàng)建程序。
希望上面的解釋能讓你滿意。如果我把你給說暈了,或者如果你壓根不想了解這些批處理的細(xì)節(jié),沒關(guān)系,請繼續(xù)往下看。
4.【創(chuàng)建makefile工程】
不要覺得我膚淺!這一節(jié)主要是為那些沒有在VC上編寫過makefile工程的人寫的。
(1)運行VC,新建一個makefile工程
(2)在Debug的CommandLine欄輸入build.bat%DDKROOT%Checkede:e:\MyDriver,
注意,你需要根據(jù)工程保存的位置來修改后面兩個參數(shù)。
(3)在Release的CommandLine欄輸入build.bat%DDKROOT%freee:e:\MyDriver。
(4)完成工程創(chuàng)建,并把我們在上面創(chuàng)建的那個build.bat文件放到工程目錄下。
5.【測試】
現(xiàn)在可以測試上面的設(shè)置是否成功了,下面是我寫的一個驅(qū)動版的“helloworld”程序:
//---------------------------------------------
//Function:DriverEntry
//
//Description:
//一個驅(qū)動版的helloworld,它做不了什么實際的事情
//
//Arguments:
//pDriverObject-PassedfromI/OManager
//pRegistryPath-UNICODE_STRINGpointerto
//registryinfo(servicekey)
//forthisdriver
//
//Returnvalue:
//NTSTATUSalways
//----------------------------------------------
#include
NTSTATUS
DriverEntry(
INPDRIVER_OBJECTpDriverObject,
INPUNICODE_STRINGpRegistryPath
)
{
KdPrint((“Helloworld!”));
returnSTATUS_SUCCESS;
}
把上面的內(nèi)容copy下來,paste到MyDriver.c,然后添加到剛才新建的工程中。
下面還需要source和makefile兩個配置文件。這兩個文件名是固定的。對于makefile,它是為DDK準(zhǔn)備的,把下面的內(nèi)容copy到一個新建文件中,然后保存為makefile。記?。翰灰淖兝锩娴膬?nèi)容!
#DONOTEDITTHISFILE!!!Edit.\sources.ifyouwanttoaddanew
#sourcefiletothiscomponent.Thisfilemerelyindirectstothe
#realmakefilethatissharedbyallthedrivercomponentsofthe
#WindowsNTDDK
!INCLUDE$(NTMAKEENV)\makefile.def
接下來是source文件
TARGETNAME=MyDriver
TARGETPATH=obj
TARGETTYPE=DRIVER
INCLUDES=.
SOURCES=MyDriver.c
其中SOURCES項指出源代碼文件名,如果有多個文件,用逗號將它們隔開。
把source和makefile拷貝到工程目錄下。
萬事具備了!按下F7構(gòu)建工程,在\objchk\i386目錄下會生成MyDriver.sys
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。