WDM驅動程式設計之編譯安裝篇 (轉)
WDM驅動程式設計之編譯安裝篇 (轉)[@more@](作者:蘇金國 2000年11月09日 13:26)
設計開發好自己的WDM後,為了執行該驅動程式,我們必須編譯和它們。
■編譯裝置驅動程式的方法
安裝DDK後,在DDK程式組下有Check和Free兩個編譯環境,Check環境用於編譯帶資訊的驅動程式,Free則是編譯正式釋出版本的環境。通常情況下裝置驅動程式的編譯採用命令列的方式。透過一定的設定可以在++的整合環境下編譯。
一般來說,成功編譯一個最基本的裝置驅動程式需要四個,第一個是驅動程式,即C語言源程式檔案(例如vdisk.c,注意下面所有的例子都是以vdisk來說明);第二個是RC檔案(例如vdisk.rc);第三個是s檔案;第四個檔案是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 " VDisk "
#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 NT DDK
#
!INCLUDE $(NTMAKEENV)makefile.def
# end of makefile
對所有驅動程式而言,makefile都是一樣的,也警告不要編輯這個檔案,如果需要,可以編輯修改sources檔案達到同樣的效果。對於裝置驅動程式,所使用的C基本上無一例外地選用VC++。
2.編譯的基本步驟
(1)首先進入check或free編譯環境,初始化DDK編譯環境。
(2)執行VC安裝目錄下bin目錄下的vcvars32.bat,初始化VC++編譯環境。
(3)執行Build.exe進行編譯。
■裝置驅動程式的安裝和啟動
1.新增登錄檔中的鍵值
在引導的時候,透過掃描登錄檔構造驅動程式列表。這個列表既包括自啟動的驅動程式,也包括需要手工啟動的驅動程式。這個列表其實就是控制皮膚中裝置Applet所列出來的所有裝置。所有的裝置驅動程式應該在登錄檔的HKEY_LOCAL_MACHINESystemCurrentControl-
SetServices下有相應的鍵值。下面以vdisk為例來說明如何新增鍵值:
首先在HKEY_LOCAL_MACHINE System Current ControlSetServices下新增一個子項vdisk,注意這裡的名稱應該和你的驅動程式名稱一致。例如驅動程式名稱是vdisk.sys,那麼這裡的子項名稱就是vdisk。然後在vdisk下新增以下鍵值:
名稱資料型別說明 Type REG_D 驅動程式的種類 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或者使用 來啟動。
(5)0x4 (SERVICE_DISABLED):表示本驅動程式被禁用。
注意在除錯驅動程式的時候,最好將Start值設定為3來手工啟動,這是因為如果設定為自動啟動,而驅動程式在啟動的過程中又發生了異常錯誤的話,可能導致系統不能啟動。
如果沒有緊急恢復盤,首先可以嘗試在啟動的時候選擇用已知的配置來啟動系統,看是否能啟動成功。如果失敗,可以用DOS啟動後到%System%System32Drivers目錄下將出現問題的驅動程式刪除,然後系統就可以啟動了。
不過如果NT安裝在NTFS分割槽,DOS啟動後將看不到這個分割槽,這樣就必須將掛到另一NT系統上來刪除這個檔案了。透過設定Start可以控制驅動程式在不同的時候啟動。但如果要解決依賴性問題,則需要使用Group和DependOnGroup值。
首先要確定自己的驅動程式使用的Group名,系統有一些定義好的組名,對於當前系統存在的組名,可以觀察登錄檔的HKEY_LOCAL_MACHINESystemCurrentControl-
SetControlServiceGroupOrderList的鍵值。例如該值可以設定為:
…
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)檔案的例子。
RegistryMachineSystemCurrentControl
SetServicesVDisk
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驅動程式的除錯工具只有WING和SOFTICE,WINDBG的使用需要雙機環境,強力推薦使用SOFTICE。注意目前國內上的SOFTICE 3.2 FOR NT的Setup.ins檔案是錯誤的,它將導致安裝程式不認識你的NT,可以用3.0的setup.ins檔案替代3.2的setup.ins,這樣就可以安裝成功。
設計開發好自己的WDM後,為了執行該驅動程式,我們必須編譯和它們。
■編譯裝置驅動程式的方法
安裝DDK後,在DDK程式組下有Check和Free兩個編譯環境,Check環境用於編譯帶資訊的驅動程式,Free則是編譯正式釋出版本的環境。通常情況下裝置驅動程式的編譯採用命令列的方式。透過一定的設定可以在++的整合環境下編譯。
一般來說,成功編譯一個最基本的裝置驅動程式需要四個,第一個是驅動程式,即C語言源程式檔案(例如vdisk.c,注意下面所有的例子都是以vdisk來說明);第二個是RC檔案(例如vdisk.rc);第三個是s檔案;第四個檔案是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 " VDisk "
#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 NT DDK
#
!INCLUDE $(NTMAKEENV)makefile.def
# end of makefile
對所有驅動程式而言,makefile都是一樣的,也警告不要編輯這個檔案,如果需要,可以編輯修改sources檔案達到同樣的效果。對於裝置驅動程式,所使用的C基本上無一例外地選用VC++。
2.編譯的基本步驟
(1)首先進入check或free編譯環境,初始化DDK編譯環境。
(2)執行VC安裝目錄下bin目錄下的vcvars32.bat,初始化VC++編譯環境。
(3)執行Build.exe進行編譯。
■裝置驅動程式的安裝和啟動
1.新增登錄檔中的鍵值
在引導的時候,透過掃描登錄檔構造驅動程式列表。這個列表既包括自啟動的驅動程式,也包括需要手工啟動的驅動程式。這個列表其實就是控制皮膚中裝置Applet所列出來的所有裝置。所有的裝置驅動程式應該在登錄檔的HKEY_LOCAL_MACHINESystemCurrentControl-
SetServices下有相應的鍵值。下面以vdisk為例來說明如何新增鍵值:
首先在HKEY_LOCAL_MACHINE System Current ControlSetServices下新增一個子項vdisk,注意這裡的名稱應該和你的驅動程式名稱一致。例如驅動程式名稱是vdisk.sys,那麼這裡的子項名稱就是vdisk。然後在vdisk下新增以下鍵值:
名稱資料型別說明 Type REG_D 驅動程式的種類 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或者使用 來啟動。
(5)0x4 (SERVICE_DISABLED):表示本驅動程式被禁用。
注意在除錯驅動程式的時候,最好將Start值設定為3來手工啟動,這是因為如果設定為自動啟動,而驅動程式在啟動的過程中又發生了異常錯誤的話,可能導致系統不能啟動。
如果沒有緊急恢復盤,首先可以嘗試在啟動的時候選擇用已知的配置來啟動系統,看是否能啟動成功。如果失敗,可以用DOS啟動後到%System%System32Drivers目錄下將出現問題的驅動程式刪除,然後系統就可以啟動了。
不過如果NT安裝在NTFS分割槽,DOS啟動後將看不到這個分割槽,這樣就必須將掛到另一NT系統上來刪除這個檔案了。透過設定Start可以控制驅動程式在不同的時候啟動。但如果要解決依賴性問題,則需要使用Group和DependOnGroup值。
首先要確定自己的驅動程式使用的Group名,系統有一些定義好的組名,對於當前系統存在的組名,可以觀察登錄檔的HKEY_LOCAL_MACHINESystemCurrentControl-
SetControlServiceGroupOrderList的鍵值。例如該值可以設定為:
…
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)檔案的例子。
RegistryMachineSystemCurrentControl
SetServicesVDisk
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驅動程式的除錯工具只有WING和SOFTICE,WINDBG的使用需要雙機環境,強力推薦使用SOFTICE。注意目前國內上的SOFTICE 3.2 FOR NT的Setup.ins檔案是錯誤的,它將導致安裝程式不認識你的NT,可以用3.0的setup.ins檔案替代3.2的setup.ins,這樣就可以安裝成功。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987280/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- WDM驅動程式設計之設計開發篇 (轉)程式設計
- C++程式安裝解除安裝WDM驅動C++
- linux網路卡驅動程式的編譯與安裝(轉)Linux編譯
- Linux裝置驅動程式設計之阻塞與非阻塞(轉)Linux程式設計
- FreeBSD手工編譯安裝程式(轉)編譯
- 驅動篇——核心程式設計基礎程式設計
- 用 Delphi 編寫 VxD 裝置驅動程式(轉) (轉)
- linux驅動程式設計(轉)Linux程式設計
- ffmpeg安裝之linux編譯安裝Linux編譯
- Delphi之快速設計(程式設計篇) (轉)程式設計
- 安裝 GCC 編譯器(轉)GC編譯
- 程式設計技巧之-表驅動法程式設計
- 活用WinXP安全模式解除安裝驅動程式(轉)模式
- 虛擬裝置驅動程式的設計與實現 (轉)
- 反編譯之安裝Apktool編譯APK
- STLPort的編譯和安裝 (轉)編譯
- 【轉】MySQL原始碼編譯安裝MySql原始碼編譯
- Windows95的裝置驅動程式的編寫 (轉)Windows
- Qt編譯MySQL驅動QT編譯MySql
- 領域驅動設計最佳實踐--程式碼篇
- 程式設計模式-表驅動程式設計程式設計設計模式
- 事件驅動程式設計事件程式設計
- 在Linux中,什麼是裝置驅動程式?如何安裝和解除安裝裝置驅動程式?Linux
- FreeBSD編譯安裝新核心(轉)編譯
- 在solrais下編譯安裝MySQL(轉)SolrAI編譯MySql
- WindowsXP安裝舊驅動三妙方(轉)Windows
- Linux裝置驅動程式 (轉)Linux
- 電腦驅動程式的安裝方法
- oracle & mysql 驅動程式安裝配置OracleMySql
- 編譯安裝zabbix編譯
- apache編譯安裝Apache編譯
- 編譯安裝nmon編譯
- swoole 編譯安裝編譯
- 編譯安裝Nginx編譯Nginx
- 編譯安裝mysql編譯MySql
- nginx編譯安裝Nginx編譯
- 安裝編譯ffmpeg編譯
- Griffin編譯安裝編譯