WDM驅(qū)動程序設(shè)計_第1頁
WDM驅(qū)動程序設(shè)計_第2頁
WDM驅(qū)動程序設(shè)計_第3頁
WDM驅(qū)動程序設(shè)計_第4頁
WDM驅(qū)動程序設(shè)計_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、現(xiàn)在 windows98 和 windows2000 已經(jīng)成了主流操作系統(tǒng)的主流,原先用來實現(xiàn)驅(qū)動程序的 vxd 技術(shù)隨著win95 的淡出也慢慢地將退出歷史舞臺,在 windows98 和 windows2000中設(shè)備驅(qū)動程序?qū)⒏鶕?jù)windows 驅(qū)動程序模型(wdm )來設(shè)計。 wdm 通過提供一種靈活的方式來簡化驅(qū)動程序的開發(fā),在實現(xiàn)對新硬件支持的基礎(chǔ)上減少并降低所必須開發(fā)的驅(qū)動程序的數(shù)量和復(fù)雜性。wdm 驅(qū)動程序設(shè)計一wdm 簡介微軟不斷推出新的操作系統(tǒng), 現(xiàn)在 windows98和 windows2000 已經(jīng)成了主流,原先用來實現(xiàn)驅(qū)動程序的vxd技術(shù)隨著 win95的淡出也慢慢地將

2、退出歷史舞臺,在 windows98和 windows2000中設(shè)備驅(qū)動程序?qū)⒏鶕?jù)windows驅(qū)動程序模型(wdm)來設(shè)計。 wdm 通過提供一種靈活的方式來簡化驅(qū)動程序的開發(fā),在實現(xiàn)對新硬件支持的基礎(chǔ)上減少并降低所必須開發(fā)的驅(qū)動程序的數(shù)量和復(fù)雜性。windows驅(qū)動程序模型分兩個方面, 除了核心模型描述設(shè)備驅(qū)動程序的標(biāo)準(zhǔn)結(jié)構(gòu)外,wdm 還為常見類型的設(shè)備實現(xiàn)了一個模塊化的、分層次類型的總線驅(qū)動程序和類驅(qū)動程序??偩€驅(qū)動程序?qū)崿F(xiàn)了支持通用串行總線(usb )、ieee1394(firewire )協(xié)議等。類驅(qū)動程序是為實現(xiàn)標(biāo)準(zhǔn)windows功能提供條件。 wdm 對標(biāo)準(zhǔn)類接口的支持減少了wi

3、ndows 95 和 windows nt所需的設(shè)備驅(qū)動程序的數(shù)量和復(fù)雜性。在 windows平臺上, wdm 將成為 21 世紀主流的驅(qū)動模式。wdm 支持 usb 、ieee 1394、acpi等全新的硬件標(biāo)準(zhǔn)。而且以往在兩個平臺上同時運行時需要編寫兩個截然不同的驅(qū)動程序,現(xiàn)在只需要編寫一個wdm 驅(qū)動程序就可以了。 wdm 驅(qū)動程序也是分層的,即不同層上的驅(qū)動程序有著不同的優(yōu)先級,而 windows 9x 下的 vxd則沒有此結(jié)構(gòu)。wdm 還引入了功能設(shè)備對象fdo (functional device object)與物理設(shè)備對象 pdo (physical device object

4、)兩個新類來描述硬件,一個pdo 對應(yīng)一個真實硬件。一個硬件只允許有一個pdo ,卻可以擁有多個fdo ,在驅(qū)動程序中直接操作的不是硬件而是相應(yīng)的pdo 與 fdo 。在用戶態(tài)和內(nèi)核態(tài)通訊方面,系統(tǒng)為每一個用戶請求打包形成一個irp 結(jié)構(gòu),將其發(fā)送至驅(qū)動程序,并通過識別irp中的 pdo 來區(qū)別是發(fā)送給哪一個設(shè)備的。另外,在驅(qū)動程序的加載方面,wdm 不通過驅(qū)動程序名稱識別,而是通過一個128 位的全局唯一標(biāo)識符guid來實現(xiàn)驅(qū)動程序的識別。我們用上圖來說明設(shè)備驅(qū)動程序的分層及調(diào)用。寫 wdm 和其它模式驅(qū)動程序基本上是相同的,代碼中的主要區(qū)別在于如何創(chuàng)建設(shè)備。在 wdm 驅(qū)動程序中, 即插即

