作者:程式員客棧
送出者:eastvc 釋出日期:2003-10-19 20:01:54
原文出處: http://www.driverdevelop.com/
經常有人問及如何安裝DDK,如何編譯第一個裝置驅動程式以及如何消除掉編譯驅動程式
時出現的大量錯誤資訊. 其實, DDK的安裝和驅動程式的編譯是很簡單的. 為了編譯驅動程
序, 你必須首先打開一個DOS視窗, 并正确設定好所需的全部環境變量. 本文假定你将要
安裝NT DDK 4.0, 并且在安裝NT DDK之前,VC已經被安裝在 C:/vcdev/vc/bin/目錄下(盡量使
用短的VC路徑名稱,不要用長的路徑命名格式).
可按如下方法安裝NT DDK( 其實就是進行一些環境變量的設定), NT DDK的安裝并不需要
SDK--如果你已經安裝好了VC的話.
1. 從微軟或其他站點下載下傳NT
DDK(http://download.microsoft.com/download/winntwks40/Install/1998/NT4/EN-US/nt4ddk.zip),
将其安裝在硬碟上(本文假定DDK安裝目錄為c:/ddk).
2. 用任何文本編輯器打開c:/ddk/bin/目錄下的setenv.bat檔案, 在此檔案的第三行(不含空白
行)之後加入如下一行并儲存: call C:/vcdev/vc/bin/vcvars32.bat, 具體示例:
@echo off
if "%1"=="" goto usage
rem This will put the SDK headers & libs first in the search path.
call C:/vcdev/vc/bin/vcvars32.bat
if "%BASEDIR%"=="" goto setbasedir
if NOT "%BASEDIR%"=="%1" goto setbasedir
...
3. 完成步驟1和2之後, 你就可以開始編譯第一個裝置驅動程式了(本文假定驅動程式選為
checked類型): 順次進入Programs->Windows NT DDK(Common)->Checked Build
Enviroment, 出現一個 DOS視窗. 使用cd指令進入c:/ddk/src/general/simple/sys目錄, 鍵入
build -c指令即可編譯, 然後編譯器提示已經成功編譯好 ldunld.sys檔案并已将此檔案拷到
c:/ddk/lib/i386/checked目錄中. 運作build指令隻編譯需要重新編譯的檔案, 而build -c指令則
強迫編譯器重新編譯所有的檔案.
4.使用cd指令進入c:/ddk/src/general/simple/exe目錄, 在DOS提示符下鍵入NMAKE -f
GETHNDL.MAK 即可在目前目錄下生成Win32 控制台程式gethndl.exe,此程式用于調用并測
試在第3步中所生成的ldunld.sys裝置驅動程式.
5. 從OSR下載下傳OSR driver load(V2.2), 位址如下: http://www.osr.com/files/osrloaderv22.zip, 然
後進行解壓縮, 并将osrloader.exe檔案拷貝到c:/ddk/bin 目錄中. 運作osrloader, 在 driver
path中敲入C:/DDK/lib/i386/checked/ldunld.sys (或用Browse選取), 點選Register Service按鈕,
然後點選Start service按鈕, 如能順利完成這些步驟, 就意味着 ldunld.sys已經被成功注冊及
加載了.
6. 從OSR下載下傳OSR debug monitor, 位址如下: http://www.osr.com/files/dbgmon_v3.zip, 然後進
行解壓縮, 并将dbggui.exe檔案拷貝到c:/ddk/bin 目錄中. 運作dbggui, 選中local mode選項.
7. 切換到DOS 視窗, 轉入到 c:/ddk/src/general/simple/exe目錄, 運作gethndl, 顯示:
Wow - it really worked!!!. 祝賀你,你已經成功地編譯并運作第一個裝置驅動程式了. 此時在
dbggui中也會出現一些KdPrint()提示資訊!
8. 在osrloader中先點選Stop service, 然後再點選Unregister service即可解除安裝ldunld.sys.
一些注意事項;
1. 如編譯DDK中的示範程式時編譯器提示缺少哪個檔案, 可用Windows或VC的搜尋工具先
找到這個檔案, 然後将此檔案拷入示範程式所在目錄再行編譯. 也可對示範程式目錄中的
Sources檔案進行修改以便使所缺失的路徑被包括進來.
2 . 用build指令時出現的一些錯誤或警告資訊, 有時可用build -c指令消除掉.
3. 如遇到last line incomplete錯誤,可下載下傳一個叫lastline.exe的工具來解決
(http://grwy.online.ha.cn/dzhang/lastline.exe).
4. 為了使build能正确運作, 在需被編譯的源檔案目錄下面必須有兩個檔案: SOURCES和
DIRS, 注意這兩個檔案沒有字尾名.
SOURCES的檔案格式:
TARGETNAME=drivername , 本參數用于指定生成的裝置驅動程式名稱(不需字尾名),所産
生的檔案為drivername.sys.
TARGETPATH=./lib, 本參數用于指定生成的裝置驅動程式所存放的路徑. 一般采用./lib.
TARGETTYPE=DRIVER, build能夠生成許多不同的目标對象,裝置驅動程式一般選用
DRIVER.
INCLUDES=path1;path2;..., 本參數是可選的, 用于指定其他的#include檔案的搜尋路徑.
TARGETLIBS=lib1;lib2;..., 本參數是可選的, 用于指定其他的lib庫檔案的搜尋路徑.
SOURCES=file1.c file2.c ..., 本參數用于指定需被編譯的全部源檔案名稱, 字尾名不能省
略,檔案名之間用空格分開.
DIRS檔案格式:
DIRS檔案用于指定在目前目錄下必須建立的子目錄。DIRS檔案的内容由一系列用空格分
開的目錄名組成, /可用于表示對上一行的繼續.
DIRS = /
subdir1 /
subdir2 /
subdir3
目前目錄下如果隻有DIRS檔案而沒有SOURCES, 則表示沒有任何源檔案需要編譯,但需在
目前目錄下建立子目錄, 隻有SOURCES檔案而沒有DIRS則表示有源檔案需要編譯但不需
建立子目錄. 二者都有則表示有源檔案需要編譯且需建立子目錄.
5. BUILD在編譯時将會在TARGETPATH和目前目錄下建立子目錄或檔案. 對于一般的
Intel平台, 以c:/ddk/src/general/simple/sys為例說明, 編譯完後Build在sys目錄下建立子目錄
obj/i386/用于存放ldunld.obj. 在c:/ddk/lib/i386/checked儲存編譯好的ldunld.sys檔案.
6. 如果你将裝置驅動程式的類型從checked轉到free, 則第一次編譯源檔案的free類型驅動
程式時你必須使用build 的-c選項來編譯.
7. 可以使用regedit或regedit32來在系統資料庫中加入驅動程式的表項, ldunld.ini的内容:
/registry/machine/system/currentcontrolset/services/Ldunld
Type = REG_DWORD 0x00000001
Start = REG_DWORD 0x00000003
Group = Extended base
ErrorControl = REG_DWORD 0x00000001
運作regini ldunld.ini即可加入相應的系統資料庫項.
7. 在ddk的src目錄下有許多示範程式可供參考.
8. 經過一些繁瑣的設定,也可以在VC中直接編譯驅動程式
(http://grwy.online.ha.cn/dzhang/insider17.pdf和
http://www.computerworld.com.cn/99/tips/9904/040601_03.asp).