天天看點

NT DDK的安裝以及裝置驅動程式的編譯

作者:程式員客棧

送出者: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).