5、用(pnp )管理器告知何時向系統(tǒng)添加一個設(shè)備,或者從系統(tǒng)刪除設(shè)備。 pnp管理器使用安裝的 inf 文件查找新設(shè)備的正確驅(qū)動程序;而其它模式驅(qū)動程序必須發(fā)現(xiàn)它自己的設(shè)備,使用專門的安裝程序安裝。另外在細節(jié)上也存在很多區(qū)別,其它模式驅(qū)動程序參數(shù)一般由注冊表提供,在driverentry里調(diào)用讀注冊表的函數(shù), 然后根據(jù)注冊表再調(diào)用createdevice ,但是 wdm 一般不是這樣,這是由于windows 2000下支持 pnp ,在加載的時候pnp管理器調(diào)用 adddevice 入口點創(chuàng)建設(shè)備。一般在 driverentry里創(chuàng)建的是一個與設(shè)備或者對象毫無關(guān)系的虛擬設(shè)備,用于管理與 win3

6、2的通訊。如果不想對該設(shè)備做什么特別的處理,或者設(shè)備不復(fù)雜,adddevice 可以簡單返回 nt_success,不用調(diào)用 createdevice 。另外整個設(shè)備驅(qū)動樹也發(fā)生了改變, 從而使安裝程序發(fā)生了很大的改變。 wdm本身的 pnp管理器被抽象地提升到了root 的地位。 pnp 管理器負責(zé)所有的總線驅(qū)動程序的加載。 總線驅(qū)動程序則負責(zé)遍歷所有位于總線上的設(shè)備,并且為每個設(shè)備創(chuàng)建相應(yīng)的設(shè)備對象。 當(dāng) pnp管理器發(fā)現(xiàn)一個設(shè)備對象, 就查找該對象對應(yīng)的 driver 。并調(diào)用該 driver 的 add device 例程。如果 driver不在內(nèi)存中,就先加載,然后調(diào)用add dev

7、ice 例程。當(dāng)然,總線本身并沒有發(fā)出任何信號告訴pnp 管理器自己的存在, 所以,總線 driver是在 nt的安裝時設(shè)定的。 而 isa 設(shè)備并沒有規(guī)范, 因為需要 kmd 自己檢查硬件存在及狀態(tài), 所以它是老式 kmd 存在的惟一理由。 這也是微軟極力在新規(guī)范里取消 isa 總線的理由之一。 wdm 支持 pnp 協(xié)議和 pm 協(xié)議,而且實現(xiàn)時僅僅需要在 major function里加入一些對 pnp和 pm事件響應(yīng)的例程即可。一個完整的驅(qū)動程序要完成以下工作:初始化;創(chuàng)建與刪除設(shè)備; 處理應(yīng)用層程序的打開和關(guān)閉句柄的請求;處理應(yīng)用層程序的輸入/ 輸出請求;串行化對設(shè)備的訪問;訪問硬件

8、;調(diào)用其他驅(qū)動程序;取消i/o 請求;超時 i/o 請求;處理可熱插拔設(shè)備的加入和刪除事件;電源管理和wmi 。二開發(fā)設(shè)備驅(qū)動程序2.1 設(shè)計工具 ddk 的安裝編寫 wdm 設(shè)備驅(qū)動程序我們需要microsoft的驅(qū)動程序開發(fā)工具包ddk 。盡管微軟宣稱 wdm 驅(qū)動程序是 windows98和 2000 之間二進制兼容的,為了安全起見我們還是在不同的系統(tǒng)下僅安裝相應(yīng)的ddk 。( 一).windows 98 ddk 的安裝這一部分描述如何安裝windows 98 ddk 。 我們約定 %98ddk%為安裝 windows 98 ddk 的根目錄; %mstools%為微軟 sdk平臺的根目

