(作者:蘇金國 2000年11月09日 13:26)
設計開發好自己的WDM驅動程序後,爲了運行該驅動程序,我們必須編譯和安裝它們。
■編譯設備驅動程序的方法
安裝DDK後,在DDK程序組下有Check和Free兩個編譯環境,Check環境用於編譯帶調試信息的驅動程序,Free則是編譯正式發佈版本的環境。通常情況下設備驅動程序的編譯採用命令行的方式。通過一定的設置可以在VC ++的集成環境下編譯。
一般來說,成功編譯一個最基本的設備驅動程序需要四個文件,第一個是驅動程序,即C語言源程序文件(例如vdisk.c,注意下面所有的例子都是以vdisk來說明);第二個是RC文件(例如vdisk.rc);第三個是sources文件;第四個文件是makefile.rc文件。sources文件和make文件類似,用來指定需要編譯的文件以及需要連接的庫文件。這三個輔助文件都很簡單,在DDK samples的每個例程裏都有三個這樣的文件,依樣畫瓢就能理解它們的結構和意義。
1.舉例分析
以下以vdisk程序爲例,設vdisk.rc代碼爲:
/vdisk.rc/
#include
#include
#define VER_FILETYPE VFT_DRV
#define VER_FILESUBTYPE VFT2_DRV_SYSTEM
#define VER_FILEDESCRIPTION_STR "SCSI VDisk Driver"
#define VER_INTERNALNAME_STR "vdisk.sys"
#define VER_ORIGINALFILENAME_STR "vdisk.sys"
#include "common.ver"
/end of vdisk.rc/
設備驅動程序一般都使用Build實用程序來進行,Build只是NMAKE外面的一個外包裝程序。Build本身其實相當簡單,編譯的大部分工作實際上由Build傳遞給NMAKE來進行。
/SOURCES/
TARGETNAME=vdisk
TARGETTYPE=DRIVER
TARGETPATH=$(BASEDIR)/lib
TARGETLIBS=$(BASEDIR)/lib//$(DDKBUILDENV)/scsiport.lib
INCLUDES=../../inc
SOURCES=vdisk.c vdisk.rc
/end of SOURCES/
注意SOURCES的文件名沒有任何擴展名。
# makefile
#
# DO NOT EDIT THIS FILE!!! Edit ./sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#
!INCLUDE $(NTMAKEENV)/makefile.def
# end of makefile
對所有驅動程序而言,makefile都是一樣的,Microsoft也警告不要編輯這個文件,如果需要,可以編輯修改sources文件達到同樣的效果。對於設備驅動程序,所使用的C編譯器基本上無一例外地選用VC++。
2.編譯的基本步驟
(1)首先進入check或free編譯環境,初始化DDK編譯環境。
(2)運行VC安裝目錄下bin目錄下的vcvars32.bat,初始化VC++編譯環境。
(3)運行Build.exe進行編譯。
■設備驅動程序的安裝和啓動
1.添加註冊表中的鍵值
Windows NT在引導的時候,通過掃描註冊表構造驅動程序列表。這個列表既包括自啓動的驅動程序,也包括需要手工啓動的驅動程序。這個列表其實就是控制面板中設備Applet所列出來的所有設備。所有的設備驅動程序應該在註冊表的HKEY_LOCAL_MACHINE/System/CurrentControl-
Set/Services/下有相應的鍵值。下面以vdisk爲例來說明如何添加鍵值:
首先在HKEY_LOCAL_MACHINE/ System/ Current ControlSet/Services/下添加一個子項vdisk,注意這裏的名稱應該和你的驅動程序名稱一致。例如驅動程序名稱是vdisk.sys,那麼這裏的子項名稱就是vdisk。然後在vdisk下添加以下鍵值:
名稱 | 數據類型 | 說明 |
Type | REG_DWORD | 驅動程序的種類 |
Start | REG_DWORD | 驅動程序的起始啓動時間 |
ErrorControl | REG_DWORD | 驅動裝入失敗的錯誤處理 |
Group | REG_SZ | 驅動程序的組名 |
DependOnGroup | REG_MULTI_SZ | 所依賴的其他驅動程序 |
Tag | REG_BINARY | 同組內驅動程序裝入順序 |
Parameters | (key) | 驅動程序特定的參數鍵 |
Type值爲1表示內核模式驅動程序;爲2表示文件系統驅動程序。
ErrorControl值爲0表示日誌記錄錯誤並忽略;值爲1表示日誌記錄錯誤並顯示一個對話框;值爲2表示日誌記錄錯誤,並用最後的正確配置重新啓動;值爲3表示日誌記錄錯誤,如果已經使用過正確配置,返回失敗。
在任何一個設備驅動程序中,上表中的前三項參數都是必需的。
2.控制驅動程序的裝入次序
有時候控制多個驅動程序的裝入次序是必要的。例如一套驅動程序中包括三個驅動程序,分別是jbChanger.sys,changerDisk.sys和vdisk.sys。jbChanger和changerDisk是兩個SCSI類驅動程序,它們都依賴SCSI小端口(mini port驅動程序),同時changerDisk必須在jbChanger啓動之後啓動。vdisk是虛擬的磁盤驅動程序,它必須在jbChanger和changerDisk都啓動之後才能啓動成功。
3.驅動程序的Start值
上面註冊表中驅動程序的Start值控制驅動程序在系統啓動的時間。目前,Start可以取以下值,此外爲該值留有擴展餘地,以適用於新的要求:
(l)0x0 (SERVICE_BOOT_START):這個值指定本驅動程序應該由操作系統裝入程序啓動。一般的驅動程序不會採用本值,因爲系統在這個時候幾乎還沒有啓動,大部分系統尚不可用。
(2)0x1 (SERVICE_SYSTEM_START):該值表示在操作系統裝入後但同時初始化它自己時啓動驅動程序。
(3)0x2 (SERVICE_AUTO_START):該值表示在整個系統啓動並運行後由服務控制管理器裝入。
(4)0x3 (SERVICE_DEMAND_START):該值表示該驅動程序必須手工啓動。可以通過控制面板的設備applet或者使用WIN32 API編程來啓動。
(5)0x4 (SERVICE_DISABLED):表示本驅動程序被禁用。
注意在調試驅動程序的時候,最好將Start值設置爲3來手工啓動,這是因爲如果設置爲自動啓動,而驅動程序在啓動的過程中又發生了異常錯誤的話,可能導致系統不能啓動。
如果沒有緊急恢復盤,首先可以嘗試在啓動的時候選擇用已知的配置來啓動系統,看是否能啓動成功。如果失敗,可以用DOS啓動後到/%SystemRoot%/System32/Drivers目錄下將出現問題的驅動程序刪除,然後系統就可以啓動了。
不過如果NT安裝在NTFS分區,DOS啓動後將看不到這個分區,這樣就必須將硬盤掛到另一NT系統上來刪除這個文件了。通過設置Start可以控制驅動程序在不同的時候啓動。但如果要解決依賴性問題,則需要使用Group和DependOnGroup值。
首先要確定自己的驅動程序使用的Group名,系統有一些定義好的組名,對於當前系統存在的組名,可以觀察註冊表的/HKEY_LOCAL_MACHINE/System/CurrentControl-
Set/Control/ServiceGroupOrder/List的鍵值。例如該值可以設置爲:
…
SCSI miniport
port
Primary disk
SCSI class
SCSI CDROM class
filter
boot file system
…
這裏每一行都是一個Group名,一般來說某個驅動程序都屬於某一個Group。系統啓動時按照該List下組的順序依次啓動各組裏的驅動程序。例如jbChanger和changerDisk都屬於SCSI Class組。如果你覺得該表中的組名都不合適,可以在該List的適當位置中添加新的組名。
DependOnGroup值控制本驅動程序啓動的時候必須先啓動另一組的驅動程序,例如jbChanger和changerDisk的啓動就依賴於SCSI miniport組。因此jbChanger和changerDisk的DependOnGroup值都爲SCSI miniport。
4.修改註冊表的方法
在註冊表裏這些值可以手工修改,也可以自己編程利用WIN32 API進行添加,同時也可以用ini文件的方式來添加。下面是一個ini(文件名爲vdisk.ini)文件的例子。
/Registry/Machine/System/CurrentControl
Set/Services/VDisk
Type=REG_DWORD 0x00000001
Start=REG_DWORD 0x00000003
ErrorControl=REG_DWORD 0x00000001
Group=SCSI Class
Parameters
DriveLetter=N:
然後以vdisk.ini爲參數運行REGINI.EXE。就會自動在註冊表裏添加相應的項。
在註冊表裏添加好這些項後,必須重新啓動系統,這樣所添加的設備驅動程序才能在控制面板的設備applet中列出來,再進行其他操作。
5.啓動設備驅動程序
在添加修改好註冊表後,重新啓動系統,如果選擇的Start值是0、1、2,如果一切正常,驅動程序就應該已經啓動起來了。可以觀察控制面板的設備applet中的設備列表。如果Start選擇的是3,則可以直接啓動。
6.調試工具
目前NT驅動程序的調試工具只有WINDBG和SOFTICE,WINDBG的使用需要雙機環境,強力推薦使用SOFTICE。注意目前國內FTP服務器上的SOFTICE 3.2 FOR NT的Setup.ins文件是錯誤的,它將導致安裝程序不認識你的NT,可以用3.0的setup.ins文件替代3.2的setup.ins,這樣就可以安裝成功。