9、錄; %vcppdev%為安裝的 vc+開發(fā)環(huán)境的根目錄。使用 ddk 的軟件平臺通常為windows 98 操作系統(tǒng)和 vc+ 4.2 或 5.0 版本,若要編譯視頻捕獲示例則需要vc+ 5.0 版本。你必須在安裝windows 98 ddk之前先安裝 vc+ 編譯/ 開發(fā)環(huán)境,否則運行時, windows 98 ddk的 setenv.bat文件將不能建立正確的編譯環(huán)境。閱讀 ddk 文檔需要 ie 4.01 以上版本,如果是從光盤或需要測試光盤驅(qū)動程序則需要光驅(qū),16mb 內(nèi)存是不可少的,完整安裝需要 82mb硬盤空間(最小安裝需要32mb硬盤空間)。windows 98 ddk所帶的所

10、有驅(qū)動程序例子都不需要在安裝有sdk 的平臺下構(gòu)造。不過,如果你開始開發(fā)自己的驅(qū)動程序,可能需要windows 98 ddk中沒有而是在 sdk平臺中的頭文件,因此可以考慮兩種方法:拷貝所需的頭文件或sdk平臺的文件到在 %98ddk%和%vcppdev%下適當(dāng)?shù)?include 目錄中;也可以直接安裝 sdk平臺,編輯 %98ddk%bin 中 setenv.bat文件,并運行安裝在 %mstools%里的 setenv.bat文件。用 setup 程序安裝 ddk ,步驟為:(1) 運行 windows 98 ddk 中的 setup.exe 文件, 按照對話框提示安裝windows 98

11、 ddk到98ddk 。(2) 安裝 vc+ 5.0 到vcppdev。(3) 修改 config.sys 增大環(huán)境變量空間。 在 config.sys 文件最后加入一行:shell=c:windowscommand.com /p /e:4096 在安裝 windows 98 ddk之前,必須先安裝 vc+ 編譯器 / 開發(fā)環(huán)境,否則運行時, win dows 98 ddk的 setenv.bat 批處理文件將不能建立正確的環(huán)境。下面介紹建立 windows 98 驅(qū)動程序構(gòu)造環(huán)境以及利用構(gòu)造環(huán)境和工具構(gòu)造驅(qū)動程序的方法。1. 用 setenv.bat 來安裝驅(qū)動程序構(gòu)造環(huán)境開始菜單中有 de

12、velopment kitswindows 98 ddk的目錄。這個目錄包括自由構(gòu)造環(huán)境項和檢查構(gòu)造環(huán)境項。每次重啟操作系統(tǒng), 在構(gòu)造驅(qū)動程序前, 單擊這些程序文件夾中合適的一項。這些項調(diào)用%98ddk%bin里的 setenv.bat批處理文件來創(chuàng)建正確的環(huán)境變量的驅(qū)動程序構(gòu)造環(huán)境。2. 手工運行 setenv.bat 在 ms-dos 提示符下,或在 開始/ 運行中使用下列語句:setenv %98ddk% free | checked 例如,在 c:98ddkbin提示符下,鍵入setenv c:98ddk free,其中第一個參數(shù)指定 ddk被安裝的文件夾, 注意缺省安裝是 98ddk

13、 ;可選的第二個參數(shù)說明目標(biāo)構(gòu)造環(huán)境,缺省類型是free 。3. 構(gòu)造 wdm 驅(qū)動程序使用一系列規(guī)則以指定驅(qū)動程序怎樣被創(chuàng)建,構(gòu)造實用程序可用來在windows 98 和 windows nt平臺上構(gòu)造 wdm 驅(qū)動程序。在 windows 98 ddk被安裝之后, wdm 驅(qū)動程序構(gòu)造樹的工作例子和組成部分文件在硬盤上就可以得到了。驅(qū)動程序構(gòu)造樹根目錄在%98ddk%src 。查看%98ddk%inc 里 makefile.def文件的內(nèi)容,以及貫穿驅(qū)動程序構(gòu)造樹的各種的 dirs 文件和源文件的內(nèi)容,可以利用這些代碼作為工作實例。4. 構(gòu)造驅(qū)動程序在當(dāng)前目錄的驅(qū)動程序構(gòu)造樹中創(chuàng)建一個子目

14、錄,然后, 運行構(gòu)造實用程序。在構(gòu)造樹的當(dāng)前目錄中, 構(gòu)造實用程序可以自動創(chuàng)建出驅(qū)動程序的源代碼。構(gòu)造實用程序在 windows 98 ddk 例子驅(qū)動程序構(gòu)造樹的根目錄下(%98ddk%src )運行。例如,如果僅僅對為聲音設(shè)備類構(gòu)造的例子驅(qū)動程序有興趣,可以設(shè)置當(dāng)前目錄到 %98ddk%srcaudio上,然后,運行構(gòu)造實用程序。5. 檢查 windows 98 ddk的安裝經(jīng)常使用的構(gòu)造指令形式為build -cz ;從而使構(gòu)造實用程序做相關(guān)文件的掃描,執(zhí)行完整的創(chuàng)建,并生成錯誤記錄。檢查安裝的方法為:在destinationsrc 目錄運行 build -cz,構(gòu)造安裝的例子驅(qū)動程序源

15、代碼的完整集。這個實用程序在構(gòu)造驅(qū)動程序之前構(gòu)造全部相關(guān)文件,自動建立文件關(guān)聯(lián)關(guān)系。這個過程可能需要30 多分鐘。如果構(gòu)造沒有完成或報告過多的編譯錯誤,則需要確認是否正確執(zhí)行了以上的安裝步驟。通過安裝 ddk 和相應(yīng)的開發(fā)軟件,我們構(gòu)造好了 wdm 驅(qū)動程序的開發(fā)環(huán)境。 接著,我們就要深入進行設(shè)計與開發(fā)工作了。安裝 ddk 后, 在 ddk 程序組下有檢查 check和自由 free 兩個編譯環(huán)境,check環(huán)境用于編譯帶調(diào)試信息的驅(qū)動程序,free 則是編譯正式發(fā)布版本的環(huán)境。通常情況下設(shè)備驅(qū)動程序的編譯采用命令行的方式。通過一定的設(shè)置可以在vc +的集成環(huán)境下編譯。一般來說,成功編譯一個最

16、基本的設(shè)備驅(qū)動程序需要四個文件,第一個是驅(qū)動程序, 即c語言源程序文件 ( 例如 isousb.c , 注意下面所有的例子都是以isousb來說明 ) ;第二個是 rc文件( 例如 isousb.rc);第三個是 sources文件;第四個文件是 makefile 文件。sources文件和 make文件類似,用來指定需要編譯的文件以及需要連接的庫文件。這三個輔助文件都很簡單,在ddk samples 的每個例程里都有三個這樣的文件,依樣畫瓢就能理解它們的結(jié)構(gòu)和意義。1. 舉例分析以下以 isousb 程序為例,設(shè) isousb.rc代碼為:#include #include #define

17、ver_filetype vft_dll #define ver_filesubtype vft2_unknown #define ver_filedescription_str i82930 isochronous io test driver #define ver_internalname_str isousb.sys #define ver_originalfilename_str isousb.sys#include common.ver 設(shè)備驅(qū)動程序一般都使用build 實用程序來進行, build 只是 nmake 外面的一個外包裝程序。 build 本身其實相當(dāng)簡單,編譯的大部

18、分工作實際上由build傳遞給 nmake 來進行。/targetname=isousb targettype=driver targetpath=$(basedir)lib drivertype=wdmincludes=$(basedir)inc; $(basedir)srcusbinc; $(basedir)srcwdmusbinc; . .inctargetlibs=$(basedir)lib*freeusbd.libuse_mapsym=1sources= isousb.rc iusbdbg.c isousb.c isopnp.c isopwr.c ioctliso.c isostrm

19、.c ocrwiso.c /注意 sources的文件名沒有任何擴展名。# makefile # # # copyright (c) microsoft corporation 1995 # all rights reserved. # # makefile for wdm device driver kit # # # 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 mak

20、e file # that is shared by all the driver components of the windows nt ddk #!include $(ntmakeenv)makefile.def # end of makefile 對所有驅(qū)動程序而言, makefile都是一樣的, microsoft也警告不要編輯這個文件,如果需要, 可以編輯修改 sources 文件達到同樣的效果。 對于設(shè)備驅(qū)動程序,所使用的 c編譯器基本上無一例外地選用vc+ 。2. 編譯的基本步驟(1) 首先進入 check 或 free 編譯環(huán)境,初始化 ddk編譯環(huán)境。(2) 運行 vc安裝

21、目錄下 bin 目錄下的 vcvars32.bat , 初始化 vc+ 編譯環(huán)境。(3) 運行 build.exe進行編譯。( 二) windows2000 ddk 的安裝由于前面我們已經(jīng)詳細介紹了windows98 ddk 的安裝,我們在這里主要介紹一下 windows2000 ddk 安裝與 windows98 ddk 的不同。兩者對系統(tǒng)的要求不同, windows2000 ddk 需要 windows2000或 windows98操作系統(tǒng), vc 5.0 或 6.0 專業(yè)或企業(yè)版,至少64mb 內(nèi)存,推薦 128mb 或更多的內(nèi)存,完全安裝需要200mb ,而且如果你在 windows2

22、000下安裝的話,必須以管理員的身份登錄。2.2 設(shè)備驅(qū)動程序的設(shè)計i/o 請求包(irp)是驅(qū)動程序操作的中心, irp是一個內(nèi)核對象,它是一個預(yù)先定義的數(shù)據(jù)結(jié)構(gòu),帶有一組對它進行操作的i/o 管理器例程。 i/o 管理器接收一個 i/o 請求后分配并初始化一個irp。一個 irp 有一個固定的首部和可變數(shù)目的 irp 棧單元塊,每個 i/o 請求有一個主功能代碼 (irp_mj_xxx )并可能有次功能代碼( irp_mn_xxx)。設(shè)計一個設(shè)備驅(qū)動程序,應(yīng)該支持和其他相同類型設(shè)備的驅(qū)動程序相同的irp_mj_xxx 和 ioctl請求代碼。如果設(shè)計一個中間層驅(qū)動程序,應(yīng)該首先確認下層驅(qū)動

23、程序所管理的設(shè)備,因為一個高層的驅(qū)動程序必須具有低層驅(qū)動程序絕大多數(shù)irp_mj_xxx 例程入口。高層驅(qū)動程序在接到i/o 請求時,在確定自身irp 當(dāng)前堆棧單元參數(shù)有效的前提下,設(shè)置好 irp 中下一個低層驅(qū)動程序的堆棧單元,然后再調(diào)用iocalldriver將請求傳遞給下層驅(qū)動程序處理。一旦決定好了驅(qū)動程序應(yīng)該處理哪些irp_mj_xxx ,就可以開始確定驅(qū)動程序應(yīng)該有多少個dispatch 例程。 當(dāng)然也可以考慮把某些irp_mj_xxx 處理的例程合并為同一例程處理。一個驅(qū)動程序必須為它所管理的每個可能成為i/o 請求的目標(biāo)的物理和邏輯設(shè)備創(chuàng)建一個 device 對象。 一些低層的驅(qū)

24、動程序還可能要創(chuàng)建一些不確定數(shù)目的 device 對象。例如一個硬盤驅(qū)動程序必須為每一個物理硬盤創(chuàng)建一個device 對象,同時還必須為每個物理磁盤上的每個邏輯分區(qū)創(chuàng)建一個device 對象。一個高層驅(qū)動程序必須為它所代表的虛擬設(shè)備創(chuàng)建一個device 對象,這樣更高層的驅(qū)動程序才能連接它們的device 對象到這個驅(qū)動程序的device 對象。另外,一個高層驅(qū)動程序通常為它低層驅(qū)動程序所創(chuàng)建的device 對象創(chuàng)建一系列的虛擬或邏輯 device 對象。盡管可以分階段來設(shè)計驅(qū)動程序, 從而使一個處在開發(fā)階段的驅(qū)動程序不必一開始就創(chuàng)建出所有它將要處理的所有device 對象,但從一開始就確定好

25、最終要創(chuàng)建的所有 device 對象將有助于設(shè)計者所要解決的任何同步問題。另外,確定所要創(chuàng)建的 device 對象還有助于定義device 對象的 device extension的內(nèi)容和數(shù)據(jù)結(jié)構(gòu)。驅(qū)動程序的開發(fā)是一個從粗到細逐步求精的過程。ddk 的目錄下有一個龐大的模板代碼, 幾乎覆蓋了所有類型的設(shè)備驅(qū)動程序、高層驅(qū)動程序和過濾器驅(qū)動程序。在開始開發(fā)驅(qū)動程序之前, 可以先在這個樣板庫下面尋找是否有和所要開發(fā)的類似類型的例程。下面筆者將進一步介紹開發(fā)驅(qū)動程序的基本步驟:l. 編寫驅(qū)動程序框架(1)首先編寫一個 driverentry例程,并在該例程里調(diào)用iocreatedevice來創(chuàng)建一個

26、 device 對象。在這個例程中必須設(shè)置一系列的回調(diào)(callback )例程來處理irp。(2)寫一個處理 irp_mj_create請求的例程的基本框架。如果驅(qū)動程序創(chuàng)建了多于一個的 device 對象,則必須為 irp_mj_close 請求寫一個例程。(3) 編譯連接驅(qū)動程序。2. 測試驅(qū)動程序(1)首先在系統(tǒng)中安裝好驅(qū)動程序。(2)為邏輯設(shè)備名稱和目標(biāo)device 對象名稱之間建立起符號鏈接,在前面已經(jīng)知道 device 對象名稱對 win32用戶模式是不可見的,是不能直接通過api來訪問的, win32 api 只能訪問符號鏈接名。可以通過修改注冊表來建立這兩種名稱之間的符號鏈接

27、。運行regedt32.exe 在hkey_local_machine system currentcontrolset control session manager dos devices下建立起符號鏈接,創(chuàng)建這種符號鏈接也可以在驅(qū)動程序里調(diào)用函數(shù)iocreatesymboliclink,使用參數(shù)傳遞合適的符號鏈接名和內(nèi)核設(shè)備名。(3)完成以上所有的設(shè)置并檢查無誤后,我們必須重新啟動 windows系統(tǒng)。(4)編寫一個簡單的測試程序調(diào)用win32 api 中的 createfile函數(shù),并以符號鏈接名打開這個設(shè)備。 如果打開成功, 則成功地寫出了一個最簡單的驅(qū)動程序了。支持更多的設(shè)備 i/

28、o 請求,例如驅(qū)動程序可能需要對irp_mj_read 請求做出響應(yīng) ( 完成后可用 readfile 函數(shù)進行測試 )。如果驅(qū)動程序需要能夠手工卸載,那么還必須對 irp_mj_close 做出響應(yīng)。為所需要處理的irp_mj_xxx 寫好處理例程,并在 driverentry里面初始化好這些例程入口。 一個低層的驅(qū)動程序需要一個 startio 、isr 和 dpcforisr 例程,可能還需要一個synchcritsection例程,如果設(shè)備使用了dma ,那么可能還需要一個adaptercontrol例程。對于高層驅(qū)動程序可能需要一個或多個iocompletion例程,最起碼完成檢查

29、i/o 狀態(tài)塊然后調(diào)用 iocompleterequest 的工作。如果需要,還要對device extension數(shù)據(jù)結(jié)構(gòu)和內(nèi)容做些修改。 有一點必須很清楚的, 就是代碼運行級別的問題, 即irql,最常見的級別是 passive_level、apc_level、dispatch_level和 dirql 。在查閱 ddk help 中的函數(shù)說明的時候,要注意函數(shù)的可運行級別,比如有的函數(shù)只能在 passive_level 下運行,有的函數(shù)則可以在dispatch_level以下級別運行,級別越高的時候,對代碼的要求就越嚴格,比如在dispatch_level的時候,就不能使用分頁內(nèi)存。通常

30、情況下應(yīng)該盡可能讓代碼在低運行級別如passive_level 下運行,在高級別下運行過長時間將導(dǎo)致系統(tǒng)效率降低、影響系統(tǒng)響應(yīng)的實時性。但有時候自己無法控制運行的級別,例如在調(diào)用低層driver時使用 iocalldriver,低層 driver 響應(yīng)完畢后會執(zhí)行completion 例程,該例程運行的級別就是由低層driver來決定。因此在編寫 completion 例程時,應(yīng)盡量將這個函數(shù)設(shè)計成能在dispatch_level級別運行。依照以上開發(fā)步驟,我們可以設(shè)計出全新的wdm 設(shè)備驅(qū)動程序。2.3 設(shè)備驅(qū)動程序的安裝( 一). wdm驅(qū)動程序安裝驅(qū)動程序根據(jù) inf 文件的指令進行安裝

31、,將可執(zhí)行文件復(fù)制到正確的位置,并創(chuàng)建各種注冊表項。 一些驅(qū)動程序需要占用一些硬件資源,主要是 i/o 地址和中斷號,pnp管理器將予以分配。 使用后的 inf 文件復(fù)制到 windows inf 子目錄。inf 文件含有安裝一個wdm 設(shè)備驅(qū)動程序需要的所有信息,包括要復(fù)制的文件、要創(chuàng)建的注冊表項等。 inf 文件是一個文本文件,它由節(jié)組成,每個節(jié)以方括號內(nèi)的節(jié)名稱開始,以后每一行都是一個簡單的項,或設(shè)置一個值。下面我們以ddk 中的一個例子簡單介紹一下inf 文件。bulkusb.inf version signature=$chicago$ class=usb provider=%msf

32、t% layoutfile=layout.infsourcedisksnames 1=ddk bulkusb sample,1sourcedisksfiles bulkusb.sys=1manufacturer %mfgname%=microsoftmicrosoft %usbvid_045e&pid_930a.devicedesc%=bulkusb.dev, usbvid_045e&pid_930aprecopysection hkr,nosetupui,1destinationdirs bulkusb.files.ext = 10,system32drivers bulku

33、sb.files.inf = 10,infbulkusb.dev copyfiles=bulkusb.files.ext, bulkusb.files.inf addreg=bulkusb.addregbulkusb.dev.nt copyfiles=bulkusb.files.ext, bulkusb.files.inf addreg=bulkusb.addregbulkusb.dev.nt.services addservice = bulkusb, 0 x00000002, bulkusb.addservicebulkusb.addservice displayname = %bulku

34、sb.svcdesc% servicetype = 1 ; service_kernel_driver starttype = 2 ; service_auto_start errorcontrol = 1 ; service_error_normal servicebinary = %10%system32driversbulkusb.sys loadordergroup = basebulkusb.addreg hkr,devloader,*ntkern hkr,ntmpdriver,bulkusb.sys hklm,systemcurrentcontrolsetservicesbulku

35、sbparameters,maximumtransfersize,0 x10001,4096 hklm,systemcurrentcontrolsetservicesbulkusbparameters,debuglevel,0 x10001,2bulkusb.files.ext bulkusb.sysbulkusb.files.inf bulkusb.inf;-; strings msft=microsoft mfgname=intel usbvid_045e&pid_930a.devicedesc=bulkusb.sys intel 82930 usb bulk io test bo

36、ard bulkusb.svcdesc=bulkusb.sys i82930 bulk io test driver我們介紹一下常用的節(jié):version signature 項為$windows nt$,$windows 95$ 或$chicago$;class 項為系統(tǒng)定義的一個類名字 (例中為 usb )或用戶指定的新的類名字;provider 項為 inf 文件的創(chuàng)建者;sourcedisksnames 對于每個發(fā)行軟盤或cd rom ,指定它的描述和可能的打包文件和目錄;sourcedisksfiles 指定文件名、源磁盤id 和可選的子目錄和文件大小,如果所有文件都在根目錄下這個節(jié)可

37、以為空;manufacturer 指定廠商名;destinationdirs 對缺省文件復(fù)制和指定文件復(fù)制指定目錄;bulkusb.dev 指定要復(fù)制文件的列表節(jié)( bulkusb.files.ext, bulkusb.files.inf )的名稱;指定 addreg 節(jié)(bulkusb.addreg)的名稱;bulkusb.addservice 指定驅(qū)動程序服務(wù)的詳細信息;bulkusb.addreg 在注冊表中添加新的鍵值;strings 指定一些字符串;( 二).nt 式驅(qū)動程序安裝1. 添加注冊表中的鍵值windows在引導(dǎo)的時候,通過掃描注冊表構(gòu)造驅(qū)動程序列表。這個列表既包括自啟動的

38、驅(qū)動程序, 也包括需要手工啟動的驅(qū)動程序。這個列表其實就是控制面板中設(shè)備 applet所列出來的所有設(shè)備。 所有的設(shè)備驅(qū)動程序應(yīng)該在注冊表的下有相應(yīng)的鍵值。這里的名稱應(yīng)該和你的驅(qū)動程序名稱一致。下面一般有以下鍵值:type值為 1 表示內(nèi)核模式驅(qū)動程序;為2 表示文件系統(tǒng)驅(qū)動程序。errorcontrol值為 0 表示日志記錄錯誤并忽略;值為1 表示日志記錄錯誤并顯示一個對話框;值為 2 表示日志記錄錯誤, 并用最后的正確配置重新啟動;值為 3 表示日志記錄錯誤,如果已經(jīng)使用過正確配置,返回失敗。在任何一個設(shè)備驅(qū)動程序中,上表中的前三項參數(shù)都是必需的。2. 控制驅(qū)動程序的裝入次序有時候控制多個

39、驅(qū)動程序的裝入次序是必要的。有時一套驅(qū)動程序中的部分程序必須在其他程序啟動的前提下啟動。3. 驅(qū)動程序的 start值上面注冊表中驅(qū)動程序的start值控制驅(qū)動程序在系統(tǒng)啟動的時間。目前,start可以取以下值,此外為該值留有擴展余地,以適用于新的要求:(l)0 x0 (service_boot_start) :這個值指定本驅(qū)動程序應(yīng)該由操作系統(tǒng)裝入程序啟動。一般的驅(qū)動程序不會采用本值,因為系統(tǒng)在這個時候幾乎還沒有啟動,大部分系統(tǒng)尚不可用。(2)0 x1 (service_system_start):該值表示在操作系統(tǒng)裝入后但同時初始化它自己時啟動驅(qū)動程序。(3)0 x2 (service_auto_start):該值表示在整個系統(tǒng)啟動并運行后由服務(wù)控制管理器裝入。(4)0 x3 (service_demand_start):該值表示該驅(qū)動程序必須手工啟動??梢酝ㄟ^控制面板的設(shè)備applet 或者使用 wi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論